├── .github ├── FUNDING.yaml ├── dependabot.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── 3-feature-request.yml │ └── 2-bug-report.yml └── workflows │ ├── ci.yml │ └── publish.yml ├── test ├── node │ ├── .gitignore │ ├── cjs │ │ ├── package.json │ │ └── index.js │ └── esm │ │ ├── package.json │ │ └── index.js ├── test-setup.ts ├── abort.test.ts ├── core.test.ts ├── thing.test.ts ├── integration.test.ts └── advanced.test.ts ├── .prettierrc ├── README.md ├── .npmignore ├── .gitignore ├── example ├── a.ts ├── preload.ts └── index.ts ├── package.json ├── CHANGELOG.md ├── tsconfig.json ├── tsconfig.dts.json ├── src └── index.ts └── bun.lock /.github/FUNDING.yaml: -------------------------------------------------------------------------------- 1 | github: SaltyAom -------------------------------------------------------------------------------- /test/node/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | package-lock.json -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "tabWidth": 4, 4 | "semi": false, 5 | "singleQuote": true, 6 | "trailingComma": "none" 7 | } 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @elysiajs/opentelemetry 2 | 3 | Please read about this plugin in [our documentation](https://elysiajs.com/plugins/opentelemetry.html). 4 | -------------------------------------------------------------------------------- /test/node/cjs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "commonjs", 3 | "dependencies": { 4 | "@elysiajs/opentelemetry": "../../.." 5 | } 6 | } -------------------------------------------------------------------------------- /test/node/esm/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "dependencies": { 4 | "@elysiajs/opentelemetry": "../../.." 5 | } 6 | } -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: './' 5 | schedule: 6 | interval: 'daily' 7 | 8 | - package-ecosystem: 'github-actions' 9 | directory: './' 10 | schedule: 11 | interval: 'daily' 12 | -------------------------------------------------------------------------------- /test/node/esm/index.js: -------------------------------------------------------------------------------- 1 | if ('Bun' in globalThis) { 2 | throw new Error('❌ Use Node.js to run this test!') 3 | } 4 | 5 | import { opentelemetry } from '@elysiajs/opentelemetry' 6 | 7 | if (typeof opentelemetry !== 'function') { 8 | throw new Error('❌ ESM Node.js failed') 9 | } 10 | 11 | console.log('✅ ESM Node.js works!') 12 | -------------------------------------------------------------------------------- /test/node/cjs/index.js: -------------------------------------------------------------------------------- 1 | if ('Bun' in globalThis) { 2 | throw new Error('❌ Use Node.js to run this test!') 3 | } 4 | 5 | const { opentelemetry } = require('@elysiajs/opentelemetry') 6 | 7 | if (typeof opentelemetry !== 'function') { 8 | throw new Error('❌ CommonJS Node.js failed') 9 | } 10 | 11 | console.log('✅ CommonJS Node.js works!') 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: 📗 Documentation Issue 4 | url: https://github.com/elysiajs/documentation/issues/new/choose 5 | about: Head over to our Documentation repository! 6 | - name: 💬 Ask a Question 7 | url: https://discord.gg/eaFJ2KDJck 8 | about: Head over to our Discord! 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .git 2 | .github 3 | .gitignore 4 | .prettierrc 5 | .cjs.swcrc 6 | .es.swcrc 7 | bun.lockb 8 | 9 | node_modules 10 | tsconfig.json 11 | pnpm-lock.yaml 12 | jest.config.js 13 | nodemon.json 14 | 15 | example 16 | test 17 | tests 18 | public 19 | public-aliased 20 | test 21 | CHANGELOG.md 22 | .eslintrc.js 23 | tsconfig.dts.json 24 | 25 | .env 26 | .env.local 27 | build.ts 28 | src 29 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Build and Test 2 | 3 | on: 4 | push: 5 | pull_request: 6 | 7 | jobs: 8 | build: 9 | name: Build and test code 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | 16 | - name: Setup bun 17 | uses: oven-sh/setup-bun@v1 18 | with: 19 | bun-version: latest 20 | 21 | - name: Install packages 22 | run: bun install 23 | 24 | - name: Build code 25 | run: bun run build 26 | 27 | - name: Test 28 | run: bun run test -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | /dist 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env 30 | .env.local 31 | .env.development.local 32 | .env.test.local 33 | .env.production.local 34 | 35 | # vercel 36 | .vercel 37 | 38 | **/*.trace 39 | **/*.zip 40 | **/*.tar.gz 41 | **/*.tgz 42 | **/*.log 43 | package-lock.json 44 | **/*.bun -------------------------------------------------------------------------------- /example/a.ts: -------------------------------------------------------------------------------- 1 | import { Elysia } from 'elysia' 2 | import { getCurrentSpan, opentelemetry } from '../src' 3 | 4 | new Elysia() 5 | .use(opentelemetry()) 6 | .get('/', async () => { 7 | console.log(getCurrentSpan()?.spanContext().traceId) 8 | await new Promise((res) => setTimeout(res, 1000)) 9 | 10 | return 'ok' 11 | }) 12 | .listen(3000, async (ctx) => { 13 | const abort = new AbortController() 14 | fetch(ctx.url, { signal: abort.signal }).catch(() => {}) 15 | 16 | fetch(ctx.url).catch(() => {}) 17 | 18 | await new Promise((res) => setTimeout(res, 10)) 19 | abort.abort() 20 | 21 | /// future requests without `traceparent` reuse the same trace ID 22 | fetch(ctx.url).catch(() => {}) 23 | }) 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/3-feature-request.yml: -------------------------------------------------------------------------------- 1 | name: 🚀 Feature Request 2 | description: Suggest an idea, feature, or enhancement 3 | labels: [enhancement] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Thank you for submitting an idea. It helps make Elysia.JS better. 9 | 10 | If you want to discuss Elysia.JS, or learn how others are using Elysia.JS, please 11 | head to our [Discord](https://discord.com/invite/y7kH46ZE) server, where you can chat among the community. 12 | - type: textarea 13 | attributes: 14 | label: What is the problem this feature would solve? 15 | validations: 16 | required: true 17 | - type: textarea 18 | attributes: 19 | label: What is the feature you are proposing to solve the problem? 20 | validations: 21 | required: true 22 | - type: textarea 23 | attributes: 24 | label: What alternatives have you considered? 25 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | defaults: 8 | run: 9 | shell: bash 10 | 11 | permissions: 12 | id-token: write 13 | 14 | env: 15 | # Enable debug logging for actions 16 | ACTIONS_RUNNER_DEBUG: true 17 | 18 | jobs: 19 | publish-npm: 20 | name: 'Publish: npm Registry' 21 | runs-on: ubuntu-latest 22 | steps: 23 | - name: 'Checkout' 24 | uses: actions/checkout@v4 25 | 26 | - name: 'Setup Bun' 27 | uses: oven-sh/setup-bun@v1 28 | with: 29 | bun-version: latest 30 | registry-url: "https://registry.npmjs.org" 31 | 32 | - uses: actions/setup-node@v5 33 | with: 34 | node-version: '24.x' 35 | registry-url: 'https://registry.npmjs.org' 36 | 37 | - name: Install packages 38 | run: bun install 39 | 40 | - name: Build code 41 | run: bun run build 42 | 43 | - name: Test 44 | run: bun run test 45 | 46 | - name: 'Publish' 47 | run: | 48 | NODE_AUTH_TOKEN="" npm publish --provenance --access=public 49 | -------------------------------------------------------------------------------- /example/preload.ts: -------------------------------------------------------------------------------- 1 | import * as otel from '@opentelemetry/api' 2 | import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto' 3 | import { 4 | BatchSpanProcessor, 5 | ConsoleSpanExporter, 6 | Span 7 | } from '@opentelemetry/sdk-trace-node' 8 | import { Resource } from '@opentelemetry/resources' 9 | import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions' 10 | import { NodeSDK } from '@opentelemetry/sdk-node' 11 | import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' 12 | 13 | const sdk = new NodeSDK({ 14 | instrumentations: [getNodeAutoInstrumentations()], 15 | resource: new Resource({ 16 | [SEMRESATTRS_SERVICE_NAME]: 'Elysia' 17 | }), 18 | spanProcessors: [ 19 | new BatchSpanProcessor( 20 | new OTLPTraceExporter({ 21 | // url: 'https://api.axiom.co/v1/traces', 22 | // headers: { 23 | // Authorization: `Bearer ${Bun.env.AXIOM_TOKEN}`, 24 | // 'X-Axiom-Dataset': Bun.env.AXIOM_DATASET 25 | // } 26 | }) 27 | ), 28 | new BatchSpanProcessor(new ConsoleSpanExporter()) 29 | ] 30 | }) 31 | 32 | sdk.start() 33 | 34 | console.log("Preload") 35 | -------------------------------------------------------------------------------- /test/test-setup.ts: -------------------------------------------------------------------------------- 1 | import { trace } from '@opentelemetry/api' 2 | 3 | // Test utility to capture span data 4 | export interface CapturedSpan { 5 | name?: string 6 | traceId: string 7 | spanId: string 8 | parentSpanId?: string 9 | attributes?: Record 10 | events?: Array<{ name: string; attributes?: Record }> 11 | status?: { code: number; message?: string } 12 | isRecording: boolean 13 | } 14 | 15 | export let capturedSpans: CapturedSpan[] = [] 16 | 17 | export const captureSpanData = (spanName?: string): CapturedSpan => { 18 | const span = trace.getActiveSpan() 19 | if (!span) throw new Error('No active span found') 20 | 21 | const context = span.spanContext() 22 | const captured: CapturedSpan = { 23 | name: spanName, 24 | traceId: context.traceId, 25 | spanId: context.spanId, 26 | isRecording: span.isRecording() 27 | } 28 | 29 | capturedSpans.push(captured) 30 | return captured 31 | } 32 | 33 | export const resetCapturedSpans = () => { 34 | capturedSpans = [] 35 | } 36 | 37 | export const req = (path: string, options?: RequestInit) => 38 | new Request(`http://localhost${path}`, options) 39 | 40 | // Global setup for tests 41 | import { beforeEach, afterEach } from 'bun:test' 42 | 43 | beforeEach(() => { 44 | resetCapturedSpans() 45 | }) 46 | 47 | afterEach(async () => { 48 | // Clean up any active spans 49 | trace.getActiveSpan()?.end() 50 | resetCapturedSpans() 51 | }) 52 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2-bug-report.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug Report 2 | description: Report an issue that should be fixed 3 | labels: [bug] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Thank you for submitting a bug report. It helps make Elysia.JS better. 9 | 10 | If you need help or support using Elysia.JS, and are not reporting a bug, please 11 | head over to Q&A discussions [Discussions](https://github.com/elysiajs/elysia/discussions/categories/q-a), where you can ask questions in the Q&A forum. 12 | 13 | Make sure you are running the version of Elysia.JS and Bun.Sh 14 | The bug you are experiencing may already have been fixed. 15 | 16 | Please try to include as much information as possible. 17 | 18 | - type: input 19 | attributes: 20 | label: What version of Elysia is running? 21 | description: Copy the output of `Elysia --revision` 22 | - type: input 23 | attributes: 24 | label: What platform is your computer? 25 | description: | 26 | For MacOS and Linux: copy the output of `uname -mprs` 27 | For Windows: copy the output of `"$([Environment]::OSVersion | ForEach-Object VersionString) $(if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" })"` in the PowerShell console 28 | - type: textarea 29 | attributes: 30 | label: What steps can reproduce the bug? 31 | description: Explain the bug and provide a code snippet that can reproduce it. 32 | validations: 33 | required: true 34 | - type: textarea 35 | attributes: 36 | label: What is the expected behavior? 37 | description: If possible, please provide text instead of a screenshot. 38 | - type: textarea 39 | attributes: 40 | label: What do you see instead? 41 | description: If possible, please provide text instead of a screenshot. 42 | - type: textarea 43 | attributes: 44 | label: Additional information 45 | description: Is there anything else you think we should know? 46 | - type: input 47 | attributes: 48 | label: Have you try removing the `node_modules` and `bun.lockb` and try again yet? 49 | description: rm -rf node_modules && bun.lockb 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@elysiajs/opentelemetry", 3 | "version": "1.4.9", 4 | "license": "MIT", 5 | "scripts": { 6 | "dev": "bun run --watch example/index.ts", 7 | "test": "bun test --preload ./test/test-setup.ts && npm run test:node", 8 | "test:node": "npm install --prefix ./test/node/cjs/ && npm install --prefix ./test/node/esm/ && node ./test/node/cjs/index.js && node ./test/node/esm/index.js", 9 | "build": "bun build.ts", 10 | "release": "npm run build && npm run test && npm publish --access public" 11 | }, 12 | "author": { 13 | "name": "saltyAom", 14 | "url": "https://github.com/SaltyAom", 15 | "email": "saltyaom@gmail.com" 16 | }, 17 | "publishConfig": { 18 | "access": "public", 19 | "provenance": true 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/elysiajs/opentelemetry" 24 | }, 25 | "main": "./dist/cjs/index.js", 26 | "module": "./dist/index.mjs", 27 | "types": "./dist/index.d.ts", 28 | "exports": { 29 | "./package.json": "./package.json", 30 | ".": { 31 | "types": "./dist/index.d.ts", 32 | "import": "./dist/index.mjs", 33 | "require": "./dist/cjs/index.js" 34 | } 35 | }, 36 | "keywords": [ 37 | "elysia", 38 | "opentelemetry", 39 | "tracing" 40 | ], 41 | "dependencies": { 42 | "@opentelemetry/api": "^1.9.0", 43 | "@opentelemetry/instrumentation": "^0.200.0", 44 | "@opentelemetry/sdk-node": "^0.200.0" 45 | }, 46 | "devDependencies": { 47 | "@axiomhq/js": "^1.3.1", 48 | "@elysiajs/eden": "^1.3.0", 49 | "@elysiajs/graphql-yoga": "^1.2.0", 50 | "@envelop/core": "^5.2.3", 51 | "@envelop/opentelemetry": "^7.1.3", 52 | "@opentelemetry/context-async-hooks": "^2.0.0", 53 | "@opentelemetry/exporter-jaeger": "^2.0.0", 54 | "@opentelemetry/exporter-metrics-otlp-proto": "^0.200.0", 55 | "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", 56 | "@opentelemetry/exporter-trace-otlp-proto": "^0.200.0", 57 | "@opentelemetry/sdk-metrics": "^2.0.0", 58 | "@opentelemetry/sdk-trace-node": "^2.0.0", 59 | "@opentelemetry/sdk-trace-web": "^2.0.0", 60 | "@types/bun": "^1.3.3", 61 | "elysia": "1.4.13-beta.6", 62 | "eslint": "9.25.1", 63 | "tsup": "^8.4.0", 64 | "typescript": "^5.8.3" 65 | }, 66 | "peerDependencies": { 67 | "elysia": ">= 1.4.0" 68 | }, 69 | "peerDependenciesMeta": { 70 | "graphql": { 71 | "optional": true 72 | }, 73 | "graphql-yoga": { 74 | "optional": true 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 1.4.9 - 11 Dec 2025 2 | Bug fix: 3 | - [#63](https://github.com/elysiajs/opentelemetry/issues/63) http.response.status_code always reported as 200 4 | - [#62](https://github.com/elysiajs/opentelemetry/issues/62) child span not ended when Root HTTP request is aborted 5 | 6 | # 1.4.8 - 22 Nov 2025 7 | Bug fix: 8 | - [#58](https://github.com/elysiajs/opentelemetry/issues/58) fix error log when `OTEL_LOG_LEVEL` is set to `warn` 9 | - [#57](https://github.com/elysiajs/opentelemetry/issues/57), [#53](https://github.com/elysiajs/opentelemetry/issues/53) possible fix for aborted request causes all future requests to share same trace ID? 10 | - [#56](https://github.com/elysiajs/opentelemetry/issues/56) Root span doesn't end when the request throws error, triggering a custom onError handler 11 | 12 | # 1.4.7 - 18 Nov 2025 13 | Improvement: 14 | - [#59](https://github.com/elysiajs/opentelemetry/pull/59) enhance error handling in createActiveSpanHandler 15 | 16 | # 1.4.6 - 24 Oct 2025 17 | Improvement: 18 | - use cookie value instead of proxy cookie jar 19 | - clean up stuff 20 | 21 | Change: 22 | - use captialized name for lifecycle event 23 | 24 | Bug fix: 25 | - `Handle` not showing up 26 | 27 | # 1.4.5 - 23 Oct 2025 28 | Improvement: 29 | - adjust rootSpan 30 | 31 | # 1.4.4 - 23 Oct 2025 32 | Improvement: 33 | - adjust rootSpan 34 | 35 | # 1.4.3 - 23 Oct 2025 36 | Improvement: 37 | - adjust rootSpan 38 | 39 | # 1.4.2 - 23 Oct 2025 40 | Improvement: 41 | - add `startSpan` 42 | - use `abortSignal` 43 | 44 | # 1.4.1 - 12 Oct 2025 45 | Bug fix: 46 | - [#52](https://github.com/elysiajs/opentelemetry/pull/52) fix early span.end() prevents renaming of root span 47 | - [#51](https://github.com/elysiajs/opentelemetry/pull/51) add checkIfShouldTrace option to OpenTelemetry plugin 48 | 49 | # 1.3.1 - 13 Jul 2025 50 | Improvement: 51 | - [#48](https://github.com/elysiajs/opentelemetry/pull/48) add test suite and update dependencies 52 | - set name after response as fallback 53 | 54 | Bug fix: 55 | - [#47](https://github.com/elysiajs/opentelemetry/pull/47), [#49](https://github.com/elysiajs/opentelemetry/pull/49) avoid race condition "Cannot execute operation on ended Span" 56 | 57 | # 1.3.0-exp.0 - 23 Apr 2025 58 | Change: 59 | - Add support for Elysia 1.3 60 | 61 | 62 | # 1.2.0-rc.0 - 23 Dec 2024 63 | Change: 64 | - Add support for Elysia 1.2 65 | 66 | # 1.1.7 - 31 Oct 2024 67 | Change: 68 | - remove auto-node-instrumenetation by default 69 | 70 | # 1.1.6 - 10 Oct 2024 71 | Improvement: 72 | - setTimeout reference hack to prevent gc 73 | 74 | Feature: 75 | - export `getCurrentSpan`, `setAttributes` 76 | 77 | Bug fix: 78 | - possibly setTimeout memory leak 79 | 80 | # 1.1.5 - 5 Sep 2024 81 | Feature: 82 | - add provenance publish 83 | 84 | # 1.1.4 - 19 Aug 2024 85 | - Negate isInitialized 86 | 87 | # 1.1.3 - 19 Aug 2024 88 | Bug fix: 89 | - Support bun build --minify-identifiers 90 | 91 | # 1.1.2 - 4 Aug 2024 92 | Bug fix: 93 | - Check nullability of rootSpan 94 | 95 | # 1.1.1 - 16 July 2024 96 | Bug fix: 97 | - Cast startActiveSpan and record as same as `@opentelemetry/api` package. 98 | -------------------------------------------------------------------------------- /test/abort.test.ts: -------------------------------------------------------------------------------- 1 | import { Elysia } from 'elysia' 2 | import { opentelemetry, getCurrentSpan } from '../src' 3 | import { describe, expect, it } from 'bun:test' 4 | 5 | // Test constants 6 | const SLOW_OPERATION_TIMEOUT = 350 7 | const ABORT_DELAY = 10 8 | const CLEANUP_DELAY = 100 9 | 10 | describe('Abort Request Handling', () => { 11 | it('should create unique trace IDs for requests after an aborted request', async () => { 12 | const traceIds: string[] = [] 13 | 14 | const testApp = new Elysia() 15 | .use(opentelemetry({ serviceName: 'abort-test' })) 16 | .get('/', async () => { 17 | const span = getCurrentSpan() 18 | if (span) { 19 | traceIds.push(span.spanContext().traceId) 20 | } 21 | await new Promise((res) => setTimeout(res, SLOW_OPERATION_TIMEOUT)) 22 | return { success: true } 23 | }) 24 | 25 | // Create an aborted request 26 | const abortController = new AbortController() 27 | const abortPromise = testApp 28 | .handle( 29 | new Request('http://localhost/', { 30 | signal: abortController.signal 31 | }) 32 | ) 33 | .catch(() => {}) 34 | 35 | // Abort after a short delay 36 | await new Promise((res) => setTimeout(res, ABORT_DELAY)) 37 | abortController.abort() 38 | 39 | // Wait a bit for abort to process 40 | await abortPromise 41 | await new Promise((res) => setTimeout(res, CLEANUP_DELAY)) 42 | 43 | // Make subsequent requests without traceparent header 44 | const response1 = await testApp.handle(new Request('http://localhost/')) 45 | const response2 = await testApp.handle(new Request('http://localhost/')) 46 | 47 | // Verify both requests completed 48 | expect(response1.status).toBe(200) 49 | expect(response2.status).toBe(200) 50 | 51 | // Verify we captured trace IDs (at least for the successful requests) 52 | expect(traceIds.length).toBeGreaterThanOrEqual(2) 53 | 54 | // Get the last two trace IDs (from the successful requests) 55 | const lastTwoTraceIds = traceIds.slice(-2) 56 | 57 | // Each request should have a unique trace ID 58 | expect(lastTwoTraceIds[0]).toBeDefined() 59 | expect(lastTwoTraceIds[1]).toBeDefined() 60 | expect(lastTwoTraceIds[0]).not.toBe(lastTwoTraceIds[1]) 61 | }) 62 | 63 | it('should not leak context from aborted request to subsequent requests', async () => { 64 | const traceIds: string[] = [] 65 | let abortedTraceId: string | undefined 66 | 67 | const testApp = new Elysia() 68 | .use(opentelemetry({ serviceName: 'abort-context-leak-test' })) 69 | .get('/slow', async () => { 70 | const span = getCurrentSpan() 71 | if (span) { 72 | const traceId = span.spanContext().traceId 73 | traceIds.push(traceId) 74 | abortedTraceId = traceId 75 | } 76 | await new Promise((res) => setTimeout(res, SLOW_OPERATION_TIMEOUT)) 77 | return { success: true } 78 | }) 79 | .get('/fast', () => { 80 | const span = getCurrentSpan() 81 | if (span) { 82 | traceIds.push(span.spanContext().traceId) 83 | } 84 | return { success: true } 85 | }) 86 | 87 | // Create an aborted request to /slow 88 | const abortController = new AbortController() 89 | const abortPromise = testApp 90 | .handle( 91 | new Request('http://localhost/slow', { 92 | signal: abortController.signal 93 | }) 94 | ) 95 | .catch(() => {}) 96 | 97 | // Abort after a short delay 98 | await new Promise((res) => setTimeout(res, ABORT_DELAY)) 99 | abortController.abort() 100 | 101 | // Wait for abort to process 102 | await abortPromise 103 | await new Promise((res) => setTimeout(res, CLEANUP_DELAY)) 104 | 105 | // Make requests to /fast without traceparent header 106 | const response1 = await testApp.handle( 107 | new Request('http://localhost/fast') 108 | ) 109 | const response2 = await testApp.handle( 110 | new Request('http://localhost/fast') 111 | ) 112 | 113 | // Verify both requests completed 114 | expect(response1.status).toBe(200) 115 | expect(response2.status).toBe(200) 116 | 117 | // Get the trace IDs from the successful requests 118 | const successfulTraceIds = traceIds.slice(1) // Skip the aborted one 119 | 120 | // Verify each successful request has a unique trace ID 121 | expect(successfulTraceIds.length).toBe(2) 122 | expect(successfulTraceIds[0]).toBeDefined() 123 | expect(successfulTraceIds[1]).toBeDefined() 124 | expect(successfulTraceIds[0]).not.toBe(successfulTraceIds[1]) 125 | 126 | // Verify none of the successful requests reused the aborted trace ID 127 | if (abortedTraceId) { 128 | expect(successfulTraceIds[0]).not.toBe(abortedTraceId) 129 | expect(successfulTraceIds[1]).not.toBe(abortedTraceId) 130 | } 131 | }) 132 | }) 133 | -------------------------------------------------------------------------------- /test/core.test.ts: -------------------------------------------------------------------------------- 1 | import { Elysia } from 'elysia' 2 | import { 3 | opentelemetry, 4 | getTracer, 5 | startActiveSpan, 6 | setAttributes, 7 | getCurrentSpan 8 | } from '../src' 9 | import { describe, expect, it } from 'bun:test' 10 | import { trace, SpanStatusCode } from '@opentelemetry/api' 11 | import { captureSpanData, req } from './test-setup' 12 | 13 | describe('Core OpenTelemetry Plugin', () => { 14 | it('should initialize plugin without options', () => { 15 | expect(typeof opentelemetry).toBe('function') 16 | 17 | const plugin = opentelemetry() 18 | expect(plugin).toBeDefined() 19 | expect(typeof plugin).toBe('object') 20 | }) 21 | 22 | it('should initialize plugin with options', () => { 23 | expect(typeof opentelemetry).toBe('function') 24 | 25 | const plugin = opentelemetry({ 26 | serviceName: 'test-service' 27 | }) 28 | expect(plugin).toBeDefined() 29 | expect(typeof plugin).toBe('object') 30 | }) 31 | 32 | it('should create tracer and start span', () => { 33 | const tracer = getTracer() 34 | expect(tracer).toBeDefined() 35 | expect(typeof tracer.startSpan).toBe('function') 36 | expect(typeof tracer.startActiveSpan).toBe('function') 37 | 38 | const span = tracer.startSpan('test-span') 39 | expect(span).toBeDefined() 40 | expect(span.isRecording()).toBe(true) 41 | span.end() 42 | }) 43 | 44 | it('should start active span with callback', () => { 45 | let spanInCallback: any 46 | 47 | startActiveSpan('test-active-span', (span) => { 48 | spanInCallback = span 49 | expect(span.isRecording()).toBe(true) 50 | return 'test-result' 51 | }) 52 | 53 | expect(spanInCallback).toBeDefined() 54 | }) 55 | 56 | it('should start active span with options', () => { 57 | const result = startActiveSpan( 58 | 'test-span-with-options', 59 | { kind: 1 }, 60 | (span) => { 61 | expect(span.isRecording()).toBe(true) 62 | span.setAttributes({ 'test.attribute': 'value' }) 63 | return 'success' 64 | } 65 | ) 66 | 67 | expect(result).toBe('success') 68 | }) 69 | 70 | it('should handle async operations in active span', async () => { 71 | const result = await startActiveSpan('async-test', async (span) => { 72 | span.setAttributes({ 'async.test': true }) 73 | await new Promise((resolve) => setTimeout(resolve, 10)) 74 | return 'async-result' 75 | }) 76 | 77 | expect(result).toBe('async-result') 78 | }) 79 | 80 | it('should set attributes on current span', () => { 81 | const tracer = getTracer() 82 | const span = tracer.startSpan('attribute-test') 83 | 84 | const result = setAttributes({ 'test.key': 'test.value' }) 85 | 86 | span.end() 87 | expect(typeof setAttributes).toBe('function') 88 | }) 89 | 90 | it('should handle span errors gracefully', () => { 91 | let error: Error | null = null 92 | 93 | try { 94 | startActiveSpan('error-test', (span) => { 95 | throw new Error('Test error') 96 | }) 97 | } catch (e) { 98 | error = e as Error 99 | } 100 | 101 | expect(error).toBeDefined() 102 | expect(error?.message).toBe('Test error') 103 | }) 104 | 105 | it('should work with basic Elysia app', async () => { 106 | const testApp = new Elysia() 107 | .use( 108 | opentelemetry({ 109 | serviceName: 'test-elysia-app' 110 | }) 111 | ) 112 | .get('/test', () => 'Hello OpenTelemetry') 113 | 114 | const response = await testApp.handle(req('/test')) 115 | expect(response.status).toBe(200) 116 | expect(await response.text()).toBe('Hello OpenTelemetry') 117 | }) 118 | 119 | it('should complete full OpenTelemetry span lifecycle', async () => { 120 | let spanData: any = null 121 | let spanStarted = false 122 | 123 | const testApp = new Elysia() 124 | .use( 125 | opentelemetry({ 126 | serviceName: 'span-lifecycle-test' 127 | }) 128 | ) 129 | .get('/lifecycle', () => { 130 | const span = trace.getActiveSpan() 131 | if (span) { 132 | spanStarted = span.isRecording() 133 | spanData = { 134 | traceId: span.spanContext().traceId, 135 | spanId: span.spanContext().spanId, 136 | isRecording: span.isRecording() 137 | } 138 | 139 | // Set some attributes 140 | span.setAttributes({ 141 | 'test.operation': 'lifecycle-test', 142 | 'test.timestamp': Date.now() 143 | }) 144 | 145 | // Add an event 146 | span.addEvent('test-event', { 147 | 'event.data': 'test-data' 148 | }) 149 | } 150 | return { lifecycle: 'complete', spanStarted } 151 | }) 152 | 153 | const response = await testApp.handle(req('/lifecycle')) 154 | 155 | expect(response.status).toBe(200) 156 | const result = await response.json() 157 | expect(result.lifecycle).toBe('complete') 158 | expect(result.spanStarted).toBe(true) 159 | expect(spanData).toBeDefined() 160 | expect(spanData?.traceId).toBeDefined() 161 | expect(spanData?.spanId).toBeDefined() 162 | expect(spanData?.isRecording).toBe(true) 163 | }) 164 | }) 165 | -------------------------------------------------------------------------------- /example/index.ts: -------------------------------------------------------------------------------- 1 | import { Elysia, t } from 'elysia' 2 | import { treaty } from '@elysiajs/eden' 3 | 4 | import { 5 | getCurrentSpan, 6 | getTracer, 7 | opentelemetry, 8 | setAttributes, 9 | startSpan 10 | } from '../src' 11 | import * as otel from '@opentelemetry/api' 12 | import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto' 13 | import { 14 | BatchSpanProcessor, 15 | ConsoleSpanExporter 16 | } from '@opentelemetry/sdk-trace-node' 17 | 18 | import { yoga } from '@elysiajs/graphql-yoga' 19 | import { useOpenTelemetry } from '@envelop/opentelemetry' 20 | 21 | export const typeDefs = /* GraphQL */ ` 22 | type Query { 23 | authors: [Author!]! 24 | author(id: ID, name: String): Author! 25 | books(page: Int, perPage: Int): [Book!]! 26 | book(name: String!): Book 27 | } 28 | 29 | type Mutation { 30 | addBook(name: String!, author: ID!): Book! 31 | } 32 | 33 | type Author { 34 | id: ID! 35 | name: String! 36 | books: [Book!]! 37 | } 38 | 39 | type Book { 40 | id: ID! 41 | name: String! 42 | author: Author! 43 | } 44 | ` 45 | 46 | const author = { 47 | id: 'A', 48 | name: 'SaltyAom', 49 | books: [] 50 | } 51 | 52 | const book = { 53 | id: 'A', 54 | name: 'SaltyAom', 55 | author 56 | } 57 | 58 | class NagisaError extends Error { 59 | constructor(message: string) { 60 | super(message) 61 | } 62 | } 63 | 64 | const plugin = () => (app: Elysia) => 65 | app.get('/', () => { 66 | return 'a' 67 | }) 68 | 69 | const app = new Elysia() 70 | .use( 71 | opentelemetry({ 72 | spanProcessors: [ 73 | new BatchSpanProcessor( 74 | new OTLPTraceExporter({ 75 | // url: 'https://api.axiom.co/v1/traces', 76 | // headers: { 77 | // Authorization: `Bearer ${Bun.env.AXIOM_TOKEN}`, 78 | // 'X-Axiom-Dataset': Bun.env.AXIOM_DATASET 79 | // } 80 | }) 81 | ) 82 | // new BatchSpanProcessor(new ConsoleSpanExporter()) 83 | ] 84 | }) 85 | ) 86 | .error({ 87 | NAGISA_ERROR: NagisaError 88 | }) 89 | .onError([ 90 | function handleCustomError({ code }) { 91 | if (code === 'NAGISA_ERROR') return 'An error occurred' 92 | }, 93 | function handleUnknownError({ code }) { 94 | if (code === 'UNKNOWN') return 'An error occurred' 95 | } 96 | ]) 97 | .trace(({ onAfterResponse }) => { 98 | onAfterResponse(() => { 99 | console.log("A") 100 | }) 101 | }) 102 | .get('/stream', async function* () { 103 | for (let i = 0; i < 1000; i++) { 104 | yield i 105 | console.log(i) 106 | await Bun.sleep(3) 107 | } 108 | }) 109 | .onBeforeHandle([ 110 | async function isSignIn() { 111 | const span1 = startSpan('a.sleep.0') 112 | await Bun.sleep(50) 113 | span1.end() 114 | 115 | const span2 = startSpan('a.sleep.1') 116 | await Bun.sleep(25) 117 | span2.end() 118 | }, 119 | async function roleCheck() { 120 | const span = startSpan('b.sleep.0') 121 | await Bun.sleep(75) 122 | span.end() 123 | } 124 | ]) 125 | .post( 126 | '/id/:id', 127 | async ({ query }) => { 128 | setAttributes({ hello: 'world' }) 129 | 130 | return getTracer().startActiveSpan( 131 | 'handle.sleep.0', 132 | async (span) => { 133 | await Bun.sleep(100) 134 | span.end() 135 | 136 | return 'Hello Elysia' 137 | } 138 | ) 139 | }, 140 | { 141 | async afterHandle({ response }) { 142 | await Bun.sleep(25) 143 | 144 | if (response === 'Hello Elysia') 145 | return new NagisaError('Where teapot?') 146 | }, 147 | body: t.Object({ 148 | name: t.String() 149 | }) 150 | } 151 | ) 152 | .get('/context', async () => { 153 | return 'k' 154 | }) 155 | .use( 156 | yoga({ 157 | typeDefs, 158 | plugins: [ 159 | useOpenTelemetry( 160 | { 161 | resolvers: true, // Tracks resolvers calls, and tracks resolvers thrown errors 162 | variables: true, // Includes the operation variables values as part of the metadata collected 163 | result: true, // Includes execution result object as part of the metadata collected 164 | document: true // Includes the operation document as part of the metadata collected 165 | }, 166 | otel.trace.getTracerProvider() 167 | ) 168 | ], 169 | resolvers: { 170 | Query: { 171 | author: (_, __, ___) => author, 172 | authors: () => [author], 173 | book: () => book, 174 | books: () => [book] 175 | }, 176 | Mutation: { 177 | addBook: () => book 178 | } 179 | } 180 | }) 181 | ) 182 | .use(plugin()) 183 | .listen(3000) 184 | 185 | // console.log(app.routes[0].compile().toString()) 186 | 187 | const api = treaty(app) 188 | 189 | // await api.context 190 | // .get() 191 | // .then((x) => x.data) 192 | // .then(console.log) 193 | 194 | const { data, headers, error, status } = await api.id({ id: 'hello' }).post( 195 | { 196 | name: 'saltyaom' 197 | }, 198 | { 199 | query: { 200 | hello: 'world' 201 | } 202 | } 203 | ) 204 | 205 | // console.log(error?.value) 206 | -------------------------------------------------------------------------------- /test/thing.test.ts: -------------------------------------------------------------------------------- 1 | import { Elysia } from 'elysia' 2 | import { opentelemetry } from '../src' 3 | import { describe, expect, it } from 'bun:test' 4 | import { trace } from '@opentelemetry/api' 5 | import { req } from './test-setup' 6 | 7 | describe('Error Handling with OpenTelemetry', () => { 8 | it('should end root span when error is thrown without custom onError handler', async () => { 9 | let rootSpanEnded = false 10 | let rootSpanId: string | undefined 11 | 12 | const testApp = new Elysia() 13 | .use(opentelemetry({ serviceName: 'error-no-handler-test' })) 14 | .get('/error-no-handler', () => { 15 | const span = trace.getActiveSpan() 16 | if (span) { 17 | rootSpanId = span.spanContext().spanId 18 | // Monkey-patch the end method to track if it's called 19 | const originalEnd = span.end.bind(span) 20 | span.end = function (...args: any[]) { 21 | rootSpanEnded = true 22 | return originalEnd(...args) 23 | } 24 | } 25 | throw new Error('Test error without handler') 26 | }) 27 | 28 | try { 29 | await testApp.handle(req('/error-no-handler')) 30 | } catch (error) { 31 | // Error is expected 32 | } 33 | 34 | // Wait a bit for async operations 35 | await new Promise((resolve) => setTimeout(resolve, 100)) 36 | 37 | expect(rootSpanId).toBeDefined() 38 | // This test documents current behavior - span should end 39 | }) 40 | 41 | it('should end root span when error is thrown with custom onError handler', async () => { 42 | let rootSpanEnded = false 43 | let rootSpanId: string | undefined 44 | let errorHandlerCalled = false 45 | 46 | const testApp = new Elysia() 47 | .use(opentelemetry({ serviceName: 'error-with-handler-test' })) 48 | .onError(({ error }) => { 49 | errorHandlerCalled = true 50 | return { 51 | error: 52 | error instanceof Error ? error.message : String(error) 53 | } 54 | }) 55 | .get('/error-with-handler', () => { 56 | const span = trace.getActiveSpan() 57 | if (span) { 58 | rootSpanId = span.spanContext().spanId 59 | // Monkey-patch the end method to track if it's called 60 | const originalEnd = span.end.bind(span) 61 | span.end = function (...args: any[]) { 62 | rootSpanEnded = true 63 | return originalEnd(...args) 64 | } 65 | } 66 | throw new Error('Test error with handler') 67 | }) 68 | 69 | const response = await testApp.handle(req('/error-with-handler')) 70 | 71 | // Wait a bit for async operations 72 | await new Promise((resolve) => setTimeout(resolve, 100)) 73 | 74 | expect(response.status).toBe(500) 75 | expect(errorHandlerCalled).toBe(true) 76 | expect(rootSpanId).toBeDefined() 77 | 78 | // This is the bug: root span should end but currently doesn't 79 | // After fix, this should be true 80 | expect(rootSpanEnded).toBe(true) 81 | }) 82 | 83 | it('should record error details in span when using custom onError handler', async () => { 84 | let spanHasError = false 85 | let errorHandlerCalled = false 86 | 87 | const testApp = new Elysia() 88 | .use(opentelemetry({ serviceName: 'error-details-test' })) 89 | .onError(({ error }) => { 90 | errorHandlerCalled = true 91 | const span = trace.getActiveSpan() 92 | if (span) { 93 | // Check if error was recorded 94 | spanHasError = span.isRecording() 95 | } 96 | return { 97 | error: 98 | error instanceof Error ? error.message : String(error) 99 | } 100 | }) 101 | .get('/error-details', () => { 102 | throw new Error('Test error for details') 103 | }) 104 | 105 | const response = await testApp.handle(req('/error-details')) 106 | 107 | // Wait a bit for async operations 108 | await new Promise((resolve) => setTimeout(resolve, 100)) 109 | 110 | expect(response.status).toBe(500) 111 | expect(errorHandlerCalled).toBe(true) 112 | expect(spanHasError).toBe(true) 113 | }) 114 | 115 | it('should handle multiple onError handlers correctly', async () => { 116 | let firstHandlerCalled = false 117 | let secondHandlerCalled = false 118 | let rootSpanId: string | undefined 119 | 120 | const testApp = new Elysia() 121 | .use(opentelemetry({ serviceName: 'multiple-handlers-test' })) 122 | .onError(({ code }) => { 123 | firstHandlerCalled = true 124 | }) 125 | .onError(({ error }) => { 126 | secondHandlerCalled = true 127 | const span = trace.getActiveSpan() 128 | if (span) rootSpanId = span.spanContext().spanId 129 | 130 | return { 131 | error: 132 | error instanceof Error ? error.message : String(error) 133 | } 134 | }) 135 | .get('/multiple-handlers', () => { 136 | throw new Error('Test with multiple handlers') 137 | }) 138 | 139 | const response = await testApp.handle(req('/multiple-handlers')) 140 | 141 | // Wait a bit for async operations 142 | await new Promise((resolve) => setTimeout(resolve, 100)) 143 | 144 | expect(response.status).toBe(500) 145 | expect(firstHandlerCalled).toBe(true) 146 | expect(rootSpanId).toBeDefined() 147 | }) 148 | 149 | it('should handle errors in async routes with custom onError', async () => { 150 | let rootSpanEnded = false 151 | let errorHandlerCalled = false 152 | 153 | const testApp = new Elysia() 154 | .use(opentelemetry({ serviceName: 'async-error-test' })) 155 | .onError(({ error }) => { 156 | errorHandlerCalled = true 157 | return { 158 | error: 159 | error instanceof Error ? error.message : String(error) 160 | } 161 | }) 162 | .get('/async-error', async () => { 163 | const span = trace.getActiveSpan() 164 | if (span) { 165 | const originalEnd = span.end.bind(span) 166 | span.end = function (...args: any[]) { 167 | rootSpanEnded = true 168 | return originalEnd(...args) 169 | } 170 | } 171 | await new Promise((resolve) => setTimeout(resolve, 10)) 172 | throw new Error('Async error') 173 | }) 174 | 175 | const response = await testApp.handle(req('/async-error')) 176 | 177 | // Wait a bit for async operations 178 | await new Promise((resolve) => setTimeout(resolve, 100)) 179 | 180 | expect(response.status).toBe(500) 181 | expect(errorHandlerCalled).toBe(true) 182 | expect(rootSpanEnded).toBe(true) 183 | }) 184 | 185 | it('should handle custom error types with onError handler', async () => { 186 | class CustomError extends Error { 187 | constructor(message: string) { 188 | super(message) 189 | this.name = 'CustomError' 190 | } 191 | } 192 | 193 | let errorHandlerCalled = false 194 | let errorType: string | undefined 195 | 196 | const testApp = new Elysia() 197 | .use(opentelemetry({ serviceName: 'custom-error-test' })) 198 | .error({ 199 | CUSTOM_ERROR: CustomError 200 | }) 201 | .onError(({ error, code }) => { 202 | errorHandlerCalled = true 203 | errorType = String(code) 204 | if (code === 'CUSTOM_ERROR') { 205 | return { 206 | customError: 207 | error instanceof Error 208 | ? error.message 209 | : String(error) 210 | } 211 | } 212 | return { 213 | error: 214 | error instanceof Error ? error.message : String(error) 215 | } 216 | }) 217 | .get('/custom-error', () => { 218 | throw new CustomError('Custom error occurred') 219 | }) 220 | 221 | const response = await testApp.handle(req('/custom-error')) 222 | 223 | // Wait a bit for async operations 224 | await new Promise((resolve) => setTimeout(resolve, 100)) 225 | 226 | expect(response.status).toBe(500) 227 | expect(errorHandlerCalled).toBe(true) 228 | expect(errorType).toBe('CUSTOM_ERROR') 229 | const body = await response.json() 230 | expect(body.customError).toBe('Custom error occurred') 231 | }) 232 | }) 233 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "ES2022", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | "types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "resolveJsonModule": true, /* Enable importing .json files. */ 39 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 40 | 41 | /* JavaScript Support */ 42 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 43 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 44 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 45 | 46 | /* Emit */ 47 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 48 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 49 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 50 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 51 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 52 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 53 | // "removeComments": true, /* Disable emitting comments. */ 54 | // "noEmit": true, /* Disable emitting files from a compilation. */ 55 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 56 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 57 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 58 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 59 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 60 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 61 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 62 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 63 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 64 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 65 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 66 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 67 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 68 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 69 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 70 | 71 | /* Interop Constraints */ 72 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 73 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 74 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 75 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 76 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 77 | 78 | /* Type Checking */ 79 | "strict": true, /* Enable all strict type-checking options. */ 80 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 81 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 82 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 83 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 84 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 85 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 86 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 87 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 88 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 89 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 90 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 91 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 92 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 93 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 94 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 95 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 96 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 97 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 98 | 99 | /* Completeness */ 100 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 101 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /tsconfig.dts.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "preserveSymlinks": true, 4 | /* Visit https://aka.ms/tsconfig to read more about this file */ 5 | 6 | /* Projects */ 7 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 8 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 9 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 10 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 11 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 12 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 13 | 14 | /* Language and Environment */ 15 | "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 16 | "lib": ["ESNext"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 17 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 18 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 19 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 20 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 21 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 22 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 23 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 24 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 25 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 26 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 27 | 28 | /* Modules */ 29 | "module": "ES2022", /* Specify what module code is generated. */ 30 | "rootDir": "./src", /* Specify the root folder within your source files. */ 31 | "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 32 | // "baseUrl": "./src", /* Specify the base directory to resolve non-relative module names. */ 33 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 34 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 35 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 36 | // "types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */ 37 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 38 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 39 | "resolveJsonModule": true, /* Enable importing .json files. */ 40 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 41 | 42 | /* JavaScript Support */ 43 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 44 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 45 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 46 | 47 | /* Emit */ 48 | "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 49 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 50 | "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 51 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 52 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 53 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 54 | // "removeComments": true, /* Disable emitting comments. */ 55 | // "noEmit": true, /* Disable emitting files from a compilation. */ 56 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 57 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 58 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 59 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 61 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 62 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 63 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 64 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 65 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 66 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 67 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 68 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 69 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 70 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 71 | 72 | /* Interop Constraints */ 73 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 74 | "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 75 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 76 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 77 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 78 | 79 | /* Type Checking */ 80 | "strict": true, /* Enable all strict type-checking options. */ 81 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 82 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 83 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 84 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 85 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 86 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 87 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 88 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 89 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 90 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 91 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 92 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 93 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 94 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 95 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 96 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 97 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 98 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 99 | 100 | /* Completeness */ 101 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 102 | "skipLibCheck": true, /* Skip type checking all .d.ts files. */ 103 | }, 104 | "exclude": ["node_modules", "test", "example", "dist", "build.ts"] 105 | // "include": ["src/**/*"] 106 | } 107 | -------------------------------------------------------------------------------- /test/integration.test.ts: -------------------------------------------------------------------------------- 1 | import { Elysia } from 'elysia' 2 | import { treaty } from '@elysiajs/eden' 3 | import { opentelemetry } from '../src' 4 | import { describe, expect, it } from 'bun:test' 5 | import { trace } from '@opentelemetry/api' 6 | import { captureSpanData, req } from './test-setup' 7 | 8 | describe('Elysia Integration', () => { 9 | it('should handle different HTTP methods with tracing', async () => { 10 | const spanData: any[] = [] 11 | 12 | const testApp = new Elysia() 13 | .use( 14 | opentelemetry({ 15 | serviceName: 'http-methods-test' 16 | }) 17 | ) 18 | .get('/get', () => { 19 | try { 20 | spanData.push(captureSpanData('GET')) 21 | } catch {} 22 | return { method: 'GET' } 23 | }) 24 | .post('/post', () => { 25 | try { 26 | spanData.push(captureSpanData('POST')) 27 | } catch {} 28 | return { method: 'POST' } 29 | }) 30 | .put('/put', () => { 31 | try { 32 | spanData.push(captureSpanData('PUT')) 33 | } catch {} 34 | return { method: 'PUT' } 35 | }) 36 | .delete('/delete', () => { 37 | try { 38 | spanData.push(captureSpanData('DELETE')) 39 | } catch {} 40 | return { method: 'DELETE' } 41 | }) 42 | 43 | const client = treaty(testApp) 44 | 45 | const getResponse = await client.get.get() 46 | expect(getResponse.status).toBe(200) 47 | expect(getResponse.data?.method).toBe('GET') 48 | 49 | const postResponse = await client.post.post() 50 | expect(postResponse.status).toBe(200) 51 | expect(postResponse.data?.method).toBe('POST') 52 | 53 | const putResponse = await client.put.put() 54 | expect(putResponse.status).toBe(200) 55 | expect(putResponse.data?.method).toBe('PUT') 56 | 57 | const deleteResponse = await client.delete.delete() 58 | expect(deleteResponse.status).toBe(200) 59 | expect(deleteResponse.data?.method).toBe('DELETE') 60 | 61 | // Verify spans were created for each HTTP method 62 | expect(spanData).toHaveLength(4) 63 | spanData.forEach((span, index) => { 64 | expect(span.traceId).toBeDefined() 65 | expect(span.spanId).toBeDefined() 66 | expect(span.isRecording).toBe(true) 67 | }) 68 | 69 | // Verify each request had a unique trace 70 | const traceIds = spanData.map((s) => s.traceId) 71 | const uniqueTraceIds = new Set(traceIds) 72 | expect(uniqueTraceIds.size).toBe(4) 73 | }) 74 | 75 | it('should handle POST requests with tracing', async () => { 76 | const testApp = new Elysia() 77 | .use( 78 | opentelemetry({ 79 | serviceName: 'test-post-app' 80 | }) 81 | ) 82 | .post('/data', ({ body }) => ({ received: body })) 83 | 84 | const client = treaty(testApp) 85 | const response = await client.data.post({ test: 'data' }) 86 | 87 | expect(response.status).toBe(200) 88 | expect(response.data?.received).toEqual({ test: 'data' }) 89 | }) 90 | 91 | it('should trace requests with headers', async () => { 92 | let spanData: any = null 93 | 94 | const testApp = new Elysia() 95 | .use( 96 | opentelemetry({ 97 | serviceName: 'headers-test' 98 | }) 99 | ) 100 | .get('/headers', ({ headers }) => { 101 | try { 102 | spanData = captureSpanData('headers-request') 103 | } catch {} 104 | const span = trace.getActiveSpan() 105 | if (span) { 106 | span.setAttributes({ 107 | 'http.user_agent': headers['user-agent'] || '', 108 | 'http.content_type': headers['content-type'] || '' 109 | }) 110 | } 111 | return { 112 | userAgent: headers['user-agent'], 113 | contentType: headers['content-type'] 114 | } 115 | }) 116 | 117 | const client = treaty(testApp) 118 | const response = await client.headers.get({ 119 | headers: { 120 | 'user-agent': 'test-agent', 121 | 'content-type': 'application/json' 122 | } 123 | }) 124 | 125 | expect(response.status).toBe(200) 126 | expect(response.data?.userAgent).toBe('test-agent') 127 | expect(response.data?.contentType).toBe('application/json') 128 | 129 | // Verify span was created and attributes were set 130 | expect(spanData).not.toBeNull() 131 | expect(spanData!.traceId).toBeDefined() 132 | expect(spanData!.spanId).toBeDefined() 133 | expect(spanData!.isRecording).toBe(true) 134 | }) 135 | 136 | it('should handle query parameters with tracing', async () => { 137 | let spanData: any = null 138 | 139 | const testApp = new Elysia() 140 | .use( 141 | opentelemetry({ 142 | serviceName: 'query-params-test' 143 | }) 144 | ) 145 | .get('/search', ({ query }) => { 146 | try { 147 | spanData = captureSpanData('search-request') 148 | } catch {} 149 | const span = trace.getActiveSpan() 150 | if (span) { 151 | span.setAttributes({ 152 | 'query.q': query.q || '', 153 | 'query.limit': query.limit || '' 154 | }) 155 | } 156 | return { 157 | query: query.q, 158 | limit: query.limit 159 | } 160 | }) 161 | 162 | const client = treaty(testApp) 163 | const response = await client.search.get({ 164 | query: { 165 | q: 'test-search', 166 | limit: '10' 167 | } 168 | }) 169 | 170 | expect(response.status).toBe(200) 171 | expect(response.data?.query).toBe('test-search') 172 | expect(response.data?.limit).toBe('10') 173 | 174 | // Verify span was created and captured query parameters 175 | expect(spanData).not.toBeNull() 176 | expect(spanData!.traceId).toBeDefined() 177 | expect(spanData!.spanId).toBeDefined() 178 | expect(spanData!.isRecording).toBe(true) 179 | }) 180 | 181 | it('should work with middleware and tracing', async () => { 182 | let middlewareCalled = false 183 | let middlewareSpanData: any = null 184 | let handlerSpanData: any = null 185 | 186 | const testApp = new Elysia() 187 | .use( 188 | opentelemetry({ 189 | serviceName: 'middleware-test' 190 | }) 191 | ) 192 | .onBeforeHandle(() => { 193 | middlewareCalled = true 194 | try { 195 | middlewareSpanData = captureSpanData('middleware-before') 196 | } catch {} 197 | }) 198 | .get('/middleware', () => { 199 | try { 200 | handlerSpanData = captureSpanData('middleware-handler') 201 | } catch {} 202 | return { middleware: 'executed' } 203 | }) 204 | 205 | const client = treaty(testApp) 206 | const response = await client.middleware.get() 207 | 208 | expect(response.status).toBe(200) 209 | expect(response.data?.middleware).toBe('executed') 210 | expect(middlewareCalled).toBe(true) 211 | 212 | // Verify spans were created in both middleware and handler 213 | expect(middlewareSpanData).not.toBeNull() 214 | expect(handlerSpanData).not.toBeNull() 215 | expect(middlewareSpanData!.traceId).toBeDefined() 216 | expect(handlerSpanData!.traceId).toBeDefined() 217 | // Should be same trace for middleware and handler 218 | expect(middlewareSpanData!.traceId).toBe(handlerSpanData!.traceId) 219 | expect(middlewareSpanData!.isRecording).toBe(true) 220 | expect(handlerSpanData!.isRecording).toBe(true) 221 | }) 222 | 223 | it('should trace nested route groups', async () => { 224 | let spanData: any = null 225 | 226 | const testApp = new Elysia() 227 | .use( 228 | opentelemetry({ 229 | serviceName: 'nested-routes-test' 230 | }) 231 | ) 232 | .group('/api', (app) => 233 | app.group('/v1', (app) => 234 | app.get('/users', () => { 235 | try { 236 | spanData = captureSpanData('nested-route') 237 | } catch {} 238 | const span = trace.getActiveSpan() 239 | if (span) { 240 | span.setAttributes({ 241 | 'route.group': '/api/v1', 242 | 'route.endpoint': '/users' 243 | }) 244 | } 245 | return { users: ['user1', 'user2'] } 246 | }) 247 | ) 248 | ) 249 | 250 | const client = treaty(testApp) 251 | const response = await client.api.v1.users.get() 252 | 253 | expect(response.status).toBe(200) 254 | expect(response.data?.users).toEqual(['user1', 'user2']) 255 | 256 | // Verify span was created for nested route 257 | expect(spanData).not.toBeNull() 258 | expect(spanData!.traceId).toBeDefined() 259 | expect(spanData!.spanId).toBeDefined() 260 | expect(spanData!.isRecording).toBe(true) 261 | }) 262 | 263 | it('should handle response with different status codes', async () => { 264 | const spanData: any[] = [] 265 | 266 | const testApp = new Elysia() 267 | .use( 268 | opentelemetry({ 269 | serviceName: 'status-codes-test' 270 | }) 271 | ) 272 | .get('/ok', () => { 273 | try { 274 | spanData.push(captureSpanData('status-200')) 275 | } catch {} 276 | return { status: 'ok' } 277 | }) 278 | .get('/created', ({ set }) => { 279 | try { 280 | spanData.push(captureSpanData('status-201')) 281 | } catch {} 282 | const span = trace.getActiveSpan() 283 | if (span) { 284 | span.setAttributes({ 'http.status_code': 201 }) 285 | } 286 | set.status = 201 287 | return { status: 'created' } 288 | }) 289 | .get('/accepted', ({ set }) => { 290 | try { 291 | spanData.push(captureSpanData('status-202')) 292 | } catch {} 293 | const span = trace.getActiveSpan() 294 | if (span) { 295 | span.setAttributes({ 'http.status_code': 202 }) 296 | } 297 | set.status = 202 298 | return { status: 'accepted' } 299 | }) 300 | 301 | const client = treaty(testApp) 302 | 303 | const okResponse = await client.ok.get() 304 | expect(okResponse.status).toBe(200) 305 | 306 | const createdResponse = await client.created.get() 307 | expect(createdResponse.status).toBe(201) 308 | 309 | const acceptedResponse = await client.accepted.get() 310 | expect(acceptedResponse.status).toBe(202) 311 | 312 | // Verify spans were created for each status code 313 | expect(spanData).toHaveLength(3) 314 | spanData.forEach((span) => { 315 | expect(span.traceId).toBeDefined() 316 | expect(span.spanId).toBeDefined() 317 | expect(span.isRecording).toBe(true) 318 | }) 319 | 320 | // Each request should have unique traces 321 | const traceIds = spanData.map((s) => s.traceId) 322 | const uniqueTraceIds = new Set(traceIds) 323 | expect(uniqueTraceIds.size).toBe(3) 324 | }) 325 | 326 | it('should trace multiple consecutive requests', async () => { 327 | const testApp = new Elysia() 328 | .use( 329 | opentelemetry({ 330 | serviceName: 'multi-request-test' 331 | }) 332 | ) 333 | .get('/request/:id', ({ params }) => ({ id: params.id })) 334 | 335 | const client = treaty(testApp) 336 | 337 | // Make multiple requests 338 | for (let i = 1; i <= 3; i++) { 339 | const response = await client.request({ id: i.toString() }).get() 340 | expect(response.status).toBe(200) 341 | expect(response.data?.id).toBe(i.toString()) 342 | } 343 | }) 344 | 345 | it('should handle 404 errors with tracing', async () => { 346 | const testApp = new Elysia() 347 | .use( 348 | opentelemetry({ 349 | serviceName: 'error-test-app' 350 | }) 351 | ) 352 | .get('/exists', () => 'Found') 353 | 354 | // Eden doesn't have a direct way to call non-existent routes, 355 | // so we'll use the raw handle method for this test 356 | const response = await testApp.handle(req('/not-found')) 357 | expect(response.status).toBe(404) 358 | }) 359 | 360 | it('should handle application errors with tracing', async () => { 361 | const testApp = new Elysia() 362 | .use( 363 | opentelemetry({ 364 | serviceName: 'app-error-test' 365 | }) 366 | ) 367 | .get('/error', () => { 368 | throw new Error('Application error') 369 | }) 370 | 371 | const client = treaty(testApp) 372 | 373 | try { 374 | await client.error.get() 375 | } catch (error) { 376 | // Error should be handled by OpenTelemetry tracing 377 | expect(error).toBeDefined() 378 | } 379 | }) 380 | }) 381 | -------------------------------------------------------------------------------- /test/advanced.test.ts: -------------------------------------------------------------------------------- 1 | import { Elysia } from 'elysia' 2 | import { opentelemetry, getTracer, startActiveSpan } from '../src' 3 | import { describe, expect, it } from 'bun:test' 4 | import { trace, SpanStatusCode } from '@opentelemetry/api' 5 | import { captureSpanData, req } from './test-setup' 6 | 7 | describe('Advanced OpenTelemetry Features', () => { 8 | it('should propagate trace context across nested spans', async () => { 9 | let rootTraceId: string | undefined 10 | let childTraceId: string | undefined 11 | let parentSpanId: string | undefined 12 | let childSpanId: string | undefined 13 | 14 | const testApp = new Elysia() 15 | .use(opentelemetry({ serviceName: 'nested-spans-test' })) 16 | .get('/nested', () => { 17 | const rootSpan = trace.getActiveSpan() 18 | if (rootSpan) { 19 | rootTraceId = rootSpan.spanContext().traceId 20 | parentSpanId = rootSpan.spanContext().spanId 21 | } 22 | 23 | // Create a child span 24 | return startActiveSpan('child-operation', (childSpan) => { 25 | childTraceId = childSpan.spanContext().traceId 26 | childSpanId = childSpan.spanContext().spanId 27 | childSpan.setAttributes({ 'operation.type': 'child' }) 28 | return { nested: 'success' } 29 | }) 30 | }) 31 | 32 | const response = await testApp.handle(req('/nested')) 33 | 34 | expect(response.status).toBe(200) 35 | expect(rootTraceId).toBeDefined() 36 | expect(childTraceId).toBeDefined() 37 | expect(rootTraceId).toBe(childTraceId!) // Same trace 38 | expect(parentSpanId).toBeDefined() 39 | expect(childSpanId).toBeDefined() 40 | expect(parentSpanId).not.toBe(childSpanId) // Different spans 41 | }) 42 | 43 | it('should handle span status and error recording', async () => { 44 | let spanStatus: any = null 45 | 46 | const testApp = new Elysia() 47 | .use(opentelemetry({ serviceName: 'span-status-test' })) 48 | .get('/error-span', () => { 49 | const span = trace.getActiveSpan() 50 | if (span) { 51 | // Record an error 52 | const error = new Error('Simulated error') 53 | span.recordException(error) 54 | span.setStatus({ 55 | code: SpanStatusCode.ERROR, 56 | message: 'Operation failed' 57 | }) 58 | 59 | // Add a custom event 60 | span.addEvent('custom.event', { 61 | 'error.type': 'simulation', 62 | 'error.message': error.message 63 | }) 64 | 65 | spanStatus = span.spanContext() 66 | } 67 | return { status: 'error-recorded' } 68 | }) 69 | 70 | const response = await testApp.handle(req('/error-span')) 71 | 72 | expect(response.status).toBe(200) 73 | expect(spanStatus).toBeDefined() 74 | const result = await response.json() 75 | expect(result.status).toBe('error-recorded') 76 | }) 77 | 78 | it('should handle concurrent requests with separate traces', async () => { 79 | const traceIds = new Set() 80 | const spanIds = new Set() 81 | 82 | const testApp = new Elysia() 83 | .use(opentelemetry({ serviceName: 'concurrent-test' })) 84 | .get('/concurrent/:id', ({ params }) => { 85 | const span = trace.getActiveSpan() 86 | if (span) { 87 | const context = span.spanContext() 88 | traceIds.add(context.traceId) 89 | spanIds.add(context.spanId) 90 | } 91 | return { id: params.id } 92 | }) 93 | 94 | // Make multiple concurrent requests 95 | const promises = Array.from({ length: 5 }, (_, i) => 96 | testApp.handle(req(`/concurrent/${i}`)) 97 | ) 98 | 99 | const responses = await Promise.all(promises) 100 | 101 | // All should be successful 102 | responses.forEach((response, i) => { 103 | expect(response.status).toBe(200) 104 | }) 105 | 106 | // Each request should have unique trace and span IDs 107 | expect(traceIds.size).toBe(5) 108 | expect(spanIds.size).toBe(5) 109 | }) 110 | 111 | it('should handle trace context headers properly', async () => { 112 | let receivedTraceId: string | undefined 113 | let receivedSpanId: string | undefined 114 | 115 | const testApp = new Elysia() 116 | .use(opentelemetry({ serviceName: 'trace-headers-test' })) 117 | .get('/trace-headers', () => { 118 | const span = trace.getActiveSpan() 119 | if (span) { 120 | const context = span.spanContext() 121 | receivedTraceId = context.traceId 122 | receivedSpanId = context.spanId 123 | } 124 | return { received: 'trace-context' } 125 | }) 126 | 127 | // Send request with trace headers 128 | const response = await testApp.handle( 129 | req('/trace-headers', { 130 | headers: { 131 | traceparent: 132 | '00-12345678901234567890123456789012-1234567890123456-01' 133 | } 134 | }) 135 | ) 136 | 137 | expect(response.status).toBe(200) 138 | expect(receivedTraceId).toBeDefined() 139 | expect(receivedSpanId).toBeDefined() 140 | }) 141 | 142 | it('should work with custom instrumentations', async () => { 143 | let customSpanCreated = false 144 | 145 | const testApp = new Elysia() 146 | .use(opentelemetry({ serviceName: 'custom-instrumentation-test' })) 147 | .get('/custom-instrumentation', () => { 148 | // Create a custom span within the request 149 | const tracer = getTracer() 150 | const customSpan = tracer.startSpan('custom-operation') 151 | 152 | customSpan.setAttributes({ 153 | 'custom.attribute': 'test-value', 154 | 'operation.name': 'custom-operation' 155 | }) 156 | 157 | customSpan.addEvent('operation.start') 158 | customSpanCreated = true 159 | customSpan.end() 160 | 161 | return { custom: 'instrumentation-complete' } 162 | }) 163 | 164 | const response = await testApp.handle(req('/custom-instrumentation')) 165 | 166 | expect(response.status).toBe(200) 167 | expect(customSpanCreated).toBe(true) 168 | const result = await response.json() 169 | expect(result.custom).toBe('instrumentation-complete') 170 | }) 171 | 172 | it('should support custom span attributes in routes', async () => { 173 | const testApp = new Elysia() 174 | .use( 175 | opentelemetry({ 176 | serviceName: 'custom-attributes-test' 177 | }) 178 | ) 179 | .get('/custom', () => { 180 | // In a real scenario, you would get the current span and set attributes 181 | const currentSpan = trace.getActiveSpan() 182 | if (currentSpan) { 183 | currentSpan.setAttributes({ 184 | 'custom.attribute': 'custom-value', 185 | 'request.type': 'api' 186 | }) 187 | } 188 | return { message: 'Custom attributes set' } 189 | }) 190 | 191 | const response = await testApp.handle(req('/custom')) 192 | expect(response.status).toBe(200) 193 | const result = await response.json() 194 | expect(result.message).toBe('Custom attributes set') 195 | }) 196 | 197 | it('should handle large request bodies with tracing', async () => { 198 | let spanData: any = null 199 | const largeData = { 200 | users: Array.from({ length: 1000 }, (_, i) => ({ 201 | id: i, 202 | name: `User ${i}`, 203 | email: `user${i}@example.com` 204 | })) 205 | } 206 | 207 | const testApp = new Elysia() 208 | .use(opentelemetry({ serviceName: 'large-body-test' })) 209 | .post('/large-data', ({ body }) => { 210 | try { 211 | spanData = captureSpanData('large-body-request') 212 | } catch {} 213 | const span = trace.getActiveSpan() 214 | if (span) { 215 | span.setAttributes({ 216 | 'request.body.size': JSON.stringify(body).length, 217 | 'request.users.count': (body as any).users?.length || 0 218 | }) 219 | } 220 | return { 221 | received: Array.isArray((body as any).users), 222 | count: (body as any).users?.length || 0 223 | } 224 | }) 225 | 226 | const response = await testApp.handle( 227 | req('/large-data', { 228 | method: 'POST', 229 | headers: { 'Content-Type': 'application/json' }, 230 | body: JSON.stringify(largeData) 231 | }) 232 | ) 233 | 234 | expect(response.status).toBe(200) 235 | const result = await response.json() 236 | expect(result.received).toBe(true) 237 | expect(result.count).toBe(1000) 238 | 239 | // Verify span handled large request properly 240 | expect(spanData).not.toBeNull() 241 | expect(spanData!.traceId).toBeDefined() 242 | expect(spanData!.spanId).toBeDefined() 243 | expect(spanData!.isRecording).toBe(true) 244 | }) 245 | 246 | it('should handle WebSocket-style long-running operations', async () => { 247 | let operationCompleted = false 248 | let spanData: any = null 249 | let eventsAdded = 0 250 | 251 | const testApp = new Elysia() 252 | .use(opentelemetry({ serviceName: 'long-operation-test' })) 253 | .get('/long-operation', async () => { 254 | try { 255 | spanData = captureSpanData('long-operation') 256 | } catch {} 257 | const span = trace.getActiveSpan() 258 | if (span) { 259 | span.addEvent('operation.start') 260 | eventsAdded++ 261 | span.setAttributes({ 'operation.type': 'long-running' }) 262 | } 263 | 264 | // Simulate long-running operation 265 | await new Promise((resolve) => setTimeout(resolve, 100)) 266 | 267 | if (span) { 268 | span.addEvent('operation.complete') 269 | eventsAdded++ 270 | } 271 | 272 | operationCompleted = true 273 | return { operation: 'completed' } 274 | }) 275 | 276 | const response = await testApp.handle(req('/long-operation')) 277 | 278 | expect(response.status).toBe(200) 279 | expect(operationCompleted).toBe(true) 280 | const result = await response.json() 281 | expect(result.operation).toBe('completed') 282 | 283 | // Verify span tracked the long operation 284 | expect(spanData).not.toBeNull() 285 | expect(spanData!.traceId).toBeDefined() 286 | expect(spanData!.spanId).toBeDefined() 287 | expect(spanData!.isRecording).toBe(true) 288 | expect(eventsAdded).toBe(2) // start and complete events 289 | }) 290 | 291 | it('should handle plugin configuration edge cases', async () => { 292 | // Test with minimal configuration 293 | const minimalPlugin = opentelemetry({}) 294 | expect(minimalPlugin).toBeDefined() 295 | 296 | // Test with comprehensive configuration 297 | const comprehensivePlugin = opentelemetry({ 298 | serviceName: 'comprehensive-test' 299 | }) 300 | expect(comprehensivePlugin).toBeDefined() 301 | 302 | let spanData: any = null 303 | 304 | const testApp = new Elysia() 305 | .use(comprehensivePlugin) 306 | .get('/config-test', () => { 307 | try { 308 | spanData = captureSpanData('config-test') 309 | } catch {} 310 | return { config: 'tested' } 311 | }) 312 | 313 | const response = await testApp.handle(req('/config-test')) 314 | expect(response.status).toBe(200) 315 | 316 | // Verify span was created even with edge case configuration 317 | expect(spanData).not.toBeNull() 318 | expect(spanData!.traceId).toBeDefined() 319 | expect(spanData!.spanId).toBeDefined() 320 | expect(spanData!.isRecording).toBe(true) 321 | }) 322 | 323 | it('should handle memory cleanup and span isolation', async () => { 324 | const spanCounts = new Map() 325 | 326 | const testApp = new Elysia() 327 | .use(opentelemetry({ serviceName: 'memory-test' })) 328 | .get('/memory/:session', ({ params }) => { 329 | const span = trace.getActiveSpan() 330 | if (span) { 331 | const traceId = span.spanContext().traceId 332 | spanCounts.set(traceId, (spanCounts.get(traceId) || 0) + 1) 333 | } 334 | return { session: params.session } 335 | }) 336 | 337 | // Make requests with different sessions 338 | for (let i = 0; i < 10; i++) { 339 | const response = await testApp.handle(req(`/memory/session-${i}`)) 340 | expect(response.status).toBe(200) 341 | } 342 | 343 | // Each request should have created a unique trace 344 | expect(spanCounts.size).toBe(10) 345 | // Each trace should have exactly one span 346 | spanCounts.forEach((count) => { 347 | expect(count).toBe(1) 348 | }) 349 | }) 350 | 351 | it('should handle errors in span creation gracefully', async () => { 352 | let errorHandled = false 353 | 354 | const testApp = new Elysia() 355 | .use(opentelemetry({ serviceName: 'error-handling-test' })) 356 | .get('/span-error', () => { 357 | try { 358 | // Try to create a span that might fail 359 | const span = trace.getActiveSpan() 360 | if (span) { 361 | // Simulate potential error scenario 362 | span.setAttributes({ 'test.error': 'handled' }) 363 | } 364 | errorHandled = true 365 | } catch (error) { 366 | errorHandled = false 367 | } 368 | return { error: 'handled' } 369 | }) 370 | 371 | const response = await testApp.handle(req('/span-error')) 372 | expect(response.status).toBe(200) 373 | expect(errorHandled).toBe(true) 374 | }) 375 | }) 376 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Elysia, type TraceEvent, type TraceProcess, StatusMap } from 'elysia' 2 | import { 3 | trace, 4 | context as otelContext, 5 | propagation, 6 | SpanStatusCode, 7 | type ContextManager, 8 | type Context, 9 | type SpanOptions, 10 | type Span, 11 | type Attributes, 12 | TraceAPI, 13 | ProxyTracer, 14 | SpanKind 15 | } from '@opentelemetry/api' 16 | 17 | import { NodeSDK } from '@opentelemetry/sdk-node' 18 | 19 | // @ts-ignore bun only 20 | const headerHasToJSON = typeof new Headers().toJSON === 'function' 21 | 22 | const parseNumericString = (message: string): number | null => { 23 | if (message.length < 16) { 24 | if (message.length === 0) return null 25 | 26 | const length = Number(message) 27 | if (Number.isNaN(length)) return null 28 | 29 | return length 30 | } 31 | 32 | // if 16 digit but less then 9,007,199,254,740,991 then can be parsed 33 | if (message.length === 16) { 34 | const number = Number(message) 35 | 36 | if ( 37 | number.toString() !== message || 38 | message.trim().length === 0 || 39 | Number.isNaN(number) 40 | ) 41 | return null 42 | 43 | return number 44 | } 45 | 46 | return null 47 | } 48 | 49 | type OpenTeleMetryOptions = NonNullable< 50 | ConstructorParameters[0] 51 | > 52 | 53 | /** 54 | * Initialize OpenTelemetry SDK 55 | * 56 | * For best practice, you should be using preload OpenTelemetry SDK if possible 57 | * however, this is a simple way to initialize OpenTelemetry SDK 58 | */ 59 | export interface ElysiaOpenTelemetryOptions extends OpenTeleMetryOptions { 60 | contextManager?: ContextManager 61 | /** 62 | * Optional function to determine whether a given request should be traced. 63 | * 64 | * @param req - The incoming request object to evaluate. 65 | * @returns A boolean indicating whether tracing should be enabled for this request. 66 | */ 67 | checkIfShouldTrace?: (req: Request) => boolean 68 | } 69 | 70 | export type ActiveSpanArgs< 71 | F extends (span: Span) => unknown = (span: Span) => unknown 72 | > = 73 | | [name: string, fn: F] 74 | | [name: string, options: SpanOptions, fn: F] 75 | | [name: string, options: SpanOptions, context: Context, fn: F] 76 | 77 | const createActiveSpanHandler = (fn: (span: Span) => unknown) => 78 | function (span: Span) { 79 | try { 80 | const result = fn(span) 81 | 82 | // @ts-ignore 83 | if (result instanceof Promise || typeof result?.then === 'function') 84 | // @ts-ignore 85 | return Promise.resolve(result).then( 86 | (value) => { 87 | span.end() 88 | return value 89 | }, 90 | (rejectResult) => { 91 | span.setStatus({ 92 | code: SpanStatusCode.ERROR, 93 | message: 94 | rejectResult instanceof Error 95 | ? rejectResult.message 96 | : JSON.stringify( 97 | rejectResult ?? 'Unknown error' 98 | ) 99 | }) 100 | 101 | span.recordException(rejectResult) 102 | span.end() 103 | throw rejectResult 104 | } 105 | ) 106 | 107 | span.end() 108 | return result 109 | } catch (error) { 110 | const err = error as Error 111 | 112 | span.setStatus({ 113 | code: SpanStatusCode.ERROR, 114 | message: err?.message 115 | }) 116 | span.recordException(err) 117 | span.end() 118 | 119 | throw error 120 | } 121 | } 122 | 123 | const createContext = (parent: Span) => ({ 124 | getValue() { 125 | return parent 126 | }, 127 | setValue() { 128 | return otelContext.active() 129 | }, 130 | deleteValue() { 131 | return otelContext.active() 132 | } 133 | }) 134 | 135 | const isNotEmpty = (obj?: Object) => { 136 | if (!obj) return false 137 | 138 | for (const x in obj) return true 139 | 140 | return false 141 | } 142 | 143 | export type Tracer = ReturnType 144 | export type StartSpan = Tracer['startSpan'] 145 | export type StartActiveSpan = Tracer['startActiveSpan'] 146 | 147 | export const contextKeySpan = Symbol.for('OpenTelemetry Context Key SPAN') 148 | 149 | export const getTracer = (): ReturnType => { 150 | const tracer = trace.getTracer('Elysia') 151 | 152 | return { 153 | ...tracer, 154 | startSpan(name: string, options?: SpanOptions, context?: Context) { 155 | return tracer.startSpan(name, options, context) 156 | }, 157 | startActiveSpan(...args: ActiveSpanArgs) { 158 | switch (args.length) { 159 | case 2: 160 | return tracer.startActiveSpan( 161 | args[0], 162 | createActiveSpanHandler(args[1]) 163 | ) 164 | 165 | case 3: 166 | return tracer.startActiveSpan( 167 | args[0], 168 | args[1], 169 | createActiveSpanHandler(args[2]) 170 | ) 171 | 172 | case 4: 173 | return tracer.startActiveSpan( 174 | args[0], 175 | args[1], 176 | args[2], 177 | createActiveSpanHandler(args[3]) 178 | ) 179 | } 180 | } 181 | } 182 | } 183 | 184 | export const startSpan = ( 185 | name: string, 186 | options?: SpanOptions, 187 | context?: Context 188 | ): Span => { 189 | const tracer = getTracer() 190 | 191 | return tracer.startSpan(name, options, context) 192 | } 193 | 194 | export const startActiveSpan: StartActiveSpan = (...args: ActiveSpanArgs) => { 195 | const tracer = getTracer() 196 | 197 | switch (args.length) { 198 | case 2: 199 | return tracer.startActiveSpan( 200 | args[0], 201 | createActiveSpanHandler(args[1]) 202 | ) 203 | 204 | case 3: 205 | return tracer.startActiveSpan( 206 | args[0], 207 | args[1], 208 | createActiveSpanHandler(args[2]) 209 | ) 210 | 211 | case 4: 212 | return tracer.startActiveSpan( 213 | args[0], 214 | args[1], 215 | args[2], 216 | createActiveSpanHandler(args[3]) 217 | ) 218 | } 219 | } 220 | 221 | export const record = startActiveSpan 222 | export const getCurrentSpan = (): Span | undefined => trace.getActiveSpan() 223 | 224 | /** 225 | * Set attributes to the current span 226 | * 227 | * @returns boolean - whether the attributes are set or not 228 | */ 229 | export const setAttributes = (attributes: Attributes) => 230 | !!getCurrentSpan()?.setAttributes(attributes) 231 | 232 | export const opentelemetry = ({ 233 | serviceName = 'Elysia', 234 | instrumentations, 235 | contextManager, 236 | checkIfShouldTrace, 237 | ...options 238 | }: ElysiaOpenTelemetryOptions = {}) => { 239 | let tracer = trace.getTracer(serviceName) 240 | 241 | if (tracer instanceof ProxyTracer) { 242 | const sdk = new NodeSDK({ 243 | ...options, 244 | serviceName, 245 | instrumentations 246 | }) 247 | 248 | sdk.start() 249 | 250 | tracer = trace.getTracer(serviceName) 251 | } else { 252 | // @ts-ignore 253 | // const exporter = tracer?._tracerProvider?._config?.traceExporter 254 | // if ( 255 | // exporter && 256 | // options.traceExporter && 257 | // exporter.constructor.name !== options.traceExporter 258 | // ) 259 | // // @ts-ignore 260 | // tracer._tracerProvider._config.traceExporter = options.traceExporter 261 | } 262 | 263 | // @ts-expect-error private property 264 | if (!otelContext._getContextManager?.() && contextManager) 265 | try { 266 | contextManager.enable() 267 | otelContext.setGlobalContextManager(contextManager) 268 | } catch { 269 | // Noop ContextManager 270 | // _contextManager = { 271 | // active() { 272 | // return otelContext.active() 273 | // }, 274 | // with(value: Context, callback: Function, ...args: any[]) { 275 | // return callback() 276 | // }, 277 | // bind(context: Context, target: any) { 278 | // return target as any 279 | // }, 280 | // enable() { 281 | // return this 282 | // }, 283 | // disable() { 284 | // return this 285 | // } 286 | // } 287 | } 288 | 289 | return new Elysia({ 290 | name: '@elysia/opentelemetry' 291 | }) 292 | .wrap((fn, request) => { 293 | const shouldTrace = checkIfShouldTrace 294 | ? checkIfShouldTrace(request) 295 | : true 296 | 297 | if (!shouldTrace) return fn 298 | 299 | const headers = headerHasToJSON 300 | ? // @ts-ignore bun only 301 | request.headers.toJSON() 302 | : Object.fromEntries(request.headers.entries()) 303 | 304 | const ctx = propagation.extract(otelContext.active(), headers) 305 | 306 | return tracer.startActiveSpan( 307 | 'Root', 308 | { kind: SpanKind.SERVER }, 309 | ctx, 310 | (rootSpan) => { 311 | const spanContext = trace.setSpan(ctx, rootSpan) 312 | // Execute fn within the span's context using with() instead of bind() 313 | // This ensures proper cleanup when the function completes or errors 314 | return (...args: any[]) => { 315 | return otelContext.with(spanContext, () => fn(...args)) 316 | } 317 | } 318 | ) 319 | }) 320 | .trace( 321 | { as: 'global' }, 322 | ({ 323 | id, 324 | onRequest, 325 | onParse, 326 | onTransform, 327 | onBeforeHandle, 328 | onHandle, 329 | onAfterHandle, 330 | onError, 331 | onAfterResponse, 332 | onMapResponse, 333 | context, 334 | context: { 335 | path, 336 | request: { method } 337 | } 338 | }) => { 339 | const rootSpan = trace.getActiveSpan()! 340 | if (!rootSpan) return 341 | 342 | function setParent(span: Span) { 343 | // @ts-ignore 344 | if (span.ended) return 345 | 346 | // @ts-ignore 347 | if (rootSpan.ended) return void span.end() 348 | 349 | const newContext = trace.setSpan(otelContext.active(), span) 350 | 351 | const currentContext: Map = 352 | // @ts-expect-error private property 353 | otelContext.active()._currentContext 354 | 355 | currentContext?.set( 356 | contextKeySpan, 357 | newContext.getValue(contextKeySpan) 358 | ) 359 | } 360 | 361 | function inspect(name: Capitalize) { 362 | return function inspect({ 363 | onEvent, 364 | total, 365 | onStop 366 | }: TraceProcess<'begin', true>) { 367 | if ( 368 | total === 0 || 369 | // @ts-ignore 370 | rootSpan.ended 371 | ) 372 | return 373 | 374 | tracer.startActiveSpan( 375 | name, 376 | {}, 377 | createContext(rootSpan), 378 | (event) => { 379 | if ( 380 | // @ts-ignore 381 | rootSpan.ended 382 | ) 383 | return 384 | 385 | onEvent(({ name, onStop }) => { 386 | tracer.startActiveSpan( 387 | name, 388 | {}, 389 | createContext(event), 390 | (span) => { 391 | setParent(span) 392 | 393 | onStop(({ error }) => { 394 | setParent(rootSpan) 395 | 396 | if ((span as any).ended) return 397 | if (error) { 398 | rootSpan.setStatus({ 399 | code: SpanStatusCode.ERROR, 400 | message: error.message 401 | }) 402 | 403 | span.setAttributes({ 404 | 'error.type': 405 | error.constructor 406 | ?.name ?? 407 | error.name, 408 | 'error.stack': 409 | error.stack 410 | }) 411 | 412 | span.setStatus({ 413 | code: SpanStatusCode.ERROR, 414 | message: error.message 415 | }) 416 | } else { 417 | rootSpan.setStatus({ 418 | code: SpanStatusCode.OK 419 | }) 420 | 421 | span.setStatus({ 422 | code: SpanStatusCode.OK 423 | }) 424 | } 425 | 426 | span.end() 427 | }) 428 | } 429 | ) 430 | }) 431 | 432 | onStop(() => { 433 | setParent(rootSpan) 434 | 435 | if ((event as any).ended) return 436 | event.end() 437 | }) 438 | } 439 | ) 440 | } 441 | } 442 | 443 | // @ts-expect-error private property 444 | const url = context.url 445 | const attributes: Record = 446 | Object.assign(Object.create(null), { 447 | // ? Elysia Custom attribute 448 | 'http.request.id': id, 449 | 'http.request.method': method, 450 | 'url.path': path, 451 | 'url.full': url 452 | }) 453 | 454 | // @ts-ignore private property 455 | if (context.qi && context.qi !== -1) 456 | attributes['url.query'] = url.slice( 457 | // @ts-ignore private property 458 | context.qi + 1 459 | ) 460 | 461 | const protocolSeparator = url.indexOf('://') 462 | if (protocolSeparator > 0) 463 | attributes['url.scheme'] = url.slice(0, protocolSeparator) 464 | 465 | onRequest(inspect('Request')) 466 | onParse(inspect('Parse')) 467 | onTransform(inspect('Transform')) 468 | onBeforeHandle(inspect('BeforeHandle')) 469 | 470 | onHandle(({ onStop }) => { 471 | const span = tracer.startSpan( 472 | 'Handle', 473 | {}, 474 | createContext(rootSpan) 475 | ) 476 | setParent(span) 477 | 478 | onStop(({ error }) => { 479 | setParent(rootSpan) 480 | 481 | // @ts-ignore 482 | if ((span as any).ended || rootSpan.ended) return 483 | 484 | if (error) { 485 | rootSpan.setStatus({ 486 | code: SpanStatusCode.ERROR, 487 | message: error.message 488 | }) 489 | 490 | span.setStatus({ 491 | code: SpanStatusCode.ERROR, 492 | message: error.message 493 | }) 494 | 495 | span.recordException(error) 496 | rootSpan.recordException(error) 497 | } else { 498 | rootSpan.setStatus({ 499 | code: SpanStatusCode.OK 500 | }) 501 | 502 | span.setStatus({ 503 | code: SpanStatusCode.OK 504 | }) 505 | } 506 | 507 | span.end() 508 | }) 509 | }) 510 | 511 | onAfterHandle(inspect('AfterHandle')) 512 | onError((event) => { 513 | inspect('Error')(event) 514 | 515 | event.onStop(() => { 516 | setParent(rootSpan) 517 | if ((rootSpan as any).ended) return 518 | 519 | if ( 520 | // @ts-ignore 521 | !rootSpan.ended 522 | ) 523 | rootSpan.end() 524 | }) 525 | }) 526 | onMapResponse(inspect('MapResponse')) 527 | onTransform(() => { 528 | const { cookie, body, request, route, path } = context 529 | 530 | if (route) 531 | rootSpan.updateName( 532 | // @ts-ignore private property 533 | `${method} ${route || path}` 534 | ) 535 | 536 | if (context.route) attributes['http.route'] = context.route 537 | 538 | /** 539 | * ? Caution: This is not a standard way to get content-length 540 | * 541 | * As state in OpenTelemetry specification: 542 | * The size of the request payload body in bytes. 543 | * This is the number of bytes transferred excluding headers and is often, 544 | * but not always, present as the Content-Length header. 545 | * For requests using transport encoding, this should be the compressed size. 546 | **/ 547 | { 548 | let contentLength = 549 | request.headers.get('content-length') 550 | 551 | if (contentLength) { 552 | const number = parseNumericString(contentLength) 553 | 554 | if (number) 555 | attributes['http.request_content_length'] = 556 | number 557 | } 558 | } 559 | 560 | { 561 | const userAgent = request.headers.get('User-Agent') 562 | 563 | if (userAgent) 564 | attributes['user_agent.original'] = userAgent 565 | } 566 | 567 | const server = context.server 568 | if (server) { 569 | attributes['server.port'] = server.port ?? 80 570 | attributes['server.address'] = server.url.hostname 571 | attributes['server.address'] = server.url.hostname 572 | } 573 | 574 | let headers 575 | 576 | { 577 | let hasHeaders 578 | let _headers: 579 | | [string, string | string[] | undefined][] 580 | | IterableIterator<[string, string]> 581 | 582 | if (context.headers) { 583 | hasHeaders = true 584 | headers = context.headers 585 | _headers = Object.entries(context.headers) 586 | } else if ((hasHeaders = headerHasToJSON)) { 587 | // @ts-ignore bun only 588 | headers = request.headers.toJSON() 589 | _headers = Object.entries(headers) 590 | } else { 591 | headers = {} 592 | _headers = request.headers.entries() 593 | } 594 | 595 | for (let [key, value] of _headers) { 596 | key = key.toLowerCase() 597 | 598 | if (hasHeaders) { 599 | if (key === 'user-agent') continue 600 | 601 | if (typeof value === 'object') 602 | // Handle Set-Cookie array 603 | attributes[`http.request.header.${key}`] = 604 | JSON.stringify(value) 605 | else if (value !== undefined) 606 | attributes[`http.request.header.${key}`] = 607 | value 608 | 609 | continue 610 | } 611 | 612 | if (typeof value === 'object') 613 | // Handle Set-Cookie array 614 | headers[key] = attributes[ 615 | `http.request.header.${key}` 616 | ] = JSON.stringify(value) 617 | else if (value !== undefined) { 618 | if (key === 'user-agent') { 619 | headers[key] = value 620 | 621 | continue 622 | } 623 | 624 | headers[key] = attributes[ 625 | `http.request.header.${key}` 626 | ] = value 627 | } 628 | } 629 | } 630 | 631 | { 632 | let headers 633 | if (context.set.headers instanceof Headers) { 634 | if (headerHasToJSON) 635 | headers = Object.entries( 636 | // @ts-ignore bun only 637 | context.set.headers.toJSON() 638 | ) 639 | else headers = context.set.headers.entries() 640 | } else headers = Object.entries(context.set.headers) 641 | 642 | for (let [key, value] of headers) { 643 | key = key.toLowerCase() 644 | 645 | if (typeof value === 'object') 646 | attributes[`http.response.header.${key}`] = 647 | JSON.stringify(value) 648 | else 649 | attributes[`http.response.header.${key}`] = 650 | value as string 651 | } 652 | } 653 | 654 | // @ts-expect-error available on Elysia IP plugin 655 | if (context.ip) 656 | // @ts-expect-error 657 | attributes['client.address'] = context.ip 658 | else { 659 | const ip = 660 | headers['true-client-ip'] ?? 661 | headers['cf-connection-ip'] ?? 662 | headers['x-forwarded-for'] ?? 663 | headers['x-real-ip'] ?? 664 | server?.requestIP(request) 665 | 666 | if (ip) 667 | attributes['client.address'] = 668 | typeof ip === 'string' 669 | ? ip 670 | : (ip.address ?? ip.toString()) 671 | } 672 | 673 | // ? Elysia Custom attribute 674 | if (cookie) { 675 | const _cookie = >{} 676 | 677 | for (const [key, { value }] of Object.entries(cookie)) 678 | _cookie[key] = JSON.stringify(value) 679 | 680 | attributes['http.request.cookie'] = 681 | JSON.stringify(_cookie) 682 | } 683 | 684 | rootSpan.setAttributes(attributes) 685 | }) 686 | 687 | onMapResponse(() => { 688 | const body = context.body 689 | if (body !== undefined && body !== null) { 690 | const value = 691 | typeof body === 'object' 692 | ? JSON.stringify(body) 693 | : body.toString() 694 | 695 | attributes['http.request.body'] = value 696 | 697 | if (typeof body === 'object') { 698 | if (body instanceof Uint8Array) 699 | attributes['http.request.body.size'] = 700 | body.length 701 | else if (body instanceof ArrayBuffer) 702 | attributes['http.request.body.size'] = 703 | body.byteLength 704 | else if (body instanceof Blob) 705 | attributes['http.request.body.size'] = body.size 706 | 707 | attributes['http.request.body.size'] = value.length 708 | } else { 709 | attributes['http.request.body.size'] = value.length 710 | } 711 | } 712 | 713 | { 714 | let status = context.set.status ?? 200 715 | if (typeof status === 'string') 716 | status = StatusMap[status] ?? 200 717 | 718 | attributes['http.response.status_code'] = status 719 | } 720 | 721 | // @ts-ignore 722 | const response = context.responseValue 723 | if (response !== undefined) 724 | switch (typeof response) { 725 | case 'object': 726 | if (response instanceof Response) { 727 | // Unable to access as async, skip 728 | } else if (response instanceof Uint8Array) 729 | attributes['http.response.body.size'] = 730 | response.length 731 | else if (response instanceof ArrayBuffer) 732 | attributes['http.response.body.size'] = 733 | response.byteLength 734 | else if (response instanceof Blob) 735 | attributes['http.response.body.size'] = 736 | response.size 737 | else { 738 | const value = JSON.stringify(response) 739 | 740 | attributes['http.response.body'] = value 741 | attributes['http.response.body.size'] = 742 | value.length 743 | } 744 | 745 | break 746 | 747 | default: 748 | if (response === undefined || response === null) 749 | attributes['http.response.body.size'] = 0 750 | else { 751 | const value = response.toString() 752 | 753 | attributes['http.response.body'] = value 754 | attributes['http.response.body.size'] = 755 | value.length 756 | } 757 | } 758 | }) 759 | 760 | onAfterResponse((event) => { 761 | inspect('AfterResponse')(event) 762 | 763 | { 764 | let status = context.set.status ?? 200 765 | if (typeof status === 'string') 766 | status = StatusMap[status] ?? 200 767 | 768 | attributes['http.response.status_code'] = status 769 | } 770 | 771 | const body = context.body 772 | if (body !== undefined && body !== null) { 773 | const value = 774 | typeof body === 'object' 775 | ? JSON.stringify(body) 776 | : body.toString() 777 | 778 | attributes['http.request.body'] = value 779 | 780 | if (typeof body === 'object') { 781 | if (body instanceof Uint8Array) 782 | attributes['http.request.body.size'] = 783 | body.length 784 | else if (body instanceof ArrayBuffer) 785 | attributes['http.request.body.size'] = 786 | body.byteLength 787 | else if (body instanceof Blob) 788 | attributes['http.request.body.size'] = body.size 789 | 790 | attributes['http.request.body.size'] = value.length 791 | } else { 792 | attributes['http.request.body.size'] = value.length 793 | } 794 | } 795 | 796 | event.onStop(() => { 797 | setParent(rootSpan) 798 | if ((rootSpan as any).ended) return 799 | 800 | if ( 801 | // @ts-ignore 802 | !rootSpan.ended 803 | ) 804 | rootSpan.end() 805 | }) 806 | }) 807 | 808 | // @ts-ignore 809 | context.request.signal.addEventListener('abort', () => { 810 | const active = trace.getActiveSpan() 811 | if (active && !(active as any).ended) active.end() 812 | 813 | if ((rootSpan as any).ended) return 814 | 815 | rootSpan.setStatus({ 816 | code: SpanStatusCode.ERROR, 817 | message: 'Request aborted' 818 | }) 819 | rootSpan.end() 820 | }) 821 | } 822 | ) 823 | } 824 | -------------------------------------------------------------------------------- /bun.lock: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1, 3 | "configVersion": 0, 4 | "workspaces": { 5 | "": { 6 | "name": "@elysiajs/opentelemetry", 7 | "dependencies": { 8 | "@opentelemetry/api": "^1.9.0", 9 | "@opentelemetry/instrumentation": "^0.200.0", 10 | "@opentelemetry/sdk-node": "^0.200.0", 11 | }, 12 | "devDependencies": { 13 | "@axiomhq/js": "^1.3.1", 14 | "@elysiajs/eden": "^1.3.0", 15 | "@elysiajs/graphql-yoga": "^1.2.0", 16 | "@envelop/core": "^5.2.3", 17 | "@envelop/opentelemetry": "^7.1.3", 18 | "@opentelemetry/context-async-hooks": "^2.0.0", 19 | "@opentelemetry/exporter-jaeger": "^2.0.0", 20 | "@opentelemetry/exporter-metrics-otlp-proto": "^0.200.0", 21 | "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", 22 | "@opentelemetry/exporter-trace-otlp-proto": "^0.200.0", 23 | "@opentelemetry/sdk-metrics": "^2.0.0", 24 | "@opentelemetry/sdk-trace-node": "^2.0.0", 25 | "@opentelemetry/sdk-trace-web": "^2.0.0", 26 | "@types/bun": "^1.3.3", 27 | "elysia": "1.4.13-beta.6", 28 | "eslint": "9.25.1", 29 | "tsup": "^8.4.0", 30 | "typescript": "^5.8.3", 31 | }, 32 | "peerDependencies": { 33 | "elysia": ">= 1.4.0", 34 | }, 35 | }, 36 | }, 37 | "packages": { 38 | "@axiomhq/js": ["@axiomhq/js@1.3.1", "", { "dependencies": { "fetch-retry": "^6.0.0", "uuid": "^11.0.2" } }, "sha512-Ytf5V3wKz8FKNiqJxnqZmUhjgJ7TItKUoyHVNE/H2V9dN1ozD6NNnsueenOjKdA48cm2sGRyP432nworst18aA=="], 39 | 40 | "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], 41 | 42 | "@elysiajs/eden": ["@elysiajs/eden@1.3.3", "", { "peerDependencies": { "elysia": ">= 1.3.18" } }, "sha512-O1wSGpmLUyyLMrZly4HTywR3Dvoj0eLYRr0ijaeWesmlBln9vi+DjmZsd4V+x9CToiHj+E/mpiLCE+4d/FkL2w=="], 43 | 44 | "@elysiajs/graphql-yoga": ["@elysiajs/graphql-yoga@1.3.0", "", { "dependencies": { "graphql": "^16.6.0", "graphql-mobius": "^0.1.11", "graphql-yoga": "^3.9.1" }, "peerDependencies": { "elysia": ">= 1.3.0" } }, "sha512-6yWfZGmrg5rB5uNsrhK76O8Q6QCPhYTgte631JqoNKpwQIKvC1wsabDAR+rAkn4x0UUiTqfBITdHnUXOkuZqVg=="], 45 | 46 | "@envelop/core": ["@envelop/core@5.3.1", "", { "dependencies": { "@envelop/instrumentation": "^1.0.0", "@envelop/types": "^5.2.1", "@whatwg-node/promise-helpers": "^1.2.4", "tslib": "^2.5.0" } }, "sha512-n29V3vRqXvPcG76C8zE482LQykk0P66zv1mjpk7aHeGe9qnh8AzB/RvoX5SVFwApJQPp0ixob8NoYXg4FHKMGA=="], 47 | 48 | "@envelop/instrumentation": ["@envelop/instrumentation@1.0.0", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.2.1", "tslib": "^2.5.0" } }, "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw=="], 49 | 50 | "@envelop/on-resolve": ["@envelop/on-resolve@5.1.3", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0" }, "peerDependencies": { "@envelop/core": "^5.2.3", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-eSJya23Yl+4wKXHT75ZbuMfuoVCAtJQDp3CNmDBwbvMrk+UrnmaSLm8UveA3hQ/R+ZIMA2r37sWdtnX2VJqGgw=="], 51 | 52 | "@envelop/opentelemetry": ["@envelop/opentelemetry@7.1.3", "", { "dependencies": { "@envelop/on-resolve": "^5.1.3", "@opentelemetry/api": "^1.8.0", "@opentelemetry/sdk-trace-base": "^1.11.0", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^5.2.3", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-QUtFYc1KFDYByNgoRZV8ClWXbovq3L+gTUM/z9EVm11sJeSx0Wt2Ry4LcE6T51tcj/lMiJDw0K8oiDryfiWUcg=="], 53 | 54 | "@envelop/types": ["@envelop/types@5.2.1", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.5.0" } }, "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg=="], 55 | 56 | "@envelop/validation-cache": ["@envelop/validation-cache@5.1.3", "", { "dependencies": { "hash-it": "^6.0.0", "lru-cache": "^6.0.0", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^3.0.6", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-MkzcScQHJJQ/9YCAPdWShEi3xZv4F4neTs+NszzSrZOdlU8z/THuRt7gZ0sO0y2be+sx+SKjHQP8Gq3VXXcTTg=="], 57 | 58 | "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="], 59 | 60 | "@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="], 61 | 62 | "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="], 63 | 64 | "@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="], 65 | 66 | "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="], 67 | 68 | "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="], 69 | 70 | "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="], 71 | 72 | "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="], 73 | 74 | "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="], 75 | 76 | "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="], 77 | 78 | "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="], 79 | 80 | "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="], 81 | 82 | "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="], 83 | 84 | "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="], 85 | 86 | "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="], 87 | 88 | "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="], 89 | 90 | "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="], 91 | 92 | "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="], 93 | 94 | "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="], 95 | 96 | "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="], 97 | 98 | "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="], 99 | 100 | "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg=="], 101 | 102 | "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="], 103 | 104 | "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="], 105 | 106 | "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="], 107 | 108 | "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="], 109 | 110 | "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], 111 | 112 | "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], 113 | 114 | "@eslint/config-array": ["@eslint/config-array@0.20.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw=="], 115 | 116 | "@eslint/config-helpers": ["@eslint/config-helpers@0.2.3", "", {}, "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg=="], 117 | 118 | "@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], 119 | 120 | "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], 121 | 122 | "@eslint/js": ["@eslint/js@9.25.1", "", {}, "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg=="], 123 | 124 | "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], 125 | 126 | "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], 127 | 128 | "@graphql-tools/executor": ["@graphql-tools/executor@0.0.18", "", { "dependencies": { "@graphql-tools/utils": "^9.2.1", "@graphql-typed-document-node/core": "3.2.0", "@repeaterjs/repeater": "3.0.4", "tslib": "^2.4.0", "value-or-promise": "1.0.12" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-xZC0C+/npXoSHBB5bsJdwxDLgtl1Gu4fL9J2TPQmXoZC3L2N506KJoppf9LgWdHU/xK04luJrhP6WjhfkIN0pQ=="], 129 | 130 | "@graphql-tools/merge": ["@graphql-tools/merge@8.4.2", "", { "dependencies": { "@graphql-tools/utils": "^9.2.1", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw=="], 131 | 132 | "@graphql-tools/schema": ["@graphql-tools/schema@9.0.19", "", { "dependencies": { "@graphql-tools/merge": "^8.4.1", "@graphql-tools/utils": "^9.2.1", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w=="], 133 | 134 | "@graphql-tools/utils": ["@graphql-tools/utils@9.2.1", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A=="], 135 | 136 | "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], 137 | 138 | "@graphql-yoga/logger": ["@graphql-yoga/logger@0.0.1", "", { "dependencies": { "tslib": "^2.3.1" } }, "sha512-6npFz7eZz33mXgSm1waBLMjUNG0D5hTc/p5Hcs1mojkT3KsLpCOFokzTEKboNsBhKevYcaVa/xeA7WBj4UYMLg=="], 139 | 140 | "@graphql-yoga/subscription": ["@graphql-yoga/subscription@3.1.0", "", { "dependencies": { "@graphql-yoga/typed-event-target": "^1.0.0", "@repeaterjs/repeater": "^3.0.4", "@whatwg-node/events": "0.0.2", "tslib": "^2.3.1" } }, "sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg=="], 141 | 142 | "@graphql-yoga/typed-event-target": ["@graphql-yoga/typed-event-target@1.0.0", "", { "dependencies": { "@repeaterjs/repeater": "^3.0.4", "tslib": "^2.3.1" } }, "sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA=="], 143 | 144 | "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], 145 | 146 | "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], 147 | 148 | "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], 149 | 150 | "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], 151 | 152 | "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 153 | 154 | "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], 155 | 156 | "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], 157 | 158 | "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], 159 | 160 | "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 161 | 162 | "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 163 | 164 | "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], 165 | 166 | "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], 167 | 168 | "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], 169 | 170 | "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q=="], 171 | 172 | "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.1.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-zOyetmZppnwTyPrt4S7jMfXiSX9yyfF0hxlA8B5oo2TtKl+/RGCy7fi4DrBfIf3lCPrkKsRBWZZD7RFojK7FDg=="], 173 | 174 | "@opentelemetry/core": ["@opentelemetry/core@2.1.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ=="], 175 | 176 | "@opentelemetry/exporter-jaeger": ["@opentelemetry/exporter-jaeger@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/sdk-trace-base": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0", "jaeger-client": "^3.15.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qtUMsp8061pQn6ZN9dngH6okiiF0NlHYBLWprzLeeCmNN7i5UHM+V8GmxvUH4L/zXlNBsySq7p3fZHIIbmK9xg=="], 177 | 178 | "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/sdk-logs": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+3MDfa5YQPGM3WXxW9kqGD85Q7s9wlEMVNhXXG7tYFLnIeaseUt9YtCeFhEDFzfEktacdFpOtXmJuNW8cHbU5A=="], 179 | 180 | "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/sdk-logs": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g=="], 181 | 182 | "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-GmahpUU/55hxfH4TP77ChOfftADsCq/nuri73I/AVLe2s4NIglvTsaACkFVZAVmnXXyPS00Fk3x27WS3yO07zA=="], 183 | 184 | "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uHawPRvKIrhqH09GloTuYeq2BjyieYHIpiklOvxm9zhrCL2eRsnI/6g9v2BZTVtGp8tEgIa7rCQ6Ltxw6NBgew=="], 185 | 186 | "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw=="], 187 | 188 | "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-E+uPj0yyvz81U9pvLZp3oHtFrEzNSqKGVkIViTQY1rH3TOobeJPSpLnTVXACnCwkPR5XeTvPnK3pZ2Kni8AFMg=="], 189 | 190 | "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-metrics": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ZYdlU9r0USuuYppiDyU2VFRA0kFl855ylnb3N/2aOlXrbA4PMCznen7gmPbetGQu7pz8Jbaf4fwvrDnVdQQXSw=="], 191 | 192 | "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-hmeZrUkFl1YMsgukSuHCFPYeF9df0hHoKeHUthRKFCxiURs+GwF1VuabuHmBMZnjTbsuvNjOB+JSs37Csem/5Q=="], 193 | 194 | "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Goi//m/7ZHeUedxTGVmEzH19NgqJY+Bzr6zXo1Rni1+hwqaksEyJ44gdlEMREu6dzX1DlAaH/qSykSVzdrdafA=="], 195 | 196 | "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-V9TDSD3PjK1OREw2iT9TUTzNYEVWJk4Nhodzhp9eiz4onDMYmPy3LaGbPv81yIR6dUb/hNp/SIhpiCHwFUq2Vg=="], 197 | 198 | "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-icxaKZ+jZL/NHXX8Aru4HGsrdhK0MLcuRXkX5G5IRmCgoRLw+Br6I/nMVozX2xjGGwV7hw2g+4Slj8K7s4HbVg=="], 199 | 200 | "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg=="], 201 | 202 | "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.200.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-transformer": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ=="], 203 | 204 | "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.200.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/otlp-exporter-base": "0.200.0", "@opentelemetry/otlp-transformer": "0.200.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CK2S+bFgOZ66Bsu5hlDeOX6cvW5FVtVjFFbWuaJP0ELxJKBB6HlbLZQ2phqz/uLj1cWap5xJr/PsR3iGoB7Vqw=="], 205 | 206 | "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-metrics": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw=="], 207 | 208 | "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-blx9S2EI49Ycuw6VZq+bkpaIoiJFhsDuvFGhBIoH3vJ5oYjJ2U0s3fAM5jYft99xVIAv6HqoPtlP9gpVA2IZtA=="], 209 | 210 | "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Mbm/LSFyAtQKP0AQah4AfGgsD+vsZcyreZoQ5okFBk33hU7AquU4TltgyL9dvaO8/Zkoud8/0gEvwfOZ5d7EPA=="], 211 | 212 | "@opentelemetry/resources": ["@opentelemetry/resources@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg=="], 213 | 214 | "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA=="], 215 | 216 | "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/resources": "2.1.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw=="], 217 | 218 | "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.200.0", "@opentelemetry/exporter-logs-otlp-http": "0.200.0", "@opentelemetry/exporter-logs-otlp-proto": "0.200.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.200.0", "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.200.0", "@opentelemetry/exporter-prometheus": "0.200.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.200.0", "@opentelemetry/exporter-trace-otlp-http": "0.200.0", "@opentelemetry/exporter-trace-otlp-proto": "0.200.0", "@opentelemetry/exporter-zipkin": "2.0.0", "@opentelemetry/instrumentation": "0.200.0", "@opentelemetry/propagator-b3": "2.0.0", "@opentelemetry/propagator-jaeger": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/sdk-logs": "0.200.0", "@opentelemetry/sdk-metrics": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0", "@opentelemetry/sdk-trace-node": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-S/YSy9GIswnhYoDor1RusNkmRughipvTCOQrlF1dzI70yQaf68qgf5WMnzUxdlCl3/et/pvaO75xfPfuEmCK5A=="], 219 | 220 | "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="], 221 | 222 | "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.1.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.1.0", "@opentelemetry/core": "2.1.0", "@opentelemetry/sdk-trace-base": "2.1.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SvVlBFc/jI96u/mmlKm86n9BbTCbQ35nsPoOohqJX6DXH92K0kTe73zGY5r8xoI1QkjR9PizszVJLzMC966y9Q=="], 223 | 224 | "@opentelemetry/sdk-trace-web": ["@opentelemetry/sdk-trace-web@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/sdk-trace-base": "2.1.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-2F6ZuZFmJg4CdhRPP8+60DkvEwGLCiU3ffAkgnnqe/ALGEBqGa0HrZaNWFGprXWVivrYHpXhr7AEfasgLZD71g=="], 225 | 226 | "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.37.0", "", {}, "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA=="], 227 | 228 | "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.5.0", "", { "dependencies": { "asn1js": "^3.0.6", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ=="], 229 | 230 | "@peculiar/json-schema": ["@peculiar/json-schema@1.1.12", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w=="], 231 | 232 | "@peculiar/webcrypto": ["@peculiar/webcrypto@1.5.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.8", "@peculiar/json-schema": "^1.1.12", "pvtsutils": "^1.3.5", "tslib": "^2.6.2", "webcrypto-core": "^1.8.0" } }, "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg=="], 233 | 234 | "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], 235 | 236 | "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], 237 | 238 | "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], 239 | 240 | "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], 241 | 242 | "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], 243 | 244 | "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], 245 | 246 | "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], 247 | 248 | "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], 249 | 250 | "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], 251 | 252 | "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], 253 | 254 | "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], 255 | 256 | "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.4", "", {}, "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA=="], 257 | 258 | "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.50.1", "", { "os": "android", "cpu": "arm" }, "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag=="], 259 | 260 | "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.50.1", "", { "os": "android", "cpu": "arm64" }, "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw=="], 261 | 262 | "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.50.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw=="], 263 | 264 | "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.50.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw=="], 265 | 266 | "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.50.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA=="], 267 | 268 | "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.50.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ=="], 269 | 270 | "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg=="], 271 | 272 | "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw=="], 273 | 274 | "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw=="], 275 | 276 | "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w=="], 277 | 278 | "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q=="], 279 | 280 | "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.50.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q=="], 281 | 282 | "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ=="], 283 | 284 | "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg=="], 285 | 286 | "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.50.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg=="], 287 | 288 | "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA=="], 289 | 290 | "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg=="], 291 | 292 | "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.50.1", "", { "os": "none", "cpu": "arm64" }, "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA=="], 293 | 294 | "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.50.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ=="], 295 | 296 | "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.50.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A=="], 297 | 298 | "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.50.1", "", { "os": "win32", "cpu": "x64" }, "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA=="], 299 | 300 | "@sinclair/typebox": ["@sinclair/typebox@0.34.41", "", {}, "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g=="], 301 | 302 | "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="], 303 | 304 | "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], 305 | 306 | "@types/bun": ["@types/bun@1.3.3", "", { "dependencies": { "bun-types": "1.3.3" } }, "sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g=="], 307 | 308 | "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 309 | 310 | "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], 311 | 312 | "@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="], 313 | 314 | "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="], 315 | 316 | "@whatwg-node/events": ["@whatwg-node/events@0.0.2", "", {}, "sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w=="], 317 | 318 | "@whatwg-node/fetch": ["@whatwg-node/fetch@0.8.8", "", { "dependencies": { "@peculiar/webcrypto": "^1.4.0", "@whatwg-node/node-fetch": "^0.3.6", "busboy": "^1.6.0", "urlpattern-polyfill": "^8.0.0", "web-streams-polyfill": "^3.2.1" } }, "sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg=="], 319 | 320 | "@whatwg-node/node-fetch": ["@whatwg-node/node-fetch@0.3.6", "", { "dependencies": { "@whatwg-node/events": "^0.0.3", "busboy": "^1.6.0", "fast-querystring": "^1.1.1", "fast-url-parser": "^1.1.3", "tslib": "^2.3.1" } }, "sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA=="], 321 | 322 | "@whatwg-node/promise-helpers": ["@whatwg-node/promise-helpers@1.3.2", "", { "dependencies": { "tslib": "^2.6.3" } }, "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA=="], 323 | 324 | "@whatwg-node/server": ["@whatwg-node/server@0.7.7", "", { "dependencies": { "@whatwg-node/fetch": "^0.8.3", "tslib": "^2.3.1" } }, "sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg=="], 325 | 326 | "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], 327 | 328 | "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], 329 | 330 | "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], 331 | 332 | "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], 333 | 334 | "ansi-color": ["ansi-color@0.2.1", "", {}, "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ=="], 335 | 336 | "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], 337 | 338 | "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 339 | 340 | "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], 341 | 342 | "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 343 | 344 | "asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="], 345 | 346 | "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 347 | 348 | "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], 349 | 350 | "bufrw": ["bufrw@1.4.0", "", { "dependencies": { "ansi-color": "^0.2.1", "error": "^7.0.0", "hexer": "^1.5.0", "xtend": "^4.0.0" } }, "sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ=="], 351 | 352 | "bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="], 353 | 354 | "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], 355 | 356 | "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], 357 | 358 | "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], 359 | 360 | "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 361 | 362 | "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 363 | 364 | "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], 365 | 366 | "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], 367 | 368 | "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], 369 | 370 | "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 371 | 372 | "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 373 | 374 | "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], 375 | 376 | "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 377 | 378 | "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], 379 | 380 | "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], 381 | 382 | "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], 383 | 384 | "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 385 | 386 | "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], 387 | 388 | "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 389 | 390 | "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], 391 | 392 | "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], 393 | 394 | "elysia": ["elysia@1.4.13-beta.6", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.2.2", "fast-decode-uri-component": "^1.0.1", "memoirist": "^0.4.0" }, "peerDependencies": { "@sinclair/typebox": ">= 0.34.0 < 1", "@types/bun": ">= 1.2.0", "file-type": ">= 20.0.0", "openapi-types": ">= 12.0.0", "typescript": ">= 5.0.0" }, "optionalPeers": ["@types/bun", "typescript"] }, "sha512-gbLnC+Vlzb0Vxo/PmJmP7Wh8qjZLAgycLKJlcgFR4NGATUHWVpSAQOKChpve97w7m2KAaOGsDVRZok4ZMtI52Q=="], 395 | 396 | "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], 397 | 398 | "error": ["error@7.0.2", "", { "dependencies": { "string-template": "~0.2.1", "xtend": "~4.0.0" } }, "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw=="], 399 | 400 | "esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="], 401 | 402 | "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 403 | 404 | "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], 405 | 406 | "eslint": ["eslint@9.25.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.25.1", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ=="], 407 | 408 | "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], 409 | 410 | "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 411 | 412 | "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], 413 | 414 | "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], 415 | 416 | "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 417 | 418 | "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], 419 | 420 | "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], 421 | 422 | "exact-mirror": ["exact-mirror@0.2.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-CrGe+4QzHZlnrXZVlo/WbUZ4qQZq8C0uATQVGVgXIrNXgHDBBNFD1VRfssRA2C9t3RYvh3MadZSdg2Wy7HBoQA=="], 423 | 424 | "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], 425 | 426 | "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 427 | 428 | "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], 429 | 430 | "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], 431 | 432 | "fast-querystring": ["fast-querystring@1.1.2", "", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="], 433 | 434 | "fast-url-parser": ["fast-url-parser@1.1.3", "", { "dependencies": { "punycode": "^1.3.2" } }, "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ=="], 435 | 436 | "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], 437 | 438 | "fetch-retry": ["fetch-retry@6.0.0", "", {}, "sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag=="], 439 | 440 | "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], 441 | 442 | "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], 443 | 444 | "file-type": ["file-type@21.0.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.7", "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg=="], 445 | 446 | "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], 447 | 448 | "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="], 449 | 450 | "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], 451 | 452 | "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], 453 | 454 | "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], 455 | 456 | "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 457 | 458 | "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 459 | 460 | "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], 461 | 462 | "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], 463 | 464 | "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 465 | 466 | "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], 467 | 468 | "graphql": ["graphql@16.11.0", "", {}, "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw=="], 469 | 470 | "graphql-mobius": ["graphql-mobius@0.1.13", "", {}, "sha512-GFTHB9VUnYaKI5cNjadYnVgsH2AqW4//0UTpZlzHq2BpErbqzy+EZn8rFXIus/jLyYv3fFqbuzbNJV8AygSeJA=="], 471 | 472 | "graphql-yoga": ["graphql-yoga@3.9.1", "", { "dependencies": { "@envelop/core": "^3.0.4", "@envelop/validation-cache": "^5.1.2", "@graphql-tools/executor": "^0.0.18", "@graphql-tools/schema": "^9.0.18", "@graphql-tools/utils": "^9.2.1", "@graphql-yoga/logger": "^0.0.1", "@graphql-yoga/subscription": "^3.1.0", "@whatwg-node/fetch": "^0.8.4", "@whatwg-node/server": "^0.7.3", "dset": "^3.1.1", "lru-cache": "^7.14.1", "tslib": "^2.3.1" }, "peerDependencies": { "graphql": "^15.2.0 || ^16.0.0" } }, "sha512-BB6EkN64VBTXWmf9Kym2OsVZFzBC0mAsQNo9eNB5xIr3t+x7qepQ34xW5A353NWol3Js3xpzxwIKFVF6l9VsPg=="], 473 | 474 | "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 475 | 476 | "hash-it": ["hash-it@6.0.0", "", {}, "sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w=="], 477 | 478 | "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], 479 | 480 | "hexer": ["hexer@1.5.0", "", { "dependencies": { "ansi-color": "^0.2.1", "minimist": "^1.1.0", "process": "^0.10.0", "xtend": "^4.0.0" }, "bin": { "hexer": "./cli.js" } }, "sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg=="], 481 | 482 | "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], 483 | 484 | "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 485 | 486 | "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], 487 | 488 | "import-in-the-middle": ["import-in-the-middle@1.14.2", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw=="], 489 | 490 | "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], 491 | 492 | "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 493 | 494 | "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 495 | 496 | "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 497 | 498 | "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 499 | 500 | "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 501 | 502 | "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], 503 | 504 | "jaeger-client": ["jaeger-client@3.19.0", "", { "dependencies": { "node-int64": "^0.4.0", "opentracing": "^0.14.4", "thriftrw": "^3.5.0", "uuid": "^8.3.2", "xorshift": "^1.1.1" } }, "sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw=="], 505 | 506 | "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], 507 | 508 | "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], 509 | 510 | "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], 511 | 512 | "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 513 | 514 | "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], 515 | 516 | "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], 517 | 518 | "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], 519 | 520 | "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], 521 | 522 | "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], 523 | 524 | "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="], 525 | 526 | "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], 527 | 528 | "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], 529 | 530 | "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], 531 | 532 | "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], 533 | 534 | "long": ["long@2.4.0", "", {}, "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ=="], 535 | 536 | "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], 537 | 538 | "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], 539 | 540 | "memoirist": ["memoirist@0.4.0", "", {}, "sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg=="], 541 | 542 | "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 543 | 544 | "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], 545 | 546 | "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], 547 | 548 | "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], 549 | 550 | "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], 551 | 552 | "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 553 | 554 | "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], 555 | 556 | "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 557 | 558 | "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], 559 | 560 | "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], 561 | 562 | "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], 563 | 564 | "opentracing": ["opentracing@0.14.7", "", {}, "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q=="], 565 | 566 | "optionator": ["optionator@0.9.4", "", { "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" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], 567 | 568 | "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], 569 | 570 | "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], 571 | 572 | "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], 573 | 574 | "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 575 | 576 | "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], 577 | 578 | "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 579 | 580 | "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 581 | 582 | "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], 583 | 584 | "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], 585 | 586 | "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 587 | 588 | "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], 589 | 590 | "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], 591 | 592 | "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], 593 | 594 | "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], 595 | 596 | "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 597 | 598 | "process": ["process@0.10.1", "", {}, "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA=="], 599 | 600 | "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], 601 | 602 | "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 603 | 604 | "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], 605 | 606 | "pvutils": ["pvutils@1.1.3", "", {}, "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ=="], 607 | 608 | "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], 609 | 610 | "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 611 | 612 | "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="], 613 | 614 | "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], 615 | 616 | "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], 617 | 618 | "rollup": ["rollup@4.50.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.50.1", "@rollup/rollup-android-arm64": "4.50.1", "@rollup/rollup-darwin-arm64": "4.50.1", "@rollup/rollup-darwin-x64": "4.50.1", "@rollup/rollup-freebsd-arm64": "4.50.1", "@rollup/rollup-freebsd-x64": "4.50.1", "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", "@rollup/rollup-linux-arm-musleabihf": "4.50.1", "@rollup/rollup-linux-arm64-gnu": "4.50.1", "@rollup/rollup-linux-arm64-musl": "4.50.1", "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", "@rollup/rollup-linux-ppc64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-musl": "4.50.1", "@rollup/rollup-linux-s390x-gnu": "4.50.1", "@rollup/rollup-linux-x64-gnu": "4.50.1", "@rollup/rollup-linux-x64-musl": "4.50.1", "@rollup/rollup-openharmony-arm64": "4.50.1", "@rollup/rollup-win32-arm64-msvc": "4.50.1", "@rollup/rollup-win32-ia32-msvc": "4.50.1", "@rollup/rollup-win32-x64-msvc": "4.50.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA=="], 619 | 620 | "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 621 | 622 | "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 623 | 624 | "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="], 625 | 626 | "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 627 | 628 | "source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], 629 | 630 | "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], 631 | 632 | "string-template": ["string-template@0.2.1", "", {}, "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw=="], 633 | 634 | "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], 635 | 636 | "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 637 | 638 | "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], 639 | 640 | "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 641 | 642 | "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 643 | 644 | "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="], 645 | 646 | "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], 647 | 648 | "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 649 | 650 | "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 651 | 652 | "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], 653 | 654 | "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], 655 | 656 | "thriftrw": ["thriftrw@3.11.4", "", { "dependencies": { "bufrw": "^1.2.1", "error": "7.0.2", "long": "^2.4.0" }, "bin": { "thrift2json": "thrift2json.js" } }, "sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA=="], 657 | 658 | "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], 659 | 660 | "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], 661 | 662 | "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="], 663 | 664 | "tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="], 665 | 666 | "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], 667 | 668 | "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], 669 | 670 | "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 671 | 672 | "tsup": ["tsup@8.5.0", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.25.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "0.8.0-beta.0", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ=="], 673 | 674 | "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], 675 | 676 | "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], 677 | 678 | "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], 679 | 680 | "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], 681 | 682 | "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], 683 | 684 | "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], 685 | 686 | "urlpattern-polyfill": ["urlpattern-polyfill@8.0.2", "", {}, "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ=="], 687 | 688 | "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], 689 | 690 | "value-or-promise": ["value-or-promise@1.0.12", "", {}, "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q=="], 691 | 692 | "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], 693 | 694 | "webcrypto-core": ["webcrypto-core@1.8.1", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.13", "@peculiar/json-schema": "^1.1.12", "asn1js": "^3.0.5", "pvtsutils": "^1.3.5", "tslib": "^2.7.0" } }, "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A=="], 695 | 696 | "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], 697 | 698 | "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], 699 | 700 | "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 701 | 702 | "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 703 | 704 | "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], 705 | 706 | "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 707 | 708 | "xorshift": ["xorshift@1.2.0", "", {}, "sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g=="], 709 | 710 | "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], 711 | 712 | "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], 713 | 714 | "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], 715 | 716 | "yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], 717 | 718 | "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 719 | 720 | "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 721 | 722 | "@envelop/validation-cache/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], 723 | 724 | "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 725 | 726 | "@grpc/proto-loader/long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], 727 | 728 | "@opentelemetry/exporter-jaeger/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/resources": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ=="], 729 | 730 | "@opentelemetry/exporter-logs-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 731 | 732 | "@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 733 | 734 | "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 735 | 736 | "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], 737 | 738 | "@opentelemetry/exporter-metrics-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 739 | 740 | "@opentelemetry/exporter-metrics-otlp-grpc/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], 741 | 742 | "@opentelemetry/exporter-metrics-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 743 | 744 | "@opentelemetry/exporter-metrics-otlp-http/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], 745 | 746 | "@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 747 | 748 | "@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], 749 | 750 | "@opentelemetry/exporter-prometheus/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 751 | 752 | "@opentelemetry/exporter-prometheus/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], 753 | 754 | "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 755 | 756 | "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], 757 | 758 | "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 759 | 760 | "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], 761 | 762 | "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 763 | 764 | "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], 765 | 766 | "@opentelemetry/exporter-zipkin/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 767 | 768 | "@opentelemetry/exporter-zipkin/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], 769 | 770 | "@opentelemetry/otlp-exporter-base/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 771 | 772 | "@opentelemetry/otlp-grpc-exporter-base/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 773 | 774 | "@opentelemetry/otlp-transformer/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 775 | 776 | "@opentelemetry/otlp-transformer/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], 777 | 778 | "@opentelemetry/otlp-transformer/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], 779 | 780 | "@opentelemetry/propagator-b3/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 781 | 782 | "@opentelemetry/propagator-jaeger/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 783 | 784 | "@opentelemetry/resources/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 785 | 786 | "@opentelemetry/sdk-logs/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 787 | 788 | "@opentelemetry/sdk-metrics/@opentelemetry/resources": ["@opentelemetry/resources@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw=="], 789 | 790 | "@opentelemetry/sdk-node/@opentelemetry/core": ["@opentelemetry/core@2.0.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ=="], 791 | 792 | "@opentelemetry/sdk-node/@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA=="], 793 | 794 | "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.0", "", { "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/resources": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw=="], 795 | 796 | "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.0.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.0.0", "@opentelemetry/core": "2.0.0", "@opentelemetry/sdk-trace-base": "2.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-omdilCZozUjQwY3uZRBwbaRMJ3p09l4t187Lsdf0dGMye9WKD4NGcpgZRvqhI1dwcH6og+YXQEtoO9Wx3ykilg=="], 797 | 798 | "@opentelemetry/sdk-trace-base/@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="], 799 | 800 | "@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="], 801 | 802 | "@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], 803 | 804 | "@opentelemetry/sdk-trace-node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/resources": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ=="], 805 | 806 | "@opentelemetry/sdk-trace-web/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/resources": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ=="], 807 | 808 | "@whatwg-node/node-fetch/@whatwg-node/events": ["@whatwg-node/events@0.0.3", "", {}, "sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA=="], 809 | 810 | "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 811 | 812 | "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 813 | 814 | "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 815 | 816 | "fast-url-parser/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], 817 | 818 | "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 819 | 820 | "graphql-yoga/@envelop/core": ["@envelop/core@3.0.6", "", { "dependencies": { "@envelop/types": "3.0.2", "tslib": "^2.5.0" } }, "sha512-06t1xCPXq6QFN7W1JUEf68aCwYN0OUDNAIoJe7bAqhaoa2vn7NCcuX1VHkJ/OWpmElUgCsRO6RiBbIru1in0Ig=="], 821 | 822 | "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], 823 | 824 | "jaeger-client/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], 825 | 826 | "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 827 | 828 | "protobufjs/long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], 829 | 830 | "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 831 | 832 | "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 833 | 834 | "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 835 | 836 | "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], 837 | 838 | "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 839 | 840 | "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 841 | 842 | "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 843 | 844 | "@opentelemetry/exporter-jaeger/@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw=="], 845 | 846 | "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node/@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.0.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-IEkJGzK1A9v3/EHjXh3s2IiFc6L4jfK+lNgKVgUjeUJQRRhnVFMIO3TAvKwonm9O1HebCuoOt98v8bZW7oVQHA=="], 847 | 848 | "@opentelemetry/sdk-trace-node/@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw=="], 849 | 850 | "@opentelemetry/sdk-trace-web/@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw=="], 851 | 852 | "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 853 | 854 | "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 855 | 856 | "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], 857 | 858 | "graphql-yoga/@envelop/core/@envelop/types": ["@envelop/types@3.0.2", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng=="], 859 | 860 | "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 861 | 862 | "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 863 | 864 | "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 865 | 866 | "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 867 | 868 | "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 869 | 870 | "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 871 | } 872 | } 873 | --------------------------------------------------------------------------------