diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..933ec94 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +charset = utf-8 diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml new file mode 100644 index 0000000..8b04b02 --- /dev/null +++ b/.github/workflows/verify.yaml @@ -0,0 +1,43 @@ +name: verify + +on: + push: + pull_request: + branches: + - '*' + workflow_dispatch: + +jobs: + verify: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [ '18.x', '20.x', '21.x', '22.x' ] + + name: Lint & Test Node.js ${{ matrix.node-version }} + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - name: versions + run: | + node --version + npm --version + + - run: npm ci + + - name: lint + run: | + npm run lint + + - name: test + run: | + npm test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9799e15 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +dist/ +node_modules/ +npm-debug* +.nyc_output/ +dash0-opentelemetry-*.tgz diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..eb570ce --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "test/collector/opentelemetry-proto"] + path = test/collector/opentelemetry-proto + url = git@github.com:open-telemetry/opentelemetry-proto.git diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..d450a4e --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +test/collector/opentelemetry-proto +test/collector/types diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..82f96a0 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "arrowParens": "avoid", + "quoteProps": "as-needed", + "printWidth": 120, + "semi": true, + "singleQuote": true, + "trailingComma": "all" +} diff --git a/.sonarcloud.properties b/.sonarcloud.properties new file mode 100644 index 0000000..ace7faa --- /dev/null +++ b/.sonarcloud.properties @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +# SPDX-License-Identifier: Apache-2.0 + +sonar.organization=dash0hq +sonar.projectKey=dash0hq_opentelemetry-js-distro + +sonar.exclusions=test/collector/opentelemetry-proto/**,test/collector/types/**, + +sonar.sources=. +sonar.tests=. +sonar.test.inclusions=**/*_test.ts,test/** diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d4fcfc1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,22 @@ +# Contributing + +## Setup + +Please use the Node.js version defined in [.nvmrc](.nvmrc) for local development. +Additionally, all code needs to work with the Node.js versions tested in the GitHub +[verify](./.github/workflows/verify.yaml) action. + +Run `npm install` in the root of the repository after cloning the repository. + +## Local development + +* Use `npm run verify` to run all linters and run all tests locally. This run script is also used on CI. +* Use `npm run lint` to only run linters (eslint & prettier), but no tests. +* Use `npm run eslint` to only run eslint (including `typescript-eslint`), but not prettier. +* Use `npm run prettier-check`: to check if all files are formatted correctly. +* Use `npm run prettier` to automatically format all files according to the prettier configuration. +* Use `npm run test` to run all tests (unit tests & integration tests), but no linters. +* Use `npm run test:unit` to only run unit tests, but no integration tests. +* Use `npm run test:integration` to only run integration tests, but no unit tests. +* Use `npm run test:coverage` to run unit and integration tests and generate a coverage report. +* Use `npm run build` to create a production build in the `dist` folder. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache 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 + + http://www.apache.org/licenses/LICENSE-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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ecadda --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +Dash0 Node.js OpenTelemetry Distribution +======================================== + +This is the Dash0 OpenTelemetry distribution for Node.js. diff --git a/bin/pack.sh b/bin/pack.sh new file mode 100755 index 0000000..b63e25c --- /dev/null +++ b/bin/pack.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname ${BASH_SOURCE})"/.. + +rm -f dash0-opentelemetry-*.tgz +npm run build +pushd dist > /dev/null +npm pack +mv dash0-opentelemetry-*.tgz .. +popd > /dev/null + +echo +echo "The package tar archive $(ls dash0-opentelemetry-*.tgz) has been created:" +tar -tf dash0-opentelemetry-*.tgz diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..94db26c --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +/* global module, require */ +/* eslint-disable @typescript-eslint/no-var-requires */ + +'use strict'; + +const eslint = require('@eslint/js'); +const tsEsLint = require('typescript-eslint'); + +const header = require('eslint-plugin-header'); +const mocha = require('eslint-plugin-mocha'); +const simpleImportSort = require('eslint-plugin-simple-import-sort'); +const unusedImports = require('eslint-plugin-unused-imports'); + +module.exports = tsEsLint.config( + // + eslint.configs.recommended, + ...tsEsLint.configs.recommended, + { + plugins: { + header, + mocha, + simpleImportSort, + unusedImports, + }, + ignores: [ + // + 'test/collector/opentelemetry-proto', + 'test/collector/types', + ], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + 'header/header': [ + 2, + 'line', + [ + { + pattern: ' SPDX-FileCopyrightText: Copyright \\d{4} Dash0 Inc\\.', + template: ` SPDX-FileCopyrightText: Copyright ${new Date().getFullYear()} Dash0 Inc.`, + }, + ' SPDX-License-Identifier: Apache-2.0', + ], + 2, + ], + 'mocha/no-exclusive-tests': 'error', + 'simpleImportSort/exports': 'error', + 'unusedImports/no-unused-imports': 'error', + }, + }, +); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e415f48 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6768 @@ +{ + "name": "@dash0/opentelemetry", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@dash0/opentelemetry", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.8.0", + "@opentelemetry/auto-instrumentations-node": "^0.44.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.51.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.51.0", + "@opentelemetry/sdk-metrics": "^1.24.0", + "@opentelemetry/sdk-node": "^0.51.0", + "@opentelemetry/sdk-trace-node": "^1.24.0" + }, + "devDependencies": { + "@eslint/js": "^9.1.1", + "@grpc/grpc-js": "^1.10.6", + "@types/chai": "^4.3.14", + "@types/is-ci": "^3.0.4", + "@types/mocha": "^10.0.6", + "@types/node": "^20.12.7", + "@types/sinon": "^17.0.3", + "chai": "^4.4.1", + "eslint": "^8.57.0", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-mocha": "^10.4.3", + "eslint-plugin-simple-import-sort": "^12.1.0", + "eslint-plugin-unused-imports": "^3.2.0", + "is-ci": "^3.0.1", + "mocha": "^10.4.0", + "nyc": "^15.1.0", + "prettier": "^3.2.5", + "protobufjs": "^7.2.6", + "sinon": "^17.0.1", + "ts-node": "^10.9.2", + "ts-proto": "^1.172.0", + "typescript": "^5.4.5", + "typescript-eslint": "^7.7.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.1.1.tgz", + "integrity": "sha512-5WoDz3Y19Bg2BnErkZTp0en+c/i9PvgFS7MBe1+m60HjFr0hrphlAGp4yzI7pxpt4xShln4ZyYp4neJm8hmOkQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", + "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", + "dependencies": { + "@grpc/proto-loader": "^0.7.10", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", + "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hapi/b64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", + "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, + "node_modules/@hapi/cryptiles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", + "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", + "dependencies": { + "@hapi/boom": "9.x.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/iron": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", + "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", + "dependencies": { + "@hapi/b64": "5.x.x", + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/cryptiles": "5.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/podium": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz", + "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==", + "dependencies": { + "@hapi/hoek": "9.x.x", + "@hapi/teamwork": "5.x.x", + "@hapi/validate": "1.x.x" + } + }, + "node_modules/@hapi/teamwork": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz", + "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@hapi/validate": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", + "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", + "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.50.0.tgz", + "integrity": "sha512-JdZuKrhOYggqOpUljAq4WWNi5nB10PmgoF0y2CvedLGXd0kSawb/UBnWT8gg1ND3bHCNHStAIVT0ELlxJJRqrA==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.44.0.tgz", + "integrity": "sha512-wd24SiEsxDLbKslvUvyzOesNXhjjxV52Co5parTYXuMixil3SNNgon1WosbQo65jFzuvbASAMZNmc1MjtVp+ng==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/instrumentation-amqplib": "^0.36.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.40.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.40.0", + "@opentelemetry/instrumentation-bunyan": "^0.37.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.37.0", + "@opentelemetry/instrumentation-connect": "^0.35.0", + "@opentelemetry/instrumentation-cucumber": "^0.5.0", + "@opentelemetry/instrumentation-dataloader": "^0.8.0", + "@opentelemetry/instrumentation-dns": "^0.35.0", + "@opentelemetry/instrumentation-express": "^0.37.0", + "@opentelemetry/instrumentation-fastify": "^0.35.0", + "@opentelemetry/instrumentation-fs": "^0.11.0", + "@opentelemetry/instrumentation-generic-pool": "^0.35.0", + "@opentelemetry/instrumentation-graphql": "^0.39.0", + "@opentelemetry/instrumentation-grpc": "^0.50.0", + "@opentelemetry/instrumentation-hapi": "^0.36.0", + "@opentelemetry/instrumentation-http": "^0.50.0", + "@opentelemetry/instrumentation-ioredis": "^0.39.0", + "@opentelemetry/instrumentation-knex": "^0.35.0", + "@opentelemetry/instrumentation-koa": "^0.39.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.36.0", + "@opentelemetry/instrumentation-memcached": "^0.35.0", + "@opentelemetry/instrumentation-mongodb": "^0.42.0", + "@opentelemetry/instrumentation-mongoose": "^0.37.0", + "@opentelemetry/instrumentation-mysql": "^0.37.0", + "@opentelemetry/instrumentation-mysql2": "^0.37.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.36.0", + "@opentelemetry/instrumentation-net": "^0.35.0", + "@opentelemetry/instrumentation-pg": "^0.40.0", + "@opentelemetry/instrumentation-pino": "^0.37.0", + "@opentelemetry/instrumentation-redis": "^0.38.0", + "@opentelemetry/instrumentation-redis-4": "^0.38.0", + "@opentelemetry/instrumentation-restify": "^0.37.0", + "@opentelemetry/instrumentation-router": "^0.36.0", + "@opentelemetry/instrumentation-socket.io": "^0.38.0", + "@opentelemetry/instrumentation-tedious": "^0.9.0", + "@opentelemetry/instrumentation-winston": "^0.36.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.8", + "@opentelemetry/resource-detector-aws": "^1.4.1", + "@opentelemetry/resource-detector-container": "^0.3.8", + "@opentelemetry/resource-detector-gcp": "^0.29.8", + "@opentelemetry/resources": "^1.12.0", + "@opentelemetry/sdk-node": "^0.50.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/context-async-hooks": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.23.0.tgz", + "integrity": "sha512-wazGJZDRevibOJ+VgyrT+9+8sybZAxpZx2G7vy30OAtk92OpZCg7HgNxT11NUx0VBDWcRx1dOatMYGOVplQ7QA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/core": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.23.0.tgz", + "integrity": "sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.50.0.tgz", + "integrity": "sha512-w/NF4TrwHxx+Uz1M0rCOSVr6KgcoQPv3zF9JRqcebY2euD7ddWnLP0hE8JavyA1uq4UchnMp9faAk9n7hTCePw==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.50.0", + "@opentelemetry/otlp-transformer": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.50.0.tgz", + "integrity": "sha512-L7OtIMT7MsFqkmhbQlPBGRXt7152VN5esHpQEJYIBFedOEo3Da+yHpu5ojMZtPzpIvSpB5Xr5lnJUjJCbkttCA==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", + "@opentelemetry/otlp-transformer": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.50.0.tgz", + "integrity": "sha512-vavD9Ow6yOLiD+ocuS/oeciCsXNdsN41aYUrEljNaLXogvnkfMhJ+JLAhOnRSpzlVtRp7Ciw2BYGdYSebR0OsA==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", + "@opentelemetry/otlp-proto-exporter-base": "0.50.0", + "@opentelemetry/otlp-transformer": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.23.0.tgz", + "integrity": "sha512-2LOGvNUGONuIcWhynFaJorVyqv03uZkURScciLmOxvBf2lWTNPEj77br1dCpShIWBM+YlrH7Tc+JXAs+GC7DqA==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.50.0.tgz", + "integrity": "sha512-JUmjmrCmE1/fc4LjCQMqLfudgSl5OpUkzx7iA94b4jgeODM7zWxUoVXL7/CT7fWf47Cn+pmKjMvTCSESqZZ3mA==", + "dependencies": { + "@opentelemetry/core": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.50.0.tgz", + "integrity": "sha512-J500AczSD7xEsjXpwNzSh5HQqxW73PT3CCNsi1VEWCE+8UPgVfkHYIGRHGoch35DV+CMe1svbi7gAk3e5eCSVA==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-proto-exporter-base": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.50.0.tgz", + "integrity": "sha512-hlbn3eZbhxoK79Sq1ddj1f7qcx+PzsPQC/SFpJvaWgTaqacCbqJmpzWDKfRRCAC7iGX2Hj/sgpf8vysazqyMOw==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.50.0.tgz", + "integrity": "sha512-s0sl1Yfqd5q1Kjrf6DqXPWzErL+XHhrXOfejh4Vc/SMTNqC902xDsC8JQxbjuramWt/+hibfguIvi7Ns8VLolA==", + "dependencies": { + "@opentelemetry/api-logs": "0.50.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-logs": "0.50.0", + "@opentelemetry/sdk-metrics": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/propagator-b3": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.23.0.tgz", + "integrity": "sha512-cZ6rl8y2bdxYQ4e+zP2CQ+QmuPebaLBLO1skjFpj3eEu7zar+6hBzUP3llMOUupkQeQSwXz+4c8dZ26OhYfG/g==", + "dependencies": { + "@opentelemetry/core": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.23.0.tgz", + "integrity": "sha512-6iArixfgIl3ZgzeltQ5jyiKbjZygM+MbM84pXi1HL0Qs4x4Ck5rM6wEtjhZffFnlDMWEkEqrnM0xF6bTfbiMAQ==", + "dependencies": { + "@opentelemetry/core": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/resources": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.23.0.tgz", + "integrity": "sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-logs": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.50.0.tgz", + "integrity": "sha512-PeUEupBB29p9nlPNqXoa1PUWNLsZnxG0DCDj3sHqzae+8y76B/A5hvZjg03ulWdnvBLYpnJslqzylG9E0IL87g==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.9.0", + "@opentelemetry/api-logs": ">=0.39.1" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-metrics": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.23.0.tgz", + "integrity": "sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.50.0.tgz", + "integrity": "sha512-LhIXHnvcnhRYcPwG9VG4G6lJ7x4ElYF6UYHHmXA7e4ZWzSUEFmAPfR1IBWv358aD1KwffcEBu7J6zeAR7lPZag==", + "dependencies": { + "@opentelemetry/api-logs": "0.50.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.50.0", + "@opentelemetry/exporter-trace-otlp-http": "0.50.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.50.0", + "@opentelemetry/exporter-zipkin": "1.23.0", + "@opentelemetry/instrumentation": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-logs": "0.50.0", + "@opentelemetry/sdk-metrics": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0", + "@opentelemetry/sdk-trace-node": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.23.0.tgz", + "integrity": "sha512-PzBmZM8hBomUqvCddF/5Olyyviayka44O5nDWq673np3ctnvwMOvNrsUORZjKja1zJbwEuD9niAGbnVrz3jwRQ==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.23.0.tgz", + "integrity": "sha512-dwnin5Go2r6VzJZkVc9JBPupssWp7j2EFto+S7qRkwQ00WDykWeq3x2Skk7I1Jr448FeBSvGCQVPgV5e6s6O3w==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.23.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/propagator-b3": "1.23.0", + "@opentelemetry/propagator-jaeger": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.24.0.tgz", + "integrity": "sha512-s7xaQ9ifDpJvwbWRLkZD/J5hY35w+MECm4TQUkg6szRcny9lf6oVhWij4w3JJFQgvHQMXU7oXOpX8Z05HxV/8g==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.24.0.tgz", + "integrity": "sha512-FP2oN7mVPqcdxJDTTnKExj4mi91EH+DNuArKfHTjPuJWe2K1JfMIVXNfahw1h3onJxQnxS8K0stKkogX05s+Aw==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.51.0.tgz", + "integrity": "sha512-e4x0Ybb4qrk7Ux3fTFdU6OBv9qbbp4413zddbjTJlcyoXu8S6Twc0waX3wfkEBbAotut9JtoZG1kp4RQ435yTQ==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/otlp-exporter-base": "0.51.0", + "@opentelemetry/otlp-transformer": "0.51.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-metrics": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.51.0.tgz", + "integrity": "sha512-VovaU5sopIA7kWa/EjRKMbaY2/ciCyvIvq5kWTO1qbjA+FhRe5AkzZdK8YkXa2ENSmcpvTfmSHAMIO5h56bzLg==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.51.0", + "@opentelemetry/otlp-exporter-base": "0.51.0", + "@opentelemetry/otlp-proto-exporter-base": "0.51.0", + "@opentelemetry/otlp-transformer": "0.51.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-metrics": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.51.0.tgz", + "integrity": "sha512-xQpxKzS8ZnxYCa1v+3EKWhwMrSK3+RezpJ+AEKaP2pf2QbLfHt7kKfSn7niR2u3A1Tbe2aC7Ptt9+MafhThOOQ==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.24.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.51.0", + "@opentelemetry/otlp-transformer": "0.51.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-trace-base": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.51.0.tgz", + "integrity": "sha512-zODqnLZmPOxj9CarFv0TrVlx9mgj0TfCMCiUiTdNi9iA2rgdKVo+bjJjpYF6LCTJOQCR5TScAUCKyzwkgDI+iA==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/otlp-exporter-base": "0.51.0", + "@opentelemetry/otlp-transformer": "0.51.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-trace-base": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.51.0.tgz", + "integrity": "sha512-Fi7r0iMqGoFCQQ+WY0pYOWp395vdinZJIkYKnNbnreHxAN/kVDBl2FxbV3DeOKuRxEY08Gyb9ggPf+Zrqp7l/w==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/otlp-exporter-base": "0.51.0", + "@opentelemetry/otlp-proto-exporter-base": "0.51.0", + "@opentelemetry/otlp-transformer": "0.51.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-trace-base": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.24.0.tgz", + "integrity": "sha512-QeGv0PHONswmu567pf9QliJ6s6DgCu5+ziF+soNS1LTcr1VRRVLViYLmGxmzDFUC48sjNTu7sumcKT0nJXsGBw==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-trace-base": "1.24.0", + "@opentelemetry/semantic-conventions": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.50.0.tgz", + "integrity": "sha512-bhGhbJiZKpuu7wTaSak4hyZcFPlnDeuSF/2vglze8B4w2LubcSbbOnkVTzTs5SXtzh4Xz8eRjaNnAm+u2GYufQ==", + "dependencies": { + "@opentelemetry/api-logs": "0.50.0", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.36.0.tgz", + "integrity": "sha512-qIXHiYbU8hfFHtI/y5ntv2k4g1stlQBHXu383xCqFdg3XbkLuKIyQ+QnnP8Ybb12qh+hzuXstEpFiF0dSmuhZA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.40.0.tgz", + "integrity": "sha512-DF1Ja1AQNV8K5tAW4STcI0KKuu1IDzCM1aa66UDbJwZfEMq0QedzKS7FjoIB+wV4Mk8+WJQRtzISFmjDiquxmw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/aws-lambda": "8.10.122" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.40.0.tgz", + "integrity": "sha512-USjyLBbpYIp4YPcTqcvspSmckZ/i2r/LSBkcoiIfCGNsbWyEK3mBDUTV3ULL6cuA0zGvYAabNDFZ2qm5vCvAuw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/propagation-utils": "^0.30.8", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.37.0.tgz", + "integrity": "sha512-NKHuTIn1JrxfKZ8sVZjwT/bD3wyijkipiWzBvvxGj8pJJJNP5shVHWcEJhk5tQsfKQc4LproTAPdklex1o5/ag==", + "dependencies": { + "@opentelemetry/api-logs": "^0.50.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.37.0.tgz", + "integrity": "sha512-3owM6+vqu+akYWnRY4hTmzDPoa3NrX++pmRMwJZPd6+zPlu7NTXPFpjxIhM0IzhGUbv3H5V9ULQw/CUUHTeh2g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.35.0.tgz", + "integrity": "sha512-COcQdFNVXyqaVGSuBgIyLu1qZUebjWyQhMAdMOOulCRznhquoyffeymQDZ0LB8XjD7kkG8if8PbykL4b8tjbNA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.5.0.tgz", + "integrity": "sha512-81id1pd8/bLAJT5+kr0V9iMKNCImE+LAX1E02qFui0lyTP9IGk2gQXPf3U68fyHxxJOjUqr1VPkDL/Pcjrfrfg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.8.0.tgz", + "integrity": "sha512-1LHr3W6BZm2VyoFo2boYD1wUlDD3V4dIFoCVg+PwQgHqampiJbl8raEMaa66RNl1LOq+vw4LMgbBqWIUog1Few==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.35.0.tgz", + "integrity": "sha512-ci7hIJcp8AWsJntRMt397VGYh2Isou/u8nDX/fPa9nlbIR6VssgcHTpAV6j98Q2+N3/kTPcdTs/WtLI2g8Wwgg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.37.0.tgz", + "integrity": "sha512-ts6yI7huK41clpcSHqP0NhZbikO4nWFHu/GF2+88IMMKTUBw8IJPnrvXeOUSg9B60uyGaftxfKvfKENtevBFig==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.35.0.tgz", + "integrity": "sha512-lUHj4lYmJswKHR0twg3KFSiIkfTlF4tyh+VwyrrNDYy7yGDqzftP3tP4coVdhT78RRp3DpcAGggbfrIJbdP9pA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.11.0.tgz", + "integrity": "sha512-vVhrKNYc8S/tN5kRsuGDNaCdDVFoMSGFSrOKt9NaB53edWNB2psoUwR+aHUg0U+87zVnXMvRf2e0yDssg3WMcg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.35.0.tgz", + "integrity": "sha512-2Vpy4Vj3RaeAN+uxG9kI2SnKKoitgcOmpD/GR5xjNKQEv2av5X1Gor71ZH2Ec3NjB9HpOLp9QRJg+misFnyYZQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.39.0.tgz", + "integrity": "sha512-TUe4DJJ2S89L45eO3esGrQKvIGVasj7gY4Nk7PecxkgeVnKO5gJ41mlbhUOF44vXxYQq53470FNnhe396+JlBQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.50.0.tgz", + "integrity": "sha512-/ZFuvHtrHyxfRJX5CJ8yPKokAIcvTbIJAoR4AN+gBq1YqecWuCr4XG52p5YU5qDrbwOBtShOrC8d4GdFZOky6Q==", + "dependencies": { + "@opentelemetry/instrumentation": "0.50.0", + "@opentelemetry/semantic-conventions": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.36.0.tgz", + "integrity": "sha512-0NnXuRF89Windosn+iUpq5Fn/Foy8PMJxtLfe6CakDJIUGPj/g1+erz5irqSOc0P5mM3rEqKC/cYCoSIMKo/eA==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/hapi__hapi": "20.0.13" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.50.0.tgz", + "integrity": "sha512-bsd6Nv0FtN9C6M6vX/kgPzvJY9UhJc4CZZNvqDbsfVQv3/MWvPrYgthf41AhrehqeDnpfn/QGzNKtdWUduGanQ==", + "dependencies": { + "@opentelemetry/core": "1.23.0", + "@opentelemetry/instrumentation": "0.50.0", + "@opentelemetry/semantic-conventions": "1.23.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.23.0.tgz", + "integrity": "sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.39.0.tgz", + "integrity": "sha512-Xh0d6LajMXr4zQRxjub/eiRtqQcFBDfoP7mIwmkirA6wBxq+4fEe2QrEMMEyUCPl1MDMsLS8YKUu2r95W/0iUw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis4": "npm:@types/ioredis@^4.28.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.35.0.tgz", + "integrity": "sha512-pIfOn3HSPBFHWd55rS2YPLXq4pBGjLbKwrNnd0x8/nM5TPNy3GueSaruGvMZwkQ68Z1nBB42hLXRKozgErBlqw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.39.0.tgz", + "integrity": "sha512-eSqPzDykJVF9AcOuQvYqYCA/TN8tnU9/RYgrdPclaQcH6nfp0ZbQqLsAMGOwatfwJ8p06FAj+koPBy5NQNFMow==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/koa": "2.14.0", + "@types/koa__router": "12.0.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.36.0.tgz", + "integrity": "sha512-wnqHo4CJfMmXMGJonT4kPGwiEAFlO1a9IrWxVoc1+3B+yD9wKFRby+dVy0s5Ddarwl0SD5ljUZklXMgcEQjlQQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.35.0.tgz", + "integrity": "sha512-UrdzoXShPEfJ2ppjCNHcioHF/Bcd3Jr6pEzayUuRfIXiurOhsHlTnUHPH1rHDunEOcR8FGUicuerEDdDDDU+dA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.42.0.tgz", + "integrity": "sha512-pnUewN9r9Kw3on+6hM24COP4X4zJP5PafXCd1b/qka45Savyle7IaJyJODWVHkX6hN8ERsG853cNsYrsO/f/lQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.37.0.tgz", + "integrity": "sha512-VBGfiERp2fxE35OjUFAlfAOKkPOwYx3FqqV8LG7mq6SGK6yhOaU7RvE1b//bhGWoVYohVyxaBIMRVZr4xpmOJQ==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.37.0.tgz", + "integrity": "sha512-swp9B4oIOcduYfOslc7tbFDjOCgKlcSdVOO+emVnaOEvYG19NcGdc82WH6Zqmctl5oOEBVeKHS+wgjjbwBiMWA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.37.0.tgz", + "integrity": "sha512-KaXZr8B13IovmSN5Xe5qblp34VPsLaooivHMnhOwj2so7ivB1PcGGkesWH5knXC/9iQryiIFXwSDdHrd4R5iXQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.36.0.tgz", + "integrity": "sha512-ku1HdUWFwd6ajJh0pTPwDmcRZF8sbjLCTQXAjUTrJEfmiXavKHwFBZnyF9/5NWedK8FrfZjZ7+hH9heiDigMNQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.35.0.tgz", + "integrity": "sha512-L5qw1G7vwxuePpuLKxpbIg49wH0brfgVhbMaMa09YX4HM6yj1KQRRGMMFxB00NQo2u42kuv/7F7AB/lWeG0yUA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.40.0.tgz", + "integrity": "sha512-z3v8OzfImnycykWgqIdS44aUZlRwq51yYIo8GfmiRBd8yyMl2ESQyv6z/IAWBWyT015IWGy3ZTijySe65P9J1w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.37.0.tgz", + "integrity": "sha512-5V8Cz25pNbbiz0ewWuuKmSCygzoqzgDB3EeliixCnxOzu5Fp7nVKfHlQ775uxylLuODCYwwgVhU6L1Sif4j4AA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.38.0.tgz", + "integrity": "sha512-PzcYLkPvClE7NyjsuqvjCWnCO8wt6ZaYHM6AB9Ga9EQKFh1oNEr2dXCnqVHMuxjzbTWF2+c86yPZAdCEfyKfmA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.38.0.tgz", + "integrity": "sha512-ugDb2txE2o76zwasSzOpmlFlUUnQu4MT2WpO+UmmS5sN4pClU+zsZy0QxjHB03PUJMLCRfsbZf2ez0jkpm7yag==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.37.0.tgz", + "integrity": "sha512-eJyfLsV243Jx4wL8FSZ08Q9Ih6ojOIh6csAJJSNqdFtSMBBQXKVcTw5g2nOi2I2d0AmPNYhaA5H0FLLz6ZIMXw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.36.0.tgz", + "integrity": "sha512-HhVw2OuhlHlbzq0X3rUf3ilyBcM1UsFABESKU6NF1MlVWm1OlZDuZLmlk5EvuU/u9cjduXp61jVj5s4OCW+knQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.38.0.tgz", + "integrity": "sha512-gls1SrTxTy2swwtrn2O+b8wK2MmnQTxEkmpZ6YPh+52mlcvOpW35L+Wfx/aM/hWOw8Za1Wlns710UBH4p88M2Q==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.9.0.tgz", + "integrity": "sha512-VmrKxXmfrzc0Sa5AtDMB96M/lr8cOiU61nYVpY0VtS4QPD7cqqwjeBzBvZpvSu1OZS/zbYg+B9ILOl2cHiG5+g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/tedious": "^4.0.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.36.0.tgz", + "integrity": "sha512-NTuGpUA9AGC7EmKQyMn3ABiqJ3XvHihRcxdvqhs8E72nHmIU3n6om+DCYYE3fpEQwbC9N14ir8fqA5Oxn0Ynag==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.50.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.51.0.tgz", + "integrity": "sha512-hR4c9vWVz1QgzCBSyy9zSDkvfTgaK96E6/tfVP6O4dzdZW9HqWimA3lXV/KXadEGqShvM4GToz9EHp2A5RU5bQ==", + "dependencies": { + "@opentelemetry/core": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.51.0.tgz", + "integrity": "sha512-oTRtDvvB0bTRTBVrvKA/oM1gIAqQ6DVQS07pvqiL1cZS8wBrGgpw+2iTd0nV661Y/MhDn/kNWp8lRhMEIKN9bw==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.24.0", + "@opentelemetry/otlp-exporter-base": "0.51.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-proto-exporter-base": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.51.0.tgz", + "integrity": "sha512-WDANDLSUh11Gu5o6iCzmjZraIv5bK8z1L/t6lxQ2NeEKiKUPo5pVOBBQQC/yAQU2yeqkiO1GRCieH+XahZf60A==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/otlp-exporter-base": "0.51.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.51.0.tgz", + "integrity": "sha512-ylLgx2xumVoSefDHP9GMAU/LG+TU3+8eacVDXV5o1RqWxsdVOaQmCTY0XyDgeRTn6hIOVAq/HHQbRq3iWOrt2A==", + "dependencies": { + "@opentelemetry/api-logs": "0.51.0", + "@opentelemetry/core": "1.24.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-logs": "0.51.0", + "@opentelemetry/sdk-metrics": "1.24.0", + "@opentelemetry/sdk-trace-base": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/api-logs": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.51.0.tgz", + "integrity": "sha512-m/jtfBPEIXS1asltl8fPQtO3Sb1qMpuL61unQajUmM8zIxeMF1AlqzWXM3QedcYgTTFiJCew5uJjyhpmqhc0+g==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.8.tgz", + "integrity": "sha512-ZKjsUm//SvL8I9JS+bJpAXGpe0Fb+sO+AiWS0fb7EKKLEm3GoNAO7CDMs8GMZBZ91ElR3tBjdUKf/9MzUdYHBA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.24.0.tgz", + "integrity": "sha512-rcuMtEOTZC7TW84tws1QLUVRElrGSbBJwK0b+qa56zJULDiUIiUpS+dSzO+aUchg7MtTJBZSG5OPsfsKpGgNig==", + "dependencies": { + "@opentelemetry/core": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.24.0.tgz", + "integrity": "sha512-7TMIDE4+NO5vnkor+zned42wqca+hmhW5gWKhmYjUHC5B5uojo1PvtmBrd7kigFu96XvL4ZUWVzibWRWIQ/++Q==", + "dependencies": { + "@opentelemetry/core": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.24.0.tgz", + "integrity": "sha512-r3MX3AmJiUeiWTXSDOdwBeaO+ahvWcFCpuKxmhhsH8Q8LqDnjhNd3krqBh4Qsq9wa0WhWtiQaDs/NOCWoMOlOw==", + "dependencies": { + "@opentelemetry/core": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz", + "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.8.tgz", + "integrity": "sha512-njdK7S90OX99H0nlDh45vmGU3Bn46JSNjciU18NefyU6R3Dq5ZUU13DWxSlrCBWAiH/+SFJyHQMFsXRnTOFp6w==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.4.1.tgz", + "integrity": "sha512-QsPJwXDxlt+IWQazST7renk9KDOAK3hsywb0Mw6gEwgEoe12EvdVcT+mCknTc+hu5WzxiTmFMtnn1TWab7To1g==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.8.tgz", + "integrity": "sha512-YusLYSo8Rr1yKEhakaJ2XgbfbLses5t8YsSRHhO0b6SLliZOFq9ymxoWgtuwyabNCqMMJJYuvrE3Nq0AL6sbcQ==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.8.tgz", + "integrity": "sha512-jvFtsnrQI7CLDxehp6BxtudbZ3a0HZ+Dj/vFy251280efc15gQdlvFUqXbKBw6ODt/3o38ilw8e0qePJbm2eAg==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.24.0.tgz", + "integrity": "sha512-mxC7E7ocUS1tLzepnA7O9/G8G6ZTdjCH2pXme1DDDuCuk6n2/53GADX+GWBuyX0dfIxeMInIbJAdjlfN9GNr6A==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/semantic-conventions": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.51.0.tgz", + "integrity": "sha512-K4fMBRFD8hQ6khk0rvYFuo6L9ymeGgByir6BcuFIgQuQ00OhYwBi9AruZz5V733Ejq7P8ObR3YyubkOUIbeVAw==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/resources": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.9.0", + "@opentelemetry/api-logs": ">=0.39.1" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.24.0.tgz", + "integrity": "sha512-4tJ+E6N019OZVB/nUW/LoK9xHxfeh88TCoaTqHeLBE9wLYfi6irWW6J9cphMav7J8Qk0D5b7/RM4VEY4dArWOA==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/resources": "1.24.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.51.0.tgz", + "integrity": "sha512-MrPXDQsTAj3lcY8YUCjb7dvSXVZ5jG6wmjD2LB68V1rsLBdP8j70jsI9GaKijY7QB6psbLq6apO1vYeim5U7aw==", + "dependencies": { + "@opentelemetry/api-logs": "0.51.0", + "@opentelemetry/core": "1.24.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.51.0", + "@opentelemetry/exporter-trace-otlp-http": "0.51.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.51.0", + "@opentelemetry/exporter-zipkin": "1.24.0", + "@opentelemetry/instrumentation": "0.51.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/sdk-logs": "0.51.0", + "@opentelemetry/sdk-metrics": "1.24.0", + "@opentelemetry/sdk-trace-base": "1.24.0", + "@opentelemetry/sdk-trace-node": "1.24.0", + "@opentelemetry/semantic-conventions": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.51.0.tgz", + "integrity": "sha512-m/jtfBPEIXS1asltl8fPQtO3Sb1qMpuL61unQajUmM8zIxeMF1AlqzWXM3QedcYgTTFiJCew5uJjyhpmqhc0+g==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.51.0.tgz", + "integrity": "sha512-Eg/+Od5bEvzpvZQGhvMyKIkrzB9S7jW+6z9LHEI2VXhl/GrqQ3oBqlzJt4tA6pGtxRmqQWKWGM1wAbwDdW/gUA==", + "dependencies": { + "@opentelemetry/api-logs": "0.51.0", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.24.0.tgz", + "integrity": "sha512-H9sLETZ4jw9UJ3totV8oM5R0m4CW0ZIOLfp4NV3g0CM8HD5zGZcaW88xqzWDgiYRpctFxd+WmHtGX/Upoa2vRg==", + "dependencies": { + "@opentelemetry/core": "1.24.0", + "@opentelemetry/resources": "1.24.0", + "@opentelemetry/semantic-conventions": "1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.24.0.tgz", + "integrity": "sha512-QgByHmM9uloTpcYEEyW9YJEIMKHFSIM677RH9pJPWWwtM2NQFbEp/8HIJw80Ymtaz6cAxg1Kay1ByqIVzq3t5g==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.24.0", + "@opentelemetry/core": "1.24.0", + "@opentelemetry/propagator-b3": "1.24.0", + "@opentelemetry/propagator-jaeger": "1.24.0", + "@opentelemetry/sdk-trace-base": "1.24.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.9.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.24.0.tgz", + "integrity": "sha512-yL0jI6Ltuz8R+Opj7jClGrul6pOoYrdfVmzQS4SITXRPH7I5IRZbrwe/6/v8v4WYMa6MYZG480S1+uc/IGfqsA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz", + "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.122", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", + "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", + "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, + "node_modules/@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/hapi__catbox": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz", + "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==" + }, + "node_modules/@types/hapi__hapi": { + "version": "20.0.13", + "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz", + "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==", + "dependencies": { + "@hapi/boom": "^9.0.0", + "@hapi/iron": "^6.0.0", + "@hapi/podium": "^4.1.3", + "@types/hapi__catbox": "*", + "@types/hapi__mimos": "*", + "@types/hapi__shot": "*", + "@types/node": "*", + "joi": "^17.3.0" + } + }, + "node_modules/@types/hapi__mimos": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz", + "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==", + "dependencies": { + "@types/mime-db": "*" + } + }, + "node_modules/@types/hapi__shot": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz", + "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/ioredis4": { + "name": "@types/ioredis", + "version": "4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/is-ci": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.4.tgz", + "integrity": "sha512-AkCYCmwlXeuH89DagDCzvCAyltI2v9lh3U3DqSg/GrBYoReAaWwxfXCqMx9UV5MajLZ4ZFwZzV4cABGIxk2XRw==", + "dev": true, + "dependencies": { + "ci-info": "^3.1.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, + "node_modules/@types/koa": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa__router": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", + "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/mime-db": { + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.5.tgz", + "integrity": "sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A==" + }, + "node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", + "dev": true + }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/shimmer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", + "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" + }, + "node_modules/@types/sinon": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", + "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "dev": true + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", + "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/type-utils": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", + "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", + "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", + "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", + "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", + "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", + "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", + "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001614", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz", + "integrity": "sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dprint-node": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.751", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.751.tgz", + "integrity": "sha512-2DEPi++qa89SMGRhufWTiLmzqyuGmNF3SK4+PQetW1JKiZdEpF4XQonJXJCzyuYSA6mauiMhbyVhqYAP45Hvfw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "peerDependencies": { + "eslint": ">=7.7.0" + } + }, + "node_modules/eslint-plugin-mocha": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz", + "integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "globals": "^13.24.0", + "rambda": "^7.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz", + "integrity": "sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", + "integrity": "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "6 - 7", + "eslint": "8" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", + "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/joi": { + "version": "17.13.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.0.tgz", + "integrity": "sha512-9qcrTyoBmFZRNHeVP4edKqIUEgFzq7MHvTNSDuHSqkpOPtiBkgNgcmTSqmiw1kw9tdKaiddvIDv/eCJDxmqWCA==", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "8.1.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rambda": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", + "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", + "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.5", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-poet": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.9.0.tgz", + "integrity": "sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ==", + "dev": true, + "dependencies": { + "dprint-node": "^1.0.8" + } + }, + "node_modules/ts-proto": { + "version": "1.172.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.172.0.tgz", + "integrity": "sha512-+4myxp5H+qD4r3sQUwvewN3zpdKpApeuUI0+lxfdznvkd2TUFVaeOD0q6dHszEYKTzR7DHu96Z1pqpNSOXF8iQ==", + "dev": true, + "dependencies": { + "case-anything": "^2.1.13", + "protobufjs": "^7.2.4", + "ts-poet": "^6.7.0", + "ts-proto-descriptors": "1.15.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.15.0.tgz", + "integrity": "sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==", + "dev": true, + "dependencies": { + "long": "^5.2.3", + "protobufjs": "^7.2.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.7.1.tgz", + "integrity": "sha512-ykEBfa3xx3odjZy6GRED4SCPrjo0rgHwstLlEgLX4EMEuv7QeIDSmfV+S6Kk+XkbsYn4BDEcPvsci1X26lRpMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "7.7.1", + "@typescript-eslint/parser": "7.7.1", + "@typescript-eslint/utils": "7.7.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c3e052a --- /dev/null +++ b/package.json @@ -0,0 +1,77 @@ +{ + "name": "@dash0/opentelemetry", + "version": "1.0.0", + "description": "Dash0 OpenTelemetry Wrapper for Node.js", + "main": "src/index.js", + "scripts": { + "build": "rm -rf dist && tsc --build --force && cp LICENSE dist", + "verify": "npm run lint && npm test", + "lint": "npm run eslint && npm run prettier-check", + "eslint": "eslint eslint.config.js src test", + "prettier": "prettier --write eslint.config.js .mocharc.js 'src/**/*.[jt]s' 'test/**/*.[jt]s' --parser typescript", + "prettier-check": "prettier --check eslint.config.js 'src/**/*.[jt]s' 'test/**/*.[jt]s' --parser typescript", + "test": "npm run test:unit && npm run test:integration", + "test:unit": "mocha --config test/.mocharc.unit.js --require ts-node/register", + "test:integration": "mocha --config test/.mocharc.integration.js --require ts-node/register --require test/integration/rootHooks.ts", + "test:coverage": "nyc npm run test", + "start-collector": "node --require ts-node/register test/collector/index.ts" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/dash0hq/opentelemetry-js-distro.git" + }, + "license": "Apache-2.0", + "author": { + "name": "Bastian Krol", + "email": "bastian.krol@dash0.com" + }, + "contributors": [], + "keywords": [ + "OpenTelemetry", + "OTel", + "Dash0", + "observability", + "APM", + "monitoring", + "performance", + "tracing" + ], + "bugs": { + "url": "https://github.com/dash0hq/opentelemetry-js-distro/issues" + }, + "homepage": "https://github.com/dash0hq/opentelemetry-js-distro#readme", + "dependencies": { + "@opentelemetry/api": "^1.8.0", + "@opentelemetry/auto-instrumentations-node": "^0.44.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.51.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.51.0", + "@opentelemetry/sdk-metrics": "^1.24.0", + "@opentelemetry/sdk-node": "^0.51.0", + "@opentelemetry/sdk-trace-node": "^1.24.0" + }, + "devDependencies": { + "@eslint/js": "^9.1.1", + "@grpc/grpc-js": "^1.10.6", + "@types/chai": "^4.3.14", + "@types/is-ci": "^3.0.4", + "@types/mocha": "^10.0.6", + "@types/node": "^20.12.7", + "@types/sinon": "^17.0.3", + "chai": "^4.4.1", + "eslint": "^8.57.0", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-mocha": "^10.4.3", + "eslint-plugin-simple-import-sort": "^12.1.0", + "eslint-plugin-unused-imports": "^3.2.0", + "is-ci": "^3.0.1", + "mocha": "^10.4.0", + "nyc": "^15.1.0", + "prettier": "^3.2.5", + "protobufjs": "^7.2.6", + "sinon": "^17.0.1", + "ts-node": "^10.9.2", + "ts-proto": "^1.172.0", + "typescript": "^5.4.5", + "typescript-eslint": "^7.7.1" + } +} diff --git a/src/detectors/node/opentelemetry-resource-detector-kubernetes-pod/index.ts b/src/detectors/node/opentelemetry-resource-detector-kubernetes-pod/index.ts new file mode 100644 index 0000000..b91e0ee --- /dev/null +++ b/src/detectors/node/opentelemetry-resource-detector-kubernetes-pod/index.ts @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { DetectorSync, Resource } from '@opentelemetry/resources'; +import { ResourceAttributes } from '@opentelemetry/resources/build/src/types'; +import { SEMRESATTRS_K8S_POD_UID } from '@opentelemetry/semantic-conventions'; +import { readFile } from 'node:fs/promises'; +import os from 'os'; + +const etcHostsFileName = '/etc/hosts'; +const expectedFirstLineInEtcHosts = '# Kubernetes-managed hosts file'; +const lineSeparator = os.EOL; +const podUidChars = 36; +const podLabel = 'pod'; +const podLabelMountPart = '/pods/'; +const podUidPartChars = podUidChars + podLabel.length; +const containerIdChars = 64; + +// for cgroup v2 +const procSelfCgroupFileName = '/proc/self/cgroup'; +const podUidInCgroupLineRegex = + /^[a-z_-]*pod(?[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12})\.slice$/; + +// for cgroup v1 +const procSelfMountInfoFileName = '/proc/self/mountinfo'; + +export default class PodUidDetector implements DetectorSync { + detect(): Resource { + return new Resource({}, this.detectPodUid()); + } + + private async detectPodUid(): Promise { + if (!(await this.isKubernetes())) { + return {}; + } + const podUid = await this.readPodUid(); + if (podUid) { + return { + [SEMRESATTRS_K8S_POD_UID]: podUid, + }; + } + + // Note: This seems to be running in K8s, but we could not figure out the pod uid. + // This should trigger a monitoring issue. Potentially include troubleshooting information. + return {}; + } + + private async readPodUid(): Promise { + const podUid = await this.readPodUidCGroupV1(); + if (podUid) { + return podUid; + } + return await this.readPodUidCGroupV2(); + } + + private async readPodUidCGroupV1(): Promise { + const mount = (await this.findCandidateLinesInFile(procSelfMountInfoFileName, podUidChars)).find( + line => line.indexOf(podLabelMountPart) > 0, + ); + if (!mount) { + return null; + } + const partAfterPodLabel = mount.split(podLabelMountPart)[1]; + if (!partAfterPodLabel) { + return null; + } + return partAfterPodLabel.substring(0, podUidChars); + } + + private async readPodUidCGroupV2(): Promise { + const lines = await this.findCandidateLinesInFile(procSelfCgroupFileName, containerIdChars); + const candidates = lines.map(line => { + const pathSegments = line.split('/'); + if (pathSegments.length <= 2) { + return null; + } + const penultimatePathSegment = pathSegments[pathSegments.length - 2]; + if (penultimatePathSegment.startsWith(podLabel) && penultimatePathSegment.length === podUidPartChars) { + return penultimatePathSegment.substring(3, podUidPartChars); + } else { + // matches strings like kubepods-pode462ffed_94ce_4806_a52e_d2726f448f15.slice + const matches = podUidInCgroupLineRegex.exec(penultimatePathSegment); + if (matches) { + return matches.groups?.uid?.replaceAll('_', '-'); + } else { + // questionable: this might actually lead to extracing a wrong uid + return penultimatePathSegment; + } + } + }); + return candidates.find(podUid => !!podUid); + } + + private async isKubernetes() { + let etcHosts: string; + try { + etcHosts = String(await readFile(etcHostsFileName, { encoding: 'utf8' })); + } catch (e) { + return false; + } + if (etcHosts == null || etcHosts.trim().length === 0) { + return false; + } + const lines = etcHosts.split(lineSeparator); + if (lines.length === 0) { + return false; + } + return lines[0].startsWith(expectedFirstLineInEtcHosts); + } + + private async findCandidateLinesInFile(filename: string, minimumLength: number) { + let content; + try { + content = await readFile(filename, { encoding: 'utf8' }); + } catch (e) { + return []; + } + if (!content) { + return []; + } + return content + .split(lineSeparator) + .map(line => line.trim()) + .filter(line => line != null && line.length > minimumLength); + } +} diff --git a/src/detectors/node/opentelemetry-resource-detector-kubernetes-pod/index_test.ts b/src/detectors/node/opentelemetry-resource-detector-kubernetes-pod/index_test.ts new file mode 100644 index 0000000..665f42d --- /dev/null +++ b/src/detectors/node/opentelemetry-resource-detector-kubernetes-pod/index_test.ts @@ -0,0 +1,216 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { Resource } from '@opentelemetry/resources'; +import { SEMRESATTRS_K8S_POD_UID } from '@opentelemetry/semantic-conventions'; +import { expect } from 'chai'; +import fs from 'node:fs/promises'; +import Sinon from 'sinon'; +import sinon from 'sinon'; +import PodUidDetector from './index'; + +const etcHostsFileName = '/etc/hosts'; +const procSelfCgroupFileName = '/proc/self/cgroup'; +const procSelfMountInfoFileName = '/proc/self/mountinfo'; + +const etcHostsContent = `# Kubernetes-managed hosts file. +127.0.0.1\tlocalhost +::1\tlocalhost ip6-localhost ip6-loopback +fe00::0\tip6-localnet +fe00::0\tip6-mcastprefix +fe00::1\tip6-allnodes +fe00::2\tip6-allrouters +10.1.18.147\topentelemetry-demo-someservice-1234d7cddc-2vsj5`; + +const procSelfCgroupContentNoPodUid = '0::/'; + +const procSelfCgroupContentWithPodUid = `11:memory:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +10:freezer:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +9:pids:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +8:blkio:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +7:perf_event:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +6:devices:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +5:hugetlb:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +4:cpu,cpuacct:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +3:net_cls,net_prio:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +2:cpuset:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope +1:name=systemd:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope`; + +const procSelfMountInfoContentWithPodUid = `2070 1678 0:552 / / rw,relatime master:199 - overlay overlay rw,lowerdir=/var/lib/docker/overlay2/l/OJZ7JQ4ARSNC3Z2YD2D6OZFJ2T:/var/lib/docker/overlay2/l/YNFYQMQ4JPWXSRMISEKJQ2EAOZ:/var/lib/docker/overlay2/l/NNEI5OO4B5UGLPIRR2FEQ4EPPR:/var/lib/docker/overlay2/l/QOA6GG74TMIF5OHXD6BI74FPA3:/var/lib/docker/overlay2/l/IDVQPNUVG4B3Z2OINQEFMN7QLF:/var/lib/docker/overlay2/l/FJQTQGY6HEFD4GRGMC62NYF4MS,upperdir=/var/lib/docker/overlay2/be815ecdb1e307322d18bb5be01d1a42d3b0afd2892c1ce929fc36652046b2f7/diff,workdir=/var/lib/docker/overlay2/be815ecdb1e307322d18bb5be01d1a42d3b0afd2892c1ce929fc36652046b2f7/work +2071 2070 0:554 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +2072 2070 0:555 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +2073 2072 0:556 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=9,mode=620,ptmxmode=666 +2074 2070 0:342 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +2075 2074 0:30 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw +2076 2072 0:328 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +2077 2072 254:1 /kubelet/pods/702cc0d1-1251-4dd8-8d74-4c40bcee810e/containers/someservice/69604667 /dev/termination-log rw,relatime - ext4 /dev/vda1 rw,discard +2078 2070 254:1 /docker/containers/acb5d7abd5a2a1edfab75dad79fea1e52fae910bb35fa16bd46149ceb6775d69/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/vda1 rw,discard +2079 2070 254:1 /docker/containers/acb5d7abd5a2a1edfab75dad79fea1e52fae910bb35fa16bd46149ceb6775d69/hostname /etc/hostname rw,relatime - ext4 /dev/vda1 rw,discard +2080 2070 254:1 /kubelet/pods/702cc0d1-1251-4dd8-8d74-4c40bcee810e/etc-hosts /etc/hosts rw,relatime - ext4 /dev/vda1 rw,discard +2081 2072 0:310 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k +2082 2070 0:278 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=16257092k +1679 2071 0:554 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +1693 2071 0:554 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +1694 2071 0:554 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +1695 2071 0:554 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +1696 2071 0:554 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +1697 2071 0:555 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1698 2071 0:555 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1699 2071 0:555 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1700 2074 0:557 / /sys/firmware ro,relatime - tmpfs tmpfs ro`; + +const procSelfMountInfoContentWithPodUid2 = `2317 1432 0:473 / / rw,relatime master:320 - overlay overlay rw,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69739/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69738/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69735/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69734/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69733/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69731/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/116/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69740/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/69740/work +2318 2317 0:475 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +2319 2317 0:476 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +2320 2319 0:477 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=9,mode=620,ptmxmode=666 +2321 2319 0:401 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +2322 2317 0:417 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +2323 2322 0:478 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755 +2324 2323 0:25 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/systemd ro,nosuid,nodev,noexec,relatime master:9 - cgroup cgroup rw,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd +2325 2323 0:27 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/cpuset ro,nosuid,nodev,noexec,relatime master:10 - cgroup cgroup rw,cpuset +2326 2323 0:28 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/net_cls,net_prio ro,nosuid,nodev,noexec,relatime master:11 - cgroup cgroup rw,net_cls,net_prio +2327 2323 0:29 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime master:12 - cgroup cgroup rw,cpu,cpuacct +2328 2323 0:30 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/hugetlb ro,nosuid,nodev,noexec,relatime master:13 - cgroup cgroup rw,hugetlb +2329 2323 0:31 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/devices ro,nosuid,nodev,noexec,relatime master:14 - cgroup cgroup rw,devices +2330 2323 0:32 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/perf_event ro,nosuid,nodev,noexec,relatime master:15 - cgroup cgroup rw,perf_event +2331 2323 0:33 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime master:16 - cgroup cgroup rw,blkio +2332 2323 0:34 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/pids ro,nosuid,nodev,noexec,relatime master:17 - cgroup cgroup rw,pids +2333 2323 0:35 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/freezer ro,nosuid,nodev,noexec,relatime master:18 - cgroup cgroup rw,freezer +2334 2323 0:36 /kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime master:19 - cgroup cgroup rw,memory +2335 2317 259:1 /var/lib/kubelet/pods/f57400dc-94ce-4806-a52e-d2726f448f15/volumes/kubernetes.io~configmap/config /etc/dash0 ro,noatime - xfs /dev/nvme0n1p1 rw,attr2,inode64,logbufs=8,logbsize=32k,noquota +2336 2317 259:1 /var/lib/kubelet/pods/f57400dc-94ce-4806-a52e-d2726f448f15/etc-hosts /etc/hosts rw,noatime - xfs /dev/nvme0n1p1 rw,attr2,inode64,logbufs=8,logbsize=32k,noquota +2337 2319 259:1 /var/lib/kubelet/pods/f57400dc-94ce-4806-a52e-d2726f448f15/containers/api/5f9dc7b6 /dev/termination-log rw,noatime - xfs /dev/nvme0n1p1 rw,attr2,inode64,logbufs=8,logbsize=32k,noquota +2338 2317 259:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/141e80b1fd73c453e117972a858c4214df9ae2a865273f846270c41781559dcb/hostname /etc/hostname rw,noatime - xfs /dev/nvme0n1p1 rw,attr2,inode64,logbufs=8,logbsize=32k,noquota +2339 2317 259:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/141e80b1fd73c453e117972a858c4214df9ae2a865273f846270c41781559dcb/resolv.conf /etc/resolv.conf rw,noatime - xfs /dev/nvme0n1p1 rw,attr2,inode64,logbufs=8,logbsize=32k,noquota +2340 2319 0:368 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k +1434 2318 0:475 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +1435 2318 0:475 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +1436 2318 0:475 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +1437 2318 0:475 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +1438 2318 0:475 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +1439 2318 0:479 / /proc/acpi ro,relatime - tmpfs tmpfs ro +1450 2318 0:476 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1451 2318 0:476 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1453 2318 0:476 /null /proc/latency_stats rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1454 2318 0:476 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1456 2318 0:476 /null /proc/sched_debug rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +1457 2322 0:480 / /sys/firmware ro,relatime - tmpfs tmpfs ro`; + +describe('podUidDetector', () => { + const sandbox = sinon.createSandbox(); + let readFileStub: sinon.SinonStub; + let podUidDetector: PodUidDetector; + + beforeEach(() => { + readFileStub = sandbox.stub(fs, 'readFile'); + podUidDetector = new PodUidDetector(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('does not detect a pod uid if /etc/hosts does not exist', async () => { + readFileStub + .withArgs(etcHostsFileName) + .throws(new Error(`ENOENT: no such file or directory, open '${etcHostsFileName}'`)); + const result = podUidDetector.detect(); + const attributes = await waitForAsyncDetection(result); + expect(attributes).to.be.empty; + + // should only have attempted to read /etc/hosts and no other file + expect(readFileStub.callCount).to.equal(1); + expect(readFileStub.args[0][0]).to.equal(etcHostsFileName); + }); + + [ + // + '', + ' ', + ' \n \t ', + 'this is not a Kubernetes-managed /etc/hosts file\nanother line\nanother line', + ].forEach(content => { + it(`does not detect a pod uid if /etc/hosts does not have the expected first line (content is "${content}")`, async () => { + readFileStub.withArgs(etcHostsFileName).returns(content); + const result = podUidDetector.detect(); + const attributes = await waitForAsyncDetection(result); + expect(attributes).to.be.empty; + + // should only have attempted to read /etc/hosts and no other file + expect(readFileStub.callCount).to.equal(1); + expect(readFileStub.args[0][0]).to.equal(etcHostsFileName); + }); + }); + + it('detects pod uid for cgroup v1', async () => { + givenAKubernetesManagedEtcHostsFile(readFileStub); + readFileStub.withArgs(procSelfMountInfoFileName).returns(procSelfMountInfoContentWithPodUid); + readFileStub.withArgs(procSelfCgroupFileName).returns(procSelfCgroupContentNoPodUid); + const result = podUidDetector.detect(); + const attributes = await waitForAsyncDetection(result); + expect(attributes).to.have.property(SEMRESATTRS_K8S_POD_UID, '702cc0d1-1251-4dd8-8d74-4c40bcee810e'); + + expect(readFileStub.callCount).to.equal(2); + expect(readFileStub.args[0][0]).to.equal(etcHostsFileName); + expect(readFileStub.args[1][0]).to.equal(procSelfMountInfoFileName); + }); + + it('detects pod uid for cgroup v1 #2', async () => { + givenAKubernetesManagedEtcHostsFile(readFileStub); + readFileStub.withArgs(procSelfMountInfoFileName).returns(procSelfMountInfoContentWithPodUid2); + readFileStub.withArgs(procSelfCgroupFileName).returns(procSelfCgroupContentNoPodUid); + const result = podUidDetector.detect(); + const attributes = await waitForAsyncDetection(result); + expect(attributes).to.have.property(SEMRESATTRS_K8S_POD_UID, 'f57400dc-94ce-4806-a52e-d2726f448f15'); + + expect(readFileStub.callCount).to.equal(2); + expect(readFileStub.args[0][0]).to.equal(etcHostsFileName); + expect(readFileStub.args[1][0]).to.equal(procSelfMountInfoFileName); + }); + + it('detects pod uid for cgroup v2', async () => { + givenAKubernetesManagedEtcHostsFile(readFileStub); + readFileStub + .withArgs(procSelfMountInfoFileName) + .throws(new Error(`ENOENT: no such file or directory, open '${procSelfMountInfoFileName}'`)); + readFileStub.withArgs(procSelfCgroupFileName).returns(procSelfCgroupContentWithPodUid); + const result = podUidDetector.detect(); + const attributes = await waitForAsyncDetection(result); + expect(attributes).to.have.property(SEMRESATTRS_K8S_POD_UID, 'f57400dc-94ce-4806-a52e-d2726f448f15'); + + expect(readFileStub.callCount).to.equal(3); + expect(readFileStub.args[0][0]).to.equal(etcHostsFileName); + expect(readFileStub.args[1][0]).to.equal(procSelfMountInfoFileName); + expect(readFileStub.args[2][0]).to.equal(procSelfCgroupFileName); + }); + + it("it's Kubernetes but no pod uid can be derived", async () => { + givenAKubernetesManagedEtcHostsFile(readFileStub); + readFileStub + .withArgs(procSelfMountInfoFileName) + .throws(new Error(`ENOENT: no such file or directory, open '${procSelfMountInfoFileName}'`)); + readFileStub + .withArgs(procSelfCgroupFileName) + .throws(new Error(`ENOENT: no such file or directory, open '${procSelfCgroupFileName}'`)); + const result = podUidDetector.detect(); + const attributes = await waitForAsyncDetection(result); + expect(attributes).to.be.empty; + + expect(readFileStub.callCount).to.equal(3); + expect(readFileStub.args[0][0]).to.equal(etcHostsFileName); + expect(readFileStub.args[1][0]).to.equal(procSelfMountInfoFileName); + expect(readFileStub.args[2][0]).to.equal(procSelfCgroupFileName); + }); + + function givenAKubernetesManagedEtcHostsFile(readFileStub: Sinon.SinonStub) { + readFileStub.withArgs(etcHostsFileName).returns(etcHostsContent); + } + + async function waitForAsyncDetection(result: Resource) { + expect(result).to.exist; + expect(result.asyncAttributesPending).to.be.true; + // @ts-expect-error required + await result.waitForAsyncAttributes(); + return result.attributes; + } +}); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..22f085a --- /dev/null +++ b/src/index.ts @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; +import { Detector, DetectorSync, envDetector, hostDetector, processDetector, Resource } from '@opentelemetry/resources'; +import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; +import { NodeSDK, NodeSDKConfiguration } from '@opentelemetry/sdk-node'; + +import { version } from '../package.json'; +import PodUidDetector from './detectors/node/opentelemetry-resource-detector-kubernetes-pod'; +import { getResourceDetectorsFromEnv } from './util/sdkUtil'; + +if (process.env.DASH0_DEBUG) { + console.log('Dash0 OpenTelemetry distribution for Node.js: Starting NodeSDK.'); +} + +let baseUrl = 'http://dash0-opentelemetry-collector-daemonset.default.svc.cluster.local:4318'; +if (process.env.DASH0_OTEL_COLLECTOR_BASE_URL) { + baseUrl = process.env.DASH0_OTEL_COLLECTOR_BASE_URL; +} + +const configuration: Partial = { + traceExporter: new OTLPTraceExporter({ + url: `${baseUrl}/v1/traces`, + }), + metricReader: new PeriodicExportingMetricReader({ + exporter: new OTLPMetricExporter({ + url: `${baseUrl}/v1/metrics`, + }), + }), + + instrumentations: [ + getNodeAutoInstrumentations( + // TODO provide an opt-in switch for fs + { + '@opentelemetry/instrumentation-fs': { + enabled: false, + }, + }, + ), + ], + + resource: new Resource({ + 'telemetry.distro.name': 'dash0-nodejs', + 'telemetry.distro.version': version, + }), +}; + +// Copy the behavior of the NodeSDK constructor with regard to resource detectors, but add the pod uid detector. +// https://github.com/open-telemetry/opentelemetry-js/blob/73fddf9b5e7a93bd4cf21c2dbf444cee31d26c88/experimental/packages/opentelemetry-sdk-node/src/sdk.ts#L126-L132 +let detectors: (Detector | DetectorSync)[]; +if (process.env.OTEL_NODE_RESOURCE_DETECTORS != null) { + detectors = getResourceDetectorsFromEnv(); +} else { + detectors = [envDetector, processDetector, hostDetector]; +} +detectors.push(new PodUidDetector()); +configuration.resourceDetectors = detectors; + +const sdk = new NodeSDK(configuration); + +sdk.start(); + +if (process.env.DASH0_DEBUG) { + console.log('Dash0 OpenTelemetry distribution for Node.js: NodeSDK started.'); +} diff --git a/src/util/sdkUtil.ts b/src/util/sdkUtil.ts new file mode 100644 index 0000000..a386f92 --- /dev/null +++ b/src/util/sdkUtil.ts @@ -0,0 +1,70 @@ +/* eslint-disable header/header */ + +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache 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.apache.org/licenses/LICENSE-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. + */ + +// This is a modified copy of https://github.com/open-telemetry/opentelemetry-js/blob/73fddf9b5e7a93bd4cf21c2dbf444cee31d26c88/experimental/packages/opentelemetry-sdk-node/src/utils.ts#L60, +// which is used in the NodeSDK constructor +// (https://github.com/open-telemetry/opentelemetry-js/blob/73fddf9b5e7a93bd4cf21c2dbf444cee31d26c88/experimental/packages/opentelemetry-sdk-node/src/sdk.ts#L129), +// but not exported externally by the @opentelemetry/sdk-node package. We need this functionality to be able to add the +// pod uid detector. + +import { diag } from '@opentelemetry/api'; +import { + DetectorSync, + envDetectorSync, + hostDetectorSync, + osDetectorSync, + processDetectorSync, + serviceInstanceIdDetectorSync, +} from '@opentelemetry/resources'; + +const RESOURCE_DETECTOR_ENVIRONMENT = 'env'; +const RESOURCE_DETECTOR_HOST = 'host'; +const RESOURCE_DETECTOR_OS = 'os'; +const RESOURCE_DETECTOR_PROCESS = 'process'; +const RESOURCE_DETECTOR_SERVICE_INSTANCE_ID = 'serviceinstance'; + +export function getResourceDetectorsFromEnv(): Array { + // When updating this list, make sure to also update the section `resourceDetectors` on README. + const resourceDetectors = new Map([ + [RESOURCE_DETECTOR_ENVIRONMENT, envDetectorSync], + [RESOURCE_DETECTOR_HOST, hostDetectorSync], + [RESOURCE_DETECTOR_OS, osDetectorSync], + [RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, serviceInstanceIdDetectorSync], + [RESOURCE_DETECTOR_PROCESS, processDetectorSync], + ]); + + const resourceDetectorsFromEnv = process.env.OTEL_NODE_RESOURCE_DETECTORS?.split(',') ?? ['all']; + + if (resourceDetectorsFromEnv.includes('all')) { + return [...resourceDetectors.values()].flat(); + } + + if (resourceDetectorsFromEnv.includes('none')) { + return []; + } + + return resourceDetectorsFromEnv.flatMap(detector => { + const resourceDetector = resourceDetectors.get(detector); + if (!resourceDetector) { + diag.error( + `Invalid resource detector "${detector}" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`, + ); + } + return resourceDetector || []; + }); +} diff --git a/test/.mocharc.integration.js b/test/.mocharc.integration.js new file mode 100644 index 0000000..9064490 --- /dev/null +++ b/test/.mocharc.integration.js @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +'use strict'; + +/* global module */ + +module.exports = { + extension: ['ts'], + ignore: ['test/**/node_modules/**'], + recursive: true, + require: ['ts-node/register'], + slow: 3000, + spec: ['test/**/*test.ts'], + timeout: 10000, +}; diff --git a/test/.mocharc.unit.js b/test/.mocharc.unit.js new file mode 100644 index 0000000..0c5a492 --- /dev/null +++ b/test/.mocharc.unit.js @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +'use strict'; + +/* global module */ + +module.exports = { + extension: ['ts'], + recursive: true, + require: ['ts-node/register'], + spec: ['src/**/*test.ts'], +}; diff --git a/test/apps/express-typescript/app.ts b/test/apps/express-typescript/app.ts new file mode 100644 index 0000000..9027b23 --- /dev/null +++ b/test/apps/express-typescript/app.ts @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import express, { Express } from 'express'; + +import { sendReadyToParentProcess } from '../../util/sendToParentProcess'; + +const port: number = parseInt(process.env.PORT || '1302'); +const app: Express = express(); + +app.get('/ohai', (req, res) => { + res.json({ message: 'We make Observability easy for every developer.' }); +}); + +app.listen(port, () => { + console.log(`listening on port ${port}`); + sendReadyToParentProcess(); +}); diff --git a/test/apps/express-typescript/package-lock.json b/test/apps/express-typescript/package-lock.json new file mode 100644 index 0000000..2bc6bed --- /dev/null +++ b/test/apps/express-typescript/package-lock.json @@ -0,0 +1,951 @@ +{ + "name": "dash0-app-under-test-express-typescript", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dash0-app-under-test-express-typescript", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@types/express": "^4.17.21", + "@types/node": "^20.12.7", + "express": "^4.19.2", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/test/apps/express-typescript/package.json b/test/apps/express-typescript/package.json new file mode 100644 index 0000000..8471f07 --- /dev/null +++ b/test/apps/express-typescript/package.json @@ -0,0 +1,19 @@ +{ + "name": "dash0-app-under-test-express-typescript", + "version": "1.0.0", + "description": "", + "main": "app.ts", + "scripts": { + "start-instrumented": "ts-node --require ../../../dist app.ts", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Bastian Krol ", + "license": "Apache-2.0", + "dependencies": { + "@types/express": "^4.17.21", + "@types/node": "^20.12.7", + "express": "^4.19.2", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" + } +} diff --git a/test/apps/express-typescript/tsconfig.json b/test/apps/express-typescript/tsconfig.json new file mode 100644 index 0000000..f141bf8 --- /dev/null +++ b/test/apps/express-typescript/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "module": "commonjs", + "moduleResolution": "node", + "skipLibCheck": true, + "strict": true, + "target": "ES2022" + } +} diff --git a/test/collector/AbstractServer.ts b/test/collector/AbstractServer.ts new file mode 100644 index 0000000..81f1182 --- /dev/null +++ b/test/collector/AbstractServer.ts @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import Sink from './Sink'; + +export default class AbstractServer { + bindAddress: string; + sink: Sink; + + constructor(bindAddress: string, sink: Sink) { + this.bindAddress = bindAddress; + this.sink = sink; + } +} diff --git a/test/collector/CollectorChildProcessWrapper.ts b/test/collector/CollectorChildProcessWrapper.ts new file mode 100644 index 0000000..007a799 --- /dev/null +++ b/test/collector/CollectorChildProcessWrapper.ts @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import ChildProcessWrapper, { ChildProcessWrapperOptions } from '../integration/ChildProcessWrapper'; +import { collector } from '../integration/rootHooks'; +import { OpenTelemetryData, Stats } from './Sink'; + +export default class CollectorChildProcessWrapper extends ChildProcessWrapper { + constructor(options: ChildProcessWrapperOptions) { + super(options); + } + + async fetchStats() { + return await collector().sendRequest({ command: 'stats' }); + } + + async hasTraces() { + const stats = await collector().fetchStats(); + return stats.traces >= 1; + } + + async fetchTelemetry() { + return await collector().sendRequest({ command: 'telemetry' }); + } +} diff --git a/test/collector/GrpcServer.ts b/test/collector/GrpcServer.ts new file mode 100644 index 0000000..4b35807 --- /dev/null +++ b/test/collector/GrpcServer.ts @@ -0,0 +1,121 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { loadPackageDefinition, sendUnaryData, Server, ServerCredentials, ServerUnaryCall } from '@grpc/grpc-js'; +import * as protoLoader from '@grpc/proto-loader'; +import path from 'node:path'; +import { promisify } from 'node:util'; + +import AbstractServer from './AbstractServer'; +import Sink from './Sink'; +import { + ExportLogsServiceRequest, + ExportLogsServiceResponse, +} from './types/opentelemetry/proto/collector/logs/v1/logs_service'; +import { + ExportMetricsServiceRequest, + ExportMetricsServiceResponse, +} from './types/opentelemetry/proto/collector/metrics/v1/metrics_service'; +import { + ExportTraceServiceRequest, + ExportTraceServiceResponse, +} from './types/opentelemetry/proto/collector/trace/v1/trace_service'; +import { readPort } from './util'; + +const port = readPort('OTEL_OTLP_GRCP_PORT', 4317); + +const PROTO_DIR = path.join(__dirname, '/opentelemetry-proto'); +const TRACE_PROTO_PATH = 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; +const METRICS_PROTO_PATH = 'opentelemetry/proto/collector/metrics/v1/metrics_service.proto'; +const LOGS_PROTO_PATH = 'opentelemetry/proto/collector/logs/v1/logs_service.proto'; + +const traceServicePackage = loadServicePackage(TRACE_PROTO_PATH, 'trace'); +const metricsServicePackage = loadServicePackage(METRICS_PROTO_PATH, 'metrics'); +const logsServicePackage = loadServicePackage(LOGS_PROTO_PATH, 'logs'); + +function loadServicePackage(serviceProtoPath: string, packageName: string): any { + const packageDefinition = protoLoader.loadSync(serviceProtoPath, { + defaults: true, + includeDirs: [PROTO_DIR], + keepCase: true, + longs: String, + oneofs: true, + }); + const protoDescriptor = loadPackageDefinition(packageDefinition); + // @ts-expect-error the package definition is not correctly typed + return protoDescriptor.opentelemetry.proto.collector[packageName].v1; +} + +export default class GrpcServer extends AbstractServer { + constructor(bindAddress: string, sink: Sink) { + super(bindAddress, sink); + } + + async start() { + const server = new Server(); + server.addService(traceServicePackage.TraceService.service, { + Export: this.receiveTraces.bind(this), + }); + server.addService(metricsServicePackage.MetricsService.service, { + Export: this.receiveMetrics.bind(this), + }); + server.addService(logsServicePackage.LogsService.service, { + Export: this.receiveLogs.bind(this), + }); + + const addressWithPort = `${this.bindAddress}:${port}`; + const serverBindAsync = <(s: string, c: ServerCredentials) => Promise>( + promisify(server.bindAsync).bind(server) + ); + await serverBindAsync(addressWithPort, ServerCredentials.createInsecure()); + console.log(`listening for gRPC traffic on ${addressWithPort}`); + } + + receiveTraces( + call: ServerUnaryCall, + callback: sendUnaryData, + ) { + const traces: ExportTraceServiceRequest = call.request; + this.sink.addTraces(traces); + callback( + null, + ExportTraceServiceResponse.fromJSON({ + partialSuccess: { + rejectedSpans: 0, + }, + }), + ); + } + + receiveMetrics( + call: ServerUnaryCall, + callback: sendUnaryData, + ) { + const metrics: ExportMetricsServiceRequest = call.request; + this.sink.addMetrics(metrics); + callback( + null, + ExportMetricsServiceResponse.fromJSON({ + partialSuccess: { + rejectedMetrics: 0, + }, + }), + ); + } + + receiveLogs( + call: ServerUnaryCall, + callback: sendUnaryData, + ) { + const logs: ExportLogsServiceRequest = call.request; + this.sink.addLogs(logs); + callback( + null, + ExportLogsServiceResponse.fromJSON({ + partialSuccess: { + rejectedLogs: 0, + }, + }), + ); + } +} diff --git a/test/collector/HttpServer.ts b/test/collector/HttpServer.ts new file mode 100644 index 0000000..f1ffd88 --- /dev/null +++ b/test/collector/HttpServer.ts @@ -0,0 +1,136 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import http, { IncomingMessage, ServerResponse } from 'node:http'; +import { promisify } from 'node:util'; +import { Reader } from 'protobufjs/minimal'; + +import AbstractServer from './AbstractServer'; +import Sink from './Sink'; +import { ExportLogsServiceRequest } from './types/opentelemetry/proto/collector/logs/v1/logs_service'; +import { ExportMetricsServiceRequest } from './types/opentelemetry/proto/collector/metrics/v1/metrics_service'; +import { ExportTraceServiceRequest } from './types/opentelemetry/proto/collector/trace/v1/trace_service'; +import { readPort } from './util'; + +const port = readPort('OTEL_OTLP_HTTP_PORT', 4318); + +export default class HttpServer extends AbstractServer { + constructor(bindAddress: string, sink: Sink) { + super(bindAddress, sink); + } + + async start() { + const server = http.createServer(this.handleHttpRequest.bind(this)); + const serverListen = <(port?: number, hostname?: string) => Promise>promisify(server.listen).bind(server); + await serverListen(port, this.bindAddress); + console.log(`listening for HTTP traffic on http://${this.bindAddress}:${port}`); + } + + handleHttpRequest(req: IncomingMessage, res: ServerResponse) { + const pathname = new URL(req.url ?? '', `http://${req.headers.host}`).pathname; + if (req.method !== 'POST') { + res.statusCode = 405; + res.end(); + return; + } + + switch (pathname) { + case '/v1/traces': + this.handleTraceRequest(req, res); + return; + case '/v1/metrics': + this.handleMetrics(req, res); + return; + case '/v1/logs': + this.handleLogs(req, res); + return; + } + + res.statusCode = 404; + res.end(); + } + + handleTraceRequest(req: IncomingMessage, res: ServerResponse) { + this.handleOtlpRequest( + req, + res, + ExportTraceServiceRequest.decode, + this.sink.addTraces.bind(this.sink), + 'rejectedSpans', + ); + } + + handleMetrics(req: IncomingMessage, res: ServerResponse) { + this.handleOtlpRequest( + req, + res, + ExportMetricsServiceRequest.decode, + this.sink.addMetrics.bind(this.sink), + + 'rejectedMetrics', + ); + } + + handleLogs(req: IncomingMessage, res: ServerResponse) { + this.handleOtlpRequest( + req, + res, + ExportLogsServiceRequest.decode, + this.sink.addLogs.bind(this.sink), + + 'rejectedLogs', + ); + } + + handleOtlpRequest( + req: IncomingMessage, + res: ServerResponse, + decodeFunction: (reader: Reader | Uint8Array, length?: number) => any, + addToSink: (data: any) => void, + responseProperty: string, + ) { + const chunks: Buffer[] = []; + req + .on('data', chunk => { + chunks.push(chunk); + }) + .on('end', () => { + const buffer = Buffer.concat(chunks); + const contentType = req.headers['content-type']; + if (contentType?.toLowerCase().startsWith('application/x-protobuf')) { + this.handleHttpProtobuf(buffer, res, decodeFunction, addToSink, responseProperty); + } else if (contentType?.toLowerCase().startsWith('application/json')) { + this.handleHttpJson(res); + } else { + if (!contentType) { + console.warn('request had no content type, assuming http/protobuf'); + } else { + console.warn(`request had unexpected content type (${contentType}), assuming http/protobuf`); + } + this.handleHttpProtobuf(buffer, res, decodeFunction, addToSink, responseProperty); + } + }); + } + + handleHttpProtobuf( + buffer: Buffer, + res: ServerResponse, + decodeFunction: (reader: Reader | Uint8Array, length?: number) => any, + addToSink: (data: any) => void, + responseProperty: string, + ): void { + const reader = new Reader(buffer); + const decoded = decodeFunction(reader); + addToSink(decoded); + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + // respond with {rejectedSpans: 0} or similar, depending on signal type + res.end(JSON.stringify({ [responseProperty]: 0 })); + } + + handleHttpJson(res: ServerResponse) { + res.statusCode = 501; + res.setHeader('Content-Type', 'text/plain'); + res.end('http/json is not supported (yet), only grpc and http/protobuf\n'); + } +} diff --git a/test/collector/Sink.ts b/test/collector/Sink.ts new file mode 100644 index 0000000..3b52db7 --- /dev/null +++ b/test/collector/Sink.ts @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { ExportLogsServiceRequest } from './types/opentelemetry/proto/collector/logs/v1/logs_service'; +import { ExportMetricsServiceRequest } from './types/opentelemetry/proto/collector/metrics/v1/metrics_service'; +import { ExportTraceServiceRequest } from './types/opentelemetry/proto/collector/trace/v1/trace_service'; + +export interface OpenTelemetryData { + traces: ExportTraceServiceRequest[]; + metrics: ExportMetricsServiceRequest[]; + logs: ExportLogsServiceRequest[]; +} + +export interface Stats { + traces: number; + metrics: number; + logs: number; +} + +export default class Sink { + telemetry: OpenTelemetryData; + + static MAX_ITEMS = 3000; + + constructor() { + this.telemetry = { + traces: [], + metrics: [], + logs: [], + }; + } + + addTraces(traces: ExportTraceServiceRequest) { + if (this.telemetry.traces.length > Sink.MAX_ITEMS) { + throw new Error('Too many traces, please clear the mock collector between test runs.'); + } + this.telemetry.traces.push(traces); + } + + addMetrics(metrics: ExportMetricsServiceRequest) { + if (this.telemetry.metrics.length > Sink.MAX_ITEMS) { + throw new Error('Too many traces, please clear the mock collector between test runs.'); + } + + this.telemetry.metrics.push(metrics); + } + + addLogs(logs: ExportLogsServiceRequest) { + if (this.telemetry.logs.length > Sink.MAX_ITEMS) { + throw new Error('Too many traces, please clear the mock collector between test runs.'); + } + this.telemetry.logs.push(logs); + } + + stats(): Stats { + return { + traces: this.telemetry.traces.length, + metrics: this.telemetry.metrics.length, + logs: this.telemetry.logs.length, + }; + } + + getTelemetry(): OpenTelemetryData { + return this.telemetry; + } + + printStats() { + console.log(JSON.stringify(this.stats(), null, 2)); + } + + printDetails() { + console.log(JSON.stringify(this.telemetry, null, 2)); + } +} diff --git a/test/collector/index.ts b/test/collector/index.ts new file mode 100644 index 0000000..dc4baac --- /dev/null +++ b/test/collector/index.ts @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { inspect } from 'node:util'; + +import { IpcRequest } from '../util/ipc'; +import sendToParentProcess, { sendReadyToParentProcess } from '../util/sendToParentProcess'; +import GrpcServer from './GrpcServer'; +import HttpServer from './HttpServer'; +import Sink from './Sink'; + +// listen on the IPv6 local loopback +const bindAddress = '::1'; +const sink = new Sink(); +const httpServer = new HttpServer(bindAddress, sink); +const grpcServer = new GrpcServer(`[${bindAddress}]`, sink); + +async function main() { + await Promise.all([httpServer.start(), grpcServer.start()]); + console.log('The Dash0 OpenTelemetry mock collector is ready.'); + registerIpcMessageListener(); + sendReadyToParentProcess(); +} + +function registerIpcMessageListener() { + process.on('message', message => { + const ipcRequest = message; + const command = ipcRequest.command; + const id = ipcRequest.id; + switch (command) { + case 'stats': + sendToParentProcess({ id, ...sink.stats() }); + break; + case 'telemetry': + sendToParentProcess({ id, ...sink.getTelemetry() }); + break; + default: + console.error(`Unknown message: ${inspect(message)}`); + } + }); +} + +main(); diff --git a/test/collector/opentelemetry-proto b/test/collector/opentelemetry-proto new file mode 160000 index 0000000..39339ef --- /dev/null +++ b/test/collector/opentelemetry-proto @@ -0,0 +1 @@ +Subproject commit 39339ef177218cc965b8cf863d761775ec668858 diff --git a/test/collector/regenerate-types.sh b/test/collector/regenerate-types.sh new file mode 100755 index 0000000..7b2e13d --- /dev/null +++ b/test/collector/regenerate-types.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")" + +generate_types_for_service() { + local service=${1:-} + if [[ -z $service ]]; then + echo "generate_types_for_service: missing mandatory argument " + exit 1 + fi + echo generating TypeScript type definitions for $service service. + protoc \ + --plugin=../..//node_modules/.bin/protoc-gen-ts_proto \ + --ts_proto_opt=forceLong=string \ + --ts_proto_opt=snakeToCamel=false \ + --ts_proto_out=types \ + -I=./opentelemetry-proto \ + ./opentelemetry-proto/opentelemetry/proto/collector/${service}/v1/${service}_service.proto + echo TypeScript type definitions for $service service have been generated. +} + +generate_types_for_service trace +generate_types_for_service metrics +generate_types_for_service logs + +echo diff --git a/test/collector/types/opentelemetry/proto/collector/logs/v1/logs_service.ts b/test/collector/types/opentelemetry/proto/collector/logs/v1/logs_service.ts new file mode 100644 index 0000000..a6a9f4a --- /dev/null +++ b/test/collector/types/opentelemetry/proto/collector/logs/v1/logs_service.ts @@ -0,0 +1,314 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import { ResourceLogs } from "../../../logs/v1/logs"; +import Long = require("long"); + +export const protobufPackage = "opentelemetry.proto.collector.logs.v1"; + +export interface ExportLogsServiceRequest { + /** + * An array of ResourceLogs. + * For data coming from a single resource this array will typically contain one + * element. Intermediary nodes (such as OpenTelemetry Collector) that receive + * data from multiple origins typically batch the data before forwarding further and + * in that case this array will contain multiple elements. + */ + resource_logs: ResourceLogs[]; +} + +export interface ExportLogsServiceResponse { + /** + * The details of a partially successful export request. + * + * If the request is only partially accepted + * (i.e. when the server accepts only parts of the data and rejects the rest) + * the server MUST initialize the `partial_success` field and MUST + * set the `rejected_` with the number of items it rejected. + * + * Servers MAY also make use of the `partial_success` field to convey + * warnings/suggestions to senders even when the request was fully accepted. + * In such cases, the `rejected_` MUST have a value of `0` and + * the `error_message` MUST be non-empty. + * + * A `partial_success` message with an empty value (rejected_ = 0 and + * `error_message` = "") is equivalent to it not being set/present. Senders + * SHOULD interpret it the same way as in the full success case. + */ + partial_success: ExportLogsPartialSuccess | undefined; +} + +export interface ExportLogsPartialSuccess { + /** + * The number of rejected log records. + * + * A `rejected_` field holding a `0` value indicates that the + * request was fully accepted. + */ + rejected_log_records: string; + /** + * A developer-facing human-readable message in English. It should be used + * either to explain why the server rejected parts of the data during a partial + * success or to convey warnings/suggestions during a full success. The message + * should offer guidance on how users can address such issues. + * + * error_message is an optional field. An error_message with an empty value + * is equivalent to it not being set. + */ + error_message: string; +} + +function createBaseExportLogsServiceRequest(): ExportLogsServiceRequest { + return { resource_logs: [] }; +} + +export const ExportLogsServiceRequest = { + encode(message: ExportLogsServiceRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.resource_logs) { + ResourceLogs.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportLogsServiceRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportLogsServiceRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource_logs.push(ResourceLogs.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportLogsServiceRequest { + return { + resource_logs: globalThis.Array.isArray(object?.resource_logs) + ? object.resource_logs.map((e: any) => ResourceLogs.fromJSON(e)) + : [], + }; + }, + + toJSON(message: ExportLogsServiceRequest): unknown { + const obj: any = {}; + if (message.resource_logs?.length) { + obj.resource_logs = message.resource_logs.map((e) => ResourceLogs.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): ExportLogsServiceRequest { + return ExportLogsServiceRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportLogsServiceRequest { + const message = createBaseExportLogsServiceRequest(); + message.resource_logs = object.resource_logs?.map((e) => ResourceLogs.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseExportLogsServiceResponse(): ExportLogsServiceResponse { + return { partial_success: undefined }; +} + +export const ExportLogsServiceResponse = { + encode(message: ExportLogsServiceResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.partial_success !== undefined) { + ExportLogsPartialSuccess.encode(message.partial_success, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportLogsServiceResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportLogsServiceResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.partial_success = ExportLogsPartialSuccess.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportLogsServiceResponse { + return { + partial_success: isSet(object.partial_success) + ? ExportLogsPartialSuccess.fromJSON(object.partial_success) + : undefined, + }; + }, + + toJSON(message: ExportLogsServiceResponse): unknown { + const obj: any = {}; + if (message.partial_success !== undefined) { + obj.partial_success = ExportLogsPartialSuccess.toJSON(message.partial_success); + } + return obj; + }, + + create, I>>(base?: I): ExportLogsServiceResponse { + return ExportLogsServiceResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportLogsServiceResponse { + const message = createBaseExportLogsServiceResponse(); + message.partial_success = (object.partial_success !== undefined && object.partial_success !== null) + ? ExportLogsPartialSuccess.fromPartial(object.partial_success) + : undefined; + return message; + }, +}; + +function createBaseExportLogsPartialSuccess(): ExportLogsPartialSuccess { + return { rejected_log_records: "0", error_message: "" }; +} + +export const ExportLogsPartialSuccess = { + encode(message: ExportLogsPartialSuccess, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.rejected_log_records !== "0") { + writer.uint32(8).int64(message.rejected_log_records); + } + if (message.error_message !== "") { + writer.uint32(18).string(message.error_message); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportLogsPartialSuccess { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportLogsPartialSuccess(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.rejected_log_records = longToString(reader.int64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.error_message = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportLogsPartialSuccess { + return { + rejected_log_records: isSet(object.rejected_log_records) ? globalThis.String(object.rejected_log_records) : "0", + error_message: isSet(object.error_message) ? globalThis.String(object.error_message) : "", + }; + }, + + toJSON(message: ExportLogsPartialSuccess): unknown { + const obj: any = {}; + if (message.rejected_log_records !== "0") { + obj.rejected_log_records = message.rejected_log_records; + } + if (message.error_message !== "") { + obj.error_message = message.error_message; + } + return obj; + }, + + create, I>>(base?: I): ExportLogsPartialSuccess { + return ExportLogsPartialSuccess.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportLogsPartialSuccess { + const message = createBaseExportLogsPartialSuccess(); + message.rejected_log_records = object.rejected_log_records ?? "0"; + message.error_message = object.error_message ?? ""; + return message; + }, +}; + +/** + * Service that can be used to push logs between one Application instrumented with + * OpenTelemetry and an collector, or between an collector and a central collector (in this + * case logs are sent/received to/from multiple Applications). + */ +export interface LogsService { + /** + * For performance reasons, it is recommended to keep this RPC + * alive for the entire life of the application. + */ + Export(request: ExportLogsServiceRequest): Promise; +} + +export const LogsServiceServiceName = "opentelemetry.proto.collector.logs.v1.LogsService"; +export class LogsServiceClientImpl implements LogsService { + private readonly rpc: Rpc; + private readonly service: string; + constructor(rpc: Rpc, opts?: { service?: string }) { + this.service = opts?.service || LogsServiceServiceName; + this.rpc = rpc; + this.Export = this.Export.bind(this); + } + Export(request: ExportLogsServiceRequest): Promise { + const data = ExportLogsServiceRequest.encode(request).finish(); + const promise = this.rpc.request(this.service, "Export", data); + return promise.then((data) => ExportLogsServiceResponse.decode(_m0.Reader.create(data))); + } +} + +interface Rpc { + request(service: string, method: string, data: Uint8Array): Promise; +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToString(long: Long) { + return long.toString(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/types/opentelemetry/proto/collector/metrics/v1/metrics_service.ts b/test/collector/types/opentelemetry/proto/collector/metrics/v1/metrics_service.ts new file mode 100644 index 0000000..28099cb --- /dev/null +++ b/test/collector/types/opentelemetry/proto/collector/metrics/v1/metrics_service.ts @@ -0,0 +1,314 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import { ResourceMetrics } from "../../../metrics/v1/metrics"; +import Long = require("long"); + +export const protobufPackage = "opentelemetry.proto.collector.metrics.v1"; + +export interface ExportMetricsServiceRequest { + /** + * An array of ResourceMetrics. + * For data coming from a single resource this array will typically contain one + * element. Intermediary nodes (such as OpenTelemetry Collector) that receive + * data from multiple origins typically batch the data before forwarding further and + * in that case this array will contain multiple elements. + */ + resource_metrics: ResourceMetrics[]; +} + +export interface ExportMetricsServiceResponse { + /** + * The details of a partially successful export request. + * + * If the request is only partially accepted + * (i.e. when the server accepts only parts of the data and rejects the rest) + * the server MUST initialize the `partial_success` field and MUST + * set the `rejected_` with the number of items it rejected. + * + * Servers MAY also make use of the `partial_success` field to convey + * warnings/suggestions to senders even when the request was fully accepted. + * In such cases, the `rejected_` MUST have a value of `0` and + * the `error_message` MUST be non-empty. + * + * A `partial_success` message with an empty value (rejected_ = 0 and + * `error_message` = "") is equivalent to it not being set/present. Senders + * SHOULD interpret it the same way as in the full success case. + */ + partial_success: ExportMetricsPartialSuccess | undefined; +} + +export interface ExportMetricsPartialSuccess { + /** + * The number of rejected data points. + * + * A `rejected_` field holding a `0` value indicates that the + * request was fully accepted. + */ + rejected_data_points: string; + /** + * A developer-facing human-readable message in English. It should be used + * either to explain why the server rejected parts of the data during a partial + * success or to convey warnings/suggestions during a full success. The message + * should offer guidance on how users can address such issues. + * + * error_message is an optional field. An error_message with an empty value + * is equivalent to it not being set. + */ + error_message: string; +} + +function createBaseExportMetricsServiceRequest(): ExportMetricsServiceRequest { + return { resource_metrics: [] }; +} + +export const ExportMetricsServiceRequest = { + encode(message: ExportMetricsServiceRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.resource_metrics) { + ResourceMetrics.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportMetricsServiceRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportMetricsServiceRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource_metrics.push(ResourceMetrics.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportMetricsServiceRequest { + return { + resource_metrics: globalThis.Array.isArray(object?.resource_metrics) + ? object.resource_metrics.map((e: any) => ResourceMetrics.fromJSON(e)) + : [], + }; + }, + + toJSON(message: ExportMetricsServiceRequest): unknown { + const obj: any = {}; + if (message.resource_metrics?.length) { + obj.resource_metrics = message.resource_metrics.map((e) => ResourceMetrics.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): ExportMetricsServiceRequest { + return ExportMetricsServiceRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportMetricsServiceRequest { + const message = createBaseExportMetricsServiceRequest(); + message.resource_metrics = object.resource_metrics?.map((e) => ResourceMetrics.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseExportMetricsServiceResponse(): ExportMetricsServiceResponse { + return { partial_success: undefined }; +} + +export const ExportMetricsServiceResponse = { + encode(message: ExportMetricsServiceResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.partial_success !== undefined) { + ExportMetricsPartialSuccess.encode(message.partial_success, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportMetricsServiceResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportMetricsServiceResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.partial_success = ExportMetricsPartialSuccess.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportMetricsServiceResponse { + return { + partial_success: isSet(object.partial_success) + ? ExportMetricsPartialSuccess.fromJSON(object.partial_success) + : undefined, + }; + }, + + toJSON(message: ExportMetricsServiceResponse): unknown { + const obj: any = {}; + if (message.partial_success !== undefined) { + obj.partial_success = ExportMetricsPartialSuccess.toJSON(message.partial_success); + } + return obj; + }, + + create, I>>(base?: I): ExportMetricsServiceResponse { + return ExportMetricsServiceResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportMetricsServiceResponse { + const message = createBaseExportMetricsServiceResponse(); + message.partial_success = (object.partial_success !== undefined && object.partial_success !== null) + ? ExportMetricsPartialSuccess.fromPartial(object.partial_success) + : undefined; + return message; + }, +}; + +function createBaseExportMetricsPartialSuccess(): ExportMetricsPartialSuccess { + return { rejected_data_points: "0", error_message: "" }; +} + +export const ExportMetricsPartialSuccess = { + encode(message: ExportMetricsPartialSuccess, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.rejected_data_points !== "0") { + writer.uint32(8).int64(message.rejected_data_points); + } + if (message.error_message !== "") { + writer.uint32(18).string(message.error_message); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportMetricsPartialSuccess { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportMetricsPartialSuccess(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.rejected_data_points = longToString(reader.int64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.error_message = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportMetricsPartialSuccess { + return { + rejected_data_points: isSet(object.rejected_data_points) ? globalThis.String(object.rejected_data_points) : "0", + error_message: isSet(object.error_message) ? globalThis.String(object.error_message) : "", + }; + }, + + toJSON(message: ExportMetricsPartialSuccess): unknown { + const obj: any = {}; + if (message.rejected_data_points !== "0") { + obj.rejected_data_points = message.rejected_data_points; + } + if (message.error_message !== "") { + obj.error_message = message.error_message; + } + return obj; + }, + + create, I>>(base?: I): ExportMetricsPartialSuccess { + return ExportMetricsPartialSuccess.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportMetricsPartialSuccess { + const message = createBaseExportMetricsPartialSuccess(); + message.rejected_data_points = object.rejected_data_points ?? "0"; + message.error_message = object.error_message ?? ""; + return message; + }, +}; + +/** + * Service that can be used to push metrics between one Application + * instrumented with OpenTelemetry and a collector, or between a collector and a + * central collector. + */ +export interface MetricsService { + /** + * For performance reasons, it is recommended to keep this RPC + * alive for the entire life of the application. + */ + Export(request: ExportMetricsServiceRequest): Promise; +} + +export const MetricsServiceServiceName = "opentelemetry.proto.collector.metrics.v1.MetricsService"; +export class MetricsServiceClientImpl implements MetricsService { + private readonly rpc: Rpc; + private readonly service: string; + constructor(rpc: Rpc, opts?: { service?: string }) { + this.service = opts?.service || MetricsServiceServiceName; + this.rpc = rpc; + this.Export = this.Export.bind(this); + } + Export(request: ExportMetricsServiceRequest): Promise { + const data = ExportMetricsServiceRequest.encode(request).finish(); + const promise = this.rpc.request(this.service, "Export", data); + return promise.then((data) => ExportMetricsServiceResponse.decode(_m0.Reader.create(data))); + } +} + +interface Rpc { + request(service: string, method: string, data: Uint8Array): Promise; +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToString(long: Long) { + return long.toString(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/types/opentelemetry/proto/collector/trace/v1/trace_service.ts b/test/collector/types/opentelemetry/proto/collector/trace/v1/trace_service.ts new file mode 100644 index 0000000..1a1f2e6 --- /dev/null +++ b/test/collector/types/opentelemetry/proto/collector/trace/v1/trace_service.ts @@ -0,0 +1,314 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import { ResourceSpans } from "../../../trace/v1/trace"; +import Long = require("long"); + +export const protobufPackage = "opentelemetry.proto.collector.trace.v1"; + +export interface ExportTraceServiceRequest { + /** + * An array of ResourceSpans. + * For data coming from a single resource this array will typically contain one + * element. Intermediary nodes (such as OpenTelemetry Collector) that receive + * data from multiple origins typically batch the data before forwarding further and + * in that case this array will contain multiple elements. + */ + resource_spans: ResourceSpans[]; +} + +export interface ExportTraceServiceResponse { + /** + * The details of a partially successful export request. + * + * If the request is only partially accepted + * (i.e. when the server accepts only parts of the data and rejects the rest) + * the server MUST initialize the `partial_success` field and MUST + * set the `rejected_` with the number of items it rejected. + * + * Servers MAY also make use of the `partial_success` field to convey + * warnings/suggestions to senders even when the request was fully accepted. + * In such cases, the `rejected_` MUST have a value of `0` and + * the `error_message` MUST be non-empty. + * + * A `partial_success` message with an empty value (rejected_ = 0 and + * `error_message` = "") is equivalent to it not being set/present. Senders + * SHOULD interpret it the same way as in the full success case. + */ + partial_success: ExportTracePartialSuccess | undefined; +} + +export interface ExportTracePartialSuccess { + /** + * The number of rejected spans. + * + * A `rejected_` field holding a `0` value indicates that the + * request was fully accepted. + */ + rejected_spans: string; + /** + * A developer-facing human-readable message in English. It should be used + * either to explain why the server rejected parts of the data during a partial + * success or to convey warnings/suggestions during a full success. The message + * should offer guidance on how users can address such issues. + * + * error_message is an optional field. An error_message with an empty value + * is equivalent to it not being set. + */ + error_message: string; +} + +function createBaseExportTraceServiceRequest(): ExportTraceServiceRequest { + return { resource_spans: [] }; +} + +export const ExportTraceServiceRequest = { + encode(message: ExportTraceServiceRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.resource_spans) { + ResourceSpans.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportTraceServiceRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportTraceServiceRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource_spans.push(ResourceSpans.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportTraceServiceRequest { + return { + resource_spans: globalThis.Array.isArray(object?.resource_spans) + ? object.resource_spans.map((e: any) => ResourceSpans.fromJSON(e)) + : [], + }; + }, + + toJSON(message: ExportTraceServiceRequest): unknown { + const obj: any = {}; + if (message.resource_spans?.length) { + obj.resource_spans = message.resource_spans.map((e) => ResourceSpans.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): ExportTraceServiceRequest { + return ExportTraceServiceRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportTraceServiceRequest { + const message = createBaseExportTraceServiceRequest(); + message.resource_spans = object.resource_spans?.map((e) => ResourceSpans.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseExportTraceServiceResponse(): ExportTraceServiceResponse { + return { partial_success: undefined }; +} + +export const ExportTraceServiceResponse = { + encode(message: ExportTraceServiceResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.partial_success !== undefined) { + ExportTracePartialSuccess.encode(message.partial_success, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportTraceServiceResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportTraceServiceResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.partial_success = ExportTracePartialSuccess.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportTraceServiceResponse { + return { + partial_success: isSet(object.partial_success) + ? ExportTracePartialSuccess.fromJSON(object.partial_success) + : undefined, + }; + }, + + toJSON(message: ExportTraceServiceResponse): unknown { + const obj: any = {}; + if (message.partial_success !== undefined) { + obj.partial_success = ExportTracePartialSuccess.toJSON(message.partial_success); + } + return obj; + }, + + create, I>>(base?: I): ExportTraceServiceResponse { + return ExportTraceServiceResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportTraceServiceResponse { + const message = createBaseExportTraceServiceResponse(); + message.partial_success = (object.partial_success !== undefined && object.partial_success !== null) + ? ExportTracePartialSuccess.fromPartial(object.partial_success) + : undefined; + return message; + }, +}; + +function createBaseExportTracePartialSuccess(): ExportTracePartialSuccess { + return { rejected_spans: "0", error_message: "" }; +} + +export const ExportTracePartialSuccess = { + encode(message: ExportTracePartialSuccess, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.rejected_spans !== "0") { + writer.uint32(8).int64(message.rejected_spans); + } + if (message.error_message !== "") { + writer.uint32(18).string(message.error_message); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExportTracePartialSuccess { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExportTracePartialSuccess(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.rejected_spans = longToString(reader.int64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.error_message = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExportTracePartialSuccess { + return { + rejected_spans: isSet(object.rejected_spans) ? globalThis.String(object.rejected_spans) : "0", + error_message: isSet(object.error_message) ? globalThis.String(object.error_message) : "", + }; + }, + + toJSON(message: ExportTracePartialSuccess): unknown { + const obj: any = {}; + if (message.rejected_spans !== "0") { + obj.rejected_spans = message.rejected_spans; + } + if (message.error_message !== "") { + obj.error_message = message.error_message; + } + return obj; + }, + + create, I>>(base?: I): ExportTracePartialSuccess { + return ExportTracePartialSuccess.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExportTracePartialSuccess { + const message = createBaseExportTracePartialSuccess(); + message.rejected_spans = object.rejected_spans ?? "0"; + message.error_message = object.error_message ?? ""; + return message; + }, +}; + +/** + * Service that can be used to push spans between one Application instrumented with + * OpenTelemetry and a collector, or between a collector and a central collector (in this + * case spans are sent/received to/from multiple Applications). + */ +export interface TraceService { + /** + * For performance reasons, it is recommended to keep this RPC + * alive for the entire life of the application. + */ + Export(request: ExportTraceServiceRequest): Promise; +} + +export const TraceServiceServiceName = "opentelemetry.proto.collector.trace.v1.TraceService"; +export class TraceServiceClientImpl implements TraceService { + private readonly rpc: Rpc; + private readonly service: string; + constructor(rpc: Rpc, opts?: { service?: string }) { + this.service = opts?.service || TraceServiceServiceName; + this.rpc = rpc; + this.Export = this.Export.bind(this); + } + Export(request: ExportTraceServiceRequest): Promise { + const data = ExportTraceServiceRequest.encode(request).finish(); + const promise = this.rpc.request(this.service, "Export", data); + return promise.then((data) => ExportTraceServiceResponse.decode(_m0.Reader.create(data))); + } +} + +interface Rpc { + request(service: string, method: string, data: Uint8Array): Promise; +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToString(long: Long) { + return long.toString(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/types/opentelemetry/proto/common/v1/common.ts b/test/collector/types/opentelemetry/proto/common/v1/common.ts new file mode 100644 index 0000000..b83979a --- /dev/null +++ b/test/collector/types/opentelemetry/proto/common/v1/common.ts @@ -0,0 +1,585 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import Long = require("long"); + +export const protobufPackage = "opentelemetry.proto.common.v1"; + +/** + * AnyValue is used to represent any type of attribute value. AnyValue may contain a + * primitive value such as a string or integer or it may contain an arbitrary nested + * object containing arrays, key-value lists and primitives. + */ +export interface AnyValue { + string_value?: string | undefined; + bool_value?: boolean | undefined; + int_value?: string | undefined; + double_value?: number | undefined; + array_value?: ArrayValue | undefined; + kvlist_value?: KeyValueList | undefined; + bytes_value?: Uint8Array | undefined; +} + +/** + * ArrayValue is a list of AnyValue messages. We need ArrayValue as a message + * since oneof in AnyValue does not allow repeated fields. + */ +export interface ArrayValue { + /** Array of values. The array may be empty (contain 0 elements). */ + values: AnyValue[]; +} + +/** + * KeyValueList is a list of KeyValue messages. We need KeyValueList as a message + * since `oneof` in AnyValue does not allow repeated fields. Everywhere else where we need + * a list of KeyValue messages (e.g. in Span) we use `repeated KeyValue` directly to + * avoid unnecessary extra wrapping (which slows down the protocol). The 2 approaches + * are semantically equivalent. + */ +export interface KeyValueList { + /** + * A collection of key/value pairs of key-value pairs. The list may be empty (may + * contain 0 elements). + * The keys MUST be unique (it is not allowed to have more than one + * value with the same key). + */ + values: KeyValue[]; +} + +/** + * KeyValue is a key-value pair that is used to store Span attributes, Link + * attributes, etc. + */ +export interface KeyValue { + key: string; + value: AnyValue | undefined; +} + +/** + * InstrumentationScope is a message representing the instrumentation scope information + * such as the fully qualified name and version. + */ +export interface InstrumentationScope { + /** An empty instrumentation scope name means the name is unknown. */ + name: string; + version: string; + /** + * Additional attributes that describe the scope. [Optional]. + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + dropped_attributes_count: number; +} + +function createBaseAnyValue(): AnyValue { + return { + string_value: undefined, + bool_value: undefined, + int_value: undefined, + double_value: undefined, + array_value: undefined, + kvlist_value: undefined, + bytes_value: undefined, + }; +} + +export const AnyValue = { + encode(message: AnyValue, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.string_value !== undefined) { + writer.uint32(10).string(message.string_value); + } + if (message.bool_value !== undefined) { + writer.uint32(16).bool(message.bool_value); + } + if (message.int_value !== undefined) { + writer.uint32(24).int64(message.int_value); + } + if (message.double_value !== undefined) { + writer.uint32(33).double(message.double_value); + } + if (message.array_value !== undefined) { + ArrayValue.encode(message.array_value, writer.uint32(42).fork()).ldelim(); + } + if (message.kvlist_value !== undefined) { + KeyValueList.encode(message.kvlist_value, writer.uint32(50).fork()).ldelim(); + } + if (message.bytes_value !== undefined) { + writer.uint32(58).bytes(message.bytes_value); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): AnyValue { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAnyValue(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.string_value = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.bool_value = reader.bool(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.int_value = longToString(reader.int64() as Long); + continue; + case 4: + if (tag !== 33) { + break; + } + + message.double_value = reader.double(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.array_value = ArrayValue.decode(reader, reader.uint32()); + continue; + case 6: + if (tag !== 50) { + break; + } + + message.kvlist_value = KeyValueList.decode(reader, reader.uint32()); + continue; + case 7: + if (tag !== 58) { + break; + } + + message.bytes_value = reader.bytes(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): AnyValue { + return { + string_value: isSet(object.string_value) ? globalThis.String(object.string_value) : undefined, + bool_value: isSet(object.bool_value) ? globalThis.Boolean(object.bool_value) : undefined, + int_value: isSet(object.int_value) ? globalThis.String(object.int_value) : undefined, + double_value: isSet(object.double_value) ? globalThis.Number(object.double_value) : undefined, + array_value: isSet(object.array_value) ? ArrayValue.fromJSON(object.array_value) : undefined, + kvlist_value: isSet(object.kvlist_value) ? KeyValueList.fromJSON(object.kvlist_value) : undefined, + bytes_value: isSet(object.bytes_value) ? bytesFromBase64(object.bytes_value) : undefined, + }; + }, + + toJSON(message: AnyValue): unknown { + const obj: any = {}; + if (message.string_value !== undefined) { + obj.string_value = message.string_value; + } + if (message.bool_value !== undefined) { + obj.bool_value = message.bool_value; + } + if (message.int_value !== undefined) { + obj.int_value = message.int_value; + } + if (message.double_value !== undefined) { + obj.double_value = message.double_value; + } + if (message.array_value !== undefined) { + obj.array_value = ArrayValue.toJSON(message.array_value); + } + if (message.kvlist_value !== undefined) { + obj.kvlist_value = KeyValueList.toJSON(message.kvlist_value); + } + if (message.bytes_value !== undefined) { + obj.bytes_value = base64FromBytes(message.bytes_value); + } + return obj; + }, + + create, I>>(base?: I): AnyValue { + return AnyValue.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AnyValue { + const message = createBaseAnyValue(); + message.string_value = object.string_value ?? undefined; + message.bool_value = object.bool_value ?? undefined; + message.int_value = object.int_value ?? undefined; + message.double_value = object.double_value ?? undefined; + message.array_value = (object.array_value !== undefined && object.array_value !== null) + ? ArrayValue.fromPartial(object.array_value) + : undefined; + message.kvlist_value = (object.kvlist_value !== undefined && object.kvlist_value !== null) + ? KeyValueList.fromPartial(object.kvlist_value) + : undefined; + message.bytes_value = object.bytes_value ?? undefined; + return message; + }, +}; + +function createBaseArrayValue(): ArrayValue { + return { values: [] }; +} + +export const ArrayValue = { + encode(message: ArrayValue, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.values) { + AnyValue.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ArrayValue { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseArrayValue(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.values.push(AnyValue.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ArrayValue { + return { + values: globalThis.Array.isArray(object?.values) ? object.values.map((e: any) => AnyValue.fromJSON(e)) : [], + }; + }, + + toJSON(message: ArrayValue): unknown { + const obj: any = {}; + if (message.values?.length) { + obj.values = message.values.map((e) => AnyValue.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): ArrayValue { + return ArrayValue.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ArrayValue { + const message = createBaseArrayValue(); + message.values = object.values?.map((e) => AnyValue.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseKeyValueList(): KeyValueList { + return { values: [] }; +} + +export const KeyValueList = { + encode(message: KeyValueList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.values) { + KeyValue.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): KeyValueList { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseKeyValueList(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.values.push(KeyValue.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): KeyValueList { + return { + values: globalThis.Array.isArray(object?.values) ? object.values.map((e: any) => KeyValue.fromJSON(e)) : [], + }; + }, + + toJSON(message: KeyValueList): unknown { + const obj: any = {}; + if (message.values?.length) { + obj.values = message.values.map((e) => KeyValue.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): KeyValueList { + return KeyValueList.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): KeyValueList { + const message = createBaseKeyValueList(); + message.values = object.values?.map((e) => KeyValue.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseKeyValue(): KeyValue { + return { key: "", value: undefined }; +} + +export const KeyValue = { + encode(message: KeyValue, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + AnyValue.encode(message.value, writer.uint32(18).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): KeyValue { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseKeyValue(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.value = AnyValue.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): KeyValue { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? AnyValue.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: KeyValue): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = AnyValue.toJSON(message.value); + } + return obj; + }, + + create, I>>(base?: I): KeyValue { + return KeyValue.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): KeyValue { + const message = createBaseKeyValue(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? AnyValue.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseInstrumentationScope(): InstrumentationScope { + return { name: "", version: "", attributes: [], dropped_attributes_count: 0 }; +} + +export const InstrumentationScope = { + encode(message: InstrumentationScope, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.version !== "") { + writer.uint32(18).string(message.version); + } + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(26).fork()).ldelim(); + } + if (message.dropped_attributes_count !== 0) { + writer.uint32(32).uint32(message.dropped_attributes_count); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): InstrumentationScope { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseInstrumentationScope(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.version = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.dropped_attributes_count = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): InstrumentationScope { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + version: isSet(object.version) ? globalThis.String(object.version) : "", + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + dropped_attributes_count: isSet(object.dropped_attributes_count) + ? globalThis.Number(object.dropped_attributes_count) + : 0, + }; + }, + + toJSON(message: InstrumentationScope): unknown { + const obj: any = {}; + if (message.name !== "") { + obj.name = message.name; + } + if (message.version !== "") { + obj.version = message.version; + } + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.dropped_attributes_count !== 0) { + obj.dropped_attributes_count = Math.round(message.dropped_attributes_count); + } + return obj; + }, + + create, I>>(base?: I): InstrumentationScope { + return InstrumentationScope.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): InstrumentationScope { + const message = createBaseInstrumentationScope(); + message.name = object.name ?? ""; + message.version = object.version ?? ""; + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.dropped_attributes_count = object.dropped_attributes_count ?? 0; + return message; + }, +}; + +function bytesFromBase64(b64: string): Uint8Array { + if ((globalThis as any).Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if ((globalThis as any).Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToString(long: Long) { + return long.toString(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/types/opentelemetry/proto/logs/v1/logs.ts b/test/collector/types/opentelemetry/proto/logs/v1/logs.ts new file mode 100644 index 0000000..0b69875 --- /dev/null +++ b/test/collector/types/opentelemetry/proto/logs/v1/logs.ts @@ -0,0 +1,893 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import { AnyValue, InstrumentationScope, KeyValue } from "../../common/v1/common"; +import { Resource } from "../../resource/v1/resource"; +import Long = require("long"); + +export const protobufPackage = "opentelemetry.proto.logs.v1"; + +/** Possible values for LogRecord.SeverityNumber. */ +export enum SeverityNumber { + /** SEVERITY_NUMBER_UNSPECIFIED - UNSPECIFIED is the default SeverityNumber, it MUST NOT be used. */ + SEVERITY_NUMBER_UNSPECIFIED = 0, + SEVERITY_NUMBER_TRACE = 1, + SEVERITY_NUMBER_TRACE2 = 2, + SEVERITY_NUMBER_TRACE3 = 3, + SEVERITY_NUMBER_TRACE4 = 4, + SEVERITY_NUMBER_DEBUG = 5, + SEVERITY_NUMBER_DEBUG2 = 6, + SEVERITY_NUMBER_DEBUG3 = 7, + SEVERITY_NUMBER_DEBUG4 = 8, + SEVERITY_NUMBER_INFO = 9, + SEVERITY_NUMBER_INFO2 = 10, + SEVERITY_NUMBER_INFO3 = 11, + SEVERITY_NUMBER_INFO4 = 12, + SEVERITY_NUMBER_WARN = 13, + SEVERITY_NUMBER_WARN2 = 14, + SEVERITY_NUMBER_WARN3 = 15, + SEVERITY_NUMBER_WARN4 = 16, + SEVERITY_NUMBER_ERROR = 17, + SEVERITY_NUMBER_ERROR2 = 18, + SEVERITY_NUMBER_ERROR3 = 19, + SEVERITY_NUMBER_ERROR4 = 20, + SEVERITY_NUMBER_FATAL = 21, + SEVERITY_NUMBER_FATAL2 = 22, + SEVERITY_NUMBER_FATAL3 = 23, + SEVERITY_NUMBER_FATAL4 = 24, + UNRECOGNIZED = -1, +} + +export function severityNumberFromJSON(object: any): SeverityNumber { + switch (object) { + case 0: + case "SEVERITY_NUMBER_UNSPECIFIED": + return SeverityNumber.SEVERITY_NUMBER_UNSPECIFIED; + case 1: + case "SEVERITY_NUMBER_TRACE": + return SeverityNumber.SEVERITY_NUMBER_TRACE; + case 2: + case "SEVERITY_NUMBER_TRACE2": + return SeverityNumber.SEVERITY_NUMBER_TRACE2; + case 3: + case "SEVERITY_NUMBER_TRACE3": + return SeverityNumber.SEVERITY_NUMBER_TRACE3; + case 4: + case "SEVERITY_NUMBER_TRACE4": + return SeverityNumber.SEVERITY_NUMBER_TRACE4; + case 5: + case "SEVERITY_NUMBER_DEBUG": + return SeverityNumber.SEVERITY_NUMBER_DEBUG; + case 6: + case "SEVERITY_NUMBER_DEBUG2": + return SeverityNumber.SEVERITY_NUMBER_DEBUG2; + case 7: + case "SEVERITY_NUMBER_DEBUG3": + return SeverityNumber.SEVERITY_NUMBER_DEBUG3; + case 8: + case "SEVERITY_NUMBER_DEBUG4": + return SeverityNumber.SEVERITY_NUMBER_DEBUG4; + case 9: + case "SEVERITY_NUMBER_INFO": + return SeverityNumber.SEVERITY_NUMBER_INFO; + case 10: + case "SEVERITY_NUMBER_INFO2": + return SeverityNumber.SEVERITY_NUMBER_INFO2; + case 11: + case "SEVERITY_NUMBER_INFO3": + return SeverityNumber.SEVERITY_NUMBER_INFO3; + case 12: + case "SEVERITY_NUMBER_INFO4": + return SeverityNumber.SEVERITY_NUMBER_INFO4; + case 13: + case "SEVERITY_NUMBER_WARN": + return SeverityNumber.SEVERITY_NUMBER_WARN; + case 14: + case "SEVERITY_NUMBER_WARN2": + return SeverityNumber.SEVERITY_NUMBER_WARN2; + case 15: + case "SEVERITY_NUMBER_WARN3": + return SeverityNumber.SEVERITY_NUMBER_WARN3; + case 16: + case "SEVERITY_NUMBER_WARN4": + return SeverityNumber.SEVERITY_NUMBER_WARN4; + case 17: + case "SEVERITY_NUMBER_ERROR": + return SeverityNumber.SEVERITY_NUMBER_ERROR; + case 18: + case "SEVERITY_NUMBER_ERROR2": + return SeverityNumber.SEVERITY_NUMBER_ERROR2; + case 19: + case "SEVERITY_NUMBER_ERROR3": + return SeverityNumber.SEVERITY_NUMBER_ERROR3; + case 20: + case "SEVERITY_NUMBER_ERROR4": + return SeverityNumber.SEVERITY_NUMBER_ERROR4; + case 21: + case "SEVERITY_NUMBER_FATAL": + return SeverityNumber.SEVERITY_NUMBER_FATAL; + case 22: + case "SEVERITY_NUMBER_FATAL2": + return SeverityNumber.SEVERITY_NUMBER_FATAL2; + case 23: + case "SEVERITY_NUMBER_FATAL3": + return SeverityNumber.SEVERITY_NUMBER_FATAL3; + case 24: + case "SEVERITY_NUMBER_FATAL4": + return SeverityNumber.SEVERITY_NUMBER_FATAL4; + case -1: + case "UNRECOGNIZED": + default: + return SeverityNumber.UNRECOGNIZED; + } +} + +export function severityNumberToJSON(object: SeverityNumber): string { + switch (object) { + case SeverityNumber.SEVERITY_NUMBER_UNSPECIFIED: + return "SEVERITY_NUMBER_UNSPECIFIED"; + case SeverityNumber.SEVERITY_NUMBER_TRACE: + return "SEVERITY_NUMBER_TRACE"; + case SeverityNumber.SEVERITY_NUMBER_TRACE2: + return "SEVERITY_NUMBER_TRACE2"; + case SeverityNumber.SEVERITY_NUMBER_TRACE3: + return "SEVERITY_NUMBER_TRACE3"; + case SeverityNumber.SEVERITY_NUMBER_TRACE4: + return "SEVERITY_NUMBER_TRACE4"; + case SeverityNumber.SEVERITY_NUMBER_DEBUG: + return "SEVERITY_NUMBER_DEBUG"; + case SeverityNumber.SEVERITY_NUMBER_DEBUG2: + return "SEVERITY_NUMBER_DEBUG2"; + case SeverityNumber.SEVERITY_NUMBER_DEBUG3: + return "SEVERITY_NUMBER_DEBUG3"; + case SeverityNumber.SEVERITY_NUMBER_DEBUG4: + return "SEVERITY_NUMBER_DEBUG4"; + case SeverityNumber.SEVERITY_NUMBER_INFO: + return "SEVERITY_NUMBER_INFO"; + case SeverityNumber.SEVERITY_NUMBER_INFO2: + return "SEVERITY_NUMBER_INFO2"; + case SeverityNumber.SEVERITY_NUMBER_INFO3: + return "SEVERITY_NUMBER_INFO3"; + case SeverityNumber.SEVERITY_NUMBER_INFO4: + return "SEVERITY_NUMBER_INFO4"; + case SeverityNumber.SEVERITY_NUMBER_WARN: + return "SEVERITY_NUMBER_WARN"; + case SeverityNumber.SEVERITY_NUMBER_WARN2: + return "SEVERITY_NUMBER_WARN2"; + case SeverityNumber.SEVERITY_NUMBER_WARN3: + return "SEVERITY_NUMBER_WARN3"; + case SeverityNumber.SEVERITY_NUMBER_WARN4: + return "SEVERITY_NUMBER_WARN4"; + case SeverityNumber.SEVERITY_NUMBER_ERROR: + return "SEVERITY_NUMBER_ERROR"; + case SeverityNumber.SEVERITY_NUMBER_ERROR2: + return "SEVERITY_NUMBER_ERROR2"; + case SeverityNumber.SEVERITY_NUMBER_ERROR3: + return "SEVERITY_NUMBER_ERROR3"; + case SeverityNumber.SEVERITY_NUMBER_ERROR4: + return "SEVERITY_NUMBER_ERROR4"; + case SeverityNumber.SEVERITY_NUMBER_FATAL: + return "SEVERITY_NUMBER_FATAL"; + case SeverityNumber.SEVERITY_NUMBER_FATAL2: + return "SEVERITY_NUMBER_FATAL2"; + case SeverityNumber.SEVERITY_NUMBER_FATAL3: + return "SEVERITY_NUMBER_FATAL3"; + case SeverityNumber.SEVERITY_NUMBER_FATAL4: + return "SEVERITY_NUMBER_FATAL4"; + case SeverityNumber.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * LogRecordFlags represents constants used to interpret the + * LogRecord.flags field, which is protobuf 'fixed32' type and is to + * be used as bit-fields. Each non-zero value defined in this enum is + * a bit-mask. To extract the bit-field, for example, use an + * expression like: + * + * (logRecord.flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK) + */ +export enum LogRecordFlags { + /** + * LOG_RECORD_FLAGS_DO_NOT_USE - The zero value for the enum. Should not be used for comparisons. + * Instead use bitwise "and" with the appropriate mask as shown above. + */ + LOG_RECORD_FLAGS_DO_NOT_USE = 0, + /** LOG_RECORD_FLAGS_TRACE_FLAGS_MASK - Bits 0-7 are used for trace flags. */ + LOG_RECORD_FLAGS_TRACE_FLAGS_MASK = 255, + UNRECOGNIZED = -1, +} + +export function logRecordFlagsFromJSON(object: any): LogRecordFlags { + switch (object) { + case 0: + case "LOG_RECORD_FLAGS_DO_NOT_USE": + return LogRecordFlags.LOG_RECORD_FLAGS_DO_NOT_USE; + case 255: + case "LOG_RECORD_FLAGS_TRACE_FLAGS_MASK": + return LogRecordFlags.LOG_RECORD_FLAGS_TRACE_FLAGS_MASK; + case -1: + case "UNRECOGNIZED": + default: + return LogRecordFlags.UNRECOGNIZED; + } +} + +export function logRecordFlagsToJSON(object: LogRecordFlags): string { + switch (object) { + case LogRecordFlags.LOG_RECORD_FLAGS_DO_NOT_USE: + return "LOG_RECORD_FLAGS_DO_NOT_USE"; + case LogRecordFlags.LOG_RECORD_FLAGS_TRACE_FLAGS_MASK: + return "LOG_RECORD_FLAGS_TRACE_FLAGS_MASK"; + case LogRecordFlags.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * LogsData represents the logs data that can be stored in a persistent storage, + * OR can be embedded by other protocols that transfer OTLP logs data but do not + * implement the OTLP protocol. + * + * The main difference between this message and collector protocol is that + * in this message there will not be any "control" or "metadata" specific to + * OTLP protocol. + * + * When new fields are added into this message, the OTLP request MUST be updated + * as well. + */ +export interface LogsData { + /** + * An array of ResourceLogs. + * For data coming from a single resource this array will typically contain + * one element. Intermediary nodes that receive data from multiple origins + * typically batch the data before forwarding further and in that case this + * array will contain multiple elements. + */ + resource_logs: ResourceLogs[]; +} + +/** A collection of ScopeLogs from a Resource. */ +export interface ResourceLogs { + /** + * The resource for the logs in this message. + * If this field is not set then resource info is unknown. + */ + resource: + | Resource + | undefined; + /** A list of ScopeLogs that originate from a resource. */ + scope_logs: ScopeLogs[]; + /** + * The Schema URL, if known. This is the identifier of the Schema that the resource data + * is recorded in. To learn more about Schema URL see + * https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + * This schema_url applies to the data in the "resource" field. It does not apply + * to the data in the "scope_logs" field which have their own schema_url field. + */ + schema_url: string; +} + +/** A collection of Logs produced by a Scope. */ +export interface ScopeLogs { + /** + * The instrumentation scope information for the logs in this message. + * Semantically when InstrumentationScope isn't set, it is equivalent with + * an empty instrumentation scope name (unknown). + */ + scope: + | InstrumentationScope + | undefined; + /** A list of log records. */ + log_records: LogRecord[]; + /** + * The Schema URL, if known. This is the identifier of the Schema that the log data + * is recorded in. To learn more about Schema URL see + * https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + * This schema_url applies to all logs in the "logs" field. + */ + schema_url: string; +} + +/** + * A log record according to OpenTelemetry Log Data Model: + * https://github.com/open-telemetry/oteps/blob/main/text/logs/0097-log-data-model.md + */ +export interface LogRecord { + /** + * time_unix_nano is the time when the event occurred. + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + * Value of 0 indicates unknown or missing timestamp. + */ + time_unix_nano: string; + /** + * Time when the event was observed by the collection system. + * For events that originate in OpenTelemetry (e.g. using OpenTelemetry Logging SDK) + * this timestamp is typically set at the generation time and is equal to Timestamp. + * For events originating externally and collected by OpenTelemetry (e.g. using + * Collector) this is the time when OpenTelemetry's code observed the event measured + * by the clock of the OpenTelemetry code. This field MUST be set once the event is + * observed by OpenTelemetry. + * + * For converting OpenTelemetry log data to formats that support only one timestamp or + * when receiving OpenTelemetry log data by recipients that support only one timestamp + * internally the following logic is recommended: + * - Use time_unix_nano if it is present, otherwise use observed_time_unix_nano. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + * Value of 0 indicates unknown or missing timestamp. + */ + observed_time_unix_nano: string; + /** + * Numerical value of the severity, normalized to values described in Log Data Model. + * [Optional]. + */ + severity_number: SeverityNumber; + /** + * The severity text (also known as log level). The original string representation as + * it is known at the source. [Optional]. + */ + severity_text: string; + /** + * A value containing the body of the log record. Can be for example a human-readable + * string message (including multi-line) describing the event in a free form or it can + * be a structured data composed of arrays and maps of other values. [Optional]. + */ + body: + | AnyValue + | undefined; + /** + * Additional attributes that describe the specific event occurrence. [Optional]. + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + dropped_attributes_count: number; + /** + * Flags, a bit field. 8 least significant bits are the trace flags as + * defined in W3C Trace Context specification. 24 most significant bits are reserved + * and must be set to 0. Readers must not assume that 24 most significant bits + * will be zero and must correctly mask the bits when reading 8-bit trace flag (use + * flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK). [Optional]. + */ + flags: number; + /** + * A unique identifier for a trace. All logs from the same trace share + * the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + * of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + * is zero-length and thus is also invalid). + * + * This field is optional. + * + * The receivers SHOULD assume that the log record is not associated with a + * trace if any of the following is true: + * - the field is not present, + * - the field contains an invalid value. + */ + trace_id: Uint8Array; + /** + * A unique identifier for a span within a trace, assigned when the span + * is created. The ID is an 8-byte array. An ID with all zeroes OR of length + * other than 8 bytes is considered invalid (empty string in OTLP/JSON + * is zero-length and thus is also invalid). + * + * This field is optional. If the sender specifies a valid span_id then it SHOULD also + * specify a valid trace_id. + * + * The receivers SHOULD assume that the log record is not associated with a + * span if any of the following is true: + * - the field is not present, + * - the field contains an invalid value. + */ + span_id: Uint8Array; +} + +function createBaseLogsData(): LogsData { + return { resource_logs: [] }; +} + +export const LogsData = { + encode(message: LogsData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.resource_logs) { + ResourceLogs.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): LogsData { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseLogsData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource_logs.push(ResourceLogs.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): LogsData { + return { + resource_logs: globalThis.Array.isArray(object?.resource_logs) + ? object.resource_logs.map((e: any) => ResourceLogs.fromJSON(e)) + : [], + }; + }, + + toJSON(message: LogsData): unknown { + const obj: any = {}; + if (message.resource_logs?.length) { + obj.resource_logs = message.resource_logs.map((e) => ResourceLogs.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): LogsData { + return LogsData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): LogsData { + const message = createBaseLogsData(); + message.resource_logs = object.resource_logs?.map((e) => ResourceLogs.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseResourceLogs(): ResourceLogs { + return { resource: undefined, scope_logs: [], schema_url: "" }; +} + +export const ResourceLogs = { + encode(message: ResourceLogs, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.resource !== undefined) { + Resource.encode(message.resource, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.scope_logs) { + ScopeLogs.encode(v!, writer.uint32(18).fork()).ldelim(); + } + if (message.schema_url !== "") { + writer.uint32(26).string(message.schema_url); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ResourceLogs { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseResourceLogs(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource = Resource.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.scope_logs.push(ScopeLogs.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.schema_url = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ResourceLogs { + return { + resource: isSet(object.resource) ? Resource.fromJSON(object.resource) : undefined, + scope_logs: globalThis.Array.isArray(object?.scope_logs) + ? object.scope_logs.map((e: any) => ScopeLogs.fromJSON(e)) + : [], + schema_url: isSet(object.schema_url) ? globalThis.String(object.schema_url) : "", + }; + }, + + toJSON(message: ResourceLogs): unknown { + const obj: any = {}; + if (message.resource !== undefined) { + obj.resource = Resource.toJSON(message.resource); + } + if (message.scope_logs?.length) { + obj.scope_logs = message.scope_logs.map((e) => ScopeLogs.toJSON(e)); + } + if (message.schema_url !== "") { + obj.schema_url = message.schema_url; + } + return obj; + }, + + create, I>>(base?: I): ResourceLogs { + return ResourceLogs.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ResourceLogs { + const message = createBaseResourceLogs(); + message.resource = (object.resource !== undefined && object.resource !== null) + ? Resource.fromPartial(object.resource) + : undefined; + message.scope_logs = object.scope_logs?.map((e) => ScopeLogs.fromPartial(e)) || []; + message.schema_url = object.schema_url ?? ""; + return message; + }, +}; + +function createBaseScopeLogs(): ScopeLogs { + return { scope: undefined, log_records: [], schema_url: "" }; +} + +export const ScopeLogs = { + encode(message: ScopeLogs, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.scope !== undefined) { + InstrumentationScope.encode(message.scope, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.log_records) { + LogRecord.encode(v!, writer.uint32(18).fork()).ldelim(); + } + if (message.schema_url !== "") { + writer.uint32(26).string(message.schema_url); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ScopeLogs { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseScopeLogs(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.scope = InstrumentationScope.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.log_records.push(LogRecord.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.schema_url = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ScopeLogs { + return { + scope: isSet(object.scope) ? InstrumentationScope.fromJSON(object.scope) : undefined, + log_records: globalThis.Array.isArray(object?.log_records) + ? object.log_records.map((e: any) => LogRecord.fromJSON(e)) + : [], + schema_url: isSet(object.schema_url) ? globalThis.String(object.schema_url) : "", + }; + }, + + toJSON(message: ScopeLogs): unknown { + const obj: any = {}; + if (message.scope !== undefined) { + obj.scope = InstrumentationScope.toJSON(message.scope); + } + if (message.log_records?.length) { + obj.log_records = message.log_records.map((e) => LogRecord.toJSON(e)); + } + if (message.schema_url !== "") { + obj.schema_url = message.schema_url; + } + return obj; + }, + + create, I>>(base?: I): ScopeLogs { + return ScopeLogs.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ScopeLogs { + const message = createBaseScopeLogs(); + message.scope = (object.scope !== undefined && object.scope !== null) + ? InstrumentationScope.fromPartial(object.scope) + : undefined; + message.log_records = object.log_records?.map((e) => LogRecord.fromPartial(e)) || []; + message.schema_url = object.schema_url ?? ""; + return message; + }, +}; + +function createBaseLogRecord(): LogRecord { + return { + time_unix_nano: "0", + observed_time_unix_nano: "0", + severity_number: 0, + severity_text: "", + body: undefined, + attributes: [], + dropped_attributes_count: 0, + flags: 0, + trace_id: new Uint8Array(0), + span_id: new Uint8Array(0), + }; +} + +export const LogRecord = { + encode(message: LogRecord, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.time_unix_nano !== "0") { + writer.uint32(9).fixed64(message.time_unix_nano); + } + if (message.observed_time_unix_nano !== "0") { + writer.uint32(89).fixed64(message.observed_time_unix_nano); + } + if (message.severity_number !== 0) { + writer.uint32(16).int32(message.severity_number); + } + if (message.severity_text !== "") { + writer.uint32(26).string(message.severity_text); + } + if (message.body !== undefined) { + AnyValue.encode(message.body, writer.uint32(42).fork()).ldelim(); + } + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(50).fork()).ldelim(); + } + if (message.dropped_attributes_count !== 0) { + writer.uint32(56).uint32(message.dropped_attributes_count); + } + if (message.flags !== 0) { + writer.uint32(69).fixed32(message.flags); + } + if (message.trace_id.length !== 0) { + writer.uint32(74).bytes(message.trace_id); + } + if (message.span_id.length !== 0) { + writer.uint32(82).bytes(message.span_id); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): LogRecord { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseLogRecord(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 9) { + break; + } + + message.time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 11: + if (tag !== 89) { + break; + } + + message.observed_time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.severity_number = reader.int32() as any; + continue; + case 3: + if (tag !== 26) { + break; + } + + message.severity_text = reader.string(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.body = AnyValue.decode(reader, reader.uint32()); + continue; + case 6: + if (tag !== 50) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 7: + if (tag !== 56) { + break; + } + + message.dropped_attributes_count = reader.uint32(); + continue; + case 8: + if (tag !== 69) { + break; + } + + message.flags = reader.fixed32(); + continue; + case 9: + if (tag !== 74) { + break; + } + + message.trace_id = reader.bytes(); + continue; + case 10: + if (tag !== 82) { + break; + } + + message.span_id = reader.bytes(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): LogRecord { + return { + time_unix_nano: isSet(object.time_unix_nano) ? globalThis.String(object.time_unix_nano) : "0", + observed_time_unix_nano: isSet(object.observed_time_unix_nano) + ? globalThis.String(object.observed_time_unix_nano) + : "0", + severity_number: isSet(object.severity_number) ? severityNumberFromJSON(object.severity_number) : 0, + severity_text: isSet(object.severity_text) ? globalThis.String(object.severity_text) : "", + body: isSet(object.body) ? AnyValue.fromJSON(object.body) : undefined, + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + dropped_attributes_count: isSet(object.dropped_attributes_count) + ? globalThis.Number(object.dropped_attributes_count) + : 0, + flags: isSet(object.flags) ? globalThis.Number(object.flags) : 0, + trace_id: isSet(object.trace_id) ? bytesFromBase64(object.trace_id) : new Uint8Array(0), + span_id: isSet(object.span_id) ? bytesFromBase64(object.span_id) : new Uint8Array(0), + }; + }, + + toJSON(message: LogRecord): unknown { + const obj: any = {}; + if (message.time_unix_nano !== "0") { + obj.time_unix_nano = message.time_unix_nano; + } + if (message.observed_time_unix_nano !== "0") { + obj.observed_time_unix_nano = message.observed_time_unix_nano; + } + if (message.severity_number !== 0) { + obj.severity_number = severityNumberToJSON(message.severity_number); + } + if (message.severity_text !== "") { + obj.severity_text = message.severity_text; + } + if (message.body !== undefined) { + obj.body = AnyValue.toJSON(message.body); + } + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.dropped_attributes_count !== 0) { + obj.dropped_attributes_count = Math.round(message.dropped_attributes_count); + } + if (message.flags !== 0) { + obj.flags = Math.round(message.flags); + } + if (message.trace_id.length !== 0) { + obj.trace_id = base64FromBytes(message.trace_id); + } + if (message.span_id.length !== 0) { + obj.span_id = base64FromBytes(message.span_id); + } + return obj; + }, + + create, I>>(base?: I): LogRecord { + return LogRecord.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): LogRecord { + const message = createBaseLogRecord(); + message.time_unix_nano = object.time_unix_nano ?? "0"; + message.observed_time_unix_nano = object.observed_time_unix_nano ?? "0"; + message.severity_number = object.severity_number ?? 0; + message.severity_text = object.severity_text ?? ""; + message.body = (object.body !== undefined && object.body !== null) ? AnyValue.fromPartial(object.body) : undefined; + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.dropped_attributes_count = object.dropped_attributes_count ?? 0; + message.flags = object.flags ?? 0; + message.trace_id = object.trace_id ?? new Uint8Array(0); + message.span_id = object.span_id ?? new Uint8Array(0); + return message; + }, +}; + +function bytesFromBase64(b64: string): Uint8Array { + if ((globalThis as any).Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if ((globalThis as any).Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToString(long: Long) { + return long.toString(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/types/opentelemetry/proto/metrics/v1/metrics.ts b/test/collector/types/opentelemetry/proto/metrics/v1/metrics.ts new file mode 100644 index 0000000..f034394 --- /dev/null +++ b/test/collector/types/opentelemetry/proto/metrics/v1/metrics.ts @@ -0,0 +1,2838 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import { InstrumentationScope, KeyValue } from "../../common/v1/common"; +import { Resource } from "../../resource/v1/resource"; +import Long = require("long"); + +export const protobufPackage = "opentelemetry.proto.metrics.v1"; + +/** + * AggregationTemporality defines how a metric aggregator reports aggregated + * values. It describes how those values relate to the time interval over + * which they are aggregated. + */ +export enum AggregationTemporality { + /** AGGREGATION_TEMPORALITY_UNSPECIFIED - UNSPECIFIED is the default AggregationTemporality, it MUST not be used. */ + AGGREGATION_TEMPORALITY_UNSPECIFIED = 0, + /** + * AGGREGATION_TEMPORALITY_DELTA - DELTA is an AggregationTemporality for a metric aggregator which reports + * changes since last report time. Successive metrics contain aggregation of + * values from continuous and non-overlapping intervals. + * + * The values for a DELTA metric are based only on the time interval + * associated with one measurement cycle. There is no dependency on + * previous measurements like is the case for CUMULATIVE metrics. + * + * For example, consider a system measuring the number of requests that + * it receives and reports the sum of these requests every second as a + * DELTA metric: + * + * 1. The system starts receiving at time=t_0. + * 2. A request is received, the system measures 1 request. + * 3. A request is received, the system measures 1 request. + * 4. A request is received, the system measures 1 request. + * 5. The 1 second collection cycle ends. A metric is exported for the + * number of requests received over the interval of time t_0 to + * t_0+1 with a value of 3. + * 6. A request is received, the system measures 1 request. + * 7. A request is received, the system measures 1 request. + * 8. The 1 second collection cycle ends. A metric is exported for the + * number of requests received over the interval of time t_0+1 to + * t_0+2 with a value of 2. + */ + AGGREGATION_TEMPORALITY_DELTA = 1, + /** + * AGGREGATION_TEMPORALITY_CUMULATIVE - CUMULATIVE is an AggregationTemporality for a metric aggregator which + * reports changes since a fixed start time. This means that current values + * of a CUMULATIVE metric depend on all previous measurements since the + * start time. Because of this, the sender is required to retain this state + * in some form. If this state is lost or invalidated, the CUMULATIVE metric + * values MUST be reset and a new fixed start time following the last + * reported measurement time sent MUST be used. + * + * For example, consider a system measuring the number of requests that + * it receives and reports the sum of these requests every second as a + * CUMULATIVE metric: + * + * 1. The system starts receiving at time=t_0. + * 2. A request is received, the system measures 1 request. + * 3. A request is received, the system measures 1 request. + * 4. A request is received, the system measures 1 request. + * 5. The 1 second collection cycle ends. A metric is exported for the + * number of requests received over the interval of time t_0 to + * t_0+1 with a value of 3. + * 6. A request is received, the system measures 1 request. + * 7. A request is received, the system measures 1 request. + * 8. The 1 second collection cycle ends. A metric is exported for the + * number of requests received over the interval of time t_0 to + * t_0+2 with a value of 5. + * 9. The system experiences a fault and loses state. + * 10. The system recovers and resumes receiving at time=t_1. + * 11. A request is received, the system measures 1 request. + * 12. The 1 second collection cycle ends. A metric is exported for the + * number of requests received over the interval of time t_1 to + * t_0+1 with a value of 1. + * + * Note: Even though, when reporting changes since last report time, using + * CUMULATIVE is valid, it is not recommended. This may cause problems for + * systems that do not use start_time to determine when the aggregation + * value was reset (e.g. Prometheus). + */ + AGGREGATION_TEMPORALITY_CUMULATIVE = 2, + UNRECOGNIZED = -1, +} + +export function aggregationTemporalityFromJSON(object: any): AggregationTemporality { + switch (object) { + case 0: + case "AGGREGATION_TEMPORALITY_UNSPECIFIED": + return AggregationTemporality.AGGREGATION_TEMPORALITY_UNSPECIFIED; + case 1: + case "AGGREGATION_TEMPORALITY_DELTA": + return AggregationTemporality.AGGREGATION_TEMPORALITY_DELTA; + case 2: + case "AGGREGATION_TEMPORALITY_CUMULATIVE": + return AggregationTemporality.AGGREGATION_TEMPORALITY_CUMULATIVE; + case -1: + case "UNRECOGNIZED": + default: + return AggregationTemporality.UNRECOGNIZED; + } +} + +export function aggregationTemporalityToJSON(object: AggregationTemporality): string { + switch (object) { + case AggregationTemporality.AGGREGATION_TEMPORALITY_UNSPECIFIED: + return "AGGREGATION_TEMPORALITY_UNSPECIFIED"; + case AggregationTemporality.AGGREGATION_TEMPORALITY_DELTA: + return "AGGREGATION_TEMPORALITY_DELTA"; + case AggregationTemporality.AGGREGATION_TEMPORALITY_CUMULATIVE: + return "AGGREGATION_TEMPORALITY_CUMULATIVE"; + case AggregationTemporality.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * DataPointFlags is defined as a protobuf 'uint32' type and is to be used as a + * bit-field representing 32 distinct boolean flags. Each flag defined in this + * enum is a bit-mask. To test the presence of a single flag in the flags of + * a data point, for example, use an expression like: + * + * (point.flags & DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK) == DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK + */ +export enum DataPointFlags { + /** + * DATA_POINT_FLAGS_DO_NOT_USE - The zero value for the enum. Should not be used for comparisons. + * Instead use bitwise "and" with the appropriate mask as shown above. + */ + DATA_POINT_FLAGS_DO_NOT_USE = 0, + /** + * DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK - This DataPoint is valid but has no recorded value. This value + * SHOULD be used to reflect explicitly missing data in a series, as + * for an equivalent to the Prometheus "staleness marker". + */ + DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK = 1, + UNRECOGNIZED = -1, +} + +export function dataPointFlagsFromJSON(object: any): DataPointFlags { + switch (object) { + case 0: + case "DATA_POINT_FLAGS_DO_NOT_USE": + return DataPointFlags.DATA_POINT_FLAGS_DO_NOT_USE; + case 1: + case "DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK": + return DataPointFlags.DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK; + case -1: + case "UNRECOGNIZED": + default: + return DataPointFlags.UNRECOGNIZED; + } +} + +export function dataPointFlagsToJSON(object: DataPointFlags): string { + switch (object) { + case DataPointFlags.DATA_POINT_FLAGS_DO_NOT_USE: + return "DATA_POINT_FLAGS_DO_NOT_USE"; + case DataPointFlags.DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK: + return "DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK"; + case DataPointFlags.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * MetricsData represents the metrics data that can be stored in a persistent + * storage, OR can be embedded by other protocols that transfer OTLP metrics + * data but do not implement the OTLP protocol. + * + * The main difference between this message and collector protocol is that + * in this message there will not be any "control" or "metadata" specific to + * OTLP protocol. + * + * When new fields are added into this message, the OTLP request MUST be updated + * as well. + */ +export interface MetricsData { + /** + * An array of ResourceMetrics. + * For data coming from a single resource this array will typically contain + * one element. Intermediary nodes that receive data from multiple origins + * typically batch the data before forwarding further and in that case this + * array will contain multiple elements. + */ + resource_metrics: ResourceMetrics[]; +} + +/** A collection of ScopeMetrics from a Resource. */ +export interface ResourceMetrics { + /** + * The resource for the metrics in this message. + * If this field is not set then no resource info is known. + */ + resource: + | Resource + | undefined; + /** A list of metrics that originate from a resource. */ + scope_metrics: ScopeMetrics[]; + /** + * The Schema URL, if known. This is the identifier of the Schema that the resource data + * is recorded in. To learn more about Schema URL see + * https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + * This schema_url applies to the data in the "resource" field. It does not apply + * to the data in the "scope_metrics" field which have their own schema_url field. + */ + schema_url: string; +} + +/** A collection of Metrics produced by an Scope. */ +export interface ScopeMetrics { + /** + * The instrumentation scope information for the metrics in this message. + * Semantically when InstrumentationScope isn't set, it is equivalent with + * an empty instrumentation scope name (unknown). + */ + scope: + | InstrumentationScope + | undefined; + /** A list of metrics that originate from an instrumentation library. */ + metrics: Metric[]; + /** + * The Schema URL, if known. This is the identifier of the Schema that the metric data + * is recorded in. To learn more about Schema URL see + * https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + * This schema_url applies to all metrics in the "metrics" field. + */ + schema_url: string; +} + +/** + * Defines a Metric which has one or more timeseries. The following is a + * brief summary of the Metric data model. For more details, see: + * + * https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/data-model.md + * + * The data model and relation between entities is shown in the + * diagram below. Here, "DataPoint" is the term used to refer to any + * one of the specific data point value types, and "points" is the term used + * to refer to any one of the lists of points contained in the Metric. + * + * - Metric is composed of a metadata and data. + * - Metadata part contains a name, description, unit. + * - Data is one of the possible types (Sum, Gauge, Histogram, Summary). + * - DataPoint contains timestamps, attributes, and one of the possible value type + * fields. + * + * Metric + * +------------+ + * |name | + * |description | + * |unit | +------------------------------------+ + * |data |---> |Gauge, Sum, Histogram, Summary, ... | + * +------------+ +------------------------------------+ + * + * Data [One of Gauge, Sum, Histogram, Summary, ...] + * +-----------+ + * |... | // Metadata about the Data. + * |points |--+ + * +-----------+ | + * | +---------------------------+ + * | |DataPoint 1 | + * v |+------+------+ +------+ | + * +-----+ ||label |label |...|label | | + * | 1 |-->||value1|value2|...|valueN| | + * +-----+ |+------+------+ +------+ | + * | . | |+-----+ | + * | . | ||value| | + * | . | |+-----+ | + * | . | +---------------------------+ + * | . | . + * | . | . + * | . | . + * | . | +---------------------------+ + * | . | |DataPoint M | + * +-----+ |+------+------+ +------+ | + * | M |-->||label |label |...|label | | + * +-----+ ||value1|value2|...|valueN| | + * |+------+------+ +------+ | + * |+-----+ | + * ||value| | + * |+-----+ | + * +---------------------------+ + * + * Each distinct type of DataPoint represents the output of a specific + * aggregation function, the result of applying the DataPoint's + * associated function of to one or more measurements. + * + * All DataPoint types have three common fields: + * - Attributes includes key-value pairs associated with the data point + * - TimeUnixNano is required, set to the end time of the aggregation + * - StartTimeUnixNano is optional, but strongly encouraged for DataPoints + * having an AggregationTemporality field, as discussed below. + * + * Both TimeUnixNano and StartTimeUnixNano values are expressed as + * UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + * + * # TimeUnixNano + * + * This field is required, having consistent interpretation across + * DataPoint types. TimeUnixNano is the moment corresponding to when + * the data point's aggregate value was captured. + * + * Data points with the 0 value for TimeUnixNano SHOULD be rejected + * by consumers. + * + * # StartTimeUnixNano + * + * StartTimeUnixNano in general allows detecting when a sequence of + * observations is unbroken. This field indicates to consumers the + * start time for points with cumulative and delta + * AggregationTemporality, and it should be included whenever possible + * to support correct rate calculation. Although it may be omitted + * when the start time is truly unknown, setting StartTimeUnixNano is + * strongly encouraged. + */ +export interface Metric { + /** name of the metric. */ + name: string; + /** description of the metric, which can be used in documentation. */ + description: string; + /** + * unit in which the metric value is reported. Follows the format + * described by http://unitsofmeasure.org/ucum.html. + */ + unit: string; + gauge?: Gauge | undefined; + sum?: Sum | undefined; + histogram?: Histogram | undefined; + exponential_histogram?: ExponentialHistogram | undefined; + summary?: + | Summary + | undefined; + /** + * Additional metadata attributes that describe the metric. [Optional]. + * Attributes are non-identifying. + * Consumers SHOULD NOT need to be aware of these attributes. + * These attributes MAY be used to encode information allowing + * for lossless roundtrip translation to / from another data model. + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + metadata: KeyValue[]; +} + +/** + * Gauge represents the type of a scalar metric that always exports the + * "current value" for every data point. It should be used for an "unknown" + * aggregation. + * + * A Gauge does not support different aggregation temporalities. Given the + * aggregation is unknown, points cannot be combined using the same + * aggregation, regardless of aggregation temporalities. Therefore, + * AggregationTemporality is not included. Consequently, this also means + * "StartTimeUnixNano" is ignored for all data points. + */ +export interface Gauge { + data_points: NumberDataPoint[]; +} + +/** + * Sum represents the type of a scalar metric that is calculated as a sum of all + * reported measurements over a time interval. + */ +export interface Sum { + data_points: NumberDataPoint[]; + /** + * aggregation_temporality describes if the aggregator reports delta changes + * since last report time, or cumulative changes since a fixed start time. + */ + aggregation_temporality: AggregationTemporality; + /** If "true" means that the sum is monotonic. */ + is_monotonic: boolean; +} + +/** + * Histogram represents the type of a metric that is calculated by aggregating + * as a Histogram of all reported measurements over a time interval. + */ +export interface Histogram { + data_points: HistogramDataPoint[]; + /** + * aggregation_temporality describes if the aggregator reports delta changes + * since last report time, or cumulative changes since a fixed start time. + */ + aggregation_temporality: AggregationTemporality; +} + +/** + * ExponentialHistogram represents the type of a metric that is calculated by aggregating + * as a ExponentialHistogram of all reported double measurements over a time interval. + */ +export interface ExponentialHistogram { + data_points: ExponentialHistogramDataPoint[]; + /** + * aggregation_temporality describes if the aggregator reports delta changes + * since last report time, or cumulative changes since a fixed start time. + */ + aggregation_temporality: AggregationTemporality; +} + +/** + * Summary metric data are used to convey quantile summaries, + * a Prometheus (see: https://prometheus.io/docs/concepts/metric_types/#summary) + * and OpenMetrics (see: https://github.com/OpenObservability/OpenMetrics/blob/4dbf6075567ab43296eed941037c12951faafb92/protos/prometheus.proto#L45) + * data type. These data points cannot always be merged in a meaningful way. + * While they can be useful in some applications, histogram data points are + * recommended for new applications. + */ +export interface Summary { + data_points: SummaryDataPoint[]; +} + +/** + * NumberDataPoint is a single data point in a timeseries that describes the + * time-varying scalar value of a metric. + */ +export interface NumberDataPoint { + /** + * The set of key/value pairs that uniquely identify the timeseries from + * where this point belongs. The list may be empty (may contain 0 elements). + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * StartTimeUnixNano is optional but strongly encouraged, see the + * the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + start_time_unix_nano: string; + /** + * TimeUnixNano is required, see the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + time_unix_nano: string; + as_double?: number | undefined; + as_int?: + | string + | undefined; + /** + * (Optional) List of exemplars collected from + * measurements that were used to form the data point + */ + exemplars: Exemplar[]; + /** + * Flags that apply to this specific data point. See DataPointFlags + * for the available flags and their meaning. + */ + flags: number; +} + +/** + * HistogramDataPoint is a single data point in a timeseries that describes the + * time-varying values of a Histogram. A Histogram contains summary statistics + * for a population of values, it may optionally contain the distribution of + * those values across a set of buckets. + * + * If the histogram contains the distribution of values, then both + * "explicit_bounds" and "bucket counts" fields must be defined. + * If the histogram does not contain the distribution of values, then both + * "explicit_bounds" and "bucket_counts" must be omitted and only "count" and + * "sum" are known. + */ +export interface HistogramDataPoint { + /** + * The set of key/value pairs that uniquely identify the timeseries from + * where this point belongs. The list may be empty (may contain 0 elements). + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * StartTimeUnixNano is optional but strongly encouraged, see the + * the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + start_time_unix_nano: string; + /** + * TimeUnixNano is required, see the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + time_unix_nano: string; + /** + * count is the number of values in the population. Must be non-negative. This + * value must be equal to the sum of the "count" fields in buckets if a + * histogram is provided. + */ + count: string; + /** + * sum of the values in the population. If count is zero then this field + * must be zero. + * + * Note: Sum should only be filled out when measuring non-negative discrete + * events, and is assumed to be monotonic over the values of these events. + * Negative events *can* be recorded, but sum should not be filled out when + * doing so. This is specifically to enforce compatibility w/ OpenMetrics, + * see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#histogram + */ + sum?: + | number + | undefined; + /** + * bucket_counts is an optional field contains the count values of histogram + * for each bucket. + * + * The sum of the bucket_counts must equal the value in the count field. + * + * The number of elements in bucket_counts array must be by one greater than + * the number of elements in explicit_bounds array. + */ + bucket_counts: string[]; + /** + * explicit_bounds specifies buckets with explicitly defined bounds for values. + * + * The boundaries for bucket at index i are: + * + * (-infinity, explicit_bounds[i]] for i == 0 + * (explicit_bounds[i-1], explicit_bounds[i]] for 0 < i < size(explicit_bounds) + * (explicit_bounds[i-1], +infinity) for i == size(explicit_bounds) + * + * The values in the explicit_bounds array must be strictly increasing. + * + * Histogram buckets are inclusive of their upper boundary, except the last + * bucket where the boundary is at infinity. This format is intentionally + * compatible with the OpenMetrics histogram definition. + */ + explicit_bounds: number[]; + /** + * (Optional) List of exemplars collected from + * measurements that were used to form the data point + */ + exemplars: Exemplar[]; + /** + * Flags that apply to this specific data point. See DataPointFlags + * for the available flags and their meaning. + */ + flags: number; + /** min is the minimum value over (start_time, end_time]. */ + min?: + | number + | undefined; + /** max is the maximum value over (start_time, end_time]. */ + max?: number | undefined; +} + +/** + * ExponentialHistogramDataPoint is a single data point in a timeseries that describes the + * time-varying values of a ExponentialHistogram of double values. A ExponentialHistogram contains + * summary statistics for a population of values, it may optionally contain the + * distribution of those values across a set of buckets. + */ +export interface ExponentialHistogramDataPoint { + /** + * The set of key/value pairs that uniquely identify the timeseries from + * where this point belongs. The list may be empty (may contain 0 elements). + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * StartTimeUnixNano is optional but strongly encouraged, see the + * the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + start_time_unix_nano: string; + /** + * TimeUnixNano is required, see the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + time_unix_nano: string; + /** + * count is the number of values in the population. Must be + * non-negative. This value must be equal to the sum of the "bucket_counts" + * values in the positive and negative Buckets plus the "zero_count" field. + */ + count: string; + /** + * sum of the values in the population. If count is zero then this field + * must be zero. + * + * Note: Sum should only be filled out when measuring non-negative discrete + * events, and is assumed to be monotonic over the values of these events. + * Negative events *can* be recorded, but sum should not be filled out when + * doing so. This is specifically to enforce compatibility w/ OpenMetrics, + * see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#histogram + */ + sum?: + | number + | undefined; + /** + * scale describes the resolution of the histogram. Boundaries are + * located at powers of the base, where: + * + * base = (2^(2^-scale)) + * + * The histogram bucket identified by `index`, a signed integer, + * contains values that are greater than (base^index) and + * less than or equal to (base^(index+1)). + * + * The positive and negative ranges of the histogram are expressed + * separately. Negative values are mapped by their absolute value + * into the negative range using the same scale as the positive range. + * + * scale is not restricted by the protocol, as the permissible + * values depend on the range of the data. + */ + scale: number; + /** + * zero_count is the count of values that are either exactly zero or + * within the region considered zero by the instrumentation at the + * tolerated degree of precision. This bucket stores values that + * cannot be expressed using the standard exponential formula as + * well as values that have been rounded to zero. + * + * Implementations MAY consider the zero bucket to have probability + * mass equal to (zero_count / count). + */ + zero_count: string; + /** positive carries the positive range of exponential bucket counts. */ + positive: + | ExponentialHistogramDataPoint_Buckets + | undefined; + /** negative carries the negative range of exponential bucket counts. */ + negative: + | ExponentialHistogramDataPoint_Buckets + | undefined; + /** + * Flags that apply to this specific data point. See DataPointFlags + * for the available flags and their meaning. + */ + flags: number; + /** + * (Optional) List of exemplars collected from + * measurements that were used to form the data point + */ + exemplars: Exemplar[]; + /** min is the minimum value over (start_time, end_time]. */ + min?: + | number + | undefined; + /** max is the maximum value over (start_time, end_time]. */ + max?: + | number + | undefined; + /** + * ZeroThreshold may be optionally set to convey the width of the zero + * region. Where the zero region is defined as the closed interval + * [-ZeroThreshold, ZeroThreshold]. + * When ZeroThreshold is 0, zero count bucket stores values that cannot be + * expressed using the standard exponential formula as well as values that + * have been rounded to zero. + */ + zero_threshold: number; +} + +/** + * Buckets are a set of bucket counts, encoded in a contiguous array + * of counts. + */ +export interface ExponentialHistogramDataPoint_Buckets { + /** + * Offset is the bucket index of the first entry in the bucket_counts array. + * + * Note: This uses a varint encoding as a simple form of compression. + */ + offset: number; + /** + * bucket_counts is an array of count values, where bucket_counts[i] carries + * the count of the bucket at index (offset+i). bucket_counts[i] is the count + * of values greater than base^(offset+i) and less than or equal to + * base^(offset+i+1). + * + * Note: By contrast, the explicit HistogramDataPoint uses + * fixed64. This field is expected to have many buckets, + * especially zeros, so uint64 has been selected to ensure + * varint encoding. + */ + bucket_counts: string[]; +} + +/** + * SummaryDataPoint is a single data point in a timeseries that describes the + * time-varying values of a Summary metric. + */ +export interface SummaryDataPoint { + /** + * The set of key/value pairs that uniquely identify the timeseries from + * where this point belongs. The list may be empty (may contain 0 elements). + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * StartTimeUnixNano is optional but strongly encouraged, see the + * the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + start_time_unix_nano: string; + /** + * TimeUnixNano is required, see the detailed comments above Metric. + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + time_unix_nano: string; + /** count is the number of values in the population. Must be non-negative. */ + count: string; + /** + * sum of the values in the population. If count is zero then this field + * must be zero. + * + * Note: Sum should only be filled out when measuring non-negative discrete + * events, and is assumed to be monotonic over the values of these events. + * Negative events *can* be recorded, but sum should not be filled out when + * doing so. This is specifically to enforce compatibility w/ OpenMetrics, + * see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#summary + */ + sum: number; + /** + * (Optional) list of values at different quantiles of the distribution calculated + * from the current snapshot. The quantiles must be strictly increasing. + */ + quantile_values: SummaryDataPoint_ValueAtQuantile[]; + /** + * Flags that apply to this specific data point. See DataPointFlags + * for the available flags and their meaning. + */ + flags: number; +} + +/** + * Represents the value at a given quantile of a distribution. + * + * To record Min and Max values following conventions are used: + * - The 1.0 quantile is equivalent to the maximum value observed. + * - The 0.0 quantile is equivalent to the minimum value observed. + * + * See the following issue for more context: + * https://github.com/open-telemetry/opentelemetry-proto/issues/125 + */ +export interface SummaryDataPoint_ValueAtQuantile { + /** + * The quantile of a distribution. Must be in the interval + * [0.0, 1.0]. + */ + quantile: number; + /** + * The value at the given quantile of a distribution. + * + * Quantile values must NOT be negative. + */ + value: number; +} + +/** + * A representation of an exemplar, which is a sample input measurement. + * Exemplars also hold information about the environment when the measurement + * was recorded, for example the span and trace ID of the active span when the + * exemplar was recorded. + */ +export interface Exemplar { + /** + * The set of key/value pairs that were filtered out by the aggregator, but + * recorded alongside the original measurement. Only key/value pairs that were + * filtered out by the aggregator should be included + */ + filtered_attributes: KeyValue[]; + /** + * time_unix_nano is the exact time when this exemplar was recorded + * + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + * 1970. + */ + time_unix_nano: string; + as_double?: number | undefined; + as_int?: + | string + | undefined; + /** + * (Optional) Span ID of the exemplar trace. + * span_id may be missing if the measurement is not recorded inside a trace + * or if the trace is not sampled. + */ + span_id: Uint8Array; + /** + * (Optional) Trace ID of the exemplar trace. + * trace_id may be missing if the measurement is not recorded inside a trace + * or if the trace is not sampled. + */ + trace_id: Uint8Array; +} + +function createBaseMetricsData(): MetricsData { + return { resource_metrics: [] }; +} + +export const MetricsData = { + encode(message: MetricsData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.resource_metrics) { + ResourceMetrics.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MetricsData { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMetricsData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource_metrics.push(ResourceMetrics.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MetricsData { + return { + resource_metrics: globalThis.Array.isArray(object?.resource_metrics) + ? object.resource_metrics.map((e: any) => ResourceMetrics.fromJSON(e)) + : [], + }; + }, + + toJSON(message: MetricsData): unknown { + const obj: any = {}; + if (message.resource_metrics?.length) { + obj.resource_metrics = message.resource_metrics.map((e) => ResourceMetrics.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): MetricsData { + return MetricsData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MetricsData { + const message = createBaseMetricsData(); + message.resource_metrics = object.resource_metrics?.map((e) => ResourceMetrics.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseResourceMetrics(): ResourceMetrics { + return { resource: undefined, scope_metrics: [], schema_url: "" }; +} + +export const ResourceMetrics = { + encode(message: ResourceMetrics, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.resource !== undefined) { + Resource.encode(message.resource, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.scope_metrics) { + ScopeMetrics.encode(v!, writer.uint32(18).fork()).ldelim(); + } + if (message.schema_url !== "") { + writer.uint32(26).string(message.schema_url); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ResourceMetrics { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseResourceMetrics(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource = Resource.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.scope_metrics.push(ScopeMetrics.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.schema_url = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ResourceMetrics { + return { + resource: isSet(object.resource) ? Resource.fromJSON(object.resource) : undefined, + scope_metrics: globalThis.Array.isArray(object?.scope_metrics) + ? object.scope_metrics.map((e: any) => ScopeMetrics.fromJSON(e)) + : [], + schema_url: isSet(object.schema_url) ? globalThis.String(object.schema_url) : "", + }; + }, + + toJSON(message: ResourceMetrics): unknown { + const obj: any = {}; + if (message.resource !== undefined) { + obj.resource = Resource.toJSON(message.resource); + } + if (message.scope_metrics?.length) { + obj.scope_metrics = message.scope_metrics.map((e) => ScopeMetrics.toJSON(e)); + } + if (message.schema_url !== "") { + obj.schema_url = message.schema_url; + } + return obj; + }, + + create, I>>(base?: I): ResourceMetrics { + return ResourceMetrics.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ResourceMetrics { + const message = createBaseResourceMetrics(); + message.resource = (object.resource !== undefined && object.resource !== null) + ? Resource.fromPartial(object.resource) + : undefined; + message.scope_metrics = object.scope_metrics?.map((e) => ScopeMetrics.fromPartial(e)) || []; + message.schema_url = object.schema_url ?? ""; + return message; + }, +}; + +function createBaseScopeMetrics(): ScopeMetrics { + return { scope: undefined, metrics: [], schema_url: "" }; +} + +export const ScopeMetrics = { + encode(message: ScopeMetrics, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.scope !== undefined) { + InstrumentationScope.encode(message.scope, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.metrics) { + Metric.encode(v!, writer.uint32(18).fork()).ldelim(); + } + if (message.schema_url !== "") { + writer.uint32(26).string(message.schema_url); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ScopeMetrics { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseScopeMetrics(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.scope = InstrumentationScope.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.metrics.push(Metric.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.schema_url = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ScopeMetrics { + return { + scope: isSet(object.scope) ? InstrumentationScope.fromJSON(object.scope) : undefined, + metrics: globalThis.Array.isArray(object?.metrics) ? object.metrics.map((e: any) => Metric.fromJSON(e)) : [], + schema_url: isSet(object.schema_url) ? globalThis.String(object.schema_url) : "", + }; + }, + + toJSON(message: ScopeMetrics): unknown { + const obj: any = {}; + if (message.scope !== undefined) { + obj.scope = InstrumentationScope.toJSON(message.scope); + } + if (message.metrics?.length) { + obj.metrics = message.metrics.map((e) => Metric.toJSON(e)); + } + if (message.schema_url !== "") { + obj.schema_url = message.schema_url; + } + return obj; + }, + + create, I>>(base?: I): ScopeMetrics { + return ScopeMetrics.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ScopeMetrics { + const message = createBaseScopeMetrics(); + message.scope = (object.scope !== undefined && object.scope !== null) + ? InstrumentationScope.fromPartial(object.scope) + : undefined; + message.metrics = object.metrics?.map((e) => Metric.fromPartial(e)) || []; + message.schema_url = object.schema_url ?? ""; + return message; + }, +}; + +function createBaseMetric(): Metric { + return { + name: "", + description: "", + unit: "", + gauge: undefined, + sum: undefined, + histogram: undefined, + exponential_histogram: undefined, + summary: undefined, + metadata: [], + }; +} + +export const Metric = { + encode(message: Metric, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.description !== "") { + writer.uint32(18).string(message.description); + } + if (message.unit !== "") { + writer.uint32(26).string(message.unit); + } + if (message.gauge !== undefined) { + Gauge.encode(message.gauge, writer.uint32(42).fork()).ldelim(); + } + if (message.sum !== undefined) { + Sum.encode(message.sum, writer.uint32(58).fork()).ldelim(); + } + if (message.histogram !== undefined) { + Histogram.encode(message.histogram, writer.uint32(74).fork()).ldelim(); + } + if (message.exponential_histogram !== undefined) { + ExponentialHistogram.encode(message.exponential_histogram, writer.uint32(82).fork()).ldelim(); + } + if (message.summary !== undefined) { + Summary.encode(message.summary, writer.uint32(90).fork()).ldelim(); + } + for (const v of message.metadata) { + KeyValue.encode(v!, writer.uint32(98).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Metric { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMetric(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.description = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.unit = reader.string(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.gauge = Gauge.decode(reader, reader.uint32()); + continue; + case 7: + if (tag !== 58) { + break; + } + + message.sum = Sum.decode(reader, reader.uint32()); + continue; + case 9: + if (tag !== 74) { + break; + } + + message.histogram = Histogram.decode(reader, reader.uint32()); + continue; + case 10: + if (tag !== 82) { + break; + } + + message.exponential_histogram = ExponentialHistogram.decode(reader, reader.uint32()); + continue; + case 11: + if (tag !== 90) { + break; + } + + message.summary = Summary.decode(reader, reader.uint32()); + continue; + case 12: + if (tag !== 98) { + break; + } + + message.metadata.push(KeyValue.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Metric { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + description: isSet(object.description) ? globalThis.String(object.description) : "", + unit: isSet(object.unit) ? globalThis.String(object.unit) : "", + gauge: isSet(object.gauge) ? Gauge.fromJSON(object.gauge) : undefined, + sum: isSet(object.sum) ? Sum.fromJSON(object.sum) : undefined, + histogram: isSet(object.histogram) ? Histogram.fromJSON(object.histogram) : undefined, + exponential_histogram: isSet(object.exponential_histogram) + ? ExponentialHistogram.fromJSON(object.exponential_histogram) + : undefined, + summary: isSet(object.summary) ? Summary.fromJSON(object.summary) : undefined, + metadata: globalThis.Array.isArray(object?.metadata) ? object.metadata.map((e: any) => KeyValue.fromJSON(e)) : [], + }; + }, + + toJSON(message: Metric): unknown { + const obj: any = {}; + if (message.name !== "") { + obj.name = message.name; + } + if (message.description !== "") { + obj.description = message.description; + } + if (message.unit !== "") { + obj.unit = message.unit; + } + if (message.gauge !== undefined) { + obj.gauge = Gauge.toJSON(message.gauge); + } + if (message.sum !== undefined) { + obj.sum = Sum.toJSON(message.sum); + } + if (message.histogram !== undefined) { + obj.histogram = Histogram.toJSON(message.histogram); + } + if (message.exponential_histogram !== undefined) { + obj.exponential_histogram = ExponentialHistogram.toJSON(message.exponential_histogram); + } + if (message.summary !== undefined) { + obj.summary = Summary.toJSON(message.summary); + } + if (message.metadata?.length) { + obj.metadata = message.metadata.map((e) => KeyValue.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): Metric { + return Metric.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Metric { + const message = createBaseMetric(); + message.name = object.name ?? ""; + message.description = object.description ?? ""; + message.unit = object.unit ?? ""; + message.gauge = (object.gauge !== undefined && object.gauge !== null) ? Gauge.fromPartial(object.gauge) : undefined; + message.sum = (object.sum !== undefined && object.sum !== null) ? Sum.fromPartial(object.sum) : undefined; + message.histogram = (object.histogram !== undefined && object.histogram !== null) + ? Histogram.fromPartial(object.histogram) + : undefined; + message.exponential_histogram = + (object.exponential_histogram !== undefined && object.exponential_histogram !== null) + ? ExponentialHistogram.fromPartial(object.exponential_histogram) + : undefined; + message.summary = (object.summary !== undefined && object.summary !== null) + ? Summary.fromPartial(object.summary) + : undefined; + message.metadata = object.metadata?.map((e) => KeyValue.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseGauge(): Gauge { + return { data_points: [] }; +} + +export const Gauge = { + encode(message: Gauge, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.data_points) { + NumberDataPoint.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Gauge { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGauge(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.data_points.push(NumberDataPoint.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Gauge { + return { + data_points: globalThis.Array.isArray(object?.data_points) + ? object.data_points.map((e: any) => NumberDataPoint.fromJSON(e)) + : [], + }; + }, + + toJSON(message: Gauge): unknown { + const obj: any = {}; + if (message.data_points?.length) { + obj.data_points = message.data_points.map((e) => NumberDataPoint.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): Gauge { + return Gauge.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Gauge { + const message = createBaseGauge(); + message.data_points = object.data_points?.map((e) => NumberDataPoint.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseSum(): Sum { + return { data_points: [], aggregation_temporality: 0, is_monotonic: false }; +} + +export const Sum = { + encode(message: Sum, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.data_points) { + NumberDataPoint.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.aggregation_temporality !== 0) { + writer.uint32(16).int32(message.aggregation_temporality); + } + if (message.is_monotonic !== false) { + writer.uint32(24).bool(message.is_monotonic); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Sum { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSum(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.data_points.push(NumberDataPoint.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.aggregation_temporality = reader.int32() as any; + continue; + case 3: + if (tag !== 24) { + break; + } + + message.is_monotonic = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Sum { + return { + data_points: globalThis.Array.isArray(object?.data_points) + ? object.data_points.map((e: any) => NumberDataPoint.fromJSON(e)) + : [], + aggregation_temporality: isSet(object.aggregation_temporality) + ? aggregationTemporalityFromJSON(object.aggregation_temporality) + : 0, + is_monotonic: isSet(object.is_monotonic) ? globalThis.Boolean(object.is_monotonic) : false, + }; + }, + + toJSON(message: Sum): unknown { + const obj: any = {}; + if (message.data_points?.length) { + obj.data_points = message.data_points.map((e) => NumberDataPoint.toJSON(e)); + } + if (message.aggregation_temporality !== 0) { + obj.aggregation_temporality = aggregationTemporalityToJSON(message.aggregation_temporality); + } + if (message.is_monotonic !== false) { + obj.is_monotonic = message.is_monotonic; + } + return obj; + }, + + create, I>>(base?: I): Sum { + return Sum.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Sum { + const message = createBaseSum(); + message.data_points = object.data_points?.map((e) => NumberDataPoint.fromPartial(e)) || []; + message.aggregation_temporality = object.aggregation_temporality ?? 0; + message.is_monotonic = object.is_monotonic ?? false; + return message; + }, +}; + +function createBaseHistogram(): Histogram { + return { data_points: [], aggregation_temporality: 0 }; +} + +export const Histogram = { + encode(message: Histogram, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.data_points) { + HistogramDataPoint.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.aggregation_temporality !== 0) { + writer.uint32(16).int32(message.aggregation_temporality); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Histogram { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHistogram(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.data_points.push(HistogramDataPoint.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.aggregation_temporality = reader.int32() as any; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Histogram { + return { + data_points: globalThis.Array.isArray(object?.data_points) + ? object.data_points.map((e: any) => HistogramDataPoint.fromJSON(e)) + : [], + aggregation_temporality: isSet(object.aggregation_temporality) + ? aggregationTemporalityFromJSON(object.aggregation_temporality) + : 0, + }; + }, + + toJSON(message: Histogram): unknown { + const obj: any = {}; + if (message.data_points?.length) { + obj.data_points = message.data_points.map((e) => HistogramDataPoint.toJSON(e)); + } + if (message.aggregation_temporality !== 0) { + obj.aggregation_temporality = aggregationTemporalityToJSON(message.aggregation_temporality); + } + return obj; + }, + + create, I>>(base?: I): Histogram { + return Histogram.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Histogram { + const message = createBaseHistogram(); + message.data_points = object.data_points?.map((e) => HistogramDataPoint.fromPartial(e)) || []; + message.aggregation_temporality = object.aggregation_temporality ?? 0; + return message; + }, +}; + +function createBaseExponentialHistogram(): ExponentialHistogram { + return { data_points: [], aggregation_temporality: 0 }; +} + +export const ExponentialHistogram = { + encode(message: ExponentialHistogram, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.data_points) { + ExponentialHistogramDataPoint.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.aggregation_temporality !== 0) { + writer.uint32(16).int32(message.aggregation_temporality); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExponentialHistogram { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExponentialHistogram(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.data_points.push(ExponentialHistogramDataPoint.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.aggregation_temporality = reader.int32() as any; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExponentialHistogram { + return { + data_points: globalThis.Array.isArray(object?.data_points) + ? object.data_points.map((e: any) => ExponentialHistogramDataPoint.fromJSON(e)) + : [], + aggregation_temporality: isSet(object.aggregation_temporality) + ? aggregationTemporalityFromJSON(object.aggregation_temporality) + : 0, + }; + }, + + toJSON(message: ExponentialHistogram): unknown { + const obj: any = {}; + if (message.data_points?.length) { + obj.data_points = message.data_points.map((e) => ExponentialHistogramDataPoint.toJSON(e)); + } + if (message.aggregation_temporality !== 0) { + obj.aggregation_temporality = aggregationTemporalityToJSON(message.aggregation_temporality); + } + return obj; + }, + + create, I>>(base?: I): ExponentialHistogram { + return ExponentialHistogram.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExponentialHistogram { + const message = createBaseExponentialHistogram(); + message.data_points = object.data_points?.map((e) => ExponentialHistogramDataPoint.fromPartial(e)) || []; + message.aggregation_temporality = object.aggregation_temporality ?? 0; + return message; + }, +}; + +function createBaseSummary(): Summary { + return { data_points: [] }; +} + +export const Summary = { + encode(message: Summary, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.data_points) { + SummaryDataPoint.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Summary { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSummary(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.data_points.push(SummaryDataPoint.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Summary { + return { + data_points: globalThis.Array.isArray(object?.data_points) + ? object.data_points.map((e: any) => SummaryDataPoint.fromJSON(e)) + : [], + }; + }, + + toJSON(message: Summary): unknown { + const obj: any = {}; + if (message.data_points?.length) { + obj.data_points = message.data_points.map((e) => SummaryDataPoint.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): Summary { + return Summary.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Summary { + const message = createBaseSummary(); + message.data_points = object.data_points?.map((e) => SummaryDataPoint.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseNumberDataPoint(): NumberDataPoint { + return { + attributes: [], + start_time_unix_nano: "0", + time_unix_nano: "0", + as_double: undefined, + as_int: undefined, + exemplars: [], + flags: 0, + }; +} + +export const NumberDataPoint = { + encode(message: NumberDataPoint, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(58).fork()).ldelim(); + } + if (message.start_time_unix_nano !== "0") { + writer.uint32(17).fixed64(message.start_time_unix_nano); + } + if (message.time_unix_nano !== "0") { + writer.uint32(25).fixed64(message.time_unix_nano); + } + if (message.as_double !== undefined) { + writer.uint32(33).double(message.as_double); + } + if (message.as_int !== undefined) { + writer.uint32(49).sfixed64(message.as_int); + } + for (const v of message.exemplars) { + Exemplar.encode(v!, writer.uint32(42).fork()).ldelim(); + } + if (message.flags !== 0) { + writer.uint32(64).uint32(message.flags); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): NumberDataPoint { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseNumberDataPoint(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 7: + if (tag !== 58) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 17) { + break; + } + + message.start_time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 3: + if (tag !== 25) { + break; + } + + message.time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 4: + if (tag !== 33) { + break; + } + + message.as_double = reader.double(); + continue; + case 6: + if (tag !== 49) { + break; + } + + message.as_int = longToString(reader.sfixed64() as Long); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.exemplars.push(Exemplar.decode(reader, reader.uint32())); + continue; + case 8: + if (tag !== 64) { + break; + } + + message.flags = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): NumberDataPoint { + return { + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + start_time_unix_nano: isSet(object.start_time_unix_nano) ? globalThis.String(object.start_time_unix_nano) : "0", + time_unix_nano: isSet(object.time_unix_nano) ? globalThis.String(object.time_unix_nano) : "0", + as_double: isSet(object.as_double) ? globalThis.Number(object.as_double) : undefined, + as_int: isSet(object.as_int) ? globalThis.String(object.as_int) : undefined, + exemplars: globalThis.Array.isArray(object?.exemplars) + ? object.exemplars.map((e: any) => Exemplar.fromJSON(e)) + : [], + flags: isSet(object.flags) ? globalThis.Number(object.flags) : 0, + }; + }, + + toJSON(message: NumberDataPoint): unknown { + const obj: any = {}; + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.start_time_unix_nano !== "0") { + obj.start_time_unix_nano = message.start_time_unix_nano; + } + if (message.time_unix_nano !== "0") { + obj.time_unix_nano = message.time_unix_nano; + } + if (message.as_double !== undefined) { + obj.as_double = message.as_double; + } + if (message.as_int !== undefined) { + obj.as_int = message.as_int; + } + if (message.exemplars?.length) { + obj.exemplars = message.exemplars.map((e) => Exemplar.toJSON(e)); + } + if (message.flags !== 0) { + obj.flags = Math.round(message.flags); + } + return obj; + }, + + create, I>>(base?: I): NumberDataPoint { + return NumberDataPoint.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): NumberDataPoint { + const message = createBaseNumberDataPoint(); + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.start_time_unix_nano = object.start_time_unix_nano ?? "0"; + message.time_unix_nano = object.time_unix_nano ?? "0"; + message.as_double = object.as_double ?? undefined; + message.as_int = object.as_int ?? undefined; + message.exemplars = object.exemplars?.map((e) => Exemplar.fromPartial(e)) || []; + message.flags = object.flags ?? 0; + return message; + }, +}; + +function createBaseHistogramDataPoint(): HistogramDataPoint { + return { + attributes: [], + start_time_unix_nano: "0", + time_unix_nano: "0", + count: "0", + sum: undefined, + bucket_counts: [], + explicit_bounds: [], + exemplars: [], + flags: 0, + min: undefined, + max: undefined, + }; +} + +export const HistogramDataPoint = { + encode(message: HistogramDataPoint, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(74).fork()).ldelim(); + } + if (message.start_time_unix_nano !== "0") { + writer.uint32(17).fixed64(message.start_time_unix_nano); + } + if (message.time_unix_nano !== "0") { + writer.uint32(25).fixed64(message.time_unix_nano); + } + if (message.count !== "0") { + writer.uint32(33).fixed64(message.count); + } + if (message.sum !== undefined) { + writer.uint32(41).double(message.sum); + } + writer.uint32(50).fork(); + for (const v of message.bucket_counts) { + writer.fixed64(v); + } + writer.ldelim(); + writer.uint32(58).fork(); + for (const v of message.explicit_bounds) { + writer.double(v); + } + writer.ldelim(); + for (const v of message.exemplars) { + Exemplar.encode(v!, writer.uint32(66).fork()).ldelim(); + } + if (message.flags !== 0) { + writer.uint32(80).uint32(message.flags); + } + if (message.min !== undefined) { + writer.uint32(89).double(message.min); + } + if (message.max !== undefined) { + writer.uint32(97).double(message.max); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HistogramDataPoint { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHistogramDataPoint(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 9: + if (tag !== 74) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 17) { + break; + } + + message.start_time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 3: + if (tag !== 25) { + break; + } + + message.time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 4: + if (tag !== 33) { + break; + } + + message.count = longToString(reader.fixed64() as Long); + continue; + case 5: + if (tag !== 41) { + break; + } + + message.sum = reader.double(); + continue; + case 6: + if (tag === 49) { + message.bucket_counts.push(longToString(reader.fixed64() as Long)); + + continue; + } + + if (tag === 50) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.bucket_counts.push(longToString(reader.fixed64() as Long)); + } + + continue; + } + + break; + case 7: + if (tag === 57) { + message.explicit_bounds.push(reader.double()); + + continue; + } + + if (tag === 58) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.explicit_bounds.push(reader.double()); + } + + continue; + } + + break; + case 8: + if (tag !== 66) { + break; + } + + message.exemplars.push(Exemplar.decode(reader, reader.uint32())); + continue; + case 10: + if (tag !== 80) { + break; + } + + message.flags = reader.uint32(); + continue; + case 11: + if (tag !== 89) { + break; + } + + message.min = reader.double(); + continue; + case 12: + if (tag !== 97) { + break; + } + + message.max = reader.double(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): HistogramDataPoint { + return { + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + start_time_unix_nano: isSet(object.start_time_unix_nano) ? globalThis.String(object.start_time_unix_nano) : "0", + time_unix_nano: isSet(object.time_unix_nano) ? globalThis.String(object.time_unix_nano) : "0", + count: isSet(object.count) ? globalThis.String(object.count) : "0", + sum: isSet(object.sum) ? globalThis.Number(object.sum) : undefined, + bucket_counts: globalThis.Array.isArray(object?.bucket_counts) + ? object.bucket_counts.map((e: any) => globalThis.String(e)) + : [], + explicit_bounds: globalThis.Array.isArray(object?.explicit_bounds) + ? object.explicit_bounds.map((e: any) => globalThis.Number(e)) + : [], + exemplars: globalThis.Array.isArray(object?.exemplars) + ? object.exemplars.map((e: any) => Exemplar.fromJSON(e)) + : [], + flags: isSet(object.flags) ? globalThis.Number(object.flags) : 0, + min: isSet(object.min) ? globalThis.Number(object.min) : undefined, + max: isSet(object.max) ? globalThis.Number(object.max) : undefined, + }; + }, + + toJSON(message: HistogramDataPoint): unknown { + const obj: any = {}; + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.start_time_unix_nano !== "0") { + obj.start_time_unix_nano = message.start_time_unix_nano; + } + if (message.time_unix_nano !== "0") { + obj.time_unix_nano = message.time_unix_nano; + } + if (message.count !== "0") { + obj.count = message.count; + } + if (message.sum !== undefined) { + obj.sum = message.sum; + } + if (message.bucket_counts?.length) { + obj.bucket_counts = message.bucket_counts; + } + if (message.explicit_bounds?.length) { + obj.explicit_bounds = message.explicit_bounds; + } + if (message.exemplars?.length) { + obj.exemplars = message.exemplars.map((e) => Exemplar.toJSON(e)); + } + if (message.flags !== 0) { + obj.flags = Math.round(message.flags); + } + if (message.min !== undefined) { + obj.min = message.min; + } + if (message.max !== undefined) { + obj.max = message.max; + } + return obj; + }, + + create, I>>(base?: I): HistogramDataPoint { + return HistogramDataPoint.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): HistogramDataPoint { + const message = createBaseHistogramDataPoint(); + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.start_time_unix_nano = object.start_time_unix_nano ?? "0"; + message.time_unix_nano = object.time_unix_nano ?? "0"; + message.count = object.count ?? "0"; + message.sum = object.sum ?? undefined; + message.bucket_counts = object.bucket_counts?.map((e) => e) || []; + message.explicit_bounds = object.explicit_bounds?.map((e) => e) || []; + message.exemplars = object.exemplars?.map((e) => Exemplar.fromPartial(e)) || []; + message.flags = object.flags ?? 0; + message.min = object.min ?? undefined; + message.max = object.max ?? undefined; + return message; + }, +}; + +function createBaseExponentialHistogramDataPoint(): ExponentialHistogramDataPoint { + return { + attributes: [], + start_time_unix_nano: "0", + time_unix_nano: "0", + count: "0", + sum: undefined, + scale: 0, + zero_count: "0", + positive: undefined, + negative: undefined, + flags: 0, + exemplars: [], + min: undefined, + max: undefined, + zero_threshold: 0, + }; +} + +export const ExponentialHistogramDataPoint = { + encode(message: ExponentialHistogramDataPoint, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.start_time_unix_nano !== "0") { + writer.uint32(17).fixed64(message.start_time_unix_nano); + } + if (message.time_unix_nano !== "0") { + writer.uint32(25).fixed64(message.time_unix_nano); + } + if (message.count !== "0") { + writer.uint32(33).fixed64(message.count); + } + if (message.sum !== undefined) { + writer.uint32(41).double(message.sum); + } + if (message.scale !== 0) { + writer.uint32(48).sint32(message.scale); + } + if (message.zero_count !== "0") { + writer.uint32(57).fixed64(message.zero_count); + } + if (message.positive !== undefined) { + ExponentialHistogramDataPoint_Buckets.encode(message.positive, writer.uint32(66).fork()).ldelim(); + } + if (message.negative !== undefined) { + ExponentialHistogramDataPoint_Buckets.encode(message.negative, writer.uint32(74).fork()).ldelim(); + } + if (message.flags !== 0) { + writer.uint32(80).uint32(message.flags); + } + for (const v of message.exemplars) { + Exemplar.encode(v!, writer.uint32(90).fork()).ldelim(); + } + if (message.min !== undefined) { + writer.uint32(97).double(message.min); + } + if (message.max !== undefined) { + writer.uint32(105).double(message.max); + } + if (message.zero_threshold !== 0) { + writer.uint32(113).double(message.zero_threshold); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExponentialHistogramDataPoint { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExponentialHistogramDataPoint(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 17) { + break; + } + + message.start_time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 3: + if (tag !== 25) { + break; + } + + message.time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 4: + if (tag !== 33) { + break; + } + + message.count = longToString(reader.fixed64() as Long); + continue; + case 5: + if (tag !== 41) { + break; + } + + message.sum = reader.double(); + continue; + case 6: + if (tag !== 48) { + break; + } + + message.scale = reader.sint32(); + continue; + case 7: + if (tag !== 57) { + break; + } + + message.zero_count = longToString(reader.fixed64() as Long); + continue; + case 8: + if (tag !== 66) { + break; + } + + message.positive = ExponentialHistogramDataPoint_Buckets.decode(reader, reader.uint32()); + continue; + case 9: + if (tag !== 74) { + break; + } + + message.negative = ExponentialHistogramDataPoint_Buckets.decode(reader, reader.uint32()); + continue; + case 10: + if (tag !== 80) { + break; + } + + message.flags = reader.uint32(); + continue; + case 11: + if (tag !== 90) { + break; + } + + message.exemplars.push(Exemplar.decode(reader, reader.uint32())); + continue; + case 12: + if (tag !== 97) { + break; + } + + message.min = reader.double(); + continue; + case 13: + if (tag !== 105) { + break; + } + + message.max = reader.double(); + continue; + case 14: + if (tag !== 113) { + break; + } + + message.zero_threshold = reader.double(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExponentialHistogramDataPoint { + return { + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + start_time_unix_nano: isSet(object.start_time_unix_nano) ? globalThis.String(object.start_time_unix_nano) : "0", + time_unix_nano: isSet(object.time_unix_nano) ? globalThis.String(object.time_unix_nano) : "0", + count: isSet(object.count) ? globalThis.String(object.count) : "0", + sum: isSet(object.sum) ? globalThis.Number(object.sum) : undefined, + scale: isSet(object.scale) ? globalThis.Number(object.scale) : 0, + zero_count: isSet(object.zero_count) ? globalThis.String(object.zero_count) : "0", + positive: isSet(object.positive) ? ExponentialHistogramDataPoint_Buckets.fromJSON(object.positive) : undefined, + negative: isSet(object.negative) ? ExponentialHistogramDataPoint_Buckets.fromJSON(object.negative) : undefined, + flags: isSet(object.flags) ? globalThis.Number(object.flags) : 0, + exemplars: globalThis.Array.isArray(object?.exemplars) + ? object.exemplars.map((e: any) => Exemplar.fromJSON(e)) + : [], + min: isSet(object.min) ? globalThis.Number(object.min) : undefined, + max: isSet(object.max) ? globalThis.Number(object.max) : undefined, + zero_threshold: isSet(object.zero_threshold) ? globalThis.Number(object.zero_threshold) : 0, + }; + }, + + toJSON(message: ExponentialHistogramDataPoint): unknown { + const obj: any = {}; + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.start_time_unix_nano !== "0") { + obj.start_time_unix_nano = message.start_time_unix_nano; + } + if (message.time_unix_nano !== "0") { + obj.time_unix_nano = message.time_unix_nano; + } + if (message.count !== "0") { + obj.count = message.count; + } + if (message.sum !== undefined) { + obj.sum = message.sum; + } + if (message.scale !== 0) { + obj.scale = Math.round(message.scale); + } + if (message.zero_count !== "0") { + obj.zero_count = message.zero_count; + } + if (message.positive !== undefined) { + obj.positive = ExponentialHistogramDataPoint_Buckets.toJSON(message.positive); + } + if (message.negative !== undefined) { + obj.negative = ExponentialHistogramDataPoint_Buckets.toJSON(message.negative); + } + if (message.flags !== 0) { + obj.flags = Math.round(message.flags); + } + if (message.exemplars?.length) { + obj.exemplars = message.exemplars.map((e) => Exemplar.toJSON(e)); + } + if (message.min !== undefined) { + obj.min = message.min; + } + if (message.max !== undefined) { + obj.max = message.max; + } + if (message.zero_threshold !== 0) { + obj.zero_threshold = message.zero_threshold; + } + return obj; + }, + + create, I>>(base?: I): ExponentialHistogramDataPoint { + return ExponentialHistogramDataPoint.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): ExponentialHistogramDataPoint { + const message = createBaseExponentialHistogramDataPoint(); + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.start_time_unix_nano = object.start_time_unix_nano ?? "0"; + message.time_unix_nano = object.time_unix_nano ?? "0"; + message.count = object.count ?? "0"; + message.sum = object.sum ?? undefined; + message.scale = object.scale ?? 0; + message.zero_count = object.zero_count ?? "0"; + message.positive = (object.positive !== undefined && object.positive !== null) + ? ExponentialHistogramDataPoint_Buckets.fromPartial(object.positive) + : undefined; + message.negative = (object.negative !== undefined && object.negative !== null) + ? ExponentialHistogramDataPoint_Buckets.fromPartial(object.negative) + : undefined; + message.flags = object.flags ?? 0; + message.exemplars = object.exemplars?.map((e) => Exemplar.fromPartial(e)) || []; + message.min = object.min ?? undefined; + message.max = object.max ?? undefined; + message.zero_threshold = object.zero_threshold ?? 0; + return message; + }, +}; + +function createBaseExponentialHistogramDataPoint_Buckets(): ExponentialHistogramDataPoint_Buckets { + return { offset: 0, bucket_counts: [] }; +} + +export const ExponentialHistogramDataPoint_Buckets = { + encode(message: ExponentialHistogramDataPoint_Buckets, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.offset !== 0) { + writer.uint32(8).sint32(message.offset); + } + writer.uint32(18).fork(); + for (const v of message.bucket_counts) { + writer.uint64(v); + } + writer.ldelim(); + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ExponentialHistogramDataPoint_Buckets { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExponentialHistogramDataPoint_Buckets(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.offset = reader.sint32(); + continue; + case 2: + if (tag === 16) { + message.bucket_counts.push(longToString(reader.uint64() as Long)); + + continue; + } + + if (tag === 18) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.bucket_counts.push(longToString(reader.uint64() as Long)); + } + + continue; + } + + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExponentialHistogramDataPoint_Buckets { + return { + offset: isSet(object.offset) ? globalThis.Number(object.offset) : 0, + bucket_counts: globalThis.Array.isArray(object?.bucket_counts) + ? object.bucket_counts.map((e: any) => globalThis.String(e)) + : [], + }; + }, + + toJSON(message: ExponentialHistogramDataPoint_Buckets): unknown { + const obj: any = {}; + if (message.offset !== 0) { + obj.offset = Math.round(message.offset); + } + if (message.bucket_counts?.length) { + obj.bucket_counts = message.bucket_counts; + } + return obj; + }, + + create, I>>( + base?: I, + ): ExponentialHistogramDataPoint_Buckets { + return ExponentialHistogramDataPoint_Buckets.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): ExponentialHistogramDataPoint_Buckets { + const message = createBaseExponentialHistogramDataPoint_Buckets(); + message.offset = object.offset ?? 0; + message.bucket_counts = object.bucket_counts?.map((e) => e) || []; + return message; + }, +}; + +function createBaseSummaryDataPoint(): SummaryDataPoint { + return { + attributes: [], + start_time_unix_nano: "0", + time_unix_nano: "0", + count: "0", + sum: 0, + quantile_values: [], + flags: 0, + }; +} + +export const SummaryDataPoint = { + encode(message: SummaryDataPoint, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(58).fork()).ldelim(); + } + if (message.start_time_unix_nano !== "0") { + writer.uint32(17).fixed64(message.start_time_unix_nano); + } + if (message.time_unix_nano !== "0") { + writer.uint32(25).fixed64(message.time_unix_nano); + } + if (message.count !== "0") { + writer.uint32(33).fixed64(message.count); + } + if (message.sum !== 0) { + writer.uint32(41).double(message.sum); + } + for (const v of message.quantile_values) { + SummaryDataPoint_ValueAtQuantile.encode(v!, writer.uint32(50).fork()).ldelim(); + } + if (message.flags !== 0) { + writer.uint32(64).uint32(message.flags); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SummaryDataPoint { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSummaryDataPoint(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 7: + if (tag !== 58) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 17) { + break; + } + + message.start_time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 3: + if (tag !== 25) { + break; + } + + message.time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 4: + if (tag !== 33) { + break; + } + + message.count = longToString(reader.fixed64() as Long); + continue; + case 5: + if (tag !== 41) { + break; + } + + message.sum = reader.double(); + continue; + case 6: + if (tag !== 50) { + break; + } + + message.quantile_values.push(SummaryDataPoint_ValueAtQuantile.decode(reader, reader.uint32())); + continue; + case 8: + if (tag !== 64) { + break; + } + + message.flags = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SummaryDataPoint { + return { + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + start_time_unix_nano: isSet(object.start_time_unix_nano) ? globalThis.String(object.start_time_unix_nano) : "0", + time_unix_nano: isSet(object.time_unix_nano) ? globalThis.String(object.time_unix_nano) : "0", + count: isSet(object.count) ? globalThis.String(object.count) : "0", + sum: isSet(object.sum) ? globalThis.Number(object.sum) : 0, + quantile_values: globalThis.Array.isArray(object?.quantile_values) + ? object.quantile_values.map((e: any) => SummaryDataPoint_ValueAtQuantile.fromJSON(e)) + : [], + flags: isSet(object.flags) ? globalThis.Number(object.flags) : 0, + }; + }, + + toJSON(message: SummaryDataPoint): unknown { + const obj: any = {}; + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.start_time_unix_nano !== "0") { + obj.start_time_unix_nano = message.start_time_unix_nano; + } + if (message.time_unix_nano !== "0") { + obj.time_unix_nano = message.time_unix_nano; + } + if (message.count !== "0") { + obj.count = message.count; + } + if (message.sum !== 0) { + obj.sum = message.sum; + } + if (message.quantile_values?.length) { + obj.quantile_values = message.quantile_values.map((e) => SummaryDataPoint_ValueAtQuantile.toJSON(e)); + } + if (message.flags !== 0) { + obj.flags = Math.round(message.flags); + } + return obj; + }, + + create, I>>(base?: I): SummaryDataPoint { + return SummaryDataPoint.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SummaryDataPoint { + const message = createBaseSummaryDataPoint(); + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.start_time_unix_nano = object.start_time_unix_nano ?? "0"; + message.time_unix_nano = object.time_unix_nano ?? "0"; + message.count = object.count ?? "0"; + message.sum = object.sum ?? 0; + message.quantile_values = object.quantile_values?.map((e) => SummaryDataPoint_ValueAtQuantile.fromPartial(e)) || []; + message.flags = object.flags ?? 0; + return message; + }, +}; + +function createBaseSummaryDataPoint_ValueAtQuantile(): SummaryDataPoint_ValueAtQuantile { + return { quantile: 0, value: 0 }; +} + +export const SummaryDataPoint_ValueAtQuantile = { + encode(message: SummaryDataPoint_ValueAtQuantile, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.quantile !== 0) { + writer.uint32(9).double(message.quantile); + } + if (message.value !== 0) { + writer.uint32(17).double(message.value); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SummaryDataPoint_ValueAtQuantile { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSummaryDataPoint_ValueAtQuantile(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 9) { + break; + } + + message.quantile = reader.double(); + continue; + case 2: + if (tag !== 17) { + break; + } + + message.value = reader.double(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SummaryDataPoint_ValueAtQuantile { + return { + quantile: isSet(object.quantile) ? globalThis.Number(object.quantile) : 0, + value: isSet(object.value) ? globalThis.Number(object.value) : 0, + }; + }, + + toJSON(message: SummaryDataPoint_ValueAtQuantile): unknown { + const obj: any = {}; + if (message.quantile !== 0) { + obj.quantile = message.quantile; + } + if (message.value !== 0) { + obj.value = message.value; + } + return obj; + }, + + create, I>>( + base?: I, + ): SummaryDataPoint_ValueAtQuantile { + return SummaryDataPoint_ValueAtQuantile.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): SummaryDataPoint_ValueAtQuantile { + const message = createBaseSummaryDataPoint_ValueAtQuantile(); + message.quantile = object.quantile ?? 0; + message.value = object.value ?? 0; + return message; + }, +}; + +function createBaseExemplar(): Exemplar { + return { + filtered_attributes: [], + time_unix_nano: "0", + as_double: undefined, + as_int: undefined, + span_id: new Uint8Array(0), + trace_id: new Uint8Array(0), + }; +} + +export const Exemplar = { + encode(message: Exemplar, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.filtered_attributes) { + KeyValue.encode(v!, writer.uint32(58).fork()).ldelim(); + } + if (message.time_unix_nano !== "0") { + writer.uint32(17).fixed64(message.time_unix_nano); + } + if (message.as_double !== undefined) { + writer.uint32(25).double(message.as_double); + } + if (message.as_int !== undefined) { + writer.uint32(49).sfixed64(message.as_int); + } + if (message.span_id.length !== 0) { + writer.uint32(34).bytes(message.span_id); + } + if (message.trace_id.length !== 0) { + writer.uint32(42).bytes(message.trace_id); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Exemplar { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExemplar(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 7: + if (tag !== 58) { + break; + } + + message.filtered_attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 17) { + break; + } + + message.time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 3: + if (tag !== 25) { + break; + } + + message.as_double = reader.double(); + continue; + case 6: + if (tag !== 49) { + break; + } + + message.as_int = longToString(reader.sfixed64() as Long); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.span_id = reader.bytes(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.trace_id = reader.bytes(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Exemplar { + return { + filtered_attributes: globalThis.Array.isArray(object?.filtered_attributes) + ? object.filtered_attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + time_unix_nano: isSet(object.time_unix_nano) ? globalThis.String(object.time_unix_nano) : "0", + as_double: isSet(object.as_double) ? globalThis.Number(object.as_double) : undefined, + as_int: isSet(object.as_int) ? globalThis.String(object.as_int) : undefined, + span_id: isSet(object.span_id) ? bytesFromBase64(object.span_id) : new Uint8Array(0), + trace_id: isSet(object.trace_id) ? bytesFromBase64(object.trace_id) : new Uint8Array(0), + }; + }, + + toJSON(message: Exemplar): unknown { + const obj: any = {}; + if (message.filtered_attributes?.length) { + obj.filtered_attributes = message.filtered_attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.time_unix_nano !== "0") { + obj.time_unix_nano = message.time_unix_nano; + } + if (message.as_double !== undefined) { + obj.as_double = message.as_double; + } + if (message.as_int !== undefined) { + obj.as_int = message.as_int; + } + if (message.span_id.length !== 0) { + obj.span_id = base64FromBytes(message.span_id); + } + if (message.trace_id.length !== 0) { + obj.trace_id = base64FromBytes(message.trace_id); + } + return obj; + }, + + create, I>>(base?: I): Exemplar { + return Exemplar.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Exemplar { + const message = createBaseExemplar(); + message.filtered_attributes = object.filtered_attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.time_unix_nano = object.time_unix_nano ?? "0"; + message.as_double = object.as_double ?? undefined; + message.as_int = object.as_int ?? undefined; + message.span_id = object.span_id ?? new Uint8Array(0); + message.trace_id = object.trace_id ?? new Uint8Array(0); + return message; + }, +}; + +function bytesFromBase64(b64: string): Uint8Array { + if ((globalThis as any).Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if ((globalThis as any).Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToString(long: Long) { + return long.toString(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/types/opentelemetry/proto/resource/v1/resource.ts b/test/collector/types/opentelemetry/proto/resource/v1/resource.ts new file mode 100644 index 0000000..002c094 --- /dev/null +++ b/test/collector/types/opentelemetry/proto/resource/v1/resource.ts @@ -0,0 +1,114 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import { KeyValue } from "../../common/v1/common"; + +export const protobufPackage = "opentelemetry.proto.resource.v1"; + +/** Resource information. */ +export interface Resource { + /** + * Set of attributes that describe the resource. + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * dropped_attributes_count is the number of dropped attributes. If the value is 0, then + * no attributes were dropped. + */ + dropped_attributes_count: number; +} + +function createBaseResource(): Resource { + return { attributes: [], dropped_attributes_count: 0 }; +} + +export const Resource = { + encode(message: Resource, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.dropped_attributes_count !== 0) { + writer.uint32(16).uint32(message.dropped_attributes_count); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Resource { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseResource(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.dropped_attributes_count = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Resource { + return { + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + dropped_attributes_count: isSet(object.dropped_attributes_count) + ? globalThis.Number(object.dropped_attributes_count) + : 0, + }; + }, + + toJSON(message: Resource): unknown { + const obj: any = {}; + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.dropped_attributes_count !== 0) { + obj.dropped_attributes_count = Math.round(message.dropped_attributes_count); + } + return obj; + }, + + create, I>>(base?: I): Resource { + return Resource.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Resource { + const message = createBaseResource(); + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.dropped_attributes_count = object.dropped_attributes_count ?? 0; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/types/opentelemetry/proto/trace/v1/trace.ts b/test/collector/types/opentelemetry/proto/trace/v1/trace.ts new file mode 100644 index 0000000..bc7c538 --- /dev/null +++ b/test/collector/types/opentelemetry/proto/trace/v1/trace.ts @@ -0,0 +1,1433 @@ +/* eslint-disable */ +import * as _m0 from "protobufjs/minimal"; +import { InstrumentationScope, KeyValue } from "../../common/v1/common"; +import { Resource } from "../../resource/v1/resource"; +import Long = require("long"); + +export const protobufPackage = "opentelemetry.proto.trace.v1"; + +/** + * SpanFlags represents constants used to interpret the + * Span.flags field, which is protobuf 'fixed32' type and is to + * be used as bit-fields. Each non-zero value defined in this enum is + * a bit-mask. To extract the bit-field, for example, use an + * expression like: + * + * (span.flags & SPAN_FLAGS_TRACE_FLAGS_MASK) + * + * See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions. + * + * Note that Span flags were introduced in version 1.1 of the + * OpenTelemetry protocol. Older Span producers do not set this + * field, consequently consumers should not rely on the absence of a + * particular flag bit to indicate the presence of a particular feature. + */ +export enum SpanFlags { + /** + * SPAN_FLAGS_DO_NOT_USE - The zero value for the enum. Should not be used for comparisons. + * Instead use bitwise "and" with the appropriate mask as shown above. + */ + SPAN_FLAGS_DO_NOT_USE = 0, + /** SPAN_FLAGS_TRACE_FLAGS_MASK - Bits 0-7 are used for trace flags. */ + SPAN_FLAGS_TRACE_FLAGS_MASK = 255, + /** + * SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK - Bits 8 and 9 are used to indicate that the parent span or link span is remote. + * Bit 8 (`HAS_IS_REMOTE`) indicates whether the value is known. + * Bit 9 (`IS_REMOTE`) indicates whether the span or link is remote. + */ + SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK = 256, + SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK = 512, + UNRECOGNIZED = -1, +} + +export function spanFlagsFromJSON(object: any): SpanFlags { + switch (object) { + case 0: + case "SPAN_FLAGS_DO_NOT_USE": + return SpanFlags.SPAN_FLAGS_DO_NOT_USE; + case 255: + case "SPAN_FLAGS_TRACE_FLAGS_MASK": + return SpanFlags.SPAN_FLAGS_TRACE_FLAGS_MASK; + case 256: + case "SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK": + return SpanFlags.SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK; + case 512: + case "SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK": + return SpanFlags.SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK; + case -1: + case "UNRECOGNIZED": + default: + return SpanFlags.UNRECOGNIZED; + } +} + +export function spanFlagsToJSON(object: SpanFlags): string { + switch (object) { + case SpanFlags.SPAN_FLAGS_DO_NOT_USE: + return "SPAN_FLAGS_DO_NOT_USE"; + case SpanFlags.SPAN_FLAGS_TRACE_FLAGS_MASK: + return "SPAN_FLAGS_TRACE_FLAGS_MASK"; + case SpanFlags.SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK: + return "SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK"; + case SpanFlags.SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK: + return "SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK"; + case SpanFlags.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * TracesData represents the traces data that can be stored in a persistent storage, + * OR can be embedded by other protocols that transfer OTLP traces data but do + * not implement the OTLP protocol. + * + * The main difference between this message and collector protocol is that + * in this message there will not be any "control" or "metadata" specific to + * OTLP protocol. + * + * When new fields are added into this message, the OTLP request MUST be updated + * as well. + */ +export interface TracesData { + /** + * An array of ResourceSpans. + * For data coming from a single resource this array will typically contain + * one element. Intermediary nodes that receive data from multiple origins + * typically batch the data before forwarding further and in that case this + * array will contain multiple elements. + */ + resource_spans: ResourceSpans[]; +} + +/** A collection of ScopeSpans from a Resource. */ +export interface ResourceSpans { + /** + * The resource for the spans in this message. + * If this field is not set then no resource info is known. + */ + resource: + | Resource + | undefined; + /** A list of ScopeSpans that originate from a resource. */ + scope_spans: ScopeSpans[]; + /** + * The Schema URL, if known. This is the identifier of the Schema that the resource data + * is recorded in. To learn more about Schema URL see + * https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + * This schema_url applies to the data in the "resource" field. It does not apply + * to the data in the "scope_spans" field which have their own schema_url field. + */ + schema_url: string; +} + +/** A collection of Spans produced by an InstrumentationScope. */ +export interface ScopeSpans { + /** + * The instrumentation scope information for the spans in this message. + * Semantically when InstrumentationScope isn't set, it is equivalent with + * an empty instrumentation scope name (unknown). + */ + scope: + | InstrumentationScope + | undefined; + /** A list of Spans that originate from an instrumentation scope. */ + spans: Span[]; + /** + * The Schema URL, if known. This is the identifier of the Schema that the span data + * is recorded in. To learn more about Schema URL see + * https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + * This schema_url applies to all spans and span events in the "spans" field. + */ + schema_url: string; +} + +/** + * A Span represents a single operation performed by a single component of the system. + * + * The next available field id is 17. + */ +export interface Span { + /** + * A unique identifier for a trace. All spans from the same trace share + * the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + * of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + * is zero-length and thus is also invalid). + * + * This field is required. + */ + trace_id: Uint8Array; + /** + * A unique identifier for a span within a trace, assigned when the span + * is created. The ID is an 8-byte array. An ID with all zeroes OR of length + * other than 8 bytes is considered invalid (empty string in OTLP/JSON + * is zero-length and thus is also invalid). + * + * This field is required. + */ + span_id: Uint8Array; + /** + * trace_state conveys information about request position in multiple distributed tracing graphs. + * It is a trace_state in w3c-trace-context format: https://www.w3.org/TR/trace-context/#tracestate-header + * See also https://github.com/w3c/distributed-tracing for more details about this field. + */ + trace_state: string; + /** + * The `span_id` of this span's parent span. If this is a root span, then this + * field must be empty. The ID is an 8-byte array. + */ + parent_span_id: Uint8Array; + /** + * Flags, a bit field. + * + * Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace + * Context specification. To read the 8-bit W3C trace flag, use + * `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`. + * + * See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions. + * + * Bits 8 and 9 represent the 3 states of whether a span's parent + * is remote. The states are (unknown, is not remote, is remote). + * To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`. + * To read whether the span is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`. + * + * When creating span messages, if the message is logically forwarded from another source + * with an equivalent flags fields (i.e., usually another OTLP span message), the field SHOULD + * be copied as-is. If creating from a source that does not have an equivalent flags field + * (such as a runtime representation of an OpenTelemetry span), the high 22 bits MUST + * be set to zero. + * Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero. + * + * [Optional]. + */ + flags: number; + /** + * A description of the span's operation. + * + * For example, the name can be a qualified method name or a file name + * and a line number where the operation is called. A best practice is to use + * the same display name at the same call point in an application. + * This makes it easier to correlate spans in different traces. + * + * This field is semantically required to be set to non-empty string. + * Empty value is equivalent to an unknown span name. + * + * This field is required. + */ + name: string; + /** + * Distinguishes between spans generated in a particular context. For example, + * two spans with the same name may be distinguished using `CLIENT` (caller) + * and `SERVER` (callee) to identify queueing latency associated with the span. + */ + kind: Span_SpanKind; + /** + * start_time_unix_nano is the start time of the span. On the client side, this is the time + * kept by the local machine where the span execution starts. On the server side, this + * is the time when the server's application handler starts running. + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + * + * This field is semantically required and it is expected that end_time >= start_time. + */ + start_time_unix_nano: string; + /** + * end_time_unix_nano is the end time of the span. On the client side, this is the time + * kept by the local machine where the span execution ends. On the server side, this + * is the time when the server application handler stops running. + * Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + * + * This field is semantically required and it is expected that end_time >= start_time. + */ + end_time_unix_nano: string; + /** + * attributes is a collection of key/value pairs. Note, global attributes + * like server name can be set using the resource API. Examples of attributes: + * + * "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" + * "/http/server_latency": 300 + * "example.com/myattribute": true + * "example.com/score": 10.239 + * + * The OpenTelemetry API specification further restricts the allowed value types: + * https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/README.md#attribute + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * dropped_attributes_count is the number of attributes that were discarded. Attributes + * can be discarded because their keys are too long or because there are too many + * attributes. If this value is 0, then no attributes were dropped. + */ + dropped_attributes_count: number; + /** events is a collection of Event items. */ + events: Span_Event[]; + /** + * dropped_events_count is the number of dropped events. If the value is 0, then no + * events were dropped. + */ + dropped_events_count: number; + /** + * links is a collection of Links, which are references from this span to a span + * in the same or different trace. + */ + links: Span_Link[]; + /** + * dropped_links_count is the number of dropped links after the maximum size was + * enforced. If this value is 0, then no links were dropped. + */ + dropped_links_count: number; + /** + * An optional final status for this span. Semantically when Status isn't set, it means + * span's status code is unset, i.e. assume STATUS_CODE_UNSET (code = 0). + */ + status: Status | undefined; +} + +/** + * SpanKind is the type of span. Can be used to specify additional relationships between spans + * in addition to a parent/child relationship. + */ +export enum Span_SpanKind { + /** + * SPAN_KIND_UNSPECIFIED - Unspecified. Do NOT use as default. + * Implementations MAY assume SpanKind to be INTERNAL when receiving UNSPECIFIED. + */ + SPAN_KIND_UNSPECIFIED = 0, + /** + * SPAN_KIND_INTERNAL - Indicates that the span represents an internal operation within an application, + * as opposed to an operation happening at the boundaries. Default value. + */ + SPAN_KIND_INTERNAL = 1, + /** + * SPAN_KIND_SERVER - Indicates that the span covers server-side handling of an RPC or other + * remote network request. + */ + SPAN_KIND_SERVER = 2, + /** SPAN_KIND_CLIENT - Indicates that the span describes a request to some remote service. */ + SPAN_KIND_CLIENT = 3, + /** + * SPAN_KIND_PRODUCER - Indicates that the span describes a producer sending a message to a broker. + * Unlike CLIENT and SERVER, there is often no direct critical path latency relationship + * between producer and consumer spans. A PRODUCER span ends when the message was accepted + * by the broker while the logical processing of the message might span a much longer time. + */ + SPAN_KIND_PRODUCER = 4, + /** + * SPAN_KIND_CONSUMER - Indicates that the span describes consumer receiving a message from a broker. + * Like the PRODUCER kind, there is often no direct critical path latency relationship + * between producer and consumer spans. + */ + SPAN_KIND_CONSUMER = 5, + UNRECOGNIZED = -1, +} + +export function span_SpanKindFromJSON(object: any): Span_SpanKind { + switch (object) { + case 0: + case "SPAN_KIND_UNSPECIFIED": + return Span_SpanKind.SPAN_KIND_UNSPECIFIED; + case 1: + case "SPAN_KIND_INTERNAL": + return Span_SpanKind.SPAN_KIND_INTERNAL; + case 2: + case "SPAN_KIND_SERVER": + return Span_SpanKind.SPAN_KIND_SERVER; + case 3: + case "SPAN_KIND_CLIENT": + return Span_SpanKind.SPAN_KIND_CLIENT; + case 4: + case "SPAN_KIND_PRODUCER": + return Span_SpanKind.SPAN_KIND_PRODUCER; + case 5: + case "SPAN_KIND_CONSUMER": + return Span_SpanKind.SPAN_KIND_CONSUMER; + case -1: + case "UNRECOGNIZED": + default: + return Span_SpanKind.UNRECOGNIZED; + } +} + +export function span_SpanKindToJSON(object: Span_SpanKind): string { + switch (object) { + case Span_SpanKind.SPAN_KIND_UNSPECIFIED: + return "SPAN_KIND_UNSPECIFIED"; + case Span_SpanKind.SPAN_KIND_INTERNAL: + return "SPAN_KIND_INTERNAL"; + case Span_SpanKind.SPAN_KIND_SERVER: + return "SPAN_KIND_SERVER"; + case Span_SpanKind.SPAN_KIND_CLIENT: + return "SPAN_KIND_CLIENT"; + case Span_SpanKind.SPAN_KIND_PRODUCER: + return "SPAN_KIND_PRODUCER"; + case Span_SpanKind.SPAN_KIND_CONSUMER: + return "SPAN_KIND_CONSUMER"; + case Span_SpanKind.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * Event is a time-stamped annotation of the span, consisting of user-supplied + * text description and key-value pairs. + */ +export interface Span_Event { + /** time_unix_nano is the time the event occurred. */ + time_unix_nano: string; + /** + * name of the event. + * This field is semantically required to be set to non-empty string. + */ + name: string; + /** + * attributes is a collection of attribute key/value pairs on the event. + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * dropped_attributes_count is the number of dropped attributes. If the value is 0, + * then no attributes were dropped. + */ + dropped_attributes_count: number; +} + +/** + * A pointer from the current span to another span in the same trace or in a + * different trace. For example, this can be used in batching operations, + * where a single batch handler processes multiple requests from different + * traces or when the handler receives a request from a different project. + */ +export interface Span_Link { + /** + * A unique identifier of a trace that this linked span is part of. The ID is a + * 16-byte array. + */ + trace_id: Uint8Array; + /** A unique identifier for the linked span. The ID is an 8-byte array. */ + span_id: Uint8Array; + /** The trace_state associated with the link. */ + trace_state: string; + /** + * attributes is a collection of attribute key/value pairs on the link. + * Attribute keys MUST be unique (it is not allowed to have more than one + * attribute with the same key). + */ + attributes: KeyValue[]; + /** + * dropped_attributes_count is the number of dropped attributes. If the value is 0, + * then no attributes were dropped. + */ + dropped_attributes_count: number; + /** + * Flags, a bit field. + * + * Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace + * Context specification. To read the 8-bit W3C trace flag, use + * `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`. + * + * See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions. + * + * Bits 8 and 9 represent the 3 states of whether the link is remote. + * The states are (unknown, is not remote, is remote). + * To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`. + * To read whether the link is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`. + * + * Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero. + * When creating new spans, bits 10-31 (most-significant 22-bits) MUST be zero. + * + * [Optional]. + */ + flags: number; +} + +/** + * The Status type defines a logical error model that is suitable for different + * programming environments, including REST APIs and RPC APIs. + */ +export interface Status { + /** A developer-facing human readable error message. */ + message: string; + /** The status code. */ + code: Status_StatusCode; +} + +/** + * For the semantics of status codes see + * https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#set-status + */ +export enum Status_StatusCode { + /** STATUS_CODE_UNSET - The default status. */ + STATUS_CODE_UNSET = 0, + /** + * STATUS_CODE_OK - The Span has been validated by an Application developer or Operator to + * have completed successfully. + */ + STATUS_CODE_OK = 1, + /** STATUS_CODE_ERROR - The Span contains an error. */ + STATUS_CODE_ERROR = 2, + UNRECOGNIZED = -1, +} + +export function status_StatusCodeFromJSON(object: any): Status_StatusCode { + switch (object) { + case 0: + case "STATUS_CODE_UNSET": + return Status_StatusCode.STATUS_CODE_UNSET; + case 1: + case "STATUS_CODE_OK": + return Status_StatusCode.STATUS_CODE_OK; + case 2: + case "STATUS_CODE_ERROR": + return Status_StatusCode.STATUS_CODE_ERROR; + case -1: + case "UNRECOGNIZED": + default: + return Status_StatusCode.UNRECOGNIZED; + } +} + +export function status_StatusCodeToJSON(object: Status_StatusCode): string { + switch (object) { + case Status_StatusCode.STATUS_CODE_UNSET: + return "STATUS_CODE_UNSET"; + case Status_StatusCode.STATUS_CODE_OK: + return "STATUS_CODE_OK"; + case Status_StatusCode.STATUS_CODE_ERROR: + return "STATUS_CODE_ERROR"; + case Status_StatusCode.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +function createBaseTracesData(): TracesData { + return { resource_spans: [] }; +} + +export const TracesData = { + encode(message: TracesData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.resource_spans) { + ResourceSpans.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TracesData { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTracesData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource_spans.push(ResourceSpans.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TracesData { + return { + resource_spans: globalThis.Array.isArray(object?.resource_spans) + ? object.resource_spans.map((e: any) => ResourceSpans.fromJSON(e)) + : [], + }; + }, + + toJSON(message: TracesData): unknown { + const obj: any = {}; + if (message.resource_spans?.length) { + obj.resource_spans = message.resource_spans.map((e) => ResourceSpans.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): TracesData { + return TracesData.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): TracesData { + const message = createBaseTracesData(); + message.resource_spans = object.resource_spans?.map((e) => ResourceSpans.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseResourceSpans(): ResourceSpans { + return { resource: undefined, scope_spans: [], schema_url: "" }; +} + +export const ResourceSpans = { + encode(message: ResourceSpans, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.resource !== undefined) { + Resource.encode(message.resource, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.scope_spans) { + ScopeSpans.encode(v!, writer.uint32(18).fork()).ldelim(); + } + if (message.schema_url !== "") { + writer.uint32(26).string(message.schema_url); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ResourceSpans { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseResourceSpans(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.resource = Resource.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.scope_spans.push(ScopeSpans.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.schema_url = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ResourceSpans { + return { + resource: isSet(object.resource) ? Resource.fromJSON(object.resource) : undefined, + scope_spans: globalThis.Array.isArray(object?.scope_spans) + ? object.scope_spans.map((e: any) => ScopeSpans.fromJSON(e)) + : [], + schema_url: isSet(object.schema_url) ? globalThis.String(object.schema_url) : "", + }; + }, + + toJSON(message: ResourceSpans): unknown { + const obj: any = {}; + if (message.resource !== undefined) { + obj.resource = Resource.toJSON(message.resource); + } + if (message.scope_spans?.length) { + obj.scope_spans = message.scope_spans.map((e) => ScopeSpans.toJSON(e)); + } + if (message.schema_url !== "") { + obj.schema_url = message.schema_url; + } + return obj; + }, + + create, I>>(base?: I): ResourceSpans { + return ResourceSpans.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ResourceSpans { + const message = createBaseResourceSpans(); + message.resource = (object.resource !== undefined && object.resource !== null) + ? Resource.fromPartial(object.resource) + : undefined; + message.scope_spans = object.scope_spans?.map((e) => ScopeSpans.fromPartial(e)) || []; + message.schema_url = object.schema_url ?? ""; + return message; + }, +}; + +function createBaseScopeSpans(): ScopeSpans { + return { scope: undefined, spans: [], schema_url: "" }; +} + +export const ScopeSpans = { + encode(message: ScopeSpans, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.scope !== undefined) { + InstrumentationScope.encode(message.scope, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.spans) { + Span.encode(v!, writer.uint32(18).fork()).ldelim(); + } + if (message.schema_url !== "") { + writer.uint32(26).string(message.schema_url); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ScopeSpans { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseScopeSpans(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.scope = InstrumentationScope.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.spans.push(Span.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.schema_url = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ScopeSpans { + return { + scope: isSet(object.scope) ? InstrumentationScope.fromJSON(object.scope) : undefined, + spans: globalThis.Array.isArray(object?.spans) ? object.spans.map((e: any) => Span.fromJSON(e)) : [], + schema_url: isSet(object.schema_url) ? globalThis.String(object.schema_url) : "", + }; + }, + + toJSON(message: ScopeSpans): unknown { + const obj: any = {}; + if (message.scope !== undefined) { + obj.scope = InstrumentationScope.toJSON(message.scope); + } + if (message.spans?.length) { + obj.spans = message.spans.map((e) => Span.toJSON(e)); + } + if (message.schema_url !== "") { + obj.schema_url = message.schema_url; + } + return obj; + }, + + create, I>>(base?: I): ScopeSpans { + return ScopeSpans.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ScopeSpans { + const message = createBaseScopeSpans(); + message.scope = (object.scope !== undefined && object.scope !== null) + ? InstrumentationScope.fromPartial(object.scope) + : undefined; + message.spans = object.spans?.map((e) => Span.fromPartial(e)) || []; + message.schema_url = object.schema_url ?? ""; + return message; + }, +}; + +function createBaseSpan(): Span { + return { + trace_id: new Uint8Array(0), + span_id: new Uint8Array(0), + trace_state: "", + parent_span_id: new Uint8Array(0), + flags: 0, + name: "", + kind: 0, + start_time_unix_nano: "0", + end_time_unix_nano: "0", + attributes: [], + dropped_attributes_count: 0, + events: [], + dropped_events_count: 0, + links: [], + dropped_links_count: 0, + status: undefined, + }; +} + +export const Span = { + encode(message: Span, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.trace_id.length !== 0) { + writer.uint32(10).bytes(message.trace_id); + } + if (message.span_id.length !== 0) { + writer.uint32(18).bytes(message.span_id); + } + if (message.trace_state !== "") { + writer.uint32(26).string(message.trace_state); + } + if (message.parent_span_id.length !== 0) { + writer.uint32(34).bytes(message.parent_span_id); + } + if (message.flags !== 0) { + writer.uint32(133).fixed32(message.flags); + } + if (message.name !== "") { + writer.uint32(42).string(message.name); + } + if (message.kind !== 0) { + writer.uint32(48).int32(message.kind); + } + if (message.start_time_unix_nano !== "0") { + writer.uint32(57).fixed64(message.start_time_unix_nano); + } + if (message.end_time_unix_nano !== "0") { + writer.uint32(65).fixed64(message.end_time_unix_nano); + } + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(74).fork()).ldelim(); + } + if (message.dropped_attributes_count !== 0) { + writer.uint32(80).uint32(message.dropped_attributes_count); + } + for (const v of message.events) { + Span_Event.encode(v!, writer.uint32(90).fork()).ldelim(); + } + if (message.dropped_events_count !== 0) { + writer.uint32(96).uint32(message.dropped_events_count); + } + for (const v of message.links) { + Span_Link.encode(v!, writer.uint32(106).fork()).ldelim(); + } + if (message.dropped_links_count !== 0) { + writer.uint32(112).uint32(message.dropped_links_count); + } + if (message.status !== undefined) { + Status.encode(message.status, writer.uint32(122).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Span { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSpan(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.trace_id = reader.bytes(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.span_id = reader.bytes(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.trace_state = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.parent_span_id = reader.bytes(); + continue; + case 16: + if (tag !== 133) { + break; + } + + message.flags = reader.fixed32(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.name = reader.string(); + continue; + case 6: + if (tag !== 48) { + break; + } + + message.kind = reader.int32() as any; + continue; + case 7: + if (tag !== 57) { + break; + } + + message.start_time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 8: + if (tag !== 65) { + break; + } + + message.end_time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 9: + if (tag !== 74) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 10: + if (tag !== 80) { + break; + } + + message.dropped_attributes_count = reader.uint32(); + continue; + case 11: + if (tag !== 90) { + break; + } + + message.events.push(Span_Event.decode(reader, reader.uint32())); + continue; + case 12: + if (tag !== 96) { + break; + } + + message.dropped_events_count = reader.uint32(); + continue; + case 13: + if (tag !== 106) { + break; + } + + message.links.push(Span_Link.decode(reader, reader.uint32())); + continue; + case 14: + if (tag !== 112) { + break; + } + + message.dropped_links_count = reader.uint32(); + continue; + case 15: + if (tag !== 122) { + break; + } + + message.status = Status.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Span { + return { + trace_id: isSet(object.trace_id) ? bytesFromBase64(object.trace_id) : new Uint8Array(0), + span_id: isSet(object.span_id) ? bytesFromBase64(object.span_id) : new Uint8Array(0), + trace_state: isSet(object.trace_state) ? globalThis.String(object.trace_state) : "", + parent_span_id: isSet(object.parent_span_id) ? bytesFromBase64(object.parent_span_id) : new Uint8Array(0), + flags: isSet(object.flags) ? globalThis.Number(object.flags) : 0, + name: isSet(object.name) ? globalThis.String(object.name) : "", + kind: isSet(object.kind) ? span_SpanKindFromJSON(object.kind) : 0, + start_time_unix_nano: isSet(object.start_time_unix_nano) ? globalThis.String(object.start_time_unix_nano) : "0", + end_time_unix_nano: isSet(object.end_time_unix_nano) ? globalThis.String(object.end_time_unix_nano) : "0", + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + dropped_attributes_count: isSet(object.dropped_attributes_count) + ? globalThis.Number(object.dropped_attributes_count) + : 0, + events: globalThis.Array.isArray(object?.events) ? object.events.map((e: any) => Span_Event.fromJSON(e)) : [], + dropped_events_count: isSet(object.dropped_events_count) ? globalThis.Number(object.dropped_events_count) : 0, + links: globalThis.Array.isArray(object?.links) ? object.links.map((e: any) => Span_Link.fromJSON(e)) : [], + dropped_links_count: isSet(object.dropped_links_count) ? globalThis.Number(object.dropped_links_count) : 0, + status: isSet(object.status) ? Status.fromJSON(object.status) : undefined, + }; + }, + + toJSON(message: Span): unknown { + const obj: any = {}; + if (message.trace_id.length !== 0) { + obj.trace_id = base64FromBytes(message.trace_id); + } + if (message.span_id.length !== 0) { + obj.span_id = base64FromBytes(message.span_id); + } + if (message.trace_state !== "") { + obj.trace_state = message.trace_state; + } + if (message.parent_span_id.length !== 0) { + obj.parent_span_id = base64FromBytes(message.parent_span_id); + } + if (message.flags !== 0) { + obj.flags = Math.round(message.flags); + } + if (message.name !== "") { + obj.name = message.name; + } + if (message.kind !== 0) { + obj.kind = span_SpanKindToJSON(message.kind); + } + if (message.start_time_unix_nano !== "0") { + obj.start_time_unix_nano = message.start_time_unix_nano; + } + if (message.end_time_unix_nano !== "0") { + obj.end_time_unix_nano = message.end_time_unix_nano; + } + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.dropped_attributes_count !== 0) { + obj.dropped_attributes_count = Math.round(message.dropped_attributes_count); + } + if (message.events?.length) { + obj.events = message.events.map((e) => Span_Event.toJSON(e)); + } + if (message.dropped_events_count !== 0) { + obj.dropped_events_count = Math.round(message.dropped_events_count); + } + if (message.links?.length) { + obj.links = message.links.map((e) => Span_Link.toJSON(e)); + } + if (message.dropped_links_count !== 0) { + obj.dropped_links_count = Math.round(message.dropped_links_count); + } + if (message.status !== undefined) { + obj.status = Status.toJSON(message.status); + } + return obj; + }, + + create, I>>(base?: I): Span { + return Span.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Span { + const message = createBaseSpan(); + message.trace_id = object.trace_id ?? new Uint8Array(0); + message.span_id = object.span_id ?? new Uint8Array(0); + message.trace_state = object.trace_state ?? ""; + message.parent_span_id = object.parent_span_id ?? new Uint8Array(0); + message.flags = object.flags ?? 0; + message.name = object.name ?? ""; + message.kind = object.kind ?? 0; + message.start_time_unix_nano = object.start_time_unix_nano ?? "0"; + message.end_time_unix_nano = object.end_time_unix_nano ?? "0"; + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.dropped_attributes_count = object.dropped_attributes_count ?? 0; + message.events = object.events?.map((e) => Span_Event.fromPartial(e)) || []; + message.dropped_events_count = object.dropped_events_count ?? 0; + message.links = object.links?.map((e) => Span_Link.fromPartial(e)) || []; + message.dropped_links_count = object.dropped_links_count ?? 0; + message.status = (object.status !== undefined && object.status !== null) + ? Status.fromPartial(object.status) + : undefined; + return message; + }, +}; + +function createBaseSpan_Event(): Span_Event { + return { time_unix_nano: "0", name: "", attributes: [], dropped_attributes_count: 0 }; +} + +export const Span_Event = { + encode(message: Span_Event, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.time_unix_nano !== "0") { + writer.uint32(9).fixed64(message.time_unix_nano); + } + if (message.name !== "") { + writer.uint32(18).string(message.name); + } + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(26).fork()).ldelim(); + } + if (message.dropped_attributes_count !== 0) { + writer.uint32(32).uint32(message.dropped_attributes_count); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Span_Event { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSpan_Event(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 9) { + break; + } + + message.time_unix_nano = longToString(reader.fixed64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.name = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.dropped_attributes_count = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Span_Event { + return { + time_unix_nano: isSet(object.time_unix_nano) ? globalThis.String(object.time_unix_nano) : "0", + name: isSet(object.name) ? globalThis.String(object.name) : "", + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + dropped_attributes_count: isSet(object.dropped_attributes_count) + ? globalThis.Number(object.dropped_attributes_count) + : 0, + }; + }, + + toJSON(message: Span_Event): unknown { + const obj: any = {}; + if (message.time_unix_nano !== "0") { + obj.time_unix_nano = message.time_unix_nano; + } + if (message.name !== "") { + obj.name = message.name; + } + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.dropped_attributes_count !== 0) { + obj.dropped_attributes_count = Math.round(message.dropped_attributes_count); + } + return obj; + }, + + create, I>>(base?: I): Span_Event { + return Span_Event.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Span_Event { + const message = createBaseSpan_Event(); + message.time_unix_nano = object.time_unix_nano ?? "0"; + message.name = object.name ?? ""; + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.dropped_attributes_count = object.dropped_attributes_count ?? 0; + return message; + }, +}; + +function createBaseSpan_Link(): Span_Link { + return { + trace_id: new Uint8Array(0), + span_id: new Uint8Array(0), + trace_state: "", + attributes: [], + dropped_attributes_count: 0, + flags: 0, + }; +} + +export const Span_Link = { + encode(message: Span_Link, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.trace_id.length !== 0) { + writer.uint32(10).bytes(message.trace_id); + } + if (message.span_id.length !== 0) { + writer.uint32(18).bytes(message.span_id); + } + if (message.trace_state !== "") { + writer.uint32(26).string(message.trace_state); + } + for (const v of message.attributes) { + KeyValue.encode(v!, writer.uint32(34).fork()).ldelim(); + } + if (message.dropped_attributes_count !== 0) { + writer.uint32(40).uint32(message.dropped_attributes_count); + } + if (message.flags !== 0) { + writer.uint32(53).fixed32(message.flags); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Span_Link { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSpan_Link(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.trace_id = reader.bytes(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.span_id = reader.bytes(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.trace_state = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.attributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + case 5: + if (tag !== 40) { + break; + } + + message.dropped_attributes_count = reader.uint32(); + continue; + case 6: + if (tag !== 53) { + break; + } + + message.flags = reader.fixed32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Span_Link { + return { + trace_id: isSet(object.trace_id) ? bytesFromBase64(object.trace_id) : new Uint8Array(0), + span_id: isSet(object.span_id) ? bytesFromBase64(object.span_id) : new Uint8Array(0), + trace_state: isSet(object.trace_state) ? globalThis.String(object.trace_state) : "", + attributes: globalThis.Array.isArray(object?.attributes) + ? object.attributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + dropped_attributes_count: isSet(object.dropped_attributes_count) + ? globalThis.Number(object.dropped_attributes_count) + : 0, + flags: isSet(object.flags) ? globalThis.Number(object.flags) : 0, + }; + }, + + toJSON(message: Span_Link): unknown { + const obj: any = {}; + if (message.trace_id.length !== 0) { + obj.trace_id = base64FromBytes(message.trace_id); + } + if (message.span_id.length !== 0) { + obj.span_id = base64FromBytes(message.span_id); + } + if (message.trace_state !== "") { + obj.trace_state = message.trace_state; + } + if (message.attributes?.length) { + obj.attributes = message.attributes.map((e) => KeyValue.toJSON(e)); + } + if (message.dropped_attributes_count !== 0) { + obj.dropped_attributes_count = Math.round(message.dropped_attributes_count); + } + if (message.flags !== 0) { + obj.flags = Math.round(message.flags); + } + return obj; + }, + + create, I>>(base?: I): Span_Link { + return Span_Link.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Span_Link { + const message = createBaseSpan_Link(); + message.trace_id = object.trace_id ?? new Uint8Array(0); + message.span_id = object.span_id ?? new Uint8Array(0); + message.trace_state = object.trace_state ?? ""; + message.attributes = object.attributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.dropped_attributes_count = object.dropped_attributes_count ?? 0; + message.flags = object.flags ?? 0; + return message; + }, +}; + +function createBaseStatus(): Status { + return { message: "", code: 0 }; +} + +export const Status = { + encode(message: Status, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.message !== "") { + writer.uint32(18).string(message.message); + } + if (message.code !== 0) { + writer.uint32(24).int32(message.code); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Status { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStatus(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: + if (tag !== 18) { + break; + } + + message.message = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.code = reader.int32() as any; + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Status { + return { + message: isSet(object.message) ? globalThis.String(object.message) : "", + code: isSet(object.code) ? status_StatusCodeFromJSON(object.code) : 0, + }; + }, + + toJSON(message: Status): unknown { + const obj: any = {}; + if (message.message !== "") { + obj.message = message.message; + } + if (message.code !== 0) { + obj.code = status_StatusCodeToJSON(message.code); + } + return obj; + }, + + create, I>>(base?: I): Status { + return Status.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Status { + const message = createBaseStatus(); + message.message = object.message ?? ""; + message.code = object.code ?? 0; + return message; + }, +}; + +function bytesFromBase64(b64: string): Uint8Array { + if ((globalThis as any).Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if ((globalThis as any).Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToString(long: Long) { + return long.toString(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/collector/util.ts b/test/collector/util.ts new file mode 100644 index 0000000..59456e2 --- /dev/null +++ b/test/collector/util.ts @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +export function readPort(envVar: string, defaultPort: number): number { + let port: number | undefined; + const envVarValue = process.env[envVar]; + if (envVarValue != null) { + port = parseInt(envVarValue, 10); + } + if (port == null) { + return defaultPort; + } + return port; +} diff --git a/test/integration/ChildProcessWrapper.ts b/test/integration/ChildProcessWrapper.ts new file mode 100644 index 0000000..8cbc6e0 --- /dev/null +++ b/test/integration/ChildProcessWrapper.ts @@ -0,0 +1,139 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { ChildProcess, fork, ForkOptions } from 'node:child_process'; +import EventEmitter from 'node:events'; +import waitUntil, { RetryOptions } from '../util/waitUntil'; + +export interface ChildProcessWrapperOptions { + path: string; + label?: string; + useTsNode?: boolean; + useDistro?: boolean; + emulateKubernetesPodUid?: boolean; + args?: string[]; + env?: { [key: string]: string }; + waitForReadyRetryOptions?: RetryOptions; +} + +export default class ChildProcessWrapper { + private childProcess?: ChildProcess; + private ready: boolean; + private options: ChildProcessWrapperOptions; + private nextIpcRequestId: number; + private responseEmitter: ResponseEmitter; + + constructor(options: ChildProcessWrapperOptions) { + this.options = options; + if (!this.options.label) { + this.options.label = this.options.path; + } + this.ready = false; + this.nextIpcRequestId = 0; + this.responseEmitter = new ResponseEmitter(); + } + + async start() { + const forkOptions = this.createForkOptions(); + this.childProcess = fork(this.options.path, this.options.args ?? [], forkOptions); + this.listenToIpcMessages(); + this.echoOutputStreams(); + await this.waitUntilReady(); + } + + private createForkOptions() { + const forkOptions: ForkOptions = { + stdio: ['inherit', 'pipe', 'pipe', 'ipc'], + }; + if (this.options.useTsNode) { + this.addExecArgvs(forkOptions, '--require', 'ts-node/register'); + } + if (this.options.emulateKubernetesPodUid) { + this.addExecArgvs(forkOptions, '--require', './test/integration/emulateKubernetes'); + } + if (this.options.useDistro) { + this.addExecArgvs(forkOptions, '--require', './src'); + } + if (this.options.env) { + forkOptions.env = this.options.env; + } + return forkOptions; + } + + private addExecArgvs(forkOptions: ForkOptions, ...execArgvs: string[]) { + if (forkOptions.execArgv) { + forkOptions.execArgv = forkOptions.execArgv.concat(execArgvs); + } else { + forkOptions.execArgv = execArgvs; + } + } + + private listenToIpcMessages() { + this.childProcess?.on('message', message => { + if (typeof message === 'string' && message === 'ready') { + this.ready = true; + } else if (typeof message === 'object') { + this.processIpcResponse(message); + } else { + console.error('Unexpected message from child process:', message); + } + }); + } + + private echoOutputStreams() { + this.childProcess?.stdout?.on('data', data => { + console.log(`${this.options.label}(${this.childProcess?.pid}):\t${data}`); + }); + this.childProcess?.stderr?.on('data', data => { + console.error(`${this.options.label}(${this.childProcess?.pid}):\t${data}`); + }); + } + + async waitUntilReady() { + await waitUntil(() => { + if (!this.ready) { + throw new Error('Child process has not started.'); + } + }, this.options.waitForReadyRetryOptions); + } + + async stop(): Promise { + if (!this.childProcess) { + return; + } + + return new Promise(resolve => { + if (this.childProcess) { + this.childProcess.once('exit', () => { + this.childProcess = undefined; + resolve(); + }); + this.childProcess.kill(); + } + }); + } + + async sendRequest(message: object): Promise { + return new Promise(resolve => { + const requestId = this.nextIpcRequestId++; + this.childProcess?.send({ + id: requestId, + ...message, + }); + const eventName = String(requestId); + this.responseEmitter.once(eventName, response => { + resolve(response); + }); + }); + } + + private processIpcResponse(message: any) { + if (message.id == null) { + console.error('Unexpected IPC message from child process:', message); + return; + } + this.responseEmitter.emit(message.id, message); + } +} + +class ResponseEmitter extends EventEmitter {} diff --git a/test/integration/emulateKubernetes.ts b/test/integration/emulateKubernetes.ts new file mode 100644 index 0000000..d7466fe --- /dev/null +++ b/test/integration/emulateKubernetes.ts @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import fs from 'node:fs/promises'; +import sinon from 'sinon'; + +const sandbox = sinon.createSandbox(); +const readFileStub = sandbox.stub(fs, 'readFile'); +stubFile('/etc/hosts', '# Kubernetes-managed hosts file.\n127.0.0.1\tlocalhost'); +stubFile( + '/proc/self/cgroup', + '11:memory:/kubepods.slice/kubepods-podf57400dc_94ce_4806_a52e_d2726f448f15.slice/cri-containerd-44f639a16a22e394061fb35d2138ef9391c2131db9bf5ae742ef4e447e824887.scope', +); + +function stubFile(filename: string, content: string) { + readFileStub.withArgs(filename).returns(Promise.resolve(content)); +} diff --git a/test/integration/rootHooks.ts b/test/integration/rootHooks.ts new file mode 100644 index 0000000..da7dfcc --- /dev/null +++ b/test/integration/rootHooks.ts @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import CollectorChildProcessWrapper from '../collector/CollectorChildProcessWrapper'; + +let collectorInstance: CollectorChildProcessWrapper; + +export function collector() { + return collectorInstance; +} + +export const mochaHooks = { + async beforeAll() { + collectorInstance = new CollectorChildProcessWrapper({ + path: 'test/collector/index.ts', + label: 'collector', + useTsNode: true, + }); + console.debug('[rootHooks] starting global mock collector'); + await collectorInstance.start(); + console.debug('[rootHooks] global mock collector started'); + }, + + async afterAll() { + console.debug('[rootHooks] stopping global mock collector'); + await collectorInstance.stop(); + console.debug('[rootHooks] global mock collector stopped'); + }, +}; diff --git a/test/integration/test.ts b/test/integration/test.ts new file mode 100644 index 0000000..2374bca --- /dev/null +++ b/test/integration/test.ts @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { SpanKind } from '@opentelemetry/api'; +import { expect } from 'chai'; +import { readFile } from 'node:fs/promises'; +import { expectResourceAttribute, expectSpanAttribute } from '../util/expectAttribute'; +import { expectMatchingSpan } from '../util/expectMatchingSpan'; +import runCommand from '../util/runCommand'; +import waitUntil from '../util/waitUntil'; +import ChildProcessWrapper, { ChildProcessWrapperOptions } from './ChildProcessWrapper'; +import { collector } from './rootHooks'; + +const appPort = 1302; +let expectedDistroVersion: number; + +describe('attach', () => { + before(async () => { + await runCommand('npm ci', 'test/apps/express-typescript'); + expectedDistroVersion = JSON.parse(String(await readFile('package.json'))).version; + }); + + describe('tracing', () => { + let appUnderTest: ChildProcessWrapper; + + before(async () => { + const appConfiguration = defaultAppConfiguration(); + appUnderTest = new ChildProcessWrapper(appConfiguration); + await appUnderTest.start(); + }); + + after(async () => { + await appUnderTest.stop(); + }); + + it('should attach via --require and collect capture spans', async () => { + await waitUntil(async () => { + const telemetry = await waitForTelemetry(); + expectMatchingSpan( + telemetry.traces, + [ + resource => expectResourceAttribute(resource, 'telemetry.sdk.name', 'opentelemetry'), + resource => expectResourceAttribute(resource, 'telemetry.sdk.language', 'nodejs'), + resource => expectResourceAttribute(resource, 'telemetry.distro.name', 'dash0-nodejs'), + resource => expectResourceAttribute(resource, 'telemetry.distro.version', expectedDistroVersion), + ], + [ + span => expect(span.kind).to.equal(SpanKind.SERVER), + span => expectSpanAttribute(span, 'http.route', '/ohai'), + ], + ); + }); + }); + }); + + describe('pod uid detection', () => { + let appUnderTest: ChildProcessWrapper; + + before(async () => { + const appConfiguration = defaultAppConfiguration(); + appConfiguration.emulateKubernetesPodUid = true; + appUnderTest = new ChildProcessWrapper(appConfiguration); + await appUnderTest.start(); + }); + + after(async () => { + await appUnderTest.stop(); + }); + + it('should attach via --require and detect the pod uid', async () => { + await waitUntil(async () => { + const telemetry = await waitForTelemetry(); + expectMatchingSpan( + telemetry.traces, + [resource => expectResourceAttribute(resource, 'k8s.pod.uid', 'f57400dc-94ce-4806-a52e-d2726f448f15')], + [ + span => expect(span.kind).to.equal(SpanKind.SERVER), + span => expectSpanAttribute(span, 'http.route', '/ohai'), + ], + ); + }); + }); + }); + + function defaultAppConfiguration(): ChildProcessWrapperOptions { + return { + path: 'test/apps/express-typescript', + label: 'app', + useTsNode: true, + useDistro: true, + env: { + PORT: appPort.toString(), + // have the Node.js SDK send spans every 100 ms instead of every 5 seconcds to speed up tests + OTEL_BSP_SCHEDULE_DELAY: '100', + DASH0_OTEL_COLLECTOR_BASE_URL: 'http://localhost:4318', + // OTEL_LOG_LEVEL: 'VERBOSE', + }, + }; + } + + async function waitForTelemetry() { + const response = await fetch(`http://localhost:${appPort}/ohai`); + expect(response.status).to.equal(200); + const responsePayload = await response.json(); + expect(responsePayload).to.deep.equal({ message: 'We make Observability easy for every developer.' }); + + if (!(await collector().hasTraces())) { + throw new Error('The collector never received any spans.'); + } + return await collector().fetchTelemetry(); + } +}); diff --git a/test/util/delay.ts b/test/util/delay.ts new file mode 100644 index 0000000..bf5270d --- /dev/null +++ b/test/util/delay.ts @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +export default function delay(millis: number) { + return new Promise(resolve => setTimeout(resolve, millis)); +} diff --git a/test/util/expectAttribute.ts b/test/util/expectAttribute.ts new file mode 100644 index 0000000..009c5b7 --- /dev/null +++ b/test/util/expectAttribute.ts @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { expect } from 'chai'; +import { KeyValue } from '../collector/types/opentelemetry/proto/common/v1/common'; +import { Resource } from '../collector/types/opentelemetry/proto/resource/v1/resource'; +import { Span } from '../collector/types/opentelemetry/proto/trace/v1/trace'; + +interface WithAttributes { + attributes: KeyValue[]; +} + +export function expectAttribute(object: WithAttributes, key: string, expectedValue: any, label: string) { + const attributes = object.attributes; + let found = false; + attributes.forEach(attribute => { + const a = attribute.key; + if (a === key) { + const actualValue = getValue(attribute); + expect(actualValue).to.equal( + expectedValue, + `Expected ${label} to have attribute ${key} with value ${expectedValue}, but the attribute has value ${actualValue}.`, + ); + found = true; + } + }); + expect(found).to.equal( + true, + `Expected ${label} to have attribute ${key} with value ${expectedValue}, but no such attribute exists on the ${label}.`, + ); +} + +export function expectResourceAttribute(resource: Resource, key: string, expectedValue: any) { + expectAttribute(resource, key, expectedValue, 'resource'); +} + +export function expectSpanAttribute(span: Span, key: string, expectedValue: any) { + expectAttribute(span, key, expectedValue, 'span'); +} + +function getValue(attribute: KeyValue) { + const v = attribute.value; + if (v == null) { + return null; + } + if (v.string_value) { + return v.string_value; + } + if (v.bool_value) { + return v.bool_value; + } + if (v.int_value) { + return v.int_value; + } + if (v.double_value) { + return v.double_value; + } + if (v.array_value) { + return v.array_value; + } + if (v.string_value) { + return v.string_value; + } + if (v.kvlist_value) { + return v.kvlist_value; + } + if (v.bytes_value) { + return v.bytes_value; + } +} diff --git a/test/util/expectMatchingSpan.ts b/test/util/expectMatchingSpan.ts new file mode 100644 index 0000000..321890f --- /dev/null +++ b/test/util/expectMatchingSpan.ts @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { ExportTraceServiceRequest } from '../collector/types/opentelemetry/proto/collector/trace/v1/trace_service'; +import { Resource } from '../collector/types/opentelemetry/proto/resource/v1/resource'; +import { Span } from '../collector/types/opentelemetry/proto/trace/v1/trace'; +import findMatchingSpans, { Expectation } from './findMatchingSpans'; + +export function expectMatchingSpan( + traceDataItems: ExportTraceServiceRequest[], + resourceExpectations: Expectation[], + spanExpectations: Expectation[], +) { + const { matchingSpans, lastError } = findMatchingSpans(traceDataItems, resourceExpectations, spanExpectations); + if (matchingSpans.length === 1) { + return matchingSpans[0]; + } else if (matchingSpans.length === 0) { + if (lastError) { + throw new Error(`No matching span found. Most recent failing expectation: ${lastError}`); + } else { + throw new Error('No matching span found.'); + } + } else if (matchingSpans.length > 1) { + throw new Error( + `Expected exactly one matching span, found ${matchingSpans.length}.\nMatches:\n${JSON.stringify(matchingSpans, null, 2)} `, + ); + } +} diff --git a/test/util/findMatchingSpans.ts b/test/util/findMatchingSpans.ts new file mode 100644 index 0000000..bf93fb0 --- /dev/null +++ b/test/util/findMatchingSpans.ts @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { expect } from 'chai'; +import { ExportTraceServiceRequest } from '../collector/types/opentelemetry/proto/collector/trace/v1/trace_service'; +import { Resource } from '../collector/types/opentelemetry/proto/resource/v1/resource'; +import { Span } from '../collector/types/opentelemetry/proto/trace/v1/trace'; + +const { fail } = expect; + +export type Expectation = (span: T) => void; + +export interface MatchingSpansResult { + matchingSpans: Span[]; + lastError?: Error; +} + +export default function findMatchingSpans( + traceDataItems: ExportTraceServiceRequest[], + resourceExpectations: Expectation[], + spanExpectations: Expectation[], +): MatchingSpansResult { + if (traceDataItems.length === 0) { + fail('No trace data has been provided.'); + } + const matchingSpans: Span[] = []; + + let lastError = null; + traceDataItems.forEach(traceDataItem => { + traceDataItem.resource_spans.forEach(resourceSpan => { + if (resourceExpectations.length > 0) { + // verify that the resource attribtues match + const resource = resourceSpan.resource; + if (!resource) { + // This resource span has no resource information, try the next resource span. + return; + } + try { + for (let j = 0; j < resourceExpectations.length; j++) { + resourceExpectations[j](resource); + } + } catch (error) { + // This resource did not match, try the next resource span. + lastError = error; + return; + } + } + + resourceSpan.scope_spans.forEach(scopeSpan => { + scopeSpan.spans.forEach(span => { + try { + for (let j = 0; j < spanExpectations.length; j++) { + spanExpectations[j](span); + } + matchingSpans.push(span); + } catch (error) { + // This span did not match, try the next span. + lastError = error; + } + }); + }); + }); + }); + if (lastError) { + return { matchingSpans, lastError }; + } else { + return { matchingSpans }; + } +} diff --git a/test/util/ipc.ts b/test/util/ipc.ts new file mode 100644 index 0000000..ae5c698 --- /dev/null +++ b/test/util/ipc.ts @@ -0,0 +1,7 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +export interface IpcRequest { + id: number; + command: string; +} diff --git a/test/util/runCommand.ts b/test/util/runCommand.ts new file mode 100644 index 0000000..453cb16 --- /dev/null +++ b/test/util/runCommand.ts @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import childProcess from 'child_process'; +import { promisify } from 'util'; + +export default async function runCommand(command: string, workingDirectory: string) { + const originalWorkingDirectory = process.cwd(); + process.chdir(workingDirectory); + try { + console.log(`Running "${command}" in directory ${process.cwd()}.`); + const execAsync = promisify(childProcess.exec).bind(childProcess); + const { stdout, stderr } = await execAsync(command); + echoOutputWithIndentation(command, 'stdout', stdout); + echoOutputWithIndentation(command, 'stderr', stderr); + } finally { + process.chdir(originalWorkingDirectory); + } +} + +function echoOutputWithIndentation(command: string, label: string, output: string) { + if (output && output.trim().length > 0) { + console.log(`${command} ${label}:`); + const lines = output.split('\n'); + for (const line of lines) { + console.log(` ${line}`); + } + } +} diff --git a/test/util/sendToParentProcess.ts b/test/util/sendToParentProcess.ts new file mode 100644 index 0000000..33862f4 --- /dev/null +++ b/test/util/sendToParentProcess.ts @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +export default function sendToParentProcess(message: any) { + if (process.send) { + process.send(message); + } +} + +export function sendReadyToParentProcess() { + sendToParentProcess('ready'); +} diff --git a/test/util/waitUntil.ts b/test/util/waitUntil.ts new file mode 100644 index 0000000..b259dcc --- /dev/null +++ b/test/util/waitUntil.ts @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dash0 Inc. +// SPDX-License-Identifier: Apache-2.0 + +import isCi from 'is-ci'; + +import delay from './delay'; + +export interface RetryOptions { + attempts: number; + maxAttempts: number; + waitBetweenRetries: number; +} + +export function defaultRetryOptions(): RetryOptions { + if (isCi) { + return { + attempts: 0, + maxAttempts: 30, + waitBetweenRetries: 300, + }; + } else { + return { + attempts: 0, + maxAttempts: 15, + waitBetweenRetries: 200, + }; + } +} + +/** + * Retries a function until it does not throw an error. + * + * @param fn the function to retry + * @param retryOptions the options for retrying + */ +export default async function waitUntil(fn: () => any, options?: RetryOptions) { + options = options ?? defaultRetryOptions(); + try { + return await fn(); + } catch (e) { + await delay(options.waitBetweenRetries); + options.attempts += 1; + if (options.attempts > options.maxAttempts) { + throw e; + } + return waitUntil(fn, options); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..713b739 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "inlineSourceMap": true, + "inlineSources": true, + "module": "CommonJS", + "moduleResolution": "node", + "noImplicitOverride": true, + "outDir": "dist", + "resolveJsonModule": true, + "rootDir": ".", + "skipLibCheck": true, + "strict": true, + "target": "ES2022" + }, + "include": ["./src/**/*", "./src/**/*.json", "./package.json"], + "exclude": ["**/*.test.js", "**/*.test.ts"] +}