From c8af84402ffd43b53bcbb1d3d782139abadfa54c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 7 Jan 2022 16:03:49 -0500 Subject: [PATCH 001/167] Initialize OpenTelemetry SDK --- package-lock.json | 2837 +++++++++++++++++++++--- package.json | 6 + templates/boltzmann/core/entrypoint.ts | 15 + templates/boltzmann/core/prelude.ts | 60 +- 4 files changed, 2653 insertions(+), 265 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9596fedd..1cff505e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,13 @@ "license": "MIT", "dependencies": { "@entropic/bole": "^4.0.1", + "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/auto-instrumentations-node": "^0.27.1", + "@opentelemetry/exporter-collector-grpc": "^0.25.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", @@ -502,6 +508,69 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@grpc/grpc-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", + "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -641,16 +710,58 @@ } }, "node_modules/@opentelemetry/api": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", - "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", - "dependencies": { - "@opentelemetry/context-base": "^0.12.0" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", + "peer": true, "engines": { "node": ">=8.0.0" } }, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.25.0.tgz", + "integrity": "sha512-9T0c9NQAEGRujUC7HzPa2/qZ5px/UvB2sfSU5CAKFRrAlDl2gn25B0oUbDqSRHW/IG1X2rnQ3z2bBQkJyJvE4g==", + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.27.1.tgz", + "integrity": "sha512-FNxnl2mgqwVGSmvAFKXp886P5EpF0/MjmOo1YQTUswrLcmZJXplCaK8ejDpV4awy4VUBBX6Fd2sFoAJ+hEE6PQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-express": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-ioredis": "^0.27.0", + "@opentelemetry/instrumentation-koa": "^0.28.0", + "@opentelemetry/instrumentation-mongodb": "^0.27.0", + "@opentelemetry/instrumentation-mysql": "^0.27.0", + "@opentelemetry/instrumentation-pg": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, "node_modules/@opentelemetry/context-base": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", @@ -672,184 +783,1171 @@ "node": ">=8.5.0" } }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/api": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", + "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", + "dependencies": { + "@opentelemetry/context-base": "^0.12.0" + }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, + "node_modules/@opentelemetry/exporter-collector": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector/-/exporter-collector-0.25.0.tgz", + "integrity": "sha512-xZYstLt4hz1aTloJaepWdjMMf9305MqwqbUWjcU/X9pOxvgFWRlchO6x/HQTw7ow0i/S+ShzC+greKnb+1WvLA==", + "deprecated": "Please use trace and metric specific exporters @opentelemetry/exporter-trace-otlp-http and @opentelemetry/exporter-metrics-otlp-http", "dependencies": { - "defer-to-connect": "^1.0.1" + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@opentelemetry/exporter-collector-grpc": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector-grpc/-/exporter-collector-grpc-0.25.0.tgz", + "integrity": "sha512-Mqkdh89pC1NxX5BngxHmDqMQ6WVCFuMr1PvwRZmJBBR2MXaStO5qIxELHuHgkDZEXpIFJbqNC7JAfDklXm8o1w==", + "deprecated": "Please use trace and metric specific exporters @opentelemetry/exporter-trace-otlp-grpc and @opentelemetry/exporter-metrics-otlp-grpc", + "dependencies": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-collector": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" + }, "engines": { - "node": ">= 6" + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@tsconfig/node14": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", - "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==", - "dev": true - }, - "node_modules/@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "dev": true, + "node_modules/@opentelemetry/exporter-collector-grpc/node_modules/@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", "dependencies": { - "@types/node": "*" + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@types/ajv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/ajv/-/ajv-1.0.0.tgz", - "integrity": "sha1-T7JEB0Ly9sMOf7B5e4OfxvaWaCo=", - "deprecated": "This is a stub types definition for ajv (https://github.com/epoberezkin/ajv). ajv provides its own type definitions, so you don't need @types/ajv installed!", - "dev": true, + "node_modules/@opentelemetry/exporter-collector-grpc/node_modules/@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", "dependencies": { - "ajv": "*" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "node_modules/@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", - "dev": true - }, - "node_modules/@types/csrf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/csrf/-/csrf-3.1.0.tgz", - "integrity": "sha512-QawgCDN1oWa6qYvDWBW7CDlp5Gtay22DJCJAXMAhdOpWh75sXyzZ1pvMJ+EZsFpwXdLHC/Jk50Xxahf/mP/b9Q==", - "deprecated": "This is a stub types definition. csrf provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "csrf": "*" + "node_modules/@opentelemetry/exporter-collector-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/hapi__iron": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/hapi__iron/-/hapi__iron-6.0.1.tgz", - "integrity": "sha512-NTr+1FKl+nvEeSwVpfcks36dCm6+tbcQh3tJYbyQ5XWb5sIbCIptW6p38zmCYE5ppOoU/2PK1Y8taGpl6cOl5w==", - "deprecated": "Deprecated", - "dev": true, + "node_modules/@opentelemetry/exporter-collector/node_modules/@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", "dependencies": { - "@hapi/iron": "*" + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@types/hapi__shot": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.1.tgz", - "integrity": "sha512-44Jj7jJAFgNVgfdbyVtBUbEIbYqWRKAbLR4kiQxBbVEdf8ZKfa5Hg1qg4QdzXBgjw0mopewU4wx1/eWRTVelNQ==", - "dev": true, + "node_modules/@opentelemetry/exporter-collector/node_modules/@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", "dependencies": { - "@types/node": "*" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@types/is-windows": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", - "integrity": "sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-rNAPdomlIUX0i0cg2+I+Q1wOUr531zHBQ+cV/28PJ39bSPKjahatZZ2LMuhiguETkCgLVzfruw/ZvNMNkKoSzw==", - "dev": true, - "dependencies": { - "@types/node": "*" + "node_modules/@opentelemetry/exporter-collector/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", - "dev": true - }, - "node_modules/@types/node": { - "version": "12.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.11.tgz", - "integrity": "sha512-O+x6uIpa6oMNTkPuHDa9MhMMehlxLAd5QcOvKRjAFsBVpeFWTOPnXbDvILvFgFFZfQ1xh1EZi1FbXxUix+zpsQ==" - }, - "node_modules/@types/nunjucks": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.1.4.tgz", - "integrity": "sha512-cR65PLlHKW/qxxj840dbNb3ICO+iAVQzaNKJ8TcKOVKFi+QcAkhw9SCY8VFAyU41SmJMs+2nrIN2JGhX+jYb7A==", - "dev": true - }, - "node_modules/@types/oauth": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", - "integrity": "sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==", - "dev": true, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", "dependencies": { - "@types/node": "*" + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@types/on-headers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/on-headers/-/on-headers-1.0.0.tgz", - "integrity": "sha512-m5LRgPZzWPHGoEQDbuVuduRMctCW5tDarxi9f7+rYZoJDy7nMHMMrODtqbwPpNjYc6Ilg4vL2NeYAwimJfku3w==", - "dev": true, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", + "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", "dependencies": { - "@types/node": "*" + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@types/pg": { - "version": "7.14.11", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", - "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", - "dev": true, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.27.0.tgz", + "integrity": "sha512-8C7jGqrhTmAP2lZNzH7SSxSClij3wlYTB7t71/wsFooV01yo/cH2Go0kDo13kPmcGhoR07iMZDabeHWwdxre6w==", "dependencies": { - "@types/node": "*", - "pg-protocol": "^1.2.0", - "pg-types": "^2.2.0" + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/express": "4.17.13" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@types/redis": { - "version": "2.8.28", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.28.tgz", - "integrity": "sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA==", + "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", "dependencies": { - "@types/node": "*" + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@types/tap": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.0.tgz", + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.1.tgz", + "integrity": "sha512-1lE5BR6rsEOcSndfzP42kJJPy747MdMXNfYeR9cMtfThHiW4QVc5IYQu7DkPZxIc5LYilRRgtSVqza+cX/fy7A==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", + "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.27.0.tgz", + "integrity": "sha512-1k2TMB38eppJJXK2Fch/e3KG7BDkfa5bPjhxBhXqb/jrMj0I9h0gkX2UmxRjVQd7wIFHTffAFA9hVJAw1Nd8UQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis": "4.26.6" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.28.0.tgz", + "integrity": "sha512-MFBulPyKgo4TI7LyefYeCNDykIBi2nA5BqJr8RX+ZZ2BoykipBVf0AgtrCvKep9u3XbM8fgF7sNYtc2UvMoW6w==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/koa": "2.13.4", + "@types/koa__router": "8.0.7" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.27.0.tgz", + "integrity": "sha512-Ae9bNTHg+rt7kx3o4j0sizXZVx4S82yIahsmZ2cDqV3BE2RV8+My/+CUx4jCbSa0c8VGyK4Loyyn6IINVs3Yxg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mongodb": "3.6.20" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.27.0.tgz", + "integrity": "sha512-MfGj73/2cxbwQ/rmBkYOMwwRvznPgifMMI0cb5JEmHzs2C7enXBpGJbFMZiAJM7rRmekkok/nuyvbWBERau+TA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.19" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", + "integrity": "sha512-8G3YwQ/9K1B2IfYAipvTHyTqN79pz4xtNdi2HvvPnspBsrUeF71LqA3S04z1AeU81QhEOgX6D2+FZKdx8N/KTg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", + "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/redis": "2.8.31" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", + "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", + "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.25.0.tgz", + "integrity": "sha512-7fwPlAFB5Xw8mnVQfq0wqKNw3RXiAMad9T1bk5Sza9LK/L6hz8RTuHWCsFMsj+1OOSAaiPFuUMYrK1J75+2IAg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", + "dependencies": { + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", + "dependencies": { + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-0.25.0.tgz", + "integrity": "sha512-TInkLSF/ThM3GNVM+9tgnCVjyNLnRxvAkG585Fhu0HNwaEtCTUwI0r7AvMRIREOreeRWttBG6kvT0LOKdo8yjw==", + "dependencies": { + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", + "dependencies": { + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", + "dependencies": { + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", + "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==", + "dev": true + }, + "node_modules/@types/accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ajv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/ajv/-/ajv-1.0.0.tgz", + "integrity": "sha1-T7JEB0Ly9sMOf7B5e4OfxvaWaCo=", + "deprecated": "This is a stub types definition for ajv (https://github.com/epoberezkin/ajv). ajv provides its own type definitions, so you don't need @types/ajv installed!", + "dev": true, + "dependencies": { + "ajv": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bson": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", + "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", + "deprecated": "This is a stub types definition. bson provides its own type definitions, so you do not need this installed.", + "dependencies": { + "bson": "*" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==" + }, + "node_modules/@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "dev": true + }, + "node_modules/@types/cookies": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", + "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "node_modules/@types/csrf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/csrf/-/csrf-3.1.0.tgz", + "integrity": "sha512-QawgCDN1oWa6qYvDWBW7CDlp5Gtay22DJCJAXMAhdOpWh75sXyzZ1pvMJ+EZsFpwXdLHC/Jk50Xxahf/mP/b9Q==", + "deprecated": "This is a stub types definition. csrf provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "csrf": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.27", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", + "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/hapi__iron": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/hapi__iron/-/hapi__iron-6.0.1.tgz", + "integrity": "sha512-NTr+1FKl+nvEeSwVpfcks36dCm6+tbcQh3tJYbyQ5XWb5sIbCIptW6p38zmCYE5ppOoU/2PK1Y8taGpl6cOl5w==", + "deprecated": "Deprecated", + "dev": true, + "dependencies": { + "@hapi/iron": "*" + } + }, + "node_modules/@types/hapi__shot": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.1.tgz", + "integrity": "sha512-44Jj7jJAFgNVgfdbyVtBUbEIbYqWRKAbLR4kiQxBbVEdf8ZKfa5Hg1qg4QdzXBgjw0mopewU4wx1/eWRTVelNQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", + "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==" + }, + "node_modules/@types/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" + }, + "node_modules/@types/ioredis": { + "version": "4.26.6", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.26.6.tgz", + "integrity": "sha512-Q9ydXL/5Mot751i7WLCm9OGTj5jlW3XBdkdEW21SkXZ8Y03srbkluFGbM3q8c+vzPW30JOLJ+NsZWHoly0+13A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/is-windows": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", + "integrity": "sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-rNAPdomlIUX0i0cg2+I+Q1wOUr531zHBQ+cV/28PJ39bSPKjahatZZ2LMuhiguETkCgLVzfruw/ZvNMNkKoSzw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keygrip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", + "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" + }, + "node_modules/@types/koa": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa__router": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.7.tgz", + "integrity": "sha512-OB3Ax75nmTP+WR9AgdzA42DI7YmBtiNKN2g1Wxl+d5Dyek9SWt740t+ukwXSmv/jMBCUPyV3YEI93vZHgdP7UQ==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", + "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "node_modules/@types/mime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", + "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "dev": true + }, + "node_modules/@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "dependencies": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "node_modules/@types/mysql": { + "version": "2.15.19", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.19.tgz", + "integrity": "sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + }, + "node_modules/@types/nunjucks": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.1.4.tgz", + "integrity": "sha512-cR65PLlHKW/qxxj840dbNb3ICO+iAVQzaNKJ8TcKOVKFi+QcAkhw9SCY8VFAyU41SmJMs+2nrIN2JGhX+jYb7A==", + "dev": true + }, + "node_modules/@types/oauth": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", + "integrity": "sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/on-headers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/on-headers/-/on-headers-1.0.0.tgz", + "integrity": "sha512-m5LRgPZzWPHGoEQDbuVuduRMctCW5tDarxi9f7+rYZoJDy7nMHMMrODtqbwPpNjYc6Ilg4vL2NeYAwimJfku3w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/pg": { + "version": "7.14.11", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", + "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "^1.2.0", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz", + "integrity": "sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg==", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/redis": { + "version": "2.8.31", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", + "integrity": "sha512-daWrrTDYaa5iSDFbgzZ9gOOzyp2AJmYK59OlG/2KGBgYWF3lfs8GDKm1c//tik5Uc93hDD36O+qLPvzDolChbA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static/node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/tap": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.0.tgz", "integrity": "sha512-AAsxWamgPOFWAQoSVOkQgGpi/wdk28Bmof7/KWI8T97mnDsjwHFrwclLBNGhaeXYhQABQZ1e2ovPIS7OAuM4vQ==", "dev": true, "dependencies": { @@ -1096,6 +2194,17 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1460,6 +2569,25 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1469,6 +2597,14 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1639,6 +2775,40 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/bson": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", + "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -1953,7 +3123,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1964,7 +3133,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1973,7 +3141,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2405,8 +3572,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2455,7 +3621,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -2919,6 +4084,14 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -3285,6 +4458,33 @@ "is-windows": "^1.0.2" } }, + "node_modules/gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3298,7 +4498,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3746,6 +4945,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -3895,6 +5113,17 @@ "is-ci": "bin.js" } }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3993,7 +5222,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, "engines": { "node": ">=8" } @@ -4224,6 +5452,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -4483,6 +5719,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -4531,6 +5772,11 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -4551,6 +5797,11 @@ "node": ">=0.8.6" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4751,6 +6002,11 @@ "node": ">=10" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4778,6 +6034,17 @@ "node": ">= 0.4.0" } }, + "node_modules/node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -7516,6 +8783,11 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -7580,8 +8852,7 @@ "node_modules/pg-protocol": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==", - "dev": true + "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -7733,6 +9004,31 @@ "node": ">=0.4.0" } }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", @@ -8094,7 +9390,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8107,12 +9402,38 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "node_modules/resolve": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "dependencies": { + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -8531,7 +9852,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8545,7 +9865,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, "engines": { "node": ">=8" } @@ -8554,7 +9873,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -8563,7 +9881,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -8690,6 +10007,17 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/table": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", @@ -10899,6 +12227,11 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "node_modules/trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -11230,6 +12563,20 @@ "extsprintf": "^1.2.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -11275,7 +12622,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11292,7 +12638,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -11301,7 +12646,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11852,14 +13196,61 @@ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.8.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "@grpc/grpc-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", + "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" } } }, @@ -11938,73 +13329,670 @@ "@hapi/topo": "^5.0.0" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@opentelemetry/api": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", + "peer": true + }, + "@opentelemetry/api-metrics": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.25.0.tgz", + "integrity": "sha512-9T0c9NQAEGRujUC7HzPa2/qZ5px/UvB2sfSU5CAKFRrAlDl2gn25B0oUbDqSRHW/IG1X2rnQ3z2bBQkJyJvE4g==", + "requires": {} + }, + "@opentelemetry/auto-instrumentations-node": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.27.1.tgz", + "integrity": "sha512-FNxnl2mgqwVGSmvAFKXp886P5EpF0/MjmOo1YQTUswrLcmZJXplCaK8ejDpV4awy4VUBBX6Fd2sFoAJ+hEE6PQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-express": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-ioredis": "^0.27.0", + "@opentelemetry/instrumentation-koa": "^0.28.0", + "@opentelemetry/instrumentation-mongodb": "^0.27.0", + "@opentelemetry/instrumentation-mysql": "^0.27.0", + "@opentelemetry/instrumentation-pg": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0" + } + }, + "@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "requires": {} + }, + "@opentelemetry/context-base": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", + "integrity": "sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA==" + }, + "@opentelemetry/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", + "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", + "requires": { + "@opentelemetry/api": "^0.12.0", + "@opentelemetry/context-base": "^0.12.0", + "semver": "^7.1.3" + }, + "dependencies": { + "@opentelemetry/api": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", + "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", + "requires": { + "@opentelemetry/context-base": "^0.12.0" + } + } + } + }, + "@opentelemetry/exporter-collector": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector/-/exporter-collector-0.25.0.tgz", + "integrity": "sha512-xZYstLt4hz1aTloJaepWdjMMf9305MqwqbUWjcU/X9pOxvgFWRlchO6x/HQTw7ow0i/S+ShzC+greKnb+1WvLA==", + "requires": { + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", + "requires": { + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", + "requires": { + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" + } + } + }, + "@opentelemetry/exporter-collector-grpc": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector-grpc/-/exporter-collector-grpc-0.25.0.tgz", + "integrity": "sha512-Mqkdh89pC1NxX5BngxHmDqMQ6WVCFuMr1PvwRZmJBBR2MXaStO5qIxELHuHgkDZEXpIFJbqNC7JAfDklXm8o1w==", + "requires": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-collector": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", + "requires": { + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", + "requires": { + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" + } + } + }, + "@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "dependencies": { + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + } + } + }, + "@opentelemetry/instrumentation-dns": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", + "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + } + }, + "@opentelemetry/instrumentation-express": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.27.0.tgz", + "integrity": "sha512-8C7jGqrhTmAP2lZNzH7SSxSClij3wlYTB7t71/wsFooV01yo/cH2Go0kDo13kPmcGhoR07iMZDabeHWwdxre6w==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/express": "4.17.13" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/instrumentation-graphql": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.1.tgz", + "integrity": "sha512-1lE5BR6rsEOcSndfzP42kJJPy747MdMXNfYeR9cMtfThHiW4QVc5IYQu7DkPZxIc5LYilRRgtSVqza+cX/fy7A==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0" + } + }, + "@opentelemetry/instrumentation-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", + "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "dependencies": { + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + } + } + }, + "@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/instrumentation-ioredis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.27.0.tgz", + "integrity": "sha512-1k2TMB38eppJJXK2Fch/e3KG7BDkfa5bPjhxBhXqb/jrMj0I9h0gkX2UmxRjVQd7wIFHTffAFA9hVJAw1Nd8UQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis": "4.26.6" + } + }, + "@opentelemetry/instrumentation-koa": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.28.0.tgz", + "integrity": "sha512-MFBulPyKgo4TI7LyefYeCNDykIBi2nA5BqJr8RX+ZZ2BoykipBVf0AgtrCvKep9u3XbM8fgF7sNYtc2UvMoW6w==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/koa": "2.13.4", + "@types/koa__router": "8.0.7" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/instrumentation-mongodb": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.27.0.tgz", + "integrity": "sha512-Ae9bNTHg+rt7kx3o4j0sizXZVx4S82yIahsmZ2cDqV3BE2RV8+My/+CUx4jCbSa0c8VGyK4Loyyn6IINVs3Yxg==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mongodb": "3.6.20" + } + }, + "@opentelemetry/instrumentation-mysql": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.27.0.tgz", + "integrity": "sha512-MfGj73/2cxbwQ/rmBkYOMwwRvznPgifMMI0cb5JEmHzs2C7enXBpGJbFMZiAJM7rRmekkok/nuyvbWBERau+TA==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.19" + } + }, + "@opentelemetry/instrumentation-pg": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", + "integrity": "sha512-8G3YwQ/9K1B2IfYAipvTHyTqN79pz4xtNdi2HvvPnspBsrUeF71LqA3S04z1AeU81QhEOgX6D2+FZKdx8N/KTg==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.3" + }, + "dependencies": { + "@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "requires": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + } + } + }, + "@opentelemetry/instrumentation-redis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", + "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/redis": "2.8.31" + } + }, + "@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "requires": { + "@opentelemetry/core": "1.0.1" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "requires": { + "@opentelemetry/core": "1.0.1" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/resource-detector-aws": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", + "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/resource-detector-gcp": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", + "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/sdk-metrics-base": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.25.0.tgz", + "integrity": "sha512-7fwPlAFB5Xw8mnVQfq0wqKNw3RXiAMad9T1bk5Sza9LK/L6hz8RTuHWCsFMsj+1OOSAaiPFuUMYrK1J75+2IAg==", + "requires": { + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "lodash.merge": "^4.6.2" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", + "requires": { + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", + "requires": { + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" + } + } + }, + "@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + }, + "dependencies": { + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + }, + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + } + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-0.25.0.tgz", + "integrity": "sha512-TInkLSF/ThM3GNVM+9tgnCVjyNLnRxvAkG585Fhu0HNwaEtCTUwI0r7AvMRIREOreeRWttBG6kvT0LOKdo8yjw==", "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "lodash.merge": "^4.6.2" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", + "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", + "requires": { + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", + "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", + "requires": { + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", + "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" + } } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" + "@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "requires": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + } } }, - "@nodelib/fs.stat": { + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" }, - "@opentelemetry/api": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", - "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "requires": { - "@opentelemetry/context-base": "^0.12.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "@opentelemetry/context-base": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", - "integrity": "sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA==" + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" }, - "@opentelemetry/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", - "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", - "requires": { - "@opentelemetry/api": "^0.12.0", - "@opentelemetry/context-base": "^0.12.0", - "semver": "^7.1.3" - } + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@sindresorhus/is": { "version": "0.14.0", @@ -12036,7 +14024,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -12050,17 +14037,58 @@ "ajv": "*" } }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bson": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", + "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", + "requires": { + "bson": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==" + }, "@types/cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", "dev": true }, + "@types/cookies": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", + "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", + "requires": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, "@types/csrf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/csrf/-/csrf-3.1.0.tgz", @@ -12070,6 +14098,27 @@ "csrf": "*" } }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.27", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", + "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/hapi__iron": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/hapi__iron/-/hapi__iron-6.0.1.tgz", @@ -12088,6 +14137,24 @@ "@types/node": "*" } }, + "@types/http-assert": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", + "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==" + }, + "@types/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" + }, + "@types/ioredis": { + "version": "4.26.6", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.26.6.tgz", + "integrity": "sha512-Q9ydXL/5Mot751i7WLCm9OGTj5jlW3XBdkdEW21SkXZ8Y03srbkluFGbM3q8c+vzPW30JOLJ+NsZWHoly0+13A==", + "requires": { + "@types/node": "*" + } + }, "@types/is-windows": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", @@ -12115,16 +14182,74 @@ "@types/node": "*" } }, + "@types/keygrip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", + "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" + }, + "@types/koa": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==", + "requires": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "@types/koa__router": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.7.tgz", + "integrity": "sha512-OB3Ax75nmTP+WR9AgdzA42DI7YmBtiNKN2g1Wxl+d5Dyek9SWt740t+ukwXSmv/jMBCUPyV3YEI93vZHgdP7UQ==", + "requires": { + "@types/koa": "*" + } + }, + "@types/koa-compose": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", + "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "requires": { + "@types/koa": "*" + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", "dev": true }, + "@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/mysql": { + "version": "2.15.19", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.19.tgz", + "integrity": "sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ==", + "requires": { + "@types/node": "*" + } + }, "@types/node": { - "version": "12.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.11.tgz", - "integrity": "sha512-O+x6uIpa6oMNTkPuHDa9MhMMehlxLAd5QcOvKRjAFsBVpeFWTOPnXbDvILvFgFFZfQ1xh1EZi1FbXxUix+zpsQ==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, "@types/nunjucks": { "version": "3.1.4", @@ -12154,19 +14279,52 @@ "version": "7.14.11", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", - "dev": true, "requires": { "@types/node": "*", "pg-protocol": "^1.2.0", "pg-types": "^2.2.0" } }, + "@types/pg-pool": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz", + "integrity": "sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg==", + "requires": { + "@types/pg": "*" + } + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, "@types/redis": { - "version": "2.8.28", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.28.tgz", - "integrity": "sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA==", + "version": "2.8.31", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", + "integrity": "sha512-daWrrTDYaa5iSDFbgzZ9gOOzyp2AJmYK59OlG/2KGBgYWF3lfs8GDKm1c//tik5Uc93hDD36O+qLPvzDolChbA==", + "requires": { + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "requires": { + "@types/mime": "^1", "@types/node": "*" + }, + "dependencies": { + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + } } }, "@types/tap": { @@ -12330,6 +14488,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -12622,6 +14788,11 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -12631,6 +14802,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -12751,6 +14927,23 @@ "node-releases": "^1.1.71" } }, + "bson": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", + "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -12983,7 +15176,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -12993,14 +15185,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -13342,8 +15532,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "end-of-stream": { "version": "1.4.4", @@ -13384,8 +15573,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -13716,6 +15904,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -14007,6 +16200,27 @@ "is-windows": "^1.0.2" } }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -14016,8 +16230,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-function-location": { "version": "2.0.0", @@ -14353,6 +16566,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -14465,6 +16683,14 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -14529,8 +16755,7 @@ "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, "is-string": { "version": "1.0.5", @@ -14708,6 +16933,14 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -14930,6 +17163,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -14978,6 +17216,11 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -14995,6 +17238,11 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -15136,6 +17384,11 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -15157,6 +17410,14 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -17037,6 +19298,11 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -17089,8 +19355,7 @@ "pg-protocol": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==", - "dev": true + "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" }, "pg-types": { "version": "2.2.0", @@ -17195,6 +19460,26 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", @@ -17471,20 +19756,39 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "resolve": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "requires": { + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -17809,7 +20113,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17819,20 +20122,17 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -17929,6 +20229,11 @@ "supports-color": "^7.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "table": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", @@ -19418,6 +21723,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -19681,6 +21991,20 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -19714,7 +22038,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19724,14 +22047,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } diff --git a/package.json b/package.json index 37a84728..7a3de3d6 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "culture-ships": "^1.0.0", "dotenv": "^8.2.0", "find-my-way": "^4.1.0", + "@grpc/grpc-js": "^1.5.0", "handy-redis": "^2.2.1", "honeycomb-beeline": "^2.1.1", "jsonwebtoken": "^8.5.1", @@ -33,6 +34,11 @@ "oauth": "^0.9.15", "oblique-strategies": "^1.0.1", "on-headers": "^1.0.2", + "@opentelemetry/auto-instrumentations-node": "^0.27.1", + "@opentelemetry/exporter-collector-grpc": "^0.25.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.1", "pg": "^8.3.3", "redis": "^3.0.2", "uuid": "^8.3.0" diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index e4f527f8..e9d2440c 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -1,7 +1,14 @@ void `{% if selftest %}`; import bole from '@entropic/bole' import isDev from 'are-we-dev' +import { CollectorTraceExporter } from '@opentelemetry/exporter-collector-grpc' +import { Metadata, credentials } from '@grpc/grpc-js' +import { NodeSDK } from '@opentelemetry/sdk-node' +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' +import { Resource } from '@opentelemetry/resources' +import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' +import { serviceName, initOtelSDK } from '../core/prelude' import { Handler, MiddlewareConfig } from '../core/middleware' import { _processMiddleware, _requireOr } from '../core/utils' import { attachPostgres } from '../middleware/postgres' @@ -21,6 +28,11 @@ if (require.main === module && !process.env.TAP) { return (next: Handler) => (context: Context) => next(context) } + // {% if honeycomb %} + initOtelSDK().then(run) + function run() { + // {% endif %} + runserver({ middleware: (_requireOr('./middleware', [] as MiddlewareConfig[]) as Promise) .then(_processMiddleware) @@ -75,4 +87,7 @@ if (require.main === module && !process.env.TAP) { console.error(err.stack) process.exit(1) }) + // {% if honeycomb %} + } + // {% endif %} } diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 2260da3c..d6f59e5f 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -30,6 +30,12 @@ function _getServiceName() { void `{% if honeycomb %}`; import beeline from 'honeycomb-beeline' +import { CollectorTraceExporter } from '@opentelemetry/exporter-collector-grpc' +import { Metadata, credentials } from '@grpc/grpc-js' +import { NodeSDK } from '@opentelemetry/sdk-node' +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' +import { Resource } from '@opentelemetry/resources' +import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -47,12 +53,52 @@ if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM } -beeline({ - writeKey: process.env.HONEYCOMB_WRITEKEY, - dataset: process.env.HONEYCOMB_DATASET, - sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, - serviceName, -}) +if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { + process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET +} + +let sdk: NodeSDK | null = null + +if ( + process.env.HONEYCOMB_WRITE_KEY && + process.env.HONEYCOMB_DATASET && + process.env.HONEYCOMB_API_HOST +) { + const metadata = new Metadata() + metadata.set('x-honeycomb-team', process.env.HONEYCOMB_WRITE_KEY) + metadata.set('x-honeycomb-dataset', process.env.HONEYCOMB_DATASET) + + const traceExporter = new CollectorTraceExporter({ + url: process.env.HONEYCOMB_API_HOST, + credentials: credentials.createSsl(), + metadata + }) + + sdk = new NodeSDK({ + resource: new Resource({ + [SemanticResourceAttributes.SERVICE_NAME]: serviceName + }), + traceExporter, + instrumentations: [getNodeAutoInstrumentations()], + metricInterval: Math.floor( + 1 / (Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1) + ) + }) +} else { + beeline({ + writeKey: process.env.HONEYCOMB_WRITEKEY, + dataset: process.env.HONEYCOMB_DATASET, + sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, + serviceName, + }) +} + +function initOtelSDK(): Promise { + if (sdk) { + return sdk.start() + } + return Promise.resolve() +} import onHeaders from 'on-headers' void `{% endif %}`; @@ -153,7 +199,7 @@ export { redis } void `{% endif %}`; void `{% if honeycomb %}`; -export { onHeaders, beeline } +export { onHeaders, beeline, initOtelSDK } void `{% endif %}`; void `{% if jwt or oauth %}`; From 1cbd3606b22370e44725ccf24a470b2996057a52 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 10 Jan 2022 16:19:13 -0500 Subject: [PATCH 002/167] Create OpenTelemetry root and middleware spans --- templates/boltzmann/middleware/honeycomb.ts | 190 ++++++++++++++------ 1 file changed, 133 insertions(+), 57 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 1f5c75a3..e9f3ea2d 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,6 +1,7 @@ void `{% if selftest %}`; export { trace, honeycombMiddlewareSpans } +import { context as otelContext, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' import { Handler } from '../core/middleware' import { Context } from '../data/context' import { ServerResponse } from 'http' @@ -9,6 +10,15 @@ import beeline from 'honeycomb-beeline' import isDev from 'are-we-dev' void `{% endif %}`; +let otelTracer: OtelTracer | null = null; + +function getOtelTracer() { + if (!otelTracer) { + otelTracer = otelTrace.getTracer('boltzmann', '1.0.0') + } + return otelTracer +} + function trace ({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { @@ -16,70 +26,117 @@ function trace ({ return (next: Handler) => (context: Context) => next(context) } - const schema = require('honeycomb-beeline/lib/schema') - const tracker = require('honeycomb-beeline/lib/async_tracker') - - return function honeycombTrace (next: Handler) { - return (context: Context) => { - const traceContext = _getTraceContext(context) - const trace = beeline.startTrace({ - [schema.EVENT_TYPE]: 'boltzmann', - [schema.PACKAGE_VERSION]: '1.0.0', - [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, - [schema.TRACE_ID_SOURCE]: traceContext.source, - 'request.host': context.host, - 'request.original_url': context.url.href, - 'request.remote_addr': context.remote, - 'request.method': context.method, - 'request.scheme': context.url.protocol, - 'request.path': context.url.pathname, - 'request.query': context.url.search - }, - traceContext.traceId, - traceContext.parentSpanId, - traceContext.dataset) - - if (isDev()) { - context._honeycombTrace = trace - } - - if (traceContext.customContext) { - beeline.addContext(traceContext.customContext) - } + if (process.env.HONEYCOMB_API_HOST) { + return function honeycombOtelTrace (next: Handler) { + return (context: Context) => { + const activeContext = otelContext.active() + const tracer = getOtelTracer() + + const rootSpan = tracer.startSpan(`${context.method} ${context.url.pathname}${context.url.search}`, { + attributes: { + 'request.host': context.host, + 'request.original_url': context.url.href, + 'request.remote_addr': context.remote, + 'request.method': context.method, + 'request.scheme': context.url.protocol, + 'request.path': context.url.pathname, + 'request.query': context.url.search + } + }, activeContext) + + otelTrace.setSpan(activeContext, rootSpan) + + // do not do as I do, + onHeaders(context._response, function () { + rootSpan.setAttribute('response.status_code', String(context._response.statusCode)) + if (context.handler) { + const handler = context.handler; + if (handler.route) { + rootSpan.setAttribute('request.route', handler.route) + } + if (handler.method) { + rootSpan.setAttribute('request.method', handler.method) + } + if (handler.version) { + rootSpan.setAttribute('request.version', handler.version) + } + } + Object.entries(context.params).map(([key, value]) => { + rootSpan.setAttribute(`request.param.${key}`, value) + }) + + rootSpan.end() + }) - if (!trace) { return next(context) } - - const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { - beeline.addContext({ - 'response.status_code': String(response.statusCode) - }) - - beeline.addContext({ - 'request.route': context.handler.route, - 'request.method': context.handler.method, - 'request.version': context.handler.version + } + } else { + const schema = require('honeycomb-beeline/lib/schema') + const tracker = require('honeycomb-beeline/lib/async_tracker') + + return function honeycombTrace (next: Handler) { + return (context: Context) => { + const traceContext = _getBeelineTraceContext(context) + const trace = beeline.startTrace({ + [schema.EVENT_TYPE]: 'boltzmann', + [schema.PACKAGE_VERSION]: '1.0.0', + [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, + [schema.TRACE_ID_SOURCE]: traceContext.source, + 'request.host': context.host, + 'request.original_url': context.url.href, + 'request.remote_addr': context.remote, + 'request.method': context.method, + 'request.scheme': context.url.protocol, + 'request.path': context.url.pathname, + 'request.query': context.url.search + }, + traceContext.traceId, + traceContext.parentSpanId, + traceContext.dataset) + + if (isDev()) { + context._honeycombTrace = trace + } + + if (traceContext.customContext) { + beeline.addContext(traceContext.customContext) + } + + if (!trace) { + return next(context) + } + + const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { + beeline.addContext({ + 'response.status_code': String(response.statusCode) + }) + + beeline.addContext({ + 'request.route': context.handler.route, + 'request.method': context.handler.method, + 'request.version': context.handler.version + }) + + const params = Object.entries(context.params).map(([key, value]) => { + return [`request.param.${key}`, value] + }) + beeline.addContext(Object.fromEntries(params)) + + beeline.finishTrace(trace) }) - const params = Object.entries(context.params).map(([key, value]) => { - return [`request.param.${key}`, value] + // do not do as I do, + onHeaders(context._response, function () { + return boundFinisher(this, tracker.getTracked()) }) - beeline.addContext(Object.fromEntries(params)) - - beeline.finishTrace(trace) - }) - - // do not do as I do, - onHeaders(context._response, function () { - return boundFinisher(this, tracker.getTracked()) - }) - return next(context) + return next(context) + } } } - function _getTraceContext (context: Context) { + function _getBeelineTraceContext (context: Context) { const source = headerSources.find(header => header in context.headers) if (!source || !context.headers[source]) { @@ -108,14 +165,33 @@ function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { return (next: Handler) => (context: Context) => next(context) } - return function honeycombSpan (next: Handler) { + if (process.env.HONEYCOMB_API_HOST) { + return honeycombOtelSpan + } else { + return honeycombBeelineSpan + } + + function honeycombOtelSpan (next: Handler) { + return async (context: Context) => { + const activeContext = otelContext.active() + const tracer = getOtelTracer() + const span = tracer.startSpan(`mw: ${name}`) + otelTrace.setSpan(activeContext, span) + + // Assumption: the invariant middleware between each layer + // will ensure that no errors are thrown from next(). + const result = await next(context) + span.end() + return result + } + } + + function honeycombBeelineSpan (next: Handler) { return async (context: Context) => { const span = beeline.startSpan({ name: `mw: ${name}` }) - // Assumption: the invariant middleware between each layer - // will ensure that no errors are thrown from next(). const result = await next(context) beeline.finishSpan(span) return result From f983b192edecf718aeee002d20362f1d54607395 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 10 Jan 2022 16:48:48 -0500 Subject: [PATCH 003/167] Add exit handlers for otel --- templates/boltzmann/core/prelude.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index d6f59e5f..3299f327 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -95,7 +95,29 @@ if ( function initOtelSDK(): Promise { if (sdk) { + let exitCode = 0 + process.once('SIGTERM', shutdown) + process.once('beforeExit', shutdown) + process.once('uncaughtException', die) + process.once('unhandledRejection', die) return sdk.start() + + async function die(err: Error) { + console.error(err.stack) + exitCode = 1 + await shutdown() + } + + async function shutdown() { + if (sdk) { + try { + await sdk.shutdown() + } catch (err) { + console.error(err.stack) + } + } + process.exit(exitCode) + } } return Promise.resolve() } From 2f04ea14f895d1af0f19d42e71f2c7f4caf950c4 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 10 Jan 2022 17:31:17 -0500 Subject: [PATCH 004/167] Set traceparent and tracestate on the active otel context --- templates/boltzmann/middleware/honeycomb.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index e9f3ea2d..e9db71ce 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,7 +1,7 @@ void `{% if selftest %}`; export { trace, honeycombMiddlewareSpans } -import { context as otelContext, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' +import { context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' import { Handler } from '../core/middleware' import { Context } from '../data/context' import { ServerResponse } from 'http' @@ -29,9 +29,16 @@ function trace ({ if (process.env.HONEYCOMB_API_HOST) { return function honeycombOtelTrace (next: Handler) { return (context: Context) => { - const activeContext = otelContext.active() + let activeContext = otelContext.active() const tracer = getOtelTracer() + if (context.headers.traceparent && context.headers.tracestate) { + activeContext = otelPropagation.extract(activeContext, { + traceparent: context.headers.traceparent, + tracestate: context.headers.tracestate + }) + } + const rootSpan = tracer.startSpan(`${context.method} ${context.url.pathname}${context.url.search}`, { attributes: { 'request.host': context.host, From 03318f82555546c8026950c787cc68e25cb01e9c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 12 Jan 2022 19:05:30 -0500 Subject: [PATCH 005/167] Add otel imports to prelude --- templates/boltzmann/core/prelude.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 3299f327..31fb1a2d 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -36,6 +36,7 @@ import { NodeSDK } from '@opentelemetry/sdk-node' import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' import { Resource } from '@opentelemetry/resources' import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' +import { context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -283,5 +284,9 @@ export { promisify, querystring, ships, + otelContext, + otelPropagation, + otelTrace, + OtelTracer } void `{% endif %}` From 03fbcec64374375d73ddd253a2f632ca0a3babe8 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 12 Jan 2022 19:25:06 -0500 Subject: [PATCH 006/167] Refactor grpc switching logic --- templates/boltzmann/middleware/honeycomb.ts | 50 ++++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index e9db71ce..c9607826 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -12,6 +12,17 @@ void `{% endif %}`; let otelTracer: OtelTracer | null = null; +function isHoneycomb (env: typeof process.env): boolean { + return !!env.HONEYCOMB_WRITEKEY +} + +function isOtel (env: typeof process.env): boolean { + if (isHoneycomb(env) && env.HONEYCOMB_API_HOST) { + return /^grpc:\/\//.test(env.HONEYCOMB_API_HOST) + } + return false +} + function getOtelTracer() { if (!otelTracer) { otelTracer = otelTrace.getTracer('boltzmann', '1.0.0') @@ -22,11 +33,11 @@ function getOtelTracer() { function trace ({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { - if (!process.env.HONEYCOMB_WRITEKEY) { + if (!isHoneycomb(process.env)) { return (next: Handler) => (context: Context) => next(context) } - if (process.env.HONEYCOMB_API_HOST) { + if (isOtel(process.env)) { return function honeycombOtelTrace (next: Handler) { return (context: Context) => { let activeContext = otelContext.active() @@ -207,3 +218,38 @@ function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { } +void `{% if selftest %}`; + +import tap from 'tap' +import { Test } from './test' + +/* c8 ignore next */ +if (require.main === module) { + const { test } = tap + + test('isHoneycomb detects if Honeycomb is enabled', async (assert: Test) => { + assert.equal(isHoneycomb({}), false) + assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: ''}), false) + assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: 'some write key'}), true) + }) + + test('isOtel detects if OpenTelemetry is enabled', async (assert: Test) => { + assert.equal(isOtel({}), false) + assert.equal(isOtel({HONEYCOMB_WRITEKEY: ''}), false) + assert.equal(isOtel({HONEYCOMB_WRITEKEY: 'some write key'}), false) + assert.equal(isOtel({ + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'https://refinery.website' + }), false) + assert.equal(isOtel({ + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'grpc://otel.website' + }), true) + assert.equal(isOtel({ + HONEYCOMB_WRITEKEY: '', + HONEYCOMB_API_HOST: 'grpc://otel.website' + }), false) + }) +} +void `{% endif %}`; + From 630c2fbeba04caa0ce10dd5b8bec17ac29880af8 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 13:45:45 -0500 Subject: [PATCH 007/167] Use isHoneycomb/isOtel everywhere, including prelude --- templates/boltzmann/core/prelude.ts | 28 +++++++++++++-------- templates/boltzmann/middleware/honeycomb.ts | 16 +++--------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 31fb1a2d..c3f64753 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -60,11 +60,18 @@ if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { let sdk: NodeSDK | null = null -if ( - process.env.HONEYCOMB_WRITE_KEY && - process.env.HONEYCOMB_DATASET && - process.env.HONEYCOMB_API_HOST -) { +function isHoneycomb (env: typeof process.env): boolean { + return !!env.HONEYCOMB_WRITEKEY +} + +function isOtel (env: typeof process.env): boolean { + if (isHoneycomb(env) && env.HONEYCOMB_API_HOST) { + return /^grpc:\/\//.test(env.HONEYCOMB_API_HOST) + } + return false +} + +if (isOtel(process.env) && process.env.HONEYCOMB_WRITE_KEY && process.env.HONEYCOMB_DATASET) { const metadata = new Metadata() metadata.set('x-honeycomb-team', process.env.HONEYCOMB_WRITE_KEY) metadata.set('x-honeycomb-dataset', process.env.HONEYCOMB_DATASET) @@ -80,12 +87,9 @@ if ( [SemanticResourceAttributes.SERVICE_NAME]: serviceName }), traceExporter, - instrumentations: [getNodeAutoInstrumentations()], - metricInterval: Math.floor( - 1 / (Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1) - ) + instrumentations: [getNodeAutoInstrumentations()] }) -} else { +} else if (isHoneycomb(process.env)) { beeline({ writeKey: process.env.HONEYCOMB_WRITEKEY, dataset: process.env.HONEYCOMB_DATASET, @@ -284,9 +288,11 @@ export { promisify, querystring, ships, + isHoneycomb, + isOtel, otelContext, otelPropagation, otelTrace, - OtelTracer + OtelTracer, } void `{% endif %}` diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index c9607826..7871d65b 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -2,6 +2,7 @@ void `{% if selftest %}`; export { trace, honeycombMiddlewareSpans } import { context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' +import { isHoneycomb, isOtel } from '../core/prelude' import { Handler } from '../core/middleware' import { Context } from '../data/context' import { ServerResponse } from 'http' @@ -12,17 +13,6 @@ void `{% endif %}`; let otelTracer: OtelTracer | null = null; -function isHoneycomb (env: typeof process.env): boolean { - return !!env.HONEYCOMB_WRITEKEY -} - -function isOtel (env: typeof process.env): boolean { - if (isHoneycomb(env) && env.HONEYCOMB_API_HOST) { - return /^grpc:\/\//.test(env.HONEYCOMB_API_HOST) - } - return false -} - function getOtelTracer() { if (!otelTracer) { otelTracer = otelTrace.getTracer('boltzmann', '1.0.0') @@ -179,11 +169,11 @@ function trace ({ } function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { - if (!process.env.HONEYCOMB_WRITEKEY) { + if (!isHoneycomb(process.env)) { return (next: Handler) => (context: Context) => next(context) } - if (process.env.HONEYCOMB_API_HOST) { + if (isOtel(process.env)) { return honeycombOtelSpan } else { return honeycombBeelineSpan From b432e1975d862a42737987a4bee71a9e3c31ef5f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 13:46:00 -0500 Subject: [PATCH 008/167] Export beeline by default --- templates/boltzmann/core/prelude.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index c3f64753..2ada0878 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -226,7 +226,7 @@ export { redis } void `{% endif %}`; void `{% if honeycomb %}`; -export { onHeaders, beeline, initOtelSDK } +export { onHeaders, initOtelSDK } void `{% endif %}`; void `{% if jwt or oauth %}`; @@ -288,6 +288,7 @@ export { promisify, querystring, ships, + beeline, isHoneycomb, isOtel, otelContext, From 228925b5d4a61643f98c5f37fa5a21ed27325d17 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 14:20:58 -0500 Subject: [PATCH 009/167] Use OpenTelemetry semantic attributes --- templates/boltzmann/middleware/honeycomb.ts | 25 +++++++++++---------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 7871d65b..fc27462b 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -2,6 +2,7 @@ void `{% if selftest %}`; export { trace, honeycombMiddlewareSpans } import { context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' +import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' import { isHoneycomb, isOtel } from '../core/prelude' import { Handler } from '../core/middleware' import { Context } from '../data/context' @@ -42,13 +43,13 @@ function trace ({ const rootSpan = tracer.startSpan(`${context.method} ${context.url.pathname}${context.url.search}`, { attributes: { - 'request.host': context.host, - 'request.original_url': context.url.href, - 'request.remote_addr': context.remote, - 'request.method': context.method, - 'request.scheme': context.url.protocol, - 'request.path': context.url.pathname, - 'request.query': context.url.search + [SemanticAttributes.HTTP_HOST]: context.host, + [SemanticAttributes.HTTP_URL]: context.url.href, + [SemanticAttributes.NET_PEER_IP]: context.remote, + [SemanticAttributes.HTTP_METHOD]: context.method, + [SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + 'boltzmann.request.query': context.url.search } }, activeContext) @@ -56,21 +57,21 @@ function trace ({ // do not do as I do, onHeaders(context._response, function () { - rootSpan.setAttribute('response.status_code', String(context._response.statusCode)) + rootSpan.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, String(context._response.statusCode)) if (context.handler) { const handler = context.handler; if (handler.route) { - rootSpan.setAttribute('request.route', handler.route) + rootSpan.setAttribute(SemanticAttributes.HTTP_ROUTE, handler.route) } if (handler.method) { - rootSpan.setAttribute('request.method', handler.method) + rootSpan.setAttribute(SemanticAttributes.HTTP_METHOD, handler.method) } if (handler.version) { - rootSpan.setAttribute('request.version', handler.version) + rootSpan.setAttribute(SemanticResourceAttributes.SERVICE_VERSION, handler.version) } } Object.entries(context.params).map(([key, value]) => { - rootSpan.setAttribute(`request.param.${key}`, value) + rootSpan.setAttribute(`boltzmann.request.param.${key}`, value) }) rootSpan.end() From 383fb3c66d535bf7fd7eac86745b1049094b795c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 14:31:41 -0500 Subject: [PATCH 010/167] Move isHoneycomb/isOtel tests to prelude --- templates/boltzmann/core/prelude.ts | 39 +++++++++++++++++++-- templates/boltzmann/middleware/honeycomb.ts | 32 +++-------------- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 2ada0878..dde6b6ba 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -182,7 +182,12 @@ void `{% endif %}`; import { Readable } from 'stream' import type { RequestOptions as ShotRequestOptions, Listener, ResponseObject } from '@hapi/shot' -import type tap from 'tap' + +// void `{% if selftest %}` +import tap from 'tap' +// void `{% else %}` +// import type tap from 'tap' +// void `{% endif %}` import querystring from 'querystring' import { promisify } from 'util' @@ -215,7 +220,37 @@ type HttpMetadata = ( { [TEMPLATE]: string } ) -void `{% if selftest %}` +void `{% if selftest %}`; +import { Test } from '../middleware/test' + +/* c8 ignore next */ +if (require.main === module) { + const { test } = tap + + test('isHoneycomb detects if Honeycomb is enabled', async (assert: Test) => { + assert.equal(isHoneycomb({}), false) + assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: ''}), false) + assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: 'some write key'}), true) + }) + + test('isOtel detects if OpenTelemetry is enabled', async (assert: Test) => { + assert.equal(isOtel({}), false) + assert.equal(isOtel({HONEYCOMB_WRITEKEY: ''}), false) + assert.equal(isOtel({HONEYCOMB_WRITEKEY: 'some write key'}), false) + assert.equal(isOtel({ + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'https://refinery.website' + }), false) + assert.equal(isOtel({ + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'grpc://otel.website' + }), true) + assert.equal(isOtel({ + HONEYCOMB_WRITEKEY: '', + HONEYCOMB_API_HOST: 'grpc://otel.website' + }), false) + }) +} void `{% if postgres %}`; export { pg, PGPool, PGPoolClient, PGClient } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index fc27462b..66c703be 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -211,36 +211,14 @@ function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { void `{% if selftest %}`; -import tap from 'tap' -import { Test } from './test' +// import tap from 'tap' +// import { Test } from './test' /* c8 ignore next */ +/* if (require.main === module) { - const { test } = tap - - test('isHoneycomb detects if Honeycomb is enabled', async (assert: Test) => { - assert.equal(isHoneycomb({}), false) - assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: ''}), false) - assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: 'some write key'}), true) - }) - - test('isOtel detects if OpenTelemetry is enabled', async (assert: Test) => { - assert.equal(isOtel({}), false) - assert.equal(isOtel({HONEYCOMB_WRITEKEY: ''}), false) - assert.equal(isOtel({HONEYCOMB_WRITEKEY: 'some write key'}), false) - assert.equal(isOtel({ - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'https://refinery.website' - }), false) - assert.equal(isOtel({ - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'grpc://otel.website' - }), true) - assert.equal(isOtel({ - HONEYCOMB_WRITEKEY: '', - HONEYCOMB_API_HOST: 'grpc://otel.website' - }), false) - }) + // TODO: Tests } +*/ void `{% endif %}`; From 2f091db38bbad0fbd69c5c8353178953c260a9a3 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 14:36:29 -0500 Subject: [PATCH 011/167] Replace type guards with unsafe casts, yolo --- templates/boltzmann/middleware/honeycomb.ts | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 66c703be..bec4d746 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -57,19 +57,13 @@ function trace ({ // do not do as I do, onHeaders(context._response, function () { + const handler: Handler = context.handler + rootSpan.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, String(context._response.statusCode)) - if (context.handler) { - const handler = context.handler; - if (handler.route) { - rootSpan.setAttribute(SemanticAttributes.HTTP_ROUTE, handler.route) - } - if (handler.method) { - rootSpan.setAttribute(SemanticAttributes.HTTP_METHOD, handler.method) - } - if (handler.version) { - rootSpan.setAttribute(SemanticResourceAttributes.SERVICE_VERSION, handler.version) - } - } + rootSpan.setAttribute(SemanticAttributes.HTTP_ROUTE, handler.route) + rootSpan.setAttribute(SemanticAttributes.HTTP_METHOD, handler.method) + rootSpan.setAttribute(SemanticResourceAttributes.SERVICE_VERSION, handler.version) + Object.entries(context.params).map(([key, value]) => { rootSpan.setAttribute(`boltzmann.request.param.${key}`, value) }) From 58f904ea56b4f4ffa9bf2f00fa223a520994a23f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 15:21:56 -0500 Subject: [PATCH 012/167] Configure sampler --- package-lock.json | 917 ++++++++----------------- package.json | 15 +- templates/boltzmann/core/entrypoint.ts | 6 - templates/boltzmann/core/prelude.ts | 38 +- 4 files changed, 337 insertions(+), 639 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1cff505e..fa27af28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,12 @@ "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", "@opentelemetry/auto-instrumentations-node": "^0.27.1", - "@opentelemetry/exporter-collector-grpc": "^0.25.0", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/node": "^0.24.0", "@opentelemetry/resources": "^1.0.1", "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", @@ -718,17 +721,6 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/api-metrics": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.25.0.tgz", - "integrity": "sha512-9T0c9NQAEGRujUC7HzPa2/qZ5px/UvB2sfSU5CAKFRrAlDl2gn25B0oUbDqSRHW/IG1X2rnQ3z2bBQkJyJvE4g==", - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, "node_modules/@opentelemetry/auto-instrumentations-node": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.27.1.tgz", @@ -771,143 +763,52 @@ } }, "node_modules/@opentelemetry/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", - "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", "dependencies": { - "@opentelemetry/api": "^0.12.0", - "@opentelemetry/context-base": "^0.12.0", - "semver": "^7.1.3" + "@opentelemetry/semantic-conventions": "1.0.1" }, "engines": { "node": ">=8.5.0" - } - }, - "node_modules/@opentelemetry/core/node_modules/@opentelemetry/api": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", - "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", - "dependencies": { - "@opentelemetry/context-base": "^0.12.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/exporter-collector": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector/-/exporter-collector-0.25.0.tgz", - "integrity": "sha512-xZYstLt4hz1aTloJaepWdjMMf9305MqwqbUWjcU/X9pOxvgFWRlchO6x/HQTw7ow0i/S+ShzC+greKnb+1WvLA==", - "deprecated": "Please use trace and metric specific exporters @opentelemetry/exporter-trace-otlp-http and @opentelemetry/exporter-metrics-otlp-http", - "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" - }, - "engines": { - "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.2" + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/exporter-collector-grpc": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector-grpc/-/exporter-collector-grpc-0.25.0.tgz", - "integrity": "sha512-Mqkdh89pC1NxX5BngxHmDqMQ6WVCFuMr1PvwRZmJBBR2MXaStO5qIxELHuHgkDZEXpIFJbqNC7JAfDklXm8o1w==", - "deprecated": "Please use trace and metric specific exporters @opentelemetry/exporter-trace-otlp-grpc and @opentelemetry/exporter-metrics-otlp-grpc", + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", "dependencies": { "@grpc/grpc-js": "^1.3.7", "@grpc/proto-loader": "^0.6.4", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/exporter-collector": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-collector-grpc/node_modules/@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", - "dependencies": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-collector-grpc/node_modules/@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", - "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" - }, - "engines": { - "node": ">=8.0.0" + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-collector-grpc/node_modules/@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", "engines": { "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/exporter-collector/node_modules/@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", - "dependencies": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=8.5.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.2" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-collector/node_modules/@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-collector/node_modules/@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", - "engines": { - "node": ">=8.0.0" + "@opentelemetry/api": "^1.0.0" } }, "node_modules/@opentelemetry/instrumentation": { @@ -957,20 +858,6 @@ "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, "node_modules/@opentelemetry/instrumentation-graphql": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.1.tgz", @@ -1026,20 +913,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, "node_modules/@opentelemetry/instrumentation-ioredis": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.27.0.tgz", @@ -1074,20 +947,6 @@ "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, "node_modules/@opentelemetry/instrumentation-mongodb": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.27.0.tgz", @@ -1171,54 +1030,108 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", - "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "node_modules/@opentelemetry/node": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/node/-/node-0.24.0.tgz", + "integrity": "sha512-Sy8QooZFOeVUcJIKetw5xsq15/1ivZovWg0RnKWtzURMQrcOxmQ3bGrXPORklOJxOtf5snDHgT37Y7dBgr+c+g==", + "deprecated": "Package renamed to @opentelemetry/sdk-trace-node", "dependencies": { - "@opentelemetry/core": "1.0.1" + "@opentelemetry/context-async-hooks": "0.24.0", + "@opentelemetry/core": "0.24.0", + "@opentelemetry/propagator-b3": "0.24.0", + "@opentelemetry/propagator-jaeger": "0.24.0", + "@opentelemetry/tracing": "0.24.0", + "semver": "^7.1.3" }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": "^1.0.1" } }, - "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/context-async-hooks": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-0.24.0.tgz", + "integrity": "sha512-Db8AgMByBEFKLJGSUBlNq4Un/Tqzj5W0hTxx3hIic8DvBwqbvUvkMGuiQYLKE2Ay21cLYMT01xK4TEKz0OxADw==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/core": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", + "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/semantic-conventions": "0.24.0", + "semver": "^7.1.3" }, "engines": { "node": ">=8.5.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": "^1.0.1" } }, - "node_modules/@opentelemetry/propagator-jaeger": { + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/propagator-b3": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-0.24.0.tgz", + "integrity": "sha512-iV7KSN0LkEAkeVCbhaIJAgTEb7HCnVkprmpgkL6q79rP3vTW4dylwfBYgIwod7y0GT4Ofgomm0NrwwWiuGLbQA==", + "dependencies": { + "@opentelemetry/core": "0.24.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/propagator-jaeger": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.24.0.tgz", + "integrity": "sha512-QXCxBwuSka+vXbBZdumtF7YKO84gwTyKy3GelZV5BPlgWoge0AbLR3DfsO9Beu13pmD+4PyuwMw3LfYsgG1+3g==", + "dependencies": { + "@opentelemetry/core": "0.24.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", + "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", - "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", "dependencies": { "@opentelemetry/core": "1.0.1" }, "engines": { - "node": ">=8.5.0" + "node": ">=8.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/propagator-jaeger": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/core": "1.0.1" }, "engines": { "node": ">=8.5.0" @@ -1243,20 +1156,6 @@ "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, "node_modules/@opentelemetry/resource-detector-gcp": { "version": "0.26.1", "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", @@ -1289,75 +1188,6 @@ "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics-base": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.25.0.tgz", - "integrity": "sha512-7fwPlAFB5Xw8mnVQfq0wqKNw3RXiAMad9T1bk5Sza9LK/L6hz8RTuHWCsFMsj+1OOSAaiPFuUMYrK1J75+2IAg==", - "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", - "dependencies": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", - "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@opentelemetry/sdk-node": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", @@ -1388,20 +1218,6 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics-base": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", @@ -1419,7 +1235,7 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { + "node_modules/@opentelemetry/sdk-trace-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", @@ -1435,114 +1251,85 @@ "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-0.25.0.tgz", - "integrity": "sha512-TInkLSF/ThM3GNVM+9tgnCVjyNLnRxvAkG585Fhu0HNwaEtCTUwI0r7AvMRIREOreeRWttBG6kvT0LOKdo8yjw==", - "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", "dependencies": { - "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", "semver": "^7.3.5" }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", - "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" - }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.2" + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==", + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", "engines": { "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", - "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + } + }, + "node_modules/@opentelemetry/tracing": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.24.0.tgz", + "integrity": "sha512-sTLEs1SIon3xV8vLe53PzfbU0FahoxL9NPY/CYvA1mwGbMu4zHkHAjqy1Tc8JmqRrfa+XrHkmzeSM4hrvloBaA==", + "deprecated": "Package renamed to @opentelemetry/sdk-trace-base", "dependencies": { - "@opentelemetry/context-async-hooks": "1.0.1", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/propagator-b3": "1.0.1", - "@opentelemetry/propagator-jaeger": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1", - "semver": "^7.3.5" + "@opentelemetry/core": "0.24.0", + "@opentelemetry/resources": "0.24.0", + "@opentelemetry/semantic-conventions": "0.24.0", + "lodash.merge": "^4.6.2" }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": "^1.0.1" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "node_modules/@opentelemetry/tracing/node_modules/@opentelemetry/core": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", + "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/semantic-conventions": "0.24.0", + "semver": "^7.1.3" }, "engines": { "node": ">=8.5.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": "^1.0.1" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", - "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "node_modules/@opentelemetry/tracing/node_modules/@opentelemetry/resources": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.24.0.tgz", + "integrity": "sha512-uEr2m13IRkjQAjX6fsYqJ21aONCspRvuQunaCl8LbH1NS1Gj82TuRUHF6TM82ulBPK8pU+nrrqXKuky2cMcIzw==", "dependencies": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/core": "0.24.0", + "@opentelemetry/semantic-conventions": "0.24.0" }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": "^1.0.1" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", - "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "node_modules/@opentelemetry/tracing/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", + "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==", "engines": { "node": ">=8.0.0" } @@ -4851,6 +4638,30 @@ "shimmer": "^1.2.1" } }, + "node_modules/honeycomb-beeline/node_modules/@opentelemetry/api": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", + "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", + "dependencies": { + "@opentelemetry/context-base": "^0.12.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/honeycomb-beeline/node_modules/@opentelemetry/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", + "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", + "dependencies": { + "@opentelemetry/api": "^0.12.0", + "@opentelemetry/context-base": "^0.12.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.5.0" + } + }, "node_modules/honeycomb-beeline/node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -13380,12 +13191,6 @@ "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", "peer": true }, - "@opentelemetry/api-metrics": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.25.0.tgz", - "integrity": "sha512-9T0c9NQAEGRujUC7HzPa2/qZ5px/UvB2sfSU5CAKFRrAlDl2gn25B0oUbDqSRHW/IG1X2rnQ3z2bBQkJyJvE4g==", - "requires": {} - }, "@opentelemetry/auto-instrumentations-node": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.27.1.tgz", @@ -13417,99 +13222,34 @@ "integrity": "sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA==" }, "@opentelemetry/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", - "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", "requires": { - "@opentelemetry/api": "^0.12.0", - "@opentelemetry/context-base": "^0.12.0", - "semver": "^7.1.3" - }, - "dependencies": { - "@opentelemetry/api": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", - "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", - "requires": { - "@opentelemetry/context-base": "^0.12.0" - } - } + "@opentelemetry/semantic-conventions": "1.0.1" } }, - "@opentelemetry/exporter-collector": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector/-/exporter-collector-0.25.0.tgz", - "integrity": "sha512-xZYstLt4hz1aTloJaepWdjMMf9305MqwqbUWjcU/X9pOxvgFWRlchO6x/HQTw7ow0i/S+ShzC+greKnb+1WvLA==", + "@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", "requires": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", - "requires": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" - } - }, - "@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", - "requires": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" - } + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" } }, - "@opentelemetry/exporter-collector-grpc": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-collector-grpc/-/exporter-collector-grpc-0.25.0.tgz", - "integrity": "sha512-Mqkdh89pC1NxX5BngxHmDqMQ6WVCFuMr1PvwRZmJBBR2MXaStO5qIxELHuHgkDZEXpIFJbqNC7JAfDklXm8o1w==", + "@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", "requires": { - "@grpc/grpc-js": "^1.3.7", - "@grpc/proto-loader": "^0.6.4", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/exporter-collector": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", - "requires": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" - } - }, - "@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", - "requires": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" - } + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" } }, "@opentelemetry/instrumentation": { @@ -13549,16 +13289,6 @@ "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/express": "4.17.13" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - } } }, "@opentelemetry/instrumentation-graphql": { @@ -13595,16 +13325,6 @@ "@opentelemetry/instrumentation": "0.27.0", "@opentelemetry/semantic-conventions": "1.0.1", "semver": "^7.3.5" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - } } }, "@opentelemetry/instrumentation-ioredis": { @@ -13627,16 +13347,6 @@ "@opentelemetry/semantic-conventions": "^1.0.0", "@types/koa": "2.13.4", "@types/koa__router": "8.0.7" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - } } }, "@opentelemetry/instrumentation-mongodb": { @@ -13692,40 +13402,71 @@ "@types/redis": "2.8.31" } }, - "@opentelemetry/propagator-b3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", - "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "@opentelemetry/node": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/node/-/node-0.24.0.tgz", + "integrity": "sha512-Sy8QooZFOeVUcJIKetw5xsq15/1ivZovWg0RnKWtzURMQrcOxmQ3bGrXPORklOJxOtf5snDHgT37Y7dBgr+c+g==", "requires": { - "@opentelemetry/core": "1.0.1" + "@opentelemetry/context-async-hooks": "0.24.0", + "@opentelemetry/core": "0.24.0", + "@opentelemetry/propagator-b3": "0.24.0", + "@opentelemetry/propagator-jaeger": "0.24.0", + "@opentelemetry/tracing": "0.24.0", + "semver": "^7.1.3" }, "dependencies": { + "@opentelemetry/context-async-hooks": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-0.24.0.tgz", + "integrity": "sha512-Db8AgMByBEFKLJGSUBlNq4Un/Tqzj5W0hTxx3hIic8DvBwqbvUvkMGuiQYLKE2Ay21cLYMT01xK4TEKz0OxADw==", + "requires": {} + }, "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", + "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", + "requires": { + "@opentelemetry/semantic-conventions": "0.24.0", + "semver": "^7.1.3" + } + }, + "@opentelemetry/propagator-b3": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-0.24.0.tgz", + "integrity": "sha512-iV7KSN0LkEAkeVCbhaIJAgTEb7HCnVkprmpgkL6q79rP3vTW4dylwfBYgIwod7y0GT4Ofgomm0NrwwWiuGLbQA==", "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/core": "0.24.0" } + }, + "@opentelemetry/propagator-jaeger": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.24.0.tgz", + "integrity": "sha512-QXCxBwuSka+vXbBZdumtF7YKO84gwTyKy3GelZV5BPlgWoge0AbLR3DfsO9Beu13pmD+4PyuwMw3LfYsgG1+3g==", + "requires": { + "@opentelemetry/core": "0.24.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", + "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==" } } }, + "@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, "@opentelemetry/propagator-jaeger": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", "requires": { "@opentelemetry/core": "1.0.1" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - } } }, "@opentelemetry/resource-detector-aws": { @@ -13736,16 +13477,6 @@ "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.0.0", "@opentelemetry/semantic-conventions": "^1.0.0" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - } } }, "@opentelemetry/resource-detector-gcp": { @@ -13766,52 +13497,6 @@ "requires": { "@opentelemetry/core": "1.0.1", "@opentelemetry/semantic-conventions": "1.0.1" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - } - } - }, - "@opentelemetry/sdk-metrics-base": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.25.0.tgz", - "integrity": "sha512-7fwPlAFB5Xw8mnVQfq0wqKNw3RXiAMad9T1bk5Sza9LK/L6hz8RTuHWCsFMsj+1OOSAaiPFuUMYrK1J75+2IAg==", - "requires": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "lodash.merge": "^4.6.2" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", - "requires": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" - } - }, - "@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", - "requires": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" - } } }, "@opentelemetry/sdk-node": { @@ -13835,14 +13520,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" }, - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - }, "@opentelemetry/sdk-metrics-base": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", @@ -13853,53 +13530,17 @@ "@opentelemetry/resources": "1.0.1", "lodash.merge": "^4.6.2" } - }, - "@opentelemetry/sdk-trace-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", - "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", - "requires": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" - } } } }, "@opentelemetry/sdk-trace-base": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-0.25.0.tgz", - "integrity": "sha512-TInkLSF/ThM3GNVM+9tgnCVjyNLnRxvAkG585Fhu0HNwaEtCTUwI0r7AvMRIREOreeRWttBG6kvT0LOKdo8yjw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", "requires": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0", - "lodash.merge": "^4.6.2" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz", - "integrity": "sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==", - "requires": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" - } - }, - "@opentelemetry/resources": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz", - "integrity": "sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==", - "requires": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz", - "integrity": "sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==" - } + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" } }, "@opentelemetry/sdk-trace-node": { @@ -13913,33 +13554,49 @@ "@opentelemetry/propagator-jaeger": "1.0.1", "@opentelemetry/sdk-trace-base": "1.0.1", "semver": "^7.3.5" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + }, + "@opentelemetry/tracing": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.24.0.tgz", + "integrity": "sha512-sTLEs1SIon3xV8vLe53PzfbU0FahoxL9NPY/CYvA1mwGbMu4zHkHAjqy1Tc8JmqRrfa+XrHkmzeSM4hrvloBaA==", + "requires": { + "@opentelemetry/core": "0.24.0", + "@opentelemetry/resources": "0.24.0", + "@opentelemetry/semantic-conventions": "0.24.0", + "lodash.merge": "^4.6.2" }, "dependencies": { "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", + "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/semantic-conventions": "0.24.0", + "semver": "^7.1.3" } }, - "@opentelemetry/sdk-trace-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", - "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "@opentelemetry/resources": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.24.0.tgz", + "integrity": "sha512-uEr2m13IRkjQAjX6fsYqJ21aONCspRvuQunaCl8LbH1NS1Gj82TuRUHF6TM82ulBPK8pU+nrrqXKuky2cMcIzw==", "requires": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/core": "0.24.0", + "@opentelemetry/semantic-conventions": "0.24.0" } + }, + "@opentelemetry/semantic-conventions": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", + "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==" } } }, - "@opentelemetry/semantic-conventions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", - "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" - }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -16494,6 +16151,24 @@ "shimmer": "^1.2.1" }, "dependencies": { + "@opentelemetry/api": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", + "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", + "requires": { + "@opentelemetry/context-base": "^0.12.0" + } + }, + "@opentelemetry/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", + "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", + "requires": { + "@opentelemetry/api": "^0.12.0", + "@opentelemetry/context-base": "^0.12.0", + "semver": "^7.1.3" + } + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", diff --git a/package.json b/package.json index 7a3de3d6..d894af41 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,16 @@ }, "dependencies": { "@entropic/bole": "^4.0.1", + "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/auto-instrumentations-node": "^0.27.1", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/node": "^0.24.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", @@ -21,7 +30,6 @@ "culture-ships": "^1.0.0", "dotenv": "^8.2.0", "find-my-way": "^4.1.0", - "@grpc/grpc-js": "^1.5.0", "handy-redis": "^2.2.1", "honeycomb-beeline": "^2.1.1", "jsonwebtoken": "^8.5.1", @@ -34,11 +42,6 @@ "oauth": "^0.9.15", "oblique-strategies": "^1.0.1", "on-headers": "^1.0.2", - "@opentelemetry/auto-instrumentations-node": "^0.27.1", - "@opentelemetry/exporter-collector-grpc": "^0.25.0", - "@opentelemetry/resources": "^1.0.1", - "@opentelemetry/sdk-node": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.1", "pg": "^8.3.3", "redis": "^3.0.2", "uuid": "^8.3.0" diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index e9d2440c..2c037ea3 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -1,12 +1,6 @@ void `{% if selftest %}`; import bole from '@entropic/bole' import isDev from 'are-we-dev' -import { CollectorTraceExporter } from '@opentelemetry/exporter-collector-grpc' -import { Metadata, credentials } from '@grpc/grpc-js' -import { NodeSDK } from '@opentelemetry/sdk-node' -import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' -import { Resource } from '@opentelemetry/resources' -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' import { serviceName, initOtelSDK } from '../core/prelude' import { Handler, MiddlewareConfig } from '../core/middleware' diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index dde6b6ba..15a2c8ee 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -30,13 +30,17 @@ function _getServiceName() { void `{% if honeycomb %}`; import beeline from 'honeycomb-beeline' -import { CollectorTraceExporter } from '@opentelemetry/exporter-collector-grpc' +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' +import { NodeTracerProvider } from '@opentelemetry/node' +import { AlwaysOnSampler, AlwaysOffSampler, ParentBasedSampler, TraceIdRatioBasedSampler } from '@opentelemetry/core' +import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base' +import { SpanProcessor } from '@opentelemetry/tracing' import { Metadata, credentials } from '@grpc/grpc-js' import { NodeSDK } from '@opentelemetry/sdk-node' import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' import { Resource } from '@opentelemetry/resources' import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' -import { context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' +import { Sampler, context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -71,17 +75,39 @@ function isOtel (env: typeof process.env): boolean { return false } -if (isOtel(process.env) && process.env.HONEYCOMB_WRITE_KEY && process.env.HONEYCOMB_DATASET) { +if (isOtel(process.env)) { const metadata = new Metadata() - metadata.set('x-honeycomb-team', process.env.HONEYCOMB_WRITE_KEY) - metadata.set('x-honeycomb-dataset', process.env.HONEYCOMB_DATASET) + metadata.set('x-honeycomb-team', process.env.HONEYCOMB_WRITE_KEY) + metadata.set('x-honeycomb-dataset', process.env.HONEYCOMB_DATASET) - const traceExporter = new CollectorTraceExporter({ + const sampleRate: number = Number(process.env.HONEYCOMB_SAMPLE_RATE || 1) + + let sampler: Sampler = new AlwaysOnSampler() + + if (sampleRate === 0) { + sampler = new AlwaysOffSampler() + } else if (sampleRate !== 1) { + sampler = new ParentBasedSampler({ + root: new TraceIdRatioBasedSampler(sampleRate) + }) + } + + const tracerProvider = new NodeTracerProvider({ sampler }) + + const traceExporter = new OTLPTraceExporter({ url: process.env.HONEYCOMB_API_HOST, credentials: credentials.createSsl(), metadata }) + // There's a bug in the types here - SimpleSpanProcessor doesn't + // take the optional Context argument in its signature and + // typescript is understandably cranky about that. + const spanProcessor: SpanProcessor = ( + new SimpleSpanProcessor(traceExporter) as unknown + ) + tracerProvider.addSpanProcessor(spanProcessor) + sdk = new NodeSDK({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: serviceName From 8ed6ac52ef75d47f53c670d2ae2edb657b444bdf Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 15:46:43 -0500 Subject: [PATCH 013/167] Switch from @opentelemetry/node to @opentelemetry/sdk-trace-node --- package-lock.json | 227 +--------------------------- package.json | 2 +- templates/boltzmann/core/prelude.ts | 5 +- 3 files changed, 4 insertions(+), 230 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa27af28..4c4c83aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,10 @@ "@opentelemetry/auto-instrumentations-node": "^0.27.1", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", - "@opentelemetry/node": "^0.24.0", "@opentelemetry/resources": "^1.0.1", "@opentelemetry/sdk-node": "^0.27.0", "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", @@ -1030,88 +1030,6 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/node": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/node/-/node-0.24.0.tgz", - "integrity": "sha512-Sy8QooZFOeVUcJIKetw5xsq15/1ivZovWg0RnKWtzURMQrcOxmQ3bGrXPORklOJxOtf5snDHgT37Y7dBgr+c+g==", - "deprecated": "Package renamed to @opentelemetry/sdk-trace-node", - "dependencies": { - "@opentelemetry/context-async-hooks": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/propagator-jaeger": "0.24.0", - "@opentelemetry/tracing": "0.24.0", - "semver": "^7.1.3" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/node/node_modules/@opentelemetry/context-async-hooks": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-0.24.0.tgz", - "integrity": "sha512-Db8AgMByBEFKLJGSUBlNq4Un/Tqzj5W0hTxx3hIic8DvBwqbvUvkMGuiQYLKE2Ay21cLYMT01xK4TEKz0OxADw==", - "engines": { - "node": ">=8.1.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/node/node_modules/@opentelemetry/core": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", - "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", - "dependencies": { - "@opentelemetry/semantic-conventions": "0.24.0", - "semver": "^7.1.3" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/node/node_modules/@opentelemetry/propagator-b3": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-0.24.0.tgz", - "integrity": "sha512-iV7KSN0LkEAkeVCbhaIJAgTEb7HCnVkprmpgkL6q79rP3vTW4dylwfBYgIwod7y0GT4Ofgomm0NrwwWiuGLbQA==", - "dependencies": { - "@opentelemetry/core": "0.24.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/node/node_modules/@opentelemetry/propagator-jaeger": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.24.0.tgz", - "integrity": "sha512-QXCxBwuSka+vXbBZdumtF7YKO84gwTyKy3GelZV5BPlgWoge0AbLR3DfsO9Beu13pmD+4PyuwMw3LfYsgG1+3g==", - "dependencies": { - "@opentelemetry/core": "0.24.0" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/node/node_modules/@opentelemetry/semantic-conventions": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", - "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@opentelemetry/propagator-b3": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", @@ -1278,62 +1196,6 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/tracing": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.24.0.tgz", - "integrity": "sha512-sTLEs1SIon3xV8vLe53PzfbU0FahoxL9NPY/CYvA1mwGbMu4zHkHAjqy1Tc8JmqRrfa+XrHkmzeSM4hrvloBaA==", - "deprecated": "Package renamed to @opentelemetry/sdk-trace-base", - "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/tracing/node_modules/@opentelemetry/core": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", - "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", - "dependencies": { - "@opentelemetry/semantic-conventions": "0.24.0", - "semver": "^7.1.3" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/tracing/node_modules/@opentelemetry/resources": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.24.0.tgz", - "integrity": "sha512-uEr2m13IRkjQAjX6fsYqJ21aONCspRvuQunaCl8LbH1NS1Gj82TuRUHF6TM82ulBPK8pU+nrrqXKuky2cMcIzw==", - "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.1" - } - }, - "node_modules/@opentelemetry/tracing/node_modules/@opentelemetry/semantic-conventions": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", - "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -13402,57 +13264,6 @@ "@types/redis": "2.8.31" } }, - "@opentelemetry/node": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/node/-/node-0.24.0.tgz", - "integrity": "sha512-Sy8QooZFOeVUcJIKetw5xsq15/1ivZovWg0RnKWtzURMQrcOxmQ3bGrXPORklOJxOtf5snDHgT37Y7dBgr+c+g==", - "requires": { - "@opentelemetry/context-async-hooks": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/propagator-jaeger": "0.24.0", - "@opentelemetry/tracing": "0.24.0", - "semver": "^7.1.3" - }, - "dependencies": { - "@opentelemetry/context-async-hooks": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-0.24.0.tgz", - "integrity": "sha512-Db8AgMByBEFKLJGSUBlNq4Un/Tqzj5W0hTxx3hIic8DvBwqbvUvkMGuiQYLKE2Ay21cLYMT01xK4TEKz0OxADw==", - "requires": {} - }, - "@opentelemetry/core": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", - "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", - "requires": { - "@opentelemetry/semantic-conventions": "0.24.0", - "semver": "^7.1.3" - } - }, - "@opentelemetry/propagator-b3": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-0.24.0.tgz", - "integrity": "sha512-iV7KSN0LkEAkeVCbhaIJAgTEb7HCnVkprmpgkL6q79rP3vTW4dylwfBYgIwod7y0GT4Ofgomm0NrwwWiuGLbQA==", - "requires": { - "@opentelemetry/core": "0.24.0" - } - }, - "@opentelemetry/propagator-jaeger": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.24.0.tgz", - "integrity": "sha512-QXCxBwuSka+vXbBZdumtF7YKO84gwTyKy3GelZV5BPlgWoge0AbLR3DfsO9Beu13pmD+4PyuwMw3LfYsgG1+3g==", - "requires": { - "@opentelemetry/core": "0.24.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", - "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==" - } - } - }, "@opentelemetry/propagator-b3": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", @@ -13561,42 +13372,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" }, - "@opentelemetry/tracing": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.24.0.tgz", - "integrity": "sha512-sTLEs1SIon3xV8vLe53PzfbU0FahoxL9NPY/CYvA1mwGbMu4zHkHAjqy1Tc8JmqRrfa+XrHkmzeSM4hrvloBaA==", - "requires": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "lodash.merge": "^4.6.2" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", - "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", - "requires": { - "@opentelemetry/semantic-conventions": "0.24.0", - "semver": "^7.1.3" - } - }, - "@opentelemetry/resources": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.24.0.tgz", - "integrity": "sha512-uEr2m13IRkjQAjX6fsYqJ21aONCspRvuQunaCl8LbH1NS1Gj82TuRUHF6TM82ulBPK8pU+nrrqXKuky2cMcIzw==", - "requires": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", - "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==" - } - } - }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", diff --git a/package.json b/package.json index d894af41..026ce347 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,10 @@ "@opentelemetry/auto-instrumentations-node": "^0.27.1", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", - "@opentelemetry/node": "^0.24.0", "@opentelemetry/resources": "^1.0.1", "@opentelemetry/sdk-node": "^0.27.0", "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 15a2c8ee..4d2eed2a 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -31,10 +31,9 @@ function _getServiceName() { void `{% if honeycomb %}`; import beeline from 'honeycomb-beeline' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' -import { NodeTracerProvider } from '@opentelemetry/node' +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' import { AlwaysOnSampler, AlwaysOffSampler, ParentBasedSampler, TraceIdRatioBasedSampler } from '@opentelemetry/core' -import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base' -import { SpanProcessor } from '@opentelemetry/tracing' +import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' import { Metadata, credentials } from '@grpc/grpc-js' import { NodeSDK } from '@opentelemetry/sdk-node' import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' From 3b06e91052d6c58d12d760bf57549a4c2b0fb9c6 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 15:46:58 -0500 Subject: [PATCH 014/167] Fix deprecation warning --- templates/boltzmann/core/utils/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/utils/index.ts b/templates/boltzmann/core/utils/index.ts index 2341c189..25cd5faa 100644 --- a/templates/boltzmann/core/utils/index.ts +++ b/templates/boltzmann/core/utils/index.ts @@ -62,7 +62,7 @@ if (require.main === module) { await _requireOr('./require-or-test', []) assert.fail('expected to fail with MODULE_NOT_FOUND') } catch (err) { - assert.equals(err.code, 'MODULE_NOT_FOUND') + assert.equal(err.code, 'MODULE_NOT_FOUND') } }) From 745ad10335583d6c84da85b32dbf2b1e4429fd35 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 18 Jan 2022 16:10:30 -0500 Subject: [PATCH 015/167] Use individual node instrumentations --- package-lock.json | 9 +++++++++ package.json | 9 +++++++++ templates/boltzmann/core/prelude.ts | 20 +++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 4c4c83aa..4f76791a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,15 @@ "@opentelemetry/auto-instrumentations-node": "^0.27.1", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-ioredis": "^0.27.0", + "@opentelemetry/instrumentation-mongodb": "^0.27.0", + "@opentelemetry/instrumentation-mysql": "^0.27.0", + "@opentelemetry/instrumentation-pg": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0", "@opentelemetry/resources": "^1.0.1", "@opentelemetry/sdk-node": "^0.27.0", "@opentelemetry/sdk-trace-base": "^1.0.1", diff --git a/package.json b/package.json index 026ce347..95cacca0 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,15 @@ "@opentelemetry/auto-instrumentations-node": "^0.27.1", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-ioredis": "^0.27.0", + "@opentelemetry/instrumentation-mongodb": "^0.27.0", + "@opentelemetry/instrumentation-mysql": "^0.27.0", + "@opentelemetry/instrumentation-pg": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0", "@opentelemetry/resources": "^1.0.1", "@opentelemetry/sdk-node": "^0.27.0", "@opentelemetry/sdk-trace-base": "^1.0.1", diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 4d2eed2a..c66046fd 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -40,6 +40,14 @@ import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentation import { Resource } from '@opentelemetry/resources' import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' import { Sampler, context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' +import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' +import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' +import { GrpcInstrumentation } from '@opentelemetry/instrumentation-grpc' +import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis' +import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis' +import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' +import { MongoDBInstrumentation } from '@opentelemetry/instrumentation-mongodb' +import { MySQLInstrumentation } from '@opentelemetry/instrumentation-mysql' if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -106,13 +114,23 @@ if (isOtel(process.env)) { new SimpleSpanProcessor(traceExporter) as unknown ) tracerProvider.addSpanProcessor(spanProcessor) + tracerProvider.register() sdk = new NodeSDK({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: serviceName }), traceExporter, - instrumentations: [getNodeAutoInstrumentations()] + instrumentations: [ + new DnsInstrumentation({}), + new HttpInstrumentation({}), + new GrpcInstrumentation({}), + new IORedisInstrumentation({}), + new RedisInstrumentation({}), + new PgInstrumentation({}), + new MongoDBInstrumentation({}), + new MySQLInstrumentation({}) + ] }) } else if (isHoneycomb(process.env)) { beeline({ From 5a5a3f7190b0fd8d7d1157b0ee04b1fe958cf0ae Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 12:22:43 -0500 Subject: [PATCH 016/167] Change default port to 8000 --- README.md | 2 +- templates/boltzmann/core/entrypoint.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1aab15ec..19364fdc 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ For example, to scaffold with the defaults: projects|⇒ npx boltzmann-cli hello ``` -A complete project is provided for you, with useful package run scripts and linting. To run: `./boltzmann.js`. And to view the response: `curl http://localhost:5000/hello/world`. Want to know more? [Check the docs!](https://www.boltzmann.dev/en/docs/latest/) +A complete project is provided for you, with useful package run scripts and linting. To run: `./boltzmann.js`. And to view the response: `curl http://localhost:8000/hello/world`. Want to know more? [Check the docs!](https://www.boltzmann.dev/en/docs/latest/) ## Team diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index 2c037ea3..6e961142 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -69,7 +69,7 @@ if (require.main === module && !process.env.TAP) { }), }) .then((server) => { - server.listen(Number(process.env.PORT) || 5000, () => { + server.listen(Number(process.env.PORT) || 8000, () => { const addrinfo = server.address() if (!addrinfo) { return From fa6b64209da9f01fdb9003a4dfe76ec6d97993d0 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 12:23:23 -0500 Subject: [PATCH 017/167] Update dependencies.ron, clean up unused dependency --- package-lock.json | 352 +--------------------------- package.json | 1 - src/dependencies.ron | 119 ++++++++++ templates/boltzmann/core/prelude.ts | 1 - 4 files changed, 121 insertions(+), 352 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f76791a..2dab27e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "@entropic/bole": "^4.0.1", "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", - "@opentelemetry/auto-instrumentations-node": "^0.27.1", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", @@ -730,28 +729,6 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.27.1.tgz", - "integrity": "sha512-FNxnl2mgqwVGSmvAFKXp886P5EpF0/MjmOo1YQTUswrLcmZJXplCaK8ejDpV4awy4VUBBX6Fd2sFoAJ+hEE6PQ==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/instrumentation-dns": "^0.27.0", - "@opentelemetry/instrumentation-express": "^0.27.0", - "@opentelemetry/instrumentation-graphql": "^0.27.1", - "@opentelemetry/instrumentation-grpc": "^0.27.0", - "@opentelemetry/instrumentation-http": "^0.27.0", - "@opentelemetry/instrumentation-ioredis": "^0.27.0", - "@opentelemetry/instrumentation-koa": "^0.28.0", - "@opentelemetry/instrumentation-mongodb": "^0.27.0", - "@opentelemetry/instrumentation-mysql": "^0.27.0", - "@opentelemetry/instrumentation-pg": "^0.27.0", - "@opentelemetry/instrumentation-redis": "^0.27.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, "node_modules/@opentelemetry/context-async-hooks": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", @@ -850,23 +827,6 @@ "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.27.0.tgz", - "integrity": "sha512-8C7jGqrhTmAP2lZNzH7SSxSClij3wlYTB7t71/wsFooV01yo/cH2Go0kDo13kPmcGhoR07iMZDabeHWwdxre6w==", - "dependencies": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/express": "4.17.13" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, "node_modules/@opentelemetry/instrumentation-graphql": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.1.tgz", @@ -938,24 +898,6 @@ "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.28.0.tgz", - "integrity": "sha512-MFBulPyKgo4TI7LyefYeCNDykIBi2nA5BqJr8RX+ZZ2BoykipBVf0AgtrCvKep9u3XbM8fgF7sNYtc2UvMoW6w==", - "dependencies": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/koa": "2.13.4", - "@types/koa__router": "8.0.7" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, "node_modules/@opentelemetry/instrumentation-mongodb": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.27.0.tgz", @@ -1298,6 +1240,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -1312,15 +1255,6 @@ "ajv": "*" } }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, "node_modules/@types/bson": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", @@ -1335,36 +1269,12 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==" - }, "node_modules/@types/cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", "dev": true }, - "node_modules/@types/cookies": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, "node_modules/@types/csrf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/csrf/-/csrf-3.1.0.tgz", @@ -1375,27 +1285,6 @@ "csrf": "*" } }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.27", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", - "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, "node_modules/@types/hapi__iron": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/hapi__iron/-/hapi__iron-6.0.1.tgz", @@ -1415,16 +1304,6 @@ "@types/node": "*" } }, - "node_modules/@types/http-assert": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", - "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==" - }, - "node_modules/@types/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" - }, "node_modules/@types/ioredis": { "version": "4.26.6", "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.26.6.tgz", @@ -1460,42 +1339,6 @@ "@types/node": "*" } }, - "node_modules/@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" - }, - "node_modules/@types/koa": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz", - "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa__router": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.7.tgz", - "integrity": "sha512-OB3Ax75nmTP+WR9AgdzA42DI7YmBtiNKN2g1Wxl+d5Dyek9SWt740t+ukwXSmv/jMBCUPyV3YEI93vZHgdP7UQ==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", - "dependencies": { - "@types/koa": "*" - } - }, "node_modules/@types/long": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", @@ -1571,16 +1414,6 @@ "@types/pg": "*" } }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, "node_modules/@types/redis": { "version": "2.8.31", "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", @@ -1589,20 +1422,6 @@ "@types/node": "*" } }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static/node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, "node_modules/@types/tap": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.0.tgz", @@ -13062,25 +12881,6 @@ "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", "peer": true }, - "@opentelemetry/auto-instrumentations-node": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.27.1.tgz", - "integrity": "sha512-FNxnl2mgqwVGSmvAFKXp886P5EpF0/MjmOo1YQTUswrLcmZJXplCaK8ejDpV4awy4VUBBX6Fd2sFoAJ+hEE6PQ==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/instrumentation-dns": "^0.27.0", - "@opentelemetry/instrumentation-express": "^0.27.0", - "@opentelemetry/instrumentation-graphql": "^0.27.1", - "@opentelemetry/instrumentation-grpc": "^0.27.0", - "@opentelemetry/instrumentation-http": "^0.27.0", - "@opentelemetry/instrumentation-ioredis": "^0.27.0", - "@opentelemetry/instrumentation-koa": "^0.28.0", - "@opentelemetry/instrumentation-mongodb": "^0.27.0", - "@opentelemetry/instrumentation-mysql": "^0.27.0", - "@opentelemetry/instrumentation-pg": "^0.27.0", - "@opentelemetry/instrumentation-redis": "^0.27.0" - } - }, "@opentelemetry/context-async-hooks": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", @@ -13151,17 +12951,6 @@ "semver": "^7.3.2" } }, - "@opentelemetry/instrumentation-express": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.27.0.tgz", - "integrity": "sha512-8C7jGqrhTmAP2lZNzH7SSxSClij3wlYTB7t71/wsFooV01yo/cH2Go0kDo13kPmcGhoR07iMZDabeHWwdxre6w==", - "requires": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/express": "4.17.13" - } - }, "@opentelemetry/instrumentation-graphql": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.1.tgz", @@ -13208,18 +12997,6 @@ "@types/ioredis": "4.26.6" } }, - "@opentelemetry/instrumentation-koa": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.28.0.tgz", - "integrity": "sha512-MFBulPyKgo4TI7LyefYeCNDykIBi2nA5BqJr8RX+ZZ2BoykipBVf0AgtrCvKep9u3XbM8fgF7sNYtc2UvMoW6w==", - "requires": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/koa": "2.13.4", - "@types/koa__router": "8.0.7" - } - }, "@opentelemetry/instrumentation-mongodb": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.27.0.tgz", @@ -13465,6 +13242,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "dev": true, "requires": { "@types/node": "*" } @@ -13478,15 +13256,6 @@ "ajv": "*" } }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, "@types/bson": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", @@ -13500,36 +13269,12 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==" - }, "@types/cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", "dev": true }, - "@types/cookies": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", - "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, "@types/csrf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/csrf/-/csrf-3.1.0.tgz", @@ -13539,27 +13284,6 @@ "csrf": "*" } }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.27", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", - "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, "@types/hapi__iron": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/hapi__iron/-/hapi__iron-6.0.1.tgz", @@ -13578,16 +13302,6 @@ "@types/node": "*" } }, - "@types/http-assert": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", - "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==" - }, - "@types/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" - }, "@types/ioredis": { "version": "4.26.6", "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.26.6.tgz", @@ -13623,42 +13337,6 @@ "@types/node": "*" } }, - "@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" - }, - "@types/koa": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz", - "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==", - "requires": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "@types/koa__router": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.7.tgz", - "integrity": "sha512-OB3Ax75nmTP+WR9AgdzA42DI7YmBtiNKN2g1Wxl+d5Dyek9SWt740t+ukwXSmv/jMBCUPyV3YEI93vZHgdP7UQ==", - "requires": { - "@types/koa": "*" - } - }, - "@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", - "requires": { - "@types/koa": "*" - } - }, "@types/long": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", @@ -13734,16 +13412,6 @@ "@types/pg": "*" } }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, "@types/redis": { "version": "2.8.31", "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", @@ -13752,22 +13420,6 @@ "@types/node": "*" } }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - }, - "dependencies": { - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - } - } - }, "@types/tap": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.0.tgz", diff --git a/package.json b/package.json index 95cacca0..f4f31919 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "@entropic/bole": "^4.0.1", "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", - "@opentelemetry/auto-instrumentations-node": "^0.27.1", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", diff --git a/src/dependencies.ron b/src/dependencies.ron index 92119306..02769341 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -20,6 +20,125 @@ preconditions: None ), + DependencySpec( + name: "@grpc/grpc-js", + version: "^1.5.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/core", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/exporter-trace-otlp-grpc", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-dns", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-graphql", + version: "^0.27.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-grpc", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-http", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-ioredis", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-mongodb", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-mysql", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-pg", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-redis", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/resources", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/sdk-node", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/sdk-trace-base", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/sdk-trace-node", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/semantic-conventions", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + DependencySpec( name: "@hapi/iron", version: "^6.0.0", diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index c66046fd..86e3085a 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -36,7 +36,6 @@ import { AlwaysOnSampler, AlwaysOffSampler, ParentBasedSampler, TraceIdRatioBase import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' import { Metadata, credentials } from '@grpc/grpc-js' import { NodeSDK } from '@opentelemetry/sdk-node' -import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' import { Resource } from '@opentelemetry/resources' import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' import { Sampler, context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' From 8a0ef1e3ac0e3c3f1913373782815713da5aef15 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 12:39:25 -0500 Subject: [PATCH 018/167] Add @opentelemetry/api dependency --- package-lock.json | 5 ++--- package.json | 1 + src/dependencies.ron | 21 ++++++++++++++------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2dab27e0..d04425ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@entropic/bole": "^4.0.1", "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", @@ -724,7 +725,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -12878,8 +12878,7 @@ "@opentelemetry/api": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", - "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", - "peer": true + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" }, "@opentelemetry/context-async-hooks": { "version": "1.0.1", diff --git a/package.json b/package.json index f4f31919..05bdfa16 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@entropic/bole": "^4.0.1", "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", diff --git a/src/dependencies.ron b/src/dependencies.ron index 02769341..0cc746f3 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -27,6 +27,20 @@ preconditions: Some(When(all_of: ["honeycomb"])) ), + DependencySpec( + name: "@hapi/iron", + version: "^6.0.0", + kind: Normal, + preconditions: None + ), + + DependencySpec( + name: "@opentelemetry/api", + version: "^1.0.4", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + DependencySpec( name: "@opentelemetry/core", version: "^1.0.1", @@ -139,13 +153,6 @@ preconditions: Some(When(all_of: ["honeycomb"])) ), - DependencySpec( - name: "@hapi/iron", - version: "^6.0.0", - kind: Normal, - preconditions: None - ), - DependencySpec( name: "@types/hapi__iron", version: "^6.0.1", From 730e46c1afaf6e6719335b0a8f07d98634703fdf Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 14:40:06 -0500 Subject: [PATCH 019/167] set up W3CTraceContextPropagator --- templates/boltzmann/core/prelude.ts | 69 +++++++++--- templates/boltzmann/middleware/honeycomb.ts | 115 ++++++++++++++------ 2 files changed, 140 insertions(+), 44 deletions(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 86e3085a..6353e8e2 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -30,15 +30,25 @@ function _getServiceName() { void `{% if honeycomb %}`; import beeline from 'honeycomb-beeline' -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import { AlwaysOnSampler, AlwaysOffSampler, ParentBasedSampler, TraceIdRatioBasedSampler } from '@opentelemetry/core' -import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' import { Metadata, credentials } from '@grpc/grpc-js' -import { NodeSDK } from '@opentelemetry/sdk-node' -import { Resource } from '@opentelemetry/resources' -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' -import { Sampler, context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' +import { + context as otelContext, + defaultTextMapGetter, + defaultTextMapSetter, + propagation as otelPropagation, + ROOT_CONTEXT, + Sampler, + trace as otelTrace, + Tracer as OtelTracer +} from '@opentelemetry/api' +import { + AlwaysOffSampler, + AlwaysOnSampler, + ParentBasedSampler, + TraceIdRatioBasedSampler, + W3CTraceContextPropagator +} from '@opentelemetry/core' +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' import { GrpcInstrumentation } from '@opentelemetry/instrumentation-grpc' @@ -47,6 +57,11 @@ import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis' import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' import { MongoDBInstrumentation } from '@opentelemetry/instrumentation-mongodb' import { MySQLInstrumentation } from '@opentelemetry/instrumentation-mysql' +import { Resource } from '@opentelemetry/resources' +import { NodeSDK } from '@opentelemetry/sdk-node' +import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' +import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -303,7 +318,39 @@ export { redis } void `{% endif %}`; void `{% if honeycomb %}`; -export { onHeaders, initOtelSDK } +export { + AlwaysOffSampler, + AlwaysOnSampler, + defaultTextMapGetter, + defaultTextMapSetter, + DnsInstrumentation, + GrpcInstrumentation, + HttpInstrumentation, + initOtelSDK, + IORedisInstrumentation, + MongoDBInstrumentation, + MySQLInstrumentation, + NodeSDK, + NodeTracerProvider, + onHeaders, + otelContext, + otelPropagation, + otelTrace, + OtelTracer, + OTLPTraceExporter, + ParentBasedSampler, + PgInstrumentation, + RedisInstrumentation, + Resource, + ROOT_CONTEXT, + Sampler, + SemanticAttributes, + SemanticResourceAttributes, + SimpleSpanProcessor, + SpanProcessor, + TraceIdRatioBasedSampler, + W3CTraceContextPropagator +} void `{% endif %}`; void `{% if jwt or oauth %}`; @@ -368,9 +415,5 @@ export { beeline, isHoneycomb, isOtel, - otelContext, - otelPropagation, - otelTrace, - OtelTracer, } void `{% endif %}` diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index bec4d746..621ff15c 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,7 +1,14 @@ void `{% if selftest %}`; export { trace, honeycombMiddlewareSpans } - -import { context as otelContext, propagation as otelPropagation, trace as otelTrace, Tracer as OtelTracer} from '@opentelemetry/api' +import { + context as otelContext, + defaultTextMapGetter, + defaultTextMapSetter, + ROOT_CONTEXT, + trace as otelTrace, + Tracer as OtelTracer +} from '@opentelemetry/api' +import { W3CTraceContextPropagator } from '@opentelemetry/core' import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' import { isHoneycomb, isOtel } from '../core/prelude' import { Handler } from '../core/middleware' @@ -14,6 +21,11 @@ void `{% endif %}`; let otelTracer: OtelTracer | null = null; +const OTEL_NAMESPACE = 'boltzmann' +const OTEL_REQ_NAMESPACE = `${OTEL_NAMESPACE}.request` +const OTEL_REQ_QUERY = `${OTEL_REQ_NAMESPACE}.query` +const OTEL_REQ_PARAM_NAMESPACE = `${OTEL_REQ_NAMESPACE}.param` + function getOtelTracer() { if (!otelTracer) { otelTracer = otelTrace.getTracer('boltzmann', '1.0.0') @@ -30,18 +42,12 @@ function trace ({ if (isOtel(process.env)) { return function honeycombOtelTrace (next: Handler) { - return (context: Context) => { - let activeContext = otelContext.active() + return async (context: Context) => { const tracer = getOtelTracer() + let carrier = {} - if (context.headers.traceparent && context.headers.tracestate) { - activeContext = otelPropagation.extract(activeContext, { - traceparent: context.headers.traceparent, - tracestate: context.headers.tracestate - }) - } - - const rootSpan = tracer.startSpan(`${context.method} ${context.url.pathname}${context.url.search}`, { + // Start a parent span + const parentSpan = tracer.startSpan(`${context.method} ${context.url.pathname}${context.url.search}`, { attributes: { [SemanticAttributes.HTTP_HOST]: context.host, [SemanticAttributes.HTTP_URL]: context.url.href, @@ -49,29 +55,77 @@ function trace ({ [SemanticAttributes.HTTP_METHOD]: context.method, [SemanticAttributes.HTTP_SCHEME]: context.url.protocol, [SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - 'boltzmann.request.query': context.url.search + [OTEL_REQ_QUERY]: context.url.search } - }, activeContext) - - otelTrace.setSpan(activeContext, rootSpan) - - // do not do as I do, - onHeaders(context._response, function () { - const handler: Handler = context.handler - - rootSpan.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, String(context._response.statusCode)) - rootSpan.setAttribute(SemanticAttributes.HTTP_ROUTE, handler.route) - rootSpan.setAttribute(SemanticAttributes.HTTP_METHOD, handler.method) - rootSpan.setAttribute(SemanticResourceAttributes.SERVICE_VERSION, handler.version) + }) - Object.entries(context.params).map(([key, value]) => { - rootSpan.setAttribute(`boltzmann.request.param.${key}`, value) + // this propagator takes care of extracting trace parent + // and state from request headers (and so on) + const propagator = new W3CTraceContextPropagator() + + propagator.inject( + otelTrace.setSpanContext( + ROOT_CONTEXT, + parentSpan.spanContext() + ), + carrier, + defaultTextMapSetter + ) + + // create a parent active context + const parentContext = propagator.extract( + ROOT_CONTEXT, + carrier, + defaultTextMapGetter + ) + + // set the active context + otelContext.with(parentContext, () => { + // keep the context active until we close the span + return new Promise((resolve, reject) => { + // do not do as I do, + onHeaders(context._response, function () { + // do our dangest to capture/handle surprise errors + try { + const handler: Handler = context.handler + + parentSpan.setAttribute( + SemanticAttributes.HTTP_STATUS_CODE, + String(context._response.statusCode) + ) + parentSpan.setAttribute( + SemanticAttributes.HTTP_ROUTE, + handler.route + ) + parentSpan.setAttribute( + SemanticAttributes.HTTP_METHOD, + handler.method + ) + parentSpan.setAttribute( + SemanticResourceAttributes.SERVICE_VERSION, + handler.version + ) + + Object.entries(context.params).map(([key, value]) => { + parentSpan.setAttribute( + `${OTEL_REQ_PARAM_NAMESPACE}.${key}`, + value + ) + }) + parentSpan.end() + } catch (err) { + // we don't want to crash the route just because + // otel didn't work... + console.warn(err) + return + } + // *now* we can exit the context + resolve(null) + }) }) - - rootSpan.end() }) - return next(context) + next(context) } } } else { @@ -129,7 +183,6 @@ function trace ({ beeline.finishTrace(trace) }) - // do not do as I do, onHeaders(context._response, function () { return boundFinisher(this, tracker.getTracked()) }) From eb557865aceafb2b595a40d6f330e26acc3f758e Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 17:06:18 -0500 Subject: [PATCH 020/167] Pretest hook to check typescript types --- bin/checkts.sh | 29 +++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 30 insertions(+) create mode 100755 bin/checkts.sh diff --git a/bin/checkts.sh b/bin/checkts.sh new file mode 100755 index 00000000..c1ced6c9 --- /dev/null +++ b/bin/checkts.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -e + +function get_platform() { + if [ "$OSTYPE" == "linux-gnu" ]; then + echo linux + elif [[ "$OSTYPE" == "darwin"* ]]; then + echo darwin + elif [ "$OSTYPE" == "cygwin" ]; then + echo windows + elif [ "$OSTYPE" == "msys" ]; then + echo windows + elif [ "$OSTYPE" == "win32" ]; then + echo windows + else + echo "Cannot detect OS" >&2 + exit 1 + fi +} +plat=$(get_platform) + +if [ ! -e node_modules ]; then + npm ci +else + npm i +fi + +node_modules/.bin/tsc --noEmit --project ./tsconfig-build-js.json diff --git a/package.json b/package.json index 05bdfa16..f5098e32 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "typescript": "^4.2.3" }, "scripts": { + "pretest": "bash ./bin/checkts.sh", "test": "cross-env TS_NODE_FILES=true TS_NODE_PROJECT=./tsconfig.json c8 tap --ts --no-cov templates/boltzmann/", "prejstest": "bash ./bin/buildjs.sh", "jstest": "c8 tap --no-cov templates/boltzmann-js", From 1f608a430b5519ff4644e63f3c929e8e1e9b8178 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 17:11:31 -0500 Subject: [PATCH 021/167] Simplify ts check script --- bin/checkts.sh | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/bin/checkts.sh b/bin/checkts.sh index c1ced6c9..0ee556c3 100755 --- a/bin/checkts.sh +++ b/bin/checkts.sh @@ -2,24 +2,6 @@ set -e -function get_platform() { - if [ "$OSTYPE" == "linux-gnu" ]; then - echo linux - elif [[ "$OSTYPE" == "darwin"* ]]; then - echo darwin - elif [ "$OSTYPE" == "cygwin" ]; then - echo windows - elif [ "$OSTYPE" == "msys" ]; then - echo windows - elif [ "$OSTYPE" == "win32" ]; then - echo windows - else - echo "Cannot detect OS" >&2 - exit 1 - fi -} -plat=$(get_platform) - if [ ! -e node_modules ]; then npm ci else From 608c8358dee3decc06c902d9a143797bf88125c9 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 17:12:47 -0500 Subject: [PATCH 022/167] Break otel functionality into unit-test-able functions --- templates/boltzmann/core/entrypoint.ts | 11 +- templates/boltzmann/core/prelude.ts | 145 +++++++++++++++++-------- 2 files changed, 102 insertions(+), 54 deletions(-) diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index 6e961142..9751b802 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -2,8 +2,8 @@ void `{% if selftest %}`; import bole from '@entropic/bole' import isDev from 'are-we-dev' -import { serviceName, initOtelSDK } from '../core/prelude' -import { Handler, MiddlewareConfig } from '../core/middleware' +import { startOtelSdk } from '../core/prelude' +import { MiddlewareConfig } from '../core/middleware' import { _processMiddleware, _requireOr } from '../core/utils' import { attachPostgres } from '../middleware/postgres' import { livereload } from '../middleware/livereload' @@ -12,18 +12,13 @@ import { attachRedis } from '../middleware/redis' import { handlePing } from '../middleware/ping' import { trace } from '../middleware/honeycomb' import { runserver } from '../bin/runserver' -import { Context } from '../data/context' import { log } from '../middleware/log' void `{% endif %}`; /* c8 ignore next */ if (require.main === module && !process.env.TAP) { - function passthrough() { - return (next: Handler) => (context: Context) => next(context) - } - // {% if honeycomb %} - initOtelSDK().then(run) + startOtelSdk().then(run) function run() { // {% endif %} diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 6353e8e2..a4b71bdd 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -28,6 +28,8 @@ function _getServiceName() { } } +import assert from 'assert' + void `{% if honeycomb %}`; import beeline from 'honeycomb-beeline' import { Metadata, credentials } from '@grpc/grpc-js' @@ -39,7 +41,7 @@ import { ROOT_CONTEXT, Sampler, trace as otelTrace, - Tracer as OtelTracer + Tracer as OtelTracer, } from '@opentelemetry/api' import { AlwaysOffSampler, @@ -83,8 +85,6 @@ if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET } -let sdk: NodeSDK | null = null - function isHoneycomb (env: typeof process.env): boolean { return !!env.HONEYCOMB_WRITEKEY } @@ -96,13 +96,26 @@ function isOtel (env: typeof process.env): boolean { return false } -if (isOtel(process.env)) { +function getHoneycombSampleRate (env: typeof process.env): number { + return Number(env.HONEYCOMB_SAMPLE_RATE || 1) +} + +function getOtelApiHost (env: typeof process.env): string { + assert(typeof env.HONEYCOMB_API_HOST === 'string') + return env.HONEYCOMB_API_HOST as string +} + +function createOtelMetadata (env: typeof process.env): Metadata { const metadata = new Metadata() - metadata.set('x-honeycomb-team', process.env.HONEYCOMB_WRITE_KEY) - metadata.set('x-honeycomb-dataset', process.env.HONEYCOMB_DATASET) - const sampleRate: number = Number(process.env.HONEYCOMB_SAMPLE_RATE || 1) + assert(typeof env.HONEYCOMB_WRITE_KEY === 'string' && typeof env.HONEYCOMB_DATASET === 'string') + metadata.set('x-honeycomb-team', env.HONEYCOMB_WRITE_KEY) + metadata.set('x-honeycomb-dataset', env.HONEYCOMB_DATASET) + return metadata +} + +function createOtelSampler (sampleRate: number): Sampler { let sampler: Sampler = new AlwaysOnSampler() if (sampleRate === 0) { @@ -113,24 +126,38 @@ if (isOtel(process.env)) { }) } - const tracerProvider = new NodeTracerProvider({ sampler }) + return sampler +} - const traceExporter = new OTLPTraceExporter({ - url: process.env.HONEYCOMB_API_HOST, +function createOtelTracerProvider (sampler: Sampler): NodeTracerProvider { + return new NodeTracerProvider({ sampler }) +} + +function createOtelTraceExporter (url: string, metadata: Metadata): OTLPTraceExporter { + return new OTLPTraceExporter({ + url, credentials: credentials.createSsl(), metadata }) +} +function registerOtelSpanProcessorWithProvider (processor: SpanProcessor, provider: NodeTracerProvider): void { + provider.addSpanProcessor(processor) + // TODO: do I need this? + // provider.register() +} + +function createOtelSpanProcessor (traceExporter: OTLPTraceExporter): SpanProcessor { // There's a bug in the types here - SimpleSpanProcessor doesn't // take the optional Context argument in its signature and // typescript is understandably cranky about that. - const spanProcessor: SpanProcessor = ( - new SimpleSpanProcessor(traceExporter) as unknown - ) - tracerProvider.addSpanProcessor(spanProcessor) - tracerProvider.register() + return (new SimpleSpanProcessor(traceExporter) as unknown) +} - sdk = new NodeSDK({ +let otelSdk: NodeSDK | null = null + +function initOtelSdk (serviceName: string, traceExporter: OTLPTraceExporter): void { + otelSdk = new NodeSDK({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: serviceName }), @@ -146,44 +173,71 @@ if (isOtel(process.env)) { new MySQLInstrumentation({}) ] }) -} else if (isHoneycomb(process.env)) { - beeline({ - writeKey: process.env.HONEYCOMB_WRITEKEY, - dataset: process.env.HONEYCOMB_DATASET, - sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, - serviceName, - }) } -function initOtelSDK(): Promise { - if (sdk) { - let exitCode = 0 - process.once('SIGTERM', shutdown) - process.once('beforeExit', shutdown) - process.once('uncaughtException', die) - process.once('unhandledRejection', die) - return sdk.start() +function initOtel (): void { + const url: string = getOtelApiHost(process.env) + const sampleRate: number = getHoneycombSampleRate(process.env) + const metadata: Metadata = createOtelMetadata(process.env) - async function die(err: Error) { - console.error(err.stack) - exitCode = 1 - await shutdown() - } + const sampler: Sampler = createOtelSampler(sampleRate) + const provider: NodeTracerProvider = createOtelTracerProvider(sampler) + + const exporter = createOtelTraceExporter(url, metadata) + + const processor = createOtelSpanProcessor(exporter) + + registerOtelSpanProcessorWithProvider(processor, provider) - async function shutdown() { - if (sdk) { - try { - await sdk.shutdown() - } catch (err) { - console.error(err.stack) - } + initOtelSdk(serviceName, exporter) +} + +function startOtelSdk(): Promise { + let exitCode = 0 + + async function die(err: Error) { + console.error(err.stack) + exitCode = 1 + await shutdown() + } + + async function shutdown() { + if (otelSdk) { + try { + await otelSdk.shutdown() + } catch (err) { + console.error(err.stack) } - process.exit(exitCode) } + process.exit(exitCode) + } + + if (otelSdk) { + process.once('SIGTERM', shutdown) + process.once('beforeExit', shutdown) + process.once('uncaughtException', die) + process.once('unhandledRejection', die) + return otelSdk.start() } + return Promise.resolve() } +function initBeeline () { + beeline({ + writeKey: process.env.HONEYCOMB_WRITEKEY, + dataset: process.env.HONEYCOMB_DATASET, + sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, + serviceName, + }) +} + +if (isOtel(process.env)) { + initOtel() +} else if (isHoneycomb(process.env)) { + initBeeline() +} + import onHeaders from 'on-headers' void `{% endif %}`; @@ -199,7 +253,6 @@ import { seal, unseal, defaults as ironDefaults } from '@hapi/iron' import { Accepts } from 'accepts' import { RouteOptions, Handler as FMWHandler, HTTPVersion, HTTPMethod } from 'find-my-way' import Ajv from 'ajv' -import assert from 'assert' import * as cookie from 'cookie' void `{% if redis %}`; import { WrappedNodeRedisClient } from 'handy-redis' @@ -326,7 +379,7 @@ export { DnsInstrumentation, GrpcInstrumentation, HttpInstrumentation, - initOtelSDK, + startOtelSdk, IORedisInstrumentation, MongoDBInstrumentation, MySQLInstrumentation, From e8df3c3ed327862cf6bd8cfda48373e2fedcc9d0 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 17:48:06 -0500 Subject: [PATCH 023/167] TODOs for instrumentation modules --- templates/boltzmann/core/prelude.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index a4b71bdd..3555b196 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -51,6 +51,15 @@ import { W3CTraceContextPropagator } from '@opentelemetry/core' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' +import { Resource } from '@opentelemetry/resources' +import { NodeSDK } from '@opentelemetry/sdk-node' +import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' +import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' + +// OpenTelementry instrumentation hooks +// TODO: find or write instrumentation for undici +// TODO: how configurable should this be? import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' import { GrpcInstrumentation } from '@opentelemetry/instrumentation-grpc' From 00c77922e02dc91316caa1cdf4cb2111cd0b9e94 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 17:48:38 -0500 Subject: [PATCH 024/167] Wrap honeycomb env var normalization in a function --- templates/boltzmann/core/prelude.ts | 38 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 3555b196..9d9d4e94 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -68,30 +68,27 @@ import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis' import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' import { MongoDBInstrumentation } from '@opentelemetry/instrumentation-mongodb' import { MySQLInstrumentation } from '@opentelemetry/instrumentation-mysql' -import { Resource } from '@opentelemetry/resources' -import { NodeSDK } from '@opentelemetry/sdk-node' -import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' -if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { - process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET -} +function normalizeHoneycombEnvVars (env: typeof process.env): void { + if (!env.HONEYCOMB_DATASET && env.HONEYCOMBIO_DATASET) { + env.HONEYCOMB_DATASET = env.HONEYCOMBIO_DATASET + } -if (!process.env.HONEYCOMB_WRITEKEY && process.env.HONEYCOMBIO_WRITEKEY) { - process.env.HONEYCOMB_WRITEKEY = process.env.HONEYCOMBIO_WRITEKEY -} + if (!env.HONEYCOMB_WRITEKEY && env.HONEYCOMBIO_WRITEKEY) { + env.HONEYCOMB_WRITEKEY = process.env.HONEYCOMBIO_WRITEKEY + } -if (!process.env.HONEYCOMB_SAMPLE_RATE && process.env.HONEYCOMBIO_SAMPLE_RATE) { - process.env.HONEYCOMB_SAMPLE_RATE = process.env.HONEYCOMBIO_SAMPLE_RATE -} + if (!env.HONEYCOMB_SAMPLE_RATE && env.HONEYCOMBIO_SAMPLE_RATE) { + env.HONEYCOMB_SAMPLE_RATE = env.HONEYCOMBIO_SAMPLE_RATE + } -if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { - process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM -} + if (!env.HONEYCOMB_TEAM && env.HONEYCOMBIO_TEAM) { + env.HONEYCOMB_TEAM = env.HONEYCOMBIO_TEAM + } -if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { - process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET + if (!env.HONEYCOMB_DATASET && env.HONEYCOMBIO_DATASET) { + env.HONEYCOMB_DATASET = env.HONEYCOMBIO_DATASET + } } function isHoneycomb (env: typeof process.env): boolean { @@ -241,6 +238,9 @@ function initBeeline () { }) } +// launch salvos +normalizeHoneycombEnvVars(process.env) + if (isOtel(process.env)) { initOtel() } else if (isHoneycomb(process.env)) { From d3769c29a94d9dda4dae97bf6d5b1f5bcb7d1194 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 18:12:01 -0500 Subject: [PATCH 025/167] Clean up tap setup in prelude --- templates/boltzmann/core/prelude.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 9d9d4e94..7f86a9e1 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -302,12 +302,6 @@ import { Readable } from 'stream' import type { RequestOptions as ShotRequestOptions, Listener, ResponseObject } from '@hapi/shot' -// void `{% if selftest %}` -import tap from 'tap' -// void `{% else %}` -// import type tap from 'tap' -// void `{% endif %}` - import querystring from 'querystring' import { promisify } from 'util' import isDev from 'are-we-dev' @@ -340,6 +334,7 @@ type HttpMetadata = ( ) void `{% if selftest %}`; +import tap from 'tap' import { Test } from '../middleware/test' /* c8 ignore next */ From 108e65c1b95b107c563df76c043267f9f2423eee Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 19 Jan 2022 18:40:18 -0500 Subject: [PATCH 026/167] Remove a bunch of crufty instrumentations and respect postgres + redis feature flags --- package-lock.json | 313 +--------------------------- package.json | 6 +- src/dependencies.ron | 32 +-- templates/boltzmann/core/prelude.ts | 70 +++++-- 4 files changed, 58 insertions(+), 363 deletions(-) diff --git a/package-lock.json b/package-lock.json index d04425ff..091f6fc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,13 +15,9 @@ "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", - "@opentelemetry/instrumentation-graphql": "^0.27.1", - "@opentelemetry/instrumentation-grpc": "^0.27.0", "@opentelemetry/instrumentation-http": "^0.27.0", - "@opentelemetry/instrumentation-ioredis": "^0.27.0", - "@opentelemetry/instrumentation-mongodb": "^0.27.0", - "@opentelemetry/instrumentation-mysql": "^0.27.0", "@opentelemetry/instrumentation-pg": "^0.27.0", "@opentelemetry/instrumentation-redis": "^0.27.0", "@opentelemetry/resources": "^1.0.1", @@ -827,44 +823,6 @@ "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.1.tgz", - "integrity": "sha512-1lE5BR6rsEOcSndfzP42kJJPy747MdMXNfYeR9cMtfThHiW4QVc5IYQu7DkPZxIc5LYilRRgtSVqza+cX/fy7A==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", - "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", - "dependencies": { - "@opentelemetry/api-metrics": "0.27.0", - "@opentelemetry/instrumentation": "0.27.0", - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@opentelemetry/instrumentation-http": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", @@ -882,54 +840,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.27.0.tgz", - "integrity": "sha512-1k2TMB38eppJJXK2Fch/e3KG7BDkfa5bPjhxBhXqb/jrMj0I9h0gkX2UmxRjVQd7wIFHTffAFA9hVJAw1Nd8UQ==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/ioredis": "4.26.6" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.27.0.tgz", - "integrity": "sha512-Ae9bNTHg+rt7kx3o4j0sizXZVx4S82yIahsmZ2cDqV3BE2RV8+My/+CUx4jCbSa0c8VGyK4Loyyn6IINVs3Yxg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/mongodb": "3.6.20" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.27.0.tgz", - "integrity": "sha512-MfGj73/2cxbwQ/rmBkYOMwwRvznPgifMMI0cb5JEmHzs2C7enXBpGJbFMZiAJM7rRmekkok/nuyvbWBERau+TA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/mysql": "2.15.19" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, "node_modules/@opentelemetry/instrumentation-pg": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", @@ -1255,15 +1165,6 @@ "ajv": "*" } }, - "node_modules/@types/bson": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", - "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", - "deprecated": "This is a stub types definition. bson provides its own type definitions, so you do not need this installed.", - "dependencies": { - "bson": "*" - } - }, "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1304,14 +1205,6 @@ "@types/node": "*" } }, - "node_modules/@types/ioredis": { - "version": "4.26.6", - "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.26.6.tgz", - "integrity": "sha512-Q9ydXL/5Mot751i7WLCm9OGTj5jlW3XBdkdEW21SkXZ8Y03srbkluFGbM3q8c+vzPW30JOLJ+NsZWHoly0+13A==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/is-windows": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", @@ -1350,23 +1243,6 @@ "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", "dev": true }, - "node_modules/@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "node_modules/@types/mysql": { - "version": "2.15.19", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.19.tgz", - "integrity": "sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "17.0.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", @@ -2046,25 +1922,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -2252,40 +2109,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/bson": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", - "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -4446,25 +4269,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -12950,31 +12754,6 @@ "semver": "^7.3.2" } }, - "@opentelemetry/instrumentation-graphql": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.1.tgz", - "integrity": "sha512-1lE5BR6rsEOcSndfzP42kJJPy747MdMXNfYeR9cMtfThHiW4QVc5IYQu7DkPZxIc5LYilRRgtSVqza+cX/fy7A==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0" - } - }, - "@opentelemetry/instrumentation-grpc": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", - "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", - "requires": { - "@opentelemetry/api-metrics": "0.27.0", - "@opentelemetry/instrumentation": "0.27.0", - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "dependencies": { - "@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" - } - } - }, "@opentelemetry/instrumentation-http": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", @@ -12986,36 +12765,6 @@ "semver": "^7.3.5" } }, - "@opentelemetry/instrumentation-ioredis": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.27.0.tgz", - "integrity": "sha512-1k2TMB38eppJJXK2Fch/e3KG7BDkfa5bPjhxBhXqb/jrMj0I9h0gkX2UmxRjVQd7wIFHTffAFA9hVJAw1Nd8UQ==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/ioredis": "4.26.6" - } - }, - "@opentelemetry/instrumentation-mongodb": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.27.0.tgz", - "integrity": "sha512-Ae9bNTHg+rt7kx3o4j0sizXZVx4S82yIahsmZ2cDqV3BE2RV8+My/+CUx4jCbSa0c8VGyK4Loyyn6IINVs3Yxg==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/mongodb": "3.6.20" - } - }, - "@opentelemetry/instrumentation-mysql": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.27.0.tgz", - "integrity": "sha512-MfGj73/2cxbwQ/rmBkYOMwwRvznPgifMMI0cb5JEmHzs2C7enXBpGJbFMZiAJM7rRmekkok/nuyvbWBERau+TA==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/mysql": "2.15.19" - } - }, "@opentelemetry/instrumentation-pg": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", @@ -13255,14 +13004,6 @@ "ajv": "*" } }, - "@types/bson": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", - "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", - "requires": { - "bson": "*" - } - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -13301,14 +13042,6 @@ "@types/node": "*" } }, - "@types/ioredis": { - "version": "4.26.6", - "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.26.6.tgz", - "integrity": "sha512-Q9ydXL/5Mot751i7WLCm9OGTj5jlW3XBdkdEW21SkXZ8Y03srbkluFGbM3q8c+vzPW30JOLJ+NsZWHoly0+13A==", - "requires": { - "@types/node": "*" - } - }, "@types/is-windows": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", @@ -13347,23 +13080,6 @@ "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", "dev": true }, - "@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "@types/mysql": { - "version": "2.15.19", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.19.tgz", - "integrity": "sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ==", - "requires": { - "@types/node": "*" - } - }, "@types/node": { "version": "17.0.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", @@ -13880,11 +13596,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -14019,23 +13730,6 @@ "node-releases": "^1.1.71" } }, - "bson": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", - "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -15676,11 +15370,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", diff --git a/package.json b/package.json index f5098e32..756cfdef 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,9 @@ "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", - "@opentelemetry/instrumentation-graphql": "^0.27.1", - "@opentelemetry/instrumentation-grpc": "^0.27.0", "@opentelemetry/instrumentation-http": "^0.27.0", - "@opentelemetry/instrumentation-ioredis": "^0.27.0", - "@opentelemetry/instrumentation-mongodb": "^0.27.0", - "@opentelemetry/instrumentation-mysql": "^0.27.0", "@opentelemetry/instrumentation-pg": "^0.27.0", "@opentelemetry/instrumentation-redis": "^0.27.0", "@opentelemetry/resources": "^1.0.1", diff --git a/src/dependencies.ron b/src/dependencies.ron index 0cc746f3..bf38ddfb 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -56,49 +56,35 @@ ), DependencySpec( - name: "@opentelemetry/instrumentation-dns", + name: "@opentelemetry/instrumentation", version: "^0.27.0", kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) + preconditions: Some(When(all_of: ["honeycomb"]))) ), DependencySpec( - name: "@opentelemetry/instrumentation-graphql", - version: "^0.27.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-grpc", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-http", + name: "@opentelemetry/instrumentation-dns", version: "^0.27.0", kind: Normal, preconditions: Some(When(all_of: ["honeycomb"])) ), DependencySpec( - name: "@opentelemetry/instrumentation-ioredis", - version: "^0.27.0", + name: "@opentelemetry/instrumentation-graphql", + version: "^0.27.1", kind: Normal, preconditions: Some(When(all_of: ["honeycomb"])) ), DependencySpec( - name: "@opentelemetry/instrumentation-mongodb", + name: "@opentelemetry/instrumentation-grpc", version: "^0.27.0", kind: Normal, preconditions: Some(When(all_of: ["honeycomb"])) ), DependencySpec( - name: "@opentelemetry/instrumentation-mysql", + name: "@opentelemetry/instrumentation-http", version: "^0.27.0", kind: Normal, preconditions: Some(When(all_of: ["honeycomb"])) @@ -108,14 +94,14 @@ name: "@opentelemetry/instrumentation-pg", version: "^0.27.0", kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) + preconditions: Some(When(all_of: ["honeycomb", "postgres"])) ), DependencySpec( name: "@opentelemetry/instrumentation-redis", version: "^0.27.0", kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) + preconditions: Some(When(all_of: ["honeycomb", "redis"])) ), DependencySpec( diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 7f86a9e1..c8c98675 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -57,17 +57,28 @@ import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-bas import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' -// OpenTelementry instrumentation hooks -// TODO: find or write instrumentation for undici -// TODO: how configurable should this be? +// TODO: right now we install only instrumentation which +// covers node core, redis and postgres. there's both a +// question here of a) which instrumentations get loaded; and +// b) whether this should be more configurable than boltzmann's +// feature flags currently allow. +// +// some relevant instrumentations to consider: +// +// * @opentelemetry/instrumentation-grpc +// * @opentelemetry/instrumentation-graphql +// * some third-party instrumentation for undici +import { Instrumentation } from '@opentelemetry/instrumentation' import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' -import { GrpcInstrumentation } from '@opentelemetry/instrumentation-grpc' -import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis' + +void `{% if redis %}`; import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis' +void `{% endif %}` + +void `{% if postgres %}` import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' -import { MongoDBInstrumentation } from '@opentelemetry/instrumentation-mongodb' -import { MySQLInstrumentation } from '@opentelemetry/instrumentation-mysql' +void `{% endif % }` function normalizeHoneycombEnvVars (env: typeof process.env): void { if (!env.HONEYCOMB_DATASET && env.HONEYCOMBIO_DATASET) { @@ -163,21 +174,25 @@ function createOtelSpanProcessor (traceExporter: OTLPTraceExporter): SpanProcess let otelSdk: NodeSDK | null = null function initOtelSdk (serviceName: string, traceExporter: OTLPTraceExporter): void { + let instrumentations: Instrumentation[] = [ + new DnsInstrumentation({}), + new HttpInstrumentation({}), + ] + + void `{% if redis %}` + instrumentations.push(new RedisInstrumentation({})) + void `{% endif %}` + + void `{% if postgres %}` + instrumentations.push(new PgInstrumentation({})) + void `{% endif %}` + otelSdk = new NodeSDK({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: serviceName }), traceExporter, - instrumentations: [ - new DnsInstrumentation({}), - new HttpInstrumentation({}), - new GrpcInstrumentation({}), - new IORedisInstrumentation({}), - new RedisInstrumentation({}), - new PgInstrumentation({}), - new MongoDBInstrumentation({}), - new MySQLInstrumentation({}) - ] + instrumentations }) } @@ -381,12 +396,8 @@ export { defaultTextMapGetter, defaultTextMapSetter, DnsInstrumentation, - GrpcInstrumentation, HttpInstrumentation, startOtelSdk, - IORedisInstrumentation, - MongoDBInstrumentation, - MySQLInstrumentation, NodeSDK, NodeTracerProvider, onHeaders, @@ -396,8 +407,6 @@ export { OtelTracer, OTLPTraceExporter, ParentBasedSampler, - PgInstrumentation, - RedisInstrumentation, Resource, ROOT_CONTEXT, Sampler, @@ -408,6 +417,21 @@ export { TraceIdRatioBasedSampler, W3CTraceContextPropagator } + +void `{% if postgres %}` +export { + PgInstrumentation +} +void `{% endif %}`; + +void `{% if redis %}` +export { + RedisInstrumentation +} +void `{% endif %}`; + + + void `{% endif %}`; void `{% if jwt or oauth %}`; From 7d4694f4f0d788c1718d7d82279e49bfc15baa6a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 13:58:47 -0500 Subject: [PATCH 027/167] a bunch of otel unit tests --- templates/boltzmann/core/prelude.ts | 182 ++++++++++++++++++++++++++-- 1 file changed, 169 insertions(+), 13 deletions(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index c8c98675..010ef665 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -114,10 +114,12 @@ function isOtel (env: typeof process.env): boolean { } function getHoneycombSampleRate (env: typeof process.env): number { - return Number(env.HONEYCOMB_SAMPLE_RATE || 1) + const rate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) + assert(!isNaN(rate)) + return rate } -function getOtelApiHost (env: typeof process.env): string { +function getHoneycombApiHost (env: typeof process.env): string { assert(typeof env.HONEYCOMB_API_HOST === 'string') return env.HONEYCOMB_API_HOST as string } @@ -125,7 +127,10 @@ function getOtelApiHost (env: typeof process.env): string { function createOtelMetadata (env: typeof process.env): Metadata { const metadata = new Metadata() - assert(typeof env.HONEYCOMB_WRITE_KEY === 'string' && typeof env.HONEYCOMB_DATASET === 'string') + assert([ + env.HONEYCOMB_WRITE_KEY, + env.HONEYCOMB_DATASET + ].every(v => typeof v === 'string' && v.length)) metadata.set('x-honeycomb-team', env.HONEYCOMB_WRITE_KEY) metadata.set('x-honeycomb-dataset', env.HONEYCOMB_DATASET) @@ -158,12 +163,6 @@ function createOtelTraceExporter (url: string, metadata: Metadata): OTLPTraceExp }) } -function registerOtelSpanProcessorWithProvider (processor: SpanProcessor, provider: NodeTracerProvider): void { - provider.addSpanProcessor(processor) - // TODO: do I need this? - // provider.register() -} - function createOtelSpanProcessor (traceExporter: OTLPTraceExporter): SpanProcessor { // There's a bug in the types here - SimpleSpanProcessor doesn't // take the optional Context argument in its signature and @@ -171,9 +170,13 @@ function createOtelSpanProcessor (traceExporter: OTLPTraceExporter): SpanProcess return (new SimpleSpanProcessor(traceExporter) as unknown) } -let otelSdk: NodeSDK | null = null +function registerOtelSpanProcessorWithProvider (processor: SpanProcessor, provider: NodeTracerProvider): void { + provider.addSpanProcessor(processor) + // TODO: do I need this? + // provider.register() +} -function initOtelSdk (serviceName: string, traceExporter: OTLPTraceExporter): void { +function createOtelInstrumentations(): Instrumentation[] { let instrumentations: Instrumentation[] = [ new DnsInstrumentation({}), new HttpInstrumentation({}), @@ -187,6 +190,16 @@ function initOtelSdk (serviceName: string, traceExporter: OTLPTraceExporter): vo instrumentations.push(new PgInstrumentation({})) void `{% endif %}` + return instrumentations +} + +let otelSdk: NodeSDK | null = null + +function initOtelSdk ( + serviceName: string, + instrumentations: Instrumentation[], + traceExporter: OTLPTraceExporter +): void { otelSdk = new NodeSDK({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: serviceName @@ -197,7 +210,7 @@ function initOtelSdk (serviceName: string, traceExporter: OTLPTraceExporter): vo } function initOtel (): void { - const url: string = getOtelApiHost(process.env) + const url: string = getHoneycombApiHost(process.env) const sampleRate: number = getHoneycombSampleRate(process.env) const metadata: Metadata = createOtelMetadata(process.env) @@ -208,9 +221,11 @@ function initOtel (): void { const processor = createOtelSpanProcessor(exporter) + const instrumentations = createOtelInstrumentations() + registerOtelSpanProcessorWithProvider(processor, provider) - initOtelSdk(serviceName, exporter) + initOtelSdk(serviceName, instrumentations, exporter) } function startOtelSdk(): Promise { @@ -360,6 +375,7 @@ if (require.main === module) { assert.equal(isHoneycomb({}), false) assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: ''}), false) assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: 'some write key'}), true) + assert.end() }) test('isOtel detects if OpenTelemetry is enabled', async (assert: Test) => { @@ -378,6 +394,146 @@ if (require.main === module) { HONEYCOMB_WRITEKEY: '', HONEYCOMB_API_HOST: 'grpc://otel.website' }), false) + assert.end() + }) + + test('getHoneycombSampleRate parses the sample rate', (assert: Test) => { + assert.equal(getHoneycombSampleRate({}), 1) + assert.equal(getHoneycombSampleRate({ + HONEYCOMB_SAMPLE_RATE: '1' + }), 1) + assert.equal(getHoneycombSampleRate({ + HONEYCOMB_SAMPLE_RATE: '0.5' + }), 0.5) + assert.throws(() => getHoneycombSampleRate({ + HONEYCOMB_SAMPLE_RATE: 'pony' + })) + assert.end() + }) + + test('getHoneycombApiHost parses the API host', (assert: Test) => { + assert.throws(() => getHoneycombApiHost({})) + assert.equal(getHoneycombApiHost({ + HONEYCOMB_API_HOST: 'https://example.com' + }), 'https://example.com') + assert.end() + }) + + test('createOtelMetadata', (t: Test) => { + t.plan(3) + t.test('creates metadata when environment variables are defined', (assert: Test) => { + const metadata = createOtelMetadata({ + HONEYCOMB_WRITE_KEY: 'some write key', + HONEYCOMB_DATASET: 'some dataset' + }) + assert.same(metadata.get('x-honeycomb-team'), ['some write key']) + assert.same(metadata.get('x-honeycomb-dataset'), ['some dataset']) + assert.end() + }) + + t.test('throws when environment variabes are undefined', (assert: Test) => { + assert.throws(() => createOtelMetadata({})) + assert.end() + }) + + t.test('throws when environment variables are empty', (assert: Test) => { + assert.throws(() => createOtelMetadata({ + HONEYCOMB_WRITE_KEY: '', + HONEYCOMB_DATASET: '' + })) + assert.end() + }) + }) + + test('createOtelSampler', (assert: Test) => { + assert.ok(createOtelSampler(1) instanceof AlwaysOnSampler) + assert.ok(createOtelSampler(0) instanceof AlwaysOffSampler) + assert.ok(createOtelSampler(0.5) instanceof ParentBasedSampler) + assert.end() + }) + + test('createOtelTracerProvider', (assert: Test) => { + const sampler = createOtelSampler(1) + assert.ok(createOtelTracerProvider(sampler) instanceof NodeTracerProvider) + assert.end() + }) + + test('createOtelTraceExporter', (assert: Test) => { + assert.doesNotThrow(() => { + const url = 'grpc://example.com' + const metadata = createOtelMetadata({ + HONEYCOMB_WRITE_KEY: 'some write key', + HONEYCOMB_DATASET: 'some dataset' + }) + + createOtelTraceExporter(url, metadata) + }) + assert.end() + }) + + test('createOtelSpanProcessor', (assert: Test) => { + assert.doesNotThrow(() => { + const exporter = createOtelTraceExporter( + 'grpc://example.com', + createOtelMetadata({ + HONEYCOMB_WRITE_KEY: 'some write key', + HONEYCOMB_DATASET: 'some dataset' + }) + ) + + createOtelSpanProcessor(exporter) + }) + assert.end() + }) + + test('registerOtelSpanProcessorWithProvider', (assert: Test) => { + assert.doesNotThrow(() => { + const processor = createOtelSpanProcessor( + createOtelTraceExporter( + 'grpc://example.com', + createOtelMetadata({ + HONEYCOMB_WRITE_KEY: 'some write key', + HONEYCOMB_DATASET: 'some dataset' + }) + ) + ) + const provider = createOtelTracerProvider(createOtelSampler(1)) + + registerOtelSpanProcessorWithProvider( + processor, provider + ) + }) + assert.end() + }) + + test('createOtelInstrumentations', (assert: Test) => { + // expected instrumentations: dns, node core, postgres, redis + assert.equal(createOtelInstrumentations().length, 4) + assert.end() + }) + + test('initOtelSdk', (assert: Test) => { + assert.tearDown(() => { + otelSdk = null + }) + + // run the init function + assert.doesNotThrow(() => { + const exporter = createOtelTraceExporter( + 'grpc://example.com', + createOtelMetadata({ + HONEYCOMB_WRITE_KEY: 'some write key', + HONEYCOMB_DATASET: 'some dataset' + }) + ) + const instrumentations = createOtelInstrumentations() + initOtelSdk('boltzmann', instrumentations, exporter) + }) + + // ensure it actually initted the init + assert.ok(otelSdk) + + assert.end() }) } From a28ea9ea47f95929d05357d89bdf6bf7d36e2c7b Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 13:59:05 -0500 Subject: [PATCH 028/167] t.equals -> t.equal (the former is deprecated) --- templates/boltzmann/core/utils/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/utils/index.ts b/templates/boltzmann/core/utils/index.ts index 25cd5faa..cd1602d6 100644 --- a/templates/boltzmann/core/utils/index.ts +++ b/templates/boltzmann/core/utils/index.ts @@ -68,7 +68,7 @@ if (require.main === module) { test('_requireOr returns default if toplevel require fails', async (assert: Test) => { const expect = {} - assert.equals(await _requireOr('./d-n-e', expect), expect) + assert.equal(await _requireOr('./d-n-e', expect), expect) }) test('_collect takes a stream and returns a promise for a buffer of its content', async (assert: Test) => { From 8d40ccf0ff134363bbb3fd1ab6b6545aaf6d52a2 Mon Sep 17 00:00:00 2001 From: Jeffrey Lembeck Date: Mon, 28 Jun 2021 15:13:43 -0700 Subject: [PATCH 029/167] fix: Add v to version for error-produced urls The url structure is `/v${versionNumber}/`, so these errors produce 404s --- templates/boltzmann/middleware/jwt.ts | 4 ++-- templates/boltzmann/middleware/oauth.ts | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/templates/boltzmann/middleware/jwt.ts b/templates/boltzmann/middleware/jwt.ts index 5fe4f104..4b120072 100644 --- a/templates/boltzmann/middleware/jwt.ts +++ b/templates/boltzmann/middleware/jwt.ts @@ -32,7 +32,7 @@ function authenticateJWT ({ throw new Error( `To authenticate JWTs you must pass the path to a public key file in either the environment variable "AUTHENTICATION_KEY" or the publicKey config field -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#authenticatejwt +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#authenticatejwt `.trim().split('\n').join(' ')) } @@ -44,7 +44,7 @@ https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#authentica boltzmann authenticateJWT middleware cannot read public key at "${publicKey}". Is the AUTHENTICATION_KEY environment variable set correctly? Is the file readable? - https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#authenticatejwt + https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#authenticatejwt `.trim().split('\n').join(' ')) throw err }) diff --git a/templates/boltzmann/middleware/oauth.ts b/templates/boltzmann/middleware/oauth.ts index 044588b8..7b48fabc 100644 --- a/templates/boltzmann/middleware/oauth.ts +++ b/templates/boltzmann/middleware/oauth.ts @@ -44,7 +44,7 @@ function handleOAuthLogin ({ throw new Error( `You must provide a domain field to the handleOAuthLogin() middleware config or set the env var OAUTH_DOMAIN to use OAuth -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#oauth `.trim().split('\n').join(' ')) } @@ -52,7 +52,7 @@ https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth throw new Error( `You must provide a clientID field to the handleOAuthLogin() middleware config or set the env var OAUTH_CLIENT_ID to use OAuth -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#oauth `.trim().split('\n').join(' ')) } @@ -142,7 +142,7 @@ function handleOAuthCallback ({ throw new Error( `You must provide a domain field to the handleOAuthCallback() config or set the env var OAUTH_DOMAIN to use OAuth -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#oauth `.trim().split('\n').join(' ')) } @@ -150,7 +150,7 @@ https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth throw new Error( `You must provide a clientID field to the handleOAuthCallback() config or set the env var OAUTH_CLIENT_ID to use OAuth -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#oauth `.trim().split('\n').join(' ')) } @@ -158,7 +158,7 @@ https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth throw new Error( `You must provide a secret field to the handleOAuthCallback() config or set the env var OAUTH_CLIENT_SECRET to use OAuth -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#oauth `.trim().split('\n').join(' ')) } @@ -282,7 +282,7 @@ function handleOAuthLogout ({ throw new Error( `You must provide a domain to the handleOAuthLogout() middleware or set the env var OAUTH_DOMAIN to use OAuth -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#oauth `.trim().split('\n').join(' ')) } @@ -290,7 +290,7 @@ https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth throw new Error( `You must provide a clientID to the handleOAuthLogout() middleware or set the env var OAUTH_CLIENT_ID to use OAuth -https://www.boltzmann.dev/en/docs/{{ version }}/reference/middleware/#oauth +https://www.boltzmann.dev/en/docs/v{{ version }}/reference/middleware/#oauth `.trim().split('\n').join(' ')) } From 2572a08a3810a17c804d428911fe86c3bdd05619 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 14:19:29 -0500 Subject: [PATCH 030/167] whack-a-mole deprecated tap APIs --- templates/boltzmann/core/prelude.ts | 2 +- templates/boltzmann/core/utils/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 010ef665..ee93f2ec 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -513,7 +513,7 @@ if (require.main === module) { }) test('initOtelSdk', (assert: Test) => { - assert.tearDown(() => { + assert.teardown(() => { otelSdk = null }) diff --git a/templates/boltzmann/core/utils/index.ts b/templates/boltzmann/core/utils/index.ts index cd1602d6..dd0c9ae9 100644 --- a/templates/boltzmann/core/utils/index.ts +++ b/templates/boltzmann/core/utils/index.ts @@ -75,7 +75,7 @@ if (require.main === module) { const result = await _collect((createReadStream(__filename))) const expect = await fs.readFile(__filename) - assert.equals(String(result), String(expect)) + assert.equal(String(result), String(expect)) }) } void `{% endif %}`; From 111ea8f29d8bd06a1060be1cc085eaf415550c3d Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 15:03:49 -0500 Subject: [PATCH 031/167] Don't import middleware/test in prelude tests --- templates/boltzmann/core/prelude.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index ee93f2ec..2f6531ab 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -365,7 +365,7 @@ type HttpMetadata = ( void `{% if selftest %}`; import tap from 'tap' -import { Test } from '../middleware/test' +type Test = (typeof tap.Test)["prototype"] /* c8 ignore next */ if (require.main === module) { From 337fa0af09e0411ee7a143262b2338a6eaf4cddd Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 15:04:15 -0500 Subject: [PATCH 032/167] Resolve promise on error when closing parent span --- templates/boltzmann/middleware/honeycomb.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 621ff15c..416acf07 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -117,7 +117,6 @@ function trace ({ // we don't want to crash the route just because // otel didn't work... console.warn(err) - return } // *now* we can exit the context resolve(null) From 8ce260cf88830eaf4507d3137c5e53b11f7e04ae Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 15:06:53 -0500 Subject: [PATCH 033/167] Remove testing stubs from honeycomb middleware --- templates/boltzmann/middleware/honeycomb.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 416acf07..9f8565e1 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -253,18 +253,3 @@ function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { } } } - - -void `{% if selftest %}`; - -// import tap from 'tap' -// import { Test } from './test' - -/* c8 ignore next */ -/* -if (require.main === module) { - // TODO: Tests -} -*/ -void `{% endif %}`; - From 93d7453e42ff93368e71d2de1234ff88ef2fe622 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 15:20:47 -0500 Subject: [PATCH 034/167] Fix template bug --- templates/boltzmann/core/prelude.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 2f6531ab..16eaf348 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -78,7 +78,7 @@ void `{% endif %}` void `{% if postgres %}` import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' -void `{% endif % }` +void `{% endif %}` function normalizeHoneycombEnvVars (env: typeof process.env): void { if (!env.HONEYCOMB_DATASET && env.HONEYCOMBIO_DATASET) { From 1d7ab2bbf99d3b3ad0d6411e5974719a0d9a56aa Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 20 Jan 2022 15:25:41 -0500 Subject: [PATCH 035/167] Fix syntax error in dependencies.ron --- src/dependencies.ron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dependencies.ron b/src/dependencies.ron index bf38ddfb..44df6198 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -59,7 +59,7 @@ name: "@opentelemetry/instrumentation", version: "^0.27.0", kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"]))) + preconditions: Some(When(all_of: ["honeycomb"])) ), DependencySpec( From bb8f3477bcb77dbc35c0e80f285138036ab47e2f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 21 Jan 2022 17:37:34 -0500 Subject: [PATCH 036/167] push honeycomb into core module --- templates/boltzmann/core/entrypoint.ts | 4 +- templates/boltzmann/core/honeycomb.ts | 754 ++++++++++++++++++++ templates/boltzmann/core/prelude.ts | 466 +----------- templates/boltzmann/middleware/honeycomb.ts | 247 +------ 4 files changed, 784 insertions(+), 687 deletions(-) create mode 100644 templates/boltzmann/core/honeycomb.ts diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index 9751b802..fc78ecd3 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -2,7 +2,6 @@ void `{% if selftest %}`; import bole from '@entropic/bole' import isDev from 'are-we-dev' -import { startOtelSdk } from '../core/prelude' import { MiddlewareConfig } from '../core/middleware' import { _processMiddleware, _requireOr } from '../core/utils' import { attachPostgres } from '../middleware/postgres' @@ -13,12 +12,13 @@ import { handlePing } from '../middleware/ping' import { trace } from '../middleware/honeycomb' import { runserver } from '../bin/runserver' import { log } from '../middleware/log' +import * as honeycomb from '../core/honeycomb' void `{% endif %}`; /* c8 ignore next */ if (require.main === module && !process.env.TAP) { // {% if honeycomb %} - startOtelSdk().then(run) + honeycomb.start().then(run) function run() { // {% endif %} diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts new file mode 100644 index 00000000..49eedeb8 --- /dev/null +++ b/templates/boltzmann/core/honeycomb.ts @@ -0,0 +1,754 @@ +'use strict' + +import assert from 'assert' +import { ServerResponse } from 'http' +import beeline from 'honeycomb-beeline' +import isDev from 'are-we-dev' +import { Metadata, credentials } from '@grpc/grpc-js' +import { + context as traceContext, + defaultTextMapGetter, + defaultTextMapSetter, + ROOT_CONTEXT, + Sampler, + trace, + Tracer +} from '@opentelemetry/api' +import { + AlwaysOffSampler, + AlwaysOnSampler, + ParentBasedSampler, + TraceIdRatioBasedSampler, + W3CTraceContextPropagator +} from '@opentelemetry/core' +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' +import { Resource } from '@opentelemetry/resources' +import { NodeSDK } from '@opentelemetry/sdk-node' +import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' +import { + SemanticAttributes, + SemanticResourceAttributes +} from '@opentelemetry/semantic-conventions' + +// TODO: right now we install only instrumentation which +// covers node core, redis and postgres. there's both a +// question here of a) which instrumentations get loaded; and +// b) whether this should be more configurable than boltzmann's +// feature flags currently allow. +// +// some relevant instrumentations to consider: +// +// * @opentelemetry/instrumentation-grpc +// * @opentelemetry/instrumentation-graphql +// * some third-party instrumentation for undici +import { Instrumentation } from '@opentelemetry/instrumentation' +import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' +import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' + +void `{% if redis %}`; +import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis' +void `{% endif %}` + +void `{% if postgres %}` +import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' +void `{% endif %}` + +import { Context as Context } from '../data/context' +import { Handler } from './middleware' + +// Some non-standard OpenTelemetry attributes +const OTEL_REQ_QUERY = 'boltzmann.query' +const OTEL_REQ_PARAM_NAMESPACE = 'boltzmann.request.param' + +// State set on init +let enabled: boolean = false +let otelEnabled: boolean = false +let initialized: boolean = false +let started: boolean = false +let __sdk__: NodeSDK | null = null + +// A type for the init function's arguments +interface Options { + enabled?: boolean; + otel?: boolean; + writeKey?: string | null; + dataset?: string | null; + apiHost?: string | null; + sampleRate?: number; +} + +// Extract init options from the environment +function getOptionsFromEnv(env: typeof process.env): Options { + const _enabled = !!env.HONEYCOMB_WRITEKEY + let otel: boolean = false + const writeKey = env.HONEYCOMB_WRITEKEY || null + const dataset = env.HONEYCOMB_DATASET || null + const apiHost = env.HONEYCOMB_API_HOST || null + let sampleRate = 1 + + sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) + + if (isNaN(sampleRate)) { + console.warn( + `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` + + 'defaulting to 1' + ) + sampleRate = 1 + } + + if (_enabled && apiHost) { + otel = /^grpc:\/\//.test(apiHost) + } + + return { + enabled: _enabled, + otel, + writeKey, + dataset, + apiHost, + sampleRate + } +} + +// Access those options in a type-safe-ish manner +function getWriteKey (options: Options): string { + assert(options.enabled && options.writeKey) + return options.writeKey as string +} + +function getDataset (options: Options) { + assert(options.enabled && options.dataset) + return options.dataset as string +} + +function getApiHost (options: Options) { + assert(options.enabled && options.apiHost) + return options.apiHost as string +} + +// Factories are a dependency injection mechanism. If you don't like how +// something is being constructed and you're calling into this module, you +// can override behavior by defining the relevant factories. +interface Factories { + metadata?: (options: Options) => Metadata; + sampler?: (sampleRate: Number) => Sampler; + tracerProvider?: (sampler: Sampler) => NodeTracerProvider; + traceExporter?: (url: string, metadata: Metadata) => OTLPTraceExporter; + spanProcessor?: (traceExporter: OTLPTraceExporter) => SpanProcessor; + instrumentations?: () => Instrumentation[]; + sdk?: ( + serviceName: string, + instrumentations: Instrumentation[], + traceExporter: OTLPTraceExporter + ) => NodeSDK; +} + +const factories = { + metadata (options: Options): Metadata { + const metadata = new Metadata() + + metadata.set('x-honeycomb-team', getWriteKey(options)) + metadata.set('x-honeycomb-dataset', getDataset(options)) + return metadata + }, + + sampler (sampleRate: number): Sampler { + let sampler: Sampler = new AlwaysOnSampler() + + if (sampleRate === 0) { + sampler = new AlwaysOffSampler() + } else if (sampleRate !== 1) { + sampler = new ParentBasedSampler({ + root: new TraceIdRatioBasedSampler(sampleRate) + }) + } + + return sampler + }, + + tracerProvider (sampler: Sampler): NodeTracerProvider { + return new NodeTracerProvider({ sampler }) + }, + + traceExporter (url: string, metadata: Metadata): OTLPTraceExporter { + return new OTLPTraceExporter({ + url, + credentials: credentials.createSsl(), + metadata + }) + }, + + spanProcessor (traceExporter: OTLPTraceExporter): SpanProcessor { + // There's a bug in the types here - SimpleSpanProcessor doesn't + // take the optional Context argument in its signature and + // typescript is understandably cranky about that. + return (new SimpleSpanProcessor(traceExporter) as unknown) + }, + + instrumentations () { + let is: Instrumentation[] = [ + new DnsInstrumentation({}), + new HttpInstrumentation({}), + ] + + void `{% if redis %}` + is.push(new RedisInstrumentation({})) + void `{% endif %}` + + void `{% if postgres %}` + is.push(new PgInstrumentation({})) + void `{% endif %}` + + return is + }, + + sdk ( + serviceName: string, + instrumentations: Instrumentation[], + traceExporter: OTLPTraceExporter + ): NodeSDK { + return new NodeSDK({ + resource: new Resource({ + [SemanticResourceAttributes.SERVICE_NAME]: serviceName + }), + traceExporter, + instrumentations + }) + } +} + +type CompleteFactories = typeof factories + +/* Initialize Honeycomb! Stands up the otel node SDK if enabled, + * otherwise sets up the beeline library. + */ +function init( + serviceName: string, + options: Options, + overrides?: Factories +): void { + if (!options.enabled) return; + enabled = true + if (!options.otel) { + beeline({ + writeKey: getWriteKey(options), + dataset: getDataset(options), + sampleRate: options.sampleRate, + serviceName, + }) + return + } + + otelEnabled = !!options.otel + + let f: CompleteFactories = { + ...factories, + ...(overrides || {}) + } + + const apiHost: string = getApiHost(options) + const metadata: Metadata = f.metadata(options) + + const sampler: Sampler = f.sampler(options.sampleRate || 1) + const provider: NodeTracerProvider = f.tracerProvider(sampler) + const exporter = f.traceExporter(apiHost, metadata) + const processor = f.spanProcessor(exporter) + const instrumentations = f.instrumentations() + + provider.addSpanProcessor(processor) + // TODO: do I need this? + // provider.register() + + __sdk__ = f.sdk(serviceName, instrumentations, exporter) + + initialized = true +} + +/* Initialize the opentelemetry SDK (if initialized) and add shutdown hooks. + */ +async function start(): Promise { + let exitCode = 0 + + async function die(err: Error) { + console.error(err.stack) + exitCode = 1 + await shutdown() + } + + async function shutdown() { + if (__sdk__) { + try { + await __sdk__.shutdown() + } catch (err) { + console.error(err.stack) + } + } + process.exit(exitCode) + } + + if (__sdk__) { + process.once('SIGTERM', shutdown) + process.once('beforeExit', shutdown) + process.once('uncaughtException', die) + process.once('unhandledRejection', die) + await __sdk__.start() + started = true + return + } +} + +let _tracer: Tracer | null = null + +function getTracer() { + if (!_tracer) { + _tracer = trace.getTracer('boltzmann', '1.0.0') + } + return _tracer +} + +/* Start a trace. Calls the runInContext function after the trace is + * started, awaits it, then closes the span before passing through + * runInContext's return value. + */ +async function withTrace( + context: Context, + runInContext: () => Promise, + headerSources?: string[] +): Promise { + if (!otelEnabled) { + // Call legacy beelines implementation + return withBeelineTrace(context, runInContext, headerSources) + } + + if (headerSources) { + console.warn('trace headerSources are a beeline-only feature') + } + + /* + * ┏┓ + * ┃┃╱╲ in + * ┃╱╱╲╲ this + * ╱╱╭╮╲╲house + * ▔▏┗┛▕▔ we + * ╱▔▔▔▔▔▔▔▔▔▔╲ + * trace with opentelemetry + * ╱╱┏┳┓╭╮┏┳┓ ╲╲ + * ▔▏┗┻┛┃┃┗┻┛▕▔ + */ + + const tracer = getTracer() + let carrier = {} + + // Start a parent span + const parentSpan = tracer.startSpan( + `${context.method} ${context.url.pathname}${context.url.search}`, + { + attributes: { + [SemanticAttributes.HTTP_HOST]: context.host, + [SemanticAttributes.HTTP_URL]: context.url.href, + [SemanticAttributes.NET_PEER_IP]: context.remote, + [SemanticAttributes.HTTP_METHOD]: context.method, + [SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + [OTEL_REQ_QUERY]: context.url.search + } + } + ) + + // this propagator takes care of extracting trace parent + // and state from request headers (and so on) + const propagator = new W3CTraceContextPropagator() + + propagator.inject( + trace.setSpanContext( + ROOT_CONTEXT, + parentSpan.spanContext() + ), + carrier, + defaultTextMapSetter + ) + + /* TODO: Do I need to create and set a context? No, right? + + // create a parent active context + const parentContext = propagator.extract( + ROOT_CONTEXT, + carrier, + defaultTextMapGetter + ) + + // set the active context + await traceContext.with(parentContext, async () => { + + */ + + const rv = await runInContext() + + const handler: Handler = context.handler + + parentSpan.setAttribute( + SemanticAttributes.HTTP_STATUS_CODE, + String(context._response.statusCode) + ) + parentSpan.setAttribute( + SemanticAttributes.HTTP_ROUTE, + handler.route + ) + parentSpan.setAttribute( + SemanticAttributes.HTTP_METHOD, + handler.method + ) + parentSpan.setAttribute( + SemanticResourceAttributes.SERVICE_VERSION, + handler.version + ) + + Object.entries(context.params).map(([key, value]) => { + parentSpan.setAttribute( + `${OTEL_REQ_PARAM_NAMESPACE}.${key}`, + value + ) + }) + parentSpan.end() + + return rv +} + +const defaultHeaderSources = [ 'x-honeycomb-trace', 'x-request-id' ] + +/* A beelines implementation of startTrace. + */ +async function withBeelineTrace( + context: Context, + runInContext: () => Promise, + headerSources?: string[] +): Promise { + const schema = require('honeycomb-beeline/lib/schema') + const tracker = require('honeycomb-beeline/lib/async_tracker') + + const traceContext = _getBeelineTraceContext(context) + const trace = beeline.startTrace({ + [schema.EVENT_TYPE]: 'boltzmann', + [schema.PACKAGE_VERSION]: '1.0.0', + [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, + [schema.TRACE_ID_SOURCE]: traceContext.source, + 'request.host': context.host, + 'request.original_url': context.url.href, + 'request.remote_addr': context.remote, + 'request.method': context.method, + 'request.scheme': context.url.protocol, + 'request.path': context.url.pathname, + 'request.query': context.url.search + }, + traceContext.traceId, + traceContext.parentSpanId, + traceContext.dataset) + + if (isDev()) { + context._honeycombTrace = trace + } + + if (traceContext.customContext) { + beeline.addContext(traceContext.customContext) + } + + if (!trace) return runInContext() + + const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { + beeline.addContext({ + 'response.status_code': String(response.statusCode) + }) + + beeline.addContext({ + 'request.route': context.handler.route, + 'request.method': context.handler.method, + 'request.version': context.handler.version + }) + + const params = Object.entries(context.params).map(([key, value]) => { + return [`request.param.${key}`, value] + }) + beeline.addContext(Object.fromEntries(params)) + + beeline.finishTrace(trace) + }) + + const result = await runInContext() + + boundFinisher(tracker.getTracked()) + + return result + + function _getBeelineTraceContext (context: Context) { + const source = (headerSources || defaultHeaderSources).find(header => header in context.headers) + + if (!source || !context.headers[source]) { + return {} + } + + if (source === 'x-honeycomb-trace') { + const data = beeline.unmarshalTraceContext(context.headers[source]) + + if (!data) { + return {} + } + + return Object.assign({}, data, { source: `${source} http header` }) + } + + return { + traceId: context.headers[source], + source: `${source} http header` + } + } +} + +async function withSpan(name: string, runInContext: () => Promise): Promise { + if (!otelEnabled) { + // Call legacy beelines implementation + return withBeelineSpan(name, runInContext) + } + + const activeContext = traceContext.active() + const tracer = getTracer() + const span = tracer.startSpan(name) + trace.setSpan(activeContext, span) + + const result = await runInContext() + + span.end() + + return result +} + +async function withBeelineSpan(name: string, runInContext: () => Promise): Promise { + const span = beeline.startSpan({ name }) + + const result = await runInContext() + + beeline.finishSpan(span) + + return result +} + +export { + beeline, + enabled, + factories, + Factories, + getOptionsFromEnv, + init, + initialized, + Options, + otelEnabled, + start, + started, + withSpan, + withTrace +} + +void `{% if selftest %}`; +import tap from 'tap' +type Test = (typeof tap.Test)["prototype"] + +/* c8 ignore next */ +if (require.main === module) { + const { test } = tap + + test('getOptionsFromEnv', async (t: Test) => { + t.test('options.enabled', async (assert: Test) => { + assert.equal( + getOptionsFromEnv({}).enabled, + false, + 'should be disabled when no env vars' + ) + assert.equal( + getOptionsFromEnv({HONEYCOMB_WRITEKEY: ''}).enabled, + false, + 'should be disabled when env vars are blank' + ) + assert.equal( + getOptionsFromEnv({HONEYCOMB_WRITEKEY: 'some write key'}).enabled, + true, + 'should be enabled when write key is defined' + ) + }) + + t.test('options.otel', async (assert: Test) => { + assert.equal( + getOptionsFromEnv({}).otel, + false, + 'should not use otel when no env vars' + ) + assert.equal( + getOptionsFromEnv({HONEYCOMB_WRITEKEY: ''}).otel, + false, + 'should not use otel when env vars are blank' + ) + assert.equal( + getOptionsFromEnv({HONEYCOMB_WRITEKEY: 'some write key'}).otel, + false, + 'should not use otel when only write key is defined' + ) + assert.equal( + getOptionsFromEnv({ + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'https://refinery.website' + }).otel, + false, + 'should not use otel when API host is not grpc://' + ) + assert.equal( + getOptionsFromEnv({ + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'grpc://otel.website' + }).otel, + true, + '*should* use otel when API host is grpc://' + ) + assert.equal( + getOptionsFromEnv({ + HONEYCOMB_WRITEKEY: '', + HONEYCOMB_API_HOST: 'grpc://otel.website' + }).otel, + false, + 'should not use otel when write key is empty, even if API host is grpc://' + ) + }) + + t.test('options.sampleRate', async (assert: Test) => { + assert.equal( + getOptionsFromEnv({}).sampleRate, + 1, + 'should be 1 by default' + ) + assert.equal( + getOptionsFromEnv({ + HONEYCOMB_SAMPLE_RATE: '1' + }).sampleRate, + 1, + 'should be 1 if defined as 1' + ) + assert.equal( + getOptionsFromEnv({ + HONEYCOMB_SAMPLE_RATE: '0.5' + }).sampleRate, + 0.5, + 'should be 0.5 if defined as 0.5' + ) + assert.equal( + getOptionsFromEnv({ + HONEYCOMB_SAMPLE_RATE: 'pony' + }).sampleRate, + 1, + 'should be 1 if not parseable' + ) + }) + + t.test('options.apiHost', async (assert: Test) => { + assert.equal( + getOptionsFromEnv({}).apiHost, + null, + 'should be null when no env var' + ) + assert.equal( + getOptionsFromEnv({ + HONEYCOMB_API_HOST: 'https://example.com' + }).apiHost, + 'https://example.com', + 'should be url if url' + ) + }) + }) + test('factories', async (t: Test) => { + const options = { + enabled: true, + otel: true, + writeKey: 'some write key', + dataset: 'some dataset', + apiHost: 'grpc://example.com', + sampleRate: 1, + } + + t.test('metadata', async (assert: Test) => { + const metadata = factories.metadata(options) + assert.same( + metadata.get('x-honeycomb-team'), + ['some write key'], + 'should have the write key set' + ) + assert.same( + metadata.get('x-honeycomb-dataset'), + ['some dataset'], + 'shoupld have the dataset set' + ) + }) + + t.test('sampler', async (assert: Test) => { + assert.ok( + factories.sampler(1) instanceof AlwaysOnSampler, + 'sampler(1) should be an AlwaysOnSampler' + ) + assert.ok( + factories.sampler(0) instanceof AlwaysOffSampler, + 'sampler(0) should be an AlwaysOffSampler' + ) + assert.ok( + factories.sampler(0.5) instanceof ParentBasedSampler, + 'sampler(0.5) should be a ParentBasedSampler' + ) + }) + + test('tracerProvider', async (assert: Test) => { + const sampler = factories.sampler(1) + assert.doesNotThrow( + () => factories.tracerProvider(sampler), + 'should create a tracer provider' + ) + }) + + test('traceExporter', async (assert: Test) => { + assert.doesNotThrow(() => { + const url = 'grpc://example.com' + const metadata = factories.metadata(options) + + factories.traceExporter(url, metadata) + }, 'should create a trace exporter') + }) + + test('spanProcessor', async (assert: Test) => { + assert.doesNotThrow(() => { + const exporter = factories.traceExporter( + 'grpc://example.com', + factories.metadata(options) + ) + + factories.spanProcessor(exporter) + }, 'should create a span processor') + }) + + test('instrumentations', async (assert: Test) => { + // expected instrumentations: dns, node core, postgres, redis + assert.equal( + factories.instrumentations().length, + 4, + 'should create 4 instrumentations (dns, http, postgres, redis)' + ) + }) + + test('sdk', async (assert: Test) => { + // run the init function + assert.doesNotThrow(() => { + const exporter = factories.traceExporter( + 'grpc://example.com', + factories.metadata(options) + ) + const instrumentations = factories.instrumentations() + factories.sdk('boltzmann', instrumentations, exporter) + }, 'should create an sdk') + }) + }) +} + +void `{% endif %}` diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 16eaf348..de6f9f45 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -31,251 +31,29 @@ function _getServiceName() { import assert from 'assert' void `{% if honeycomb %}`; -import beeline from 'honeycomb-beeline' -import { Metadata, credentials } from '@grpc/grpc-js' -import { - context as otelContext, - defaultTextMapGetter, - defaultTextMapSetter, - propagation as otelPropagation, - ROOT_CONTEXT, - Sampler, - trace as otelTrace, - Tracer as OtelTracer, -} from '@opentelemetry/api' -import { - AlwaysOffSampler, - AlwaysOnSampler, - ParentBasedSampler, - TraceIdRatioBasedSampler, - W3CTraceContextPropagator -} from '@opentelemetry/core' -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' -import { Resource } from '@opentelemetry/resources' -import { NodeSDK } from '@opentelemetry/sdk-node' -import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' - -// TODO: right now we install only instrumentation which -// covers node core, redis and postgres. there's both a -// question here of a) which instrumentations get loaded; and -// b) whether this should be more configurable than boltzmann's -// feature flags currently allow. -// -// some relevant instrumentations to consider: -// -// * @opentelemetry/instrumentation-grpc -// * @opentelemetry/instrumentation-graphql -// * some third-party instrumentation for undici -import { Instrumentation } from '@opentelemetry/instrumentation' -import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' -import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' - -void `{% if redis %}`; -import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis' -void `{% endif %}` - -void `{% if postgres %}` -import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' -void `{% endif %}` - -function normalizeHoneycombEnvVars (env: typeof process.env): void { - if (!env.HONEYCOMB_DATASET && env.HONEYCOMBIO_DATASET) { - env.HONEYCOMB_DATASET = env.HONEYCOMBIO_DATASET - } - - if (!env.HONEYCOMB_WRITEKEY && env.HONEYCOMBIO_WRITEKEY) { - env.HONEYCOMB_WRITEKEY = process.env.HONEYCOMBIO_WRITEKEY - } - - if (!env.HONEYCOMB_SAMPLE_RATE && env.HONEYCOMBIO_SAMPLE_RATE) { - env.HONEYCOMB_SAMPLE_RATE = env.HONEYCOMBIO_SAMPLE_RATE - } - - if (!env.HONEYCOMB_TEAM && env.HONEYCOMBIO_TEAM) { - env.HONEYCOMB_TEAM = env.HONEYCOMBIO_TEAM - } +import * as honeycomb from './honeycomb' - if (!env.HONEYCOMB_DATASET && env.HONEYCOMBIO_DATASET) { - env.HONEYCOMB_DATASET = env.HONEYCOMBIO_DATASET - } +if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { + process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET } -function isHoneycomb (env: typeof process.env): boolean { - return !!env.HONEYCOMB_WRITEKEY +if (!process.env.HONEYCOMB_WRITEKEY && process.env.HONEYCOMBIO_WRITEKEY) { + process.env.HONEYCOMB_WRITEKEY = process.env.HONEYCOMBIO_WRITEKEY } -function isOtel (env: typeof process.env): boolean { - if (isHoneycomb(env) && env.HONEYCOMB_API_HOST) { - return /^grpc:\/\//.test(env.HONEYCOMB_API_HOST) - } - return false +if (!process.env.HONEYCOMB_SAMPLE_RATE && process.env.HONEYCOMBIO_SAMPLE_RATE) { + process.env.HONEYCOMB_SAMPLE_RATE = process.env.HONEYCOMBIO_SAMPLE_RATE } -function getHoneycombSampleRate (env: typeof process.env): number { - const rate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) - assert(!isNaN(rate)) - return rate +if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { + process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM } -function getHoneycombApiHost (env: typeof process.env): string { - assert(typeof env.HONEYCOMB_API_HOST === 'string') - return env.HONEYCOMB_API_HOST as string +if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { + process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET } -function createOtelMetadata (env: typeof process.env): Metadata { - const metadata = new Metadata() - - assert([ - env.HONEYCOMB_WRITE_KEY, - env.HONEYCOMB_DATASET - ].every(v => typeof v === 'string' && v.length)) - - metadata.set('x-honeycomb-team', env.HONEYCOMB_WRITE_KEY) - metadata.set('x-honeycomb-dataset', env.HONEYCOMB_DATASET) - return metadata -} - -function createOtelSampler (sampleRate: number): Sampler { - let sampler: Sampler = new AlwaysOnSampler() - - if (sampleRate === 0) { - sampler = new AlwaysOffSampler() - } else if (sampleRate !== 1) { - sampler = new ParentBasedSampler({ - root: new TraceIdRatioBasedSampler(sampleRate) - }) - } - - return sampler -} - -function createOtelTracerProvider (sampler: Sampler): NodeTracerProvider { - return new NodeTracerProvider({ sampler }) -} - -function createOtelTraceExporter (url: string, metadata: Metadata): OTLPTraceExporter { - return new OTLPTraceExporter({ - url, - credentials: credentials.createSsl(), - metadata - }) -} - -function createOtelSpanProcessor (traceExporter: OTLPTraceExporter): SpanProcessor { - // There's a bug in the types here - SimpleSpanProcessor doesn't - // take the optional Context argument in its signature and - // typescript is understandably cranky about that. - return (new SimpleSpanProcessor(traceExporter) as unknown) -} - -function registerOtelSpanProcessorWithProvider (processor: SpanProcessor, provider: NodeTracerProvider): void { - provider.addSpanProcessor(processor) - // TODO: do I need this? - // provider.register() -} - -function createOtelInstrumentations(): Instrumentation[] { - let instrumentations: Instrumentation[] = [ - new DnsInstrumentation({}), - new HttpInstrumentation({}), - ] - - void `{% if redis %}` - instrumentations.push(new RedisInstrumentation({})) - void `{% endif %}` - - void `{% if postgres %}` - instrumentations.push(new PgInstrumentation({})) - void `{% endif %}` - - return instrumentations -} - -let otelSdk: NodeSDK | null = null - -function initOtelSdk ( - serviceName: string, - instrumentations: Instrumentation[], - traceExporter: OTLPTraceExporter -): void { - otelSdk = new NodeSDK({ - resource: new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: serviceName - }), - traceExporter, - instrumentations - }) -} - -function initOtel (): void { - const url: string = getHoneycombApiHost(process.env) - const sampleRate: number = getHoneycombSampleRate(process.env) - const metadata: Metadata = createOtelMetadata(process.env) - - const sampler: Sampler = createOtelSampler(sampleRate) - const provider: NodeTracerProvider = createOtelTracerProvider(sampler) - - const exporter = createOtelTraceExporter(url, metadata) - - const processor = createOtelSpanProcessor(exporter) - - const instrumentations = createOtelInstrumentations() - - registerOtelSpanProcessorWithProvider(processor, provider) - - initOtelSdk(serviceName, instrumentations, exporter) -} - -function startOtelSdk(): Promise { - let exitCode = 0 - - async function die(err: Error) { - console.error(err.stack) - exitCode = 1 - await shutdown() - } - - async function shutdown() { - if (otelSdk) { - try { - await otelSdk.shutdown() - } catch (err) { - console.error(err.stack) - } - } - process.exit(exitCode) - } - - if (otelSdk) { - process.once('SIGTERM', shutdown) - process.once('beforeExit', shutdown) - process.once('uncaughtException', die) - process.once('unhandledRejection', die) - return otelSdk.start() - } - - return Promise.resolve() -} - -function initBeeline () { - beeline({ - writeKey: process.env.HONEYCOMB_WRITEKEY, - dataset: process.env.HONEYCOMB_DATASET, - sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, - serviceName, - }) -} - -// launch salvos -normalizeHoneycombEnvVars(process.env) - -if (isOtel(process.env)) { - initOtel() -} else if (isHoneycomb(process.env)) { - initBeeline() -} +honeycomb.init(serviceName, honeycomb.getOptionsFromEnv(process.env)) import onHeaders from 'on-headers' void `{% endif %}`; @@ -363,180 +141,6 @@ type HttpMetadata = ( { [TEMPLATE]: string } ) -void `{% if selftest %}`; -import tap from 'tap' -type Test = (typeof tap.Test)["prototype"] - -/* c8 ignore next */ -if (require.main === module) { - const { test } = tap - - test('isHoneycomb detects if Honeycomb is enabled', async (assert: Test) => { - assert.equal(isHoneycomb({}), false) - assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: ''}), false) - assert.equal(isHoneycomb({HONEYCOMB_WRITEKEY: 'some write key'}), true) - assert.end() - }) - - test('isOtel detects if OpenTelemetry is enabled', async (assert: Test) => { - assert.equal(isOtel({}), false) - assert.equal(isOtel({HONEYCOMB_WRITEKEY: ''}), false) - assert.equal(isOtel({HONEYCOMB_WRITEKEY: 'some write key'}), false) - assert.equal(isOtel({ - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'https://refinery.website' - }), false) - assert.equal(isOtel({ - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'grpc://otel.website' - }), true) - assert.equal(isOtel({ - HONEYCOMB_WRITEKEY: '', - HONEYCOMB_API_HOST: 'grpc://otel.website' - }), false) - assert.end() - }) - - test('getHoneycombSampleRate parses the sample rate', (assert: Test) => { - assert.equal(getHoneycombSampleRate({}), 1) - assert.equal(getHoneycombSampleRate({ - HONEYCOMB_SAMPLE_RATE: '1' - }), 1) - assert.equal(getHoneycombSampleRate({ - HONEYCOMB_SAMPLE_RATE: '0.5' - }), 0.5) - assert.throws(() => getHoneycombSampleRate({ - HONEYCOMB_SAMPLE_RATE: 'pony' - })) - assert.end() - }) - - test('getHoneycombApiHost parses the API host', (assert: Test) => { - assert.throws(() => getHoneycombApiHost({})) - assert.equal(getHoneycombApiHost({ - HONEYCOMB_API_HOST: 'https://example.com' - }), 'https://example.com') - assert.end() - }) - - test('createOtelMetadata', (t: Test) => { - t.plan(3) - t.test('creates metadata when environment variables are defined', (assert: Test) => { - const metadata = createOtelMetadata({ - HONEYCOMB_WRITE_KEY: 'some write key', - HONEYCOMB_DATASET: 'some dataset' - }) - assert.same(metadata.get('x-honeycomb-team'), ['some write key']) - assert.same(metadata.get('x-honeycomb-dataset'), ['some dataset']) - assert.end() - }) - - t.test('throws when environment variabes are undefined', (assert: Test) => { - assert.throws(() => createOtelMetadata({})) - assert.end() - }) - - t.test('throws when environment variables are empty', (assert: Test) => { - assert.throws(() => createOtelMetadata({ - HONEYCOMB_WRITE_KEY: '', - HONEYCOMB_DATASET: '' - })) - assert.end() - }) - }) - - test('createOtelSampler', (assert: Test) => { - assert.ok(createOtelSampler(1) instanceof AlwaysOnSampler) - assert.ok(createOtelSampler(0) instanceof AlwaysOffSampler) - assert.ok(createOtelSampler(0.5) instanceof ParentBasedSampler) - assert.end() - }) - - test('createOtelTracerProvider', (assert: Test) => { - const sampler = createOtelSampler(1) - assert.ok(createOtelTracerProvider(sampler) instanceof NodeTracerProvider) - assert.end() - }) - - test('createOtelTraceExporter', (assert: Test) => { - assert.doesNotThrow(() => { - const url = 'grpc://example.com' - const metadata = createOtelMetadata({ - HONEYCOMB_WRITE_KEY: 'some write key', - HONEYCOMB_DATASET: 'some dataset' - }) - - createOtelTraceExporter(url, metadata) - }) - assert.end() - }) - - test('createOtelSpanProcessor', (assert: Test) => { - assert.doesNotThrow(() => { - const exporter = createOtelTraceExporter( - 'grpc://example.com', - createOtelMetadata({ - HONEYCOMB_WRITE_KEY: 'some write key', - HONEYCOMB_DATASET: 'some dataset' - }) - ) - - createOtelSpanProcessor(exporter) - }) - assert.end() - }) - - test('registerOtelSpanProcessorWithProvider', (assert: Test) => { - assert.doesNotThrow(() => { - const processor = createOtelSpanProcessor( - createOtelTraceExporter( - 'grpc://example.com', - createOtelMetadata({ - HONEYCOMB_WRITE_KEY: 'some write key', - HONEYCOMB_DATASET: 'some dataset' - }) - ) - ) - const provider = createOtelTracerProvider(createOtelSampler(1)) - - registerOtelSpanProcessorWithProvider( - processor, provider - ) - }) - assert.end() - }) - - test('createOtelInstrumentations', (assert: Test) => { - // expected instrumentations: dns, node core, postgres, redis - assert.equal(createOtelInstrumentations().length, 4) - assert.end() - }) - - test('initOtelSdk', (assert: Test) => { - assert.teardown(() => { - otelSdk = null - }) - - // run the init function - assert.doesNotThrow(() => { - const exporter = createOtelTraceExporter( - 'grpc://example.com', - createOtelMetadata({ - HONEYCOMB_WRITE_KEY: 'some write key', - HONEYCOMB_DATASET: 'some dataset' - }) - ) - const instrumentations = createOtelInstrumentations() - initOtelSdk('boltzmann', instrumentations, exporter) - }) - - // ensure it actually initted the init - assert.ok(otelSdk) - - assert.end() - }) -} - void `{% if postgres %}`; export { pg, PGPool, PGPoolClient, PGClient } void `{% endif %}`; @@ -546,48 +150,7 @@ export { redis } void `{% endif %}`; void `{% if honeycomb %}`; -export { - AlwaysOffSampler, - AlwaysOnSampler, - defaultTextMapGetter, - defaultTextMapSetter, - DnsInstrumentation, - HttpInstrumentation, - startOtelSdk, - NodeSDK, - NodeTracerProvider, - onHeaders, - otelContext, - otelPropagation, - otelTrace, - OtelTracer, - OTLPTraceExporter, - ParentBasedSampler, - Resource, - ROOT_CONTEXT, - Sampler, - SemanticAttributes, - SemanticResourceAttributes, - SimpleSpanProcessor, - SpanProcessor, - TraceIdRatioBasedSampler, - W3CTraceContextPropagator -} - -void `{% if postgres %}` -export { - PgInstrumentation -} -void `{% endif %}`; - -void `{% if redis %}` -export { - RedisInstrumentation -} -void `{% endif %}`; - - - +export { onHeaders, honeycomb } void `{% endif %}`; void `{% if jwt or oauth %}`; @@ -649,8 +212,5 @@ export { promisify, querystring, ships, - beeline, - isHoneycomb, - isOtel, } void `{% endif %}` diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 9f8565e1..116066a6 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,255 +1,38 @@ void `{% if selftest %}`; export { trace, honeycombMiddlewareSpans } -import { - context as otelContext, - defaultTextMapGetter, - defaultTextMapSetter, - ROOT_CONTEXT, - trace as otelTrace, - Tracer as OtelTracer -} from '@opentelemetry/api' -import { W3CTraceContextPropagator } from '@opentelemetry/core' -import { SemanticAttributes, SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' -import { isHoneycomb, isOtel } from '../core/prelude' +import * as honeycomb from '../core/honeycomb' import { Handler } from '../core/middleware' import { Context } from '../data/context' -import { ServerResponse } from 'http' import onHeaders from 'on-headers' -import beeline from 'honeycomb-beeline' -import isDev from 'are-we-dev' void `{% endif %}`; -let otelTracer: OtelTracer | null = null; - -const OTEL_NAMESPACE = 'boltzmann' -const OTEL_REQ_NAMESPACE = `${OTEL_NAMESPACE}.request` -const OTEL_REQ_QUERY = `${OTEL_REQ_NAMESPACE}.query` -const OTEL_REQ_PARAM_NAMESPACE = `${OTEL_REQ_NAMESPACE}.param` - -function getOtelTracer() { - if (!otelTracer) { - otelTracer = otelTrace.getTracer('boltzmann', '1.0.0') - } - return otelTracer -} - function trace ({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { - if (!isHoneycomb(process.env)) { - return (next: Handler) => (context: Context) => next(context) - } - - if (isOtel(process.env)) { - return function honeycombOtelTrace (next: Handler) { - return async (context: Context) => { - const tracer = getOtelTracer() - let carrier = {} - - // Start a parent span - const parentSpan = tracer.startSpan(`${context.method} ${context.url.pathname}${context.url.search}`, { - attributes: { - [SemanticAttributes.HTTP_HOST]: context.host, - [SemanticAttributes.HTTP_URL]: context.url.href, - [SemanticAttributes.NET_PEER_IP]: context.remote, - [SemanticAttributes.HTTP_METHOD]: context.method, - [SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - [OTEL_REQ_QUERY]: context.url.search - } - }) - - // this propagator takes care of extracting trace parent - // and state from request headers (and so on) - const propagator = new W3CTraceContextPropagator() - - propagator.inject( - otelTrace.setSpanContext( - ROOT_CONTEXT, - parentSpan.spanContext() - ), - carrier, - defaultTextMapSetter - ) - - // create a parent active context - const parentContext = propagator.extract( - ROOT_CONTEXT, - carrier, - defaultTextMapGetter - ) - - // set the active context - otelContext.with(parentContext, () => { - // keep the context active until we close the span - return new Promise((resolve, reject) => { - // do not do as I do, - onHeaders(context._response, function () { - // do our dangest to capture/handle surprise errors - try { - const handler: Handler = context.handler - - parentSpan.setAttribute( - SemanticAttributes.HTTP_STATUS_CODE, - String(context._response.statusCode) - ) - parentSpan.setAttribute( - SemanticAttributes.HTTP_ROUTE, - handler.route - ) - parentSpan.setAttribute( - SemanticAttributes.HTTP_METHOD, - handler.method - ) - parentSpan.setAttribute( - SemanticResourceAttributes.SERVICE_VERSION, - handler.version - ) - - Object.entries(context.params).map(([key, value]) => { - parentSpan.setAttribute( - `${OTEL_REQ_PARAM_NAMESPACE}.${key}`, - value - ) - }) - parentSpan.end() - } catch (err) { - // we don't want to crash the route just because - // otel didn't work... - console.warn(err) - } - // *now* we can exit the context - resolve(null) - }) - }) - }) - - next(context) - } - } - } else { - const schema = require('honeycomb-beeline/lib/schema') - const tracker = require('honeycomb-beeline/lib/async_tracker') - - return function honeycombTrace (next: Handler) { - return (context: Context) => { - const traceContext = _getBeelineTraceContext(context) - const trace = beeline.startTrace({ - [schema.EVENT_TYPE]: 'boltzmann', - [schema.PACKAGE_VERSION]: '1.0.0', - [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, - [schema.TRACE_ID_SOURCE]: traceContext.source, - 'request.host': context.host, - 'request.original_url': context.url.href, - 'request.remote_addr': context.remote, - 'request.method': context.method, - 'request.scheme': context.url.protocol, - 'request.path': context.url.pathname, - 'request.query': context.url.search - }, - traceContext.traceId, - traceContext.parentSpanId, - traceContext.dataset) - - if (isDev()) { - context._honeycombTrace = trace - } - - if (traceContext.customContext) { - beeline.addContext(traceContext.customContext) - } - - if (!trace) { - return next(context) - } - - const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { - beeline.addContext({ - 'response.status_code': String(response.statusCode) - }) - - beeline.addContext({ - 'request.route': context.handler.route, - 'request.method': context.handler.method, - 'request.version': context.handler.version - }) - - const params = Object.entries(context.params).map(([key, value]) => { - return [`request.param.${key}`, value] - }) - beeline.addContext(Object.fromEntries(params)) - - beeline.finishTrace(trace) - }) - - onHeaders(context._response, function () { - return boundFinisher(this, tracker.getTracked()) + return function honeycombTrace (next: Handler) { + return (context: Context) => { + honeycomb.withTrace(context, () => new Promise((resolve, reject) => { + const p = next(context) + + // do not do as I do, + onHeaders(context._response, () => { + p.then(resolve, reject) }) - - return next(context) - } - } - } - - function _getBeelineTraceContext (context: Context) { - const source = headerSources.find(header => header in context.headers) - - if (!source || !context.headers[source]) { - return {} - } - - if (source === 'x-honeycomb-trace') { - const data = beeline.unmarshalTraceContext(context.headers[source]) - - if (!data) { - return {} - } - - return Object.assign({}, data, { source: `${source} http header` }) - } - - return { - traceId: context.headers[source], - source: `${source} http header` + }), headerSources) } } } function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { - if (!isHoneycomb(process.env)) { + if (!honeycomb.enabled) { return (next: Handler) => (context: Context) => next(context) } - if (isOtel(process.env)) { - return honeycombOtelSpan - } else { - return honeycombBeelineSpan - } - - function honeycombOtelSpan (next: Handler) { - return async (context: Context) => { - const activeContext = otelContext.active() - const tracer = getOtelTracer() - const span = tracer.startSpan(`mw: ${name}`) - otelTrace.setSpan(activeContext, span) - - // Assumption: the invariant middleware between each layer - // will ensure that no errors are thrown from next(). - const result = await next(context) - span.end() - return result + function honeycombSpan (next: Handler) { + return async (context: Context): Promise => { + return honeycomb.withSpan(`mw: ${name}`, () => next(context)) } } - function honeycombBeelineSpan (next: Handler) { - return async (context: Context) => { - const span = beeline.startSpan({ - name: `mw: ${name}` - }) - - const result = await next(context) - beeline.finishSpan(span) - return result - } - } + return honeycombSpan } From 1cd569ad97ebe2ede6eb141b485d52b42ce0aa01 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 21 Jan 2022 20:34:41 -0500 Subject: [PATCH 037/167] Move honeycomb core code out of prelude.ts --- templates/boltzmann/core/entrypoint.ts | 2 +- templates/boltzmann/core/honeycomb.ts | 995 +++++++++++--------- templates/boltzmann/core/prelude.ts | 15 +- templates/boltzmann/index.tera | 1 + templates/boltzmann/middleware/honeycomb.ts | 4 +- 5 files changed, 591 insertions(+), 426 deletions(-) diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index fc78ecd3..c8ef877d 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -12,7 +12,7 @@ import { handlePing } from '../middleware/ping' import { trace } from '../middleware/honeycomb' import { runserver } from '../bin/runserver' import { log } from '../middleware/log' -import * as honeycomb from '../core/honeycomb' +import { honeycomb } from '../core/prelude' void `{% endif %}`; /* c8 ignore next */ diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 49eedeb8..0fcf0541 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -1,13 +1,31 @@ 'use strict' -import assert from 'assert' -import { ServerResponse } from 'http' +/*{# +Hey, friend! Before you go to town, there's something you should +know: + +!!! This file is included *before* the prelude !!! + +You should read the comments in the prelude before continuing. But +once you're back, here are some ways that this file is both similar +to and different from that one: + +1) Dependencies specific to honeycomb have to be imported and exported + as in the prelude, for the same reasons. +2) Dependencies not specific to honeycomb should be required at the + scope nearest to their use. This is so the namespace isn't polluted + in the prelude. + +Good luck! +#}*/ + +// We continue to support beelines... import beeline from 'honeycomb-beeline' -import isDev from 'are-we-dev' + +// ...but are migrating to OpenTelemetry: import { Metadata, credentials } from '@grpc/grpc-js' import { context as traceContext, - defaultTextMapGetter, defaultTextMapSetter, ROOT_CONTEXT, Sampler, @@ -15,8 +33,6 @@ import { Tracer } from '@opentelemetry/api' import { - AlwaysOffSampler, - AlwaysOnSampler, ParentBasedSampler, TraceIdRatioBasedSampler, W3CTraceContextPropagator @@ -31,17 +47,24 @@ import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' -// TODO: right now we install only instrumentation which -// covers node core, redis and postgres. there's both a -// question here of a) which instrumentations get loaded; and -// b) whether this should be more configurable than boltzmann's -// feature flags currently allow. +// We include node core instrumentation, as well as redis +// and postgres instrumentation if those respective features +// are enabled. +// +// TODO: Can these be overridden? // -// some relevant instrumentations to consider: +// Some instrumentation that is NOT included, because boltzmann +// doesn't support the technology: // // * @opentelemetry/instrumentation-grpc // * @opentelemetry/instrumentation-graphql -// * some third-party instrumentation for undici +// +// TODO: Double-check these +// +// Some packages which, to our knowledge, don't have available +// instrumentations: +// +// * undici import { Instrumentation } from '@opentelemetry/instrumentation' import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' @@ -54,123 +77,88 @@ void `{% if postgres %}` import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' void `{% endif %}` +// TODO: Sort through these and find a good answer +void `{% if selftest %}` +import assert from 'assert' +import { ServerResponse } from 'http' + +// TODO: Imports from internal modules will import { Context as Context } from '../data/context' import { Handler } from './middleware' -// Some non-standard OpenTelemetry attributes -const OTEL_REQ_QUERY = 'boltzmann.query' -const OTEL_REQ_PARAM_NAMESPACE = 'boltzmann.request.param' - -// State set on init -let enabled: boolean = false -let otelEnabled: boolean = false -let initialized: boolean = false -let started: boolean = false -let __sdk__: NodeSDK | null = null - -// A type for the init function's arguments -interface Options { - enabled?: boolean; - otel?: boolean; - writeKey?: string | null; - dataset?: string | null; - apiHost?: string | null; - sampleRate?: number; -} +import isDev from 'are-we-dev' +void `{% endif %}` -// Extract init options from the environment -function getOptionsFromEnv(env: typeof process.env): Options { - const _enabled = !!env.HONEYCOMB_WRITEKEY - let otel: boolean = false - const writeKey = env.HONEYCOMB_WRITEKEY || null - const dataset = env.HONEYCOMB_DATASET || null - const apiHost = env.HONEYCOMB_API_HOST || null - let sampleRate = 1 - - sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) - - if (isNaN(sampleRate)) { - console.warn( - `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` - + 'defaulting to 1' - ) - sampleRate = 1 - } +// Arguments passed to Honeycomb's constructor +interface HoneycombOptions { + serviceName: string + // When true, treat Honeycomb instrumentation as + // disabled + disable?: boolean - if (_enabled && apiHost) { - otel = /^grpc:\/\//.test(apiHost) - } + // When true, Do Otel + otel?: boolean - return { - enabled: _enabled, - otel, - writeKey, - dataset, - apiHost, - sampleRate - } -} + // The Honeycomb write key and dataset + writeKey?: string | null + dataset?: string | null -// Access those options in a type-safe-ish manner -function getWriteKey (options: Options): string { - assert(options.enabled && options.writeKey) - return options.writeKey as string -} + // If using OpenTelemetry, this is a grpc:// address + apiHost?: string | null -function getDataset (options: Options) { - assert(options.enabled && options.dataset) - return options.dataset as string + // Tunables, etc. + sampleRate?: number } -function getApiHost (options: Options) { - assert(options.enabled && options.apiHost) - return options.apiHost as string +// Whether or not otel, beelines and honeycomb are enabled +interface HoneycombFeatures { + honeycomb: boolean + beeline: boolean + otel: boolean } -// Factories are a dependency injection mechanism. If you don't like how -// something is being constructed and you're calling into this module, you -// can override behavior by defining the relevant factories. -interface Factories { - metadata?: (options: Options) => Metadata; - sampler?: (sampleRate: Number) => Sampler; - tracerProvider?: (sampler: Sampler) => NodeTracerProvider; - traceExporter?: (url: string, metadata: Metadata) => OTLPTraceExporter; - spanProcessor?: (traceExporter: OTLPTraceExporter) => SpanProcessor; - instrumentations?: () => Instrumentation[]; - sdk?: ( +// There's a lot of plumbing that happens when setting up +// OpenTelemetry. In order to fully initialize it, we need +// to instantiate all of these object types. +// +// They're exposed on the Honeycomb class but in a nested +// namespace. +interface OTLPFactories { + metadata: (writeKey: string, dataset: string) => Metadata + sampler: (sampleRate: number) => Sampler + tracerProvider: (sampler: Sampler) => NodeTracerProvider + traceExporter: (url: string, metadata: Metadata) => OTLPTraceExporter + spanProcessor: (traceExporter: OTLPTraceExporter) => SpanProcessor + instrumentations: () => Instrumentation[] + sdk: ( serviceName: string, instrumentations: Instrumentation[], traceExporter: OTLPTraceExporter - ) => NodeSDK; + ) => NodeSDK } -const factories = { - metadata (options: Options): Metadata { +const defaultOTLPFactories: OTLPFactories = { + metadata (writeKey: string, dataset: string): Metadata { const metadata = new Metadata() - - metadata.set('x-honeycomb-team', getWriteKey(options)) - metadata.set('x-honeycomb-dataset', getDataset(options)) + metadata.set('x-honeycomb-team', writeKey) + metadata.set('x-honeycomb-dataset', dataset) return metadata }, + // create a Sampler object, which is used to tune + // the sampling rate sampler (sampleRate: number): Sampler { - let sampler: Sampler = new AlwaysOnSampler() - - if (sampleRate === 0) { - sampler = new AlwaysOffSampler() - } else if (sampleRate !== 1) { - sampler = new ParentBasedSampler({ - root: new TraceIdRatioBasedSampler(sampleRate) - }) - } - - return sampler + return new ParentBasedSampler({ + root: new TraceIdRatioBasedSampler(sampleRate) + }) }, + // It provides tracers! tracerProvider (sampler: Sampler): NodeTracerProvider { return new NodeTracerProvider({ sampler }) }, + // Export traces to an OTLP endpoint with GRPC traceExporter (url: string, metadata: Metadata): OTLPTraceExporter { return new OTLPTraceExporter({ url, @@ -179,6 +167,8 @@ const factories = { }) }, + // Process spans, using the supplied trace exporter to + // do the actual exporting. spanProcessor (traceExporter: OTLPTraceExporter): SpanProcessor { // There's a bug in the types here - SimpleSpanProcessor doesn't // take the optional Context argument in its signature and @@ -203,6 +193,9 @@ const factories = { return is }, + // The SDK will take a service name, instrumentations + // and a trace exporter and give us a stateful singleton. + // This is that singleton! sdk ( serviceName: string, instrumentations: Instrumentation[], @@ -218,337 +211,472 @@ const factories = { } } -type CompleteFactories = typeof factories - -/* Initialize Honeycomb! Stands up the otel node SDK if enabled, - * otherwise sets up the beeline library. - */ -function init( - serviceName: string, - options: Options, - overrides?: Factories -): void { - if (!options.enabled) return; - enabled = true - if (!options.otel) { - beeline({ - writeKey: getWriteKey(options), - dataset: getDataset(options), - sampleRate: options.sampleRate, - serviceName, - }) - return +// For testing purposes, it can be beneficial to +// override how objects in OpenTelemetry initialization +// are created. The Honeycomb class allows for +// passing overrides into its constructor. +interface OTLPFactoryOverrides { + metadata?: (writeKey: string, dataset: string) => Metadata + sampler?: (sampleRate: Number) => Sampler + tracerProvider?: (sampler: Sampler) => NodeTracerProvider + traceExporter?: (url: string, metadata: Metadata) => OTLPTraceExporter + spanProcessor?: (traceExporter: OTLPTraceExporter) => SpanProcessor + instrumentations?: () => Instrumentation[]; + sdk?: ( + serviceName: string, + instrumentations: Instrumentation[], + traceExporter: OTLPTraceExporter + ) => NodeSDK; +} + +class Honeycomb { + // We load options from the environment. Unlike with Options, + // we do a lot of feature detection here. + public static fromEnv( + serviceName: string, + env: typeof process.env = process.env, + overrides: OTLPFactoryOverrides = {} + ): Honeycomb { + return new Honeycomb( + Honeycomb.parseEnv(serviceName, env), + overrides + ) } - otelEnabled = !!options.otel + // TODO: Can't inject serviceName here + public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { + // If there's no write key we won't get very far anyway + const disable = !env.HONEYCOMB_WRITEKEY + let otel: boolean = false + const writeKey = env.HONEYCOMB_WRITEKEY || null + const dataset = env.HONEYCOMB_DATASET || null + const apiHost = env.HONEYCOMB_API_HOST || null + let sampleRate = 1 + + sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) + + if (isNaN(sampleRate)) { + console.warn( + `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` + + 'defaulting to 1' + ) + sampleRate = 1 + } - let f: CompleteFactories = { - ...factories, - ...(overrides || {}) + // If the API host is a grpc:// endpoint, we feature switch to + // OpenTelemetry. There are prior uses of this variable here but + // they should've been using https://. + if (!disable && apiHost) { + otel = /^grpc:\/\//.test(apiHost) + } + + return { + serviceName, + disable, + otel, + writeKey, + dataset, + apiHost, + sampleRate + } } - const apiHost: string = getApiHost(options) - const metadata: Metadata = f.metadata(options) + private getWriteKey (): string { + assert(this.features.honeycomb && this.options.writeKey) + return this.options.writeKey as string + } - const sampler: Sampler = f.sampler(options.sampleRate || 1) - const provider: NodeTracerProvider = f.tracerProvider(sampler) - const exporter = f.traceExporter(apiHost, metadata) - const processor = f.spanProcessor(exporter) - const instrumentations = f.instrumentations() + private getDataset () { + assert(this.features.honeycomb && this.options.dataset) + return this.options.dataset as string + } - provider.addSpanProcessor(processor) - // TODO: do I need this? - // provider.register() + private getApiHost () { + assert(this.features.honeycomb && this.options.apiHost) + return this.options.apiHost as string + } - __sdk__ = f.sdk(serviceName, instrumentations, exporter) + public options: HoneycombOptions + public features: HoneycombFeatures + public factories: OTLPFactories + + public initialized: boolean + public started: boolean + public sdk: NodeSDK | null + public tracer: Tracer + public static beeline: typeof beeline = beeline + + constructor( + options: HoneycombOptions, + overrides: OTLPFactoryOverrides = {} + ) { + this.options = options + this.features = { + honeycomb: !options.disable, + beeline: !options.disable && !options.otel, + otel: options.otel || false + } + this.initialized = false + this.started = false + this.sdk = null + this.tracer = trace.getTracer('boltzmann', '1.0.0') + this.factories = { + ...defaultOTLPFactories, + ...(overrides || {}) + } + } - initialized = true -} + // Some non-standard OpenTelemetry attributes we add in + // the middlewares... -/* Initialize the opentelemetry SDK (if initialized) and add shutdown hooks. - */ -async function start(): Promise { - let exitCode = 0 + public static OTEL_REQ_QUERY = 'boltzmann.query' - async function die(err: Error) { - console.error(err.stack) - exitCode = 1 - await shutdown() + public static paramAttribute(param: string): string { + return `boltzmann.request.param.${param}` } - async function shutdown() { - if (__sdk__) { - try { - await __sdk__.shutdown() - } catch (err) { - console.error(err.stack) - } + // Initialize Honeycomb! Stands up the otel node SDK if enabled, + // otherwise sets up the beeline library. + // This needs to occur before any imports you want instrumentation + // to be aware of. + public init(): void { + if (!this.features.honeycomb) return + + const writeKey = this.getWriteKey() + const dataset = this.getDataset() + const sampleRate = this.options.sampleRate || 1 + const serviceName = this.options.serviceName + + if (!this.features.otel) { + beeline({ writeKey, dataset, sampleRate, serviceName }) + return } - process.exit(exitCode) - } - if (__sdk__) { - process.once('SIGTERM', shutdown) - process.once('beforeExit', shutdown) - process.once('uncaughtException', die) - process.once('unhandledRejection', die) - await __sdk__.start() - started = true - return - } -} + const f = this.factories + const apiHost: string = this.getApiHost() -let _tracer: Tracer | null = null + const metadata: Metadata = f.metadata(writeKey, dataset) -function getTracer() { - if (!_tracer) { - _tracer = trace.getTracer('boltzmann', '1.0.0') - } - return _tracer -} + const sampler: Sampler = f.sampler(sampleRate) + const exporter = f.traceExporter(apiHost, metadata) + const processor = f.spanProcessor(exporter) + const instrumentations = f.instrumentations() -/* Start a trace. Calls the runInContext function after the trace is - * started, awaits it, then closes the span before passing through - * runInContext's return value. - */ -async function withTrace( - context: Context, - runInContext: () => Promise, - headerSources?: string[] -): Promise { - if (!otelEnabled) { - // Call legacy beelines implementation - return withBeelineTrace(context, runInContext, headerSources) - } + const provider: NodeTracerProvider = f.tracerProvider(sampler) + provider.addSpanProcessor(processor) + provider.register() - if (headerSources) { - console.warn('trace headerSources are a beeline-only feature') + this.sdk = f.sdk( + serviceName, + instrumentations, + exporter + ) + + this.initialized = true } - /* - * ┏┓ - * ┃┃╱╲ in - * ┃╱╱╲╲ this - * ╱╱╭╮╲╲house - * ▔▏┗┛▕▔ we - * ╱▔▔▔▔▔▔▔▔▔▔╲ - * trace with opentelemetry - * ╱╱┏┳┓╭╮┏┳┓ ╲╲ - * ▔▏┗┻┛┃┃┗┻┛▕▔ - */ + // Start the OpenTelemetry SDK. If using beelines, this is + // a no-op. This needs to happen before anything happens in + // the entrypoint and is an async operation. + public async start(): Promise { + let exitCode = 0 + const sdk = this.sdk + + async function die(err: Error) { + console.error(err.stack) + exitCode = 1 + await shutdown() + } - const tracer = getTracer() - let carrier = {} - - // Start a parent span - const parentSpan = tracer.startSpan( - `${context.method} ${context.url.pathname}${context.url.search}`, - { - attributes: { - [SemanticAttributes.HTTP_HOST]: context.host, - [SemanticAttributes.HTTP_URL]: context.url.href, - [SemanticAttributes.NET_PEER_IP]: context.remote, - [SemanticAttributes.HTTP_METHOD]: context.method, - [SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - [OTEL_REQ_QUERY]: context.url.search + async function shutdown() { + if (sdk) { + try { + await sdk.shutdown() + } catch (err) { + console.error(err.stack) + } } + process.exit(exitCode) } - ) - // this propagator takes care of extracting trace parent - // and state from request headers (and so on) - const propagator = new W3CTraceContextPropagator() + if (sdk) { + process.once('SIGTERM', shutdown) + process.once('beforeExit', shutdown) + process.once('uncaughtException', die) + process.once('unhandledRejection', die) + await sdk.start() + this.started = true + } + } + + // Create a trace, call the runInContext function, then close the + // trace after it resolved. For beeline, this is is a Trace; + // for OpenTelemetry, it's a root span. + public async withTrace( + context: Context, + runInContext: () => Promise, + headerSources?: string[] + ): Promise { + if (!this.features.honeycomb) { + // Call legacy beelines implementation + return this.withBeelineTrace(context, runInContext, headerSources) + } - propagator.inject( - trace.setSpanContext( + if (headerSources) { + console.warn('trace headerSources are a beeline-only feature') + } + + /* + * ┏┓ + * ┃┃╱╲ in + * ┃╱╱╲╲ this + * ╱╱╭╮╲╲house + * ▔▏┗┛▕▔ we + * ╱▔▔▔▔▔▔▔▔▔▔╲ + * trace with opentelemetry + * ╱╱┏┳┓╭╮┏┳┓ ╲╲ + * ▔▏┗┻┛┃┃┗┻┛▕▔ + */ + + const tracer = this.tracer + let carrier = {} + + // Start a parent span + const parentSpan = tracer.startSpan( + `${context.method} ${context.url.pathname}${context.url.search}`, + { + attributes: { + [SemanticAttributes.HTTP_HOST]: context.host, + [SemanticAttributes.HTTP_URL]: context.url.href, + [SemanticAttributes.NET_PEER_IP]: context.remote, + [SemanticAttributes.HTTP_METHOD]: context.method, + [SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + // TODO: Honeycomb.Attributes obvs + [Honeycomb.OTEL_REQ_QUERY]: context.url.search + } + } + ) + + // this propagator takes care of extracting trace parent + // and state from request headers (and so on) + const propagator = new W3CTraceContextPropagator() + + propagator.inject( + trace.setSpanContext( + ROOT_CONTEXT, + parentSpan.spanContext() + ), + carrier, + defaultTextMapSetter + ) + + /* TODO: Do I need to create and set a context? No, right? + + // create a parent active context + const parentContext = propagator.extract( ROOT_CONTEXT, - parentSpan.spanContext() - ), - carrier, - defaultTextMapSetter - ) - - /* TODO: Do I need to create and set a context? No, right? - - // create a parent active context - const parentContext = propagator.extract( - ROOT_CONTEXT, - carrier, - defaultTextMapGetter - ) - - // set the active context - await traceContext.with(parentContext, async () => { - - */ - - const rv = await runInContext() - - const handler: Handler = context.handler - - parentSpan.setAttribute( - SemanticAttributes.HTTP_STATUS_CODE, - String(context._response.statusCode) - ) - parentSpan.setAttribute( - SemanticAttributes.HTTP_ROUTE, - handler.route - ) - parentSpan.setAttribute( - SemanticAttributes.HTTP_METHOD, - handler.method - ) - parentSpan.setAttribute( - SemanticResourceAttributes.SERVICE_VERSION, - handler.version - ) - - Object.entries(context.params).map(([key, value]) => { - parentSpan.setAttribute( - `${OTEL_REQ_PARAM_NAMESPACE}.${key}`, - value + carrier, + defaultTextMapGetter ) - }) - parentSpan.end() - return rv -} + // set the active context + await traceContext.with(parentContext, async () => { -const defaultHeaderSources = [ 'x-honeycomb-trace', 'x-request-id' ] - -/* A beelines implementation of startTrace. - */ -async function withBeelineTrace( - context: Context, - runInContext: () => Promise, - headerSources?: string[] -): Promise { - const schema = require('honeycomb-beeline/lib/schema') - const tracker = require('honeycomb-beeline/lib/async_tracker') - - const traceContext = _getBeelineTraceContext(context) - const trace = beeline.startTrace({ - [schema.EVENT_TYPE]: 'boltzmann', - [schema.PACKAGE_VERSION]: '1.0.0', - [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, - [schema.TRACE_ID_SOURCE]: traceContext.source, - 'request.host': context.host, - 'request.original_url': context.url.href, - 'request.remote_addr': context.remote, - 'request.method': context.method, - 'request.scheme': context.url.protocol, - 'request.path': context.url.pathname, - 'request.query': context.url.search - }, - traceContext.traceId, - traceContext.parentSpanId, - traceContext.dataset) + */ - if (isDev()) { - context._honeycombTrace = trace - } + const rv = await runInContext() - if (traceContext.customContext) { - beeline.addContext(traceContext.customContext) - } + const handler: Handler = context.handler - if (!trace) return runInContext() + parentSpan.setAttribute( + SemanticAttributes.HTTP_STATUS_CODE, + String(context._response.statusCode) + ) + parentSpan.setAttribute( + SemanticAttributes.HTTP_ROUTE, + handler.route + ) + parentSpan.setAttribute( + SemanticAttributes.HTTP_METHOD, + handler.method + ) + parentSpan.setAttribute( + SemanticResourceAttributes.SERVICE_VERSION, + handler.version + ) - const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { - beeline.addContext({ - 'response.status_code': String(response.statusCode) + Object.entries(context.params).map(([key, value]) => { + parentSpan.setAttribute( + Honeycomb.paramAttribute(key), + value + ) }) + parentSpan.end() - beeline.addContext({ - 'request.route': context.handler.route, - 'request.method': context.handler.method, - 'request.version': context.handler.version - }) + return rv + } - const params = Object.entries(context.params).map(([key, value]) => { - return [`request.param.${key}`, value] - }) - beeline.addContext(Object.fromEntries(params)) + private defaultHeaderSources: string[] = [ 'x-honeycomb-trace', 'x-request-id' ] - beeline.finishTrace(trace) - }) + /* A beelines implementation of startTrace. + */ + async withBeelineTrace( + context: Context, + runInContext: () => Promise, + headerSources?: string[] + ): Promise { + const schema = require('honeycomb-beeline/lib/schema') + const tracker = require('honeycomb-beeline/lib/async_tracker') + + const traceContext = _getBeelineTraceContext(context) + const trace = beeline.startTrace({ + [schema.EVENT_TYPE]: 'boltzmann', + [schema.PACKAGE_VERSION]: '1.0.0', + [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, + [schema.TRACE_ID_SOURCE]: traceContext.source, + 'request.host': context.host, + 'request.original_url': context.url.href, + 'request.remote_addr': context.remote, + 'request.method': context.method, + 'request.scheme': context.url.protocol, + 'request.path': context.url.pathname, + 'request.query': context.url.search + }, + traceContext.traceId, + traceContext.parentSpanId, + traceContext.dataset) + + if (isDev()) { + context._honeycombTrace = trace + } - const result = await runInContext() + if (traceContext.customContext) { + beeline.addContext(traceContext.customContext) + } - boundFinisher(tracker.getTracked()) + if (!trace) return runInContext() - return result + const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { + beeline.addContext({ + 'response.status_code': String(response.statusCode) + }) - function _getBeelineTraceContext (context: Context) { - const source = (headerSources || defaultHeaderSources).find(header => header in context.headers) + beeline.addContext({ + 'request.route': context.handler.route, + 'request.method': context.handler.method, + 'request.version': context.handler.version + }) - if (!source || !context.headers[source]) { - return {} - } + const params = Object.entries(context.params).map(([key, value]) => { + return [`request.param.${key}`, value] + }) + beeline.addContext(Object.fromEntries(params)) + + beeline.finishTrace(trace) + }) + + const result = await runInContext() - if (source === 'x-honeycomb-trace') { - const data = beeline.unmarshalTraceContext(context.headers[source]) + boundFinisher(tracker.getTracked()) - if (!data) { + const _headerSources = headerSources || this.defaultHeaderSources + + return result + + function _getBeelineTraceContext (context: Context) { + const source = _headerSources.find((header: string) => header in context.headers) + + if (!source || !context.headers[source]) { return {} } - return Object.assign({}, data, { source: `${source} http header` }) - } + if (source === 'x-honeycomb-trace') { + const data = beeline.unmarshalTraceContext(context.headers[source]) - return { - traceId: context.headers[source], - source: `${source} http header` + if (!data) { + return {} + } + + return Object.assign({}, data, { source: `${source} http header` }) + } + + return { + traceId: context.headers[source], + source: `${source} http header` + } } } -} -async function withSpan(name: string, runInContext: () => Promise): Promise { - if (!otelEnabled) { - // Call legacy beelines implementation - return withBeelineSpan(name, runInContext) - } + public async withSpan(name: string, runInContext: () => Promise): Promise { + if (!this.features.otel) { + // Call legacy beelines implementation + return this.withBeelineSpan(name, runInContext) + } - const activeContext = traceContext.active() - const tracer = getTracer() - const span = tracer.startSpan(name) - trace.setSpan(activeContext, span) + const span = this.tracer.startSpan(name) + trace.setSpan(traceContext.active(), span) - const result = await runInContext() + const result = await runInContext() - span.end() + span.end() - return result -} + return result + } -async function withBeelineSpan(name: string, runInContext: () => Promise): Promise { - const span = beeline.startSpan({ name }) + private async withBeelineSpan(name: string, runInContext: () => Promise): Promise { + const span = beeline.startSpan({ name }) - const result = await runInContext() + const result = await runInContext() - beeline.finishSpan(span) + beeline.finishSpan(span) - return result + return result + } } export { beeline, - enabled, - factories, - Factories, - getOptionsFromEnv, - init, - initialized, - Options, - otelEnabled, - start, - started, - withSpan, - withTrace + Metadata, + credentials, + traceContext, + defaultTextMapSetter, + ROOT_CONTEXT, + Sampler, + trace, + Tracer, + ParentBasedSampler, + TraceIdRatioBasedSampler, + W3CTraceContextPropagator, + OTLPTraceExporter, + Resource, + NodeSDK, + SimpleSpanProcessor, + SpanProcessor, + NodeTracerProvider, + SemanticAttributes, + SemanticResourceAttributes, + Instrumentation, + DnsInstrumentation, + HttpInstrumentation, + // {% if redis %} + RedisInstrumentation, + // {% endif %} + // {% if postgres %} + PgInstrumentation + // {% endif %} } -void `{% if selftest %}`; +export { + defaultOTLPFactories, + Honeycomb, + HoneycombOptions, + HoneycombFeatures, + OTLPFactories, + OTLPFactoryOverrides, +} + +void `{% if selftest %}` import tap from 'tap' type Test = (typeof tap.Test)["prototype"] @@ -556,62 +684,71 @@ type Test = (typeof tap.Test)["prototype"] if (require.main === module) { const { test } = tap - test('getOptionsFromEnv', async (t: Test) => { - t.test('options.enabled', async (assert: Test) => { + test('Honeycomb.parseEnv', async (t: Test) => { + t.test('options.disable', async (assert: Test) => { assert.equal( - getOptionsFromEnv({}).enabled, - false, + Honeycomb.parseEnv('boltzmann', {}).disable, + true, 'should be disabled when no env vars' ) assert.equal( - getOptionsFromEnv({HONEYCOMB_WRITEKEY: ''}).enabled, - false, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).disable, + true, 'should be disabled when env vars are blank' ) assert.equal( - getOptionsFromEnv({HONEYCOMB_WRITEKEY: 'some write key'}).enabled, - true, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).disable, + false, 'should be enabled when write key is defined' ) }) t.test('options.otel', async (assert: Test) => { assert.equal( - getOptionsFromEnv({}).otel, + Honeycomb.parseEnv('boltzmann', {}).otel, false, 'should not use otel when no env vars' ) assert.equal( - getOptionsFromEnv({HONEYCOMB_WRITEKEY: ''}).otel, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otel, false, 'should not use otel when env vars are blank' ) assert.equal( - getOptionsFromEnv({HONEYCOMB_WRITEKEY: 'some write key'}).otel, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otel, false, 'should not use otel when only write key is defined' ) assert.equal( - getOptionsFromEnv({ - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'https://refinery.website' - }).otel, + Honeycomb.parseEnv( + 'boltzmann', + { + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'https://refinery.website' + } + ).otel, false, 'should not use otel when API host is not grpc://' ) assert.equal( - getOptionsFromEnv({ - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'grpc://otel.website' - }).otel, + Honeycomb.parseEnv( + 'boltzmann', + { + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'grpc://otel.website' + } + ).otel, true, '*should* use otel when API host is grpc://' ) assert.equal( - getOptionsFromEnv({ - HONEYCOMB_WRITEKEY: '', - HONEYCOMB_API_HOST: 'grpc://otel.website' - }).otel, + Honeycomb.parseEnv( + 'boltzmann', + { + HONEYCOMB_WRITEKEY: '', + HONEYCOMB_API_HOST: 'grpc://otel.website' + } + ).otel, false, 'should not use otel when write key is empty, even if API host is grpc://' ) @@ -619,28 +756,33 @@ if (require.main === module) { t.test('options.sampleRate', async (assert: Test) => { assert.equal( - getOptionsFromEnv({}).sampleRate, + Honeycomb.parseEnv('boltzmann', {}).sampleRate, 1, 'should be 1 by default' ) assert.equal( - getOptionsFromEnv({ - HONEYCOMB_SAMPLE_RATE: '1' - }).sampleRate, + Honeycomb.parseEnv( + 'boltzmann', + { HONEYCOMB_SAMPLE_RATE: '1' } + ).sampleRate, 1, 'should be 1 if defined as 1' ) assert.equal( - getOptionsFromEnv({ - HONEYCOMB_SAMPLE_RATE: '0.5' - }).sampleRate, + Honeycomb.parseEnv( + 'boltzmann', + { + HONEYCOMB_SAMPLE_RATE: '0.5' + } + ).sampleRate, 0.5, 'should be 0.5 if defined as 0.5' ) assert.equal( - getOptionsFromEnv({ - HONEYCOMB_SAMPLE_RATE: 'pony' - }).sampleRate, + Honeycomb.parseEnv( + 'boltzmann', + { HONEYCOMB_SAMPLE_RATE: 'pony' } + ).sampleRate, 1, 'should be 1 if not parseable' ) @@ -648,12 +790,13 @@ if (require.main === module) { t.test('options.apiHost', async (assert: Test) => { assert.equal( - getOptionsFromEnv({}).apiHost, + Honeycomb.parseEnv('boltzmann', {}).apiHost, null, 'should be null when no env var' ) assert.equal( - getOptionsFromEnv({ + Honeycomb.parseEnv( + 'boltzmann',{ HONEYCOMB_API_HOST: 'https://example.com' }).apiHost, 'https://example.com', @@ -672,7 +815,10 @@ if (require.main === module) { } t.test('metadata', async (assert: Test) => { - const metadata = factories.metadata(options) + const metadata = defaultOTLPFactories.metadata( + 'some write key', + 'some dataset' + ) assert.same( metadata.get('x-honeycomb-team'), ['some write key'], @@ -687,23 +833,23 @@ if (require.main === module) { t.test('sampler', async (assert: Test) => { assert.ok( - factories.sampler(1) instanceof AlwaysOnSampler, - 'sampler(1) should be an AlwaysOnSampler' + defaultOTLPFactories.sampler(1) instanceof ParentBasedSampler, + 'sampler(1) should be a ParentBasedSampler' ) assert.ok( - factories.sampler(0) instanceof AlwaysOffSampler, - 'sampler(0) should be an AlwaysOffSampler' + defaultOTLPFactories.sampler(0) instanceof ParentBasedSampler, + 'sampler(0) should be a ParentBasedSampler' ) assert.ok( - factories.sampler(0.5) instanceof ParentBasedSampler, + defaultOTLPFactories.sampler(0.5) instanceof ParentBasedSampler, 'sampler(0.5) should be a ParentBasedSampler' ) }) test('tracerProvider', async (assert: Test) => { - const sampler = factories.sampler(1) + const sampler = defaultOTLPFactories.sampler(1) assert.doesNotThrow( - () => factories.tracerProvider(sampler), + () => defaultOTLPFactories.tracerProvider(sampler), 'should create a tracer provider' ) }) @@ -711,27 +857,33 @@ if (require.main === module) { test('traceExporter', async (assert: Test) => { assert.doesNotThrow(() => { const url = 'grpc://example.com' - const metadata = factories.metadata(options) + const metadata = defaultOTLPFactories.metadata( + 'some write key', + 'some dataset' + ) - factories.traceExporter(url, metadata) + defaultOTLPFactories.traceExporter(url, metadata) }, 'should create a trace exporter') }) test('spanProcessor', async (assert: Test) => { assert.doesNotThrow(() => { - const exporter = factories.traceExporter( + const exporter = defaultOTLPFactories.traceExporter( 'grpc://example.com', - factories.metadata(options) + defaultOTLPFactories.metadata( + 'some write key', + 'some dataset' + ) ) - factories.spanProcessor(exporter) + defaultOTLPFactories.spanProcessor(exporter) }, 'should create a span processor') }) test('instrumentations', async (assert: Test) => { // expected instrumentations: dns, node core, postgres, redis assert.equal( - factories.instrumentations().length, + defaultOTLPFactories.instrumentations().length, 4, 'should create 4 instrumentations (dns, http, postgres, redis)' ) @@ -740,12 +892,15 @@ if (require.main === module) { test('sdk', async (assert: Test) => { // run the init function assert.doesNotThrow(() => { - const exporter = factories.traceExporter( + const exporter = defaultOTLPFactories.traceExporter( 'grpc://example.com', - factories.metadata(options) + defaultOTLPFactories.metadata( + 'some write key', + 'some dataset' + ) ) - const instrumentations = factories.instrumentations() - factories.sdk('boltzmann', instrumentations, exporter) + const instrumentations = defaultOTLPFactories.instrumentations() + defaultOTLPFactories.sdk('boltzmann', instrumentations, exporter) }, 'should create an sdk') }) }) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index de6f9f45..1629e8a4 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -30,8 +30,15 @@ function _getServiceName() { import assert from 'assert' -void `{% if honeycomb %}`; -import * as honeycomb from './honeycomb' +void `{% if honeycomb %}` +// Honeycomb instrumentation is in index.tera *before* the prelude. +// This is because instrumentation needs to be installed prior to +// instrumented modules being imported. In selftest mode the file +// exports its main object, but otherwise the honeycomb object +// should be defined. +void `{% if selftest %}` +import { Honeycomb } from './honeycomb' +void `{% endif %}` if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -53,7 +60,9 @@ if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET } -honeycomb.init(serviceName, honeycomb.getOptionsFromEnv(process.env)) +const honeycomb: Honeycomb = Honeycomb.fromEnv(serviceName, process.env); + +honeycomb.init() import onHeaders from 'on-headers' void `{% endif %}`; diff --git a/templates/boltzmann/index.tera b/templates/boltzmann/index.tera index bc113f3e..afe63700 100644 --- a/templates/boltzmann/index.tera +++ b/templates/boltzmann/index.tera @@ -1,6 +1,7 @@ #!/usr/bin/env node {% if not selftest %}/* eslint-disable */{% endif %} {% if not selftest %}/* c8 ignore file */{% endif %} +{% include "boltzmann/core/honeycomb.ts" %} {% include "boltzmann/core/prelude.ts" %} {# core functions (middleware, body parsing, and routing support) #} diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 116066a6..b3f1fcf8 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,6 +1,6 @@ void `{% if selftest %}`; export { trace, honeycombMiddlewareSpans } -import * as honeycomb from '../core/honeycomb' +import { honeycomb } from '../core/prelude' import { Handler } from '../core/middleware' import { Context } from '../data/context' import onHeaders from 'on-headers' @@ -24,7 +24,7 @@ function trace ({ } function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { - if (!honeycomb.enabled) { + if (honeycomb.options.disable) { return (next: Handler) => (context: Context) => next(context) } From b09d2d834684938686eee7d829af3db0c4bd55e0 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 27 Jan 2022 19:15:26 -0500 Subject: [PATCH 038/167] build succeeds! but beelines are broken in the middleware layer, womp womp --- templates/boltzmann/core/honeycomb.ts | 408 +++++++++++++------------- templates/boltzmann/core/prelude.ts | 25 +- 2 files changed, 227 insertions(+), 206 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 0fcf0541..8fbea326 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -12,40 +12,33 @@ to and different from that one: 1) Dependencies specific to honeycomb have to be imported and exported as in the prelude, for the same reasons. -2) Dependencies not specific to honeycomb should be required at the - scope nearest to their use. This is so the namespace isn't polluted - in the prelude. +2) Dependencies required for honeycomb but used generally should be at the + TOP of this file and in the self-test block at the TOP of prelude.ts +2) Dependencies should be imported as *, to minimize the impact on the + boltzmann namespace and make all the OpenTelemetry library exports + accessible. Exceptions may be made for modules with only one meaningful + import Good luck! #}*/ +// Dependencies used downstream - it's worth your time to look at how these +// are treated in prelude.ts! +import isDev from 'are-we-dev' + // We continue to support beelines... import beeline from 'honeycomb-beeline' // ...but are migrating to OpenTelemetry: -import { Metadata, credentials } from '@grpc/grpc-js' -import { - context as traceContext, - defaultTextMapSetter, - ROOT_CONTEXT, - Sampler, - trace, - Tracer -} from '@opentelemetry/api' -import { - ParentBasedSampler, - TraceIdRatioBasedSampler, - W3CTraceContextPropagator -} from '@opentelemetry/core' +import * as grpc from '@grpc/grpc-js' +import * as otlpAPI from '@opentelemetry/api' +import * as otlpCore from '@opentelemetry/core' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' -import { Resource } from '@opentelemetry/resources' -import { NodeSDK } from '@opentelemetry/sdk-node' -import { SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base' +import * as otlpResources from '@opentelemetry/resources' +import { NodeSDK as OtlpSDK } from '@opentelemetry/sdk-node' +import * as otlpTraceBase from '@opentelemetry/sdk-trace-base' import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import { - SemanticAttributes, - SemanticResourceAttributes -} from '@opentelemetry/semantic-conventions' +import * as otlpSemanticConventions from '@opentelemetry/semantic-conventions' // We include node core instrumentation, as well as redis // and postgres instrumentation if those respective features @@ -65,30 +58,31 @@ import { // instrumentations: // // * undici -import { Instrumentation } from '@opentelemetry/instrumentation' -import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' -import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' +import { Instrumentation as OtlpInstrumentation } from '@opentelemetry/instrumentation' +import { DnsInstrumentation as OtlpDnsInstrumentation } from '@opentelemetry/instrumentation-dns' +import { HttpInstrumentation as OtlpHttpInstrumentation } from '@opentelemetry/instrumentation-http' void `{% if redis %}`; -import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis' +import { RedisInstrumentation as OtlpRedisInstrumentation } from '@opentelemetry/instrumentation-redis' void `{% endif %}` void `{% if postgres %}` -import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' +import { PgInstrumentation as OtlpPgInstrumentation } from '@opentelemetry/instrumentation-pg' void `{% endif %}` + // TODO: Sort through these and find a good answer void `{% if selftest %}` -import assert from 'assert' import { ServerResponse } from 'http' -// TODO: Imports from internal modules will -import { Context as Context } from '../data/context' +import { Context } from '../data/context' import { Handler } from './middleware' -import isDev from 'are-we-dev' void `{% endif %}` +class HoneycombError extends Error { +} + // Arguments passed to Honeycomb's constructor interface HoneycombOptions { serviceName: string @@ -96,8 +90,8 @@ interface HoneycombOptions { // disabled disable?: boolean - // When true, Do Otel - otel?: boolean + // When true, Do Otlp + otlp?: boolean // The Honeycomb write key and dataset writeKey?: string | null @@ -110,11 +104,11 @@ interface HoneycombOptions { sampleRate?: number } -// Whether or not otel, beelines and honeycomb are enabled +// Whether or not otlp, beelines and honeycomb are enabled interface HoneycombFeatures { honeycomb: boolean beeline: boolean - otel: boolean + otlp: boolean } // There's a lot of plumbing that happens when setting up @@ -124,22 +118,22 @@ interface HoneycombFeatures { // They're exposed on the Honeycomb class but in a nested // namespace. interface OTLPFactories { - metadata: (writeKey: string, dataset: string) => Metadata - sampler: (sampleRate: number) => Sampler - tracerProvider: (sampler: Sampler) => NodeTracerProvider - traceExporter: (url: string, metadata: Metadata) => OTLPTraceExporter - spanProcessor: (traceExporter: OTLPTraceExporter) => SpanProcessor - instrumentations: () => Instrumentation[] + metadata: (writeKey: string, dataset: string) => grpc.Metadata + sampler: (sampleRate: number) => otlpAPI.Sampler + tracerProvider: (sampler: otlpAPI.Sampler) => NodeTracerProvider + traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter + spanProcessor: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor + instrumentations: () => OtlpInstrumentation[] sdk: ( serviceName: string, - instrumentations: Instrumentation[], + instrumentations: OtlpInstrumentation[], traceExporter: OTLPTraceExporter - ) => NodeSDK + ) => OtlpSDK } -const defaultOTLPFactories: OTLPFactories = { - metadata (writeKey: string, dataset: string): Metadata { - const metadata = new Metadata() +const defaultOtlpFactories: OTLPFactories = { + metadata (writeKey: string, dataset: string): grpc.Metadata { + const metadata = new grpc.Metadata() metadata.set('x-honeycomb-team', writeKey) metadata.set('x-honeycomb-dataset', dataset) return metadata @@ -147,47 +141,47 @@ const defaultOTLPFactories: OTLPFactories = { // create a Sampler object, which is used to tune // the sampling rate - sampler (sampleRate: number): Sampler { - return new ParentBasedSampler({ - root: new TraceIdRatioBasedSampler(sampleRate) + sampler (sampleRate: number): otlpAPI.Sampler { + return new otlpCore.ParentBasedSampler({ + root: new otlpCore.TraceIdRatioBasedSampler(sampleRate) }) }, // It provides tracers! - tracerProvider (sampler: Sampler): NodeTracerProvider { + tracerProvider (sampler: otlpAPI.Sampler): NodeTracerProvider { return new NodeTracerProvider({ sampler }) }, // Export traces to an OTLP endpoint with GRPC - traceExporter (url: string, metadata: Metadata): OTLPTraceExporter { + traceExporter (url: string, metadata: grpc.Metadata): OTLPTraceExporter { return new OTLPTraceExporter({ url, - credentials: credentials.createSsl(), + credentials: grpc.credentials.createSsl(), metadata }) }, // Process spans, using the supplied trace exporter to // do the actual exporting. - spanProcessor (traceExporter: OTLPTraceExporter): SpanProcessor { + spanProcessor (traceExporter: OTLPTraceExporter): otlpTraceBase.SpanProcessor { // There's a bug in the types here - SimpleSpanProcessor doesn't // take the optional Context argument in its signature and // typescript is understandably cranky about that. - return (new SimpleSpanProcessor(traceExporter) as unknown) + return (new otlpTraceBase.SimpleSpanProcessor(traceExporter) as unknown) }, instrumentations () { - let is: Instrumentation[] = [ - new DnsInstrumentation({}), - new HttpInstrumentation({}), + let is: OtlpInstrumentation[] = [ + new OtlpDnsInstrumentation({}), + new OtlpHttpInstrumentation({}), ] void `{% if redis %}` - is.push(new RedisInstrumentation({})) + is.push(new OtlpRedisInstrumentation({})) void `{% endif %}` void `{% if postgres %}` - is.push(new PgInstrumentation({})) + is.push(new OtlpPgInstrumentation({})) void `{% endif %}` return is @@ -198,12 +192,12 @@ const defaultOTLPFactories: OTLPFactories = { // This is that singleton! sdk ( serviceName: string, - instrumentations: Instrumentation[], + instrumentations: OtlpInstrumentation[], traceExporter: OTLPTraceExporter - ): NodeSDK { - return new NodeSDK({ - resource: new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: serviceName + ): OtlpSDK { + return new OtlpSDK({ + resource: new otlpResources.Resource({ + [otlpSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName }), traceExporter, instrumentations @@ -216,17 +210,17 @@ const defaultOTLPFactories: OTLPFactories = { // are created. The Honeycomb class allows for // passing overrides into its constructor. interface OTLPFactoryOverrides { - metadata?: (writeKey: string, dataset: string) => Metadata - sampler?: (sampleRate: Number) => Sampler - tracerProvider?: (sampler: Sampler) => NodeTracerProvider - traceExporter?: (url: string, metadata: Metadata) => OTLPTraceExporter - spanProcessor?: (traceExporter: OTLPTraceExporter) => SpanProcessor - instrumentations?: () => Instrumentation[]; + metadata?: (writeKey: string, dataset: string) => grpc.Metadata + sampler?: (sampleRate: Number) => otlpAPI.Sampler + tracerProvider?: (sampler: otlpAPI.Sampler) => NodeTracerProvider + traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter + spanProcessor?: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor + instrumentations?: () => OtlpInstrumentation[]; sdk?: ( serviceName: string, - instrumentations: Instrumentation[], + instrumentations: OtlpInstrumentation[], traceExporter: OTLPTraceExporter - ) => NodeSDK; + ) => OtlpSDK; } class Honeycomb { @@ -247,7 +241,7 @@ class Honeycomb { public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { // If there's no write key we won't get very far anyway const disable = !env.HONEYCOMB_WRITEKEY - let otel: boolean = false + let otlp: boolean = false const writeKey = env.HONEYCOMB_WRITEKEY || null const dataset = env.HONEYCOMB_DATASET || null const apiHost = env.HONEYCOMB_API_HOST || null @@ -256,7 +250,7 @@ class Honeycomb { sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) if (isNaN(sampleRate)) { - console.warn( + Honeycomb.log( `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` + 'defaulting to 1' ) @@ -267,13 +261,13 @@ class Honeycomb { // OpenTelemetry. There are prior uses of this variable here but // they should've been using https://. if (!disable && apiHost) { - otel = /^grpc:\/\//.test(apiHost) + otlp = /^grpc:\/\//.test(apiHost) } return { serviceName, disable, - otel, + otlp, writeKey, dataset, apiHost, @@ -282,18 +276,24 @@ class Honeycomb { } private getWriteKey (): string { - assert(this.features.honeycomb && this.options.writeKey) - return this.options.writeKey as string + if (this.features.honeycomb && this.options.writeKey) { + return this.options.writeKey + } + throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!') } private getDataset () { - assert(this.features.honeycomb && this.options.dataset) - return this.options.dataset as string + if (this.features.honeycomb && this.options.dataset) { + return this.options.dataset + } + throw new HoneycombError('HONEYCOMB_DATASET is undefined!') } private getApiHost () { - assert(this.features.honeycomb && this.options.apiHost) - return this.options.apiHost as string + if (this.features.honeycomb && this.options.apiHost) { + return this.options.apiHost + } + throw new HoneycombError('HONEYCOMB_API_HOST is undefined!') } public options: HoneycombOptions @@ -302,9 +302,8 @@ class Honeycomb { public initialized: boolean public started: boolean - public sdk: NodeSDK | null - public tracer: Tracer - public static beeline: typeof beeline = beeline + public sdk: OtlpSDK | null + public tracer: otlpAPI.Tracer constructor( options: HoneycombOptions, @@ -313,19 +312,31 @@ class Honeycomb { this.options = options this.features = { honeycomb: !options.disable, - beeline: !options.disable && !options.otel, - otel: options.otel || false + beeline: !options.disable && !options.otlp, + otlp: options.otlp || false } this.initialized = false this.started = false this.sdk = null - this.tracer = trace.getTracer('boltzmann', '1.0.0') + this.tracer = otlpAPI.trace.getTracer('boltzmann', '1.0.0') this.factories = { - ...defaultOTLPFactories, + ...defaultOtlpFactories, ...(overrides || {}) } } + public static log(message: any): void { + // There's a good likelihood that bole hasn't been configured yet, + // so we use console here. We also want honeycomb to fail gracefully + // as nothing is more embarrassing than your service getting taken + // down by instrumentation, so we only log in live dev and in debug. + void `{% if not selftest %}` + if (process.env.DEBUG || isDev()) { + console.warn(message); + } + void `{% endif %}` + } + // Some non-standard OpenTelemetry attributes we add in // the middlewares... @@ -335,45 +346,54 @@ class Honeycomb { return `boltzmann.request.param.${param}` } - // Initialize Honeycomb! Stands up the otel node SDK if enabled, + // Initialize Honeycomb! Stands up the otlp node SDK if enabled, // otherwise sets up the beeline library. // This needs to occur before any imports you want instrumentation // to be aware of. public init(): void { - if (!this.features.honeycomb) return + try { + const writeKey = this.getWriteKey(); + const dataset = this.getDataset(); + const sampleRate = this.options.sampleRate || 1; + const serviceName = this.options.serviceName; + + if (!this.features.honeycomb) { + console.log("calling the beeline function") + beeline({ writeKey, dataset, sampleRate, serviceName }) + return + } - const writeKey = this.getWriteKey() - const dataset = this.getDataset() - const sampleRate = this.options.sampleRate || 1 - const serviceName = this.options.serviceName + const f = this.factories + const apiHost: string = this.getApiHost() - if (!this.features.otel) { - beeline({ writeKey, dataset, sampleRate, serviceName }) - return - } + const metadata: grpc.Metadata = f.metadata(writeKey, dataset) - const f = this.factories - const apiHost: string = this.getApiHost() + const sampler: otlpAPI.Sampler = f.sampler(sampleRate) + const exporter = f.traceExporter(apiHost, metadata) + const processor = f.spanProcessor(exporter) + const instrumentations = f.instrumentations() - const metadata: Metadata = f.metadata(writeKey, dataset) + const provider: NodeTracerProvider = f.tracerProvider(sampler) + provider.addSpanProcessor(processor) + provider.register() - const sampler: Sampler = f.sampler(sampleRate) - const exporter = f.traceExporter(apiHost, metadata) - const processor = f.spanProcessor(exporter) - const instrumentations = f.instrumentations() + this.sdk = f.sdk( + serviceName, + instrumentations, + exporter + ) - const provider: NodeTracerProvider = f.tracerProvider(sampler) - provider.addSpanProcessor(processor) - provider.register() + this.initialized = true + } catch (err) { + if (err instanceof HoneycombError) { + // Honeycomb.log(err); + return; + } + throw err; + } + } - this.sdk = f.sdk( - serviceName, - instrumentations, - exporter - ) - this.initialized = true - } // Start the OpenTelemetry SDK. If using beelines, this is // a no-op. This needs to happen before anything happens in @@ -383,7 +403,7 @@ class Honeycomb { const sdk = this.sdk async function die(err: Error) { - console.error(err.stack) + Honeycomb.log(err); exitCode = 1 await shutdown() } @@ -393,7 +413,7 @@ class Honeycomb { try { await sdk.shutdown() } catch (err) { - console.error(err.stack) + Honeycomb.log(err) } } process.exit(exitCode) @@ -423,7 +443,7 @@ class Honeycomb { } if (headerSources) { - console.warn('trace headerSources are a beeline-only feature') + Honeycomb.log('trace headerSources are a beeline-only feature') } /* @@ -446,12 +466,12 @@ class Honeycomb { `${context.method} ${context.url.pathname}${context.url.search}`, { attributes: { - [SemanticAttributes.HTTP_HOST]: context.host, - [SemanticAttributes.HTTP_URL]: context.url.href, - [SemanticAttributes.NET_PEER_IP]: context.remote, - [SemanticAttributes.HTTP_METHOD]: context.method, - [SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + [otlpSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, + [otlpSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, + [otlpSemanticConventions.SemanticAttributes.NET_PEER_IP]: context.remote, + [otlpSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, + [otlpSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, // TODO: Honeycomb.Attributes obvs [Honeycomb.OTEL_REQ_QUERY]: context.url.search } @@ -460,24 +480,24 @@ class Honeycomb { // this propagator takes care of extracting trace parent // and state from request headers (and so on) - const propagator = new W3CTraceContextPropagator() + const propagator = new otlpCore.W3CTraceContextPropagator() propagator.inject( - trace.setSpanContext( - ROOT_CONTEXT, + otlpAPI.trace.setSpanContext( + otlpAPI.ROOT_CONTEXT, parentSpan.spanContext() ), carrier, - defaultTextMapSetter + otlpAPI.defaultTextMapSetter ) /* TODO: Do I need to create and set a context? No, right? // create a parent active context const parentContext = propagator.extract( - ROOT_CONTEXT, + otlpAPI.ROOT_CONTEXT, carrier, - defaultTextMapGetter + otlpAPI.defaultTextMapGetter ) // set the active context @@ -490,19 +510,19 @@ class Honeycomb { const handler: Handler = context.handler parentSpan.setAttribute( - SemanticAttributes.HTTP_STATUS_CODE, + otlpSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, String(context._response.statusCode) ) parentSpan.setAttribute( - SemanticAttributes.HTTP_ROUTE, + otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE, handler.route ) parentSpan.setAttribute( - SemanticAttributes.HTTP_METHOD, + otlpSemanticConventions.SemanticAttributes.HTTP_METHOD, handler.method ) parentSpan.setAttribute( - SemanticResourceAttributes.SERVICE_VERSION, + otlpSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, handler.version ) @@ -528,7 +548,7 @@ class Honeycomb { ): Promise { const schema = require('honeycomb-beeline/lib/schema') const tracker = require('honeycomb-beeline/lib/async_tracker') - + const _headerSources = headerSources || this.defaultHeaderSources const traceContext = _getBeelineTraceContext(context) const trace = beeline.startTrace({ [schema.EVENT_TYPE]: 'boltzmann', @@ -580,7 +600,6 @@ class Honeycomb { boundFinisher(tracker.getTracked()) - const _headerSources = headerSources || this.defaultHeaderSources return result @@ -609,13 +628,13 @@ class Honeycomb { } public async withSpan(name: string, runInContext: () => Promise): Promise { - if (!this.features.otel) { + if (!this.features.otlp) { // Call legacy beelines implementation return this.withBeelineSpan(name, runInContext) } const span = this.tracer.startSpan(name) - trace.setSpan(traceContext.active(), span) + otlpAPI.trace.setSpan(otlpAPI.context.active(), span) const result = await runInContext() @@ -637,39 +656,30 @@ class Honeycomb { export { beeline, - Metadata, - credentials, - traceContext, - defaultTextMapSetter, - ROOT_CONTEXT, - Sampler, - trace, - Tracer, - ParentBasedSampler, - TraceIdRatioBasedSampler, - W3CTraceContextPropagator, + grpc, + otlpAPI, + otlpCore, OTLPTraceExporter, - Resource, - NodeSDK, - SimpleSpanProcessor, - SpanProcessor, + otlpResources, + OtlpSDK, + otlpTraceBase, NodeTracerProvider, - SemanticAttributes, - SemanticResourceAttributes, - Instrumentation, - DnsInstrumentation, - HttpInstrumentation, + otlpSemanticConventions, + OtlpInstrumentation, + OtlpDnsInstrumentation, + OtlpHttpInstrumentation, // {% if redis %} - RedisInstrumentation, + OtlpRedisInstrumentation, // {% endif %} // {% if postgres %} - PgInstrumentation + OtlpPgInstrumentation // {% endif %} } export { - defaultOTLPFactories, + defaultOtlpFactories, Honeycomb, + HoneycombError, HoneycombOptions, HoneycombFeatures, OTLPFactories, @@ -703,21 +713,21 @@ if (require.main === module) { ) }) - t.test('options.otel', async (assert: Test) => { + t.test('options.otlp', async (assert: Test) => { assert.equal( - Honeycomb.parseEnv('boltzmann', {}).otel, + Honeycomb.parseEnv('boltzmann', {}).otlp, false, - 'should not use otel when no env vars' + 'should not use otlp when no env vars' ) assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otel, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otlp, false, - 'should not use otel when env vars are blank' + 'should not use otlp when env vars are blank' ) assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otel, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otlp, false, - 'should not use otel when only write key is defined' + 'should not use otlp when only write key is defined' ) assert.equal( Honeycomb.parseEnv( @@ -726,31 +736,31 @@ if (require.main === module) { HONEYCOMB_WRITEKEY: 'some write key', HONEYCOMB_API_HOST: 'https://refinery.website' } - ).otel, + ).otlp, false, - 'should not use otel when API host is not grpc://' + 'should not use otlp when API host is not grpc://' ) assert.equal( Honeycomb.parseEnv( 'boltzmann', { HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'grpc://otel.website' + HONEYCOMB_API_HOST: 'grpc://otlp.website' } - ).otel, + ).otlp, true, - '*should* use otel when API host is grpc://' + '*should* use otlp when API host is grpc://' ) assert.equal( Honeycomb.parseEnv( 'boltzmann', { HONEYCOMB_WRITEKEY: '', - HONEYCOMB_API_HOST: 'grpc://otel.website' + HONEYCOMB_API_HOST: 'grpc://otlp.website' } - ).otel, + ).otlp, false, - 'should not use otel when write key is empty, even if API host is grpc://' + 'should not use otlp when write key is empty, even if API host is grpc://' ) }) @@ -807,7 +817,7 @@ if (require.main === module) { test('factories', async (t: Test) => { const options = { enabled: true, - otel: true, + otlp: true, writeKey: 'some write key', dataset: 'some dataset', apiHost: 'grpc://example.com', @@ -815,7 +825,7 @@ if (require.main === module) { } t.test('metadata', async (assert: Test) => { - const metadata = defaultOTLPFactories.metadata( + const metadata = defaultOtlpFactories.metadata( 'some write key', 'some dataset' ) @@ -833,23 +843,23 @@ if (require.main === module) { t.test('sampler', async (assert: Test) => { assert.ok( - defaultOTLPFactories.sampler(1) instanceof ParentBasedSampler, - 'sampler(1) should be a ParentBasedSampler' + defaultOtlpFactories.sampler(1) instanceof otlpCore.ParentBasedSampler, + 'sampler(1) should be a otlpCore.ParentBasedSampler' ) assert.ok( - defaultOTLPFactories.sampler(0) instanceof ParentBasedSampler, - 'sampler(0) should be a ParentBasedSampler' + defaultOtlpFactories.sampler(0) instanceof otlpCore.ParentBasedSampler, + 'sampler(0) should be a otlpCore.ParentBasedSampler' ) assert.ok( - defaultOTLPFactories.sampler(0.5) instanceof ParentBasedSampler, - 'sampler(0.5) should be a ParentBasedSampler' + defaultOtlpFactories.sampler(0.5) instanceof otlpCore.ParentBasedSampler, + 'sampler(0.5) should be a otlpCore.ParentBasedSampler' ) }) test('tracerProvider', async (assert: Test) => { - const sampler = defaultOTLPFactories.sampler(1) + const sampler = defaultOtlpFactories.sampler(1) assert.doesNotThrow( - () => defaultOTLPFactories.tracerProvider(sampler), + () => defaultOtlpFactories.tracerProvider(sampler), 'should create a tracer provider' ) }) @@ -857,33 +867,33 @@ if (require.main === module) { test('traceExporter', async (assert: Test) => { assert.doesNotThrow(() => { const url = 'grpc://example.com' - const metadata = defaultOTLPFactories.metadata( + const metadata = defaultOtlpFactories.metadata( 'some write key', 'some dataset' ) - defaultOTLPFactories.traceExporter(url, metadata) + defaultOtlpFactories.traceExporter(url, metadata) }, 'should create a trace exporter') }) test('spanProcessor', async (assert: Test) => { assert.doesNotThrow(() => { - const exporter = defaultOTLPFactories.traceExporter( + const exporter = defaultOtlpFactories.traceExporter( 'grpc://example.com', - defaultOTLPFactories.metadata( + defaultOtlpFactories.metadata( 'some write key', 'some dataset' ) ) - defaultOTLPFactories.spanProcessor(exporter) + defaultOtlpFactories.spanProcessor(exporter) }, 'should create a span processor') }) test('instrumentations', async (assert: Test) => { // expected instrumentations: dns, node core, postgres, redis assert.equal( - defaultOTLPFactories.instrumentations().length, + defaultOtlpFactories.instrumentations().length, 4, 'should create 4 instrumentations (dns, http, postgres, redis)' ) @@ -892,15 +902,15 @@ if (require.main === module) { test('sdk', async (assert: Test) => { // run the init function assert.doesNotThrow(() => { - const exporter = defaultOTLPFactories.traceExporter( + const exporter = defaultOtlpFactories.traceExporter( 'grpc://example.com', - defaultOTLPFactories.metadata( + defaultOtlpFactories.metadata( 'some write key', 'some dataset' ) ) - const instrumentations = defaultOTLPFactories.instrumentations() - defaultOTLPFactories.sdk('boltzmann', instrumentations, exporter) + const instrumentations = defaultOtlpFactories.instrumentations() + defaultOtlpFactories.sdk('boltzmann', instrumentations, exporter) }, 'should create an sdk') }) }) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 1629e8a4..6784371a 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -30,14 +30,27 @@ function _getServiceName() { import assert from 'assert' +/*{# + +/!\ ACHTUNG! /!\ + +Honeycomb instrumentation is in index.tera *before* the prelude. +This is because instrumentation needs to be installed prior to +instrumented modules being imported. + +In production, honeycomb.ts defines a class called Honeycomb, so we can +simply reach for it. In self-test mode, we need to import it, as is typical +for non-prelude files. + +For the most part, dependencies should be contained within honeycomb.ts. +HOWEVER, in cases where a honeycomb.ts dependency is also required by other +code, it must *also* be imported in a self-test scenario only. + +#}*/ void `{% if honeycomb %}` -// Honeycomb instrumentation is in index.tera *before* the prelude. -// This is because instrumentation needs to be installed prior to -// instrumented modules being imported. In selftest mode the file -// exports its main object, but otherwise the honeycomb object -// should be defined. void `{% if selftest %}` import { Honeycomb } from './honeycomb' +import isDev from 'are-we-dev' void `{% endif %}` if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { @@ -121,7 +134,6 @@ import type { RequestOptions as ShotRequestOptions, Listener, ResponseObject } f import querystring from 'querystring' import { promisify } from 'util' -import isDev from 'are-we-dev' import fmw from 'find-my-way' import accepts from 'accepts' import { promises as fs } from 'fs' @@ -222,4 +234,3 @@ export { querystring, ships, } -void `{% endif %}` From 1c028b8fa36e0bf3538883a890b0e89ee381aa76 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 28 Jan 2022 13:10:00 -0500 Subject: [PATCH 039/167] Don't try to open/close spans when honeycomb isn't even initialized --- templates/boltzmann/core/honeycomb.ts | 33 ++++++++++++++++----- templates/boltzmann/middleware/honeycomb.ts | 14 +++++++-- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 8fbea326..d1e1bedc 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -359,7 +359,9 @@ class Honeycomb { if (!this.features.honeycomb) { console.log("calling the beeline function") + console.log({ writeKey, dataset, sampleRate, serviceName }); beeline({ writeKey, dataset, sampleRate, serviceName }) + this.initialized = true return } @@ -425,8 +427,8 @@ class Honeycomb { process.once('uncaughtException', die) process.once('unhandledRejection', die) await sdk.start() - this.started = true } + this.started = true } // Create a trace, call the runInContext function, then close the @@ -437,7 +439,12 @@ class Honeycomb { runInContext: () => Promise, headerSources?: string[] ): Promise { - if (!this.features.honeycomb) { + if (!this.features.honeycomb || !this.initialized) { + // Don't do anything but run the callback + return runInContext() + } + + if (!this.features.otlp) { // Call legacy beelines implementation return this.withBeelineTrace(context, runInContext, headerSources) } @@ -505,6 +512,7 @@ class Honeycomb { */ + // giddyup! const rv = await runInContext() const handler: Handler = context.handler @@ -546,6 +554,10 @@ class Honeycomb { runInContext: () => Promise, headerSources?: string[] ): Promise { + if (!this.features.honeycomb || !this.initialized) { + return runInContext() + } + const schema = require('honeycomb-beeline/lib/schema') const tracker = require('honeycomb-beeline/lib/async_tracker') const _headerSources = headerSources || this.defaultHeaderSources @@ -628,8 +640,11 @@ class Honeycomb { } public async withSpan(name: string, runInContext: () => Promise): Promise { + if (!this.features.honeycomb || !this.initialized) { + return runInContext() + } + if (!this.features.otlp) { - // Call legacy beelines implementation return this.withBeelineSpan(name, runInContext) } @@ -644,13 +659,17 @@ class Honeycomb { } private async withBeelineSpan(name: string, runInContext: () => Promise): Promise { - const span = beeline.startSpan({ name }) + if (!this.features.honeycomb || !this.initialized) { + return runInContext() + } - const result = await runInContext() + const span = beeline.startSpan({ name }) - beeline.finishSpan(span) + const result = await runInContext() + + beeline.finishSpan(span) - return result + return result } } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index b3f1fcf8..0e0fdcca 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -11,12 +11,22 @@ function trace ({ } = {}) { return function honeycombTrace (next: Handler) { return (context: Context) => { - honeycomb.withTrace(context, () => new Promise((resolve, reject) => { + return honeycomb.withTrace(context, () => new Promise((resolve, reject) => { const p = next(context) + // TODO: This action needs to happen asynchronously - that is, the + // middleware stack needs to resolve before the headers get sent and + // we close the span. + // + // The likely implication of this is that we won't be able to use + // the context manager API - at least not directly. Instead, we'll + // want to go back to endTrace/endSpan. + // do not do as I do, onHeaders(context._response, () => { - p.then(resolve, reject) + p.then((result: any) => { + resolve(result); + }, reject) }) }), headerSources) } From d51d7bda96ac846b6a5e07ee75b362590a7ad53f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 28 Jan 2022 15:16:27 -0500 Subject: [PATCH 040/167] SMOKE TESTS PASSING --- templates/boltzmann/core/honeycomb.ts | 122 +++++++++++--------- templates/boltzmann/middleware/honeycomb.ts | 32 +++-- 2 files changed, 82 insertions(+), 72 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index d1e1bedc..a89c3dbc 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -223,6 +223,13 @@ interface OTLPFactoryOverrides { ) => OtlpSDK; } +// An interface for the return value of Honeycomb#startSpan +// and/or Honeycomb#startTrace. +interface Span { + end(): Promise +} + +// Let's GOOOOOOO class Honeycomb { // We load options from the environment. Unlike with Options, // we do a lot of feature detection here. @@ -237,7 +244,6 @@ class Honeycomb { ) } - // TODO: Can't inject serviceName here public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { // If there's no write key we won't get very far anyway const disable = !env.HONEYCOMB_WRITEKEY @@ -275,6 +281,11 @@ class Honeycomb { } } + // These accessors are type guards that ensure you're working + // with a defined/non-null property. It's a bit of 6-to-1 and + // half a dozen on the other, because you trade ifs for + // try/catches and honeycomb can basically never throw. Even + // so, it saves a little bit of boilerplate. private getWriteKey (): string { if (this.features.honeycomb && this.options.writeKey) { return this.options.writeKey @@ -395,8 +406,6 @@ class Honeycomb { } } - - // Start the OpenTelemetry SDK. If using beelines, this is // a no-op. This needs to happen before anything happens in // the entrypoint and is an async operation. @@ -431,22 +440,18 @@ class Honeycomb { this.started = true } - // Create a trace, call the runInContext function, then close the - // trace after it resolved. For beeline, this is is a Trace; - // for OpenTelemetry, it's a root span. - public async withTrace( - context: Context, - runInContext: () => Promise, - headerSources?: string[] - ): Promise { + // Start a trace. Returns a Trace, which may be closed by calling + // `trace.end()`. + public async startTrace(context: Context, headerSources?: string[]): Promise { if (!this.features.honeycomb || !this.initialized) { - // Don't do anything but run the callback - return runInContext() + return { + async end() {} + } } if (!this.features.otlp) { // Call legacy beelines implementation - return this.withBeelineTrace(context, runInContext, headerSources) + return this._startBeelineTrace(context, headerSources) } if (headerSources) { @@ -469,7 +474,7 @@ class Honeycomb { let carrier = {} // Start a parent span - const parentSpan = tracer.startSpan( + const span = tracer.startSpan( `${context.method} ${context.url.pathname}${context.url.search}`, { attributes: { @@ -492,7 +497,7 @@ class Honeycomb { propagator.inject( otlpAPI.trace.setSpanContext( otlpAPI.ROOT_CONTEXT, - parentSpan.spanContext() + span.spanContext() ), carrier, otlpAPI.defaultTextMapSetter @@ -512,50 +517,54 @@ class Honeycomb { */ - // giddyup! - const rv = await runInContext() + return { + end: async () => { + return this._endTraceSpan(span, context); + } + } + } + // Close an otel "parent span". + private async _endTraceSpan(span: otlpAPI.Span, context: Context): Promise { const handler: Handler = context.handler - parentSpan.setAttribute( + span.setAttribute( otlpSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, String(context._response.statusCode) ) - parentSpan.setAttribute( + span.setAttribute( otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE, handler.route ) - parentSpan.setAttribute( + span.setAttribute( otlpSemanticConventions.SemanticAttributes.HTTP_METHOD, handler.method ) - parentSpan.setAttribute( + span.setAttribute( otlpSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, handler.version ) Object.entries(context.params).map(([key, value]) => { - parentSpan.setAttribute( + span.setAttribute( Honeycomb.paramAttribute(key), value ) }) - parentSpan.end() - - return rv + span.end() } + // Beelines implementation for starting/ending a trace private defaultHeaderSources: string[] = [ 'x-honeycomb-trace', 'x-request-id' ] - /* A beelines implementation of startTrace. - */ - async withBeelineTrace( + private async _startBeelineTrace( context: Context, - runInContext: () => Promise, headerSources?: string[] - ): Promise { + ): Promise { if (!this.features.honeycomb || !this.initialized) { - return runInContext() + return { + async end() {} + } } const schema = require('honeycomb-beeline/lib/schema') @@ -587,8 +596,6 @@ class Honeycomb { beeline.addContext(traceContext.customContext) } - if (!trace) return runInContext() - const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { beeline.addContext({ 'response.status_code': String(response.statusCode) @@ -608,12 +615,11 @@ class Honeycomb { beeline.finishTrace(trace) }) - const result = await runInContext() - - boundFinisher(tracker.getTracked()) - - - return result + return { + end: async () => { + boundFinisher(this, tracker.getTracked()) + } + } function _getBeelineTraceContext (context: Context) { const source = _headerSources.find((header: string) => header in context.headers) @@ -639,37 +645,45 @@ class Honeycomb { } } - public async withSpan(name: string, runInContext: () => Promise): Promise { + // Starting a span. For OpenTelemetry this is a "child" span + // (OTLP doesn't have the same trace concept as beelines. Returns + // a Span object. + public async startSpan(name: string): Promise { if (!this.features.honeycomb || !this.initialized) { - return runInContext() + return { + async end() {} + } } if (!this.features.otlp) { - return this.withBeelineSpan(name, runInContext) + return this._startBeelineSpan(name) } const span = this.tracer.startSpan(name) otlpAPI.trace.setSpan(otlpAPI.context.active(), span) - const result = await runInContext() - - span.end() + return { + async end() { + span.end() + } + } - return result } - private async withBeelineSpan(name: string, runInContext: () => Promise): Promise { + private async _startBeelineSpan(name: string): Promise { if (!this.features.honeycomb || !this.initialized) { - return runInContext() + return { + async end() {} + } } const span = beeline.startSpan({ name }) - const result = await runInContext() - - beeline.finishSpan(span) - - return result + return { + async end() { + beeline.finishSpan(span) + } + } } } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 0e0fdcca..2e7e45f8 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -10,25 +10,15 @@ function trace ({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { return function honeycombTrace (next: Handler) { - return (context: Context) => { - return honeycomb.withTrace(context, () => new Promise((resolve, reject) => { - const p = next(context) + return async (context: Context) => { + const trace = await honeycomb.startTrace(context, headerSources) - // TODO: This action needs to happen asynchronously - that is, the - // middleware stack needs to resolve before the headers get sent and - // we close the span. - // - // The likely implication of this is that we won't be able to use - // the context manager API - at least not directly. Instead, we'll - // want to go back to endTrace/endSpan. + // do not do as I do, + onHeaders(context._response, async () => { + await trace.end() + }) - // do not do as I do, - onHeaders(context._response, () => { - p.then((result: any) => { - resolve(result); - }, reject) - }) - }), headerSources) + return next(context) } } } @@ -40,7 +30,13 @@ function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { function honeycombSpan (next: Handler) { return async (context: Context): Promise => { - return honeycomb.withSpan(`mw: ${name}`, () => next(context)) + const span = await honeycomb.startSpan(`mw: ${name}`) + + // Assumption: the invariant middleware between each layer + // will ensure that no errors are thrown to next(). + const result = await next(context) + await span.end() + return result } } From e76f6c05b588b747194bc8ee5353c3b96f7c34d9 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 31 Jan 2022 14:31:28 -0500 Subject: [PATCH 041/167] Remove otel functionality to create more manageable pull request --- templates/boltzmann/core/honeycomb.ts | 557 +------------------------- 1 file changed, 16 insertions(+), 541 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index a89c3dbc..9a0d2dcf 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -26,51 +26,8 @@ Good luck! // are treated in prelude.ts! import isDev from 'are-we-dev' -// We continue to support beelines... import beeline from 'honeycomb-beeline' -// ...but are migrating to OpenTelemetry: -import * as grpc from '@grpc/grpc-js' -import * as otlpAPI from '@opentelemetry/api' -import * as otlpCore from '@opentelemetry/core' -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' -import * as otlpResources from '@opentelemetry/resources' -import { NodeSDK as OtlpSDK } from '@opentelemetry/sdk-node' -import * as otlpTraceBase from '@opentelemetry/sdk-trace-base' -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import * as otlpSemanticConventions from '@opentelemetry/semantic-conventions' - -// We include node core instrumentation, as well as redis -// and postgres instrumentation if those respective features -// are enabled. -// -// TODO: Can these be overridden? -// -// Some instrumentation that is NOT included, because boltzmann -// doesn't support the technology: -// -// * @opentelemetry/instrumentation-grpc -// * @opentelemetry/instrumentation-graphql -// -// TODO: Double-check these -// -// Some packages which, to our knowledge, don't have available -// instrumentations: -// -// * undici -import { Instrumentation as OtlpInstrumentation } from '@opentelemetry/instrumentation' -import { DnsInstrumentation as OtlpDnsInstrumentation } from '@opentelemetry/instrumentation-dns' -import { HttpInstrumentation as OtlpHttpInstrumentation } from '@opentelemetry/instrumentation-http' - -void `{% if redis %}`; -import { RedisInstrumentation as OtlpRedisInstrumentation } from '@opentelemetry/instrumentation-redis' -void `{% endif %}` - -void `{% if postgres %}` -import { PgInstrumentation as OtlpPgInstrumentation } from '@opentelemetry/instrumentation-pg' -void `{% endif %}` - - // TODO: Sort through these and find a good answer void `{% if selftest %}` import { ServerResponse } from 'http' @@ -90,137 +47,20 @@ interface HoneycombOptions { // disabled disable?: boolean - // When true, Do Otlp - otlp?: boolean - // The Honeycomb write key and dataset writeKey?: string | null dataset?: string | null - // If using OpenTelemetry, this is a grpc:// address apiHost?: string | null // Tunables, etc. sampleRate?: number } -// Whether or not otlp, beelines and honeycomb are enabled +// Whether or not honeycomb is enabled interface HoneycombFeatures { honeycomb: boolean beeline: boolean - otlp: boolean -} - -// There's a lot of plumbing that happens when setting up -// OpenTelemetry. In order to fully initialize it, we need -// to instantiate all of these object types. -// -// They're exposed on the Honeycomb class but in a nested -// namespace. -interface OTLPFactories { - metadata: (writeKey: string, dataset: string) => grpc.Metadata - sampler: (sampleRate: number) => otlpAPI.Sampler - tracerProvider: (sampler: otlpAPI.Sampler) => NodeTracerProvider - traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter - spanProcessor: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor - instrumentations: () => OtlpInstrumentation[] - sdk: ( - serviceName: string, - instrumentations: OtlpInstrumentation[], - traceExporter: OTLPTraceExporter - ) => OtlpSDK -} - -const defaultOtlpFactories: OTLPFactories = { - metadata (writeKey: string, dataset: string): grpc.Metadata { - const metadata = new grpc.Metadata() - metadata.set('x-honeycomb-team', writeKey) - metadata.set('x-honeycomb-dataset', dataset) - return metadata - }, - - // create a Sampler object, which is used to tune - // the sampling rate - sampler (sampleRate: number): otlpAPI.Sampler { - return new otlpCore.ParentBasedSampler({ - root: new otlpCore.TraceIdRatioBasedSampler(sampleRate) - }) - }, - - // It provides tracers! - tracerProvider (sampler: otlpAPI.Sampler): NodeTracerProvider { - return new NodeTracerProvider({ sampler }) - }, - - // Export traces to an OTLP endpoint with GRPC - traceExporter (url: string, metadata: grpc.Metadata): OTLPTraceExporter { - return new OTLPTraceExporter({ - url, - credentials: grpc.credentials.createSsl(), - metadata - }) - }, - - // Process spans, using the supplied trace exporter to - // do the actual exporting. - spanProcessor (traceExporter: OTLPTraceExporter): otlpTraceBase.SpanProcessor { - // There's a bug in the types here - SimpleSpanProcessor doesn't - // take the optional Context argument in its signature and - // typescript is understandably cranky about that. - return (new otlpTraceBase.SimpleSpanProcessor(traceExporter) as unknown) - }, - - instrumentations () { - let is: OtlpInstrumentation[] = [ - new OtlpDnsInstrumentation({}), - new OtlpHttpInstrumentation({}), - ] - - void `{% if redis %}` - is.push(new OtlpRedisInstrumentation({})) - void `{% endif %}` - - void `{% if postgres %}` - is.push(new OtlpPgInstrumentation({})) - void `{% endif %}` - - return is - }, - - // The SDK will take a service name, instrumentations - // and a trace exporter and give us a stateful singleton. - // This is that singleton! - sdk ( - serviceName: string, - instrumentations: OtlpInstrumentation[], - traceExporter: OTLPTraceExporter - ): OtlpSDK { - return new OtlpSDK({ - resource: new otlpResources.Resource({ - [otlpSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName - }), - traceExporter, - instrumentations - }) - } -} - -// For testing purposes, it can be beneficial to -// override how objects in OpenTelemetry initialization -// are created. The Honeycomb class allows for -// passing overrides into its constructor. -interface OTLPFactoryOverrides { - metadata?: (writeKey: string, dataset: string) => grpc.Metadata - sampler?: (sampleRate: Number) => otlpAPI.Sampler - tracerProvider?: (sampler: otlpAPI.Sampler) => NodeTracerProvider - traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter - spanProcessor?: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor - instrumentations?: () => OtlpInstrumentation[]; - sdk?: ( - serviceName: string, - instrumentations: OtlpInstrumentation[], - traceExporter: OTLPTraceExporter - ) => OtlpSDK; } // An interface for the return value of Honeycomb#startSpan @@ -235,19 +75,16 @@ class Honeycomb { // we do a lot of feature detection here. public static fromEnv( serviceName: string, - env: typeof process.env = process.env, - overrides: OTLPFactoryOverrides = {} + env: typeof process.env = process.env ): Honeycomb { return new Honeycomb( - Honeycomb.parseEnv(serviceName, env), - overrides + Honeycomb.parseEnv(serviceName, env) ) } public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { // If there's no write key we won't get very far anyway const disable = !env.HONEYCOMB_WRITEKEY - let otlp: boolean = false const writeKey = env.HONEYCOMB_WRITEKEY || null const dataset = env.HONEYCOMB_DATASET || null const apiHost = env.HONEYCOMB_API_HOST || null @@ -263,17 +100,9 @@ class Honeycomb { sampleRate = 1 } - // If the API host is a grpc:// endpoint, we feature switch to - // OpenTelemetry. There are prior uses of this variable here but - // they should've been using https://. - if (!disable && apiHost) { - otlp = /^grpc:\/\//.test(apiHost) - } - return { serviceName, disable, - otlp, writeKey, dataset, apiHost, @@ -309,31 +138,20 @@ class Honeycomb { public options: HoneycombOptions public features: HoneycombFeatures - public factories: OTLPFactories public initialized: boolean public started: boolean - public sdk: OtlpSDK | null - public tracer: otlpAPI.Tracer constructor( - options: HoneycombOptions, - overrides: OTLPFactoryOverrides = {} + options: HoneycombOptions ) { this.options = options this.features = { honeycomb: !options.disable, - beeline: !options.disable && !options.otlp, - otlp: options.otlp || false + beeline: !options.disable, } this.initialized = false this.started = false - this.sdk = null - this.tracer = otlpAPI.trace.getTracer('boltzmann', '1.0.0') - this.factories = { - ...defaultOtlpFactories, - ...(overrides || {}) - } } public static log(message: any): void { @@ -348,17 +166,7 @@ class Honeycomb { void `{% endif %}` } - // Some non-standard OpenTelemetry attributes we add in - // the middlewares... - - public static OTEL_REQ_QUERY = 'boltzmann.query' - - public static paramAttribute(param: string): string { - return `boltzmann.request.param.${param}` - } - - // Initialize Honeycomb! Stands up the otlp node SDK if enabled, - // otherwise sets up the beeline library. + // Initialize Honeycomb! Sets up the beeline library. // This needs to occur before any imports you want instrumentation // to be aware of. public init(): void { @@ -368,35 +176,11 @@ class Honeycomb { const sampleRate = this.options.sampleRate || 1; const serviceName = this.options.serviceName; - if (!this.features.honeycomb) { - console.log("calling the beeline function") - console.log({ writeKey, dataset, sampleRate, serviceName }); + if (this.features.honeycomb) { beeline({ writeKey, dataset, sampleRate, serviceName }) this.initialized = true return } - - const f = this.factories - const apiHost: string = this.getApiHost() - - const metadata: grpc.Metadata = f.metadata(writeKey, dataset) - - const sampler: otlpAPI.Sampler = f.sampler(sampleRate) - const exporter = f.traceExporter(apiHost, metadata) - const processor = f.spanProcessor(exporter) - const instrumentations = f.instrumentations() - - const provider: NodeTracerProvider = f.tracerProvider(sampler) - provider.addSpanProcessor(processor) - provider.register() - - this.sdk = f.sdk( - serviceName, - instrumentations, - exporter - ) - - this.initialized = true } catch (err) { if (err instanceof HoneycombError) { // Honeycomb.log(err); @@ -406,37 +190,11 @@ class Honeycomb { } } - // Start the OpenTelemetry SDK. If using beelines, this is - // a no-op. This needs to happen before anything happens in - // the entrypoint and is an async operation. + // When implemented, this will start the OpenTelemetry SDK. In the + // case of beelines, it's a no-op. In the otel case, this will need + // to happen before anything happens in the entrypoint and is an + // async operation. public async start(): Promise { - let exitCode = 0 - const sdk = this.sdk - - async function die(err: Error) { - Honeycomb.log(err); - exitCode = 1 - await shutdown() - } - - async function shutdown() { - if (sdk) { - try { - await sdk.shutdown() - } catch (err) { - Honeycomb.log(err) - } - } - process.exit(exitCode) - } - - if (sdk) { - process.once('SIGTERM', shutdown) - process.once('beforeExit', shutdown) - process.once('uncaughtException', die) - process.once('unhandledRejection', die) - await sdk.start() - } this.started = true } @@ -449,109 +207,9 @@ class Honeycomb { } } - if (!this.features.otlp) { - // Call legacy beelines implementation - return this._startBeelineTrace(context, headerSources) - } - - if (headerSources) { - Honeycomb.log('trace headerSources are a beeline-only feature') - } - - /* - * ┏┓ - * ┃┃╱╲ in - * ┃╱╱╲╲ this - * ╱╱╭╮╲╲house - * ▔▏┗┛▕▔ we - * ╱▔▔▔▔▔▔▔▔▔▔╲ - * trace with opentelemetry - * ╱╱┏┳┓╭╮┏┳┓ ╲╲ - * ▔▏┗┻┛┃┃┗┻┛▕▔ - */ - - const tracer = this.tracer - let carrier = {} - - // Start a parent span - const span = tracer.startSpan( - `${context.method} ${context.url.pathname}${context.url.search}`, - { - attributes: { - [otlpSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, - [otlpSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, - [otlpSemanticConventions.SemanticAttributes.NET_PEER_IP]: context.remote, - [otlpSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, - [otlpSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - // TODO: Honeycomb.Attributes obvs - [Honeycomb.OTEL_REQ_QUERY]: context.url.search - } - } - ) - - // this propagator takes care of extracting trace parent - // and state from request headers (and so on) - const propagator = new otlpCore.W3CTraceContextPropagator() - - propagator.inject( - otlpAPI.trace.setSpanContext( - otlpAPI.ROOT_CONTEXT, - span.spanContext() - ), - carrier, - otlpAPI.defaultTextMapSetter - ) - - /* TODO: Do I need to create and set a context? No, right? - - // create a parent active context - const parentContext = propagator.extract( - otlpAPI.ROOT_CONTEXT, - carrier, - otlpAPI.defaultTextMapGetter - ) - - // set the active context - await traceContext.with(parentContext, async () => { - - */ - - return { - end: async () => { - return this._endTraceSpan(span, context); - } - } - } - - // Close an otel "parent span". - private async _endTraceSpan(span: otlpAPI.Span, context: Context): Promise { - const handler: Handler = context.handler - - span.setAttribute( - otlpSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, - String(context._response.statusCode) - ) - span.setAttribute( - otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE, - handler.route - ) - span.setAttribute( - otlpSemanticConventions.SemanticAttributes.HTTP_METHOD, - handler.method - ) - span.setAttribute( - otlpSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, - handler.version - ) - - Object.entries(context.params).map(([key, value]) => { - span.setAttribute( - Honeycomb.paramAttribute(key), - value - ) - }) - span.end() + // The core of this method is hidden away in preparation for the + // bulk of this method being OTLP focused later. + return this._startBeelineTrace(context, headerSources) } // Beelines implementation for starting/ending a trace @@ -655,19 +313,8 @@ class Honeycomb { } } - if (!this.features.otlp) { - return this._startBeelineSpan(name) - } - - const span = this.tracer.startSpan(name) - otlpAPI.trace.setSpan(otlpAPI.context.active(), span) - - return { - async end() { - span.end() - } - } - + // This method is also intended to focus on OTLP in the future... + return this._startBeelineSpan(name) } private async _startBeelineSpan(name: string): Promise { @@ -689,34 +336,13 @@ class Honeycomb { export { beeline, - grpc, - otlpAPI, - otlpCore, - OTLPTraceExporter, - otlpResources, - OtlpSDK, - otlpTraceBase, - NodeTracerProvider, - otlpSemanticConventions, - OtlpInstrumentation, - OtlpDnsInstrumentation, - OtlpHttpInstrumentation, - // {% if redis %} - OtlpRedisInstrumentation, - // {% endif %} - // {% if postgres %} - OtlpPgInstrumentation - // {% endif %} } export { - defaultOtlpFactories, Honeycomb, HoneycombError, HoneycombOptions, HoneycombFeatures, - OTLPFactories, - OTLPFactoryOverrides, } void `{% if selftest %}` @@ -746,57 +372,6 @@ if (require.main === module) { ) }) - t.test('options.otlp', async (assert: Test) => { - assert.equal( - Honeycomb.parseEnv('boltzmann', {}).otlp, - false, - 'should not use otlp when no env vars' - ) - assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otlp, - false, - 'should not use otlp when env vars are blank' - ) - assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otlp, - false, - 'should not use otlp when only write key is defined' - ) - assert.equal( - Honeycomb.parseEnv( - 'boltzmann', - { - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'https://refinery.website' - } - ).otlp, - false, - 'should not use otlp when API host is not grpc://' - ) - assert.equal( - Honeycomb.parseEnv( - 'boltzmann', - { - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'grpc://otlp.website' - } - ).otlp, - true, - '*should* use otlp when API host is grpc://' - ) - assert.equal( - Honeycomb.parseEnv( - 'boltzmann', - { - HONEYCOMB_WRITEKEY: '', - HONEYCOMB_API_HOST: 'grpc://otlp.website' - } - ).otlp, - false, - 'should not use otlp when write key is empty, even if API host is grpc://' - ) - }) - t.test('options.sampleRate', async (assert: Test) => { assert.equal( Honeycomb.parseEnv('boltzmann', {}).sampleRate, @@ -847,106 +422,6 @@ if (require.main === module) { ) }) }) - test('factories', async (t: Test) => { - const options = { - enabled: true, - otlp: true, - writeKey: 'some write key', - dataset: 'some dataset', - apiHost: 'grpc://example.com', - sampleRate: 1, - } - - t.test('metadata', async (assert: Test) => { - const metadata = defaultOtlpFactories.metadata( - 'some write key', - 'some dataset' - ) - assert.same( - metadata.get('x-honeycomb-team'), - ['some write key'], - 'should have the write key set' - ) - assert.same( - metadata.get('x-honeycomb-dataset'), - ['some dataset'], - 'shoupld have the dataset set' - ) - }) - - t.test('sampler', async (assert: Test) => { - assert.ok( - defaultOtlpFactories.sampler(1) instanceof otlpCore.ParentBasedSampler, - 'sampler(1) should be a otlpCore.ParentBasedSampler' - ) - assert.ok( - defaultOtlpFactories.sampler(0) instanceof otlpCore.ParentBasedSampler, - 'sampler(0) should be a otlpCore.ParentBasedSampler' - ) - assert.ok( - defaultOtlpFactories.sampler(0.5) instanceof otlpCore.ParentBasedSampler, - 'sampler(0.5) should be a otlpCore.ParentBasedSampler' - ) - }) - - test('tracerProvider', async (assert: Test) => { - const sampler = defaultOtlpFactories.sampler(1) - assert.doesNotThrow( - () => defaultOtlpFactories.tracerProvider(sampler), - 'should create a tracer provider' - ) - }) - - test('traceExporter', async (assert: Test) => { - assert.doesNotThrow(() => { - const url = 'grpc://example.com' - const metadata = defaultOtlpFactories.metadata( - 'some write key', - 'some dataset' - ) - - defaultOtlpFactories.traceExporter(url, metadata) - }, 'should create a trace exporter') - }) - - test('spanProcessor', async (assert: Test) => { - assert.doesNotThrow(() => { - const exporter = defaultOtlpFactories.traceExporter( - 'grpc://example.com', - defaultOtlpFactories.metadata( - 'some write key', - 'some dataset' - ) - ) - - defaultOtlpFactories.spanProcessor(exporter) - }, 'should create a span processor') - }) - - test('instrumentations', async (assert: Test) => { - // expected instrumentations: dns, node core, postgres, redis - assert.equal( - defaultOtlpFactories.instrumentations().length, - 4, - 'should create 4 instrumentations (dns, http, postgres, redis)' - ) - }) - - test('sdk', async (assert: Test) => { - // run the init function - assert.doesNotThrow(() => { - const exporter = defaultOtlpFactories.traceExporter( - 'grpc://example.com', - defaultOtlpFactories.metadata( - 'some write key', - 'some dataset' - ) - ) - const instrumentations = defaultOtlpFactories.instrumentations() - defaultOtlpFactories.sdk('boltzmann', instrumentations, exporter) - }, 'should create an sdk') - }) - }) } void `{% endif %}` From 9fc7573d59fa76a2456bf7b7fcb4e87b55535e02 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 31 Jan 2022 15:30:23 -0500 Subject: [PATCH 042/167] Remove otel deps --- package-lock.json | 1214 ++---------------------------------------- package.json | 14 - src/dependencies.ron | 112 ---- 3 files changed, 47 insertions(+), 1293 deletions(-) diff --git a/package-lock.json b/package-lock.json index 091f6fc1..8d115b68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,21 +10,7 @@ "license": "MIT", "dependencies": { "@entropic/bole": "^4.0.1", - "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", - "@opentelemetry/api": "^1.0.4", - "@opentelemetry/core": "^1.0.1", - "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/instrumentation-dns": "^0.27.0", - "@opentelemetry/instrumentation-http": "^0.27.0", - "@opentelemetry/instrumentation-pg": "^0.27.0", - "@opentelemetry/instrumentation-redis": "^0.27.0", - "@opentelemetry/resources": "^1.0.1", - "@opentelemetry/sdk-node": "^0.27.0", - "@opentelemetry/sdk-trace-base": "^1.0.1", - "@opentelemetry/sdk-trace-node": "^1.0.1", - "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", @@ -516,69 +502,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/@grpc/grpc-js": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", - "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", - "dependencies": { - "@grpc/proto-loader": "^0.6.4", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", - "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.2.0" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@grpc/proto-loader/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, "node_modules/@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -717,25 +640,6 @@ "node": ">= 8" } }, - "node_modules/@opentelemetry/api": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", - "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", - "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", - "engines": { - "node": ">=8.1.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, "node_modules/@opentelemetry/context-base": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", @@ -744,373 +648,6 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", - "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", - "dependencies": { - "@grpc/grpc-js": "^1.3.7", - "@grpc/proto-loader": "^0.6.4", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/exporter-trace-otlp-http": "0.27.0", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", - "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", - "dependencies": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", - "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", - "dependencies": { - "@opentelemetry/api-metrics": "0.27.0", - "require-in-the-middle": "^5.0.3", - "semver": "^7.3.2", - "shimmer": "^1.2.1" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", - "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", - "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", - "dependencies": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/instrumentation": "0.27.0", - "@opentelemetry/semantic-conventions": "1.0.1", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", - "integrity": "sha512-8G3YwQ/9K1B2IfYAipvTHyTqN79pz4xtNdi2HvvPnspBsrUeF71LqA3S04z1AeU81QhEOgX6D2+FZKdx8N/KTg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.3" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", - "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/redis": "2.8.31" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", - "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", - "dependencies": { - "@opentelemetry/core": "1.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", - "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", - "dependencies": { - "@opentelemetry/core": "1.0.1" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", - "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", - "dependencies": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/semantic-conventions": "^1.0.0" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", - "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", - "dependencies": { - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "gcp-metadata": "^4.1.4", - "semver": "7.3.5" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", - "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", - "dependencies": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/sdk-node": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", - "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", - "dependencies": { - "@opentelemetry/api-metrics": "0.27.0", - "@opentelemetry/core": "~1.0.0", - "@opentelemetry/instrumentation": "0.27.0", - "@opentelemetry/resource-detector-aws": "~1.0.0", - "@opentelemetry/resource-detector-gcp": "~0.26.0", - "@opentelemetry/resources": "~1.0.0", - "@opentelemetry/sdk-metrics-base": "0.27.0", - "@opentelemetry/sdk-trace-base": "~1.0.0", - "@opentelemetry/sdk-trace-node": "~1.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics-base": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", - "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", - "dependencies": { - "@opentelemetry/api-metrics": "0.27.0", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", - "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", - "dependencies": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", - "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", - "dependencies": { - "@opentelemetry/context-async-hooks": "1.0.1", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/propagator-b3": "1.0.1", - "@opentelemetry/propagator-jaeger": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", - "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" - }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1232,11 +769,6 @@ "@types/node": "*" } }, - "node_modules/@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, "node_modules/@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -1276,20 +808,13 @@ "version": "7.14.11", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", + "dev": true, "dependencies": { "@types/node": "*", "pg-protocol": "^1.2.0", "pg-types": "^2.2.0" } }, - "node_modules/@types/pg-pool": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz", - "integrity": "sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg==", - "dependencies": { - "@types/pg": "*" - } - }, "node_modules/@types/redis": { "version": "2.8.31", "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", @@ -1547,17 +1072,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1931,14 +1445,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2423,6 +1929,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2433,6 +1940,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2441,6 +1949,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2872,7 +2381,8 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2921,6 +2431,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, "engines": { "node": ">=6" } @@ -3384,14 +2895,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -3758,33 +3261,6 @@ "is-windows": "^1.0.2" } }, - "node_modules/gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "dependencies": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3798,6 +3274,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -4418,17 +3895,6 @@ "is-ci": "bin.js" } }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4527,6 +3993,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, "engines": { "node": ">=8" } @@ -4757,14 +4224,6 @@ "node": ">=4" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -5024,11 +4483,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -5077,11 +4531,6 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -5102,11 +4551,6 @@ "node": ">=0.8.6" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -5307,11 +4751,6 @@ "node": ">=10" } }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5336,18 +4775,7 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" + "node": ">= 0.4.0" } }, "node_modules/node-preload": { @@ -8088,11 +7516,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -8157,7 +7580,8 @@ "node_modules/pg-protocol": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" + "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==", + "dev": true }, "node_modules/pg-types": { "version": "2.2.0", @@ -8309,31 +7733,6 @@ "node": ">=0.4.0" } }, - "node_modules/protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, "node_modules/proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", @@ -8695,6 +8094,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8707,38 +8107,12 @@ "node": ">=0.10.0" } }, - "node_modules/require-in-the-middle": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", - "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.12.0" - } - }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dependencies": { - "is-core-module": "^2.8.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9157,6 +8531,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9170,6 +8545,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, "engines": { "node": ">=8" } @@ -9178,6 +8554,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -9186,6 +8563,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -9312,17 +8690,6 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/table": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", @@ -11532,11 +10899,6 @@ "node": ">=0.8" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "node_modules/trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -11868,20 +11230,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -11927,6 +11275,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11943,6 +11292,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11951,6 +11301,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -12512,53 +11863,6 @@ } } }, - "@grpc/grpc-js": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", - "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", - "requires": { - "@grpc/proto-loader": "^0.6.4", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", - "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - } - } - }, "@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -12679,287 +11983,11 @@ "fastq": "^1.6.0" } }, - "@opentelemetry/api": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", - "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" - }, - "@opentelemetry/context-async-hooks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", - "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", - "requires": {} - }, "@opentelemetry/context-base": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", "integrity": "sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA==" }, - "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" - } - }, - "@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", - "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", - "requires": { - "@grpc/grpc-js": "^1.3.7", - "@grpc/proto-loader": "^0.6.4", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/exporter-trace-otlp-http": "0.27.0", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1" - } - }, - "@opentelemetry/exporter-trace-otlp-http": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", - "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", - "requires": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1" - } - }, - "@opentelemetry/instrumentation": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", - "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", - "requires": { - "@opentelemetry/api-metrics": "0.27.0", - "require-in-the-middle": "^5.0.3", - "semver": "^7.3.2", - "shimmer": "^1.2.1" - }, - "dependencies": { - "@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" - } - } - }, - "@opentelemetry/instrumentation-dns": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", - "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "semver": "^7.3.2" - } - }, - "@opentelemetry/instrumentation-http": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", - "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", - "requires": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/instrumentation": "0.27.0", - "@opentelemetry/semantic-conventions": "1.0.1", - "semver": "^7.3.5" - } - }, - "@opentelemetry/instrumentation-pg": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", - "integrity": "sha512-8G3YwQ/9K1B2IfYAipvTHyTqN79pz4xtNdi2HvvPnspBsrUeF71LqA3S04z1AeU81QhEOgX6D2+FZKdx8N/KTg==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.3" - }, - "dependencies": { - "@types/pg": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", - "requires": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - } - } - }, - "@opentelemetry/instrumentation-redis": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", - "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", - "requires": { - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/redis": "2.8.31" - } - }, - "@opentelemetry/propagator-b3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", - "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", - "requires": { - "@opentelemetry/core": "1.0.1" - } - }, - "@opentelemetry/propagator-jaeger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", - "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", - "requires": { - "@opentelemetry/core": "1.0.1" - } - }, - "@opentelemetry/resource-detector-aws": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", - "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", - "requires": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/semantic-conventions": "^1.0.0" - } - }, - "@opentelemetry/resource-detector-gcp": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", - "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", - "requires": { - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/semantic-conventions": "^1.0.0", - "gcp-metadata": "^4.1.4", - "semver": "7.3.5" - } - }, - "@opentelemetry/resources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", - "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", - "requires": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" - } - }, - "@opentelemetry/sdk-node": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", - "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", - "requires": { - "@opentelemetry/api-metrics": "0.27.0", - "@opentelemetry/core": "~1.0.0", - "@opentelemetry/instrumentation": "0.27.0", - "@opentelemetry/resource-detector-aws": "~1.0.0", - "@opentelemetry/resource-detector-gcp": "~0.26.0", - "@opentelemetry/resources": "~1.0.0", - "@opentelemetry/sdk-metrics-base": "0.27.0", - "@opentelemetry/sdk-trace-base": "~1.0.0", - "@opentelemetry/sdk-trace-node": "~1.0.0" - }, - "dependencies": { - "@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" - }, - "@opentelemetry/sdk-metrics-base": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", - "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", - "requires": { - "@opentelemetry/api-metrics": "0.27.0", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "lodash.merge": "^4.6.2" - } - } - } - }, - "@opentelemetry/sdk-trace-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", - "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", - "requires": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" - } - }, - "@opentelemetry/sdk-trace-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", - "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", - "requires": { - "@opentelemetry/context-async-hooks": "1.0.1", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/propagator-b3": "1.0.1", - "@opentelemetry/propagator-jaeger": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1", - "semver": "^7.3.5" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", - "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" - }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -13069,11 +12097,6 @@ "@types/node": "*" } }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, "@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -13113,20 +12136,13 @@ "version": "7.14.11", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", + "dev": true, "requires": { "@types/node": "*", "pg-protocol": "^1.2.0", "pg-types": "^2.2.0" } }, - "@types/pg-pool": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz", - "integrity": "sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg==", - "requires": { - "@types/pg": "*" - } - }, "@types/redis": { "version": "2.8.31", "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", @@ -13296,14 +12312,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -13605,11 +12613,6 @@ "tweetnacl": "^0.14.3" } }, - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -13962,6 +12965,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -13971,12 +12975,14 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -14318,7 +13324,8 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "end-of-stream": { "version": "1.4.4", @@ -14359,7 +13366,8 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true }, "escape-goat": { "version": "2.1.1", @@ -14690,11 +13698,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, "events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -14986,27 +13989,6 @@ "is-windows": "^1.0.2" } }, - "gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - } - }, - "gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "requires": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -15016,7 +13998,8 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true }, "get-function-location": { "version": "2.0.0", @@ -15482,14 +14465,6 @@ "ci-info": "^2.0.0" } }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "requires": { - "has": "^1.0.3" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -15554,7 +14529,8 @@ "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true }, "is-string": { "version": "1.0.5", @@ -15732,14 +14708,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -15962,11 +14930,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -16015,11 +14978,6 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -16037,11 +14995,6 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -16183,11 +15136,6 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -16209,14 +15157,6 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" }, - "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -18097,11 +17037,6 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -18154,7 +17089,8 @@ "pg-protocol": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" + "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==", + "dev": true }, "pg-types": { "version": "2.2.0", @@ -18259,26 +17195,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "requires": { - "@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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - } - }, "proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", @@ -18555,39 +17471,20 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, - "require-in-the-middle": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", - "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", - "requires": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.12.0" - } - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "requires": { - "is-core-module": "^2.8.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -18912,6 +17809,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -18921,17 +17819,20 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -19028,11 +17929,6 @@ "supports-color": "^7.0.0" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, "table": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", @@ -20522,11 +19418,6 @@ "punycode": "^2.1.1" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -20790,20 +19681,6 @@ "extsprintf": "^1.2.0" } }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -20837,6 +19714,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -20846,12 +19724,14 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "requires": { "ansi-regex": "^5.0.1" } diff --git a/package.json b/package.json index 756cfdef..9dc934ac 100644 --- a/package.json +++ b/package.json @@ -9,21 +9,7 @@ }, "dependencies": { "@entropic/bole": "^4.0.1", - "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", - "@opentelemetry/api": "^1.0.4", - "@opentelemetry/core": "^1.0.1", - "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", - "@opentelemetry/instrumentation": "^0.27.0", - "@opentelemetry/instrumentation-dns": "^0.27.0", - "@opentelemetry/instrumentation-http": "^0.27.0", - "@opentelemetry/instrumentation-pg": "^0.27.0", - "@opentelemetry/instrumentation-redis": "^0.27.0", - "@opentelemetry/resources": "^1.0.1", - "@opentelemetry/sdk-node": "^0.27.0", - "@opentelemetry/sdk-trace-base": "^1.0.1", - "@opentelemetry/sdk-trace-node": "^1.0.1", - "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", diff --git a/src/dependencies.ron b/src/dependencies.ron index 44df6198..92119306 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -20,13 +20,6 @@ preconditions: None ), - DependencySpec( - name: "@grpc/grpc-js", - version: "^1.5.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - DependencySpec( name: "@hapi/iron", version: "^6.0.0", @@ -34,111 +27,6 @@ preconditions: None ), - DependencySpec( - name: "@opentelemetry/api", - version: "^1.0.4", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/core", - version: "^1.0.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/exporter-trace-otlp-grpc", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-dns", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-graphql", - version: "^0.27.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-grpc", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-http", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-pg", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb", "postgres"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-redis", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb", "redis"])) - ), - - DependencySpec( - name: "@opentelemetry/resources", - version: "^1.0.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/sdk-node", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/sdk-trace-base", - version: "^1.0.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/sdk-trace-node", - version: "^1.0.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/semantic-conventions", - version: "^1.0.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - DependencySpec( name: "@types/hapi__iron", version: "^6.0.1", From 8333ff6cea0bfd78d81316d90dc0dd0bc731d5d5 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 31 Jan 2022 15:45:41 -0500 Subject: [PATCH 043/167] Test the honeycomb trace span name logic --- templates/boltzmann/core/honeycomb.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 9a0d2dcf..85f0bb55 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -110,6 +110,10 @@ class Honeycomb { } } + public static _traceSpanName(method: string, pathname: string) { + return `${method} ${pathname}` + } + // These accessors are type guards that ensure you're working // with a defined/non-null property. It's a bit of 6-to-1 and // half a dozen on the other, because you trade ifs for @@ -232,7 +236,7 @@ class Honeycomb { const trace = beeline.startTrace({ [schema.EVENT_TYPE]: 'boltzmann', [schema.PACKAGE_VERSION]: '1.0.0', - [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, + [schema.TRACE_SPAN_NAME]: Honeycomb._traceSpanName(context.method, context.url.pathname), [schema.TRACE_ID_SOURCE]: traceContext.source, 'request.host': context.host, 'request.original_url': context.url.href, @@ -421,6 +425,13 @@ if (require.main === module) { 'should be url if url' ) }) + + t.test('Honeycomb._traceSpanName', async (assert: Test) => { + assert.same( + Honeycomb._traceSpanName('GET', '/echo'), + 'GET /echo' + ) + }); }) } From 15bf3b0f8e93517350c8ac3325aaa748e8a9ea56 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 31 Jan 2022 15:53:46 -0500 Subject: [PATCH 044/167] boltzmann-cli npm package will now run x64 darwin build on arm --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7d94de7e..2e624647 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -128,7 +128,7 @@ jobs: const fs = require('fs') const spawnSync = require('child_process').spawnSync - const executable = path.join(__dirname, 'boltzmann_' + os.arch() + '_' + os.platform()) + (os.platform() === 'win32' ? '.exe' : '') + const executable = path.join(__dirname, 'boltzmann_' + (os.platform() === 'darwin' ? 'x64' : os.arch()) + '_' + os.platform()) + (os.platform() === 'win32' ? '.exe' : '') if (!fs.existsSync(executable)) { console.error("Sorry, boltzmann is not yet supported on %s", os.platform()) From 4669875d5e3eb8c2c06337b96cc8d4057af5196b Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 15:47:08 -0500 Subject: [PATCH 045/167] Start the trace *after* handling the ping route --- templates/boltzmann/core/entrypoint.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index c8ef877d..c52351de 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -30,14 +30,14 @@ if (require.main === module && !process.env.TAP) { // {# so we're gonna do this one flag at a time. #} const acc = [] - // {% if honeycomb %} - acc.push(trace) - // {% endif %} - // {% if ping %} acc.push(handlePing) // {% endif %} + // {% if honeycomb %} + acc.push(trace) + // {% endif %} + // {% if livereload %} if (isDev()) { acc.push(livereload) From 9004caab21a9a7e54c0471f25e02ad4a3e11c38f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 16:52:01 -0500 Subject: [PATCH 046/167] Update middleware.ts to use honeycomb abstraction --- templates/boltzmann/core/honeycomb.ts | 9 +++++---- templates/boltzmann/core/middleware.ts | 18 +++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 85f0bb55..319af73a 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -310,7 +310,8 @@ class Honeycomb { // Starting a span. For OpenTelemetry this is a "child" span // (OTLP doesn't have the same trace concept as beelines. Returns // a Span object. - public async startSpan(name: string): Promise { + public async startSpan(name: string, attributes?: { [a: string]: string | undefined }): Promise { + if (!this.features.honeycomb || !this.initialized) { return { async end() {} @@ -318,17 +319,17 @@ class Honeycomb { } // This method is also intended to focus on OTLP in the future... - return this._startBeelineSpan(name) + return this._startBeelineSpan(name, attributes || {}) } - private async _startBeelineSpan(name: string): Promise { + private async _startBeelineSpan(name: string, attributes: { [a: string]: string | undefined}): Promise { if (!this.features.honeycomb || !this.initialized) { return { async end() {} } } - const span = beeline.startSpan({ name }) + const span = beeline.startSpan({ name, ...attributes }) return { async end() { diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 1ad23956..96555ed3 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,14 +1,13 @@ void `{% if selftest %}`; export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } -import beeline from 'honeycomb-beeline' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' import { enforceInvariants } from '../middleware/enforce-invariants' import { honeycombMiddlewareSpans } from '../middleware/honeycomb' import { BodyParserDefinition } from '../core/body' -import { HttpMetadata } from '../core/prelude' +import { honeycomb, HttpMetadata } from '../core/prelude' import { route } from '../middleware/route' import { Context } from '../data/context' import { dev } from '../middleware/dev' @@ -85,26 +84,23 @@ async function buildMiddleware (middleware: MiddlewareConfig[], router: Handler) async function handler (context: Context) { const handler = context.handler as Handler // {% if honeycomb %} - let span = null - if (process.env.HONEYCOMB_WRITEKEY) { - span = beeline.startSpan({ - name: `handler: ${handler.name}`, + const span = await honeycomb.startSpan( + `handler: ${handler.name}`, + { 'handler.name': handler.name, 'handler.method': String(handler.method), 'handler.route': handler.route, 'handler.version': handler.version || '*', 'handler.decorators': String(handler.decorators) - }) - } + } + ) try { // {% endif %} return await handler(context) // {% if honeycomb %} } finally { - if (process.env.HONEYCOMB_WRITEKEY && span !== null) { - beeline.finishSpan(span) - } + await span.end() } // {% endif %} } From 6a8065bbf7f93044bcf6dcb27e545bfd2ad6c07b Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:40:34 -0500 Subject: [PATCH 047/167] Revert "Remove otel deps" This reverts commit 11fb7ef8096b1f694aa086b586d19e36df2a6764. --- package-lock.json | 1214 ++++++++++++++++++++++++++++++++++++++++-- package.json | 14 + src/dependencies.ron | 112 ++++ 3 files changed, 1293 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d115b68..091f6fc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,21 @@ "license": "MIT", "dependencies": { "@entropic/bole": "^4.0.1", + "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-pg": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", @@ -502,6 +516,69 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@grpc/grpc-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", + "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -640,6 +717,25 @@ "node": ">= 8" } }, + "node_modules/@opentelemetry/api": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, "node_modules/@opentelemetry/context-base": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", @@ -648,6 +744,373 @@ "node": ">=8.0.0" } }, + "node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", + "dependencies": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", + "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", + "integrity": "sha512-8G3YwQ/9K1B2IfYAipvTHyTqN79pz4xtNdi2HvvPnspBsrUeF71LqA3S04z1AeU81QhEOgX6D2+FZKdx8N/KTg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", + "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/redis": "2.8.31" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", + "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", + "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -769,6 +1232,11 @@ "@types/node": "*" } }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "node_modules/@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -808,13 +1276,20 @@ "version": "7.14.11", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", - "dev": true, "dependencies": { "@types/node": "*", "pg-protocol": "^1.2.0", "pg-types": "^2.2.0" } }, + "node_modules/@types/pg-pool": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz", + "integrity": "sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg==", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/redis": { "version": "2.8.31", "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", @@ -1072,6 +1547,17 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1445,6 +1931,14 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1929,7 +2423,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1940,7 +2433,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1949,7 +2441,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2381,8 +2872,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2431,7 +2921,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -2895,6 +3384,14 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -3261,6 +3758,33 @@ "is-windows": "^1.0.2" } }, + "node_modules/gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3274,7 +3798,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3895,6 +4418,17 @@ "is-ci": "bin.js" } }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3993,7 +4527,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, "engines": { "node": ">=8" } @@ -4224,6 +4757,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -4483,6 +5024,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -4531,6 +5077,11 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -4551,6 +5102,11 @@ "node": ">=0.8.6" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4751,6 +5307,11 @@ "node": ">=10" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4775,7 +5336,18 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4.0" + } + }, + "node_modules/node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" } }, "node_modules/node-preload": { @@ -7516,6 +8088,11 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -7580,8 +8157,7 @@ "node_modules/pg-protocol": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==", - "dev": true + "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -7733,6 +8309,31 @@ "node": ">=0.4.0" } }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", @@ -8094,7 +8695,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8107,12 +8707,38 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "node_modules/resolve": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "dependencies": { + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -8531,7 +9157,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8545,7 +9170,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, "engines": { "node": ">=8" } @@ -8554,7 +9178,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -8563,7 +9186,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -8690,6 +9312,17 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/table": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", @@ -10899,6 +11532,11 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "node_modules/trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -11230,6 +11868,20 @@ "extsprintf": "^1.2.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -11275,7 +11927,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11292,7 +11943,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -11301,7 +11951,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11863,6 +12512,53 @@ } } }, + "@grpc/grpc-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", + "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + } + } + }, "@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -11983,11 +12679,287 @@ "fastq": "^1.6.0" } }, + "@opentelemetry/api": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" + }, + "@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "requires": {} + }, "@opentelemetry/context-base": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", "integrity": "sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA==" }, + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", + "requires": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + } + }, + "@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + } + }, + "@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "dependencies": { + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + } + } + }, + "@opentelemetry/instrumentation-dns": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", + "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + } + }, + "@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + } + }, + "@opentelemetry/instrumentation-pg": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", + "integrity": "sha512-8G3YwQ/9K1B2IfYAipvTHyTqN79pz4xtNdi2HvvPnspBsrUeF71LqA3S04z1AeU81QhEOgX6D2+FZKdx8N/KTg==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.3" + }, + "dependencies": { + "@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "requires": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + } + } + }, + "@opentelemetry/instrumentation-redis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", + "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/redis": "2.8.31" + } + }, + "@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/resource-detector-aws": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", + "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-gcp": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", + "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + }, + "dependencies": { + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + }, + "@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + } + } + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "requires": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -12097,6 +13069,11 @@ "@types/node": "*" } }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -12136,13 +13113,20 @@ "version": "7.14.11", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", - "dev": true, "requires": { "@types/node": "*", "pg-protocol": "^1.2.0", "pg-types": "^2.2.0" } }, + "@types/pg-pool": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz", + "integrity": "sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg==", + "requires": { + "@types/pg": "*" + } + }, "@types/redis": { "version": "2.8.31", "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", @@ -12312,6 +13296,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -12613,6 +13605,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -12965,7 +13962,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -12975,14 +13971,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -13324,8 +14318,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "end-of-stream": { "version": "1.4.4", @@ -13366,8 +14359,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -13698,6 +14690,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -13989,6 +14986,27 @@ "is-windows": "^1.0.2" } }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -13998,8 +15016,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-function-location": { "version": "2.0.0", @@ -14465,6 +15482,14 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -14529,8 +15554,7 @@ "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, "is-string": { "version": "1.0.5", @@ -14708,6 +15732,14 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -14930,6 +15962,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -14978,6 +16015,11 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -14995,6 +16037,11 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -15136,6 +16183,11 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -15157,6 +16209,14 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -17037,6 +18097,11 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -17089,8 +18154,7 @@ "pg-protocol": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==", - "dev": true + "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" }, "pg-types": { "version": "2.2.0", @@ -17195,6 +18259,26 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", @@ -17471,20 +18555,39 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "resolve": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "requires": { + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -17809,7 +18912,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17819,20 +18921,17 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -17929,6 +19028,11 @@ "supports-color": "^7.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "table": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", @@ -19418,6 +20522,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -19681,6 +20790,20 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -19714,7 +20837,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19724,14 +20846,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } diff --git a/package.json b/package.json index 9dc934ac..756cfdef 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,21 @@ }, "dependencies": { "@entropic/bole": "^4.0.1", + "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-pg": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", diff --git a/src/dependencies.ron b/src/dependencies.ron index 92119306..44df6198 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -20,6 +20,13 @@ preconditions: None ), + DependencySpec( + name: "@grpc/grpc-js", + version: "^1.5.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + DependencySpec( name: "@hapi/iron", version: "^6.0.0", @@ -27,6 +34,111 @@ preconditions: None ), + DependencySpec( + name: "@opentelemetry/api", + version: "^1.0.4", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/core", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/exporter-trace-otlp-grpc", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-dns", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-graphql", + version: "^0.27.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-grpc", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-http", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-pg", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb", "postgres"])) + ), + + DependencySpec( + name: "@opentelemetry/instrumentation-redis", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb", "redis"])) + ), + + DependencySpec( + name: "@opentelemetry/resources", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/sdk-node", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/sdk-trace-base", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/sdk-trace-node", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/semantic-conventions", + version: "^1.0.1", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + DependencySpec( name: "@types/hapi__iron", version: "^6.0.1", From 8148e4e7d6dbf5d4f92a62adbc4fe3351730ed90 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:40:42 -0500 Subject: [PATCH 048/167] Revert "Remove otel functionality to create more manageable pull request" This reverts commit c2e98a29282fb95d1757cb67f36a66a7bddf93b6. --- templates/boltzmann/core/honeycomb.ts | 557 +++++++++++++++++++++++++- 1 file changed, 541 insertions(+), 16 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 319af73a..155c22e2 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -26,8 +26,51 @@ Good luck! // are treated in prelude.ts! import isDev from 'are-we-dev' +// We continue to support beelines... import beeline from 'honeycomb-beeline' +// ...but are migrating to OpenTelemetry: +import * as grpc from '@grpc/grpc-js' +import * as otlpAPI from '@opentelemetry/api' +import * as otlpCore from '@opentelemetry/core' +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' +import * as otlpResources from '@opentelemetry/resources' +import { NodeSDK as OtlpSDK } from '@opentelemetry/sdk-node' +import * as otlpTraceBase from '@opentelemetry/sdk-trace-base' +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' +import * as otlpSemanticConventions from '@opentelemetry/semantic-conventions' + +// We include node core instrumentation, as well as redis +// and postgres instrumentation if those respective features +// are enabled. +// +// TODO: Can these be overridden? +// +// Some instrumentation that is NOT included, because boltzmann +// doesn't support the technology: +// +// * @opentelemetry/instrumentation-grpc +// * @opentelemetry/instrumentation-graphql +// +// TODO: Double-check these +// +// Some packages which, to our knowledge, don't have available +// instrumentations: +// +// * undici +import { Instrumentation as OtlpInstrumentation } from '@opentelemetry/instrumentation' +import { DnsInstrumentation as OtlpDnsInstrumentation } from '@opentelemetry/instrumentation-dns' +import { HttpInstrumentation as OtlpHttpInstrumentation } from '@opentelemetry/instrumentation-http' + +void `{% if redis %}`; +import { RedisInstrumentation as OtlpRedisInstrumentation } from '@opentelemetry/instrumentation-redis' +void `{% endif %}` + +void `{% if postgres %}` +import { PgInstrumentation as OtlpPgInstrumentation } from '@opentelemetry/instrumentation-pg' +void `{% endif %}` + + // TODO: Sort through these and find a good answer void `{% if selftest %}` import { ServerResponse } from 'http' @@ -47,20 +90,137 @@ interface HoneycombOptions { // disabled disable?: boolean + // When true, Do Otlp + otlp?: boolean + // The Honeycomb write key and dataset writeKey?: string | null dataset?: string | null + // If using OpenTelemetry, this is a grpc:// address apiHost?: string | null // Tunables, etc. sampleRate?: number } -// Whether or not honeycomb is enabled +// Whether or not otlp, beelines and honeycomb are enabled interface HoneycombFeatures { honeycomb: boolean beeline: boolean + otlp: boolean +} + +// There's a lot of plumbing that happens when setting up +// OpenTelemetry. In order to fully initialize it, we need +// to instantiate all of these object types. +// +// They're exposed on the Honeycomb class but in a nested +// namespace. +interface OTLPFactories { + metadata: (writeKey: string, dataset: string) => grpc.Metadata + sampler: (sampleRate: number) => otlpAPI.Sampler + tracerProvider: (sampler: otlpAPI.Sampler) => NodeTracerProvider + traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter + spanProcessor: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor + instrumentations: () => OtlpInstrumentation[] + sdk: ( + serviceName: string, + instrumentations: OtlpInstrumentation[], + traceExporter: OTLPTraceExporter + ) => OtlpSDK +} + +const defaultOtlpFactories: OTLPFactories = { + metadata (writeKey: string, dataset: string): grpc.Metadata { + const metadata = new grpc.Metadata() + metadata.set('x-honeycomb-team', writeKey) + metadata.set('x-honeycomb-dataset', dataset) + return metadata + }, + + // create a Sampler object, which is used to tune + // the sampling rate + sampler (sampleRate: number): otlpAPI.Sampler { + return new otlpCore.ParentBasedSampler({ + root: new otlpCore.TraceIdRatioBasedSampler(sampleRate) + }) + }, + + // It provides tracers! + tracerProvider (sampler: otlpAPI.Sampler): NodeTracerProvider { + return new NodeTracerProvider({ sampler }) + }, + + // Export traces to an OTLP endpoint with GRPC + traceExporter (url: string, metadata: grpc.Metadata): OTLPTraceExporter { + return new OTLPTraceExporter({ + url, + credentials: grpc.credentials.createSsl(), + metadata + }) + }, + + // Process spans, using the supplied trace exporter to + // do the actual exporting. + spanProcessor (traceExporter: OTLPTraceExporter): otlpTraceBase.SpanProcessor { + // There's a bug in the types here - SimpleSpanProcessor doesn't + // take the optional Context argument in its signature and + // typescript is understandably cranky about that. + return (new otlpTraceBase.SimpleSpanProcessor(traceExporter) as unknown) + }, + + instrumentations () { + let is: OtlpInstrumentation[] = [ + new OtlpDnsInstrumentation({}), + new OtlpHttpInstrumentation({}), + ] + + void `{% if redis %}` + is.push(new OtlpRedisInstrumentation({})) + void `{% endif %}` + + void `{% if postgres %}` + is.push(new OtlpPgInstrumentation({})) + void `{% endif %}` + + return is + }, + + // The SDK will take a service name, instrumentations + // and a trace exporter and give us a stateful singleton. + // This is that singleton! + sdk ( + serviceName: string, + instrumentations: OtlpInstrumentation[], + traceExporter: OTLPTraceExporter + ): OtlpSDK { + return new OtlpSDK({ + resource: new otlpResources.Resource({ + [otlpSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName + }), + traceExporter, + instrumentations + }) + } +} + +// For testing purposes, it can be beneficial to +// override how objects in OpenTelemetry initialization +// are created. The Honeycomb class allows for +// passing overrides into its constructor. +interface OTLPFactoryOverrides { + metadata?: (writeKey: string, dataset: string) => grpc.Metadata + sampler?: (sampleRate: Number) => otlpAPI.Sampler + tracerProvider?: (sampler: otlpAPI.Sampler) => NodeTracerProvider + traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter + spanProcessor?: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor + instrumentations?: () => OtlpInstrumentation[]; + sdk?: ( + serviceName: string, + instrumentations: OtlpInstrumentation[], + traceExporter: OTLPTraceExporter + ) => OtlpSDK; } // An interface for the return value of Honeycomb#startSpan @@ -75,16 +235,19 @@ class Honeycomb { // we do a lot of feature detection here. public static fromEnv( serviceName: string, - env: typeof process.env = process.env + env: typeof process.env = process.env, + overrides: OTLPFactoryOverrides = {} ): Honeycomb { return new Honeycomb( - Honeycomb.parseEnv(serviceName, env) + Honeycomb.parseEnv(serviceName, env), + overrides ) } public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { // If there's no write key we won't get very far anyway const disable = !env.HONEYCOMB_WRITEKEY + let otlp: boolean = false const writeKey = env.HONEYCOMB_WRITEKEY || null const dataset = env.HONEYCOMB_DATASET || null const apiHost = env.HONEYCOMB_API_HOST || null @@ -100,9 +263,17 @@ class Honeycomb { sampleRate = 1 } + // If the API host is a grpc:// endpoint, we feature switch to + // OpenTelemetry. There are prior uses of this variable here but + // they should've been using https://. + if (!disable && apiHost) { + otlp = /^grpc:\/\//.test(apiHost) + } + return { serviceName, disable, + otlp, writeKey, dataset, apiHost, @@ -142,20 +313,31 @@ class Honeycomb { public options: HoneycombOptions public features: HoneycombFeatures + public factories: OTLPFactories public initialized: boolean public started: boolean + public sdk: OtlpSDK | null + public tracer: otlpAPI.Tracer constructor( - options: HoneycombOptions + options: HoneycombOptions, + overrides: OTLPFactoryOverrides = {} ) { this.options = options this.features = { honeycomb: !options.disable, - beeline: !options.disable, + beeline: !options.disable && !options.otlp, + otlp: options.otlp || false } this.initialized = false this.started = false + this.sdk = null + this.tracer = otlpAPI.trace.getTracer('boltzmann', '1.0.0') + this.factories = { + ...defaultOtlpFactories, + ...(overrides || {}) + } } public static log(message: any): void { @@ -170,7 +352,17 @@ class Honeycomb { void `{% endif %}` } - // Initialize Honeycomb! Sets up the beeline library. + // Some non-standard OpenTelemetry attributes we add in + // the middlewares... + + public static OTEL_REQ_QUERY = 'boltzmann.query' + + public static paramAttribute(param: string): string { + return `boltzmann.request.param.${param}` + } + + // Initialize Honeycomb! Stands up the otlp node SDK if enabled, + // otherwise sets up the beeline library. // This needs to occur before any imports you want instrumentation // to be aware of. public init(): void { @@ -180,11 +372,35 @@ class Honeycomb { const sampleRate = this.options.sampleRate || 1; const serviceName = this.options.serviceName; - if (this.features.honeycomb) { + if (!this.features.honeycomb) { + console.log("calling the beeline function") + console.log({ writeKey, dataset, sampleRate, serviceName }); beeline({ writeKey, dataset, sampleRate, serviceName }) this.initialized = true return } + + const f = this.factories + const apiHost: string = this.getApiHost() + + const metadata: grpc.Metadata = f.metadata(writeKey, dataset) + + const sampler: otlpAPI.Sampler = f.sampler(sampleRate) + const exporter = f.traceExporter(apiHost, metadata) + const processor = f.spanProcessor(exporter) + const instrumentations = f.instrumentations() + + const provider: NodeTracerProvider = f.tracerProvider(sampler) + provider.addSpanProcessor(processor) + provider.register() + + this.sdk = f.sdk( + serviceName, + instrumentations, + exporter + ) + + this.initialized = true } catch (err) { if (err instanceof HoneycombError) { // Honeycomb.log(err); @@ -194,11 +410,37 @@ class Honeycomb { } } - // When implemented, this will start the OpenTelemetry SDK. In the - // case of beelines, it's a no-op. In the otel case, this will need - // to happen before anything happens in the entrypoint and is an - // async operation. + // Start the OpenTelemetry SDK. If using beelines, this is + // a no-op. This needs to happen before anything happens in + // the entrypoint and is an async operation. public async start(): Promise { + let exitCode = 0 + const sdk = this.sdk + + async function die(err: Error) { + Honeycomb.log(err); + exitCode = 1 + await shutdown() + } + + async function shutdown() { + if (sdk) { + try { + await sdk.shutdown() + } catch (err) { + Honeycomb.log(err) + } + } + process.exit(exitCode) + } + + if (sdk) { + process.once('SIGTERM', shutdown) + process.once('beforeExit', shutdown) + process.once('uncaughtException', die) + process.once('unhandledRejection', die) + await sdk.start() + } this.started = true } @@ -211,9 +453,109 @@ class Honeycomb { } } - // The core of this method is hidden away in preparation for the - // bulk of this method being OTLP focused later. - return this._startBeelineTrace(context, headerSources) + if (!this.features.otlp) { + // Call legacy beelines implementation + return this._startBeelineTrace(context, headerSources) + } + + if (headerSources) { + Honeycomb.log('trace headerSources are a beeline-only feature') + } + + /* + * ┏┓ + * ┃┃╱╲ in + * ┃╱╱╲╲ this + * ╱╱╭╮╲╲house + * ▔▏┗┛▕▔ we + * ╱▔▔▔▔▔▔▔▔▔▔╲ + * trace with opentelemetry + * ╱╱┏┳┓╭╮┏┳┓ ╲╲ + * ▔▏┗┻┛┃┃┗┻┛▕▔ + */ + + const tracer = this.tracer + let carrier = {} + + // Start a parent span + const span = tracer.startSpan( + `${context.method} ${context.url.pathname}${context.url.search}`, + { + attributes: { + [otlpSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, + [otlpSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, + [otlpSemanticConventions.SemanticAttributes.NET_PEER_IP]: context.remote, + [otlpSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, + [otlpSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + // TODO: Honeycomb.Attributes obvs + [Honeycomb.OTEL_REQ_QUERY]: context.url.search + } + } + ) + + // this propagator takes care of extracting trace parent + // and state from request headers (and so on) + const propagator = new otlpCore.W3CTraceContextPropagator() + + propagator.inject( + otlpAPI.trace.setSpanContext( + otlpAPI.ROOT_CONTEXT, + span.spanContext() + ), + carrier, + otlpAPI.defaultTextMapSetter + ) + + /* TODO: Do I need to create and set a context? No, right? + + // create a parent active context + const parentContext = propagator.extract( + otlpAPI.ROOT_CONTEXT, + carrier, + otlpAPI.defaultTextMapGetter + ) + + // set the active context + await traceContext.with(parentContext, async () => { + + */ + + return { + end: async () => { + return this._endTraceSpan(span, context); + } + } + } + + // Close an otel "parent span". + private async _endTraceSpan(span: otlpAPI.Span, context: Context): Promise { + const handler: Handler = context.handler + + span.setAttribute( + otlpSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, + String(context._response.statusCode) + ) + span.setAttribute( + otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE, + handler.route + ) + span.setAttribute( + otlpSemanticConventions.SemanticAttributes.HTTP_METHOD, + handler.method + ) + span.setAttribute( + otlpSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, + handler.version + ) + + Object.entries(context.params).map(([key, value]) => { + span.setAttribute( + Honeycomb.paramAttribute(key), + value + ) + }) + span.end() } // Beelines implementation for starting/ending a trace @@ -318,8 +660,19 @@ class Honeycomb { } } - // This method is also intended to focus on OTLP in the future... - return this._startBeelineSpan(name, attributes || {}) + if (!this.features.otlp) { + return this._startBeelineSpan(name, attributes || {}) + } + + const span = this.tracer.startSpan(name) + otlpAPI.trace.setSpan(otlpAPI.context.active(), span) + + return { + async end() { + span.end() + } + } + } private async _startBeelineSpan(name: string, attributes: { [a: string]: string | undefined}): Promise { @@ -341,13 +694,34 @@ class Honeycomb { export { beeline, + grpc, + otlpAPI, + otlpCore, + OTLPTraceExporter, + otlpResources, + OtlpSDK, + otlpTraceBase, + NodeTracerProvider, + otlpSemanticConventions, + OtlpInstrumentation, + OtlpDnsInstrumentation, + OtlpHttpInstrumentation, + // {% if redis %} + OtlpRedisInstrumentation, + // {% endif %} + // {% if postgres %} + OtlpPgInstrumentation + // {% endif %} } export { + defaultOtlpFactories, Honeycomb, HoneycombError, HoneycombOptions, HoneycombFeatures, + OTLPFactories, + OTLPFactoryOverrides, } void `{% if selftest %}` @@ -377,6 +751,57 @@ if (require.main === module) { ) }) + t.test('options.otlp', async (assert: Test) => { + assert.equal( + Honeycomb.parseEnv('boltzmann', {}).otlp, + false, + 'should not use otlp when no env vars' + ) + assert.equal( + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otlp, + false, + 'should not use otlp when env vars are blank' + ) + assert.equal( + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otlp, + false, + 'should not use otlp when only write key is defined' + ) + assert.equal( + Honeycomb.parseEnv( + 'boltzmann', + { + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'https://refinery.website' + } + ).otlp, + false, + 'should not use otlp when API host is not grpc://' + ) + assert.equal( + Honeycomb.parseEnv( + 'boltzmann', + { + HONEYCOMB_WRITEKEY: 'some write key', + HONEYCOMB_API_HOST: 'grpc://otlp.website' + } + ).otlp, + true, + '*should* use otlp when API host is grpc://' + ) + assert.equal( + Honeycomb.parseEnv( + 'boltzmann', + { + HONEYCOMB_WRITEKEY: '', + HONEYCOMB_API_HOST: 'grpc://otlp.website' + } + ).otlp, + false, + 'should not use otlp when write key is empty, even if API host is grpc://' + ) + }) + t.test('options.sampleRate', async (assert: Test) => { assert.equal( Honeycomb.parseEnv('boltzmann', {}).sampleRate, @@ -434,6 +859,106 @@ if (require.main === module) { ) }); }) + test('factories', async (t: Test) => { + const options = { + enabled: true, + otlp: true, + writeKey: 'some write key', + dataset: 'some dataset', + apiHost: 'grpc://example.com', + sampleRate: 1, + } + + t.test('metadata', async (assert: Test) => { + const metadata = defaultOtlpFactories.metadata( + 'some write key', + 'some dataset' + ) + assert.same( + metadata.get('x-honeycomb-team'), + ['some write key'], + 'should have the write key set' + ) + assert.same( + metadata.get('x-honeycomb-dataset'), + ['some dataset'], + 'shoupld have the dataset set' + ) + }) + + t.test('sampler', async (assert: Test) => { + assert.ok( + defaultOtlpFactories.sampler(1) instanceof otlpCore.ParentBasedSampler, + 'sampler(1) should be a otlpCore.ParentBasedSampler' + ) + assert.ok( + defaultOtlpFactories.sampler(0) instanceof otlpCore.ParentBasedSampler, + 'sampler(0) should be a otlpCore.ParentBasedSampler' + ) + assert.ok( + defaultOtlpFactories.sampler(0.5) instanceof otlpCore.ParentBasedSampler, + 'sampler(0.5) should be a otlpCore.ParentBasedSampler' + ) + }) + + test('tracerProvider', async (assert: Test) => { + const sampler = defaultOtlpFactories.sampler(1) + assert.doesNotThrow( + () => defaultOtlpFactories.tracerProvider(sampler), + 'should create a tracer provider' + ) + }) + + test('traceExporter', async (assert: Test) => { + assert.doesNotThrow(() => { + const url = 'grpc://example.com' + const metadata = defaultOtlpFactories.metadata( + 'some write key', + 'some dataset' + ) + + defaultOtlpFactories.traceExporter(url, metadata) + }, 'should create a trace exporter') + }) + + test('spanProcessor', async (assert: Test) => { + assert.doesNotThrow(() => { + const exporter = defaultOtlpFactories.traceExporter( + 'grpc://example.com', + defaultOtlpFactories.metadata( + 'some write key', + 'some dataset' + ) + ) + + defaultOtlpFactories.spanProcessor(exporter) + }, 'should create a span processor') + }) + + test('instrumentations', async (assert: Test) => { + // expected instrumentations: dns, node core, postgres, redis + assert.equal( + defaultOtlpFactories.instrumentations().length, + 4, + 'should create 4 instrumentations (dns, http, postgres, redis)' + ) + }) + + test('sdk', async (assert: Test) => { + // run the init function + assert.doesNotThrow(() => { + const exporter = defaultOtlpFactories.traceExporter( + 'grpc://example.com', + defaultOtlpFactories.metadata( + 'some write key', + 'some dataset' + ) + ) + const instrumentations = defaultOtlpFactories.instrumentations() + defaultOtlpFactories.sdk('boltzmann', instrumentations, exporter) + }, 'should create an sdk') + }) + }) } void `{% endif %}` From 72c46e2fa7688e5a8578ac5b96a8b40bd5108234 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:02:59 -0500 Subject: [PATCH 049/167] rename otlp to otel throughout --- templates/boltzmann/core/honeycomb.ts | 221 +++++++++++++------------- 1 file changed, 108 insertions(+), 113 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 155c22e2..9837dda3 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -31,14 +31,14 @@ import beeline from 'honeycomb-beeline' // ...but are migrating to OpenTelemetry: import * as grpc from '@grpc/grpc-js' -import * as otlpAPI from '@opentelemetry/api' -import * as otlpCore from '@opentelemetry/core' +import * as otelAPI from '@opentelemetry/api' +import * as otelCore from '@opentelemetry/core' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' -import * as otlpResources from '@opentelemetry/resources' -import { NodeSDK as OtlpSDK } from '@opentelemetry/sdk-node' -import * as otlpTraceBase from '@opentelemetry/sdk-trace-base' +import * as otelResources from '@opentelemetry/resources' +import { NodeSDK as OtelSDK } from '@opentelemetry/sdk-node' +import * as otelTraceBase from '@opentelemetry/sdk-trace-base' import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' -import * as otlpSemanticConventions from '@opentelemetry/semantic-conventions' +import * as otelSemanticConventions from '@opentelemetry/semantic-conventions' // We include node core instrumentation, as well as redis // and postgres instrumentation if those respective features @@ -70,14 +70,11 @@ void `{% if postgres %}` import { PgInstrumentation as OtlpPgInstrumentation } from '@opentelemetry/instrumentation-pg' void `{% endif %}` - -// TODO: Sort through these and find a good answer void `{% if selftest %}` import { ServerResponse } from 'http' import { Context } from '../data/context' import { Handler } from './middleware' - void `{% endif %}` class HoneycombError extends Error { @@ -91,7 +88,7 @@ interface HoneycombOptions { disable?: boolean // When true, Do Otlp - otlp?: boolean + otel?: boolean // The Honeycomb write key and dataset writeKey?: string | null @@ -104,11 +101,11 @@ interface HoneycombOptions { sampleRate?: number } -// Whether or not otlp, beelines and honeycomb are enabled +// Whether or not otel, beelines and honeycomb are enabled interface HoneycombFeatures { honeycomb: boolean beeline: boolean - otlp: boolean + otel: boolean } // There's a lot of plumbing that happens when setting up @@ -117,21 +114,21 @@ interface HoneycombFeatures { // // They're exposed on the Honeycomb class but in a nested // namespace. -interface OTLPFactories { +interface OtelFactories { metadata: (writeKey: string, dataset: string) => grpc.Metadata - sampler: (sampleRate: number) => otlpAPI.Sampler - tracerProvider: (sampler: otlpAPI.Sampler) => NodeTracerProvider + sampler: (sampleRate: number) => otelAPI.Sampler + tracerProvider: (sampler: otelAPI.Sampler) => NodeTracerProvider traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter - spanProcessor: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor + spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtlpInstrumentation[] sdk: ( serviceName: string, instrumentations: OtlpInstrumentation[], traceExporter: OTLPTraceExporter - ) => OtlpSDK + ) => OtelSDK } -const defaultOtlpFactories: OTLPFactories = { +const defaultOtelFactories: OtelFactories = { metadata (writeKey: string, dataset: string): grpc.Metadata { const metadata = new grpc.Metadata() metadata.set('x-honeycomb-team', writeKey) @@ -141,14 +138,14 @@ const defaultOtlpFactories: OTLPFactories = { // create a Sampler object, which is used to tune // the sampling rate - sampler (sampleRate: number): otlpAPI.Sampler { - return new otlpCore.ParentBasedSampler({ - root: new otlpCore.TraceIdRatioBasedSampler(sampleRate) + sampler (sampleRate: number): otelAPI.Sampler { + return new otelCore.ParentBasedSampler({ + root: new otelCore.TraceIdRatioBasedSampler(sampleRate) }) }, // It provides tracers! - tracerProvider (sampler: otlpAPI.Sampler): NodeTracerProvider { + tracerProvider (sampler: otelAPI.Sampler): NodeTracerProvider { return new NodeTracerProvider({ sampler }) }, @@ -163,11 +160,11 @@ const defaultOtlpFactories: OTLPFactories = { // Process spans, using the supplied trace exporter to // do the actual exporting. - spanProcessor (traceExporter: OTLPTraceExporter): otlpTraceBase.SpanProcessor { + spanProcessor (traceExporter: OTLPTraceExporter): otelTraceBase.SpanProcessor { // There's a bug in the types here - SimpleSpanProcessor doesn't // take the optional Context argument in its signature and // typescript is understandably cranky about that. - return (new otlpTraceBase.SimpleSpanProcessor(traceExporter) as unknown) + return (new otelTraceBase.SimpleSpanProcessor(traceExporter) as unknown) }, instrumentations () { @@ -194,10 +191,10 @@ const defaultOtlpFactories: OTLPFactories = { serviceName: string, instrumentations: OtlpInstrumentation[], traceExporter: OTLPTraceExporter - ): OtlpSDK { - return new OtlpSDK({ - resource: new otlpResources.Resource({ - [otlpSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName + ): OtelSDK { + return new OtelSDK({ + resource: new otelResources.Resource({ + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName }), traceExporter, instrumentations @@ -209,18 +206,18 @@ const defaultOtlpFactories: OTLPFactories = { // override how objects in OpenTelemetry initialization // are created. The Honeycomb class allows for // passing overrides into its constructor. -interface OTLPFactoryOverrides { +interface OtelFactoryOverrides { metadata?: (writeKey: string, dataset: string) => grpc.Metadata - sampler?: (sampleRate: Number) => otlpAPI.Sampler - tracerProvider?: (sampler: otlpAPI.Sampler) => NodeTracerProvider + sampler?: (sampleRate: Number) => otelAPI.Sampler + tracerProvider?: (sampler: otelAPI.Sampler) => NodeTracerProvider traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter - spanProcessor?: (traceExporter: OTLPTraceExporter) => otlpTraceBase.SpanProcessor + spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations?: () => OtlpInstrumentation[]; sdk?: ( serviceName: string, instrumentations: OtlpInstrumentation[], traceExporter: OTLPTraceExporter - ) => OtlpSDK; + ) => OtelSDK; } // An interface for the return value of Honeycomb#startSpan @@ -236,7 +233,7 @@ class Honeycomb { public static fromEnv( serviceName: string, env: typeof process.env = process.env, - overrides: OTLPFactoryOverrides = {} + overrides: OtelFactoryOverrides = {} ): Honeycomb { return new Honeycomb( Honeycomb.parseEnv(serviceName, env), @@ -247,7 +244,7 @@ class Honeycomb { public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { // If there's no write key we won't get very far anyway const disable = !env.HONEYCOMB_WRITEKEY - let otlp: boolean = false + let otel: boolean = false const writeKey = env.HONEYCOMB_WRITEKEY || null const dataset = env.HONEYCOMB_DATASET || null const apiHost = env.HONEYCOMB_API_HOST || null @@ -267,13 +264,13 @@ class Honeycomb { // OpenTelemetry. There are prior uses of this variable here but // they should've been using https://. if (!disable && apiHost) { - otlp = /^grpc:\/\//.test(apiHost) + otel = /^grpc:\/\//.test(apiHost) } return { serviceName, disable, - otlp, + otel, writeKey, dataset, apiHost, @@ -313,29 +310,29 @@ class Honeycomb { public options: HoneycombOptions public features: HoneycombFeatures - public factories: OTLPFactories + public factories: OtelFactories public initialized: boolean public started: boolean - public sdk: OtlpSDK | null - public tracer: otlpAPI.Tracer + public sdk: OtelSDK | null + public tracer: otelAPI.Tracer constructor( options: HoneycombOptions, - overrides: OTLPFactoryOverrides = {} + overrides: OtelFactoryOverrides = {} ) { this.options = options this.features = { honeycomb: !options.disable, - beeline: !options.disable && !options.otlp, - otlp: options.otlp || false + beeline: !options.disable && !options.otel, + otel: options.otel || false } this.initialized = false this.started = false this.sdk = null - this.tracer = otlpAPI.trace.getTracer('boltzmann', '1.0.0') + this.tracer = otelAPI.trace.getTracer('boltzmann', '1.0.0') this.factories = { - ...defaultOtlpFactories, + ...defaultOtelFactories, ...(overrides || {}) } } @@ -361,7 +358,7 @@ class Honeycomb { return `boltzmann.request.param.${param}` } - // Initialize Honeycomb! Stands up the otlp node SDK if enabled, + // Initialize Honeycomb! Stands up the otel node SDK if enabled, // otherwise sets up the beeline library. // This needs to occur before any imports you want instrumentation // to be aware of. @@ -373,8 +370,6 @@ class Honeycomb { const serviceName = this.options.serviceName; if (!this.features.honeycomb) { - console.log("calling the beeline function") - console.log({ writeKey, dataset, sampleRate, serviceName }); beeline({ writeKey, dataset, sampleRate, serviceName }) this.initialized = true return @@ -385,7 +380,7 @@ class Honeycomb { const metadata: grpc.Metadata = f.metadata(writeKey, dataset) - const sampler: otlpAPI.Sampler = f.sampler(sampleRate) + const sampler: otelAPI.Sampler = f.sampler(sampleRate) const exporter = f.traceExporter(apiHost, metadata) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() @@ -453,7 +448,7 @@ class Honeycomb { } } - if (!this.features.otlp) { + if (!this.features.otel) { // Call legacy beelines implementation return this._startBeelineTrace(context, headerSources) } @@ -482,12 +477,12 @@ class Honeycomb { `${context.method} ${context.url.pathname}${context.url.search}`, { attributes: { - [otlpSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, - [otlpSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, - [otlpSemanticConventions.SemanticAttributes.NET_PEER_IP]: context.remote, - [otlpSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, - [otlpSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, + [otelSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, + [otelSemanticConventions.SemanticAttributes.NET_PEER_IP]: context.remote, + [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, + [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, // TODO: Honeycomb.Attributes obvs [Honeycomb.OTEL_REQ_QUERY]: context.url.search } @@ -496,24 +491,24 @@ class Honeycomb { // this propagator takes care of extracting trace parent // and state from request headers (and so on) - const propagator = new otlpCore.W3CTraceContextPropagator() + const propagator = new otelCore.W3CTraceContextPropagator() propagator.inject( - otlpAPI.trace.setSpanContext( - otlpAPI.ROOT_CONTEXT, + otelAPI.trace.setSpanContext( + otelAPI.ROOT_CONTEXT, span.spanContext() ), carrier, - otlpAPI.defaultTextMapSetter + otelAPI.defaultTextMapSetter ) /* TODO: Do I need to create and set a context? No, right? // create a parent active context const parentContext = propagator.extract( - otlpAPI.ROOT_CONTEXT, + otelAPI.ROOT_CONTEXT, carrier, - otlpAPI.defaultTextMapGetter + otelAPI.defaultTextMapGetter ) // set the active context @@ -529,23 +524,23 @@ class Honeycomb { } // Close an otel "parent span". - private async _endTraceSpan(span: otlpAPI.Span, context: Context): Promise { + private async _endTraceSpan(span: otelAPI.Span, context: Context): Promise { const handler: Handler = context.handler span.setAttribute( - otlpSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, + otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, String(context._response.statusCode) ) span.setAttribute( - otlpSemanticConventions.SemanticAttributes.HTTP_ROUTE, + otelSemanticConventions.SemanticAttributes.HTTP_ROUTE, handler.route ) span.setAttribute( - otlpSemanticConventions.SemanticAttributes.HTTP_METHOD, + otelSemanticConventions.SemanticAttributes.HTTP_METHOD, handler.method ) span.setAttribute( - otlpSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, + otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, handler.version ) @@ -660,12 +655,12 @@ class Honeycomb { } } - if (!this.features.otlp) { + if (!this.features.otel) { return this._startBeelineSpan(name, attributes || {}) } const span = this.tracer.startSpan(name) - otlpAPI.trace.setSpan(otlpAPI.context.active(), span) + otelAPI.trace.setSpan(otelAPI.context.active(), span) return { async end() { @@ -695,14 +690,14 @@ class Honeycomb { export { beeline, grpc, - otlpAPI, - otlpCore, + otelAPI, + otelCore, OTLPTraceExporter, - otlpResources, - OtlpSDK, - otlpTraceBase, + otelResources, + OtelSDK, + otelTraceBase, NodeTracerProvider, - otlpSemanticConventions, + otelSemanticConventions, OtlpInstrumentation, OtlpDnsInstrumentation, OtlpHttpInstrumentation, @@ -715,13 +710,13 @@ export { } export { - defaultOtlpFactories, + defaultOtelFactories, Honeycomb, HoneycombError, HoneycombOptions, HoneycombFeatures, - OTLPFactories, - OTLPFactoryOverrides, + OtelFactories, + OtelFactoryOverrides, } void `{% if selftest %}` @@ -751,21 +746,21 @@ if (require.main === module) { ) }) - t.test('options.otlp', async (assert: Test) => { + t.test('options.otel', async (assert: Test) => { assert.equal( - Honeycomb.parseEnv('boltzmann', {}).otlp, + Honeycomb.parseEnv('boltzmann', {}).otel, false, - 'should not use otlp when no env vars' + 'should not use otel when no env vars' ) assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otlp, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otel, false, - 'should not use otlp when env vars are blank' + 'should not use otel when env vars are blank' ) assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otlp, + Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otel, false, - 'should not use otlp when only write key is defined' + 'should not use otel when only write key is defined' ) assert.equal( Honeycomb.parseEnv( @@ -774,31 +769,31 @@ if (require.main === module) { HONEYCOMB_WRITEKEY: 'some write key', HONEYCOMB_API_HOST: 'https://refinery.website' } - ).otlp, + ).otel, false, - 'should not use otlp when API host is not grpc://' + 'should not use otel when API host is not grpc://' ) assert.equal( Honeycomb.parseEnv( 'boltzmann', { HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'grpc://otlp.website' + HONEYCOMB_API_HOST: 'grpc://otel.website' } - ).otlp, + ).otel, true, - '*should* use otlp when API host is grpc://' + '*should* use otel when API host is grpc://' ) assert.equal( Honeycomb.parseEnv( 'boltzmann', { HONEYCOMB_WRITEKEY: '', - HONEYCOMB_API_HOST: 'grpc://otlp.website' + HONEYCOMB_API_HOST: 'grpc://otel.website' } - ).otlp, + ).otel, false, - 'should not use otlp when write key is empty, even if API host is grpc://' + 'should not use otel when write key is empty, even if API host is grpc://' ) }) @@ -862,7 +857,7 @@ if (require.main === module) { test('factories', async (t: Test) => { const options = { enabled: true, - otlp: true, + otel: true, writeKey: 'some write key', dataset: 'some dataset', apiHost: 'grpc://example.com', @@ -870,7 +865,7 @@ if (require.main === module) { } t.test('metadata', async (assert: Test) => { - const metadata = defaultOtlpFactories.metadata( + const metadata = defaultOtelFactories.metadata( 'some write key', 'some dataset' ) @@ -888,23 +883,23 @@ if (require.main === module) { t.test('sampler', async (assert: Test) => { assert.ok( - defaultOtlpFactories.sampler(1) instanceof otlpCore.ParentBasedSampler, - 'sampler(1) should be a otlpCore.ParentBasedSampler' + defaultOtelFactories.sampler(1) instanceof otelCore.ParentBasedSampler, + 'sampler(1) should be a otelCore.ParentBasedSampler' ) assert.ok( - defaultOtlpFactories.sampler(0) instanceof otlpCore.ParentBasedSampler, - 'sampler(0) should be a otlpCore.ParentBasedSampler' + defaultOtelFactories.sampler(0) instanceof otelCore.ParentBasedSampler, + 'sampler(0) should be a otelCore.ParentBasedSampler' ) assert.ok( - defaultOtlpFactories.sampler(0.5) instanceof otlpCore.ParentBasedSampler, - 'sampler(0.5) should be a otlpCore.ParentBasedSampler' + defaultOtelFactories.sampler(0.5) instanceof otelCore.ParentBasedSampler, + 'sampler(0.5) should be a otelCore.ParentBasedSampler' ) }) test('tracerProvider', async (assert: Test) => { - const sampler = defaultOtlpFactories.sampler(1) + const sampler = defaultOtelFactories.sampler(1) assert.doesNotThrow( - () => defaultOtlpFactories.tracerProvider(sampler), + () => defaultOtelFactories.tracerProvider(sampler), 'should create a tracer provider' ) }) @@ -912,33 +907,33 @@ if (require.main === module) { test('traceExporter', async (assert: Test) => { assert.doesNotThrow(() => { const url = 'grpc://example.com' - const metadata = defaultOtlpFactories.metadata( + const metadata = defaultOtelFactories.metadata( 'some write key', 'some dataset' ) - defaultOtlpFactories.traceExporter(url, metadata) + defaultOtelFactories.traceExporter(url, metadata) }, 'should create a trace exporter') }) test('spanProcessor', async (assert: Test) => { assert.doesNotThrow(() => { - const exporter = defaultOtlpFactories.traceExporter( + const exporter = defaultOtelFactories.traceExporter( 'grpc://example.com', - defaultOtlpFactories.metadata( + defaultOtelFactories.metadata( 'some write key', 'some dataset' ) ) - defaultOtlpFactories.spanProcessor(exporter) + defaultOtelFactories.spanProcessor(exporter) }, 'should create a span processor') }) test('instrumentations', async (assert: Test) => { // expected instrumentations: dns, node core, postgres, redis assert.equal( - defaultOtlpFactories.instrumentations().length, + defaultOtelFactories.instrumentations().length, 4, 'should create 4 instrumentations (dns, http, postgres, redis)' ) @@ -947,15 +942,15 @@ if (require.main === module) { test('sdk', async (assert: Test) => { // run the init function assert.doesNotThrow(() => { - const exporter = defaultOtlpFactories.traceExporter( + const exporter = defaultOtelFactories.traceExporter( 'grpc://example.com', - defaultOtlpFactories.metadata( + defaultOtelFactories.metadata( 'some write key', 'some dataset' ) ) - const instrumentations = defaultOtlpFactories.instrumentations() - defaultOtlpFactories.sdk('boltzmann', instrumentations, exporter) + const instrumentations = defaultOtelFactories.instrumentations() + defaultOtelFactories.sdk('boltzmann', instrumentations, exporter) }, 'should create an sdk') }) }) From 77425c3f4dc8d5fda07eeb7e0e58aced8593e025 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:03:43 -0500 Subject: [PATCH 050/167] Remove search querystring from trace span names --- templates/boltzmann/core/honeycomb.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 9837dda3..f963c474 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -352,10 +352,10 @@ class Honeycomb { // Some non-standard OpenTelemetry attributes we add in // the middlewares... - public static OTEL_REQ_QUERY = 'boltzmann.query' + public static OTEL_REQ_QUERY = 'boltzmann.http.query' public static paramAttribute(param: string): string { - return `boltzmann.request.param.${param}` + return `boltzmann.http.request.param.${param}` } // Initialize Honeycomb! Stands up the otel node SDK if enabled, @@ -474,7 +474,7 @@ class Honeycomb { // Start a parent span const span = tracer.startSpan( - `${context.method} ${context.url.pathname}${context.url.search}`, + `${context.method} ${context.url.pathname}`, { attributes: { [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, From c902ec75f01d98078349eb3e347417bed1c106e5 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:04:19 -0500 Subject: [PATCH 051/167] Use HTTP_CLIENT_IP instead of NET_PEER_IP --- templates/boltzmann/core/honeycomb.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index f963c474..f0d841a5 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -479,7 +479,7 @@ class Honeycomb { attributes: { [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, [otelSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, - [otelSemanticConventions.SemanticAttributes.NET_PEER_IP]: context.remote, + [otelSemanticConventions.SemanticAttributes.HTTP_CLIENT_IP]: context.remote, [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, From 7c1fd0e43380fe65208487b2fcd2eca310109c31 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:04:30 -0500 Subject: [PATCH 052/167] Set span kind to SERVER --- templates/boltzmann/core/honeycomb.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index f0d841a5..a4d69a45 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -485,7 +485,8 @@ class Honeycomb { [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, // TODO: Honeycomb.Attributes obvs [Honeycomb.OTEL_REQ_QUERY]: context.url.search - } + }, + kind: otelAPI.SpanKind.SERVER } ) From dcacaab03a40de1fae11fa627396c9d68f9146ea Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:34:06 -0500 Subject: [PATCH 053/167] Clean up trace propagation code --- templates/boltzmann/core/honeycomb.ts | 58 +++++++++++++-------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index a4d69a45..833dd387 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -121,6 +121,7 @@ interface OtelFactories { traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtlpInstrumentation[] + traceContextPropagator: () => otelAPI.TextMapPropagator sdk: ( serviceName: string, instrumentations: OtlpInstrumentation[], @@ -184,6 +185,10 @@ const defaultOtelFactories: OtelFactories = { return is }, + traceContextPropagator(): W3CTraceContextPropagator { + return new W3CTraceContextPropagator() + }, + // The SDK will take a service name, instrumentations // and a trace exporter and give us a stateful singleton. // This is that singleton! @@ -389,6 +394,10 @@ class Honeycomb { provider.addSpanProcessor(processor) provider.register() + const propagator = f.traceContextPropagator() + + otelAPI.propagation.setGlobalPropagator(propagator) + this.sdk = f.sdk( serviceName, instrumentations, @@ -469,11 +478,20 @@ class Honeycomb { * ▔▏┗┻┛┃┃┗┻┛▕▔ */ - const tracer = this.tracer - let carrier = {} + // TODO: In order to get trace propagation working correctly, we *may* + // need to extract the parent context with the request headers. I *believe* + // setting the W3CTraceContextPropagator as global and trace.setSpan are + // enough, but this needs to be confirmed. + /* + const parentContext = propagator.extract( + otelAPI.ROOT_CONTEXT, + context.request.headers, + otelAPI.defaultTextMapGetter + ) + */ // Start a parent span - const span = tracer.startSpan( + const span = this.tracer.startSpan( `${context.method} ${context.url.pathname}`, { attributes: { @@ -483,39 +501,13 @@ class Honeycomb { [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - // TODO: Honeycomb.Attributes obvs [Honeycomb.OTEL_REQ_QUERY]: context.url.search }, kind: otelAPI.SpanKind.SERVER } ) - // this propagator takes care of extracting trace parent - // and state from request headers (and so on) - const propagator = new otelCore.W3CTraceContextPropagator() - - propagator.inject( - otelAPI.trace.setSpanContext( - otelAPI.ROOT_CONTEXT, - span.spanContext() - ), - carrier, - otelAPI.defaultTextMapSetter - ) - - /* TODO: Do I need to create and set a context? No, right? - - // create a parent active context - const parentContext = propagator.extract( - otelAPI.ROOT_CONTEXT, - carrier, - otelAPI.defaultTextMapGetter - ) - - // set the active context - await traceContext.with(parentContext, async () => { - - */ + otelAPI.trace.setSpan(otelAPI.context.active(), span) return { end: async () => { @@ -940,6 +932,12 @@ if (require.main === module) { ) }) + test('traceContextPropagator', async (assert: Test) => { + assert.doesNotThrow(() => { + defaultOtelFactories.traceContextPropagator() + }) + }) + test('sdk', async (assert: Test) => { // run the init function assert.doesNotThrow(() => { From 1e2336d13112dc10df1a8ba012a9f0fc08539a1c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 12:36:25 -0500 Subject: [PATCH 054/167] Fix W3CTraceContextPropagator import --- templates/boltzmann/core/honeycomb.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 833dd387..558f47e7 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -185,8 +185,8 @@ const defaultOtelFactories: OtelFactories = { return is }, - traceContextPropagator(): W3CTraceContextPropagator { - return new W3CTraceContextPropagator() + traceContextPropagator(): otelCore.W3CTraceContextPropagator { + return new otelCore.W3CTraceContextPropagator() }, // The SDK will take a service name, instrumentations From 2c1c0a29be3f58e012360a3c1232e70051b8626b Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 8 Feb 2022 16:42:34 -0500 Subject: [PATCH 055/167] update core/middleware to use honeycomb facade API --- templates/boltzmann/core/honeycomb.ts | 11 +++++++--- templates/boltzmann/core/middleware.ts | 29 +++++++++++++++++--------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 558f47e7..fc5e424c 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -641,7 +641,6 @@ class Honeycomb { // (OTLP doesn't have the same trace concept as beelines. Returns // a Span object. public async startSpan(name: string, attributes?: { [a: string]: string | undefined }): Promise { - if (!this.features.honeycomb || !this.initialized) { return { async end() {} @@ -652,7 +651,13 @@ class Honeycomb { return this._startBeelineSpan(name, attributes || {}) } - const span = this.tracer.startSpan(name) + const spanOpts: otelAPI.SpanOptions = { kind: otelAPI.SpanKind.SERVER } + + if (attributes) { + spanOpts.attributes = attributes + } + + const span = this.tracer.startSpan(name, spanOpts) otelAPI.trace.setSpan(otelAPI.context.active(), span) return { @@ -663,7 +668,7 @@ class Honeycomb { } - private async _startBeelineSpan(name: string, attributes: { [a: string]: string | undefined}): Promise { + private async _startBeelineSpan(name: string, attributes: { [a: string]: string | undefined }): Promise { if (!this.features.honeycomb || !this.initialized) { return { async end() {} diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 96555ed3..798ada0b 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -4,6 +4,7 @@ export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddlewa import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' +import { otelSemanticConventions } from '../core/honeycomb' import { enforceInvariants } from '../middleware/enforce-invariants' import { honeycombMiddlewareSpans } from '../middleware/honeycomb' import { BodyParserDefinition } from '../core/body' @@ -84,16 +85,24 @@ async function buildMiddleware (middleware: MiddlewareConfig[], router: Handler) async function handler (context: Context) { const handler = context.handler as Handler // {% if honeycomb %} - const span = await honeycomb.startSpan( - `handler: ${handler.name}`, - { - 'handler.name': handler.name, - 'handler.method': String(handler.method), - 'handler.route': handler.route, - 'handler.version': handler.version || '*', - 'handler.decorators': String(handler.decorators) - } - ) + + // TODO: This check is for backwards-compatibility reasons and may be + // removed in the future. + const spanOpts = honeycomb.features.otel ? { + [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: String(handler.method), + [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, + 'boltzmann.http.handler.name': handler.name, + 'boltzmann.http.handler.version': handler.version || '*', + 'boltzmann.http.handler.decorators': String(handler.decorators) + } : { + 'handler.name': handler.name, + 'handler.method': String(handler.method), + 'handler.route': handler.route, + 'handler.version': handler.version || '*', + 'handler.decorators': String(handler.decorators) + } + + const span = await honeycomb.startSpan(`handler: ${handler.name}`, spanOpts) try { // {% endif %} From 82708929cf711b341d7ddb04a36787391b60c336 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 15 Feb 2022 15:38:02 -0500 Subject: [PATCH 056/167] Failing test for honeycomb/otel instrumentation --- templates/boltzmann/core/honeycomb.ts | 97 +++++++++++++++++---- templates/boltzmann/core/middleware.ts | 94 +++++++++++++++++++- templates/boltzmann/middleware/honeycomb.ts | 1 + templates/boltzmann/middleware/ping.ts | 1 + 4 files changed, 172 insertions(+), 21 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index fc5e424c..afb7ddd3 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -44,20 +44,17 @@ import * as otelSemanticConventions from '@opentelemetry/semantic-conventions' // and postgres instrumentation if those respective features // are enabled. // -// TODO: Can these be overridden? -// // Some instrumentation that is NOT included, because boltzmann // doesn't support the technology: // // * @opentelemetry/instrumentation-grpc // * @opentelemetry/instrumentation-graphql // -// TODO: Double-check these -// // Some packages which, to our knowledge, don't have available // instrumentations: // // * undici +// import { Instrumentation as OtlpInstrumentation } from '@opentelemetry/instrumentation' import { DnsInstrumentation as OtlpDnsInstrumentation } from '@opentelemetry/instrumentation-dns' import { HttpInstrumentation as OtlpHttpInstrumentation } from '@opentelemetry/instrumentation-http' @@ -317,11 +314,17 @@ class Honeycomb { public features: HoneycombFeatures public factories: OtelFactories - public initialized: boolean - public started: boolean + public tracerProvider: NodeTracerProvider | null + public traceExporter: OTLPTraceExporter | null + public spanProcessor: otelTraceBase.SpanProcessor | null + public instrumentations: OtlpInstrumentation[] | null + public traceContextPropagator: otelAPI.TextMapPropagator | null public sdk: OtelSDK | null public tracer: otelAPI.Tracer + public initialized: boolean + public started: boolean + constructor( options: HoneycombOptions, overrides: OtelFactoryOverrides = {} @@ -334,8 +337,15 @@ class Honeycomb { } this.initialized = false this.started = false + + this.tracerProvider = null + this.traceExporter = null + this.spanProcessor = null + this.instrumentations = null + this.traceContextPropagator = null this.sdk = null this.tracer = otelAPI.trace.getTracer('boltzmann', '1.0.0') + this.factories = { ...defaultOtelFactories, ...(overrides || {}) @@ -368,13 +378,17 @@ class Honeycomb { // This needs to occur before any imports you want instrumentation // to be aware of. public init(): void { + if (!this.features.honeycomb) { + this.initialized = true + return + } try { const writeKey = this.getWriteKey(); const dataset = this.getDataset(); const sampleRate = this.options.sampleRate || 1; const serviceName = this.options.serviceName; - if (!this.features.honeycomb) { + if (!this.features.otel) { beeline({ writeKey, dataset, sampleRate, serviceName }) this.initialized = true return @@ -398,16 +412,24 @@ class Honeycomb { otelAPI.propagation.setGlobalPropagator(propagator) - this.sdk = f.sdk( + const sdk = f.sdk( serviceName, instrumentations, exporter ) + this.traceExporter = exporter + this.spanProcessor = processor + this.instrumentations = instrumentations + this.tracerProvider = provider + this.traceContextPropagator = propagator + + this.sdk = sdk + this.initialized = true } catch (err) { if (err instanceof HoneycombError) { - // Honeycomb.log(err); + Honeycomb.log(err); return; } throw err; @@ -427,14 +449,8 @@ class Honeycomb { await shutdown() } - async function shutdown() { - if (sdk) { - try { - await sdk.shutdown() - } catch (err) { - Honeycomb.log(err) - } - } + const shutdown = async () => { + await this.stop() process.exit(exitCode) } @@ -448,6 +464,16 @@ class Honeycomb { this.started = true } + public async stop(): Promise { + const sdk = this.sdk + if (!sdk) return + try { + await sdk.shutdown() + } catch (err) { + Honeycomb.log(err) + } + } + // Start a trace. Returns a Trace, which may be closed by calling // `trace.end()`. public async startTrace(context: Context, headerSources?: string[]): Promise { @@ -718,6 +744,43 @@ export { } void `{% if selftest %}` + +class OtelTestSpanProcessor extends otelTraceBase.SimpleSpanProcessor { + public _exporterCreatedSpans: otelTraceBase.ReadableSpan[] = [] + + constructor(_exporter: otelTraceBase.SpanExporter) { + super(_exporter) + this._exporterCreatedSpans = [] + } + + onEnd(span: otelTraceBase.ReadableSpan): void { + this._exporterCreatedSpans.push(span) + + // Don't call onEnd on super - we don't actually want this span to get + // emitted! + } +} + +function getOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): otelTraceBase.ReadableSpan[] { + const processor: any = spanProcessor + + if (!processor) { + throw new Error( + 'Span processor is not defined - did you initialize honeycomb?' + ) + } + + if (!processor._exporterCreatedSpans) { + throw new Error( + 'Span processor has no test spans - did you create an OtelTestSpanProcessor?' + ) + } + + return (processor._exporterCreatedSpans) +} + +export { getOtelTestSpans, OtelTestSpanProcessor } + import tap from 'tap' type Test = (typeof tap.Test)["prototype"] diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 798ada0b..f594ed1d 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,14 +1,42 @@ void `{% if selftest %}`; +import { honeycomb } from '../core/prelude' +import { getOtelTestSpans, OtelTestSpanProcessor } from '../core/honeycomb' + +/* c8 ignore next */ +if (require.main === module) { + // TODO: Cram this into a test helper in honeycomb core + honeycomb.options = { + serviceName: 'boltzmann-test', + disable: false, + otel: true, + writeKey: 'SOME_WRITEKEY', + dataset: 'SOME_DATASET', + apiHost: 'grpc://api-host.com', + sampleRate: 1 + } + + honeycomb.features = { + honeycomb: true, + beeline: false, + otel: true + } + + honeycomb.factories.spanProcessor = (traceExporter) => { + return new OtelTestSpanProcessor(traceExporter) + } + + honeycomb.init() +} + export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } +import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' - import { otelSemanticConventions } from '../core/honeycomb' import { enforceInvariants } from '../middleware/enforce-invariants' -import { honeycombMiddlewareSpans } from '../middleware/honeycomb' +import { honeycombMiddlewareSpans, trace } from '../middleware/honeycomb' import { BodyParserDefinition } from '../core/body' -import { honeycomb, HttpMetadata } from '../core/prelude' import { route } from '../middleware/route' import { Context } from '../data/context' import { dev } from '../middleware/dev' @@ -44,7 +72,8 @@ interface Adaptor { interface Middleware { (...args: any[]): Adaptor - name?: string + name?: string, + doNotTrace?: boolean } type MiddlewareConfig = Middleware | [Middleware, ...any[]] @@ -88,6 +117,7 @@ async function handler (context: Context) { // TODO: This check is for backwards-compatibility reasons and may be // removed in the future. + // TODO: Refactor this into `honeycomb.startHandlerSpan` const spanOpts = honeycomb.features.otel ? { [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: String(handler.method), [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, @@ -113,3 +143,59 @@ async function handler (context: Context) { } // {% endif %} } + + +void `{% if selftest %}` +import tap from 'tap' +type Test = (typeof tap.Test)["prototype"] +import { runserver } from '../bin/runserver' +import { inject } from '@hapi/shot' + +// A simple test middleware that intercepts the request prior to any +// handlers seeing it +const helloMiddleware: Middleware = () => { + return (next: Handler) => { + return (context: Context) => { + return 'Hello!' + } + } +} + +// A simple test handler which throws - useful for ensuring that the handler +// isn't called +const throwingHandler: Handler = (context: Context) => { + throw new Error('handler should not be called') +} +throwingHandler.route = 'GET /' + +/* c8 ignore next */ +if (require.main === module) { + const { test } = tap + + test('honeycomb-instrumented middlewares emit spans', async (assert: Test) => { + await honeycomb.start() + + const server = await runserver({ + middleware: [ + // The "trace" middleware is marked as doNotTrace, so we shouldn't + // be creating pre-trace spans (but should get a trace span) + trace, + // This middleware *should* get auto-spanned + helloMiddleware + ], + handlers: { handler: throwingHandler } + }) + const [onRequest] = server.listeners('request') + const response = await inject(onRequest, { method: 'GET', url: '/' }) + + assert.same(response.payload, 'Hello!') + + await honeycomb.stop() + + const spans = getOtelTestSpans(honeycomb.spanProcessor) + + assert.same(spans.length, 2, 'two spans should be emitted') + }) +} + +void `{% endif %}` diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 2e7e45f8..1421d174 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -6,6 +6,7 @@ import { Context } from '../data/context' import onHeaders from 'on-headers' void `{% endif %}`; +trace.doNotTrace = true function trace ({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { diff --git a/templates/boltzmann/middleware/ping.ts b/templates/boltzmann/middleware/ping.ts index ee9ce1e4..c3b58d54 100644 --- a/templates/boltzmann/middleware/ping.ts +++ b/templates/boltzmann/middleware/ping.ts @@ -6,6 +6,7 @@ import { Context } from '../data/context' import { ship } from '../core/prelude' void `{% endif %}`; +handlePing.doNotTrace = true function handlePing () { return (next: Handler) => (context: Context) => { if (context.url.pathname === '/monitor/ping') { From 86959cf667d14181e51fa2841afd4f809ed78fe7 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 16 Feb 2022 14:23:31 -0500 Subject: [PATCH 057/167] Respect doNotTrace and fill in test asserts --- templates/boltzmann/core/honeycomb.ts | 4 +- templates/boltzmann/core/middleware.ts | 84 ++++++++++++++++++++- templates/boltzmann/middleware/honeycomb.ts | 4 +- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index afb7ddd3..2d6e387d 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -754,7 +754,9 @@ class OtelTestSpanProcessor extends otelTraceBase.SimpleSpanProcessor { } onEnd(span: otelTraceBase.ReadableSpan): void { - this._exporterCreatedSpans.push(span) + // collect spans in the order they were opened (they close in the + // opposite order) + this._exporterCreatedSpans.unshift(span) // Don't call onEnd on super - we don't actually want this span to get // emitted! diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index f594ed1d..fb7f3c99 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -6,7 +6,7 @@ import { getOtelTestSpans, OtelTestSpanProcessor } from '../core/honeycomb' if (require.main === module) { // TODO: Cram this into a test helper in honeycomb core honeycomb.options = { - serviceName: 'boltzmann-test', + serviceName: 'test-app', disable: false, otel: true, writeKey: 'SOME_WRITEKEY', @@ -25,6 +25,10 @@ if (require.main === module) { return new OtelTestSpanProcessor(traceExporter) } + // TODO: Test + adjust to ensure no spans get emitted for the /monitor/ping + // route + // honeycomb.factories.instrumentations = () => [] + honeycomb.init() } @@ -194,7 +198,83 @@ if (require.main === module) { const spans = getOtelTestSpans(honeycomb.spanProcessor) - assert.same(spans.length, 2, 'two spans should be emitted') + // TODO: Clean this up when I'm confident in the asserts + // ssert.same(spans, [], 'un-comment this to render all spans') + + const instrumentationSpans = spans.map(span => { + return { + spanName: span.name, + library: span.instrumentationLibrary.name + } + }).filter( + span => span.library.match(/^@opentelemetry\/instrumentation-/) + ) + + const boltzmannSpans = spans.map(span => { + const context = span.spanContext() + + return { + spanName: span.name, + serviceName: String(span.resource.attributes['service.name']).split(':')[0], + library: span.instrumentationLibrary.name, + spanId: context.spanId, + traceId: context.traceId, + parentSpanId: span.parentSpanId, + attributes: span.attributes + } + + }).filter( + span => !span.library.match(/^@opentelemetry\/instrumentation-/) + ) + + assert.same( + instrumentationSpans, + [ + // This span fires when OpenTelemetry fails to send a span to the + // grpc endpoint (which is pretty funny) + { + spanName: 'HTTP GET', + library: '@opentelemetry/instrumentation-http' + } + ], + 'auto-instrumentation is emitting expected spans' + ) + + assert.same( + boltzmannSpans, + [ + { + spanName: 'GET /', + serviceName: 'test-app', + library: 'boltzmann', + traceId: boltzmannSpans[0].traceId, + spanId: boltzmannSpans[0].spanId, + parentSpanId: undefined, + attributes: { + "http.host": "localhost", + "http.url": "http://localhost/", + "http.client_ip": "", + "http.method": "GET", + "http.scheme": "http:", + "http.route": "/", + "boltzmann.http.query": "", + "http.status_code": "200", + } + + }, + { + spanName: 'mw: helloMiddleware', + serviceName: 'test-app', + library: 'boltzmann', + traceId: boltzmannSpans[0].traceId, + spanId: boltzmannSpans[1].spanId, + parentSpanId: boltzmannSpans[0].spanId, + // TODO: There *should* be attributes here, no? + attributes: {} + } + ], + "There are two nested spans, in the same trace, with service name and attributes" + ) }) } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 1421d174..85117680 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -24,8 +24,8 @@ function trace ({ } } -function honeycombMiddlewareSpans ({name}: {name?: string} = {}) { - if (honeycomb.options.disable) { +function honeycombMiddlewareSpans ({name, doNotTrace}: {name?: string, doNotTrace?: boolean} = {}) { + if (honeycomb.options.disable || doNotTrace) { return (next: Handler) => (context: Context) => next(context) } From 036e4d6e528e46e22fde5d6dfe9fcf6cc69a1210 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 16 Feb 2022 18:13:56 -0500 Subject: [PATCH 058/167] Attempt to plumb up contexts better --- templates/boltzmann/core/honeycomb.ts | 36 +++++++++++++++++++-------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 2d6e387d..1748a1f4 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -508,17 +508,20 @@ class Honeycomb { // need to extract the parent context with the request headers. I *believe* // setting the W3CTraceContextPropagator as global and trace.setSpan are // enough, but this needs to be confirmed. - /* - const parentContext = propagator.extract( - otelAPI.ROOT_CONTEXT, - context.request.headers, + + let traceContext = otelAPI.context.active() + + // TODO: Do we need this step? Esp. if we don't set any context + // properties? + traceContext = otelAPI.propagation.extract( + traceContext, + {}, otelAPI.defaultTextMapGetter ) - */ - // Start a parent span const span = this.tracer.startSpan( `${context.method} ${context.url.pathname}`, + // TODO: Move attributes to middleware { attributes: { [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, @@ -529,11 +532,12 @@ class Honeycomb { [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, [Honeycomb.OTEL_REQ_QUERY]: context.url.search }, - kind: otelAPI.SpanKind.SERVER - } + kind: otelAPI.SpanKind.SERVER, + }, + traceContext ) - otelAPI.trace.setSpan(otelAPI.context.active(), span) + otelAPI.trace.setSpan(traceContext, span) return { end: async () => { @@ -677,14 +681,24 @@ class Honeycomb { return this._startBeelineSpan(name, attributes || {}) } + let traceContext = otelAPI.context.active() + + // TODO: Do we need this step? Esp. if we don't set any context + // properties? + traceContext = otelAPI.propagation.extract( + traceContext, + {}, + otelAPI.defaultTextMapGetter + ) + const spanOpts: otelAPI.SpanOptions = { kind: otelAPI.SpanKind.SERVER } if (attributes) { spanOpts.attributes = attributes } - const span = this.tracer.startSpan(name, spanOpts) - otelAPI.trace.setSpan(otelAPI.context.active(), span) + const span = this.tracer.startSpan(name, spanOpts, traceContext) + otelAPI.trace.setSpan(traceContext, span) return { async end() { From 25a0a477b2a7efffbfefa36e8e33444be831956c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 17 Feb 2022 13:17:17 -0500 Subject: [PATCH 059/167] spruced up the test trace propagator --- templates/boltzmann/core/honeycomb.ts | 43 +++++++++++++++++++++----- templates/boltzmann/core/middleware.ts | 32 +++++++++---------- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 1748a1f4..e2570dd0 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -687,7 +687,12 @@ class Honeycomb { // properties? traceContext = otelAPI.propagation.extract( traceContext, - {}, + { + // TODO: Need to do plumbing here - note that the trace context does + // not have these fields, so this is extremely wrong! + // traceparent: traceContext.traceId, + // tracestate: traceContext.traceState + }, otelAPI.defaultTextMapGetter ) @@ -768,12 +773,12 @@ class OtelTestSpanProcessor extends otelTraceBase.SimpleSpanProcessor { } onEnd(span: otelTraceBase.ReadableSpan): void { - // collect spans in the order they were opened (they close in the - // opposite order) - this._exporterCreatedSpans.unshift(span) + // don't call super's onEnd, if only because it mysteriously causes + // sdk startup to time out in test - // Don't call onEnd on super - we don't actually want this span to get - // emitted! + // note that this collects spans as they *close*, meaning a parent span + // will be *behind* its children + this._exporterCreatedSpans.push(span) } } @@ -788,14 +793,36 @@ function getOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): ot if (!processor._exporterCreatedSpans) { throw new Error( - 'Span processor has no test spans - did you create an OtelTestSpanProcessor?' + 'Span processor is not an OtelTestSpanProcessor' ) } return (processor._exporterCreatedSpans) } -export { getOtelTestSpans, OtelTestSpanProcessor } +function resetOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): void { + const processor: any = spanProcessor + + if (!processor) { + throw new Error( + 'Span processor is not defined - did you initialize honeycomb?' + ) + } + + if (!processor._exporterCreatedSpans) { + throw new Error( + 'Span processor is not an OtelTestSpanProcessor' + ) + } + + processor._exporterCreatedSpans = [] +} + +export { + getOtelTestSpans, + OtelTestSpanProcessor, + resetOtelTestSpans +} import tap from 'tap' type Test = (typeof tap.Test)["prototype"] diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index fb7f3c99..f3273aa3 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -199,7 +199,7 @@ if (require.main === module) { const spans = getOtelTestSpans(honeycomb.spanProcessor) // TODO: Clean this up when I'm confident in the asserts - // ssert.same(spans, [], 'un-comment this to render all spans') + assert.same(spans, [], 'un-comment this to render all spans') const instrumentationSpans = spans.map(span => { return { @@ -230,8 +230,7 @@ if (require.main === module) { assert.same( instrumentationSpans, [ - // This span fires when OpenTelemetry fails to send a span to the - // grpc endpoint (which is pretty funny) + // These are all grpc api client calls - very meta! { spanName: 'HTTP GET', library: '@opentelemetry/instrumentation-http' @@ -243,13 +242,25 @@ if (require.main === module) { assert.same( boltzmannSpans, [ + // The middleware span { - spanName: 'GET /', + spanName: 'mw: helloMiddleware', serviceName: 'test-app', library: 'boltzmann', traceId: boltzmannSpans[0].traceId, spanId: boltzmannSpans[0].spanId, parentSpanId: undefined, + // TODO: There *should* be attributes here, no? + attributes: {} + }, + // The request-level parent span + { + spanName: 'GET /', + serviceName: 'test-app', + library: 'boltzmann', + traceId: boltzmannSpans[0].traceId, + spanId: boltzmannSpans[0].spanId, + parentSpanId: boltzmannSpans[0].spanId, attributes: { "http.host": "localhost", "http.url": "http://localhost/", @@ -260,19 +271,8 @@ if (require.main === module) { "boltzmann.http.query": "", "http.status_code": "200", } - }, - { - spanName: 'mw: helloMiddleware', - serviceName: 'test-app', - library: 'boltzmann', - traceId: boltzmannSpans[0].traceId, - spanId: boltzmannSpans[1].spanId, - parentSpanId: boltzmannSpans[0].spanId, - // TODO: There *should* be attributes here, no? - attributes: {} - } - ], + ], "There are two nested spans, in the same trace, with service name and attributes" ) }) From 802497dd482bab1977b8be88848cc6d7d961892a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 17 Feb 2022 13:34:40 -0500 Subject: [PATCH 060/167] Extra log lines for honeycomb tracing (parent/child spans not connecting in beelines) --- templates/boltzmann/core/honeycomb.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index e2570dd0..36abb401 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -593,6 +593,7 @@ class Honeycomb { const tracker = require('honeycomb-beeline/lib/async_tracker') const _headerSources = headerSources || this.defaultHeaderSources const traceContext = _getBeelineTraceContext(context) + const trace = beeline.startTrace({ [schema.EVENT_TYPE]: 'boltzmann', [schema.PACKAGE_VERSION]: '1.0.0', @@ -647,19 +648,24 @@ class Honeycomb { const source = _headerSources.find((header: string) => header in context.headers) if (!source || !context.headers[source]) { + Honeycomb.log('No source header?!') return {} } if (source === 'x-honeycomb-trace') { + Honeycomb.log(`we have a trace header!! ${source}`) const data = beeline.unmarshalTraceContext(context.headers[source]) if (!data) { + Honeycomb.log('unmarshalling trace context yielded no data T_T') return {} } return Object.assign({}, data, { source: `${source} http header` }) } + Honeycomb.log(`we have an http request header! ${source}`) + return { traceId: context.headers[source], source: `${source} http header` From d7b5f28d7eeec450c77cd782664fe94c45b3ea0a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 12:45:36 -0500 Subject: [PATCH 061/167] Refactor honeycomb mocking - tests should all use the same mock object now --- templates/boltzmann/core/honeycomb.ts | 30 +++++++++++++++++ templates/boltzmann/core/middleware.ts | 46 +++++++------------------- templates/boltzmann/core/prelude.ts | 5 ++- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 36abb401..801b0fb2 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -243,6 +243,36 @@ class Honeycomb { ) } + public static mock(): Honeycomb { + return new Honeycomb( + { + serviceName: 'test-app', + disable: false, + otel: true, + writeKey: 'SOME_WRITEKEY', + dataset: 'SOME_DATASET', + apiHost: 'grpc://api-host.com', + sampleRate: 1 + }, + // TODO: Test + adjust to ensure no spans get emitted for the /monitor/ping route + // honeycomb.factories.instrumentations = () => [] + { + spanProcessor(traceExporter) { + return new OtelTestSpanProcessor(traceExporter) + } + } + ) + + // TODO: Test these for sensibility + /* + honeycomb.features = { + honeycomb: true, + beeline: false, + otel: true + } + */ + } + public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { // If there's no write key we won't get very far anyway const disable = !env.HONEYCOMB_WRITEKEY diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index f3273aa3..2c99d2fa 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,39 +1,6 @@ void `{% if selftest %}`; import { honeycomb } from '../core/prelude' -import { getOtelTestSpans, OtelTestSpanProcessor } from '../core/honeycomb' - -/* c8 ignore next */ -if (require.main === module) { - // TODO: Cram this into a test helper in honeycomb core - honeycomb.options = { - serviceName: 'test-app', - disable: false, - otel: true, - writeKey: 'SOME_WRITEKEY', - dataset: 'SOME_DATASET', - apiHost: 'grpc://api-host.com', - sampleRate: 1 - } - - honeycomb.features = { - honeycomb: true, - beeline: false, - otel: true - } - - honeycomb.factories.spanProcessor = (traceExporter) => { - return new OtelTestSpanProcessor(traceExporter) - } - - // TODO: Test + adjust to ensure no spans get emitted for the /monitor/ping - // route - // honeycomb.factories.instrumentations = () => [] - - honeycomb.init() -} - -export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } - +import { getOtelTestSpans } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' @@ -148,6 +115,17 @@ async function handler (context: Context) { // {% endif %} } +void `{%if selftest %}`; +export { + Response, + Handler, + Adaptor, + Middleware, + MiddlewareConfig, + buildMiddleware, + handler +} +void `{% endif %}`; void `{% if selftest %}` import tap from 'tap' diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 6784371a..9a92e95c 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -73,7 +73,10 @@ if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET } -const honeycomb: Honeycomb = Honeycomb.fromEnv(serviceName, process.env); +let honeycomb: Honeycomb = Honeycomb.fromEnv(serviceName, process.env); +void `{% if selftest }`; +honeycomb = Honeycomb.mock() +void `{% endif %}`; honeycomb.init() From c1989455cae08c6f9cf89c3a1e21c0ba6582934b Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 13:55:51 -0500 Subject: [PATCH 062/167] Move span/trace up/down logic back into middleware --- templates/boltzmann/core/honeycomb.ts | 329 ++------------------ templates/boltzmann/core/middleware.ts | 71 +++-- templates/boltzmann/middleware/honeycomb.ts | 300 +++++++++++++++++- 3 files changed, 359 insertions(+), 341 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 801b0fb2..34de3f32 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -55,23 +55,16 @@ import * as otelSemanticConventions from '@opentelemetry/semantic-conventions' // // * undici // -import { Instrumentation as OtlpInstrumentation } from '@opentelemetry/instrumentation' -import { DnsInstrumentation as OtlpDnsInstrumentation } from '@opentelemetry/instrumentation-dns' -import { HttpInstrumentation as OtlpHttpInstrumentation } from '@opentelemetry/instrumentation-http' +import { Instrumentation as OtelInstrumentation } from '@opentelemetry/instrumentation' +import { DnsInstrumentation as OtelDnsInstrumentation } from '@opentelemetry/instrumentation-dns' +import { HttpInstrumentation as OtelHttpInstrumentation } from '@opentelemetry/instrumentation-http' void `{% if redis %}`; -import { RedisInstrumentation as OtlpRedisInstrumentation } from '@opentelemetry/instrumentation-redis' +import { RedisInstrumentation as OtelRedisInstrumentation } from '@opentelemetry/instrumentation-redis' void `{% endif %}` void `{% if postgres %}` -import { PgInstrumentation as OtlpPgInstrumentation } from '@opentelemetry/instrumentation-pg' -void `{% endif %}` - -void `{% if selftest %}` -import { ServerResponse } from 'http' - -import { Context } from '../data/context' -import { Handler } from './middleware' +import { PgInstrumentation as OtelPgInstrumentation } from '@opentelemetry/instrumentation-pg' void `{% endif %}` class HoneycombError extends Error { @@ -84,7 +77,7 @@ interface HoneycombOptions { // disabled disable?: boolean - // When true, Do Otlp + // When true, Do Otel otel?: boolean // The Honeycomb write key and dataset @@ -117,11 +110,11 @@ interface OtelFactories { tracerProvider: (sampler: otelAPI.Sampler) => NodeTracerProvider traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor - instrumentations: () => OtlpInstrumentation[] + instrumentations: () => OtelInstrumentation[] traceContextPropagator: () => otelAPI.TextMapPropagator sdk: ( serviceName: string, - instrumentations: OtlpInstrumentation[], + instrumentations: OtelInstrumentation[], traceExporter: OTLPTraceExporter ) => OtelSDK } @@ -166,17 +159,17 @@ const defaultOtelFactories: OtelFactories = { }, instrumentations () { - let is: OtlpInstrumentation[] = [ - new OtlpDnsInstrumentation({}), - new OtlpHttpInstrumentation({}), + let is: OtelInstrumentation[] = [ + new OtelDnsInstrumentation({}), + new OtelHttpInstrumentation({}), ] void `{% if redis %}` - is.push(new OtlpRedisInstrumentation({})) + is.push(new OtelRedisInstrumentation({})) void `{% endif %}` void `{% if postgres %}` - is.push(new OtlpPgInstrumentation({})) + is.push(new OtelPgInstrumentation({})) void `{% endif %}` return is @@ -191,7 +184,7 @@ const defaultOtelFactories: OtelFactories = { // This is that singleton! sdk ( serviceName: string, - instrumentations: OtlpInstrumentation[], + instrumentations: OtelInstrumentation[], traceExporter: OTLPTraceExporter ): OtelSDK { return new OtelSDK({ @@ -214,20 +207,14 @@ interface OtelFactoryOverrides { tracerProvider?: (sampler: otelAPI.Sampler) => NodeTracerProvider traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor - instrumentations?: () => OtlpInstrumentation[]; + instrumentations?: () => OtelInstrumentation[]; sdk?: ( serviceName: string, - instrumentations: OtlpInstrumentation[], + instrumentations: OtelInstrumentation[], traceExporter: OTLPTraceExporter ) => OtelSDK; } -// An interface for the return value of Honeycomb#startSpan -// and/or Honeycomb#startTrace. -interface Span { - end(): Promise -} - // Let's GOOOOOOO class Honeycomb { // We load options from the environment. Unlike with Options, @@ -310,10 +297,6 @@ class Honeycomb { } } - public static _traceSpanName(method: string, pathname: string) { - return `${method} ${pathname}` - } - // These accessors are type guards that ensure you're working // with a defined/non-null property. It's a bit of 6-to-1 and // half a dozen on the other, because you trade ifs for @@ -347,7 +330,7 @@ class Honeycomb { public tracerProvider: NodeTracerProvider | null public traceExporter: OTLPTraceExporter | null public spanProcessor: otelTraceBase.SpanProcessor | null - public instrumentations: OtlpInstrumentation[] | null + public instrumentations: OtelInstrumentation[] | null public traceContextPropagator: otelAPI.TextMapPropagator | null public sdk: OtelSDK | null public tracer: otelAPI.Tracer @@ -503,267 +486,6 @@ class Honeycomb { Honeycomb.log(err) } } - - // Start a trace. Returns a Trace, which may be closed by calling - // `trace.end()`. - public async startTrace(context: Context, headerSources?: string[]): Promise { - if (!this.features.honeycomb || !this.initialized) { - return { - async end() {} - } - } - - if (!this.features.otel) { - // Call legacy beelines implementation - return this._startBeelineTrace(context, headerSources) - } - - if (headerSources) { - Honeycomb.log('trace headerSources are a beeline-only feature') - } - - /* - * ┏┓ - * ┃┃╱╲ in - * ┃╱╱╲╲ this - * ╱╱╭╮╲╲house - * ▔▏┗┛▕▔ we - * ╱▔▔▔▔▔▔▔▔▔▔╲ - * trace with opentelemetry - * ╱╱┏┳┓╭╮┏┳┓ ╲╲ - * ▔▏┗┻┛┃┃┗┻┛▕▔ - */ - - // TODO: In order to get trace propagation working correctly, we *may* - // need to extract the parent context with the request headers. I *believe* - // setting the W3CTraceContextPropagator as global and trace.setSpan are - // enough, but this needs to be confirmed. - - let traceContext = otelAPI.context.active() - - // TODO: Do we need this step? Esp. if we don't set any context - // properties? - traceContext = otelAPI.propagation.extract( - traceContext, - {}, - otelAPI.defaultTextMapGetter - ) - - const span = this.tracer.startSpan( - `${context.method} ${context.url.pathname}`, - // TODO: Move attributes to middleware - { - attributes: { - [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, - [otelSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, - [otelSemanticConventions.SemanticAttributes.HTTP_CLIENT_IP]: context.remote, - [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, - [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - [Honeycomb.OTEL_REQ_QUERY]: context.url.search - }, - kind: otelAPI.SpanKind.SERVER, - }, - traceContext - ) - - otelAPI.trace.setSpan(traceContext, span) - - return { - end: async () => { - return this._endTraceSpan(span, context); - } - } - } - - // Close an otel "parent span". - private async _endTraceSpan(span: otelAPI.Span, context: Context): Promise { - const handler: Handler = context.handler - - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, - String(context._response.statusCode) - ) - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_ROUTE, - handler.route - ) - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_METHOD, - handler.method - ) - span.setAttribute( - otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, - handler.version - ) - - Object.entries(context.params).map(([key, value]) => { - span.setAttribute( - Honeycomb.paramAttribute(key), - value - ) - }) - span.end() - } - - // Beelines implementation for starting/ending a trace - private defaultHeaderSources: string[] = [ 'x-honeycomb-trace', 'x-request-id' ] - - private async _startBeelineTrace( - context: Context, - headerSources?: string[] - ): Promise { - if (!this.features.honeycomb || !this.initialized) { - return { - async end() {} - } - } - - const schema = require('honeycomb-beeline/lib/schema') - const tracker = require('honeycomb-beeline/lib/async_tracker') - const _headerSources = headerSources || this.defaultHeaderSources - const traceContext = _getBeelineTraceContext(context) - - const trace = beeline.startTrace({ - [schema.EVENT_TYPE]: 'boltzmann', - [schema.PACKAGE_VERSION]: '1.0.0', - [schema.TRACE_SPAN_NAME]: Honeycomb._traceSpanName(context.method, context.url.pathname), - [schema.TRACE_ID_SOURCE]: traceContext.source, - 'request.host': context.host, - 'request.original_url': context.url.href, - 'request.remote_addr': context.remote, - 'request.method': context.method, - 'request.scheme': context.url.protocol, - 'request.path': context.url.pathname, - 'request.query': context.url.search - }, - traceContext.traceId, - traceContext.parentSpanId, - traceContext.dataset) - - if (isDev()) { - context._honeycombTrace = trace - } - - if (traceContext.customContext) { - beeline.addContext(traceContext.customContext) - } - - const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { - beeline.addContext({ - 'response.status_code': String(response.statusCode) - }) - - beeline.addContext({ - 'request.route': context.handler.route, - 'request.method': context.handler.method, - 'request.version': context.handler.version - }) - - const params = Object.entries(context.params).map(([key, value]) => { - return [`request.param.${key}`, value] - }) - beeline.addContext(Object.fromEntries(params)) - - beeline.finishTrace(trace) - }) - - return { - end: async () => { - boundFinisher(this, tracker.getTracked()) - } - } - - function _getBeelineTraceContext (context: Context) { - const source = _headerSources.find((header: string) => header in context.headers) - - if (!source || !context.headers[source]) { - Honeycomb.log('No source header?!') - return {} - } - - if (source === 'x-honeycomb-trace') { - Honeycomb.log(`we have a trace header!! ${source}`) - const data = beeline.unmarshalTraceContext(context.headers[source]) - - if (!data) { - Honeycomb.log('unmarshalling trace context yielded no data T_T') - return {} - } - - return Object.assign({}, data, { source: `${source} http header` }) - } - - Honeycomb.log(`we have an http request header! ${source}`) - - return { - traceId: context.headers[source], - source: `${source} http header` - } - } - } - - // Starting a span. For OpenTelemetry this is a "child" span - // (OTLP doesn't have the same trace concept as beelines. Returns - // a Span object. - public async startSpan(name: string, attributes?: { [a: string]: string | undefined }): Promise { - if (!this.features.honeycomb || !this.initialized) { - return { - async end() {} - } - } - - if (!this.features.otel) { - return this._startBeelineSpan(name, attributes || {}) - } - - let traceContext = otelAPI.context.active() - - // TODO: Do we need this step? Esp. if we don't set any context - // properties? - traceContext = otelAPI.propagation.extract( - traceContext, - { - // TODO: Need to do plumbing here - note that the trace context does - // not have these fields, so this is extremely wrong! - // traceparent: traceContext.traceId, - // tracestate: traceContext.traceState - }, - otelAPI.defaultTextMapGetter - ) - - const spanOpts: otelAPI.SpanOptions = { kind: otelAPI.SpanKind.SERVER } - - if (attributes) { - spanOpts.attributes = attributes - } - - const span = this.tracer.startSpan(name, spanOpts, traceContext) - otelAPI.trace.setSpan(traceContext, span) - - return { - async end() { - span.end() - } - } - - } - - private async _startBeelineSpan(name: string, attributes: { [a: string]: string | undefined }): Promise { - if (!this.features.honeycomb || !this.initialized) { - return { - async end() {} - } - } - - const span = beeline.startSpan({ name, ...attributes }) - - return { - async end() { - beeline.finishSpan(span) - } - } - } } export { @@ -777,14 +499,14 @@ export { otelTraceBase, NodeTracerProvider, otelSemanticConventions, - OtlpInstrumentation, - OtlpDnsInstrumentation, - OtlpHttpInstrumentation, + OtelInstrumentation, + OtelDnsInstrumentation, + OtelHttpInstrumentation, // {% if redis %} - OtlpRedisInstrumentation, + OtelRedisInstrumentation, // {% endif %} // {% if postgres %} - OtlpPgInstrumentation + OtelPgInstrumentation // {% endif %} } @@ -986,13 +708,6 @@ if (require.main === module) { 'should be url if url' ) }) - - t.test('Honeycomb._traceSpanName', async (assert: Test) => { - assert.same( - Honeycomb._traceSpanName('GET', '/echo'), - 'GET /echo' - ) - }); }) test('factories', async (t: Test) => { const options = { diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 2c99d2fa..d15ad32a 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,10 +1,9 @@ void `{% if selftest %}`; import { honeycomb } from '../core/prelude' -import { getOtelTestSpans } from '../core/honeycomb' +import { beeline, getOtelTestSpans, otelAPI, otelSemanticConventions } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' -import { otelSemanticConventions } from '../core/honeycomb' import { enforceInvariants } from '../middleware/enforce-invariants' import { honeycombMiddlewareSpans, trace } from '../middleware/honeycomb' import { BodyParserDefinition } from '../core/body' @@ -82,35 +81,67 @@ async function buildMiddleware (middleware: MiddlewareConfig[], router: Handler) }, Promise.resolve(router)) } +function handlerSpanName(handler: Handler) { + return `handler: ${handler.name || ''}` +} + async function handler (context: Context) { const handler = context.handler as Handler // {% if honeycomb %} + let beelineSpan = null + let otelSpan = null + if (honeycomb.features.beeline) { + beelineSpan = beeline.startSpan({ + name: handlerSpanName(handler), + 'handler.name': handler.name, + 'handler.method': String(handler.method), + 'handler.route': handler.route, + 'handler.version': handler.version || '*', + 'handler.decorators': String(handler.decorators) + }) + } else if (honeycomb.features.otel) { + let traceContext = otelAPI.context.active() - // TODO: This check is for backwards-compatibility reasons and may be - // removed in the future. - // TODO: Refactor this into `honeycomb.startHandlerSpan` - const spanOpts = honeycomb.features.otel ? { - [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: String(handler.method), - [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, - 'boltzmann.http.handler.name': handler.name, - 'boltzmann.http.handler.version': handler.version || '*', - 'boltzmann.http.handler.decorators': String(handler.decorators) - } : { - 'handler.name': handler.name, - 'handler.method': String(handler.method), - 'handler.route': handler.route, - 'handler.version': handler.version || '*', - 'handler.decorators': String(handler.decorators) - } + // TODO: Do we need this step? Esp. if we don't set any context + // properties? + traceContext = otelAPI.propagation.extract( + traceContext, + { + // TODO: Need to do plumbing here - note that the trace context does + // not have these fields, so this is extremely wrong! + // traceparent: traceContext.traceId, + // tracestate: traceContext.traceState + }, + otelAPI.defaultTextMapGetter + ) - const span = await honeycomb.startSpan(`handler: ${handler.name}`, spanOpts) + otelSpan = honeycomb.tracer.startSpan( + handlerSpanName(handler), + { + attributes: { + [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: String(handler.method), + [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, + 'boltzmann.http.handler.name': handler.name || '', + 'boltzmann.http.handler.version': handler.version || '*', + 'boltzmann.http.handler.decorators': String(handler.decorators), + }, + kind: otelAPI.SpanKind.SERVER + }, + traceContext + ) + otelAPI.trace.setSpan(traceContext, otelSpan) + } try { // {% endif %} return await handler(context) // {% if honeycomb %} } finally { - await span.end() + if (beelineSpan !== null) { + beeline.finishSpan(beelineSpan) + } else if (otelSpan !== null) { + otelSpan.end() + } } // {% endif %} } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 85117680..bc821e6d 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,45 +1,317 @@ void `{% if selftest %}`; -export { trace, honeycombMiddlewareSpans } import { honeycomb } from '../core/prelude' + +export { trace, honeycombMiddlewareSpans } +import { beeline, Honeycomb, otelAPI, otelSemanticConventions } from '../core/honeycomb' +import { ServerResponse } from 'http' import { Handler } from '../core/middleware' import { Context } from '../data/context' import onHeaders from 'on-headers' +import isDev from 'are-we-dev' void `{% endif %}`; +function traceName(method: string, pathname: string) { + return `${method} ${pathname}` +} + +function middlewareSpanName(name?: string) { + return `mw: ${name || ''}` +} + +// The trace middleware creates a request-level span or trace. It delegates +// to either a beeline or OpenTelemetry implementation depending on how +// the honeycomb object is configured. trace.doNotTrace = true function trace ({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { + if (!honeycomb.features.honeycomb || !honeycomb.initialized) { + return (next: Handler) => (context: Context) => next(context) + } + + if (honeycomb.features.beeline) { + return beelineTrace({ headerSources }) + } + + return otelTrace() +} + +// The spans middleware creates a span on top of nested middleware, injected +// between middlewares in the core buildMiddleware step. It delegates to +// either a beeline or OpenTelemetry implementation depending on how the +// honeycomb object is configured. +function honeycombMiddlewareSpans ({name, doNotTrace}: {name?: string, doNotTrace?: boolean} = {}) { + if (!honeycomb.features.honeycomb || doNotTrace) { + return (next: Handler) => (context: Context) => next(context) + } + + if (honeycomb.features.beeline) { + return beelineMiddlewareSpans({name}) + } + + return otelMiddlewareSpans({name}) +} + +// Beeline implementations of trace and span, respectively. + +function beelineTrace ({ + headerSources = ['x-honeycomb-trace', 'x-request-id'], +} = {}) { + const schema = require('honeycomb-beeline/lib/schema') + const tracker = require('honeycomb-beeline/lib/async_tracker') + return function honeycombTrace (next: Handler) { - return async (context: Context) => { - const trace = await honeycomb.startTrace(context, headerSources) + return (context: Context) => { + Honeycomb.log('starting a beeline trace') + const traceContext = _getTraceContext(context) + + const trace = beeline.startTrace({ + [schema.EVENT_TYPE]: 'boltzmann', + [schema.PACKAGE_VERSION]: '1.0.0', + [schema.TRACE_SPAN_NAME]: traceName(context.method, context.url.pathname), + [schema.TRACE_ID_SOURCE]: traceContext.source, + 'request.host': context.host, + 'request.original_url': context.url.href, + 'request.remote_addr': context.remote, + 'request.method': context.method, + 'request.scheme': context.url.protocol, + 'request.path': context.url.pathname, + 'request.query': context.url.search + }, + traceContext.traceId, + traceContext.parentSpanId, + traceContext.dataset) + + if (isDev()) { + context._honeycombTrace = trace + } + + if (traceContext.customContext) { + beeline.addContext(traceContext.customContext) + } + + if (!trace) { + return next(context) + } + + const boundFinisher = beeline.bindFunctionToTrace((response: ServerResponse) => { + beeline.addContext({ + 'response.status_code': String(response.statusCode) + }) + + beeline.addContext({ + 'request.route': context.handler.route, + 'request.method': context.handler.method, + 'request.version': context.handler.version + }) + + const params = Object.entries(context.params).map(([key, value]) => { + return [`request.param.${key}`, value] + }) + beeline.addContext(Object.fromEntries(params)) + + beeline.finishTrace(trace) + }) // do not do as I do, - onHeaders(context._response, async () => { - await trace.end() + onHeaders(context._response, async function () { + return boundFinisher(this, tracker.getTracked()) }) return next(context) } } -} -function honeycombMiddlewareSpans ({name, doNotTrace}: {name?: string, doNotTrace?: boolean} = {}) { - if (honeycomb.options.disable || doNotTrace) { - return (next: Handler) => (context: Context) => next(context) + function _getTraceContext (context: Context) { + const source = headerSources.find(header => header in context.headers) + + if (!source || !context.headers[source]) { + return {} + } + + if (source === 'x-honeycomb-trace') { + const data = beeline.unmarshalTraceContext(context.headers[source]) + + if (!data) { + return {} + } + + return Object.assign({}, data, { source: `${source} http header` }) + } + + return { + traceId: context.headers[source], + source: `${source} http header` + } } +} - function honeycombSpan (next: Handler) { - return async (context: Context): Promise => { - const span = await honeycomb.startSpan(`mw: ${name}`) +function beelineMiddlewareSpans ({name}: {name?: string} = {}) { + return function honeycombSpan (next: Handler) { + return async (context: Context) => { + const span = beeline.startSpan({ + name: middlewareSpanName(name) + }) // Assumption: the invariant middleware between each layer // will ensure that no errors are thrown to next(). const result = await next(context) - await span.end() + beeline.finishSpan(span) return result } } +} + +/* + * ┏┓ + * ┃┃╱╲ in + * ┃╱╱╲╲ this + * ╱╱╭╮╲╲house + * ▔▏┗┛▕▔ we + * ╱▔▔▔▔▔▔▔▔▔▔╲ + * trace with opentelemetry + * ╱╱┏┳┓╭╮┏┳┓ ╲╲ + * ▔▏┗┻┛┃┃┗┻┛▕▔ + */ +function otelTrace ({ + headerSources = [], +} = {}) { + if (headerSources.length) { + // TODO: Can we respect these? Should we respect these? + Honeycomb.log('trace headerSources are a beeline-only feature') + } - return honeycombSpan + return function honeycombTrace (next: Handler) { + return (context: Context) => { + // TODO: In order to get trace propagation working correctly, we *may* + // need to extract the parent context with the request headers. I *believe* + // setting the W3CTraceContextPropagator as global and trace.setSpan are + // enough, but this needs to be confirmed. + let traceContext = otelAPI.context.active() + + // TODO: Do we need this step? Esp. if we don't set any context + // properties? + traceContext = otelAPI.propagation.extract( + traceContext, + {}, + otelAPI.defaultTextMapGetter + ) + + const span = honeycomb.tracer.startSpan( + traceName(context.method, context.url.pathname), + { + attributes: { + [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, + [otelSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, + [otelSemanticConventions.SemanticAttributes.HTTP_CLIENT_IP]: context.remote, + [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, + [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + [Honeycomb.OTEL_REQ_QUERY]: context.url.search + }, + kind: otelAPI.SpanKind.SERVER, + }, + traceContext + ) + + // TODO: beelines may return a null trace - can a null span happen here? + + otelAPI.trace.setSpan(traceContext, span) + + if (isDev()) { + context._honeycombTrace = span + } + + // do not as I do, + onHeaders(context._response, function () { + return endSpan(context, span) + }) + + return next(context) + } + } + + function endSpan(context: Context, span: otelAPI.Span) { + const handler: Handler = context.handler + + span.setAttribute( + otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, + String(context._response.statusCode) + ) + span.setAttribute( + otelSemanticConventions.SemanticAttributes.HTTP_ROUTE, + handler.route + ) + span.setAttribute( + otelSemanticConventions.SemanticAttributes.HTTP_METHOD, + handler.method + ) + span.setAttribute( + otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, + handler.version + ) + + Object.entries(context.params).map(([key, value]) => { + span.setAttribute( + Honeycomb.paramAttribute(key), + value + ) + }) + span.end() + } } + +function otelMiddlewareSpans ({name}: {name?: string} = {}) { + return function honeycombSpan (next: Handler) { + return async (context: Context) => { + let traceContext = otelAPI.context.active() + + // TODO: Do we need this step? Esp. if we don't set any context + // properties? + traceContext = otelAPI.propagation.extract( + traceContext, + { + // TODO: Need to do plumbing here - note that the trace context does + // not have these fields, so this is extremely wrong! + // traceparent: traceContext.traceId, + // tracestate: traceContext.traceState + }, + otelAPI.defaultTextMapGetter + ) + + const span = honeycomb.tracer.startSpan( + middlewareSpanName(name), + { kind: otelAPI.SpanKind.SERVER }, + traceContext + ) + otelAPI.trace.setSpan(traceContext, span) + + const result = await next(context) + span.end() + return result + } + } +} + +void `{% if selftest %}` +import tap from 'tap' +type Test = (typeof tap.Test)["prototype"] + +/* c8 ignore next */ +if (require.main === module) { + const { test } = tap + + test('traceName', async (assert: Test) => { + assert.same( + traceName('GET', '/echo'), + 'GET /echo' + ) + }); + + test('middlewareSpanName', async (assert: Test) => { + assert.same(middlewareSpanName('test'), 'mw: test') + assert.same(middlewareSpanName(undefined), 'mw: ') + }) +} + +void `{% endif %}` From fa092230ddada33197a34d9dca62594a1d4d2364 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 16:42:22 -0500 Subject: [PATCH 063/167] Traces are now connecting and have the correct service.name --- templates/boltzmann/core/honeycomb.ts | 53 +++++++++---- templates/boltzmann/core/middleware.ts | 84 ++++++--------------- templates/boltzmann/core/prelude.ts | 2 +- templates/boltzmann/data/context.ts | 30 +++++++- templates/boltzmann/middleware/honeycomb.ts | 41 +++++----- 5 files changed, 110 insertions(+), 100 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 34de3f32..29b4cf63 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -107,13 +107,17 @@ interface HoneycombFeatures { interface OtelFactories { metadata: (writeKey: string, dataset: string) => grpc.Metadata sampler: (sampleRate: number) => otelAPI.Sampler - tracerProvider: (sampler: otelAPI.Sampler) => NodeTracerProvider + resource: (serviceName: string) => otelResources.Resource + tracerProvider: ( + resource: otelResources.Resource, + sampler: otelAPI.Sampler + ) => NodeTracerProvider traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] traceContextPropagator: () => otelAPI.TextMapPropagator sdk: ( - serviceName: string, + resource: otelResources.Resource, instrumentations: OtelInstrumentation[], traceExporter: OTLPTraceExporter ) => OtelSDK @@ -135,9 +139,15 @@ const defaultOtelFactories: OtelFactories = { }) }, + resource (serviceName: string): otelResources.Resource { + return new otelResources.Resource({ + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName + }) + }, + // It provides tracers! - tracerProvider (sampler: otelAPI.Sampler): NodeTracerProvider { - return new NodeTracerProvider({ sampler }) + tracerProvider (resource: otelResources.Resource, sampler: otelAPI.Sampler): NodeTracerProvider { + return new NodeTracerProvider({ resource, sampler }) }, // Export traces to an OTLP endpoint with GRPC @@ -183,14 +193,12 @@ const defaultOtelFactories: OtelFactories = { // and a trace exporter and give us a stateful singleton. // This is that singleton! sdk ( - serviceName: string, + resource: otelResources.Resource, instrumentations: OtelInstrumentation[], traceExporter: OTLPTraceExporter ): OtelSDK { return new OtelSDK({ - resource: new otelResources.Resource({ - [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName - }), + resource, traceExporter, instrumentations }) @@ -204,12 +212,16 @@ const defaultOtelFactories: OtelFactories = { interface OtelFactoryOverrides { metadata?: (writeKey: string, dataset: string) => grpc.Metadata sampler?: (sampleRate: Number) => otelAPI.Sampler - tracerProvider?: (sampler: otelAPI.Sampler) => NodeTracerProvider + resource?: (serviceName: string) => otelResources.Resource + tracerProvider?: ( + resource: otelResources.Resource, + sampler: otelAPI.Sampler + ) => NodeTracerProvider traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations?: () => OtelInstrumentation[]; sdk?: ( - serviceName: string, + resource: otelResources.Resource, instrumentations: OtelInstrumentation[], traceExporter: OTLPTraceExporter ) => OtelSDK; @@ -333,7 +345,6 @@ class Honeycomb { public instrumentations: OtelInstrumentation[] | null public traceContextPropagator: otelAPI.TextMapPropagator | null public sdk: OtelSDK | null - public tracer: otelAPI.Tracer public initialized: boolean public started: boolean @@ -357,7 +368,6 @@ class Honeycomb { this.instrumentations = null this.traceContextPropagator = null this.sdk = null - this.tracer = otelAPI.trace.getTracer('boltzmann', '1.0.0') this.factories = { ...defaultOtelFactories, @@ -365,6 +375,10 @@ class Honeycomb { } } + get tracer (): otelAPI.Tracer { + return otelAPI.trace.getTracer('boltzmann', '1.0.0') + } + public static log(message: any): void { // There's a good likelihood that bole hasn't been configured yet, // so we use console here. We also want honeycomb to fail gracefully @@ -411,13 +425,14 @@ class Honeycomb { const apiHost: string = this.getApiHost() const metadata: grpc.Metadata = f.metadata(writeKey, dataset) + const resource: otelResources.Resource = f.resource(serviceName) const sampler: otelAPI.Sampler = f.sampler(sampleRate) const exporter = f.traceExporter(apiHost, metadata) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() - const provider: NodeTracerProvider = f.tracerProvider(sampler) + const provider: NodeTracerProvider = f.tracerProvider(resource, sampler) provider.addSpanProcessor(processor) provider.register() @@ -426,7 +441,7 @@ class Honeycomb { otelAPI.propagation.setGlobalPropagator(propagator) const sdk = f.sdk( - serviceName, + resource, instrumentations, exporter ) @@ -736,6 +751,10 @@ if (require.main === module) { ) }) + t.test('resource', async (assert: Test) => { + assert.doesNotThrow(() => defaultOtelFactories.resource('test-service')) + }) + t.test('sampler', async (assert: Test) => { assert.ok( defaultOtelFactories.sampler(1) instanceof otelCore.ParentBasedSampler, @@ -753,8 +772,9 @@ if (require.main === module) { test('tracerProvider', async (assert: Test) => { const sampler = defaultOtelFactories.sampler(1) + const resource = defaultOtelFactories.resource('test-service') assert.doesNotThrow( - () => defaultOtelFactories.tracerProvider(sampler), + () => defaultOtelFactories.tracerProvider(resource, sampler), 'should create a tracer provider' ) }) @@ -803,6 +823,7 @@ if (require.main === module) { test('sdk', async (assert: Test) => { // run the init function assert.doesNotThrow(() => { + const resource = defaultOtelFactories.resource('test-service') const exporter = defaultOtelFactories.traceExporter( 'grpc://example.com', defaultOtelFactories.metadata( @@ -811,7 +832,7 @@ if (require.main === module) { ) ) const instrumentations = defaultOtelFactories.instrumentations() - defaultOtelFactories.sdk('boltzmann', instrumentations, exporter) + defaultOtelFactories.sdk(resource, instrumentations, exporter) }, 'should create an sdk') }) }) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index d15ad32a..20134570 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,4 +1,5 @@ void `{% if selftest %}`; +export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } import { honeycomb } from '../core/prelude' import { beeline, getOtelTestSpans, otelAPI, otelSemanticConventions } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' @@ -102,18 +103,12 @@ async function handler (context: Context) { } else if (honeycomb.features.otel) { let traceContext = otelAPI.context.active() - // TODO: Do we need this step? Esp. if we don't set any context - // properties? - traceContext = otelAPI.propagation.extract( - traceContext, - { - // TODO: Need to do plumbing here - note that the trace context does - // not have these fields, so this is extremely wrong! - // traceparent: traceContext.traceId, - // tracestate: traceContext.traceState - }, - otelAPI.defaultTextMapGetter - ) + if (context.parentSpan) { + traceContext = otelAPI.trace.setSpan( + traceContext, + context.parentSpan + ) + } otelSpan = honeycomb.tracer.startSpan( handlerSpanName(handler), @@ -130,6 +125,7 @@ async function handler (context: Context) { traceContext ) otelAPI.trace.setSpan(traceContext, otelSpan) + context.pushParentSpan(otelSpan) } try { @@ -140,24 +136,13 @@ async function handler (context: Context) { if (beelineSpan !== null) { beeline.finishSpan(beelineSpan) } else if (otelSpan !== null) { + context.popParentSpan() otelSpan.end() } } // {% endif %} } -void `{%if selftest %}`; -export { - Response, - Handler, - Adaptor, - Middleware, - MiddlewareConfig, - buildMiddleware, - handler -} -void `{% endif %}`; - void `{% if selftest %}` import tap from 'tap' type Test = (typeof tap.Test)["prototype"] @@ -186,8 +171,6 @@ if (require.main === module) { const { test } = tap test('honeycomb-instrumented middlewares emit spans', async (assert: Test) => { - await honeycomb.start() - const server = await runserver({ middleware: [ // The "trace" middleware is marked as doNotTrace, so we shouldn't @@ -203,28 +186,19 @@ if (require.main === module) { assert.same(response.payload, 'Hello!') - await honeycomb.stop() - const spans = getOtelTestSpans(honeycomb.spanProcessor) - // TODO: Clean this up when I'm confident in the asserts - assert.same(spans, [], 'un-comment this to render all spans') - - const instrumentationSpans = spans.map(span => { - return { - spanName: span.name, - library: span.instrumentationLibrary.name - } - }).filter( - span => span.library.match(/^@opentelemetry\/instrumentation-/) - ) + // assert.same(spans, [], 'un-comment this to render all spans') const boltzmannSpans = spans.map(span => { const context = span.spanContext() return { spanName: span.name, - serviceName: String(span.resource.attributes['service.name']).split(':')[0], + // TODO: This test fails with "unknown_service" but that may be an + // issue with how things are mocked - test in practice and see what + // shakes out! + // serviceName: String(span.resource.attributes['service.name']).split(':')[0], library: span.instrumentationLibrary.name, spanId: context.spanId, traceId: context.traceId, @@ -232,21 +206,7 @@ if (require.main === module) { attributes: span.attributes } - }).filter( - span => !span.library.match(/^@opentelemetry\/instrumentation-/) - ) - - assert.same( - instrumentationSpans, - [ - // These are all grpc api client calls - very meta! - { - spanName: 'HTTP GET', - library: '@opentelemetry/instrumentation-http' - } - ], - 'auto-instrumentation is emitting expected spans' - ) + }) assert.same( boltzmannSpans, @@ -254,22 +214,22 @@ if (require.main === module) { // The middleware span { spanName: 'mw: helloMiddleware', - serviceName: 'test-app', + // serviceName: 'test-app', library: 'boltzmann', - traceId: boltzmannSpans[0].traceId, + traceId: boltzmannSpans[1].traceId, spanId: boltzmannSpans[0].spanId, - parentSpanId: undefined, + parentSpanId: boltzmannSpans[1].spanId, // TODO: There *should* be attributes here, no? attributes: {} }, // The request-level parent span { spanName: 'GET /', - serviceName: 'test-app', + // serviceName: 'test-app', library: 'boltzmann', - traceId: boltzmannSpans[0].traceId, - spanId: boltzmannSpans[0].spanId, - parentSpanId: boltzmannSpans[0].spanId, + traceId: boltzmannSpans[1].traceId, + spanId: boltzmannSpans[1].spanId, + parentSpanId: undefined, attributes: { "http.host": "localhost", "http.url": "http://localhost/", diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 9a92e95c..3cd62bca 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -74,7 +74,7 @@ if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { } let honeycomb: Honeycomb = Honeycomb.fromEnv(serviceName, process.env); -void `{% if selftest }`; +void `{% if selftest %}`; honeycomb = Honeycomb.mock() void `{% endif %}`; diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index f104a407..8b754c26 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -1,4 +1,6 @@ void `{% if selftest %}`; +import { honeycomb } from '../core/prelude' +import { otelAPI } from '../core/honeycomb' import { IncomingMessage, ServerResponse } from 'http' import { Accepts } from 'accepts' import accepts from 'accepts' @@ -19,6 +21,7 @@ class Context { private _body?: Promise> private _cookie?: Cookie public _loadSession: GetSession + public _spans: otelAPI.Span[] /**{{- tsdoc(page="02-handlers.md", section="id") -}}*/ public id: string @@ -66,6 +69,7 @@ class Context { this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app') } + this._spans = [] } static baseHandler (context: Context): Promise { @@ -124,11 +128,33 @@ class Context { } // {% if honeycomb %} + + pushParentSpan (span: otelAPI.Span) { + this._spans.push(span) + } + + get parentSpan (): otelAPI.Span | null { + if (this._spans.length) { + return this._spans[this._spans.length - 1] + } + return null + } + + popParentSpan (): otelAPI.Span | null { + return this._spans.pop() || null + } + /**{{- tsdoc(page="02-handlers.md", section="traceURL") -}}*/ get traceURL () { const url = new URL(`https://ui.honeycomb.io/${process.env.HONEYCOMB_TEAM}/datasets/${process.env.HONEYCOMB_DATASET}/trace`) - url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']) - url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime/1000 - 1))) + if (honeycomb.features.beeline) { + url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']) + url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime/1000 - 1))) + } else if (honeycomb.features.otel) { + // TODO: Fill this out lol + url.searchParams.set('trace_id', 'TODO') + url.searchParams.set('trace_start_ts', 'TODO') + } return String(url) } // {% endif %} diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index bc821e6d..ac909fd7 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -114,7 +114,7 @@ function beelineTrace ({ }) // do not do as I do, - onHeaders(context._response, async function () { + onHeaders(context._response, function () { return boundFinisher(this, tracker.getTracked()) }) @@ -154,8 +154,9 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { }) // Assumption: the invariant middleware between each layer - // will ensure that no errors are thrown to next(). + // will ensure that no errors are thrown from next(). const result = await next(context) + beeline.finishSpan(span) return result } @@ -214,25 +215,31 @@ function otelTrace ({ traceContext ) - // TODO: beelines may return a null trace - can a null span happen here? - otelAPI.trace.setSpan(traceContext, span) if (isDev()) { context._honeycombTrace = span } + context.pushParentSpan(span) + // do not as I do, onHeaders(context._response, function () { - return endSpan(context, span) + return endSpan(context) }) return next(context) } } - function endSpan(context: Context, span: otelAPI.Span) { + function endSpan(context: Context) { const handler: Handler = context.handler + const span = context._spans.pop() + + if (!span) { + Honeycomb.log('No span to close!') + return + } span.setAttribute( otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, @@ -265,19 +272,12 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { return function honeycombSpan (next: Handler) { return async (context: Context) => { let traceContext = otelAPI.context.active() - - // TODO: Do we need this step? Esp. if we don't set any context - // properties? - traceContext = otelAPI.propagation.extract( - traceContext, - { - // TODO: Need to do plumbing here - note that the trace context does - // not have these fields, so this is extremely wrong! - // traceparent: traceContext.traceId, - // tracestate: traceContext.traceState - }, - otelAPI.defaultTextMapGetter - ) + if (context.parentSpan) { + traceContext = otelAPI.trace.setSpan( + traceContext, + context.parentSpan + ) + } const span = honeycomb.tracer.startSpan( middlewareSpanName(name), @@ -286,8 +286,11 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { ) otelAPI.trace.setSpan(traceContext, span) + context.pushParentSpan(span) const result = await next(context) + context.popParentSpan() span.end() + return result } } From 83a030dc1bd08113b5ab8aeba6a7f56f5b38be9a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 18:47:06 -0500 Subject: [PATCH 064/167] ignore noisy http auto-instrumentation --- templates/boltzmann/core/honeycomb.ts | 30 ++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 29b4cf63..e9e79884 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -169,9 +169,37 @@ const defaultOtelFactories: OtelFactories = { }, instrumentations () { + // Any paths we add here will get no traces whatsoever. This is + // appropriate for the ping route, which should never trace. + const ignoreIncomingPaths = [ + '/monitor/ping' + ] + + // OpenTelemetry attempts to auto-collect GCE metadata, causing traces + // we don't care about. We do our best to ignore them by independently + // calculating which endpoints it's going to try to call. + // + // See: https://github.com/googleapis/gcp-metadata/blob/main/src/index.ts#L26-L44 + const ignoreOutgoingUrls = [ + /^https?:\/\/169\.254\.169\.254/, + /^https?:\/\/metadata\.google\.internal/, + ] + let gceBase: string | null = process.env.GCE_METADATA_IP || process.env.GCE_METADATA_HOST || null + if (gceBase) { + if (!/^https?:\/\//.test(gceBase)) { + gceBase = `http://${gceBase}`; + } + ignoreOutgoingUrls.push(new RegExp(`^${gceBase}`)) + } + let is: OtelInstrumentation[] = [ new OtelDnsInstrumentation({}), - new OtelHttpInstrumentation({}), + new OtelHttpInstrumentation({ + // TODO: These fields are expected to become deprecated in the + // near future... + ignoreIncomingPaths, + ignoreOutgoingUrls + }), ] void `{% if redis %}` From e972aa544cfb3ce149b48d6a6cb70473bab9dbe5 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 19:07:05 -0500 Subject: [PATCH 065/167] WE HAVE INWARD PROPAGATION --- templates/boltzmann/middleware/honeycomb.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index ac909fd7..cb3483b6 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -184,17 +184,11 @@ function otelTrace ({ return function honeycombTrace (next: Handler) { return (context: Context) => { - // TODO: In order to get trace propagation working correctly, we *may* - // need to extract the parent context with the request headers. I *believe* - // setting the W3CTraceContextPropagator as global and trace.setSpan are - // enough, but this needs to be confirmed. let traceContext = otelAPI.context.active() - // TODO: Do we need this step? Esp. if we don't set any context - // properties? - traceContext = otelAPI.propagation.extract( + otelAPI.propagation.extract( traceContext, - {}, + context.headers, otelAPI.defaultTextMapGetter ) From d2f37a8c0fbc4b9d540f68d15ab13a6f2ccc5d36 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 19:41:03 -0500 Subject: [PATCH 066/167] rename otelAPI to otel (for convenience) --- templates/boltzmann/core/honeycomb.ts | 28 ++++++++++----------- templates/boltzmann/core/middleware.ts | 10 ++++---- templates/boltzmann/data/context.ts | 10 ++++---- templates/boltzmann/middleware/honeycomb.ts | 20 +++++++-------- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index e9e79884..f05cd129 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -31,7 +31,7 @@ import beeline from 'honeycomb-beeline' // ...but are migrating to OpenTelemetry: import * as grpc from '@grpc/grpc-js' -import * as otelAPI from '@opentelemetry/api' +import * as otel from '@opentelemetry/api' import * as otelCore from '@opentelemetry/core' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' import * as otelResources from '@opentelemetry/resources' @@ -106,16 +106,16 @@ interface HoneycombFeatures { // namespace. interface OtelFactories { metadata: (writeKey: string, dataset: string) => grpc.Metadata - sampler: (sampleRate: number) => otelAPI.Sampler + sampler: (sampleRate: number) => otel.Sampler resource: (serviceName: string) => otelResources.Resource tracerProvider: ( resource: otelResources.Resource, - sampler: otelAPI.Sampler + sampler: otel.Sampler ) => NodeTracerProvider traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] - traceContextPropagator: () => otelAPI.TextMapPropagator + traceContextPropagator: () => otel.TextMapPropagator sdk: ( resource: otelResources.Resource, instrumentations: OtelInstrumentation[], @@ -133,7 +133,7 @@ const defaultOtelFactories: OtelFactories = { // create a Sampler object, which is used to tune // the sampling rate - sampler (sampleRate: number): otelAPI.Sampler { + sampler (sampleRate: number): otel.Sampler { return new otelCore.ParentBasedSampler({ root: new otelCore.TraceIdRatioBasedSampler(sampleRate) }) @@ -146,7 +146,7 @@ const defaultOtelFactories: OtelFactories = { }, // It provides tracers! - tracerProvider (resource: otelResources.Resource, sampler: otelAPI.Sampler): NodeTracerProvider { + tracerProvider (resource: otelResources.Resource, sampler: otel.Sampler): NodeTracerProvider { return new NodeTracerProvider({ resource, sampler }) }, @@ -239,11 +239,11 @@ const defaultOtelFactories: OtelFactories = { // passing overrides into its constructor. interface OtelFactoryOverrides { metadata?: (writeKey: string, dataset: string) => grpc.Metadata - sampler?: (sampleRate: Number) => otelAPI.Sampler + sampler?: (sampleRate: Number) => otel.Sampler resource?: (serviceName: string) => otelResources.Resource tracerProvider?: ( resource: otelResources.Resource, - sampler: otelAPI.Sampler + sampler: otel.Sampler ) => NodeTracerProvider traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor @@ -371,7 +371,7 @@ class Honeycomb { public traceExporter: OTLPTraceExporter | null public spanProcessor: otelTraceBase.SpanProcessor | null public instrumentations: OtelInstrumentation[] | null - public traceContextPropagator: otelAPI.TextMapPropagator | null + public traceContextPropagator: otel.TextMapPropagator | null public sdk: OtelSDK | null public initialized: boolean @@ -403,8 +403,8 @@ class Honeycomb { } } - get tracer (): otelAPI.Tracer { - return otelAPI.trace.getTracer('boltzmann', '1.0.0') + get tracer (): otel.Tracer { + return otel.trace.getTracer('boltzmann', '1.0.0') } public static log(message: any): void { @@ -455,7 +455,7 @@ class Honeycomb { const metadata: grpc.Metadata = f.metadata(writeKey, dataset) const resource: otelResources.Resource = f.resource(serviceName) - const sampler: otelAPI.Sampler = f.sampler(sampleRate) + const sampler: otel.Sampler = f.sampler(sampleRate) const exporter = f.traceExporter(apiHost, metadata) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() @@ -466,7 +466,7 @@ class Honeycomb { const propagator = f.traceContextPropagator() - otelAPI.propagation.setGlobalPropagator(propagator) + otel.propagation.setGlobalPropagator(propagator) const sdk = f.sdk( resource, @@ -534,7 +534,7 @@ class Honeycomb { export { beeline, grpc, - otelAPI, + otel, otelCore, OTLPTraceExporter, otelResources, diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 20134570..7874a09d 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,7 +1,7 @@ void `{% if selftest %}`; export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } import { honeycomb } from '../core/prelude' -import { beeline, getOtelTestSpans, otelAPI, otelSemanticConventions } from '../core/honeycomb' +import { beeline, getOtelTestSpans, otel, otelSemanticConventions } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' @@ -101,10 +101,10 @@ async function handler (context: Context) { 'handler.decorators': String(handler.decorators) }) } else if (honeycomb.features.otel) { - let traceContext = otelAPI.context.active() + let traceContext = otel.context.active() if (context.parentSpan) { - traceContext = otelAPI.trace.setSpan( + traceContext = otel.trace.setSpan( traceContext, context.parentSpan ) @@ -120,11 +120,11 @@ async function handler (context: Context) { 'boltzmann.http.handler.version': handler.version || '*', 'boltzmann.http.handler.decorators': String(handler.decorators), }, - kind: otelAPI.SpanKind.SERVER + kind: otel.SpanKind.SERVER }, traceContext ) - otelAPI.trace.setSpan(traceContext, otelSpan) + otel.trace.setSpan(traceContext, otelSpan) context.pushParentSpan(otelSpan) } diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 8b754c26..7a66debf 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -1,6 +1,6 @@ void `{% if selftest %}`; import { honeycomb } from '../core/prelude' -import { otelAPI } from '../core/honeycomb' +import { otel } from '../core/honeycomb' import { IncomingMessage, ServerResponse } from 'http' import { Accepts } from 'accepts' import accepts from 'accepts' @@ -21,7 +21,7 @@ class Context { private _body?: Promise> private _cookie?: Cookie public _loadSession: GetSession - public _spans: otelAPI.Span[] + public _spans: otel.Span[] /**{{- tsdoc(page="02-handlers.md", section="id") -}}*/ public id: string @@ -129,18 +129,18 @@ class Context { // {% if honeycomb %} - pushParentSpan (span: otelAPI.Span) { + pushParentSpan (span: otel.Span) { this._spans.push(span) } - get parentSpan (): otelAPI.Span | null { + get parentSpan (): otel.Span | null { if (this._spans.length) { return this._spans[this._spans.length - 1] } return null } - popParentSpan (): otelAPI.Span | null { + popParentSpan (): otel.Span | null { return this._spans.pop() || null } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index cb3483b6..a27abd96 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -2,7 +2,7 @@ void `{% if selftest %}`; import { honeycomb } from '../core/prelude' export { trace, honeycombMiddlewareSpans } -import { beeline, Honeycomb, otelAPI, otelSemanticConventions } from '../core/honeycomb' +import { beeline, Honeycomb, otel, otelSemanticConventions } from '../core/honeycomb' import { ServerResponse } from 'http' import { Handler } from '../core/middleware' import { Context } from '../data/context' @@ -184,12 +184,12 @@ function otelTrace ({ return function honeycombTrace (next: Handler) { return (context: Context) => { - let traceContext = otelAPI.context.active() + let traceContext = otel.context.active() - otelAPI.propagation.extract( + otel.propagation.extract( traceContext, context.headers, - otelAPI.defaultTextMapGetter + otel.defaultTextMapGetter ) const span = honeycomb.tracer.startSpan( @@ -204,12 +204,12 @@ function otelTrace ({ [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, [Honeycomb.OTEL_REQ_QUERY]: context.url.search }, - kind: otelAPI.SpanKind.SERVER, + kind: otel.SpanKind.SERVER, }, traceContext ) - otelAPI.trace.setSpan(traceContext, span) + otel.trace.setSpan(traceContext, span) if (isDev()) { context._honeycombTrace = span @@ -265,9 +265,9 @@ function otelTrace ({ function otelMiddlewareSpans ({name}: {name?: string} = {}) { return function honeycombSpan (next: Handler) { return async (context: Context) => { - let traceContext = otelAPI.context.active() + let traceContext = otel.context.active() if (context.parentSpan) { - traceContext = otelAPI.trace.setSpan( + traceContext = otel.trace.setSpan( traceContext, context.parentSpan ) @@ -275,10 +275,10 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { const span = honeycomb.tracer.startSpan( middlewareSpanName(name), - { kind: otelAPI.SpanKind.SERVER }, + { kind: otel.SpanKind.SERVER }, traceContext ) - otelAPI.trace.setSpan(traceContext, span) + otel.trace.setSpan(traceContext, span) context.pushParentSpan(span) const result = await next(context) From 9920a7b573bce8786cea475c78ca370d0fdd8689 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 20:23:07 -0500 Subject: [PATCH 067/167] Minor cleanup/refactors --- templates/boltzmann/core/honeycomb.ts | 9 --------- templates/boltzmann/data/context.ts | 2 +- templates/boltzmann/middleware/honeycomb.ts | 19 +++++++++++++++++-- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index f05cd129..600f64a9 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -419,15 +419,6 @@ class Honeycomb { void `{% endif %}` } - // Some non-standard OpenTelemetry attributes we add in - // the middlewares... - - public static OTEL_REQ_QUERY = 'boltzmann.http.query' - - public static paramAttribute(param: string): string { - return `boltzmann.http.request.param.${param}` - } - // Initialize Honeycomb! Stands up the otel node SDK if enabled, // otherwise sets up the beeline library. // This needs to occur before any imports you want instrumentation diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 7a66debf..b565f014 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -20,8 +20,8 @@ class Context { private _parsedUrl?: URL private _body?: Promise> private _cookie?: Cookie + private _spans: Array public _loadSession: GetSession - public _spans: otel.Span[] /**{{- tsdoc(page="02-handlers.md", section="id") -}}*/ public id: string diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index a27abd96..f64513a2 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -11,6 +11,12 @@ import isDev from 'are-we-dev' void `{% endif %}`; function traceName(method: string, pathname: string) { + // This is how OpenTelemetry names request-level spans by default, so we + // go with the grain + if (honeycomb.features.otel) { + return `HTTP ${method}` + } + // This is what the beeline traces are named today return `${method} ${pathname}` } @@ -18,6 +24,16 @@ function middlewareSpanName(name?: string) { return `mw: ${name || ''}` } +function paramSpanAttribute(param: string): string { + return `boltzmann.http.request.param.${param}` +} + +export { + traceName, + middlewareSpanName, + paramSpanAttribute +} + // The trace middleware creates a request-level span or trace. It delegates // to either a beeline or OpenTelemetry implementation depending on how // the honeycomb object is configured. @@ -62,7 +78,6 @@ function beelineTrace ({ return function honeycombTrace (next: Handler) { return (context: Context) => { - Honeycomb.log('starting a beeline trace') const traceContext = _getTraceContext(context) const trace = beeline.startTrace({ @@ -301,7 +316,7 @@ if (require.main === module) { test('traceName', async (assert: Test) => { assert.same( traceName('GET', '/echo'), - 'GET /echo' + 'HTTP GET' ) }); From 3a64787979aa3695b1fed3cd037f16ef0e65fe2f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 20:36:46 -0500 Subject: [PATCH 068/167] remove top-level trace span in non-test mode --- templates/boltzmann/core/middleware.ts | 15 ++++----- templates/boltzmann/data/context.ts | 4 +-- templates/boltzmann/middleware/honeycomb.ts | 36 ++++++++++----------- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 7874a09d..fed941a5 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -125,7 +125,7 @@ async function handler (context: Context) { traceContext ) otel.trace.setSpan(traceContext, otelSpan) - context.pushParentSpan(otelSpan) + context.pushSpan(otelSpan) } try { @@ -136,7 +136,7 @@ async function handler (context: Context) { if (beelineSpan !== null) { beeline.finishSpan(beelineSpan) } else if (otelSpan !== null) { - context.popParentSpan() + context.popSpan() otelSpan.end() } } @@ -195,10 +195,7 @@ if (require.main === module) { return { spanName: span.name, - // TODO: This test fails with "unknown_service" but that may be an - // issue with how things are mocked - test in practice and see what - // shakes out! - // serviceName: String(span.resource.attributes['service.name']).split(':')[0], + serviceName: String(span.resource.attributes['service.name']).split(':')[0], library: span.instrumentationLibrary.name, spanId: context.spanId, traceId: context.traceId, @@ -214,7 +211,7 @@ if (require.main === module) { // The middleware span { spanName: 'mw: helloMiddleware', - // serviceName: 'test-app', + serviceName: 'test-app', library: 'boltzmann', traceId: boltzmannSpans[1].traceId, spanId: boltzmannSpans[0].spanId, @@ -224,8 +221,8 @@ if (require.main === module) { }, // The request-level parent span { - spanName: 'GET /', - // serviceName: 'test-app', + spanName: 'HTTP GET', + serviceName: 'test-app', library: 'boltzmann', traceId: boltzmannSpans[1].traceId, spanId: boltzmannSpans[1].spanId, diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index b565f014..b47b6efa 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -129,7 +129,7 @@ class Context { // {% if honeycomb %} - pushParentSpan (span: otel.Span) { + pushSpan (span: otel.Span) { this._spans.push(span) } @@ -140,7 +140,7 @@ class Context { return null } - popParentSpan (): otel.Span | null { + popSpan (): otel.Span | null { return this._spans.pop() || null } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index f64513a2..bd721b1a 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -49,6 +49,7 @@ function trace ({ return beelineTrace({ headerSources }) } + // Note: headerSources is not respected by otel tracing! return otelTrace() } @@ -189,16 +190,10 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { * ╱╱┏┳┓╭╮┏┳┓ ╲╲ * ▔▏┗┻┛┃┃┗┻┛▕▔ */ -function otelTrace ({ - headerSources = [], -} = {}) { - if (headerSources.length) { - // TODO: Can we respect these? Should we respect these? - Honeycomb.log('trace headerSources are a beeline-only feature') - } - +function otelTrace () { return function honeycombTrace (next: Handler) { return (context: Context) => { + void `{% if selftest %}` let traceContext = otel.context.active() otel.propagation.extract( @@ -217,7 +212,7 @@ function otelTrace ({ [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - [Honeycomb.OTEL_REQ_QUERY]: context.url.search + 'boltzmann.http.query': context.url.search }, kind: otel.SpanKind.SERVER, }, @@ -226,11 +221,8 @@ function otelTrace ({ otel.trace.setSpan(traceContext, span) - if (isDev()) { - context._honeycombTrace = span - } - - context.pushParentSpan(span) + context.pushSpan(span) + void `{% endif %}` // do not as I do, onHeaders(context._response, function () { @@ -243,13 +235,15 @@ function otelTrace ({ function endSpan(context: Context) { const handler: Handler = context.handler - const span = context._spans.pop() + const span = context.parentSpan + ? context.popSpan() + : otel.trace.getSpan(otel.context.active()) if (!span) { - Honeycomb.log('No span to close!') return } + void `{% if selftest %}` span.setAttribute( otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, String(context._response.statusCode) @@ -262,6 +256,8 @@ function otelTrace ({ otelSemanticConventions.SemanticAttributes.HTTP_METHOD, handler.method ) + void `{% endif %}` + span.setAttribute( otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, handler.version @@ -269,11 +265,13 @@ function otelTrace ({ Object.entries(context.params).map(([key, value]) => { span.setAttribute( - Honeycomb.paramAttribute(key), + paramSpanAttribute(key), value ) }) + void `{% if selftest %}` span.end() + void `{% endif %}` } } @@ -295,9 +293,9 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { ) otel.trace.setSpan(traceContext, span) - context.pushParentSpan(span) + context.pushSpan(span) const result = await next(context) - context.popParentSpan() + context.popSpan() span.end() return result From b231ef7d2a5447f9adfa6cb1cbe2cebec4244aeb Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 20:58:19 -0500 Subject: [PATCH 069/167] Remove explicit trace context propagator (w3c works automatically) --- templates/boltzmann/core/honeycomb.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 600f64a9..eb310b4d 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -115,7 +115,6 @@ interface OtelFactories { traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] - traceContextPropagator: () => otel.TextMapPropagator sdk: ( resource: otelResources.Resource, instrumentations: OtelInstrumentation[], @@ -213,10 +212,6 @@ const defaultOtelFactories: OtelFactories = { return is }, - traceContextPropagator(): otelCore.W3CTraceContextPropagator { - return new otelCore.W3CTraceContextPropagator() - }, - // The SDK will take a service name, instrumentations // and a trace exporter and give us a stateful singleton. // This is that singleton! @@ -371,7 +366,6 @@ class Honeycomb { public traceExporter: OTLPTraceExporter | null public spanProcessor: otelTraceBase.SpanProcessor | null public instrumentations: OtelInstrumentation[] | null - public traceContextPropagator: otel.TextMapPropagator | null public sdk: OtelSDK | null public initialized: boolean @@ -394,7 +388,6 @@ class Honeycomb { this.traceExporter = null this.spanProcessor = null this.instrumentations = null - this.traceContextPropagator = null this.sdk = null this.factories = { @@ -455,10 +448,6 @@ class Honeycomb { provider.addSpanProcessor(processor) provider.register() - const propagator = f.traceContextPropagator() - - otel.propagation.setGlobalPropagator(propagator) - const sdk = f.sdk( resource, instrumentations, @@ -469,7 +458,6 @@ class Honeycomb { this.spanProcessor = processor this.instrumentations = instrumentations this.tracerProvider = provider - this.traceContextPropagator = propagator this.sdk = sdk @@ -833,12 +821,6 @@ if (require.main === module) { ) }) - test('traceContextPropagator', async (assert: Test) => { - assert.doesNotThrow(() => { - defaultOtelFactories.traceContextPropagator() - }) - }) - test('sdk', async (assert: Test) => { // run the init function assert.doesNotThrow(() => { From 0a1993ad935735a62128981d69696a7113b05528 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 22:38:48 -0500 Subject: [PATCH 070/167] Remove spans array and use closures instead --- templates/boltzmann/core/middleware.ts | 9 +- templates/boltzmann/data/context.ts | 19 +-- templates/boltzmann/middleware/honeycomb.ts | 151 +++++++++++--------- 3 files changed, 88 insertions(+), 91 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index fed941a5..b0954031 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -91,6 +91,7 @@ async function handler (context: Context) { // {% if honeycomb %} let beelineSpan = null let otelSpan = null + let parentOtelSpan = context.span if (honeycomb.features.beeline) { beelineSpan = beeline.startSpan({ name: handlerSpanName(handler), @@ -103,10 +104,10 @@ async function handler (context: Context) { } else if (honeycomb.features.otel) { let traceContext = otel.context.active() - if (context.parentSpan) { + if (context.span) { traceContext = otel.trace.setSpan( traceContext, - context.parentSpan + context.span ) } @@ -125,7 +126,7 @@ async function handler (context: Context) { traceContext ) otel.trace.setSpan(traceContext, otelSpan) - context.pushSpan(otelSpan) + context.span = otelSpan } try { @@ -136,8 +137,8 @@ async function handler (context: Context) { if (beelineSpan !== null) { beeline.finishSpan(beelineSpan) } else if (otelSpan !== null) { - context.popSpan() otelSpan.end() + context.span = parentOtelSpan } } // {% endif %} diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index b47b6efa..232b0f68 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -20,7 +20,6 @@ class Context { private _parsedUrl?: URL private _body?: Promise> private _cookie?: Cookie - private _spans: Array public _loadSession: GetSession /**{{- tsdoc(page="02-handlers.md", section="id") -}}*/ @@ -69,7 +68,7 @@ class Context { this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app') } - this._spans = [] + this.span = null } static baseHandler (context: Context): Promise { @@ -129,20 +128,8 @@ class Context { // {% if honeycomb %} - pushSpan (span: otel.Span) { - this._spans.push(span) - } - - get parentSpan (): otel.Span | null { - if (this._spans.length) { - return this._spans[this._spans.length - 1] - } - return null - } - - popSpan (): otel.Span | null { - return this._spans.pop() || null - } + /**{{- tsdoc(page="02-handlers.md", section="span") -}}*/ + public span: otel.Span | null /**{{- tsdoc(page="02-handlers.md", section="traceURL") -}}*/ get traceURL () { diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index bd721b1a..44737cc3 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -193,96 +193,105 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { function otelTrace () { return function honeycombTrace (next: Handler) { return (context: Context) => { - void `{% if selftest %}` let traceContext = otel.context.active() - otel.propagation.extract( - traceContext, - context.headers, - otel.defaultTextMapGetter - ) + // Typically, HTTP auto-instrumentation will create a parent span for us + let span: otel.Span | null = otel.trace.getSpan(traceContext) || null + let createdSpan = false - const span = honeycomb.tracer.startSpan( - traceName(context.method, context.url.pathname), - { - attributes: { - [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, - [otelSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, - [otelSemanticConventions.SemanticAttributes.HTTP_CLIENT_IP]: context.remote, - [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, - [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - 'boltzmann.http.query': context.url.search - }, - kind: otel.SpanKind.SERVER, - }, - traceContext - ) + // In shot testing (and other scenarios that don't touch HTTP + // auto-instrumentation, we'll need to create one + if (!span) { + otel.propagation.extract( + traceContext, + context.headers, + otel.defaultTextMapGetter + ) - otel.trace.setSpan(traceContext, span) + span = honeycomb.tracer.startSpan( + traceName(context.method, context.url.pathname), + { + attributes: { + [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, + [otelSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, + [otelSemanticConventions.SemanticAttributes.HTTP_CLIENT_IP]: context.remote, + [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, + [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, + [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + }, + kind: otel.SpanKind.SERVER, + }, + traceContext + ) + createdSpan = true + } - context.pushSpan(span) - void `{% endif %}` + if (span) { + span.setAttribute('boltzmann.http.query', context.url.search) + otel.trace.setSpan(traceContext, span) + context.span = span + } else if (createdSpan) { + Honeycomb.log('trace: could not create a span - something is seriously wrong') + } else { + Honeycomb.log("trace: could not find span - why didn't one get created? something is seriously wrong") + } // do not as I do, onHeaders(context._response, function () { - return endSpan(context) + const handler: Handler = context.handler + + if (!span) { + return + } + + if (createdSpan) { + span.setAttribute( + otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, + String(context._response.statusCode) + ) + span.setAttribute( + otelSemanticConventions.SemanticAttributes.HTTP_ROUTE, + handler.route + ) + span.setAttribute( + otelSemanticConventions.SemanticAttributes.HTTP_METHOD, + handler.method + ) + } + + span.setAttribute( + otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, + handler.version + ) + + Object.entries(context.params).map(([key, value]) => { + if (span) { + span.setAttribute( + paramSpanAttribute(key), + value + ) + } + }) + + if (createdSpan) { + span.end() + } }) return next(context) } } - - function endSpan(context: Context) { - const handler: Handler = context.handler - const span = context.parentSpan - ? context.popSpan() - : otel.trace.getSpan(otel.context.active()) - - if (!span) { - return - } - - void `{% if selftest %}` - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, - String(context._response.statusCode) - ) - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_ROUTE, - handler.route - ) - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_METHOD, - handler.method - ) - void `{% endif %}` - - span.setAttribute( - otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, - handler.version - ) - - Object.entries(context.params).map(([key, value]) => { - span.setAttribute( - paramSpanAttribute(key), - value - ) - }) - void `{% if selftest %}` - span.end() - void `{% endif %}` - } } function otelMiddlewareSpans ({name}: {name?: string} = {}) { return function honeycombSpan (next: Handler) { return async (context: Context) => { let traceContext = otel.context.active() - if (context.parentSpan) { + let parentSpan = context.span + if (parentSpan) { traceContext = otel.trace.setSpan( traceContext, - context.parentSpan + parentSpan ) } @@ -293,9 +302,9 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { ) otel.trace.setSpan(traceContext, span) - context.pushSpan(span) + context.span = span const result = await next(context) - context.popSpan() + context.span = parentSpan span.end() return result From a4e0cbdeb8d104a27c3012fbbcaae52e0bb86571 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 23:04:56 -0500 Subject: [PATCH 071/167] nudge span context property def to make js build happy --- docs/content/reference/02-handlers.md | 8 ++++++++ templates/boltzmann/data/context.ts | 11 +++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/content/reference/02-handlers.md b/docs/content/reference/02-handlers.md index 2d29c8a6..63dcb3b7 100644 --- a/docs/content/reference/02-handlers.md +++ b/docs/content/reference/02-handlers.md @@ -595,6 +595,14 @@ async function logout(context) { } ``` +### `span` + +{{ changelog(version = "0.6.0") }} + +**Requires the [`--honeycomb`] feature.** + +If using OpenTelemetry for tracing, the current OpenTelemetry span. + ### `traceURL` {{ changelog(version = "0.1.4") }} diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 232b0f68..d0b9615b 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -48,6 +48,11 @@ class Context { public _postgresConnection?: Promise // {% endif %} + // {% if honeycomb %} + /**{{- tsdoc(page="02-handlers.md", section="span") -}}*/ + public span: otel.Span | null + // {% endif %} + ;[extensions: string]: any constructor(public request: IncomingMessage, public _response: ServerResponse) { @@ -68,7 +73,9 @@ class Context { this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app') } + void `{% if honeycomb %}` this.span = null + void `{% endif %}` } static baseHandler (context: Context): Promise { @@ -127,10 +134,6 @@ class Context { } // {% if honeycomb %} - - /**{{- tsdoc(page="02-handlers.md", section="span") -}}*/ - public span: otel.Span | null - /**{{- tsdoc(page="02-handlers.md", section="traceURL") -}}*/ get traceURL () { const url = new URL(`https://ui.honeycomb.io/${process.env.HONEYCOMB_TEAM}/datasets/${process.env.HONEYCOMB_DATASET}/trace`) From 36bb26d572cd0c547db39238e662121418efdc7f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Feb 2022 23:05:28 -0500 Subject: [PATCH 072/167] Fill in otel trace URL params --- templates/boltzmann/data/context.ts | 11 ++++++++--- templates/boltzmann/middleware/honeycomb.ts | 4 ++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index d0b9615b..5606da94 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -141,9 +141,14 @@ class Context { url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']) url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime/1000 - 1))) } else if (honeycomb.features.otel) { - // TODO: Fill this out lol - url.searchParams.set('trace_id', 'TODO') - url.searchParams.set('trace_start_ts', 'TODO') + const spanCtx = this._honeycombTrace.spanContext() + const [startSeconds, startNanos] = this._honeycombTrace.startTime + url.searchParams.set('trace_id', spanCtx.traceId) + + url.searchParams.set( + 'trace_start_ts', + String(startSeconds * 1000 + startNanos / 1000) + ) } return String(url) } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 44737cc3..a8f858d7 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -230,6 +230,10 @@ function otelTrace () { span.setAttribute('boltzmann.http.query', context.url.search) otel.trace.setSpan(traceContext, span) context.span = span + + if (isDev()) { + context._honeycombTrace = span + } } else if (createdSpan) { Honeycomb.log('trace: could not create a span - something is seriously wrong') } else { From d66a197e172512d7b467dcd92b6d98eb7ee2c62f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 00:33:46 -0500 Subject: [PATCH 073/167] Use bole for logging in honeycomb middleware --- templates/boltzmann/middleware/honeycomb.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index a8f858d7..406290ad 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -8,6 +8,7 @@ import { Handler } from '../core/middleware' import { Context } from '../data/context' import onHeaders from 'on-headers' import isDev from 'are-we-dev' +import bole from '@entropic/bole' void `{% endif %}`; function traceName(method: string, pathname: string) { @@ -191,6 +192,7 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { * ▔▏┗┻┛┃┃┗┻┛▕▔ */ function otelTrace () { + const logger = bole('boltzmann:trace') return function honeycombTrace (next: Handler) { return (context: Context) => { let traceContext = otel.context.active() @@ -235,9 +237,11 @@ function otelTrace () { context._honeycombTrace = span } } else if (createdSpan) { - Honeycomb.log('trace: could not create a span - something is seriously wrong') + logger.warning('could not create a root span - something is seriously wrong') } else { - Honeycomb.log("trace: could not find span - why didn't one get created? something is seriously wrong") + logger.warning( + "could not find and did not attempt to create a root span - something is seriously wrong" + ) } // do not as I do, From 6f1c24e110e4211cb4b2c6231490a62922ae2f8c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 01:34:30 -0500 Subject: [PATCH 074/167] honeycomb-related logging uses bole when available --- templates/boltzmann/core/honeycomb.ts | 71 +++++++++++++++++---- templates/boltzmann/core/prelude.ts | 3 - templates/boltzmann/middleware/honeycomb.ts | 4 +- templates/boltzmann/middleware/log.ts | 2 + 4 files changed, 62 insertions(+), 18 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index eb310b4d..b9af8987 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -25,6 +25,7 @@ Good luck! // Dependencies used downstream - it's worth your time to look at how these // are treated in prelude.ts! import isDev from 'are-we-dev' +import bole from '@entropic/bole' // We continue to support beelines... import beeline from 'honeycomb-beeline' @@ -371,6 +372,9 @@ class Honeycomb { public initialized: boolean public started: boolean + // TODO: Bole | null + public logger: any + constructor( options: HoneycombOptions, overrides: OtelFactoryOverrides = {} @@ -394,22 +398,60 @@ class Honeycomb { ...defaultOtelFactories, ...(overrides || {}) } + + this.logger = null } get tracer (): otel.Tracer { return otel.trace.getTracer('boltzmann', '1.0.0') } - public static log(message: any): void { - // There's a good likelihood that bole hasn't been configured yet, - // so we use console here. We also want honeycomb to fail gracefully - // as nothing is more embarrassing than your service getting taken - // down by instrumentation, so we only log in live dev and in debug. - void `{% if not selftest %}` - if (process.env.DEBUG || isDev()) { - console.warn(message); - } + public static log(message: string | Error): void { + // Honeycomb starts up very early in the process's lifetime and + // can't count on bole being configured. In those cases, we fall + // back to console.log and JSON.stringify. Only use this if you + // can't use a bole logger! + + // We always log at the debug level, in an effort to make tracing as quiet + // as possible while still being stdout-debuggable. We also mute them + // during unit tests. + let isDebug = !process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug' + + void `{% if selftest %}` + isDebug = false void `{% endif %}` + + if (isDebug) { + const line: any = { + time: (new Date()).toISOString(), + level: 'debug', + name: 'boltzmann:honeycomb' + } + + if (message instanceof Error) { + line.err = { + name: message.name, + message: message.message, + stack: String(message.stack) + } + } else { + line.message = message + } + + console.log(JSON.stringify(line)) + } + } + + public log(message: string | Error): void { + // The logger middleware creates a logger on the honeycomb object. If it's + // in place, we'll gladly use it. + if (this.logger) { + this.logger.debug(message) + return + } + + // Otherwise, fall back to console.log + JSON.stringify + Honeycomb.log(message) } // Initialize Honeycomb! Stands up the otel node SDK if enabled, @@ -464,7 +506,7 @@ class Honeycomb { this.initialized = true } catch (err) { if (err instanceof HoneycombError) { - Honeycomb.log(err); + this.log(err); return; } throw err; @@ -478,8 +520,8 @@ class Honeycomb { let exitCode = 0 const sdk = this.sdk - async function die(err: Error) { - Honeycomb.log(err); + const die = async (err: Error) => { + this.log(err); exitCode = 1 await shutdown() } @@ -505,14 +547,17 @@ class Honeycomb { try { await sdk.shutdown() } catch (err) { - Honeycomb.log(err) + this.log(err) } } } export { beeline, + bole, + // Bole, grpc, + isDev, otel, otelCore, OTLPTraceExporter, diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 3cd62bca..246704f7 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -142,7 +142,6 @@ import accepts from 'accepts' import { promises as fs } from 'fs' import crypto from 'crypto' import http from 'http' -import bole from '@entropic/bole' import path from 'path' import os from 'os' void `{% if redis %}`; @@ -226,13 +225,11 @@ export { cookie, os, path, - bole, http, crypto, fs, accepts, fmw, - isDev, promisify, querystring, ships, diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 406290ad..26505bd2 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -237,9 +237,9 @@ function otelTrace () { context._honeycombTrace = span } } else if (createdSpan) { - logger.warning('could not create a root span - something is seriously wrong') + logger.debug('could not create a root span - something is seriously wrong') } else { - logger.warning( + logger.debug( "could not find and did not attempt to create a root span - something is seriously wrong" ) } diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index d7951c99..749bbbcd 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -4,6 +4,7 @@ export { log } import bole from '@entropic/bole' import isDev from 'are-we-dev' +import { honeycomb } from '../core/prelude' import { Handler } from '../core/middleware' import { Context } from '../data/context' import { STATUS, THREW } from '../core/prelude' @@ -20,6 +21,7 @@ function log ({ stream = pretty } bole.output({ level, stream }) + honeycomb.logger = bole('boltzmann:honeycomb') return function logMiddleware (next: Handler) { return async function inner (context: Context) { From 86a34b6d334e388e8cab16c015a30305eea05c79 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 11:18:56 -0500 Subject: [PATCH 075/167] type for logger --- templates/boltzmann/core/honeycomb.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index b9af8987..64d15dc6 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -372,8 +372,7 @@ class Honeycomb { public initialized: boolean public started: boolean - // TODO: Bole | null - public logger: any + public logger: typeof bole | null constructor( options: HoneycombOptions, @@ -555,7 +554,6 @@ class Honeycomb { export { beeline, bole, - // Bole, grpc, isDev, otel, From 22e76ff9bc11e358219d006b8bca53d6f736e36e Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 11:42:45 -0500 Subject: [PATCH 076/167] Organization/cleanup of core/honeycomb.ts --- templates/boltzmann/core/honeycomb.ts | 300 +++++++++++++------------- 1 file changed, 149 insertions(+), 151 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 64d15dc6..28f6a63a 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -253,112 +253,6 @@ interface OtelFactoryOverrides { // Let's GOOOOOOO class Honeycomb { - // We load options from the environment. Unlike with Options, - // we do a lot of feature detection here. - public static fromEnv( - serviceName: string, - env: typeof process.env = process.env, - overrides: OtelFactoryOverrides = {} - ): Honeycomb { - return new Honeycomb( - Honeycomb.parseEnv(serviceName, env), - overrides - ) - } - - public static mock(): Honeycomb { - return new Honeycomb( - { - serviceName: 'test-app', - disable: false, - otel: true, - writeKey: 'SOME_WRITEKEY', - dataset: 'SOME_DATASET', - apiHost: 'grpc://api-host.com', - sampleRate: 1 - }, - // TODO: Test + adjust to ensure no spans get emitted for the /monitor/ping route - // honeycomb.factories.instrumentations = () => [] - { - spanProcessor(traceExporter) { - return new OtelTestSpanProcessor(traceExporter) - } - } - ) - - // TODO: Test these for sensibility - /* - honeycomb.features = { - honeycomb: true, - beeline: false, - otel: true - } - */ - } - - public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { - // If there's no write key we won't get very far anyway - const disable = !env.HONEYCOMB_WRITEKEY - let otel: boolean = false - const writeKey = env.HONEYCOMB_WRITEKEY || null - const dataset = env.HONEYCOMB_DATASET || null - const apiHost = env.HONEYCOMB_API_HOST || null - let sampleRate = 1 - - sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) - - if (isNaN(sampleRate)) { - Honeycomb.log( - `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` - + 'defaulting to 1' - ) - sampleRate = 1 - } - - // If the API host is a grpc:// endpoint, we feature switch to - // OpenTelemetry. There are prior uses of this variable here but - // they should've been using https://. - if (!disable && apiHost) { - otel = /^grpc:\/\//.test(apiHost) - } - - return { - serviceName, - disable, - otel, - writeKey, - dataset, - apiHost, - sampleRate - } - } - - // These accessors are type guards that ensure you're working - // with a defined/non-null property. It's a bit of 6-to-1 and - // half a dozen on the other, because you trade ifs for - // try/catches and honeycomb can basically never throw. Even - // so, it saves a little bit of boilerplate. - private getWriteKey (): string { - if (this.features.honeycomb && this.options.writeKey) { - return this.options.writeKey - } - throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!') - } - - private getDataset () { - if (this.features.honeycomb && this.options.dataset) { - return this.options.dataset - } - throw new HoneycombError('HONEYCOMB_DATASET is undefined!') - } - - private getApiHost () { - if (this.features.honeycomb && this.options.apiHost) { - return this.options.apiHost - } - throw new HoneycombError('HONEYCOMB_API_HOST is undefined!') - } - public options: HoneycombOptions public features: HoneycombFeatures public factories: OtelFactories @@ -402,71 +296,78 @@ class Honeycomb { } get tracer (): otel.Tracer { + // TODO: Can we do better than hard-coding 1.0.0? return otel.trace.getTracer('boltzmann', '1.0.0') } - public static log(message: string | Error): void { - // Honeycomb starts up very early in the process's lifetime and - // can't count on bole being configured. In those cases, we fall - // back to console.log and JSON.stringify. Only use this if you - // can't use a bole logger! - - // We always log at the debug level, in an effort to make tracing as quiet - // as possible while still being stdout-debuggable. We also mute them - // during unit tests. - let isDebug = !process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug' - - void `{% if selftest %}` - isDebug = false - void `{% endif %}` + // We (usually) load options from the environment. Unlike with Options, + // we do a lot of feature detection here. + public static fromEnv( + serviceName: string, + env: typeof process.env = process.env, + overrides: OtelFactoryOverrides = {} + ): Honeycomb { + return new Honeycomb( + Honeycomb.parseEnv(serviceName, env), + overrides + ) + } - if (isDebug) { - const line: any = { - time: (new Date()).toISOString(), - level: 'debug', - name: 'boltzmann:honeycomb' - } + // serviceName is defined in the prelude, so rather than doing the same + // logic twice we let the prelude inject it when creating the honeycomb + // object. + public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { + // If there's no write key we won't get very far anyway + const disable = !env.HONEYCOMB_WRITEKEY + let otel: boolean = false + const writeKey = env.HONEYCOMB_WRITEKEY || null + const dataset = env.HONEYCOMB_DATASET || null + const apiHost = env.HONEYCOMB_API_HOST || null + let sampleRate = 1 - if (message instanceof Error) { - line.err = { - name: message.name, - message: message.message, - stack: String(message.stack) - } - } else { - line.message = message - } + sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) - console.log(JSON.stringify(line)) + if (isNaN(sampleRate)) { + Honeycomb.log( + `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` + + 'defaulting to 1' + ) + sampleRate = 1 } - } - public log(message: string | Error): void { - // The logger middleware creates a logger on the honeycomb object. If it's - // in place, we'll gladly use it. - if (this.logger) { - this.logger.debug(message) - return + // If the API host is a grpc:// endpoint, we feature switch to + // OpenTelemetry. There are prior uses of this variable here but + // they should've been using https://. + if (!disable && apiHost) { + otel = /^grpc:\/\//.test(apiHost) } - // Otherwise, fall back to console.log + JSON.stringify - Honeycomb.log(message) + return { + serviceName, + disable, + otel, + writeKey, + dataset, + apiHost, + sampleRate + } } // Initialize Honeycomb! Stands up the otel node SDK if enabled, // otherwise sets up the beeline library. // This needs to occur before any imports you want instrumentation - // to be aware of. + // to be aware of. This step is separated from the constructor if only because + // there are irreversible side effects galore. public init(): void { if (!this.features.honeycomb) { this.initialized = true return } try { - const writeKey = this.getWriteKey(); - const dataset = this.getDataset(); - const sampleRate = this.options.sampleRate || 1; - const serviceName = this.options.serviceName; + const writeKey = this.writeKey + const dataset = this.dataset + const sampleRate = this.options.sampleRate || 1 + const serviceName = this.options.serviceName if (!this.features.otel) { beeline({ writeKey, dataset, sampleRate, serviceName }) @@ -475,7 +376,7 @@ class Honeycomb { } const f = this.factories - const apiHost: string = this.getApiHost() + const apiHost: string = this.apiHost const metadata: grpc.Metadata = f.metadata(writeKey, dataset) const resource: otelResources.Resource = f.resource(serviceName) @@ -549,6 +450,103 @@ class Honeycomb { this.log(err) } } + + // These accessors are type guards that ensure you're working + // with a defined/non-null property. It's a bit of 6-to-1 and + // half a dozen on the other, because you trade ifs for + // try/catches and honeycomb can basically never throw. Even + // so, it saves a little bit of boilerplate. + public get writeKey (): string { + if (this.features.honeycomb && this.options.writeKey) { + return this.options.writeKey + } + throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!') + } + + public get dataset () { + if (this.features.honeycomb && this.options.dataset) { + return this.options.dataset + } + throw new HoneycombError('HONEYCOMB_DATASET is undefined!') + } + + public get apiHost () { + if (this.features.honeycomb && this.options.apiHost) { + return this.options.apiHost + } + throw new HoneycombError('HONEYCOMB_API_HOST is undefined!') + } + + // We *do* have a handful of logging use cases... + + public static log(message: string | Error): void { + // Honeycomb starts up very early in the process's lifetime and + // can't count on bole being configured. In those cases, we fall + // back to console.log and JSON.stringify. Only use this if you + // can't use a bole logger! + + // We always log at the debug level, in an effort to make tracing as quiet + // as possible while still being stdout-debuggable. We also mute them + // during unit tests. + let isDebug = !process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug' + + void `{% if selftest %}` + isDebug = false + void `{% endif %}` + + if (isDebug) { + const line: any = { + time: (new Date()).toISOString(), + level: 'debug', + name: 'boltzmann:honeycomb' + } + + if (message instanceof Error) { + line.err = { + name: message.name, + message: message.message, + stack: String(message.stack) + } + } else { + line.message = message + } + + console.log(JSON.stringify(line)) + } + } + + public log(message: string | Error): void { + // The logger middleware creates a logger on the honeycomb object. If it's + // in place, we'll gladly use it. + if (this.logger) { + this.logger.debug(message) + return + } + + // Otherwise, fall back to console.log + JSON.stringify + Honeycomb.log(message) + } + + // {% if selftest %} + public static mock(): Honeycomb { + return new Honeycomb( + { + serviceName: 'test-app', + disable: false, + otel: true, + writeKey: 'SOME_WRITEKEY', + dataset: 'SOME_DATASET', + apiHost: 'grpc://api-host.com', + sampleRate: 1 + }, + { + spanProcessor(traceExporter) { + return new OtelTestSpanProcessor(traceExporter) + } + } + ) + } + // {% endif %} } export { From 8243a44df3504fd1a3711240e865a014f029ed46 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 13:57:04 -0500 Subject: [PATCH 077/167] Refactor how honeycomb mock is created --- templates/boltzmann/core/honeycomb.ts | 41 +++++++++++++-------------- templates/boltzmann/core/prelude.ts | 3 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 28f6a63a..03c7fa35 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -526,27 +526,6 @@ class Honeycomb { // Otherwise, fall back to console.log + JSON.stringify Honeycomb.log(message) } - - // {% if selftest %} - public static mock(): Honeycomb { - return new Honeycomb( - { - serviceName: 'test-app', - disable: false, - otel: true, - writeKey: 'SOME_WRITEKEY', - dataset: 'SOME_DATASET', - apiHost: 'grpc://api-host.com', - sampleRate: 1 - }, - { - spanProcessor(traceExporter) { - return new OtelTestSpanProcessor(traceExporter) - } - } - ) - } - // {% endif %} } export { @@ -639,7 +618,27 @@ function resetOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): processor._exporterCreatedSpans = [] } +function createMockHoneycomb(): Honeycomb { + return new Honeycomb( + { + serviceName: 'test-app', + disable: false, + otel: true, + writeKey: 'SOME_WRITEKEY', + dataset: 'SOME_DATASET', + apiHost: 'grpc://api-host.com', + sampleRate: 1 + }, + { + spanProcessor(traceExporter) { + return new OtelTestSpanProcessor(traceExporter) + } + } + ) +} + export { + createMockHoneycomb, getOtelTestSpans, OtelTestSpanProcessor, resetOtelTestSpans diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 246704f7..60067a45 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -75,7 +75,8 @@ if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { let honeycomb: Honeycomb = Honeycomb.fromEnv(serviceName, process.env); void `{% if selftest %}`; -honeycomb = Honeycomb.mock() +import { createMockHoneycomb } from './honeycomb' +honeycomb = createMockHoneycomb() void `{% endif %}`; honeycomb.init() From a8128a75343786165925ce200ca1c14bb184773c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 13:58:02 -0500 Subject: [PATCH 078/167] Use the traceparent header for the context ID if available --- templates/boltzmann/data/context.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 5606da94..d27f6460 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -68,6 +68,7 @@ class Context { this.id = String( request.headers['x-honeycomb-trace'] || request.headers['x-request-id'] || + request.headers['traceparent'] || uuid.v4() ) this._loadSession = async () => { From 7994b8b554ed4fbe190e52ef930947180079d647 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 13:58:42 -0500 Subject: [PATCH 079/167] context.addTraceAttributes method --- templates/boltzmann/data/context.ts | 41 +++++++++++++++------ templates/boltzmann/middleware/honeycomb.ts | 3 +- types/honeycomb-beeline.d.ts | 1 + 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index d27f6460..1fd636b1 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -1,6 +1,6 @@ void `{% if selftest %}`; import { honeycomb } from '../core/prelude' -import { otel } from '../core/honeycomb' +import { beeline, otel } from '../core/honeycomb' import { IncomingMessage, ServerResponse } from 'http' import { Accepts } from 'accepts' import accepts from 'accepts' @@ -50,7 +50,9 @@ class Context { // {% if honeycomb %} /**{{- tsdoc(page="02-handlers.md", section="span") -}}*/ - public span: otel.Span | null + public span?: otel.Span + + public _traceSpan?: otel.Span // {% endif %} ;[extensions: string]: any @@ -74,9 +76,6 @@ class Context { this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app') } - void `{% if honeycomb %}` - this.span = null - void `{% endif %}` } static baseHandler (context: Context): Promise { @@ -141,18 +140,36 @@ class Context { if (honeycomb.features.beeline) { url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']) url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime/1000 - 1))) - } else if (honeycomb.features.otel) { - const spanCtx = this._honeycombTrace.spanContext() - const [startSeconds, startNanos] = this._honeycombTrace.startTime + } else if (honeycomb.features.otel && this._traceSpan) { + // _traceSpan's type is otel.Span but startTime only exists on the + // otelTraceBase.Span subclass. Therefore, we duck type the property and + // fall back to "a minute ago" if it's not defined. + const span = this._traceSpan as any + const spanCtx = this._traceSpan.spanContext() + let startTime = Date.now() - 60000 + if (span.startTime) { + const [startSeconds, startNanos] = span.startTime + startTime = startSeconds * 1000 + startNanos / 1000 + } url.searchParams.set('trace_id', spanCtx.traceId) - url.searchParams.set( - 'trace_start_ts', - String(startSeconds * 1000 + startNanos / 1000) - ) + url.searchParams.set('trace_start_ts', String(startTime)) } return String(url) } + + /**{{- tsdoc(page="02-handlers.md", section="addTraceAttributes") -}}*/ + addTraceAttributes(attributes: Record): void { + if (honeycomb.features.otel && this.span) { + Object.entries(attributes).forEach(([key, value]) => { + if (this._traceSpan) { + this._traceSpan.setAttribute(key, value) + } + }) + } else if (honeycomb.features.beeline) { + beeline.addTraceContext(attributes) + } + } // {% endif %} /**{{- tsdoc(page="02-handlers.md", section="url") -}}*/ diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 26505bd2..d4597560 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -2,7 +2,7 @@ void `{% if selftest %}`; import { honeycomb } from '../core/prelude' export { trace, honeycombMiddlewareSpans } -import { beeline, Honeycomb, otel, otelSemanticConventions } from '../core/honeycomb' +import { beeline, otel, otelSemanticConventions } from '../core/honeycomb' import { ServerResponse } from 'http' import { Handler } from '../core/middleware' import { Context } from '../data/context' @@ -231,6 +231,7 @@ function otelTrace () { if (span) { span.setAttribute('boltzmann.http.query', context.url.search) otel.trace.setSpan(traceContext, span) + context._traceSpan = span context.span = span if (isDev()) { diff --git a/types/honeycomb-beeline.d.ts b/types/honeycomb-beeline.d.ts index 9efad09e..9758b0e6 100644 --- a/types/honeycomb-beeline.d.ts +++ b/types/honeycomb-beeline.d.ts @@ -12,6 +12,7 @@ declare module 'honeycomb-beeline' { finishTrace: (_: string) => void bindFunctionToTrace(...args: Parameters): ReturnType addContext: (opts?: Record) => void + addTraceContext: (opts?: Record) => void } declare const beeline: Beeline; From 3108cedc23122fcf6a8225fe9abd917cc11e765e Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 15:04:12 -0500 Subject: [PATCH 080/167] scope otel "trace" attributes to "app." + note on traces vs spans --- templates/boltzmann/data/context.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 1fd636b1..f664d63b 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -160,10 +160,13 @@ class Context { /**{{- tsdoc(page="02-handlers.md", section="addTraceAttributes") -}}*/ addTraceAttributes(attributes: Record): void { - if (honeycomb.features.otel && this.span) { + if (honeycomb.features.otel) { + // OpenTelemetry doesn't have the concept of trace context attributes + // the same way that beelines do, so we set the attributes on the + // request-level span instead Object.entries(attributes).forEach(([key, value]) => { if (this._traceSpan) { - this._traceSpan.setAttribute(key, value) + this._traceSpan.setAttribute(key, `app.${value}`) } }) } else if (honeycomb.features.beeline) { From 38be20870dbe282a2345ef9300d0a71865cb871a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 15:15:40 -0500 Subject: [PATCH 081/167] Fix setting otel "trace" attributes - strike that, reverse it --- templates/boltzmann/data/context.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index f664d63b..d99152e7 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -159,14 +159,14 @@ class Context { } /**{{- tsdoc(page="02-handlers.md", section="addTraceAttributes") -}}*/ - addTraceAttributes(attributes: Record): void { + addTraceAttributes(attributes: Record): void { if (honeycomb.features.otel) { // OpenTelemetry doesn't have the concept of trace context attributes // the same way that beelines do, so we set the attributes on the // request-level span instead Object.entries(attributes).forEach(([key, value]) => { if (this._traceSpan) { - this._traceSpan.setAttribute(key, `app.${value}`) + this._traceSpan.setAttribute(`app.${key}`, String(value)) } }) } else if (honeycomb.features.beeline) { From 37bf8d0be7db0569d29c151ad237d5b6ce5eb2a9 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 15:21:41 -0500 Subject: [PATCH 082/167] Upgrade actions from node 12.x to 16.x --- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- templates/github-action-test.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2e624647..f93ed999 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -83,7 +83,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2.1.2 with: - node-version: '12' + node-version: '16' - name: download release contents run: | tag=${{ github.ref }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 10a67fd2..9240598b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Use Node.js 12.x + - name: Use Node.js ${{ matrix.node_version }} uses: actions/setup-node@v2.1.2 with: node-version: ${{ matrix.node_version }} diff --git a/templates/github-action-test.yml b/templates/github-action-test.yml index 84f34877..92b893a3 100644 --- a/templates/github-action-test.yml +++ b/templates/github-action-test.yml @@ -25,10 +25,10 @@ jobs: {% endif %} steps: - uses: actions/checkout@v2 - - name: Use Node.js 12.x + - name: Use Node.js 16.x uses: actions/setup-node@v1 with: - node-version: '12.x' + node-version: '16.x' - name: npm ci run: npm ci From baceffd7898a8b68415f058c9dc6834d90489ceb Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 15:23:49 -0500 Subject: [PATCH 083/167] Use node action v2 --- templates/github-action-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/github-action-test.yml b/templates/github-action-test.yml index 92b893a3..5654f62f 100644 --- a/templates/github-action-test.yml +++ b/templates/github-action-test.yml @@ -26,7 +26,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Use Node.js 16.x - uses: actions/setup-node@v1 + uses: actions/setup-node@v2 with: node-version: '16.x' From b971ccab486969cd7df33fdc0df512d15e8a0c60 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 15:43:16 -0500 Subject: [PATCH 084/167] Only add properties to otel trace span if defined --- templates/boltzmann/data/context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index d99152e7..27fb4410 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -165,7 +165,7 @@ class Context { // the same way that beelines do, so we set the attributes on the // request-level span instead Object.entries(attributes).forEach(([key, value]) => { - if (this._traceSpan) { + if (this._traceSpan && value) { this._traceSpan.setAttribute(`app.${key}`, String(value)) } }) From ec3b88546f17d59fa19f8404dbea008688eab4d3 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 16:20:04 -0500 Subject: [PATCH 085/167] Fixes to make dispensary-dashboard build happy --- templates/boltzmann/core/honeycomb.ts | 4 +++- templates/boltzmann/core/prelude.ts | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 03c7fa35..d6a730c1 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -435,7 +435,9 @@ class Honeycomb { process.once('SIGTERM', shutdown) process.once('beforeExit', shutdown) process.once('uncaughtException', die) - process.once('unhandledRejection', die) + process.once('unhandledRejection', async (reason: Error | any, _: Promise) => { + await die(reason) + }) await sdk.start() } this.started = true diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 60067a45..6b7ecc41 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -97,6 +97,7 @@ import { Accepts } from 'accepts' import { RouteOptions, Handler as FMWHandler, HTTPVersion, HTTPMethod } from 'find-my-way' import Ajv from 'ajv' import * as cookie from 'cookie' +import type tap from 'tap' void `{% if redis %}`; import { WrappedNodeRedisClient } from 'handy-redis' void `{% endif %}`; @@ -224,6 +225,7 @@ export { Listener, ResponseObject, cookie, + tap, os, path, http, From d4be00fac361955f6cc0f43b5ea4dd4a0dbc6184 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 16:28:01 -0500 Subject: [PATCH 086/167] Update honeycomb-beeline.d.ts in build --- src/dirspec.ron | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dirspec.ron b/src/dirspec.ron index 619bea47..be5994ab 100644 --- a/src/dirspec.ron +++ b/src/dirspec.ron @@ -172,6 +172,7 @@ r#"declare module 'honeycomb-beeline' { finishTrace: (_: string) => void bindFunctionToTrace(...args: Parameters): ReturnType addContext: (opts?: Record) => void + addTraceContext: (opts?: Record) => void } declare const beeline: Beeline; From 059aeb08a3198490751ec33c8bdbd4690c967089 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 16:31:30 -0500 Subject: [PATCH 087/167] Make dispensary-dashboard happy with honeycomb-beeline.d.ts formatting --- src/dirspec.ron | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dirspec.ron b/src/dirspec.ron index be5994ab..8732ec7c 100644 --- a/src/dirspec.ron +++ b/src/dirspec.ron @@ -175,8 +175,8 @@ r#"declare module 'honeycomb-beeline' { addTraceContext: (opts?: Record) => void } - declare const beeline: Beeline; - export = beeline; + declare const beeline: Beeline + export = beeline } "# )), Some(When(all_of: ["honeycomb"]))), From 2233ef857a8bd9758cdbf1cbdea65c2fb5e9bd78 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 17:06:58 -0500 Subject: [PATCH 088/167] Naively upgrade typescript-eslint libraries to fix huge warning in consumer-app-gateway --- src/dependencies.ron | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dependencies.ron b/src/dependencies.ron index 44df6198..e610baae 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -450,13 +450,13 @@ ), DependencySpec( name: "@typescript-eslint/parser", - version: "^4.11.0", + version: "^5.12.1", kind: Development, preconditions: None ), DependencySpec( name: "@typescript-eslint/eslint-plugin", - version: "^4.11.0", + version: "^5.12.0", kind: Development, preconditions: None ), From 0aa1ec835a33f8336d4678c06a55222320a87a72 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 22 Feb 2022 19:13:01 -0500 Subject: [PATCH 089/167] Improved comments --- templates/boltzmann/core/honeycomb.ts | 3 +++ templates/boltzmann/middleware/honeycomb.ts | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index d6a730c1..b6643bd9 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -194,6 +194,9 @@ const defaultOtelFactories: OtelFactories = { let is: OtelInstrumentation[] = [ new OtelDnsInstrumentation({}), + // NOTE: This instrumentation creates the default "trace" span and manages + // header propagation! See the honeycomb trace middleware for more + // details. new OtelHttpInstrumentation({ // TODO: These fields are expected to become deprecated in the // near future... diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index d4597560..b01dcb73 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -198,7 +198,7 @@ function otelTrace () { let traceContext = otel.context.active() // Typically, HTTP auto-instrumentation will create a parent span for us - let span: otel.Span | null = otel.trace.getSpan(traceContext) || null + let span: otel.Span | undefined = otel.trace.getSpan(traceContext) let createdSpan = false // In shot testing (and other scenarios that don't touch HTTP @@ -225,9 +225,13 @@ function otelTrace () { }, traceContext ) + // We need to clean up this span later - put a pin in it createdSpan = true } + // startSpan should always return a span, but as far as typescript is + // concerned the span could still be undefined. We could assert that it + // exists, but throwing instrumentation-related errors is poor form. if (span) { span.setAttribute('boltzmann.http.query', context.url.search) otel.trace.setSpan(traceContext, span) @@ -245,7 +249,6 @@ function otelTrace () { ) } - // do not as I do, onHeaders(context._response, function () { const handler: Handler = context.handler @@ -253,6 +256,8 @@ function otelTrace () { return } + // If we don't have an automatic span, we need to fill in some basic + // response properties. if (createdSpan) { span.setAttribute( otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, @@ -281,7 +286,8 @@ function otelTrace () { ) } }) - + + // If we created the span, we also need to close it if (createdSpan) { span.end() } From 70cbe69a8692550e0a61b9222348c0e250af93a8 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 23 Feb 2022 00:12:43 -0500 Subject: [PATCH 090/167] Add some extra trace attributes --- templates/boltzmann/core/middleware.ts | 2 ++ templates/boltzmann/middleware/honeycomb.ts | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index b0954031..a0785a54 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -237,6 +237,8 @@ if (require.main === module) { "http.route": "/", "boltzmann.http.query": "", "http.status_code": "200", + "service_name": "test-app", + "boltzmann.honeycomb.trace_type": "otel" } }, ], diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index b01dcb73..83ffbbeb 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -93,7 +93,10 @@ function beelineTrace ({ 'request.method': context.method, 'request.scheme': context.url.protocol, 'request.path': context.url.pathname, - 'request.query': context.url.search + 'request.query': context.url.search, + // for forward compatibility with OpenTelemetry traces + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'boltzmann.honeycomb.trace_type': 'beeline' }, traceContext.traceId, traceContext.parentSpanId, @@ -220,6 +223,9 @@ function otelTrace () { [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, + // for backwards compatibility with beeline traces + service_name: honeycomb.options.serviceName, + 'boltzmann.honeycomb.trace_type': 'otel' }, kind: otel.SpanKind.SERVER, }, From 2e34783703d4346cdf45c1df96fe4f3ab8c638e8 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 23 Feb 2022 12:16:05 -0500 Subject: [PATCH 091/167] Refactor "trace attributes" feature --- templates/boltzmann/core/middleware.ts | 10 +++++-- templates/boltzmann/data/context.ts | 11 ++++--- templates/boltzmann/middleware/honeycomb.ts | 32 +++++++++++++++++---- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index a0785a54..0e9490cd 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -99,7 +99,7 @@ async function handler (context: Context) { 'handler.method': String(handler.method), 'handler.route': handler.route, 'handler.version': handler.version || '*', - 'handler.decorators': String(handler.decorators) + 'handler.decorators': String(handler.decorators), }) } else if (honeycomb.features.otel) { let traceContext = otel.context.active() @@ -120,6 +120,9 @@ async function handler (context: Context) { 'boltzmann.http.handler.name': handler.name || '', 'boltzmann.http.handler.version': handler.version || '*', 'boltzmann.http.handler.decorators': String(handler.decorators), + // for backwards compatibility with beeline traces + service_name: honeycomb.options.serviceName, + 'boltzmann.honeycomb.trace_type': 'otel', }, kind: otel.SpanKind.SERVER }, @@ -218,7 +221,10 @@ if (require.main === module) { spanId: boltzmannSpans[0].spanId, parentSpanId: boltzmannSpans[1].spanId, // TODO: There *should* be attributes here, no? - attributes: {} + attributes: { + "service_name": "test-app", + "boltzmann.honeycomb.trace_type": "otel", + } }, // The request-level parent span { diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 27fb4410..1915bd28 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -51,8 +51,8 @@ class Context { // {% if honeycomb %} /**{{- tsdoc(page="02-handlers.md", section="span") -}}*/ public span?: otel.Span - public _traceSpan?: otel.Span + public _traceAttributes: Record // {% endif %} ;[extensions: string]: any @@ -76,6 +76,9 @@ class Context { this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app') } + void `{% if honeycomb %}` + this._traceAttributes = {} + void `{% endif %}` } static baseHandler (context: Context): Promise { @@ -164,11 +167,7 @@ class Context { // OpenTelemetry doesn't have the concept of trace context attributes // the same way that beelines do, so we set the attributes on the // request-level span instead - Object.entries(attributes).forEach(([key, value]) => { - if (this._traceSpan && value) { - this._traceSpan.setAttribute(`app.${key}`, String(value)) - } - }) + this._traceAttributes = {...this._traceAttributes, ...attributes} } else if (honeycomb.features.beeline) { beeline.addTraceContext(attributes) } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 83ffbbeb..8acaeb0f 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -29,6 +29,10 @@ function paramSpanAttribute(param: string): string { return `boltzmann.http.request.param.${param}` } +function traceAttribute(key: string) { + return `app.${key}` +} + export { traceName, middlewareSpanName, @@ -284,12 +288,15 @@ function otelTrace () { handler.version ) - Object.entries(context.params).map(([key, value]) => { + Object.entries(context._traceAttributes).forEach(([key, value]) => { + if (span && value) { + span.setAttribute(traceAttribute(key), String(value)) + } + }) + + Object.entries(context.params).forEach(([key, value]) => { if (span) { - span.setAttribute( - paramSpanAttribute(key), - value - ) + span.setAttribute(paramSpanAttribute(key), value) } }) @@ -318,13 +325,26 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { const span = honeycomb.tracer.startSpan( middlewareSpanName(name), - { kind: otel.SpanKind.SERVER }, + { + attributes: { + service_name: honeycomb.options.serviceName, + 'boltzmann.honeycomb.trace_type': 'otel' + }, + kind: otel.SpanKind.SERVER + }, traceContext ) otel.trace.setSpan(traceContext, span) context.span = span const result = await next(context) + + Object.entries(context._traceAttributes).forEach(([key, value]) => { + if (value) { + span.setAttribute(traceAttribute(key), String(value)) + } + }) + context.span = parentSpan span.end() From 988591380901eb67a371281bb7750cbaac8f01db Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 23 Feb 2022 12:58:39 -0500 Subject: [PATCH 092/167] use otel.context.with instead of carrying spans on boltzmann context --- templates/boltzmann/core/middleware.ts | 22 ++++++------------ templates/boltzmann/data/context.ts | 2 -- templates/boltzmann/middleware/honeycomb.ts | 25 +++++++++------------ 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 0e9490cd..bbe8e1d3 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -91,7 +91,7 @@ async function handler (context: Context) { // {% if honeycomb %} let beelineSpan = null let otelSpan = null - let parentOtelSpan = context.span + let traceContext = otel.context.active() if (honeycomb.features.beeline) { beelineSpan = beeline.startSpan({ name: handlerSpanName(handler), @@ -102,14 +102,6 @@ async function handler (context: Context) { 'handler.decorators': String(handler.decorators), }) } else if (honeycomb.features.otel) { - let traceContext = otel.context.active() - - if (context.span) { - traceContext = otel.trace.setSpan( - traceContext, - context.span - ) - } otelSpan = honeycomb.tracer.startSpan( handlerSpanName(handler), @@ -128,20 +120,20 @@ async function handler (context: Context) { }, traceContext ) - otel.trace.setSpan(traceContext, otelSpan) - context.span = otelSpan + traceContext = otel.trace.setSpan(traceContext, otelSpan) } try { - // {% endif %} - return await handler(context) - // {% if honeycomb %} + return await otel.context.with(traceContext, async () => { + // {% endif %} + return await handler(context) + // {% if honeycomb %} + }) } finally { if (beelineSpan !== null) { beeline.finishSpan(beelineSpan) } else if (otelSpan !== null) { otelSpan.end() - context.span = parentOtelSpan } } // {% endif %} diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 1915bd28..3dcf67f3 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -49,8 +49,6 @@ class Context { // {% endif %} // {% if honeycomb %} - /**{{- tsdoc(page="02-handlers.md", section="span") -}}*/ - public span?: otel.Span public _traceSpan?: otel.Span public _traceAttributes: Record // {% endif %} diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 8acaeb0f..4d00e48a 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -244,9 +244,11 @@ function otelTrace () { // exists, but throwing instrumentation-related errors is poor form. if (span) { span.setAttribute('boltzmann.http.query', context.url.search) - otel.trace.setSpan(traceContext, span) - context._traceSpan = span - context.span = span + traceContext = otel.trace.setSpan(traceContext, span) + + if (isDev()) { + context._traceSpan = span + } if (isDev()) { context._honeycombTrace = span @@ -306,7 +308,9 @@ function otelTrace () { } }) - return next(context) + return otel.context.with(traceContext, () => { + return next(context) + }) } } } @@ -315,13 +319,6 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { return function honeycombSpan (next: Handler) { return async (context: Context) => { let traceContext = otel.context.active() - let parentSpan = context.span - if (parentSpan) { - traceContext = otel.trace.setSpan( - traceContext, - parentSpan - ) - } const span = honeycomb.tracer.startSpan( middlewareSpanName(name), @@ -336,8 +333,9 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { ) otel.trace.setSpan(traceContext, span) - context.span = span - const result = await next(context) + const result = await otel.context.with(traceContext, () => { + return next(context) + }) Object.entries(context._traceAttributes).forEach(([key, value]) => { if (value) { @@ -345,7 +343,6 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { } }) - context.span = parentSpan span.end() return result From db3e1135002cc609018a8e366ee06ee61fbd98cf Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 23 Feb 2022 17:16:52 -0500 Subject: [PATCH 093/167] Wrap honeycomb logging setup in if-block + add deprecation warning --- templates/boltzmann/middleware/log.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 749bbbcd..0f6dfc0a 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -21,7 +21,16 @@ function log ({ stream = pretty } bole.output({ level, stream }) + + void `{% if honeycomb %}` honeycomb.logger = bole('boltzmann:honeycomb') + if (honeycomb.features.beeline) { + honeycomb.logger.warn( + 'Honeycomb beeline support is deprecated and will be removed in a future version. ' + + 'To use OpenTelemetry, set HONEYCOMB_API_HOST to a grpc:// endpoint.' + ) + } + void `{% endif %}` return function logMiddleware (next: Handler) { return async function inner (context: Context) { From bc3bf75855d6f0739a19ed015f78b29a804e2622 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 23 Feb 2022 17:17:23 -0500 Subject: [PATCH 094/167] Minor otel middleware bugfixes --- templates/boltzmann/middleware/honeycomb.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 4d00e48a..a7ce25d5 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -199,7 +199,7 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { * ▔▏┗┻┛┃┃┗┻┛▕▔ */ function otelTrace () { - const logger = bole('boltzmann:trace') + const logger = bole('boltzmann:honeycomb:trace') return function honeycombTrace (next: Handler) { return (context: Context) => { let traceContext = otel.context.active() @@ -211,7 +211,7 @@ function otelTrace () { // In shot testing (and other scenarios that don't touch HTTP // auto-instrumentation, we'll need to create one if (!span) { - otel.propagation.extract( + traceContext = otel.propagation.extract( traceContext, context.headers, otel.defaultTextMapGetter @@ -227,10 +227,7 @@ function otelTrace () { [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - // for backwards compatibility with beeline traces - service_name: honeycomb.options.serviceName, - 'boltzmann.honeycomb.trace_type': 'otel' - }, + }, kind: otel.SpanKind.SERVER, }, traceContext @@ -243,6 +240,9 @@ function otelTrace () { // concerned the span could still be undefined. We could assert that it // exists, but throwing instrumentation-related errors is poor form. if (span) { + // for backwards compatibility with beeline traces + span.setAttribute('service_name', honeycomb.options.serviceName) + span.setAttribute('boltzmann.honeycomb.trace_type', 'otel') span.setAttribute('boltzmann.http.query', context.url.search) traceContext = otel.trace.setSpan(traceContext, span) @@ -331,7 +331,7 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { }, traceContext ) - otel.trace.setSpan(traceContext, span) + traceContext = otel.trace.setSpan(traceContext, span) const result = await otel.context.with(traceContext, () => { return next(context) From dfd03277b0b2189eba5a74ab33b9f48dc3dbe2a5 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Feb 2022 12:16:14 -0500 Subject: [PATCH 095/167] Remove addTraceAttributes helper --- templates/boltzmann/data/context.ts | 33 +++------------------ templates/boltzmann/middleware/honeycomb.ts | 18 ----------- 2 files changed, 4 insertions(+), 47 deletions(-) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index 3dcf67f3..fd20c2dc 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -48,11 +48,6 @@ class Context { public _postgresConnection?: Promise // {% endif %} - // {% if honeycomb %} - public _traceSpan?: otel.Span - public _traceAttributes: Record - // {% endif %} - ;[extensions: string]: any constructor(public request: IncomingMessage, public _response: ServerResponse) { @@ -74,9 +69,6 @@ class Context { this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app') } - void `{% if honeycomb %}` - this._traceAttributes = {} - void `{% endif %}` } static baseHandler (context: Context): Promise { @@ -141,15 +133,11 @@ class Context { if (honeycomb.features.beeline) { url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']) url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime/1000 - 1))) - } else if (honeycomb.features.otel && this._traceSpan) { - // _traceSpan's type is otel.Span but startTime only exists on the - // otelTraceBase.Span subclass. Therefore, we duck type the property and - // fall back to "a minute ago" if it's not defined. - const span = this._traceSpan as any - const spanCtx = this._traceSpan.spanContext() + } else if (honeycomb.features.otel) { + const spanCtx = this._honeycombTrace.spanContext() let startTime = Date.now() - 60000 - if (span.startTime) { - const [startSeconds, startNanos] = span.startTime + if (this._honeycombTrace.startTime) { + const [startSeconds, startNanos] = this._honeycombTrace.startTime startTime = startSeconds * 1000 + startNanos / 1000 } url.searchParams.set('trace_id', spanCtx.traceId) @@ -159,19 +147,6 @@ class Context { return String(url) } - /**{{- tsdoc(page="02-handlers.md", section="addTraceAttributes") -}}*/ - addTraceAttributes(attributes: Record): void { - if (honeycomb.features.otel) { - // OpenTelemetry doesn't have the concept of trace context attributes - // the same way that beelines do, so we set the attributes on the - // request-level span instead - this._traceAttributes = {...this._traceAttributes, ...attributes} - } else if (honeycomb.features.beeline) { - beeline.addTraceContext(attributes) - } - } - // {% endif %} - /**{{- tsdoc(page="02-handlers.md", section="url") -}}*/ get url() { if (this._parsedUrl) { diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index a7ce25d5..55faed66 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -246,15 +246,9 @@ function otelTrace () { span.setAttribute('boltzmann.http.query', context.url.search) traceContext = otel.trace.setSpan(traceContext, span) - if (isDev()) { - context._traceSpan = span - } - if (isDev()) { context._honeycombTrace = span } - } else if (createdSpan) { - logger.debug('could not create a root span - something is seriously wrong') } else { logger.debug( "could not find and did not attempt to create a root span - something is seriously wrong" @@ -290,12 +284,6 @@ function otelTrace () { handler.version ) - Object.entries(context._traceAttributes).forEach(([key, value]) => { - if (span && value) { - span.setAttribute(traceAttribute(key), String(value)) - } - }) - Object.entries(context.params).forEach(([key, value]) => { if (span) { span.setAttribute(paramSpanAttribute(key), value) @@ -337,12 +325,6 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { return next(context) }) - Object.entries(context._traceAttributes).forEach(([key, value]) => { - if (value) { - span.setAttribute(traceAttribute(key), String(value)) - } - }) - span.end() return result From 2fe3662f66f14131a39321b03148ceb2c8f937a8 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Feb 2022 12:17:52 -0500 Subject: [PATCH 096/167] Improve logging --- templates/boltzmann/middleware/honeycomb.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 55faed66..ac128ece 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,6 +1,6 @@ void `{% if selftest %}`; import { honeycomb } from '../core/prelude' - +import assert from 'assert' export { trace, honeycombMiddlewareSpans } import { beeline, otel, otelSemanticConventions } from '../core/honeycomb' import { ServerResponse } from 'http' @@ -250,9 +250,12 @@ function otelTrace () { context._honeycombTrace = span } } else { - logger.debug( - "could not find and did not attempt to create a root span - something is seriously wrong" - ) + logger.debug(new assert.AssertionError({ + message: 'no parent span found or created', + actual: span, + expected: true, + operator: '==' + })) } onHeaders(context._response, function () { From bc4c6b7298385253fc632880cc565c4c6eb0b82a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Feb 2022 12:41:36 -0500 Subject: [PATCH 097/167] Automatically append service_name and trace_type to every span --- templates/boltzmann/core/honeycomb.ts | 62 ++++++++++++++++----- templates/boltzmann/core/middleware.ts | 11 ++-- templates/boltzmann/middleware/honeycomb.ts | 10 +--- 3 files changed, 54 insertions(+), 29 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index b6643bd9..ddb68cdf 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -71,6 +71,44 @@ void `{% endif %}` class HoneycombError extends Error { } +// There's a bug in the trace base library where the SimpleSpanExporter doesn't +// actually conform to the SpanExporter interface! onStart in particular +// doesn't take the context argument. This makes typescript extremely +// cranky. +// +// We work around this by defining a new type which is the same as a +// SimpleSpanProcessor, but without enforcing onStart and onEnd. Then, we +// implement those methods as specified by the SpanProcessor interface. +type _OtelSpanProcessorClass = new(_exporter: otelTraceBase.SpanExporter) => { + [P in Exclude]: otelTraceBase.SpanProcessor[P] +} + +const _OtelSpanProcessor: _OtelSpanProcessorClass = otelTraceBase.SimpleSpanProcessor + +class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase.SpanProcessor { + constructor(_exporter: otelTraceBase.SpanExporter) { + super(_exporter) + } + + // We want every span in the process to contain a couple of extra attributes. + // Right now that's just service_name (for backwards compatibility with + // beeline) and a trace type (so we can detect whether a service is using + // beeline or otel). This could theoretically be extended to allow + // customization a la beeline.addTraceContext, but that problem is really + // hairy and there are a lot of good reasons to add most attributes to + // just the active span. + onStart(span: otelTraceBase.Span, _: otel.Context): void { + span.setAttribute('service_name', span.resource.attributes['service.name']) + span.setAttribute('boltzmann.honeycomb.trace_type', 'otel') + + otelTraceBase.SimpleSpanProcessor.prototype.onStart.call(this, span) + } + + onEnd(span: otelTraceBase.ReadableSpan): void { + otelTraceBase.SimpleSpanProcessor.prototype.onEnd.call(this, span) + } +} + // Arguments passed to Honeycomb's constructor interface HoneycombOptions { serviceName: string @@ -162,10 +200,7 @@ const defaultOtelFactories: OtelFactories = { // Process spans, using the supplied trace exporter to // do the actual exporting. spanProcessor (traceExporter: OTLPTraceExporter): otelTraceBase.SpanProcessor { - // There's a bug in the types here - SimpleSpanProcessor doesn't - // take the optional Context argument in its signature and - // typescript is understandably cranky about that. - return (new otelTraceBase.SimpleSpanProcessor(traceExporter) as unknown) + return new HoneycombSpanProcessor(traceExporter) }, instrumentations () { @@ -563,13 +598,14 @@ export { HoneycombError, HoneycombOptions, HoneycombFeatures, + HoneycombSpanProcessor, OtelFactories, OtelFactoryOverrides, } void `{% if selftest %}` -class OtelTestSpanProcessor extends otelTraceBase.SimpleSpanProcessor { +class OtelMockSpanProcessor extends HoneycombSpanProcessor { public _exporterCreatedSpans: otelTraceBase.ReadableSpan[] = [] constructor(_exporter: otelTraceBase.SpanExporter) { @@ -587,7 +623,7 @@ class OtelTestSpanProcessor extends otelTraceBase.SimpleSpanProcessor { } } -function getOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): otelTraceBase.ReadableSpan[] { +function getOtelMockSpans(spanProcessor: otelTraceBase.SpanProcessor | null): otelTraceBase.ReadableSpan[] { const processor: any = spanProcessor if (!processor) { @@ -598,14 +634,14 @@ function getOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): ot if (!processor._exporterCreatedSpans) { throw new Error( - 'Span processor is not an OtelTestSpanProcessor' + 'Span processor is not an OtelMockSpanProcessor' ) } return (processor._exporterCreatedSpans) } -function resetOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): void { +function resetOtelMockSpans(spanProcessor: otelTraceBase.SpanProcessor | null): void { const processor: any = spanProcessor if (!processor) { @@ -616,7 +652,7 @@ function resetOtelTestSpans(spanProcessor: otelTraceBase.SpanProcessor | null): if (!processor._exporterCreatedSpans) { throw new Error( - 'Span processor is not an OtelTestSpanProcessor' + 'Span processor is not an OtelMockSpanProcessor' ) } @@ -636,7 +672,7 @@ function createMockHoneycomb(): Honeycomb { }, { spanProcessor(traceExporter) { - return new OtelTestSpanProcessor(traceExporter) + return new OtelMockSpanProcessor(traceExporter) } } ) @@ -644,9 +680,9 @@ function createMockHoneycomb(): Honeycomb { export { createMockHoneycomb, - getOtelTestSpans, - OtelTestSpanProcessor, - resetOtelTestSpans + getOtelMockSpans, + OtelMockSpanProcessor, + resetOtelMockSpans } import tap from 'tap' diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index bbe8e1d3..e213be9b 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,7 +1,7 @@ void `{% if selftest %}`; export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } import { honeycomb } from '../core/prelude' -import { beeline, getOtelTestSpans, otel, otelSemanticConventions } from '../core/honeycomb' +import { beeline, getOtelMockSpans, otel, otelSemanticConventions } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' @@ -111,10 +111,7 @@ async function handler (context: Context) { [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, 'boltzmann.http.handler.name': handler.name || '', 'boltzmann.http.handler.version': handler.version || '*', - 'boltzmann.http.handler.decorators': String(handler.decorators), - // for backwards compatibility with beeline traces - service_name: honeycomb.options.serviceName, - 'boltzmann.honeycomb.trace_type': 'otel', + 'boltzmann.http.handler.decorators': String(handler.decorators) }, kind: otel.SpanKind.SERVER }, @@ -182,7 +179,7 @@ if (require.main === module) { assert.same(response.payload, 'Hello!') - const spans = getOtelTestSpans(honeycomb.spanProcessor) + const spans = getOtelMockSpans(honeycomb.spanProcessor) // assert.same(spans, [], 'un-comment this to render all spans') @@ -191,7 +188,7 @@ if (require.main === module) { return { spanName: span.name, - serviceName: String(span.resource.attributes['service.name']).split(':')[0], + serviceName: span.resource.attributes['service.name'], library: span.instrumentationLibrary.name, spanId: context.spanId, traceId: context.traceId, diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index ac128ece..8bfc1aa0 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -241,8 +241,6 @@ function otelTrace () { // exists, but throwing instrumentation-related errors is poor form. if (span) { // for backwards compatibility with beeline traces - span.setAttribute('service_name', honeycomb.options.serviceName) - span.setAttribute('boltzmann.honeycomb.trace_type', 'otel') span.setAttribute('boltzmann.http.query', context.url.search) traceContext = otel.trace.setSpan(traceContext, span) @@ -313,13 +311,7 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { const span = honeycomb.tracer.startSpan( middlewareSpanName(name), - { - attributes: { - service_name: honeycomb.options.serviceName, - 'boltzmann.honeycomb.trace_type': 'otel' - }, - kind: otel.SpanKind.SERVER - }, + { kind: otel.SpanKind.SERVER }, traceContext ) traceContext = otel.trace.setSpan(traceContext, span) From c5e0cf991c0ede58b242bc22643c2758c5554326 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Feb 2022 13:00:08 -0500 Subject: [PATCH 098/167] Silly templating bug --- templates/boltzmann/data/context.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index fd20c2dc..bc903c08 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -146,6 +146,7 @@ class Context { } return String(url) } + // {% endif %} /**{{- tsdoc(page="02-handlers.md", section="url") -}}*/ get url() { From a7a9e5f5f82bee62fb50756e4466c37a5fcdccbe Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Feb 2022 19:50:03 -0500 Subject: [PATCH 099/167] Test that traceExporter respects url --- templates/boltzmann/core/honeycomb.ts | 46 +++++++++++++++------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index ddb68cdf..5a7abcae 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -497,21 +497,21 @@ class Honeycomb { // try/catches and honeycomb can basically never throw. Even // so, it saves a little bit of boilerplate. public get writeKey (): string { - if (this.features.honeycomb && this.options.writeKey) { + if (this.options.writeKey) { return this.options.writeKey } throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!') } public get dataset () { - if (this.features.honeycomb && this.options.dataset) { + if (this.options.dataset) { return this.options.dataset } throw new HoneycombError('HONEYCOMB_DATASET is undefined!') } public get apiHost () { - if (this.features.honeycomb && this.options.apiHost) { + if (this.options.apiHost) { return this.options.apiHost } throw new HoneycombError('HONEYCOMB_API_HOST is undefined!') @@ -667,7 +667,7 @@ function createMockHoneycomb(): Honeycomb { otel: true, writeKey: 'SOME_WRITEKEY', dataset: 'SOME_DATASET', - apiHost: 'grpc://api-host.com', + apiHost: 'grpc://otel.website:9000', sampleRate: 1 }, { @@ -813,20 +813,12 @@ if (require.main === module) { }) }) test('factories', async (t: Test) => { - const options = { - enabled: true, - otel: true, - writeKey: 'some write key', - dataset: 'some dataset', - apiHost: 'grpc://example.com', - sampleRate: 1, - } - t.test('metadata', async (assert: Test) => { const metadata = defaultOtelFactories.metadata( 'some write key', 'some dataset' ) + assert.same( metadata.get('x-honeycomb-team'), ['some write key'], @@ -868,15 +860,14 @@ if (require.main === module) { }) test('traceExporter', async (assert: Test) => { - assert.doesNotThrow(() => { - const url = 'grpc://example.com' - const metadata = defaultOtelFactories.metadata( - 'some write key', - 'some dataset' - ) + const url = 'grpc://otel.website:9000' + const metadata = defaultOtelFactories.metadata( + 'some write key', + 'some dataset' + ) - defaultOtelFactories.traceExporter(url, metadata) - }, 'should create a trace exporter') + const exporter = defaultOtelFactories.traceExporter(url, metadata) + assert.equal(exporter.url, 'otel.website:9000') }) test('spanProcessor', async (assert: Test) => { @@ -918,6 +909,19 @@ if (require.main === module) { }, 'should create an sdk') }) }) + + test('init and start', async (assert: Test) => { + const honeycomb = createMockHoneycomb() + + honeycomb.init() + + assert.same(honeycomb.traceExporter?.url, 'otel.website:9000') + + assert.doesNotThrow(async () => { + await honeycomb.start() + await honeycomb.stop() + }) + }) } void `{% endif %}` From b8201882ac07e03c270b57d2eebe7dfcd1d5e804 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Feb 2022 20:21:23 -0500 Subject: [PATCH 100/167] Improved otel logging --- templates/boltzmann/core/honeycomb.ts | 41 +++++++++++++++++++++++++-- templates/boltzmann/middleware/log.ts | 16 +++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 5a7abcae..9eeec627 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -34,7 +34,8 @@ import beeline from 'honeycomb-beeline' import * as grpc from '@grpc/grpc-js' import * as otel from '@opentelemetry/api' import * as otelCore from '@opentelemetry/core' -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' +import { OTLPExporterConfigNode, OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http' import * as otelResources from '@opentelemetry/resources' import { NodeSDK as OtelSDK } from '@opentelemetry/sdk-node' import * as otelTraceBase from '@opentelemetry/sdk-trace-base' @@ -109,6 +110,42 @@ class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase } } +type HoneycombConfigNode = OTLPExporterConfigNode & { _honeycomb?: Honeycomb } + +class HoneycombTraceExporter extends OTLPTraceExporter { + private _honeycomb?: Honeycomb + + constructor(config: HoneycombConfigNode = {}) { + super(config) + this._honeycomb = config._honeycomb + } + + log(message: string | Error): void { + if (this._honeycomb) { + this._honeycomb.log(message) + } + } + + send( + objects: otelTraceBase.ReadableSpan[], + onSuccess: () => void, + onError: (error: otlpTypes.OTLPExporterError) => void + ): void { + this.log(`sending ${objects.length} spans to ${this.url}`) + super.send( + objects, + () => { + this.log(`successfully send ${objects.length} spans to ${this.url}`) + return onSuccess() + }, + (error: otlpTypes.OTLPExporterError) => { + this.log(`error while sending ${objects.length} spans: ${error}`) + return onError(error) + } + ) + } +} + // Arguments passed to Honeycomb's constructor interface HoneycombOptions { serviceName: string @@ -190,7 +227,7 @@ const defaultOtelFactories: OtelFactories = { // Export traces to an OTLP endpoint with GRPC traceExporter (url: string, metadata: grpc.Metadata): OTLPTraceExporter { - return new OTLPTraceExporter({ + return new HoneycombTraceExporter({ url, credentials: grpc.credentials.createSsl(), metadata diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 0f6dfc0a..5aa4a9d5 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -30,6 +30,22 @@ function log ({ + 'To use OpenTelemetry, set HONEYCOMB_API_HOST to a grpc:// endpoint.' ) } + + honeycomb.logger.debug(`serviceName: ${honeycomb.options.serviceName}`) + + for (let [key, value] of Object.entries(honeycomb.features)) { + honeycomb.logger.debug(`${key}: ${value}`) + } + + const hasWriteKey: boolean = Boolean( + honeycomb.options.writeKey && honeycomb.options.writeKey.length + ) + + honeycomb.logger.debug(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`) + honeycomb.logger.debug(`dataset: ${honeycomb.options.dataset}`) + honeycomb.logger.debug(`apiHost: ${honeycomb.options.apiHost}`) + honeycomb.logger.debug(`sampleRate: ${honeycomb.options.sampleRate}`) + void `{% endif %}` return function logMiddleware (next: Handler) { From 704ed28155a01a56f966e4ee9cce87fa3f825dfc Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Feb 2022 22:16:56 -0500 Subject: [PATCH 101/167] imports/exports match between honeycomb + prelude --- templates/boltzmann/core/honeycomb.ts | 2 -- templates/boltzmann/core/prelude.ts | 21 ++++++++++----------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 9eeec627..052ed2d5 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -24,7 +24,6 @@ Good luck! // Dependencies used downstream - it's worth your time to look at how these // are treated in prelude.ts! -import isDev from 'are-we-dev' import bole from '@entropic/bole' // We continue to support beelines... @@ -609,7 +608,6 @@ export { beeline, bole, grpc, - isDev, otel, otelCore, OTLPTraceExporter, diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 6b7ecc41..17fd0c50 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -28,8 +28,6 @@ function _getServiceName() { } } -import assert from 'assert' - /*{# /!\ ACHTUNG! /!\ @@ -47,11 +45,10 @@ HOWEVER, in cases where a honeycomb.ts dependency is also required by other code, it must *also* be imported in a self-test scenario only. #}*/ -void `{% if honeycomb %}` -void `{% if selftest %}` +void `{% if honeycomb %}`; +void `{% if selftest %}`; import { Honeycomb } from './honeycomb' -import isDev from 'are-we-dev' -void `{% endif %}` +void `{% endif %}`; if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -69,10 +66,6 @@ if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM } -if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { - process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET -} - let honeycomb: Honeycomb = Honeycomb.fromEnv(serviceName, process.env); void `{% if selftest %}`; import { createMockHoneycomb } from './honeycomb' @@ -96,8 +89,8 @@ import { seal, unseal, defaults as ironDefaults } from '@hapi/iron' import { Accepts } from 'accepts' import { RouteOptions, Handler as FMWHandler, HTTPVersion, HTTPMethod } from 'find-my-way' import Ajv from 'ajv' +import assert from 'assert' import * as cookie from 'cookie' -import type tap from 'tap' void `{% if redis %}`; import { WrappedNodeRedisClient } from 'handy-redis' void `{% endif %}`; @@ -136,9 +129,11 @@ void `{% endif %}`; import { Readable } from 'stream' import type { RequestOptions as ShotRequestOptions, Listener, ResponseObject } from '@hapi/shot' +import type tap from 'tap' import querystring from 'querystring' import { promisify } from 'util' +import isDev from 'are-we-dev' import fmw from 'find-my-way' import accepts from 'accepts' import { promises as fs } from 'fs' @@ -166,6 +161,8 @@ type HttpMetadata = ( { [TEMPLATE]: string } ) +void `{% if selftest %}` + void `{% if postgres %}`; export { pg, PGPool, PGPoolClient, PGClient } void `{% endif %}`; @@ -233,7 +230,9 @@ export { fs, accepts, fmw, + isDev, promisify, querystring, ships, } +void `{% endif %}` From b7ded9ac806e22868b8586a925a473162c4395bb Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 01:20:49 -0500 Subject: [PATCH 102/167] Mock the span in the test instead of as a fallback --- templates/boltzmann/core/middleware.ts | 26 +++++++---- templates/boltzmann/middleware/honeycomb.ts | 51 --------------------- 2 files changed, 18 insertions(+), 59 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index e213be9b..ac4d71e1 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -175,7 +175,24 @@ if (require.main === module) { handlers: { handler: throwingHandler } }) const [onRequest] = server.listeners('request') - const response = await inject(onRequest, { method: 'GET', url: '/' }) + + // HTTP instrumentation won't get triggered, so we need to mock the parent + // span + + let traceContext = otel.context.active() + const span = honeycomb.tracer.startSpan( + 'HTTP GET', + { kind: otel.SpanKind.SERVER, }, + traceContext + ) + + traceContext = otel.trace.setSpan(traceContext, span) + + const response = await otel.context.with(traceContext, async () => { + return await inject(onRequest, { method: 'GET', url: '/' }) + }) + + span.end() assert.same(response.payload, 'Hello!') @@ -224,14 +241,7 @@ if (require.main === module) { spanId: boltzmannSpans[1].spanId, parentSpanId: undefined, attributes: { - "http.host": "localhost", - "http.url": "http://localhost/", - "http.client_ip": "", - "http.method": "GET", - "http.scheme": "http:", - "http.route": "/", "boltzmann.http.query": "", - "http.status_code": "200", "service_name": "test-app", "boltzmann.honeycomb.trace_type": "otel" } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 8bfc1aa0..b5684568 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -206,35 +206,6 @@ function otelTrace () { // Typically, HTTP auto-instrumentation will create a parent span for us let span: otel.Span | undefined = otel.trace.getSpan(traceContext) - let createdSpan = false - - // In shot testing (and other scenarios that don't touch HTTP - // auto-instrumentation, we'll need to create one - if (!span) { - traceContext = otel.propagation.extract( - traceContext, - context.headers, - otel.defaultTextMapGetter - ) - - span = honeycomb.tracer.startSpan( - traceName(context.method, context.url.pathname), - { - attributes: { - [otelSemanticConventions.SemanticAttributes.HTTP_HOST]: context.host, - [otelSemanticConventions.SemanticAttributes.HTTP_URL]: context.url.href, - [otelSemanticConventions.SemanticAttributes.HTTP_CLIENT_IP]: context.remote, - [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: context.method, - [otelSemanticConventions.SemanticAttributes.HTTP_SCHEME]: context.url.protocol, - [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: context.url.pathname, - }, - kind: otel.SpanKind.SERVER, - }, - traceContext - ) - // We need to clean up this span later - put a pin in it - createdSpan = true - } // startSpan should always return a span, but as far as typescript is // concerned the span could still be undefined. We could assert that it @@ -263,23 +234,6 @@ function otelTrace () { return } - // If we don't have an automatic span, we need to fill in some basic - // response properties. - if (createdSpan) { - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_STATUS_CODE, - String(context._response.statusCode) - ) - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_ROUTE, - handler.route - ) - span.setAttribute( - otelSemanticConventions.SemanticAttributes.HTTP_METHOD, - handler.method - ) - } - span.setAttribute( otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, handler.version @@ -290,11 +244,6 @@ function otelTrace () { span.setAttribute(paramSpanAttribute(key), value) } }) - - // If we created the span, we also need to close it - if (createdSpan) { - span.end() - } }) return otel.context.with(traceContext, () => { From bed27e6eaf3f38d8ca0bfc87aa0826d76d53e589 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 12:17:18 -0500 Subject: [PATCH 103/167] Fix honeycomb export --- templates/boltzmann/core/prelude.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 17fd0c50..d19e5ee7 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -74,6 +74,8 @@ void `{% endif %}`; honeycomb.init() +export { honeycomb } + import onHeaders from 'on-headers' void `{% endif %}`; @@ -172,7 +174,7 @@ export { redis } void `{% endif %}`; void `{% if honeycomb %}`; -export { onHeaders, honeycomb } +export { onHeaders } void `{% endif %}`; void `{% if jwt or oauth %}`; From a7e1695e98c42e5745420b720075219e7c8c914a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 12:40:48 -0500 Subject: [PATCH 104/167] Honeycomb logging only generated in debug/dev build --- src/settings.rs | 13 +++++++++++ templates/boltzmann/core/honeycomb.ts | 25 ++++++++++++++------- templates/boltzmann/middleware/honeycomb.ts | 4 +--- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/settings.rs b/src/settings.rs index b4bfbbb0..7b317e11 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -103,6 +103,9 @@ pub struct Settings { #[serde(skip_serializing_if = "Option::is_none")] pub(crate) typescript: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub(crate) debug: Option, + #[serde(flatten)] pub(crate) rest: HashMap, } @@ -166,6 +169,12 @@ impl Settings { typescript: if is_typescript { Some(true) } else { None }, version: Some(version), + #[cfg(debug_assertions)] + debug: Some(true), + + #[cfg(not(debug_assertions))] + debug: Some(false), + selftest: if flags.selftest { Some(true) } else { None }, rest: HashMap::new(), } @@ -216,6 +225,9 @@ impl Settings { if self.typescript.unwrap_or(false) { features.push("typescript"); } + if self.debug.unwrap_or(false) { + features.push("debug"); + } // In case we have some bad people who don't alphabetize the above. features.sort_unstable(); @@ -252,6 +264,7 @@ impl From for Context { ctxt.insert("status", &settings.status.unwrap_or(false)); ctxt.insert("templates", &settings.templates.unwrap_or(false)); ctxt.insert("typescript", &settings.typescript.unwrap_or(false)); + ctxt.insert("debug", &settings.debug.unwrap_or(false)); ctxt.insert("selftest", &settings.selftest.unwrap_or(false)); ctxt.insert( "version", diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 052ed2d5..c28ba431 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -556,6 +556,7 @@ class Honeycomb { // We *do* have a handful of logging use cases... public static log(message: string | Error): void { + void `{% if debug %}`; // Honeycomb starts up very early in the process's lifetime and // can't count on bole being configured. In those cases, we fall // back to console.log and JSON.stringify. Only use this if you @@ -565,11 +566,9 @@ class Honeycomb { // as possible while still being stdout-debuggable. We also mute them // during unit tests. let isDebug = !process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug' - void `{% if selftest %}` isDebug = false void `{% endif %}` - if (isDebug) { const line: any = { time: (new Date()).toISOString(), @@ -589,18 +588,28 @@ class Honeycomb { console.log(JSON.stringify(line)) } + void `{% endif %}` } public log(message: string | Error): void { + void `{% if debug %}`; + let enabled: boolean = true + + void `{% if selftest %}` + enabled = false + void `{% endif %}` // The logger middleware creates a logger on the honeycomb object. If it's // in place, we'll gladly use it. - if (this.logger) { - this.logger.debug(message) - return - } + if (enabled) { + if (this.logger) { + this.logger.debug(message) + return + } - // Otherwise, fall back to console.log + JSON.stringify - Honeycomb.log(message) + // Otherwise, fall back to console.log + JSON.stringify + Honeycomb.log(message) + } + void `{% endif %}`; } } diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index b5684568..d775a038 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -8,7 +8,6 @@ import { Handler } from '../core/middleware' import { Context } from '../data/context' import onHeaders from 'on-headers' import isDev from 'are-we-dev' -import bole from '@entropic/bole' void `{% endif %}`; function traceName(method: string, pathname: string) { @@ -199,7 +198,6 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { * ▔▏┗┻┛┃┃┗┻┛▕▔ */ function otelTrace () { - const logger = bole('boltzmann:honeycomb:trace') return function honeycombTrace (next: Handler) { return (context: Context) => { let traceContext = otel.context.active() @@ -219,7 +217,7 @@ function otelTrace () { context._honeycombTrace = span } } else { - logger.debug(new assert.AssertionError({ + honeycomb.log(new assert.AssertionError({ message: 'no parent span found or created', actual: span, expected: true, From c2f7c34fd7486ac4e22a9302695ff1325e0c3122 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 12:59:28 -0500 Subject: [PATCH 105/167] Honeycomb logging fixes --- templates/boltzmann/core/honeycomb.ts | 15 ++++++++------- templates/boltzmann/middleware/log.ts | 13 ++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index c28ba431..e01c3889 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -109,14 +109,14 @@ class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase } } -type HoneycombConfigNode = OTLPExporterConfigNode & { _honeycomb?: Honeycomb } +type HoneycombConfigNode = OTLPExporterConfigNode & { honeycomb?: Honeycomb } class HoneycombTraceExporter extends OTLPTraceExporter { private _honeycomb?: Honeycomb constructor(config: HoneycombConfigNode = {}) { super(config) - this._honeycomb = config._honeycomb + this._honeycomb = config.honeycomb } log(message: string | Error): void { @@ -187,7 +187,7 @@ interface OtelFactories { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter + traceExporter: (url: string, metadata: grpc.Metadata, honeycomb?: Honeycomb) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] sdk: ( @@ -225,11 +225,12 @@ const defaultOtelFactories: OtelFactories = { }, // Export traces to an OTLP endpoint with GRPC - traceExporter (url: string, metadata: grpc.Metadata): OTLPTraceExporter { + traceExporter (url: string, metadata: grpc.Metadata, honeycomb?: Honeycomb): OTLPTraceExporter { return new HoneycombTraceExporter({ url, credentials: grpc.credentials.createSsl(), - metadata + metadata, + honeycomb }) }, @@ -315,7 +316,7 @@ interface OtelFactoryOverrides { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter?: (url: string, metadata: grpc.Metadata) => OTLPTraceExporter + traceExporter?: (url: string, metadata: grpc.Metadata, honeycomb?: Honeycomb) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations?: () => OtelInstrumentation[]; sdk?: ( @@ -456,7 +457,7 @@ class Honeycomb { const resource: otelResources.Resource = f.resource(serviceName) const sampler: otel.Sampler = f.sampler(sampleRate) - const exporter = f.traceExporter(apiHost, metadata) + const exporter = f.traceExporter(apiHost, metadata, this) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 5aa4a9d5..1f6dfb46 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -31,21 +31,20 @@ function log ({ ) } - honeycomb.logger.debug(`serviceName: ${honeycomb.options.serviceName}`) + honeycomb.log(`serviceName: ${honeycomb.options.serviceName}`) for (let [key, value] of Object.entries(honeycomb.features)) { - honeycomb.logger.debug(`${key}: ${value}`) + honeycomb.log(`${key}: ${value}`) } const hasWriteKey: boolean = Boolean( honeycomb.options.writeKey && honeycomb.options.writeKey.length ) - honeycomb.logger.debug(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`) - honeycomb.logger.debug(`dataset: ${honeycomb.options.dataset}`) - honeycomb.logger.debug(`apiHost: ${honeycomb.options.apiHost}`) - honeycomb.logger.debug(`sampleRate: ${honeycomb.options.sampleRate}`) - + honeycomb.log(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`) + honeycomb.log(`dataset: ${honeycomb.options.dataset}`) + honeycomb.log(`apiHost: ${honeycomb.options.apiHost}`) + honeycomb.log(`sampleRate: ${honeycomb.options.sampleRate}`) void `{% endif %}` return function logMiddleware (next: Handler) { From 07ffbbd2abd024774934497316e78f6c77d39376 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 14:00:41 -0500 Subject: [PATCH 106/167] Update documentation for OpenTelemetry support --- docs/content/reference/02-handlers.md | 11 ++--------- docs/content/reference/03-middleware.md | 7 ++++--- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/docs/content/reference/02-handlers.md b/docs/content/reference/02-handlers.md index 63dcb3b7..ea83e397 100644 --- a/docs/content/reference/02-handlers.md +++ b/docs/content/reference/02-handlers.md @@ -398,8 +398,9 @@ async function host(context) { A unique string identifier for the request for tracing purposes. The value is drawn from: -1. `x-honeycomb-trace` +1. `x-honeycomb-trace` (via Honeycomb beeline tracing) 2. `x-request-id` +3. `traceparent` (via Honeycomb OpenTelemetry tracing) 3. A generated [ship name from Iain M Bank's Culture series][culture] (e.g.: `"ROU Frank Exchange Of Views"`) **Example use:** @@ -595,14 +596,6 @@ async function logout(context) { } ``` -### `span` - -{{ changelog(version = "0.6.0") }} - -**Requires the [`--honeycomb`] feature.** - -If using OpenTelemetry for tracing, the current OpenTelemetry span. - ### `traceURL` {{ changelog(version = "0.1.4") }} diff --git a/docs/content/reference/03-middleware.md b/docs/content/reference/03-middleware.md index 795be742..83a62294 100644 --- a/docs/content/reference/03-middleware.md +++ b/docs/content/reference/03-middleware.md @@ -744,9 +744,9 @@ Here is an example of the request logging: ``` The `id` fields in logs is the value of the request-id, available on the context object as the `id` -field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace` -and `x-request-id` before falling back to generating a request id using a short randomly-selected -string. +field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace`, +`x-request-id` and `traceparent` before falling back to generating a request id using a short +randomly-selected string. To log from your handlers, you might write code like this: @@ -779,6 +779,7 @@ deep observability of the performance of your handlers. To configure this middleware, set the following environment variables: +- `HONEYCOMB_API_HOST`: the honeycomb API endpoint to use; `https://` URLs use [beeline](https://www.npmjs.com/package/honeycomb-beeline) and `grpc://` URLs use [OpenTelemetry](https://opentelemetry.io/docs/instrumentation/js/getting-started/nodejs/) - `HONEYCOMB_WRITEKEY`: the honeycomb API key to use; required to enable tracing - `HONEYCOMB_DATASET`: the name of the dataset to send trace data to; required to enable tracing - `HONEYCOMB_TEAM`: optional; set this to enable links to traces from error reporting From 9547ae2f0ee7daedda4c0024aff0fb4f6dc09f41 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 14:08:17 -0500 Subject: [PATCH 107/167] Update examples to use current release build --- examples/attaching-middleware/boltzmann.js | 131 +- .../attaching-middleware/package-lock.json | 692 ++++-- examples/attaching-middleware/package.json | 34 +- examples/custom-middleware/boltzmann.js | 122 +- examples/custom-middleware/package-lock.json | 739 +++--- examples/custom-middleware/package.json | 27 +- examples/sessions/boltzmann.js | 831 ++++++- examples/sessions/package-lock.json | 2152 ++++++++++++---- examples/sessions/package.json | 61 +- examples/typed/boltzmann.ts | 91 +- examples/typed/package-lock.json | 611 +++-- examples/typed/package.json | 33 +- examples/typed/types/honeycomb-beeline.d.ts | 20 + examples/website/boltzmann.js | 658 ++++- examples/website/package-lock.json | 2177 +++++++++++++++-- examples/website/package.json | 34 +- 16 files changed, 6609 insertions(+), 1804 deletions(-) create mode 100644 examples/typed/types/honeycomb-beeline.d.ts diff --git a/examples/attaching-middleware/boltzmann.js b/examples/attaching-middleware/boltzmann.js index 1eed09b6..ee4adece 100755 --- a/examples/attaching-middleware/boltzmann.js +++ b/examples/attaching-middleware/boltzmann.js @@ -2,7 +2,15 @@ /* eslint-disable */ /* c8 ignore file */ 'use strict'; -// Boltzmann v0.5.3 +/**/ +// Dependencies used outside of honeycomb +const bole = require("@entropic/bole"); +const isDev = require("are-we-dev"); +module.exports = {...module.exports, bole, isDev }; +void ``; + +'use strict'; +// Boltzmann v0.6.0 /**/ const serviceName = _getServiceName(); function _getServiceName() { @@ -13,6 +21,7 @@ function _getServiceName() { return 'boltzmann'; } } +/**/ void ``; const ships = require("culture-ships"); void ``; @@ -37,13 +46,11 @@ void ``; const { Readable } = require("stream"); const querystring = require("querystring"); const { promisify } = require("util"); -const isDev = require("are-we-dev"); const fmw = require("find-my-way"); const accepts = require("accepts"); const { promises: fs } = require("fs"); const crypto = require("crypto"); const http = require("http"); -const bole = require("@entropic/bole"); const path = require("path"); const os = require("os"); void ``; @@ -111,12 +118,16 @@ async function buildMiddleware(middleware, router) { return rhs(await lhs); }, Promise.resolve(router)); } +function handlerSpanName(handler) { + return `handler: ${handler.name || ''}`; +} async function handler(context) { const handler = context.handler; // - return await handler(context); - // + return await handler(context); + // } +void ``; void ``; async function routes(handlers) { @@ -175,6 +186,7 @@ class Context { this.params = {}; this.id = String(request.headers['x-honeycomb-trace'] || request.headers['x-request-id'] || + request.headers['traceparent'] || uuid.v4()); this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app'); @@ -998,18 +1010,28 @@ function handleCORS({ origins = isDev() ? '*' : String(process.env.CORS_ALLOW_OR const includesStar = originsArray.includes('*'); return (next) => { return async function cors(context) { - const reflectedOrigin = (includesStar - ? '*' - : (originsArray.includes(String(context.headers.origin)) - ? context.headers.origin - : false)); + const spanAttributes = { + 'boltzmann.http.origin': String(context.headers.origin) + }; + if (honeycomb.features.beeline) { + beeline.addContext(spanAttributes); + } + const span = otel.trace.getSpan(otel.context.active()); + if (span) { + span.setAttributes(spanAttributes); + } + if (!includesStar && !originsArray.includes(String(context.headers.origin))) { + throw Object.assign(new Error('Origin not allowed'), { + [Symbol.for('status')]: 400 + }); + } const response = (context.method === 'OPTIONS' ? Object.assign(Buffer.from(''), { [Symbol.for('status')]: 204, }) : await next(context)); response[Symbol.for('headers')] = { - ...(reflectedOrigin ? { 'Access-Control-Allow-Origin': reflectedOrigin } : {}), + 'Access-Control-Allow-Origin': includesStar ? '*' : context.headers.origin, 'Access-Control-Allow-Methods': [].concat(methods).join(','), 'Access-Control-Allow-Headers': [].concat(headers).join(',') }; @@ -1075,13 +1097,16 @@ function enforceInvariants() { void ``; -function log({ logger = bole(process.env.SERVICE_NAME || 'boltzmann'), level = process.env.LOG_LEVEL || 'debug', stream = process.stdout } = {}) { +function log({ logger = bole(serviceName), +// +level = process.env.LOG_LEVEL || 'debug', stream = process.stdout, } = {}) { if (isDev()) { const pretty = require('bistre')({ time: true }); pretty.pipe(stream); stream = pretty; } bole.output({ level, stream }); + void ``; return function logMiddleware(next) { return async function inner(context) { const result = await next(context); @@ -1109,6 +1134,7 @@ void ``; void ``; +handlePing.doNotTrace = true; function handlePing() { return (next) => (context) => { if (context.url.pathname === '/monitor/ping') { @@ -1465,7 +1491,7 @@ const validate = { * * The `validate.body` middleware applies [JSON schema]( "https://json-schema.org/") validation to incoming * request bodies. It intercepts the body that would be returned by - * \[`context.body`\] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is + * \[`context.body`] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is * passed through. * * `Ajv` is configured with `{useDefaults: true, allErrors: true}` by default. In @@ -1744,9 +1770,9 @@ const middleware = { * ```` * * The `id` fields in logs is the value of the request-id, available on the context object as the `id` - * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace` - * and `x-request-id` before falling back to generating a request id using a short randomly-selected - * string. + * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace`, + * `x-request-id` and `traceparent` before falling back to generating a request id using a short + * randomly-selected string. * * To log from your handlers, you might write code like this: * @@ -1950,44 +1976,43 @@ module.exports = {...module.exports, Context, main: runserver, middleware, body void ``; /* c8 ignore next */ if (require.main === module && !process.env.TAP) { - function passthrough() { - return (next) => (context) => next(context); - } - runserver({ - middleware: _requireOr('./middleware', []) - .then(_processMiddleware) - .then((mw) => { - // - // - const acc = []; - // - // - acc.push(handlePing); - // - // - acc.push(log); - // - // - acc.push(...mw); - // - acc.push(handleStatus); - // - return acc.filter(Boolean); - }), - }) - .then((server) => { - server.listen(Number(process.env.PORT) || 5000, () => { - const addrinfo = server.address(); - if (!addrinfo) { - return; - } - bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + // + runserver({ + middleware: _requireOr('./middleware', []) + .then(_processMiddleware) + .then((mw) => { + // + // + const acc = []; + // + acc.push(handlePing); + // + // + // + acc.push(log); + // + // + acc.push(...mw); + // + acc.push(handleStatus); + // + return acc.filter(Boolean); + }), + }) + .then((server) => { + server.listen(Number(process.env.PORT) || 8000, () => { + const addrinfo = server.address(); + if (!addrinfo) { + return; + } + bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + }); + }) + .catch((err) => { + console.error(err.stack); + process.exit(1); }); - }) - .catch((err) => { - console.error(err.stack); - process.exit(1); - }); + // } diff --git a/examples/attaching-middleware/package-lock.json b/examples/attaching-middleware/package-lock.json index 7f5d4e67..de93b4a5 100644 --- a/examples/attaching-middleware/package-lock.json +++ b/examples/attaching-middleware/package-lock.json @@ -27,8 +27,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -773,12 +773,12 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -786,21 +786,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -847,9 +847,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "node_modules/@types/uuid": { @@ -859,30 +859,31 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz", - "integrity": "sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.22.0", - "@typescript-eslint/scope-manager": "4.22.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -890,50 +891,35 @@ } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz", - "integrity": "sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.22.0", - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/typescript-estree": "4.22.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", - "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.22.0", - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/typescript-estree": "4.22.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -942,29 +928,55 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", - "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/types": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", - "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -972,21 +984,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", - "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -998,17 +1010,68 @@ } } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", - "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", + "node_modules/@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.22.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1016,12 +1079,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/abbrev": { @@ -2001,13 +2064,20 @@ } }, "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decamelize": { @@ -2299,12 +2369,12 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { @@ -2498,17 +2568,26 @@ } }, "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -2565,20 +2644,19 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -2599,9 +2677,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2908,9 +2986,9 @@ } }, "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" @@ -2947,16 +3025,16 @@ } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -2967,9 +3045,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -3253,9 +3331,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -3747,6 +3825,18 @@ "node": ">=0.10.0" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -3793,18 +3883,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", @@ -4485,9 +4563,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -4743,9 +4821,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" @@ -4947,10 +5025,13 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -7524,6 +7605,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -8768,28 +8863,28 @@ "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -8827,9 +8922,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/uuid": { @@ -8839,92 +8934,129 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz", - "integrity": "sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.22.0", - "@typescript-eslint/scope-manager": "4.22.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } } }, - "@typescript-eslint/experimental-utils": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz", - "integrity": "sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==", + "@typescript-eslint/parser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.22.0", - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/typescript-estree": "4.22.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" } }, - "@typescript-eslint/parser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", - "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", + "@typescript-eslint/scope-manager": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.22.0", - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/typescript-estree": "4.22.0", - "debug": "^4.1.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" } }, - "@typescript-eslint/scope-manager": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", - "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", + "@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0" + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", - "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", - "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", - "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.22.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -9679,12 +9811,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -9997,12 +10129,12 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -10056,12 +10188,20 @@ } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { @@ -10111,17 +10251,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -10142,9 +10281,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -10371,9 +10510,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -10398,23 +10537,23 @@ } }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "dependencies": { "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true } } @@ -10632,9 +10771,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -11016,6 +11155,15 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -11047,14 +11195,6 @@ "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" - }, - "dependencies": { - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - } } }, "mime-db": { @@ -11575,9 +11715,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pkg-dir": { @@ -11760,9 +11900,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -11910,10 +12050,13 @@ "dev": true }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "semver-diff": { "version": "3.1.1", @@ -13677,6 +13820,13 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", diff --git a/examples/attaching-middleware/package.json b/examples/attaching-middleware/package.json index 064ca7b8..342b7962 100644 --- a/examples/attaching-middleware/package.json +++ b/examples/attaching-middleware/package.json @@ -1,14 +1,14 @@ { - "name": "attaching-middleware", - "description": "", - "version": "1.0.0", "author": "Chris Dickinson (http://neversaw.us/)", - "boltzmann": { - "version": "0.5.3", - "githubci": false, - "ping": true, - "status": true + "description": "", + "directories": { + "test": "tests" }, + "keywords": [], + "license": "MIT", + "main": "index.js", + "name": "attaching-middleware", + "version": "1.0.0", "dependencies": { "@entropic/bole": "^4.0.1", "@hapi/iron": "^6.0.0", @@ -28,8 +28,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -43,17 +43,19 @@ "supports-hyperlinks": "^2.1.0", "tap": "^15.1.5" }, - "keywords": [], - "license": "MIT", - "main": "index.js", "scripts": { "boltzmann:docs": "npx boltzmann-cli --docs", - "boltzmann:esbuild": null, "boltzmann:routes": "node -e 'require(\"./boltzmann\").printRoutes()'", "boltzmann:upgrade": "npx boltzmann-cli", "lint": "eslint .", "posttest": "npm run lint", - "start": "./boltzmann.js", + "start": "nodemon ./boltzmann.js", "test": "c8 tap --no-cov tests" + }, + "boltzmann": { + "version": "0.6.0", + "githubci": false, + "ping": true, + "status": true } -} +} \ No newline at end of file diff --git a/examples/custom-middleware/boltzmann.js b/examples/custom-middleware/boltzmann.js index 84c0a973..ffa42c80 100755 --- a/examples/custom-middleware/boltzmann.js +++ b/examples/custom-middleware/boltzmann.js @@ -2,7 +2,15 @@ /* eslint-disable */ /* c8 ignore file */ 'use strict'; -// Boltzmann v0.5.3 +/**/ +// Dependencies used outside of honeycomb +const bole = require("@entropic/bole"); +const isDev = require("are-we-dev"); +module.exports = {...module.exports, bole, isDev }; +void ``; + +'use strict'; +// Boltzmann v0.6.0 /**/ const serviceName = _getServiceName(); function _getServiceName() { @@ -13,6 +21,7 @@ function _getServiceName() { return 'boltzmann'; } } +/**/ void ``; const ships = require("culture-ships"); void ``; @@ -35,13 +44,11 @@ void ``; const { Readable } = require("stream"); const querystring = require("querystring"); const { promisify } = require("util"); -const isDev = require("are-we-dev"); const fmw = require("find-my-way"); const accepts = require("accepts"); const { promises: fs } = require("fs"); const crypto = require("crypto"); const http = require("http"); -const bole = require("@entropic/bole"); const path = require("path"); const os = require("os"); void ``; @@ -109,12 +116,16 @@ async function buildMiddleware(middleware, router) { return rhs(await lhs); }, Promise.resolve(router)); } +function handlerSpanName(handler) { + return `handler: ${handler.name || ''}`; +} async function handler(context) { const handler = context.handler; // - return await handler(context); - // + return await handler(context); + // } +void ``; void ``; async function routes(handlers) { @@ -173,6 +184,7 @@ class Context { this.params = {}; this.id = String(request.headers['x-honeycomb-trace'] || request.headers['x-request-id'] || + request.headers['traceparent'] || uuid.v4()); this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app'); @@ -996,18 +1008,28 @@ function handleCORS({ origins = isDev() ? '*' : String(process.env.CORS_ALLOW_OR const includesStar = originsArray.includes('*'); return (next) => { return async function cors(context) { - const reflectedOrigin = (includesStar - ? '*' - : (originsArray.includes(String(context.headers.origin)) - ? context.headers.origin - : false)); + const spanAttributes = { + 'boltzmann.http.origin': String(context.headers.origin) + }; + if (honeycomb.features.beeline) { + beeline.addContext(spanAttributes); + } + const span = otel.trace.getSpan(otel.context.active()); + if (span) { + span.setAttributes(spanAttributes); + } + if (!includesStar && !originsArray.includes(String(context.headers.origin))) { + throw Object.assign(new Error('Origin not allowed'), { + [Symbol.for('status')]: 400 + }); + } const response = (context.method === 'OPTIONS' ? Object.assign(Buffer.from(''), { [Symbol.for('status')]: 204, }) : await next(context)); response[Symbol.for('headers')] = { - ...(reflectedOrigin ? { 'Access-Control-Allow-Origin': reflectedOrigin } : {}), + 'Access-Control-Allow-Origin': includesStar ? '*' : context.headers.origin, 'Access-Control-Allow-Methods': [].concat(methods).join(','), 'Access-Control-Allow-Headers': [].concat(headers).join(',') }; @@ -1073,13 +1095,16 @@ function enforceInvariants() { void ``; -function log({ logger = bole(process.env.SERVICE_NAME || 'boltzmann'), level = process.env.LOG_LEVEL || 'debug', stream = process.stdout } = {}) { +function log({ logger = bole(serviceName), +// +level = process.env.LOG_LEVEL || 'debug', stream = process.stdout, } = {}) { if (isDev()) { const pretty = require('bistre')({ time: true }); pretty.pipe(stream); stream = pretty; } bole.output({ level, stream }); + void ``; return function logMiddleware(next) { return async function inner(context) { const result = await next(context); @@ -1398,7 +1423,7 @@ const validate = { * * The `validate.body` middleware applies [JSON schema]( "https://json-schema.org/") validation to incoming * request bodies. It intercepts the body that would be returned by - * \[`context.body`\] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is + * \[`context.body`] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is * passed through. * * `Ajv` is configured with `{useDefaults: true, allErrors: true}` by default. In @@ -1677,9 +1702,9 @@ const middleware = { * ```` * * The `id` fields in logs is the value of the request-id, available on the context object as the `id` - * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace` - * and `x-request-id` before falling back to generating a request id using a short randomly-selected - * string. + * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace`, + * `x-request-id` and `traceparent` before falling back to generating a request id using a short + * randomly-selected string. * * To log from your handlers, you might write code like this: * @@ -1883,40 +1908,39 @@ module.exports = {...module.exports, Context, main: runserver, middleware, body void ``; /* c8 ignore next */ if (require.main === module && !process.env.TAP) { - function passthrough() { - return (next) => (context) => next(context); - } - runserver({ - middleware: _requireOr('./middleware', []) - .then(_processMiddleware) - .then((mw) => { - // - // - const acc = []; - // - // - // - acc.push(log); - // - // - acc.push(...mw); - // - return acc.filter(Boolean); - }), - }) - .then((server) => { - server.listen(Number(process.env.PORT) || 5000, () => { - const addrinfo = server.address(); - if (!addrinfo) { - return; - } - bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + // + runserver({ + middleware: _requireOr('./middleware', []) + .then(_processMiddleware) + .then((mw) => { + // + // + const acc = []; + // + // + // + acc.push(log); + // + // + acc.push(...mw); + // + return acc.filter(Boolean); + }), + }) + .then((server) => { + server.listen(Number(process.env.PORT) || 8000, () => { + const addrinfo = server.address(); + if (!addrinfo) { + return; + } + bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + }); + }) + .catch((err) => { + console.error(err.stack); + process.exit(1); }); - }) - .catch((err) => { - console.error(err.stack); - process.exit(1); - }); + // } diff --git a/examples/custom-middleware/package-lock.json b/examples/custom-middleware/package-lock.json index 7068db5e..bb026ded 100644 --- a/examples/custom-middleware/package-lock.json +++ b/examples/custom-middleware/package-lock.json @@ -28,8 +28,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "babel-eslint": "^10.1.0", "bistre": "^1.0.1", @@ -1092,12 +1092,12 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -1105,21 +1105,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -1166,9 +1166,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "node_modules/@types/uuid": { @@ -1178,30 +1178,31 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz", - "integrity": "sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.13.0", - "@typescript-eslint/scope-manager": "4.13.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1209,22 +1210,19 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 4" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -1236,71 +1234,69 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz", - "integrity": "sha512-/ZsuWmqagOzNkx30VWYV3MNB/Re/CGv/7EzlqZo5RegBN8tMuPaBgNK6vPBCQA8tcYrbsrTdbx3ixMRRKEEGVw==", + "node_modules/@typescript-eslint/parser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.13.0.tgz", - "integrity": "sha512-KO0J5SRF08pMXzq9+abyHnaGQgUJZ3Z3ax+pmqz9vl81JxmTTOUfQmq7/4awVfq09b6C4owNlOgOwp61pYRBSg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "debug": "^4.1.1" + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "*" }, "peerDependenciesMeta": { "typescript": { @@ -1308,30 +1304,13 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz", - "integrity": "sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.13.0.tgz", - "integrity": "sha512-/+aPaq163oX+ObOG00M0t9tKkOgdv9lq0IQv/y4SqGkAXmhFmCfgsELV7kOCTb2vVU5VOmVwXBXJTDr353C1rQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1339,22 +1318,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz", - "integrity": "sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1366,50 +1344,83 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "node_modules/@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz", - "integrity": "sha512-6RoxWK05PAibukE7jElqAtNMq+RWZyqJ6Q/GdIxaiUj2Ept8jh8+FUVlbq9WxMYxkmEOPvCE5cRSyupMpwW31g==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.13.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1417,12 +1428,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/abbrev": { @@ -2664,13 +2675,20 @@ } }, "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/debug-log": { @@ -3160,18 +3178,6 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-es/node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/eslint-plugin-import": { "version": "2.18.2", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", @@ -3735,20 +3741,19 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -3769,9 +3774,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "node_modules/fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4271,9 +4276,9 @@ } }, "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" @@ -4307,16 +4312,16 @@ } }, "node_modules/globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -4327,9 +4332,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -4826,9 +4831,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -5457,6 +5462,18 @@ "node": ">=0.10.0" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5482,16 +5499,16 @@ } }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "dependencies": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/mime-db": { @@ -6343,9 +6360,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -6726,9 +6743,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" @@ -9796,9 +9813,9 @@ "dev": true }, "node_modules/tsutils": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", - "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" @@ -9858,6 +9875,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -11450,28 +11481,28 @@ "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -11509,9 +11540,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/uuid": { @@ -11521,156 +11552,149 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz", - "integrity": "sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.13.0", - "@typescript-eslint/scope-manager": "4.13.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "@typescript-eslint/experimental-utils": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz", - "integrity": "sha512-/ZsuWmqagOzNkx30VWYV3MNB/Re/CGv/7EzlqZo5RegBN8tMuPaBgNK6vPBCQA8tcYrbsrTdbx3ixMRRKEEGVw==", + "@typescript-eslint/parser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - } + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" } }, - "@typescript-eslint/parser": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.13.0.tgz", - "integrity": "sha512-KO0J5SRF08pMXzq9+abyHnaGQgUJZ3Z3ax+pmqz9vl81JxmTTOUfQmq7/4awVfq09b6C4owNlOgOwp61pYRBSg==", + "@typescript-eslint/scope-manager": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "debug": "^4.1.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" } }, - "@typescript-eslint/scope-manager": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz", - "integrity": "sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ==", + "@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0" + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.13.0.tgz", - "integrity": "sha512-/+aPaq163oX+ObOG00M0t9tKkOgdv9lq0IQv/y4SqGkAXmhFmCfgsELV7kOCTb2vVU5VOmVwXBXJTDr353C1rQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz", - "integrity": "sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "yallist": "^4.0.0" + "lru-cache": "^6.0.0" } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + } + } + }, + "@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "eslint-visitor-keys": "^2.0.0" } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true } } }, "@typescript-eslint/visitor-keys": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz", - "integrity": "sha512-6RoxWK05PAibukE7jElqAtNMq+RWZyqJ6Q/GdIxaiUj2Ept8jh8+FUVlbq9WxMYxkmEOPvCE5cRSyupMpwW31g==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -12617,12 +12641,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "debug-log": { @@ -13173,14 +13197,6 @@ "requires": { "eslint-utils": "^1.4.2", "regexpp": "^3.0.0" - }, - "dependencies": { - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - } } }, "eslint-plugin-import": { @@ -13449,17 +13465,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -13480,9 +13495,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -13862,9 +13877,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -13886,23 +13901,23 @@ "dev": true }, "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "dependencies": { "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true } } @@ -14279,9 +14294,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -14759,6 +14774,15 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -14775,13 +14799,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mime-db": { @@ -15433,9 +15457,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -15726,9 +15750,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -17876,9 +17900,9 @@ "dev": true }, "tsutils": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", - "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -17923,6 +17947,13 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", diff --git a/examples/custom-middleware/package.json b/examples/custom-middleware/package.json index ce753269..de0dc6b4 100644 --- a/examples/custom-middleware/package.json +++ b/examples/custom-middleware/package.json @@ -1,12 +1,14 @@ { - "name": "custom-middleware", - "description": "", - "version": "1.0.0", "author": "Chris Dickinson (http://neversaw.us/)", - "boltzmann": { - "version": "0.5.3", - "githubci": false + "description": "", + "directories": { + "test": "tests" }, + "keywords": [], + "license": "MIT", + "main": "index.js", + "name": "custom-middleware", + "version": "1.0.0", "dependencies": { "@entropic/bole": "^4.0.1", "@hapi/iron": "^6.0.0", @@ -27,8 +29,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "babel-eslint": "^10.1.0", "bistre": "^1.0.1", @@ -44,9 +46,6 @@ "supports-hyperlinks": "^2.1.0", "tap": "^15.1.5" }, - "keywords": [], - "license": "MIT", - "main": "index.js", "scripts": { "boltzmann:docs": "npx boltzmann-cli --docs", "boltzmann:routes": "node -e 'require(\"./boltzmann\").printRoutes()'", @@ -55,5 +54,9 @@ "posttest": "npm run lint", "start": "nodemon ./boltzmann.js", "test": "c8 tap --no-cov tests" + }, + "boltzmann": { + "version": "0.6.0", + "githubci": false } -} +} \ No newline at end of file diff --git a/examples/sessions/boltzmann.js b/examples/sessions/boltzmann.js index fcb05d1d..806e575b 100755 --- a/examples/sessions/boltzmann.js +++ b/examples/sessions/boltzmann.js @@ -2,19 +2,479 @@ /* eslint-disable */ /* c8 ignore file */ 'use strict'; -// Boltzmann v0.5.3 /**/ -const serviceName = _getServiceName(); -function _getServiceName() { - try { - return process.env.SERVICE_NAME || require('./package.json').name.split('/').pop(); +// Dependencies used outside of honeycomb +const bole = require("@entropic/bole"); +const isDev = require("are-we-dev"); +module.exports = {...module.exports, bole, isDev }; +void ``; +// We continue to support beelines... +const beeline = require("honeycomb-beeline"); +// ...but are migrating to OpenTelemetry: +const grpc = require("@grpc/grpc-js"); +const otel = require("@opentelemetry/api"); +const otelCore = require("@opentelemetry/core"); +const otlpHttp = require("@opentelemetry/exporter-trace-otlp-http"); +const otlpProto = require("@opentelemetry/exporter-trace-otlp-proto"); +const otlpGrpc = require("@opentelemetry/exporter-trace-otlp-grpc"); +const otelResources = require("@opentelemetry/resources"); +const { NodeSDK: OtelSDK } = require("@opentelemetry/sdk-node"); +const otelTraceBase = require("@opentelemetry/sdk-trace-base"); +const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); +const otelSemanticConventions = require("@opentelemetry/semantic-conventions"); +const { DnsInstrumentation: OtelDnsInstrumentation } = require("@opentelemetry/instrumentation-dns"); +const { HttpInstrumentation: OtelHttpInstrumentation } = require("@opentelemetry/instrumentation-http"); +void ``; +const { RedisInstrumentation: OtelRedisInstrumentation } = require("@opentelemetry/instrumentation-redis"); +void ``; +void ``; +class HoneycombError extends Error { +} +// A diagnostic logger for OpenTelemetry. To log at a sensible level, +// call otel.diag.verbose. +class HoneycombDiagLogger { + // Ideally we would log to a bole logger. However, logger setup happens + // relatively late - in the log middleware - and it's very likely that such + // a log won't be in-place when we stand up the middleware stack! Therefore, + // we do log to bole if it's set in the middleware but will fall back to + // good ol' fashioned JSON.stringify if need be. + constructor() { + this._stream = process.stdout; + // So log messages roughly match what's output by the bole in dev mode :^) + if (isDev()) { + const pretty = require('bistre')({ time: true }); + this._stream = pretty.pipe(this._stream); + } } - catch { - return 'boltzmann'; + // OpenTelemetry's diagnostic logger has one more log level than bole - ie, + // verbose. + // + // For more details on how to treat each log level, see: + // https://github.com/open-telemetry/opentelemetry-js-api/blob/main/src/diag/consoleLogger.ts#L60 + // Log errors that caused an unexpected failure + error(message, ...args) { + this._log('error', message, args); + } + // Log warnings that aren't show-stopping but should REALLY be looked at + warn(message, ...args) { + this._log('warn', message, args); + } + // Log info if you want to be REALLY LOUD for some reason - you probably + // don't want to use this! + info(message, ...args) { + this._log('info', message, args); + } + // Log details that could be useful for identifying what went wrong, but + // aren't the thing that went wrong itself - treat this as you would info + // logging normally + debug(message, ...args) { + this._log('debug', message, args); + } + // Log fine-grained details that are mostly going to be useful to those + // adding new OpenTelemetry related features to boltzmann - treat this like + // you would debug level logging normally + verbose(message, ...args) { + this._log('debug', `VERBOSE: ${message}`, args); + } + _log(level, message, args) { + let isSelfTest = false; + void ``; + if (isSelfTest) { + return; + } + // Log to bole if we have it + if (this.logger) { + this.logger[level](message, ...args); + return; + } + const line = { + time: (new Date()).toISOString(), + level, + name: 'boltzmann:honeycomb', + message, + args + }; + try { + // are the args JSON-serializable? + this._writeLine(JSON.stringify(line)); + // SURVEY SAYS... + } + catch (_) { + // ...ok, make it a string as a fallback + line.args = require('util').format('%o', line.args); + this._writeLine(JSON.stringify(line)); + } + } + _writeLine(line) { + this._stream.write(Buffer.from(line + '\n')); } } +// We only do OpenTelemetry logging if boltzmann's main log level is debug +const _diagLogger = new HoneycombDiagLogger(); +if (!process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug') { + otel.diag.setLogger(_diagLogger, otelCore.getEnv().OTEL_LOG_LEVEL); +} +const _OtelSpanProcessor = otelTraceBase.SimpleSpanProcessor; +class HoneycombSpanProcessor extends _OtelSpanProcessor { + constructor(_exporter) { + super(_exporter); + } + // We want every span in the process to contain a couple of extra attributes. + // Right now that's just service_name (for backwards compatibility with + // beeline) and a trace type (so we can detect whether a service is using + // beeline or otel). This could theoretically be extended to allow + // customization a la beeline.addTraceContext, but that problem is really + // hairy and there are a lot of good reasons to add most attributes to + // just the active span. + onStart(span, _) { + span.setAttribute('service_name', span.resource.attributes['service.name']); + span.setAttribute('honeycomb.trace_type', 'otel'); + otelTraceBase.SimpleSpanProcessor.prototype.onStart.call(this, span); + } + onEnd(span) { + otelTraceBase.SimpleSpanProcessor.prototype.onEnd.call(this, span); + } +} +const defaultOtelFactories = { + headers(writeKey, dataset) { + let headers = {}; + if (writeKey) { + headers['x-honeycomb-team'] = writeKey; + } + if (dataset) { + headers['x-honeycomb-dataset'] = dataset; + } + return headers; + }, + resource(serviceName) { + return new otelResources.Resource({ + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName + }); + }, + // A tracer provider is effectively a Tracer factory and is used to power + // the otel.getTrace API + tracerProvider(resource) { + return new NodeTracerProvider({ resource }); + }, + // There are three different OTLP span exporter classes - one for grpc, one + // for http/protobuf and one for http/json - this will return the appropriate + // one for the configured protocol. + spanExporter(protocol, headers) { + // Instead of subclassing each implementation, monkey patch the send + // method on whichever instance we create + function patchSend(exporter) { + const send = exporter.send; + exporter.send = function (objects, onSuccess, + // This error is actually an Error subtype which corresponds 1:1 with + // the OTLPTraceExporter class being instrumented, but making this a + // proper generic type is hard - it's fine! + onError) { + otel.diag.debug(`sending ${objects.length} spans to ${this.url}`); + send.call(this, objects, () => { + otel.diag.debug(`successfully send ${objects.length} spans to ${this.url}`); + return onSuccess(); + }, (error) => { + otel.diag.debug(`error while sending ${objects.length} spans: ${error}`); + return onError(error); + }); + }; + } + if (protocol === 'grpc') { + const metadata = new grpc.Metadata(); + for (let [key, value] of Object.entries(headers)) { + metadata.set(key, value); + } + const credentials = grpc.credentials.createSsl(); + const exporter = new otlpGrpc.OTLPTraceExporter({ + credentials, + metadata + }); + patchSend(exporter); + return exporter; + } + if (protocol === 'http/json') { + otel.diag.warn("Honeycomb doesn't support the http/json OTLP protocol - but if you say so"); + const exporter = new otlpHttp.OTLPTraceExporter({ + headers + }); + patchSend(exporter); + return exporter; + } + if (protocol !== 'http/protobuf') { + otel.diag.warn(`Unknown OTLP protocol ${protocol} - using http/protobuf instead`); + } + const exporter = new otlpProto.OTLPTraceExporter({ + headers + }); + patchSend(exporter); + return exporter; + }, + // Process spans, using the supplied trace exporter to + // do the actual exporting. + spanProcessor(spanExporter) { + return new HoneycombSpanProcessor(spanExporter); + }, + instrumentations() { + // Any paths we add here will get no traces whatsoever. This is + // appropriate for the ping route, which should never trace. + const ignoreIncomingPaths = [ + '/monitor/ping' + ]; + // OpenTelemetry attempts to auto-collect GCE metadata, causing traces + // we don't care about. We do our best to ignore them by independently + // calculating which endpoints it's going to try to call. + // + // See: https://github.com/googleapis/gcp-metadata/blob/main/src/index.ts#L26-L44 + const ignoreOutgoingUrls = [ + /^https?:\/\/169\.254\.169\.254/, + /^https?:\/\/metadata\.google\.internal/, + ]; + let gceBase = process.env.GCE_METADATA_IP || process.env.GCE_METADATA_HOST || null; + if (gceBase) { + if (!/^https?:\/\//.test(gceBase)) { + gceBase = `http://${gceBase}`; + } + ignoreOutgoingUrls.push(new RegExp(`^${gceBase}`)); + } + let is = [ + new OtelDnsInstrumentation({}), + // NOTE: This instrumentation creates the default "trace" span and manages + // header propagation! See the honeycomb trace middleware for more + // details. + new OtelHttpInstrumentation({ + // TODO: These fields are expected to become deprecated in the + // near future... + ignoreIncomingPaths, + ignoreOutgoingUrls + }), + ]; + void ``; + is.push(new OtelRedisInstrumentation({})); + void ``; + void ``; + return is; + }, + // The SDK will take a service name, instrumentations + // and a trace exporter and give us a stateful singleton. + // This is that singleton! + sdk(resource, instrumentations) { + return new OtelSDK({ + resource, + instrumentations + }); + } +}; +// Let's GOOOOOOO +class Honeycomb { + constructor(options, overrides = {}) { + this.options = options; + this.features = { + honeycomb: !options.disable, + beeline: !options.disable && !options.otel, + otel: options.otel || false + }; + this.initialized = false; + this.started = false; + this.tracerProvider = null; + this.spanExporter = null; + this.spanProcessor = null; + this.instrumentations = null; + this.sdk = null; + this.factories = { + ...defaultOtelFactories, + ...(overrides || {}) + }; + this._logger = null; + } + get tracer() { + return otel.trace.getTracer('boltzmann', '0.6.0'); + } + // We (usually) load options from the environment. Unlike with Options, + // we do a lot of feature detection here. + static fromEnv(env = process.env, overrides = {}) { + return new Honeycomb(Honeycomb.parseEnv(env), overrides); + } + // serviceName is defined in the prelude, so rather than doing the same + // logic twice we let the prelude inject it when creating the honeycomb + // object. + static parseEnv(env = process.env) { + // For beelines, if we don't have HONEYCOMB_WRITEKEY there isn't much we + // can do... + let disable = !env.HONEYCOMB_WRITEKEY; + // Beelines should pick these up automatically, but we'll need them to + // configure default OTLP headers + const writeKey = env.HONEYCOMB_WRITEKEY || null; + const dataset = env.HONEYCOMB_DATASET || null; + // OpenTelemetry is configured with a huge pile of `OTEL_*` environment + // variables. If any of them are defined, we'll use OpenTelemetry instead + // of beelines. Typically one would configure OTEL_EXPORTER_OTLP_ENDPOINT + // to point to either api.honeycomb.io or your local refinery, but this + // will flag on OTEL_ENABLED=1 as well if you want to use all the + // defaults. + // + // For a broad overview of common variables, see: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md + // + // For a list of variables the OTLP exporter respects, see: + // https://opentelemetry.io/docs/reference/specification/protocol/exporter/ + const isOtel = Object.entries(env).some(([name, value]) => { + return name.startsWith('OTEL_') && value && value.length; + }); + // OpenTelemetry can optionally load the honeycomb headers from the + // OTEL_EXPORTER_OTLP_HEADERS and/or OTEL_EXPORTER_OTLP_TRACE_HEADERS + // environment variables, so having HONEYCOMB_WRITEKEY be falsey is + // potentially OK. This strategy also allows people to use the + // honeycomb tracing for non-honeycomb use cases. + if (isOtel) { + disable = false; + } + // This sample rate is for beeline only - to set the OpenTelemetry sample + // rate, set OTEL_TRACES_SAMPLER=parentbased_traceidratio and + // OTEL_TRACES_SAMPLER_ARG=${SOME_NUMBER}. Note that beeline defines + // sample rate as total/sampled, but OpenTelemetry defines it as + // sampled/total! + let sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1); + if (isNaN(sampleRate)) { + sampleRate = 1; + } + // OTLP is supposed to be configured with this environment variable, but + // the OpenTelemetry SDKs leave this as a some-assembly-required job. + // We default to 'http/protobuf' because it's well-supported by both + // Honeycomb and AWS load balancers and because it's relatively snappy. + // + // For more information on how this is configured, see: + // https://opentelemetry.io/docs/reference/specification/protocol/exporter/#specify-protocol + const otlpProtocol = env.OTEL_EXPORTER_OTLP_PROTOCOL || env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL || 'http/protobuf'; + // The service name logic is VERY similar to what's in prelude.ts, + // except that OTEL_SERVICE_NAME takes precedence if defined + const serviceName = (() => { + try { + return env.OTEL_SERVICE_NAME || env.SERVICE_NAME || require('./package.json').name.split('/').pop(); + } + catch (err) { + return 'boltzmann'; + } + })(); + return { + serviceName, + disable, + otel: isOtel, + writeKey, + dataset, + sampleRate, + otlpProtocol + }; + } + // Initialize Honeycomb! Stands up the otel node SDK if enabled, + // otherwise sets up the beeline library. + // This needs to occur before any imports you want instrumentation + // to be aware of. This step is separated from the constructor if only because + // there are irreversible side effects galore. + init() { + if (!this.features.honeycomb) { + this.initialized = true; + return; + } + try { + const writeKey = this.writeKey; + const dataset = this.dataset; + const sampleRate = this.sampleRate; + const serviceName = this.serviceName; + if (this.features.beeline && writeKey) { + beeline({ writeKey, dataset, sampleRate, serviceName }); + this.initialized = true; + return; + } + const f = this.factories; + const headers = f.headers(writeKey, dataset); + const resource = f.resource(serviceName); + const exporter = f.spanExporter(this.options.otlpProtocol || 'http/protobuf', headers); + const processor = f.spanProcessor(exporter); + const instrumentations = f.instrumentations(); + const provider = f.tracerProvider(resource); + provider.addSpanProcessor(processor); + provider.register(); + const sdk = f.sdk(resource, instrumentations); + this.spanExporter = exporter; + this.spanProcessor = processor; + this.instrumentations = instrumentations; + this.tracerProvider = provider; + this.sdk = sdk; + this.initialized = true; + } + catch (err) { + if (err instanceof HoneycombError) { + otel.diag.error(err.stack || String(err)); + return; + } + throw err; + } + } + // Start the OpenTelemetry SDK. If using beelines, this is + // a no-op. This needs to happen before anything happens in + // the entrypoint and is an async operation. + async start() { + let exitCode = 0; + const sdk = this.sdk; + const die = async (err) => { + otel.diag.error(err.stack || String(err)); + exitCode = 1; + await shutdown(); + }; + const shutdown = async () => { + await this.stop(); + process.exit(exitCode); + }; + if (sdk) { + process.once('SIGTERM', shutdown); + process.once('beforeExit', shutdown); + process.once('uncaughtException', die); + process.once('unhandledRejection', async (reason, _) => { + await die(reason); + }); + await sdk.start(); + } + this.started = true; + } + async stop() { + const sdk = this.sdk; + if (!sdk) + return; + try { + await sdk.shutdown(); + } + catch (err) { + otel.diag.error(err.stack || String(err)); + } + } + get writeKey() { + return this.options.writeKey || null; + } + get dataset() { + return this.options.dataset || null; + } + get sampleRate() { + return this.options.sampleRate || 1; + } + get serviceName() { + return this.options.serviceName || 'boltzmann'; + } + get logger() { + return this._logger; + } + set logger(logger) { + this._logger = logger; + _diagLogger.logger = logger ? logger : undefined; + } +} +module.exports = {...module.exports, beeline, otel, otelCore, otelResources, OtelSDK, otelTraceBase, NodeTracerProvider, otelSemanticConventions, OtelDnsInstrumentation, OtelHttpInstrumentation, +// +OtelRedisInstrumentation, +// +// + }; +module.exports = {...module.exports, defaultOtelFactories, Honeycomb, HoneycombError, HoneycombSpanProcessor, }; void ``; -const beeline = require("honeycomb-beeline"); if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET; } @@ -27,12 +487,27 @@ if (!process.env.HONEYCOMB_SAMPLE_RATE && process.env.HONEYCOMBIO_SAMPLE_RATE) { if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM; } -beeline({ - writeKey: process.env.HONEYCOMB_WRITEKEY, - dataset: process.env.HONEYCOMB_DATASET, - sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, - serviceName, -}); +let honeycomb = Honeycomb.fromEnv(process.env); +void ``; +honeycomb.init(); +module.exports = {...module.exports, honeycomb }; +void ``; +void ``; + +'use strict'; +// Boltzmann v0.6.0 +/**/ +const serviceName = _getServiceName(); +function _getServiceName() { + try { + return process.env.SERVICE_NAME || require('./package.json').name.split('/').pop(); + } + catch { + return 'boltzmann'; + } +} +/**/ +void ``; const onHeaders = require("on-headers"); void ``; const ships = require("culture-ships"); @@ -62,13 +537,11 @@ void ``; const { Readable } = require("stream"); const querystring = require("querystring"); const { promisify } = require("util"); -const isDev = require("are-we-dev"); const fmw = require("find-my-way"); const accepts = require("accepts"); const { promises: fs } = require("fs"); const crypto = require("crypto"); const http = require("http"); -const bole = require("@entropic/bole"); const path = require("path"); const os = require("os"); void ``; @@ -145,32 +618,58 @@ async function buildMiddleware(middleware, router) { return rhs(await lhs); }, Promise.resolve(router)); } +function handlerSpanName(handler) { + return `handler: ${handler.name || ''}`; +} async function handler(context) { const handler = context.handler; // - let span = null; - if (process.env.HONEYCOMB_WRITEKEY) { - span = beeline.startSpan({ - name: `handler: ${handler.name}`, + let beelineSpan = null; + let otelSpan = null; + let traceContext = otel.context.active(); + if (honeycomb.features.beeline) { + beelineSpan = beeline.startSpan({ + name: handlerSpanName(handler), 'handler.name': handler.name, 'handler.method': String(handler.method), 'handler.route': handler.route, 'handler.version': handler.version || '*', - 'handler.decorators': String(handler.decorators) + 'handler.decorators': String(handler.decorators), + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'honeycomb.trace_type': 'beeline', }); } + else if (honeycomb.features.otel) { + otelSpan = honeycomb.tracer.startSpan(handlerSpanName(handler), { + attributes: { + 'boltzmann.http.handler.name': handler.name || '', + 'boltzmann.handler.method': String(handler.method), + 'boltzmann.handler.route': handler.route, + 'boltzmann.http.handler.version': handler.version || '*', + 'boltzmann.http.handler.decorators': String(handler.decorators) + }, + kind: otel.SpanKind.SERVER + }, traceContext); + traceContext = otel.trace.setSpan(traceContext, otelSpan); + } try { - // - return await handler(context); - // + return await otel.context.with(traceContext, async () => { + // + return await handler(context); + // + }); } finally { - if (process.env.HONEYCOMB_WRITEKEY && span !== null) { - beeline.finishSpan(span); + if (beelineSpan !== null) { + beeline.finishSpan(beelineSpan); + } + else if (otelSpan !== null) { + otelSpan.end(); } } // } +void ``; void ``; async function routes(handlers) { @@ -229,6 +728,7 @@ class Context { this.params = {}; this.id = String(request.headers['x-honeycomb-trace'] || request.headers['x-request-id'] || + request.headers['traceparent'] || uuid.v4()); this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app'); @@ -425,8 +925,20 @@ class Context { /**[Docs]("https://www.boltzmann.dev/en/latest/docs/reference/02-handlers#traceURL")*/ get traceURL() { const url = new URL(`https://ui.honeycomb.io/${process.env.HONEYCOMB_TEAM}/datasets/${process.env.HONEYCOMB_DATASET}/trace`); - url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']); - url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime / 1000 - 1))); + if (honeycomb.features.beeline) { + url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']); + url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime / 1000 - 1))); + } + else if (honeycomb.features.otel) { + const spanCtx = this._honeycombTrace.spanContext(); + let startTime = Date.now() - 60000; + if (this._honeycombTrace.startTime) { + const [startSeconds, startNanos] = this._honeycombTrace.startTime; + startTime = startSeconds * 1000 + startNanos / 1000; + } + url.searchParams.set('trace_id', spanCtx.traceId); + url.searchParams.set('trace_start_ts', String(startTime)); + } return String(url); } // @@ -1161,18 +1673,28 @@ function handleCORS({ origins = isDev() ? '*' : String(process.env.CORS_ALLOW_OR const includesStar = originsArray.includes('*'); return (next) => { return async function cors(context) { - const reflectedOrigin = (includesStar - ? '*' - : (originsArray.includes(String(context.headers.origin)) - ? context.headers.origin - : false)); + const spanAttributes = { + 'boltzmann.http.origin': String(context.headers.origin) + }; + if (honeycomb.features.beeline) { + beeline.addContext(spanAttributes); + } + const span = otel.trace.getSpan(otel.context.active()); + if (span) { + span.setAttributes(spanAttributes); + } + if (!includesStar && !originsArray.includes(String(context.headers.origin))) { + throw Object.assign(new Error('Origin not allowed'), { + [Symbol.for('status')]: 400 + }); + } const response = (context.method === 'OPTIONS' ? Object.assign(Buffer.from(''), { [Symbol.for('status')]: 204, }) : await next(context)); response[Symbol.for('headers')] = { - ...(reflectedOrigin ? { 'Access-Control-Allow-Origin': reflectedOrigin } : {}), + 'Access-Control-Allow-Origin': includesStar ? '*' : context.headers.origin, 'Access-Control-Allow-Methods': [].concat(methods).join(','), 'Access-Control-Allow-Headers': [].concat(headers).join(',') }; @@ -1240,10 +1762,45 @@ function enforceInvariants() { void ``; +function traceName(method, pathname) { + return `${method} ${pathname}`; +} +function middlewareSpanName(name) { + return `mw: ${name || ''}`; +} +function paramSpanAttribute(param) { + return `boltzmann.http.request.param.${param}`; +} +module.exports = {...module.exports, traceName, middlewareSpanName, paramSpanAttribute }; +// The trace middleware creates a request-level span or trace. It delegates +// to either a beeline or OpenTelemetry implementation depending on how +// the honeycomb object is configured. +trace.doNotTrace = true; function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { - if (!process.env.HONEYCOMB_WRITEKEY) { + if (!honeycomb.features.honeycomb || !honeycomb.initialized) { return (next) => (context) => next(context); } + if (honeycomb.features.beeline) { + return beelineTrace({ headerSources }); + } + // Note: headerSources is not respected by otel tracing! + return otelTrace(); +} +// The spans middleware creates a span on top of nested middleware, injected +// between middlewares in the core buildMiddleware step. It delegates to +// either a beeline or OpenTelemetry implementation depending on how the +// honeycomb object is configured. +function honeycombMiddlewareSpans({ name, doNotTrace } = {}) { + if (!honeycomb.features.honeycomb || doNotTrace) { + return (next) => (context) => next(context); + } + if (honeycomb.features.beeline) { + return beelineMiddlewareSpans({ name }); + } + return otelMiddlewareSpans({ name }); +} +// Beeline implementations of trace and span, respectively. +function beelineTrace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { const schema = require('honeycomb-beeline/lib/schema'); const tracker = require('honeycomb-beeline/lib/async_tracker'); return function honeycombTrace(next) { @@ -1252,7 +1809,7 @@ function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) const trace = beeline.startTrace({ [schema.EVENT_TYPE]: 'boltzmann', [schema.PACKAGE_VERSION]: '1.0.0', - [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, + [schema.TRACE_SPAN_NAME]: traceName(context.method, context.url.pathname), [schema.TRACE_ID_SOURCE]: traceContext.source, 'request.host': context.host, 'request.original_url': context.url.href, @@ -1260,7 +1817,10 @@ function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) 'request.method': context.method, 'request.scheme': context.url.protocol, 'request.path': context.url.pathname, - 'request.query': context.url.search + 'request.query': context.url.search, + // for forward compatibility with OpenTelemetry traces + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'honeycomb.trace_type': 'beeline' }, traceContext.traceId, traceContext.parentSpanId, traceContext.dataset); if (isDev()) { context._honeycombTrace = trace; @@ -1311,14 +1871,15 @@ function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) }; } } -function honeycombMiddlewareSpans({ name } = {}) { - if (!process.env.HONEYCOMB_WRITEKEY) { - return (next) => (context) => next(context); - } +function beelineMiddlewareSpans({ name } = {}) { return function honeycombSpan(next) { return async (context) => { const span = beeline.startSpan({ - name: `mw: ${name}` + name: middlewareSpanName(name) + }); + beeline.addContext({ + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'honeycomb.trace_type': 'beeline' }); // Assumption: the invariant middleware between each layer // will ensure that no errors are thrown from next(). @@ -1328,17 +1889,104 @@ function honeycombMiddlewareSpans({ name } = {}) { }; }; } +/* + * ┏┓ + * ┃┃╱╲ in + * ┃╱╱╲╲ this + * ╱╱╭╮╲╲house + * ▔▏┗┛▕▔ we + * ╱▔▔▔▔▔▔▔▔▔▔╲ + * trace with opentelemetry + * ╱╱┏┳┓╭╮┏┳┓ ╲╲ + * ▔▏┗┻┛┃┃┗┻┛▕▔ + */ +function otelTrace() { + return function honeycombTrace(next) { + return (context) => { + let traceContext = otel.context.active(); + // Typically, HTTP auto-instrumentation will create a parent span for us + let span = otel.trace.getSpan(traceContext); + // startSpan should always return a span, but as far as typescript is + // concerned the span could still be undefined. We could assert that it + // exists, but throwing instrumentation-related errors is poor form. + if (span) { + span.setAttribute('boltzmann.http.query', context.url.search); + span.updateName(traceName(context.method, context.url.pathname)); + traceContext = otel.trace.setSpan(traceContext, span); + if (isDev()) { + context._honeycombTrace = span; + } + } + else { + otel.diag.error(String(new assert.AssertionError({ + message: 'no parent span found or created', + actual: span, + expected: true, + operator: '==' + }).stack)); + } + onHeaders(context._response, function () { + const handler = context.handler; + if (!span) { + return; + } + span.setAttribute(otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, handler.version); + Object.entries(context.params).forEach(([key, value]) => { + if (span) { + span.setAttribute(paramSpanAttribute(key), value); + } + }); + }); + return otel.context.with(traceContext, () => { + return next(context); + }); + }; + }; +} +function otelMiddlewareSpans({ name } = {}) { + return function honeycombSpan(next) { + return async (context) => { + let traceContext = otel.context.active(); + const span = honeycomb.tracer.startSpan(middlewareSpanName(name), { kind: otel.SpanKind.SERVER }, traceContext); + traceContext = otel.trace.setSpan(traceContext, span); + const result = await otel.context.with(traceContext, () => { + return next(context); + }); + span.end(); + return result; + }; + }; +} +void ``; void ``; -function log({ logger = bole(process.env.SERVICE_NAME || 'boltzmann'), level = process.env.LOG_LEVEL || 'debug', stream = process.stdout } = {}) { +function log({ logger = bole(serviceName), +// +honeycombLogger = bole(`${serviceName}:honeycomb`), +// +level = process.env.LOG_LEVEL || 'debug', stream = process.stdout, } = {}) { if (isDev()) { const pretty = require('bistre')({ time: true }); pretty.pipe(stream); stream = pretty; } bole.output({ level, stream }); + void ``; + honeycomb.logger = honeycombLogger; + const hasWriteKey = Boolean(honeycomb.options.writeKey && honeycomb.options.writeKey.length); + let honeycombConfig = { + serviceName: honeycomb.options.serviceName, + writeKey: `${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`, + dataset: honeycomb.options.dataset + }; + Object.assign(honeycombConfig, honeycomb.features); + honeycombLogger.debug({ + message: 'Honeycomb tracing enabled', + ...honeycombConfig + }); + void ``; return function logMiddleware(next) { return async function inner(context) { const result = await next(context); @@ -1366,6 +2014,7 @@ void ``; void ``; +handlePing.doNotTrace = true; function handlePing() { return (next) => (context) => { if (context.url.pathname === '/monitor/ping') { @@ -1648,7 +2297,7 @@ async function redisReachability(context, _) { // void ``; -const boltzmannVersion = `0.5.3`; +const boltzmannVersion = `0.6.0`; // const devErrorTemplateSource = ` @@ -2376,7 +3025,7 @@ const validate = { * * The `validate.body` middleware applies [JSON schema]( "https://json-schema.org/") validation to incoming * request bodies. It intercepts the body that would be returned by - * \[`context.body`\] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is + * \[`context.body`] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is * passed through. * * `Ajv` is configured with `{useDefaults: true, allErrors: true}` by default. In @@ -2655,9 +3304,9 @@ const middleware = { * ```` * * The `id` fields in logs is the value of the request-id, available on the context object as the `id` - * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace` - * and `x-request-id` before falling back to generating a request id using a short randomly-selected - * string. + * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace`, + * `x-request-id` and `traceparent` before falling back to generating a request id using a short + * randomly-selected string. * * To log from your handlers, you might write code like this: * @@ -2923,48 +3572,52 @@ module.exports = {...module.exports, Context, main: runserver, middleware, body void ``; /* c8 ignore next */ if (require.main === module && !process.env.TAP) { - function passthrough() { - return (next) => (context) => next(context); - } - runserver({ - middleware: _requireOr('./middleware', []) - .then(_processMiddleware) - .then((mw) => { - // - // - const acc = []; - // - acc.push(trace); - // - // - acc.push(handlePing); - // - // - acc.push(log); - // - acc.push(attachRedis); - // - // - acc.push(...mw); - // - acc.push(handleStatus); - // - return acc.filter(Boolean); - }), - }) - .then((server) => { - server.listen(Number(process.env.PORT) || 5000, () => { - const addrinfo = server.address(); - if (!addrinfo) { - return; - } - bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + // + honeycomb.start().then(run); + function run() { + // + runserver({ + middleware: _requireOr('./middleware', []) + .then(_processMiddleware) + .then((mw) => { + // + // + const acc = []; + // + acc.push(handlePing); + // + // + acc.push(trace); + // + // + acc.push(log); + // + acc.push(attachRedis); + // + // + acc.push(...mw); + // + acc.push(handleStatus); + // + return acc.filter(Boolean); + }), + }) + .then((server) => { + server.listen(Number(process.env.PORT) || 8000, () => { + const addrinfo = server.address(); + if (!addrinfo) { + return; + } + bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + }); + }) + .catch((err) => { + console.error(err.stack); + process.exit(1); }); - }) - .catch((err) => { - console.error(err.stack); - process.exit(1); - }); + // + } + // } diff --git a/examples/sessions/package-lock.json b/examples/sessions/package-lock.json index ba0ce0ff..3a8eb390 100644 --- a/examples/sessions/package-lock.json +++ b/examples/sessions/package-lock.json @@ -10,7 +10,24 @@ "license": "ISC", "dependencies": { "@entropic/bole": "^4.0.1", + "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", "@types/uuid": "^8.3.0", "accepts": "^1.3.7", "ajv": "^8.0.5", @@ -33,8 +50,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -642,6 +659,36 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@grpc/grpc-js": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", + "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -807,12 +854,12 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -820,21 +867,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -842,16 +889,32 @@ } }, "node_modules/@opentelemetry/api": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", - "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", - "dependencies": { - "@opentelemetry/context-base": "^0.9.0" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", "engines": { "node": ">=8.0.0" } }, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, "node_modules/@opentelemetry/context-base": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.9.0.tgz", @@ -861,18 +924,379 @@ } }, "node_modules/@opentelemetry/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", - "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", "dependencies": { - "@opentelemetry/api": "^0.9.0", - "@opentelemetry/context-base": "^0.9.0", - "semver": "^7.1.3" + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", + "dependencies": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.27.0.tgz", + "integrity": "sha512-Q1PlH9iR3RUiLDnSbKmaAdXEuquvI0oLIN1WW37tUyTuqK5BArPXMzcquQtX/aG+4T5I6IHzgCpZxiedhW42Wg==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "protobufjs": "^6.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.1.tgz", + "integrity": "sha512-NwLMHthT7/YncTZcfYbb24n8z/mFYSWPlZkWOhG6XVRAE0KsDLlMsrwvha5Yg/4vhv4nj2qLM9bk5+zA5a/ZfA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.3.tgz", + "integrity": "sha512-jobfcnSxuBBevbiqOhisvTCe3N7/mKMFL5laH1hQ3PPmUC61h/MXOoHx+yg5tTQPXhgfi1JiBXa9nZxxPItH5Q==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "graphql": "^15.5.1" }, "engines": { "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", + "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", + "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/redis": "2.8.31" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.3.tgz", + "integrity": "sha512-0bhy8L1JZfqGqMjaPu1tV3rBsmtN42+wycJYhxMBbaB4E0ZDshDLnBHn3AeLMPLtFUqiyyn48JluuBfD7KPkhA==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.2.tgz", + "integrity": "sha512-CuFqdUGfQtVJ6paaasUaUN6dHxbu0CpUFnHws4Vj/K5SDUxR4l3/Vy5SvMiQ21mRCkeDDDbnw8cPEoA/xGKTrg==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -913,20 +1337,25 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "node_modules/@types/node": { "version": "15.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" }, "node_modules/@types/redis": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.29.tgz", - "integrity": "sha512-/pjQ9lwnL/t1bEfRHQFEJB3kHCR65tpB19NEWmbqcgGgqrfeGo/9b4tUtHbClxQoy3+g6Esx2QRtV7fk7kBPYg==", + "version": "2.8.31", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", + "integrity": "sha512-daWrrTDYaa5iSDFbgzZ9gOOzyp2AJmYK59OlG/2KGBgYWF3lfs8GDKm1c//tik5Uc93hDD36O+qLPvzDolChbA==", "dependencies": { "@types/node": "*" } @@ -938,30 +1367,31 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz", - "integrity": "sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.13.0", - "@typescript-eslint/scope-manager": "4.13.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -969,50 +1399,35 @@ } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz", - "integrity": "sha512-/ZsuWmqagOzNkx30VWYV3MNB/Re/CGv/7EzlqZo5RegBN8tMuPaBgNK6vPBCQA8tcYrbsrTdbx3ixMRRKEEGVw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.13.0.tgz", - "integrity": "sha512-KO0J5SRF08pMXzq9+abyHnaGQgUJZ3Z3ax+pmqz9vl81JxmTTOUfQmq7/4awVfq09b6C4owNlOgOwp61pYRBSg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1021,29 +1436,55 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz", - "integrity": "sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0" + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.13.0.tgz", - "integrity": "sha512-/+aPaq163oX+ObOG00M0t9tKkOgdv9lq0IQv/y4SqGkAXmhFmCfgsELV7kOCTb2vVU5VOmVwXBXJTDr353C1rQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1051,22 +1492,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz", - "integrity": "sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1078,17 +1518,68 @@ } } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz", - "integrity": "sha512-6RoxWK05PAibukE7jElqAtNMq+RWZyqJ6Q/GdIxaiUj2Ept8jh8+FUVlbq9WxMYxkmEOPvCE5cRSyupMpwW31g==", + "node_modules/@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.13.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1096,12 +1587,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/a-sync-waterfall": { @@ -1115,6 +1606,17 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1442,6 +1944,14 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -1889,7 +2399,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1900,7 +2409,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, "engines": { "node": ">=8" } @@ -1908,14 +2416,12 @@ "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -1924,7 +2430,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1938,7 +2443,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -2197,10 +2701,9 @@ "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" }, "node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -2321,15 +2824,6 @@ "node": ">=8" } }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2446,7 +2940,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -2873,6 +3366,14 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -2910,20 +3411,19 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -2943,9 +3443,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "node_modules/fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3177,6 +3677,11 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "node_modules/function-loop": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", @@ -3199,6 +3704,56 @@ "is-windows": "^1.0.2" } }, + "node_modules/gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3212,7 +3767,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3324,9 +3878,9 @@ } }, "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "devOptional": true, "dependencies": { "is-glob": "^4.0.1" @@ -3372,16 +3926,16 @@ } }, "node_modules/globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -3392,9 +3946,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -3428,6 +3982,14 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/handy-redis": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/handy-redis/-/handy-redis-2.2.1.tgz", @@ -3484,6 +4046,17 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/has-ansi": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", @@ -3555,6 +4128,30 @@ "shimmer": "^1.2.1" } }, + "node_modules/honeycomb-beeline/node_modules/@opentelemetry/api": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", + "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", + "dependencies": { + "@opentelemetry/context-base": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/honeycomb-beeline/node_modules/@opentelemetry/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", + "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", + "dependencies": { + "@opentelemetry/api": "^0.9.0", + "@opentelemetry/context-base": "^0.9.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.5.0" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3780,6 +4377,17 @@ "is-ci": "bin.js" } }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3799,9 +4407,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" @@ -3866,7 +4474,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, "engines": { "node": ">=8" } @@ -4121,6 +4728,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -4313,12 +4928,22 @@ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "node_modules/log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -4328,6 +4953,11 @@ "node": ">=0.8.6" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4387,16 +5017,16 @@ } }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "dependencies": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/mime": { @@ -4486,6 +5116,11 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4513,6 +5148,25 @@ "node": ">= 0.4.0" } }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -5140,6 +5794,20 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5147,9 +5815,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "devOptional": true, "engines": { "node": ">=8.6" @@ -5289,6 +5957,31 @@ "node": ">=0.4.0" } }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/proxy-agent": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", @@ -5371,6 +6064,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -5486,9 +6199,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" @@ -5602,7 +6315,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5615,12 +6327,38 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5675,9 +6413,9 @@ "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "node_modules/run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -5692,7 +6430,10 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -5713,9 +6454,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -5749,6 +6493,22 @@ "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6197,6 +6957,17 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6903,6 +7674,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tap/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/tap/node_modules/ansi-styles": { "version": "3.2.1", "dev": true, @@ -7913,13 +8693,17 @@ "node": ">=8" } }, - "node_modules/tap/node_modules/string-width/node_modules/ansi-regex": { - "extraneous": true, - "inBundle": true - }, - "node_modules/tap/node_modules/string-width/node_modules/strip-ansi": { + "node_modules/tap/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, - "inBundle": true + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/tap/node_modules/supports-color": { "version": "5.5.0", @@ -8122,10 +8906,6 @@ "node": ">=8" } }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-regex": { - "extraneous": true, - "inBundle": true - }, "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -8159,10 +8939,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/strip-ansi": { - "dev": true, - "inBundle": true - }, "node_modules/tap/node_modules/wrappy": { "version": "1.0.2", "dev": true, @@ -8369,6 +9145,11 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "node_modules/trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -8389,9 +9170,9 @@ } }, "node_modules/tsutils": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", - "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" @@ -8459,6 +9240,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -8729,6 +9524,20 @@ "extsprintf": "^1.2.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8824,7 +9633,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8841,7 +9649,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, "engines": { "node": ">=8" } @@ -8850,7 +9657,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8865,7 +9671,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8876,20 +9681,17 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -8898,7 +9700,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8912,7 +9713,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -8980,7 +9780,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -9009,7 +9808,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9027,7 +9825,6 @@ "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true, "engines": { "node": ">=10" } @@ -9036,7 +9833,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, "engines": { "node": ">=8" } @@ -9044,14 +9840,12 @@ "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -9060,7 +9854,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9074,7 +9867,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -9632,6 +10424,27 @@ } } }, + "@grpc/grpc-js": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", + "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + } + }, "@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -9772,53 +10585,311 @@ "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, - "@opentelemetry/api": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", - "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", + "@opentelemetry/api": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" + }, + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + }, + "@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "requires": {} + }, + "@opentelemetry/context-base": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.9.0.tgz", + "integrity": "sha512-4XUS2RoGKla+lqbEBKN4NUmPtJI/+NHVt7EHaw6XxFlBwyZ9HAX61Kk53Hlb6eUYOLOehdVx9Q+gdpamj018iQ==" + }, + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", + "requires": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + } + }, + "@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + } + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.27.0.tgz", + "integrity": "sha512-Q1PlH9iR3RUiLDnSbKmaAdXEuquvI0oLIN1WW37tUyTuqK5BArPXMzcquQtX/aG+4T5I6IHzgCpZxiedhW42Wg==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "protobufjs": "^6.9.0" + } + }, + "@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + } + }, + "@opentelemetry/instrumentation-dns": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.1.tgz", + "integrity": "sha512-NwLMHthT7/YncTZcfYbb24n8z/mFYSWPlZkWOhG6XVRAE0KsDLlMsrwvha5Yg/4vhv4nj2qLM9bk5+zA5a/ZfA==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + } + }, + "@opentelemetry/instrumentation-graphql": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.3.tgz", + "integrity": "sha512-jobfcnSxuBBevbiqOhisvTCe3N7/mKMFL5laH1hQ3PPmUC61h/MXOoHx+yg5tTQPXhgfi1JiBXa9nZxxPItH5Q==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "graphql": "^15.5.1" + } + }, + "@opentelemetry/instrumentation-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", + "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + } + }, + "@opentelemetry/instrumentation-redis": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.27.0.tgz", + "integrity": "sha512-A54NWDuqnTk0XImM64eDhNuvn139scUBxPbkea+Y5QqLKac83XGpVsGI2RCSN4dR2KLurdDI2B3qBVkJ5mxAzA==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/redis": "2.8.31" + } + }, + "@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/resource-detector-aws": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.3.tgz", + "integrity": "sha512-0bhy8L1JZfqGqMjaPu1tV3rBsmtN42+wycJYhxMBbaB4E0ZDshDLnBHn3AeLMPLtFUqiyyn48JluuBfD7KPkhA==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-gcp": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.2.tgz", + "integrity": "sha512-CuFqdUGfQtVJ6paaasUaUN6dHxbu0CpUFnHws4Vj/K5SDUxR4l3/Vy5SvMiQ21mRCkeDDDbnw8cPEoA/xGKTrg==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + } + }, + "@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "requires": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "requires": { - "@opentelemetry/context-base": "^0.9.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "@opentelemetry/context-base": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.9.0.tgz", - "integrity": "sha512-4XUS2RoGKla+lqbEBKN4NUmPtJI/+NHVt7EHaw6XxFlBwyZ9HAX61Kk53Hlb6eUYOLOehdVx9Q+gdpamj018iQ==" + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" }, - "@opentelemetry/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", - "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", - "requires": { - "@opentelemetry/api": "^0.9.0", - "@opentelemetry/context-base": "^0.9.0", - "semver": "^7.1.3" - } + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@sindresorhus/is": { "version": "0.14.0", @@ -9854,20 +10925,25 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "@types/node": { "version": "15.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" }, "@types/redis": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.29.tgz", - "integrity": "sha512-/pjQ9lwnL/t1bEfRHQFEJB3kHCR65tpB19NEWmbqcgGgqrfeGo/9b4tUtHbClxQoy3+g6Esx2QRtV7fk7kBPYg==", + "version": "2.8.31", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz", + "integrity": "sha512-daWrrTDYaa5iSDFbgzZ9gOOzyp2AJmYK59OlG/2KGBgYWF3lfs8GDKm1c//tik5Uc93hDD36O+qLPvzDolChbA==", "requires": { "@types/node": "*" } @@ -9879,93 +10955,129 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz", - "integrity": "sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.13.0", - "@typescript-eslint/scope-manager": "4.13.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } } }, - "@typescript-eslint/experimental-utils": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz", - "integrity": "sha512-/ZsuWmqagOzNkx30VWYV3MNB/Re/CGv/7EzlqZo5RegBN8tMuPaBgNK6vPBCQA8tcYrbsrTdbx3ixMRRKEEGVw==", + "@typescript-eslint/parser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" } }, - "@typescript-eslint/parser": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.13.0.tgz", - "integrity": "sha512-KO0J5SRF08pMXzq9+abyHnaGQgUJZ3Z3ax+pmqz9vl81JxmTTOUfQmq7/4awVfq09b6C4owNlOgOwp61pYRBSg==", + "@typescript-eslint/scope-manager": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "debug": "^4.1.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" } }, - "@typescript-eslint/scope-manager": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz", - "integrity": "sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ==", + "@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0" + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.13.0.tgz", - "integrity": "sha512-/+aPaq163oX+ObOG00M0t9tKkOgdv9lq0IQv/y4SqGkAXmhFmCfgsELV7kOCTb2vVU5VOmVwXBXJTDr353C1rQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz", - "integrity": "sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz", - "integrity": "sha512-6RoxWK05PAibukE7jElqAtNMq+RWZyqJ6Q/GdIxaiUj2Ept8jh8+FUVlbq9WxMYxkmEOPvCE5cRSyupMpwW31g==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -9981,6 +11093,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -10239,6 +11359,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" + }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -10578,7 +11703,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -10588,26 +11712,22 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10618,7 +11738,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -10820,9 +11939,9 @@ "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -10906,14 +12025,6 @@ "dev": true, "requires": { "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } } }, "doctrine": { @@ -11019,8 +12130,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -11325,6 +12435,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -11359,17 +12474,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -11389,9 +12503,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -11563,6 +12677,11 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "function-loop": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", @@ -11585,6 +12704,46 @@ "is-windows": "^1.0.2" } }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + } + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11594,8 +12753,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-function-location": { "version": "2.0.0", @@ -11687,9 +12845,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "devOptional": true, "requires": { "is-glob": "^4.0.1" @@ -11722,23 +12880,23 @@ } }, "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "dependencies": { "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true } } @@ -11768,6 +12926,11 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" + }, "handy-redis": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/handy-redis/-/handy-redis-2.2.1.tgz", @@ -11812,6 +12975,14 @@ } } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", @@ -11862,6 +13033,26 @@ "libhoney": "^2.2.1", "on-headers": "^1.0.2", "shimmer": "^1.2.1" + }, + "dependencies": { + "@opentelemetry/api": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", + "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", + "requires": { + "@opentelemetry/context-base": "^0.9.0" + } + }, + "@opentelemetry/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", + "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", + "requires": { + "@opentelemetry/api": "^0.9.0", + "@opentelemetry/context-base": "^0.9.0", + "semver": "^7.1.3" + } + } } }, "html-escaper": { @@ -12045,6 +13236,14 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12058,9 +13257,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "devOptional": true, "requires": { "is-extglob": "^2.1.1" @@ -12103,8 +13302,7 @@ "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, "is-typedarray": { "version": "1.0.0", @@ -12302,6 +13500,14 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -12457,18 +13663,33 @@ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -12512,13 +13733,13 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mime": { @@ -12586,6 +13807,11 @@ "minimist": "^1.2.5" } }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12607,6 +13833,14 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -13085,6 +14319,17 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -13092,9 +14337,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "devOptional": true }, "pkg-dir": { @@ -13191,6 +14436,26 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "proxy-agent": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", @@ -13258,6 +14523,12 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -13347,9 +14618,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -13435,20 +14706,39 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -13490,10 +14780,13 @@ "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "safe-buffer": { "version": "5.1.2", @@ -13514,9 +14807,27 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } }, "semver-diff": { "version": "3.1.1", @@ -13892,6 +15203,11 @@ } } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -14325,6 +15641,11 @@ } } }, + "ansi-regex": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, "ansi-styles": { "version": "3.2.1", "bundled": true, @@ -14983,16 +16304,14 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "bundled": true, - "extraneous": true - }, - "strip-ansi": { - "bundled": true, - "dev": true - } + } + }, + "strip-ansi": { + "version": "6.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" } }, "supports-color": { @@ -15132,10 +16451,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "bundled": true, - "extraneous": true - }, "ansi-styles": { "version": "4.3.0", "bundled": true, @@ -15156,10 +16471,6 @@ "version": "1.1.4", "bundled": true, "dev": true - }, - "strip-ansi": { - "bundled": true, - "dev": true } } }, @@ -15362,6 +16673,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -15379,9 +16695,9 @@ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, "tsutils": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", - "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -15433,6 +16749,13 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true + }, "uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -15659,6 +16982,20 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -15732,7 +17069,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15742,14 +17078,12 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -15758,7 +17092,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -15766,26 +17099,22 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15796,7 +17125,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -15850,8 +17178,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "3.1.1", @@ -15874,7 +17201,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -15888,26 +17214,22 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15918,7 +17240,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -15928,8 +17249,7 @@ "yargs-parser": { "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" }, "yocto-queue": { "version": "0.1.0", diff --git a/examples/sessions/package.json b/examples/sessions/package.json index bed903a5..4f1b3cea 100644 --- a/examples/sessions/package.json +++ b/examples/sessions/package.json @@ -1,22 +1,34 @@ { - "name": "sessions", - "description": "An example of using Boltzmann's sessions feature", - "version": "1.0.0", "author": "C J Silverio ", - "boltzmann": { - "version": "0.5.3", - "csrf": true, - "githubci": false, - "honeycomb": true, - "jwt": false, - "ping": true, - "redis": true, - "status": true, - "templates": true + "description": "An example of using Boltzmann's sessions feature", + "directories": { + "test": "tests" }, + "keywords": [], + "license": "ISC", + "main": "index.js", + "name": "sessions", + "version": "1.0.0", "dependencies": { "@entropic/bole": "^4.0.1", + "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/instrumentation-redis": "^0.27.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", "@types/uuid": "^8.3.0", "accepts": "^1.3.7", "ajv": "^8.0.5", @@ -39,8 +51,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -55,17 +67,24 @@ "supports-hyperlinks": "^2.1.0", "tap": "^15.1.5" }, - "keywords": [], - "license": "ISC", - "main": "index.js", "scripts": { "boltzmann:docs": "npx boltzmann-cli --docs", - "boltzmann:esbuild": null, "boltzmann:routes": "node -e 'require(\"./boltzmann\").printRoutes()'", "boltzmann:upgrade": "npx boltzmann-cli", "lint": "eslint .", "posttest": "npm run lint", - "start": "nodemon --ignore static/ --ignore tests/ -e js,html ./boltzmann.js", + "start": "nodemon ./boltzmann.js", "test": "c8 tap --no-cov tests" + }, + "boltzmann": { + "version": "0.6.0", + "csrf": true, + "githubci": false, + "honeycomb": true, + "jwt": false, + "ping": true, + "redis": true, + "status": true, + "templates": true } -} +} \ No newline at end of file diff --git a/examples/typed/boltzmann.ts b/examples/typed/boltzmann.ts index b3148bf9..804afbb4 100755 --- a/examples/typed/boltzmann.ts +++ b/examples/typed/boltzmann.ts @@ -2,7 +2,19 @@ /* eslint-disable */ /* c8 ignore file */ 'use strict' -// Boltzmann v0.5.3 + +/**/ + +// Dependencies used outside of honeycomb +import bole from '@entropic/bole' +import isDev from 'are-we-dev' + +export { bole, isDev } + +void `` + +'use strict' +// Boltzmann v0.6.0 /**/ const serviceName = _getServiceName() @@ -15,6 +27,7 @@ function _getServiceName() { } } +/**/ void ``; import ships from 'culture-ships' @@ -53,13 +66,11 @@ import type tap from 'tap' import querystring from 'querystring' import { promisify } from 'util' -import isDev from 'are-we-dev' import fmw from 'find-my-way' import accepts from 'accepts' import { promises as fs } from 'fs' import crypto from 'crypto' import http from 'http' -import bole from '@entropic/bole' import path from 'path' import os from 'os' void ``; @@ -175,7 +186,8 @@ interface Adaptor { interface Middleware { (...args: any[]): Adaptor - name?: string + name?: string, + doNotTrace?: boolean } type MiddlewareConfig = Middleware | [Middleware, ...any[]] @@ -206,13 +218,19 @@ async function buildMiddleware (middleware: MiddlewareConfig[], router: Handler) }, Promise.resolve(router)) } +function handlerSpanName(handler: Handler) { + return `handler: ${handler.name || ''}` +} + async function handler (context: Context) { const handler = context.handler as Handler // - return await handler(context) - // + return await handler(context) + // } +void `` + void ``; async function routes (handlers: Record) { @@ -268,11 +286,15 @@ class Context { /**{{ changelog(version = "0.0.0") }} * + * * **Changed in 0.6.0:** Use `traceparent` as the `id` when available. + * {% end %} + * * A unique string identifier for the request for tracing purposes. The value is * drawn from: * - * 1. `x-honeycomb-trace` + * 1. `x-honeycomb-trace` (via Honeycomb beeline tracing) * 1. `x-request-id` + * 1. `traceparent` (via Honeycomb OpenTelemetry tracing) * 1. A generated [ship name from Iain M Bank's Culture series]( "https://en.wikipedia.org/wiki/Culture_series") (e.g.: `"ROU Frank Exchange Of Views"`) * * **Example use:** @@ -391,6 +413,7 @@ class Context { this.id = String( request.headers['x-honeycomb-trace'] || request.headers['x-request-id'] || + request.headers['traceparent'] || uuid.v4() ) this._loadSession = async () => { @@ -1352,15 +1375,22 @@ function handleCORS ({ return (next: Handler) => { return async function cors (context: Context) { - const reflectedOrigin = ( - includesStar - ? '*' - : ( - originsArray.includes(String(context.headers.origin)) - ? context.headers.origin - : false - ) - ) + const spanAttributes = { + 'boltzmann.http.origin': String(context.headers.origin) + } + if (honeycomb.features.beeline) { + beeline.addContext(spanAttributes) + } + const span = otel.trace.getSpan(otel.context.active()) + if (span) { + span.setAttributes(spanAttributes) + } + + if (!includesStar && !originsArray.includes(String(context.headers.origin))) { + throw Object.assign(new Error('Origin not allowed'), { + [Symbol.for('status')]: 400 + }) + } const response = ( context.method === 'OPTIONS' @@ -1371,7 +1401,7 @@ function handleCORS ({ ) response[Symbol.for('headers')] = { - ...(reflectedOrigin ? { 'Access-Control-Allow-Origin': reflectedOrigin } : {}), + 'Access-Control-Allow-Origin': includesStar ? '*' : context.headers.origin, 'Access-Control-Allow-Methods': ([] as any[]).concat(methods).join(','), 'Access-Control-Allow-Headers': ([] as any[]).concat(headers).join(',') } @@ -1451,9 +1481,10 @@ function enforceInvariants () { void ``; function log ({ - logger = bole(process.env.SERVICE_NAME || 'boltzmann'), + logger = bole(serviceName), + // level = process.env.LOG_LEVEL || 'debug', - stream = process.stdout + stream = process.stdout, } = {}) { if (isDev()) { const pretty = require('bistre')({ time: true }) @@ -1462,6 +1493,8 @@ function log ({ } bole.output({ level, stream }) + void `` + return function logMiddleware (next: Handler) { return async function inner (context: Context) { const result = await next(context) @@ -1496,6 +1529,7 @@ void ``; void ``; +handlePing.doNotTrace = true function handlePing () { return (next: Handler) => (context: Context) => { if (context.url.pathname === '/monitor/ping') { @@ -1992,7 +2026,7 @@ const validate = { * * The `validate.body` middleware applies [JSON schema]( "https://json-schema.org/") validation to incoming * request bodies. It intercepts the body that would be returned by - * \[`context.body`\] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is + * \[`context.body`] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is * passed through. * * `Ajv` is configured with `{useDefaults: true, allErrors: true}` by default. In @@ -2282,9 +2316,9 @@ const middleware = { * ```` * * The `id` fields in logs is the value of the request-id, available on the context object as the `id` - * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace` - * and `x-request-id` before falling back to generating a request id using a short randomly-selected - * string. + * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace`, + * `x-request-id` and `traceparent` before falling back to generating a request id using a short + * randomly-selected string. * * To log from your handlers, you might write code like this: * @@ -2521,9 +2555,7 @@ export { /* c8 ignore next */ if (require.main === module && !process.env.TAP) { - function passthrough() { - return (next: Handler) => (context: Context) => next(context) - } + // runserver({ middleware: (_requireOr('./middleware', [] as MiddlewareConfig[]) as Promise) @@ -2533,14 +2565,14 @@ if (require.main === module && !process.env.TAP) { // const acc = [] - // - // acc.push(handlePing) // // + // + acc.push(log) // @@ -2557,7 +2589,7 @@ if (require.main === module && !process.env.TAP) { }), }) .then((server) => { - server.listen(Number(process.env.PORT) || 5000, () => { + server.listen(Number(process.env.PORT) || 8000, () => { const addrinfo = server.address() if (!addrinfo) { return @@ -2569,6 +2601,7 @@ if (require.main === module && !process.env.TAP) { console.error(err.stack) process.exit(1) }) + // } diff --git a/examples/typed/package-lock.json b/examples/typed/package-lock.json index 20fb273e..f8df8396 100644 --- a/examples/typed/package-lock.json +++ b/examples/typed/package-lock.json @@ -45,8 +45,8 @@ "@types/hapi__shot": "^4.1.1", "@types/tap": "^15.0.0", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -808,12 +808,12 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -821,21 +821,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -926,9 +926,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "node_modules/@types/node": { @@ -953,29 +953,31 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz", - "integrity": "sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.12.0", - "@typescript-eslint/scope-manager": "4.12.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -983,81 +985,83 @@ } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz", - "integrity": "sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==", + "node_modules/@typescript-eslint/parser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.12.0", - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/typescript-estree": "4.12.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.12.0.tgz", - "integrity": "sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.12.0", - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/typescript-estree": "4.12.0", - "debug": "^4.1.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz", - "integrity": "sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/visitor-keys": "4.12.0" + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz", - "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1065,22 +1069,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz", - "integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/visitor-keys": "4.12.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1092,23 +1095,74 @@ } } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz", - "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==", + "node_modules/@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.12.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2104,9 +2158,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -2752,20 +2806,19 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -2786,9 +2839,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "node_modules/fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3108,9 +3161,9 @@ } }, "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" @@ -3159,16 +3212,16 @@ } }, "node_modules/globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -3352,9 +3405,9 @@ } }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -3494,9 +3547,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -4171,16 +4224,16 @@ } }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "dependencies": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/mime-db": { @@ -4874,9 +4927,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -5072,6 +5125,26 @@ "node": ">=0.6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", @@ -5173,9 +5246,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" @@ -5349,9 +5422,9 @@ } }, "node_modules/run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -5366,7 +5439,10 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -5389,9 +5465,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7963,9 +8039,9 @@ "dev": true }, "node_modules/tsutils": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.18.0.tgz", - "integrity": "sha512-D9Tu8nE3E7D1Bsf/V29oMHceMf+gnVO+pDguk/A5YRo1cLpkiQ48ZnbbS57pvvHeY+OIeNQx1vf4ASPlEtRpcA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" @@ -9184,28 +9260,28 @@ "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -9285,9 +9361,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/node": { @@ -9312,86 +9388,117 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz", - "integrity": "sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.12.0", - "@typescript-eslint/scope-manager": "4.12.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" } }, - "@typescript-eslint/experimental-utils": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz", - "integrity": "sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==", + "@typescript-eslint/parser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.12.0", - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/typescript-estree": "4.12.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" } }, - "@typescript-eslint/parser": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.12.0.tgz", - "integrity": "sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ==", + "@typescript-eslint/scope-manager": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.12.0", - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/typescript-estree": "4.12.0", - "debug": "^4.1.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" } }, - "@typescript-eslint/scope-manager": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz", - "integrity": "sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==", + "@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/visitor-keys": "4.12.0" + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz", - "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz", - "integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/visitor-keys": "4.12.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + } } }, "@typescript-eslint/visitor-keys": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz", - "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.12.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } } }, "abbrev": { @@ -10162,9 +10269,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -10655,17 +10762,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -10686,9 +10792,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -10927,9 +11033,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -10962,16 +11068,16 @@ } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -11111,9 +11217,9 @@ } }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "ignore-by-default": { @@ -11220,9 +11326,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -11746,13 +11852,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mime-db": { @@ -12284,9 +12390,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pkg-dir": { @@ -12427,6 +12533,12 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", @@ -12508,9 +12620,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -12638,10 +12750,13 @@ } }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "safe-buffer": { "version": "5.1.2", @@ -12664,9 +12779,9 @@ "dev": true }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -14427,9 +14542,9 @@ "dev": true }, "tsutils": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.18.0.tgz", - "integrity": "sha512-D9Tu8nE3E7D1Bsf/V29oMHceMf+gnVO+pDguk/A5YRo1cLpkiQ48ZnbbS57pvvHeY+OIeNQx1vf4ASPlEtRpcA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" diff --git a/examples/typed/package.json b/examples/typed/package.json index b1e0d3b2..d1580416 100644 --- a/examples/typed/package.json +++ b/examples/typed/package.json @@ -1,15 +1,14 @@ { - "name": "typed", - "description": "", - "version": "1.0.0", "author": "", - "boltzmann": { - "version": "0.5.3", - "githubci": false, - "ping": true, - "status": true, - "typescript": true + "description": "This project gives you the random cat names you didn't realize you needed, implemented in TypeScript. `npm start` to run the project, then visit either of the two provided endpoints to get the name of your next cat:", + "directories": { + "test": "tests" }, + "keywords": [], + "license": "ISC", + "main": "index.js", + "name": "typed", + "version": "1.0.0", "dependencies": { "@entropic/bole": "^4.0.1", "@hapi/iron": "^6.0.0", @@ -46,8 +45,8 @@ "@types/hapi__shot": "^4.1.1", "@types/tap": "^15.0.0", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -63,9 +62,6 @@ "ts-node": "^9.1.1", "typescript": "^4.2.3" }, - "keywords": [], - "license": "ISC", - "main": "index.js", "scripts": { "boltzmann:docs": "npx boltzmann-cli --docs", "boltzmann:routes": "node -r ts-node/register -e 'require(\"./boltzmann\").printRoutes()'", @@ -77,5 +73,12 @@ "pretest": "tsc --noEmit", "start": "nodemon ./boltzmann.ts", "test": "cross-env TS_NODE_FILES=true TS_NODE_PROJECT=./tsconfig.json c8 tap --ts --no-cov tests/" + }, + "boltzmann": { + "version": "0.6.0", + "githubci": false, + "ping": true, + "status": true, + "typescript": true } -} +} \ No newline at end of file diff --git a/examples/typed/types/honeycomb-beeline.d.ts b/examples/typed/types/honeycomb-beeline.d.ts new file mode 100644 index 00000000..6d575bbe --- /dev/null +++ b/examples/typed/types/honeycomb-beeline.d.ts @@ -0,0 +1,20 @@ +declare module 'honeycomb-beeline' { + interface Fn { + (...args: any[]): any + } + + interface Beeline { + (config: Record): void + startSpan: (opts?: Record) => string + unmarshalTraceContext(string): any + finishSpan: (_: string) => void + startTrace: (opts?: Record, _?: string, _?: string, _?: string) => string + finishTrace: (_: string) => void + bindFunctionToTrace(...args: Parameters): ReturnType + addContext: (opts?: Record) => void + addTraceContext: (opts?: Record) => void + } + + declare const beeline: Beeline + export = beeline +} diff --git a/examples/website/boltzmann.js b/examples/website/boltzmann.js index d6be577c..3f429c0b 100755 --- a/examples/website/boltzmann.js +++ b/examples/website/boltzmann.js @@ -2,6 +2,346 @@ /* eslint-disable */ /* c8 ignore file */ 'use strict'; +<<<<<<< HEAD +======= +/**/ +// Dependencies used downstream - it's worth your time to look at how these +// are treated in prelude.ts! +const bole = require("@entropic/bole"); +// We continue to support beelines... +const beeline = require("honeycomb-beeline"); +// ...but are migrating to OpenTelemetry: +const grpc = require("@grpc/grpc-js"); +const otel = require("@opentelemetry/api"); +const otelCore = require("@opentelemetry/core"); +const { OTLPTraceExporter } = require("@opentelemetry/exporter-trace-otlp-grpc"); +const otelResources = require("@opentelemetry/resources"); +const { NodeSDK: OtelSDK } = require("@opentelemetry/sdk-node"); +const otelTraceBase = require("@opentelemetry/sdk-trace-base"); +const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); +const otelSemanticConventions = require("@opentelemetry/semantic-conventions"); +const { DnsInstrumentation: OtelDnsInstrumentation } = require("@opentelemetry/instrumentation-dns"); +const { HttpInstrumentation: OtelHttpInstrumentation } = require("@opentelemetry/instrumentation-http"); +void ``; +void ``; +class HoneycombError extends Error { +} +const _OtelSpanProcessor = otelTraceBase.SimpleSpanProcessor; +class HoneycombSpanProcessor extends _OtelSpanProcessor { + constructor(_exporter) { + super(_exporter); + } + // We want every span in the process to contain a couple of extra attributes. + // Right now that's just service_name (for backwards compatibility with + // beeline) and a trace type (so we can detect whether a service is using + // beeline or otel). This could theoretically be extended to allow + // customization a la beeline.addTraceContext, but that problem is really + // hairy and there are a lot of good reasons to add most attributes to + // just the active span. + onStart(span, _) { + span.setAttribute('service_name', span.resource.attributes['service.name']); + span.setAttribute('boltzmann.honeycomb.trace_type', 'otel'); + otelTraceBase.SimpleSpanProcessor.prototype.onStart.call(this, span); + } + onEnd(span) { + otelTraceBase.SimpleSpanProcessor.prototype.onEnd.call(this, span); + } +} +class HoneycombTraceExporter extends OTLPTraceExporter { + constructor(config = {}) { + super(config); + this._honeycomb = config.honeycomb; + } + log(message) { + if (this._honeycomb) { + this._honeycomb.log(message); + } + } + send(objects, onSuccess, onError) { + this.log(`sending ${objects.length} spans to ${this.url}`); + super.send(objects, () => { + this.log(`successfully send ${objects.length} spans to ${this.url}`); + return onSuccess(); + }, (error) => { + this.log(`error while sending ${objects.length} spans: ${error}`); + return onError(error); + }); + } +} +const defaultOtelFactories = { + metadata(writeKey, dataset) { + const metadata = new grpc.Metadata(); + metadata.set('x-honeycomb-team', writeKey); + metadata.set('x-honeycomb-dataset', dataset); + return metadata; + }, + // create a Sampler object, which is used to tune + // the sampling rate + sampler(sampleRate) { + return new otelCore.ParentBasedSampler({ + root: new otelCore.TraceIdRatioBasedSampler(sampleRate) + }); + }, + resource(serviceName) { + return new otelResources.Resource({ + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName + }); + }, + // It provides tracers! + tracerProvider(resource, sampler) { + return new NodeTracerProvider({ resource, sampler }); + }, + // Export traces to an OTLP endpoint with GRPC + traceExporter(url, metadata, honeycomb) { + return new HoneycombTraceExporter({ + url, + credentials: grpc.credentials.createSsl(), + metadata, + honeycomb + }); + }, + // Process spans, using the supplied trace exporter to + // do the actual exporting. + spanProcessor(traceExporter) { + return new HoneycombSpanProcessor(traceExporter); + }, + instrumentations() { + // Any paths we add here will get no traces whatsoever. This is + // appropriate for the ping route, which should never trace. + const ignoreIncomingPaths = [ + '/monitor/ping' + ]; + // OpenTelemetry attempts to auto-collect GCE metadata, causing traces + // we don't care about. We do our best to ignore them by independently + // calculating which endpoints it's going to try to call. + // + // See: https://github.com/googleapis/gcp-metadata/blob/main/src/index.ts#L26-L44 + const ignoreOutgoingUrls = [ + /^https?:\/\/169\.254\.169\.254/, + /^https?:\/\/metadata\.google\.internal/, + ]; + let gceBase = process.env.GCE_METADATA_IP || process.env.GCE_METADATA_HOST || null; + if (gceBase) { + if (!/^https?:\/\//.test(gceBase)) { + gceBase = `http://${gceBase}`; + } + ignoreOutgoingUrls.push(new RegExp(`^${gceBase}`)); + } + let is = [ + new OtelDnsInstrumentation({}), + // NOTE: This instrumentation creates the default "trace" span and manages + // header propagation! See the honeycomb trace middleware for more + // details. + new OtelHttpInstrumentation({ + // TODO: These fields are expected to become deprecated in the + // near future... + ignoreIncomingPaths, + ignoreOutgoingUrls + }), + ]; + void ``; + void ``; + return is; + }, + // The SDK will take a service name, instrumentations + // and a trace exporter and give us a stateful singleton. + // This is that singleton! + sdk(resource, instrumentations, traceExporter) { + return new OtelSDK({ + resource, + traceExporter, + instrumentations + }); + } +}; +// Let's GOOOOOOO +class Honeycomb { + constructor(options, overrides = {}) { + this.options = options; + this.features = { + honeycomb: !options.disable, + beeline: !options.disable && !options.otel, + otel: options.otel || false + }; + this.initialized = false; + this.started = false; + this.tracerProvider = null; + this.traceExporter = null; + this.spanProcessor = null; + this.instrumentations = null; + this.sdk = null; + this.factories = { + ...defaultOtelFactories, + ...(overrides || {}) + }; + this.logger = null; + } + get tracer() { + // TODO: Can we do better than hard-coding 1.0.0? + return otel.trace.getTracer('boltzmann', '1.0.0'); + } + // We (usually) load options from the environment. Unlike with Options, + // we do a lot of feature detection here. + static fromEnv(serviceName, env = process.env, overrides = {}) { + return new Honeycomb(Honeycomb.parseEnv(serviceName, env), overrides); + } + // serviceName is defined in the prelude, so rather than doing the same + // logic twice we let the prelude inject it when creating the honeycomb + // object. + static parseEnv(serviceName, env = process.env) { + // If there's no write key we won't get very far anyway + const disable = !env.HONEYCOMB_WRITEKEY; + let otel = false; + const writeKey = env.HONEYCOMB_WRITEKEY || null; + const dataset = env.HONEYCOMB_DATASET || null; + const apiHost = env.HONEYCOMB_API_HOST || null; + let sampleRate = 1; + sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1); + if (isNaN(sampleRate)) { + Honeycomb.log(`Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` + + 'defaulting to 1'); + sampleRate = 1; + } + // If the API host is a grpc:// endpoint, we feature switch to + // OpenTelemetry. There are prior uses of this variable here but + // they should've been using https://. + if (!disable && apiHost) { + otel = /^grpc:\/\//.test(apiHost); + } + return { + serviceName, + disable, + otel, + writeKey, + dataset, + apiHost, + sampleRate + }; + } + // Initialize Honeycomb! Stands up the otel node SDK if enabled, + // otherwise sets up the beeline library. + // This needs to occur before any imports you want instrumentation + // to be aware of. This step is separated from the constructor if only because + // there are irreversible side effects galore. + init() { + if (!this.features.honeycomb) { + this.initialized = true; + return; + } + try { + const writeKey = this.writeKey; + const dataset = this.dataset; + const sampleRate = this.options.sampleRate || 1; + const serviceName = this.options.serviceName; + if (!this.features.otel) { + beeline({ writeKey, dataset, sampleRate, serviceName }); + this.initialized = true; + return; + } + const f = this.factories; + const apiHost = this.apiHost; + const metadata = f.metadata(writeKey, dataset); + const resource = f.resource(serviceName); + const sampler = f.sampler(sampleRate); + const exporter = f.traceExporter(apiHost, metadata, this); + const processor = f.spanProcessor(exporter); + const instrumentations = f.instrumentations(); + const provider = f.tracerProvider(resource, sampler); + provider.addSpanProcessor(processor); + provider.register(); + const sdk = f.sdk(resource, instrumentations, exporter); + this.traceExporter = exporter; + this.spanProcessor = processor; + this.instrumentations = instrumentations; + this.tracerProvider = provider; + this.sdk = sdk; + this.initialized = true; + } + catch (err) { + if (err instanceof HoneycombError) { + this.log(err); + return; + } + throw err; + } + } + // Start the OpenTelemetry SDK. If using beelines, this is + // a no-op. This needs to happen before anything happens in + // the entrypoint and is an async operation. + async start() { + let exitCode = 0; + const sdk = this.sdk; + const die = async (err) => { + this.log(err); + exitCode = 1; + await shutdown(); + }; + const shutdown = async () => { + await this.stop(); + process.exit(exitCode); + }; + if (sdk) { + process.once('SIGTERM', shutdown); + process.once('beforeExit', shutdown); + process.once('uncaughtException', die); + process.once('unhandledRejection', async (reason, _) => { + await die(reason); + }); + await sdk.start(); + } + this.started = true; + } + async stop() { + const sdk = this.sdk; + if (!sdk) + return; + try { + await sdk.shutdown(); + } + catch (err) { + this.log(err); + } + } + // These accessors are type guards that ensure you're working + // with a defined/non-null property. It's a bit of 6-to-1 and + // half a dozen on the other, because you trade ifs for + // try/catches and honeycomb can basically never throw. Even + // so, it saves a little bit of boilerplate. + get writeKey() { + if (this.options.writeKey) { + return this.options.writeKey; + } + throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!'); + } + get dataset() { + if (this.options.dataset) { + return this.options.dataset; + } + throw new HoneycombError('HONEYCOMB_DATASET is undefined!'); + } + get apiHost() { + if (this.options.apiHost) { + return this.options.apiHost; + } + throw new HoneycombError('HONEYCOMB_API_HOST is undefined!'); + } + // We *do* have a handful of logging use cases... + static log(message) { + void ``; + } + log(message) { + void ``; + } +} +module.exports = {...module.exports, beeline, bole, grpc, otel, otelCore, OTLPTraceExporter, otelResources, OtelSDK, otelTraceBase, NodeTracerProvider, otelSemanticConventions, OtelDnsInstrumentation, OtelHttpInstrumentation, +// +// + }; +module.exports = {...module.exports, defaultOtelFactories, Honeycomb, HoneycombError, HoneycombSpanProcessor, }; +void ``; + +'use strict'; +>>>>>>> 18b8135 (Update examples to use current release build) // Boltzmann v0.5.3 /**/ const serviceName = _getServiceName(); @@ -13,8 +353,13 @@ function _getServiceName() { return 'boltzmann'; } } +/**/ void ``; +<<<<<<< HEAD const beeline = require("honeycomb-beeline"); +======= +void ``; +>>>>>>> 18b8135 (Update examples to use current release build) if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET; } @@ -27,12 +372,19 @@ if (!process.env.HONEYCOMB_SAMPLE_RATE && process.env.HONEYCOMBIO_SAMPLE_RATE) { if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM; } +<<<<<<< HEAD beeline({ writeKey: process.env.HONEYCOMB_WRITEKEY, dataset: process.env.HONEYCOMB_DATASET, sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, serviceName, }); +======= +let honeycomb = Honeycomb.fromEnv(serviceName, process.env); +void ``; +honeycomb.init(); +module.exports = {...module.exports, honeycomb }; +>>>>>>> 18b8135 (Update examples to use current release build) const onHeaders = require("on-headers"); void ``; const ships = require("culture-ships"); @@ -69,7 +421,6 @@ const accepts = require("accepts"); const { promises: fs } = require("fs"); const crypto = require("crypto"); const http = require("http"); -const bole = require("@entropic/bole"); const path = require("path"); const os = require("os"); void ``; @@ -144,32 +495,68 @@ async function buildMiddleware(middleware, router) { return rhs(await lhs); }, Promise.resolve(router)); } +function handlerSpanName(handler) { + return `handler: ${handler.name || ''}`; +} async function handler(context) { const handler = context.handler; // +<<<<<<< HEAD let span = null; if (process.env.HONEYCOMB_WRITEKEY) { span = beeline.startSpan({ name: `handler: ${handler.name}`, +======= + let beelineSpan = null; + let otelSpan = null; + let traceContext = otel.context.active(); + if (honeycomb.features.beeline) { + beelineSpan = beeline.startSpan({ + name: handlerSpanName(handler), +>>>>>>> 18b8135 (Update examples to use current release build) 'handler.name': handler.name, 'handler.method': String(handler.method), 'handler.route': handler.route, 'handler.version': handler.version || '*', - 'handler.decorators': String(handler.decorators) + 'handler.decorators': String(handler.decorators), }); } + else if (honeycomb.features.otel) { + otelSpan = honeycomb.tracer.startSpan(handlerSpanName(handler), { + attributes: { + [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: String(handler.method), + [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, + 'boltzmann.http.handler.name': handler.name || '', + 'boltzmann.http.handler.version': handler.version || '*', + 'boltzmann.http.handler.decorators': String(handler.decorators) + }, + kind: otel.SpanKind.SERVER + }, traceContext); + traceContext = otel.trace.setSpan(traceContext, otelSpan); + } try { - // - return await handler(context); - // + return await otel.context.with(traceContext, async () => { + // + return await handler(context); + // + }); } finally { +<<<<<<< HEAD if (process.env.HONEYCOMB_WRITEKEY && span !== null) { beeline.finishSpan(span); +======= + if (beelineSpan !== null) { + beeline.finishSpan(beelineSpan); + } + else if (otelSpan !== null) { + otelSpan.end(); +>>>>>>> 18b8135 (Update examples to use current release build) } } // } +void ``; void ``; async function routes(handlers) { @@ -228,6 +615,7 @@ class Context { this.params = {}; this.id = String(request.headers['x-honeycomb-trace'] || request.headers['x-request-id'] || + request.headers['traceparent'] || uuid.v4()); this._loadSession = async () => { throw new Error('To use context.session, attach session middleware to your app'); @@ -416,8 +804,25 @@ class Context { /**[Docs]("https://www.boltzmann.dev/en/latest/docs/reference/02-handlers#traceURL")*/ get traceURL() { const url = new URL(`https://ui.honeycomb.io/${process.env.HONEYCOMB_TEAM}/datasets/${process.env.HONEYCOMB_DATASET}/trace`); +<<<<<<< HEAD url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']); url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime / 1000 - 1))); +======= + if (honeycomb.features.beeline) { + url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']); + url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime / 1000 - 1))); + } + else if (honeycomb.features.otel) { + const spanCtx = this._honeycombTrace.spanContext(); + let startTime = Date.now() - 60000; + if (this._honeycombTrace.startTime) { + const [startSeconds, startNanos] = this._honeycombTrace.startTime; + startTime = startSeconds * 1000 + startNanos / 1000; + } + url.searchParams.set('trace_id', spanCtx.traceId); + url.searchParams.set('trace_start_ts', String(startTime)); + } +>>>>>>> 18b8135 (Update examples to use current release build) return String(url); } // @@ -1231,10 +1636,58 @@ function enforceInvariants() { void ``; +function traceName(method, pathname) { + // This is how OpenTelemetry names request-level spans by default, so we + // go with the grain + if (honeycomb.features.otel) { + return `HTTP ${method}`; + } + // This is what the beeline traces are named today + return `${method} ${pathname}`; +} +function middlewareSpanName(name) { + return `mw: ${name || ''}`; +} +function paramSpanAttribute(param) { + return `boltzmann.http.request.param.${param}`; +} +function traceAttribute(key) { + return `app.${key}`; +} +module.exports = {...module.exports, traceName, middlewareSpanName, paramSpanAttribute }; +// The trace middleware creates a request-level span or trace. It delegates +// to either a beeline or OpenTelemetry implementation depending on how +// the honeycomb object is configured. +trace.doNotTrace = true; function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { +<<<<<<< HEAD if (!process.env.HONEYCOMB_WRITEKEY) { +======= + if (!honeycomb.features.honeycomb || !honeycomb.initialized) { +>>>>>>> 18b8135 (Update examples to use current release build) return (next) => (context) => next(context); } + if (honeycomb.features.beeline) { + return beelineTrace({ headerSources }); + } + // Note: headerSources is not respected by otel tracing! + return otelTrace(); +} +// The spans middleware creates a span on top of nested middleware, injected +// between middlewares in the core buildMiddleware step. It delegates to +// either a beeline or OpenTelemetry implementation depending on how the +// honeycomb object is configured. +function honeycombMiddlewareSpans({ name, doNotTrace } = {}) { + if (!honeycomb.features.honeycomb || doNotTrace) { + return (next) => (context) => next(context); + } + if (honeycomb.features.beeline) { + return beelineMiddlewareSpans({ name }); + } + return otelMiddlewareSpans({ name }); +} +// Beeline implementations of trace and span, respectively. +function beelineTrace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { const schema = require('honeycomb-beeline/lib/schema'); const tracker = require('honeycomb-beeline/lib/async_tracker'); return function honeycombTrace(next) { @@ -1243,7 +1696,7 @@ function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) const trace = beeline.startTrace({ [schema.EVENT_TYPE]: 'boltzmann', [schema.PACKAGE_VERSION]: '1.0.0', - [schema.TRACE_SPAN_NAME]: `${context.method} ${context.url.pathname}${context.url.search}`, + [schema.TRACE_SPAN_NAME]: traceName(context.method, context.url.pathname), [schema.TRACE_ID_SOURCE]: traceContext.source, 'request.host': context.host, 'request.original_url': context.url.href, @@ -1251,7 +1704,10 @@ function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) 'request.method': context.method, 'request.scheme': context.url.protocol, 'request.path': context.url.pathname, - 'request.query': context.url.search + 'request.query': context.url.search, + // for forward compatibility with OpenTelemetry traces + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'boltzmann.honeycomb.trace_type': 'beeline' }, traceContext.traceId, traceContext.parentSpanId, traceContext.dataset); if (isDev()) { context._honeycombTrace = trace; @@ -1302,14 +1758,18 @@ function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) }; } } +<<<<<<< HEAD function honeycombMiddlewareSpans({ name } = {}) { if (!process.env.HONEYCOMB_WRITEKEY) { return (next) => (context) => next(context); } +======= +function beelineMiddlewareSpans({ name } = {}) { +>>>>>>> 18b8135 (Update examples to use current release build) return function honeycombSpan(next) { return async (context) => { const span = beeline.startSpan({ - name: `mw: ${name}` + name: middlewareSpanName(name) }); // Assumption: the invariant middleware between each layer // will ensure that no errors are thrown from next(). @@ -1319,6 +1779,75 @@ function honeycombMiddlewareSpans({ name } = {}) { }; }; } +/* + * ┏┓ + * ┃┃╱╲ in + * ┃╱╱╲╲ this + * ╱╱╭╮╲╲house + * ▔▏┗┛▕▔ we + * ╱▔▔▔▔▔▔▔▔▔▔╲ + * trace with opentelemetry + * ╱╱┏┳┓╭╮┏┳┓ ╲╲ + * ▔▏┗┻┛┃┃┗┻┛▕▔ + */ +function otelTrace() { + return function honeycombTrace(next) { + return (context) => { + let traceContext = otel.context.active(); + // Typically, HTTP auto-instrumentation will create a parent span for us + let span = otel.trace.getSpan(traceContext); + // startSpan should always return a span, but as far as typescript is + // concerned the span could still be undefined. We could assert that it + // exists, but throwing instrumentation-related errors is poor form. + if (span) { + // for backwards compatibility with beeline traces + span.setAttribute('boltzmann.http.query', context.url.search); + traceContext = otel.trace.setSpan(traceContext, span); + if (isDev()) { + context._honeycombTrace = span; + } + } + else { + honeycomb.log(new assert.AssertionError({ + message: 'no parent span found or created', + actual: span, + expected: true, + operator: '==' + })); + } + onHeaders(context._response, function () { + const handler = context.handler; + if (!span) { + return; + } + span.setAttribute(otelSemanticConventions.SemanticResourceAttributes.SERVICE_VERSION, handler.version); + Object.entries(context.params).forEach(([key, value]) => { + if (span) { + span.setAttribute(paramSpanAttribute(key), value); + } + }); + }); + return otel.context.with(traceContext, () => { + return next(context); + }); + }; + }; +} +function otelMiddlewareSpans({ name } = {}) { + return function honeycombSpan(next) { + return async (context) => { + let traceContext = otel.context.active(); + const span = honeycomb.tracer.startSpan(middlewareSpanName(name), { kind: otel.SpanKind.SERVER }, traceContext); + traceContext = otel.trace.setSpan(traceContext, span); + const result = await otel.context.with(traceContext, () => { + return next(context); + }); + span.end(); + return result; + }; + }; +} +void ``; void ``; function authenticateJWT({ scheme = 'Bearer', publicKey = process.env.AUTHENTICATION_KEY, algorithms = ['RS256'], storeAs = 'user' } = {}) { @@ -1332,7 +1861,11 @@ function authenticateJWT({ scheme = 'Bearer', publicKey = process.env.AUTHENTICA if (!publicKey) { throw new Error(`To authenticate JWTs you must pass the path to a public key file in either the environment variable "AUTHENTICATION_KEY" or the publicKey config field +<<<<<<< HEAD https://www.boltzmann.dev/en/docs/0.5.3/reference/middleware/#authenticatejwt +======= +https://www.boltzmann.dev/en/docs/v0.5.3/reference/middleware/#authenticatejwt +>>>>>>> 18b8135 (Update examples to use current release build) `.trim().split('\n').join(' ')); } return async (next) => { @@ -1342,7 +1875,11 @@ https://www.boltzmann.dev/en/docs/0.5.3/reference/middleware/#authenticatejwt boltzmann authenticateJWT middleware cannot read public key at "${publicKey}". Is the AUTHENTICATION_KEY environment variable set correctly? Is the file readable? +<<<<<<< HEAD https://www.boltzmann.dev/en/docs/0.5.3/reference/middleware/#authenticatejwt +======= + https://www.boltzmann.dev/en/docs/v0.5.3/reference/middleware/#authenticatejwt +>>>>>>> 18b8135 (Update examples to use current release build) `.trim().split('\n').join(' ')); throw err; }) @@ -1386,6 +1923,22 @@ function log({ logger = bole(process.env.SERVICE_NAME || 'boltzmann'), level = p stream = pretty; } bole.output({ level, stream }); + void ``; + honeycomb.logger = bole('boltzmann:honeycomb'); + if (honeycomb.features.beeline) { + honeycomb.logger.warn('Honeycomb beeline support is deprecated and will be removed in a future version. ' + + 'To use OpenTelemetry, set HONEYCOMB_API_HOST to a grpc:// endpoint.'); + } + honeycomb.log(`serviceName: ${honeycomb.options.serviceName}`); + for (let [key, value] of Object.entries(honeycomb.features)) { + honeycomb.log(`${key}: ${value}`); + } + const hasWriteKey = Boolean(honeycomb.options.writeKey && honeycomb.options.writeKey.length); + honeycomb.log(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`); + honeycomb.log(`dataset: ${honeycomb.options.dataset}`); + honeycomb.log(`apiHost: ${honeycomb.options.apiHost}`); + honeycomb.log(`sampleRate: ${honeycomb.options.sampleRate}`); + void ``; return function logMiddleware(next) { return async function inner(context) { const result = await next(context); @@ -1413,6 +1966,7 @@ void ``; void ``; +handlePing.doNotTrace = true; function handlePing() { return (next) => (context) => { if (context.url.pathname === '/monitor/ping') { @@ -2645,9 +3199,9 @@ const middleware = { * ```` * * The `id` fields in logs is the value of the request-id, available on the context object as the `id` - * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace` - * and `x-request-id` before falling back to generating a request id using a short randomly-selected - * string. + * field. This is set by examining headers for an existing id. Boltzmann consults `x-honeycomb-trace`, + * `x-request-id` and `traceparent` before falling back to generating a request id using a short + * randomly-selected string. * * To log from your handlers, you might write code like this: * @@ -2920,46 +3474,50 @@ module.exports = {...module.exports, Context, main: runserver, middleware, body void ``; /* c8 ignore next */ if (require.main === module && !process.env.TAP) { - function passthrough() { - return (next) => (context) => next(context); - } - runserver({ - middleware: _requireOr('./middleware', []) - .then(_processMiddleware) - .then((mw) => { - // - // - const acc = []; - // - acc.push(trace); - // - // - acc.push(handlePing); - // - // - acc.push(log); - // - // - acc.push(...mw); - // - acc.push(handleStatus); - // - return acc.filter(Boolean); - }), - }) - .then((server) => { - server.listen(Number(process.env.PORT) || 5000, () => { - const addrinfo = server.address(); - if (!addrinfo) { - return; - } - bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + // + honeycomb.start().then(run); + function run() { + // + runserver({ + middleware: _requireOr('./middleware', []) + .then(_processMiddleware) + .then((mw) => { + // + // + const acc = []; + // + acc.push(handlePing); + // + // + acc.push(trace); + // + // + acc.push(log); + // + // + acc.push(...mw); + // + acc.push(handleStatus); + // + return acc.filter(Boolean); + }), + }) + .then((server) => { + server.listen(Number(process.env.PORT) || 8000, () => { + const addrinfo = server.address(); + if (!addrinfo) { + return; + } + bole('boltzmann:server').info(`now listening on port ${typeof addrinfo == 'string' ? addrinfo : addrinfo.port}`); + }); + }) + .catch((err) => { + console.error(err.stack); + process.exit(1); }); - }) - .catch((err) => { - console.error(err.stack); - process.exit(1); - }); + // + } + // } diff --git a/examples/website/package-lock.json b/examples/website/package-lock.json index 6c0b7ab1..5f715335 100644 --- a/examples/website/package-lock.json +++ b/examples/website/package-lock.json @@ -10,7 +10,25 @@ "license": "ISC", "dependencies": { "@entropic/bole": "^4.0.1", +<<<<<<< HEAD "@hapi/iron": "^6.0.0", +======= + "@grpc/grpc-js": "^1.5.0", + "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", +>>>>>>> 18b8135 (Update examples to use current release build) "@types/uuid": "^8.3.0", "accepts": "^1.3.7", "ajv": "^8.0.5", @@ -32,8 +50,13 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", +<<<<<<< HEAD "@typescript-eslint/eslint-plugin": "^4.11.0", "@typescript-eslint/parser": "^4.11.0", +======= + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", +>>>>>>> 18b8135 (Update examples to use current release build) "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -641,6 +664,39 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, +<<<<<<< HEAD +======= + "node_modules/@grpc/grpc-js": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", + "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -822,12 +878,21 @@ } }, "node_modules/@nodelib/fs.scandir": { +<<<<<<< HEAD "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.4", +======= + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", +>>>>>>> 18b8135 (Update examples to use current release build) "run-parallel": "^1.1.9" }, "engines": { @@ -835,21 +900,36 @@ } }, "node_modules/@nodelib/fs.stat": { +<<<<<<< HEAD "version": "2.0.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", +======= + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { +<<<<<<< HEAD "version": "1.2.6", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.4", +======= + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", +>>>>>>> 18b8135 (Update examples to use current release build) "fastq": "^1.6.0" }, "engines": { @@ -857,16 +937,44 @@ } }, "node_modules/@opentelemetry/api": { +<<<<<<< HEAD "version": "0.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", "dependencies": { "@opentelemetry/context-base": "^0.9.0" }, +======= + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8.0.0" } }, +<<<<<<< HEAD +======= + "node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@opentelemetry/context-base": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.9.0.tgz", @@ -876,6 +984,7 @@ } }, "node_modules/@opentelemetry/core": { +<<<<<<< HEAD "version": "0.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", @@ -888,6 +997,346 @@ "node": ">=8.5.0" } }, +======= + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", + "dependencies": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.1.tgz", + "integrity": "sha512-NwLMHthT7/YncTZcfYbb24n8z/mFYSWPlZkWOhG6XVRAE0KsDLlMsrwvha5Yg/4vhv4nj2qLM9bk5+zA5a/ZfA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.3.tgz", + "integrity": "sha512-jobfcnSxuBBevbiqOhisvTCe3N7/mKMFL5laH1hQ3PPmUC61h/MXOoHx+yg5tTQPXhgfi1JiBXa9nZxxPItH5Q==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.27.0", + "graphql": "^15.5.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", + "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.3.tgz", + "integrity": "sha512-0bhy8L1JZfqGqMjaPu1tV3rBsmtN42+wycJYhxMBbaB4E0ZDshDLnBHn3AeLMPLtFUqiyyn48JluuBfD7KPkhA==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.2.tgz", + "integrity": "sha512-CuFqdUGfQtVJ6paaasUaUN6dHxbu0CpUFnHws4Vj/K5SDUxR4l3/Vy5SvMiQ21mRCkeDDDbnw8cPEoA/xGKTrg==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.2" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -928,11 +1377,29 @@ "dev": true }, "node_modules/@types/json-schema": { +<<<<<<< HEAD "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, +======= + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "node_modules/@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@types/uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", @@ -940,6 +1407,7 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { +<<<<<<< HEAD "version": "4.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz", "integrity": "sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w==", @@ -956,14 +1424,38 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" +======= + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { +<<<<<<< HEAD "@typescript-eslint/parser": "^4.0.0", "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" +======= + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "peerDependenciesMeta": { "typescript": { @@ -971,6 +1463,7 @@ } } }, +<<<<<<< HEAD "node_modules/@typescript-eslint/experimental-utils": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz", @@ -1008,13 +1501,41 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" +======= + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { +<<<<<<< HEAD "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" +======= + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "peerDependenciesMeta": { "typescript": { @@ -1023,6 +1544,7 @@ } }, "node_modules/@typescript-eslint/scope-manager": { +<<<<<<< HEAD "version": "4.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz", "integrity": "sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ==", @@ -1033,12 +1555,25 @@ }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" +======= + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, +<<<<<<< HEAD "node_modules/@typescript-eslint/types": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.13.0.tgz", @@ -1046,6 +1581,41 @@ "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" +======= + "node_modules/@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", @@ -1053,6 +1623,7 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { +<<<<<<< HEAD "version": "4.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz", "integrity": "sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg==", @@ -1069,6 +1640,23 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" +======= + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", @@ -1080,6 +1668,7 @@ } } }, +<<<<<<< HEAD "node_modules/@typescript-eslint/visitor-keys": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz", @@ -1091,6 +1680,70 @@ }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" +======= + "node_modules/@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", @@ -1098,12 +1751,21 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { +<<<<<<< HEAD "version": "2.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true, "engines": { "node": ">=10" +======= + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +>>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/a-sync-waterfall": { @@ -1117,6 +1779,20 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, +<<<<<<< HEAD +======= + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1456,6 +2132,17 @@ "tweetnacl": "^0.14.3" } }, +<<<<<<< HEAD +======= + "node_modules/bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "engines": { + "node": "*" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -1898,7 +2585,10 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1909,7 +2599,10 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -1917,14 +2610,21 @@ "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", +<<<<<<< HEAD "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true +======= + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" +>>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -1933,7 +2633,10 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1947,7 +2650,10 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-regex": "^5.0.0" }, @@ -2206,12 +2912,28 @@ "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" }, "node_modules/debug": { +<<<<<<< HEAD "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { "ms": "^2.1.1" +======= + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } +>>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/decamelize": { @@ -2314,6 +3036,7 @@ "node": ">=8" } }, +<<<<<<< HEAD "node_modules/dir-glob/node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -2323,6 +3046,8 @@ "node": ">=8" } }, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2447,7 +3172,10 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=6" } @@ -2589,12 +3317,21 @@ } }, "node_modules/eslint-scope": { +<<<<<<< HEAD "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "dependencies": { "esrecurse": "^4.1.0", +======= + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", +>>>>>>> 18b8135 (Update examples to use current release build) "estraverse": "^4.1.1" }, "engines": { @@ -2874,6 +3611,17 @@ "node": ">=0.10.0" } }, +<<<<<<< HEAD +======= + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -2911,13 +3659,20 @@ "dev": true }, "node_modules/fast-glob": { +<<<<<<< HEAD "version": "3.2.4", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", +======= + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", +<<<<<<< HEAD "glob-parent": "^5.1.0", "merge2": "^1.3.0", "micromatch": "^4.0.2", @@ -2925,6 +3680,14 @@ }, "engines": { "node": ">=8" +======= + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" +>>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/fast-json-stable-stringify": { @@ -2944,9 +3707,15 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "node_modules/fastq": { +<<<<<<< HEAD "version": "1.10.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", +======= + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3178,6 +3947,14 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, +<<<<<<< HEAD +======= + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/function-loop": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", @@ -3200,6 +3977,59 @@ "is-windows": "^1.0.2" } }, +<<<<<<< HEAD +======= + "node_modules/gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3213,7 +4043,10 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3325,9 +4158,15 @@ } }, "node_modules/glob-parent": { +<<<<<<< HEAD "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", +======= + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", +>>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "dependencies": { "is-glob": "^4.0.1" @@ -3364,16 +4203,28 @@ } }, "node_modules/globby": { +<<<<<<< HEAD "version": "11.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", +======= + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", +<<<<<<< HEAD "fast-glob": "^3.1.1", "ignore": "^5.1.4", "merge2": "^1.3.0", +======= + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", +>>>>>>> 18b8135 (Update examples to use current release build) "slash": "^3.0.0" }, "engines": { @@ -3384,9 +4235,15 @@ } }, "node_modules/globby/node_modules/ignore": { +<<<<<<< HEAD "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", +======= + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "engines": { "node": ">= 4" @@ -3420,6 +4277,17 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, +<<<<<<< HEAD +======= + "node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "engines": { + "node": ">= 10.x" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3465,6 +4333,20 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, +<<<<<<< HEAD +======= + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/has-ansi": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", @@ -3527,6 +4409,33 @@ "shimmer": "^1.2.1" } }, +<<<<<<< HEAD +======= + "node_modules/honeycomb-beeline/node_modules/@opentelemetry/api": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", + "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", + "dependencies": { + "@opentelemetry/context-base": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/honeycomb-beeline/node_modules/@opentelemetry/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", + "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", + "dependencies": { + "@opentelemetry/api": "^0.9.0", + "@opentelemetry/context-base": "^0.9.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.5.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3752,6 +4661,20 @@ "is-ci": "bin.js" } }, +<<<<<<< HEAD +======= + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3771,9 +4694,15 @@ } }, "node_modules/is-glob": { +<<<<<<< HEAD "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", +======= + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", +>>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" @@ -3838,7 +4767,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -4093,6 +5025,17 @@ "node": ">=4" } }, +<<<<<<< HEAD +======= + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -4333,6 +5276,14 @@ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, +<<<<<<< HEAD +======= + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -4369,6 +5320,14 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, +<<<<<<< HEAD +======= + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -4383,6 +5342,14 @@ "node": ">=0.8.6" } }, +<<<<<<< HEAD +======= + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4442,6 +5409,7 @@ } }, "node_modules/micromatch": { +<<<<<<< HEAD "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", @@ -4452,6 +5420,18 @@ }, "engines": { "node": ">=8" +======= + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" +>>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/mime": { @@ -4541,6 +5521,14 @@ "mkdirp": "bin/cmd.js" } }, +<<<<<<< HEAD +======= + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4568,6 +5556,28 @@ "node": ">= 0.4.0" } }, +<<<<<<< HEAD +======= + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -5194,6 +6204,23 @@ "node": ">=8" } }, +<<<<<<< HEAD +======= + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5201,9 +6228,15 @@ "dev": true }, "node_modules/picomatch": { +<<<<<<< HEAD "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", +======= + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", +>>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "engines": { "node": ">=8.6" @@ -5343,6 +6376,34 @@ "node": ">=0.4.0" } }, +<<<<<<< HEAD +======= + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/proxy-agent": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", @@ -5425,6 +6486,29 @@ "url": "https://github.com/sponsors/ljharb" } }, +<<<<<<< HEAD +======= + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -5498,9 +6582,15 @@ } }, "node_modules/regexpp": { +<<<<<<< HEAD "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", +======= + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "engines": { "node": ">=8" @@ -5614,7 +6704,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=0.10.0" } @@ -5627,12 +6720,44 @@ "node": ">=0.10.0" } }, +<<<<<<< HEAD +======= + "node_modules/require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, +<<<<<<< HEAD +======= + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5687,9 +6812,15 @@ "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "node_modules/run-parallel": { +<<<<<<< HEAD "version": "1.1.10", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", +======= + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "funding": [ { @@ -5704,7 +6835,14 @@ "type": "consulting", "url": "https://feross.org/support" } +<<<<<<< HEAD ] +======= + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } +>>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -5725,9 +6863,18 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { +<<<<<<< HEAD "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", +======= + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "bin": { "semver": "bin/semver.js" }, @@ -5761,6 +6908,25 @@ "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" }, +<<<<<<< HEAD +======= + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6209,6 +7375,20 @@ "node": ">=8" } }, +<<<<<<< HEAD +======= + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -8386,6 +9566,14 @@ "node": ">=0.8" } }, +<<<<<<< HEAD +======= + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -8406,9 +9594,15 @@ } }, "node_modules/tsutils": { +<<<<<<< HEAD "version": "3.19.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", +======= + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", +>>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "tslib": "^1.8.1" @@ -8473,6 +9667,23 @@ "is-typedarray": "^1.0.0" } }, +<<<<<<< HEAD +======= + "node_modules/typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -8742,6 +9953,23 @@ "extsprintf": "^1.2.0" } }, +<<<<<<< HEAD +======= + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8837,7 +10065,10 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8854,7 +10085,10 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -8863,7 +10097,10 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "color-convert": "^2.0.1" }, @@ -8878,7 +10115,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "color-name": "~1.1.4" }, @@ -8889,20 +10129,31 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", +<<<<<<< HEAD "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true +======= + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" +>>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", +<<<<<<< HEAD "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true +======= + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" +>>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -8911,7 +10162,10 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8925,7 +10179,10 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-regex": "^5.0.0" }, @@ -8993,7 +10250,10 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=10" } @@ -9022,7 +10282,10 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9040,7 +10303,10 @@ "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=10" } @@ -9049,7 +10315,10 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -9057,14 +10326,21 @@ "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", +<<<<<<< HEAD "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true +======= + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" +>>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -9073,7 +10349,10 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9087,7 +10366,10 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", +<<<<<<< HEAD "dev": true, +======= +>>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-regex": "^5.0.0" }, @@ -9645,6 +10927,27 @@ } } }, + "@grpc/grpc-js": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", + "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + } + }, "@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -9807,38 +11110,46 @@ "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "@opentelemetry/api": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", - "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", - "requires": { - "@opentelemetry/context-base": "^0.9.0" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" + }, + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + }, + "@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "requires": {} }, "@opentelemetry/context-base": { "version": "0.9.0", @@ -9846,15 +11157,242 @@ "integrity": "sha512-4XUS2RoGKla+lqbEBKN4NUmPtJI/+NHVt7EHaw6XxFlBwyZ9HAX61Kk53Hlb6eUYOLOehdVx9Q+gdpamj018iQ==" }, "@opentelemetry/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", - "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", "requires": { - "@opentelemetry/api": "^0.9.0", - "@opentelemetry/context-base": "^0.9.0", - "semver": "^7.1.3" + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.27.0.tgz", + "integrity": "sha512-fFoLoCv9beWRouuhLy8zqnHrPj+Bj89iUbUzcg80cQ4tP3AXKyjWBowk/xHteKsTFbQYkIBhIQOpekyHtExwRw==", + "requires": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + } + }, + "@opentelemetry/exporter-trace-otlp-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", + "integrity": "sha512-ZE8Ns/GGW83E4igrby69shiqEkVo+cULzbm4DprSEMCWrPAL/NBobETFOiOQyBBBgIfrhi5EG6truUiafB1cMQ==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1" + } + }, + "@opentelemetry/instrumentation": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", + "integrity": "sha512-dUwY/VoDptdK8AYigwS3IKblG+unV5xIdV4VQKy+nX5aT3f7vd5PMYs4arCQSYLbLRe0s7GxK6S9dtjai/TsHQ==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + } + }, + "@opentelemetry/instrumentation-dns": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.1.tgz", + "integrity": "sha512-NwLMHthT7/YncTZcfYbb24n8z/mFYSWPlZkWOhG6XVRAE0KsDLlMsrwvha5Yg/4vhv4nj2qLM9bk5+zA5a/ZfA==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.3.2" + } + }, + "@opentelemetry/instrumentation-graphql": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.27.3.tgz", + "integrity": "sha512-jobfcnSxuBBevbiqOhisvTCe3N7/mKMFL5laH1hQ3PPmUC61h/MXOoHx+yg5tTQPXhgfi1JiBXa9nZxxPItH5Q==", + "requires": { + "@opentelemetry/instrumentation": "^0.27.0", + "graphql": "^15.5.1" + } + }, + "@opentelemetry/instrumentation-grpc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.27.0.tgz", + "integrity": "sha512-aFHcAeeLfqoH8PMjmdqEwZwXDJtFSkWmGDBZeH2yrx3KzFMVBB/UJEr1n/ZC6AqfqahL/qqB1N8EnoCoOcs5ig==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/instrumentation-http": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.27.0.tgz", + "integrity": "sha512-Q1dxUt+5d70rbY6jJAC8nwpIQJontmJW94eIS5CsGngvCRYw6tgjLZp2fpVL1o7Lj7uiLpGigeE4EN5Lr2YDFA==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "semver": "^7.3.5" + } + }, + "@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/resource-detector-aws": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.3.tgz", + "integrity": "sha512-0bhy8L1JZfqGqMjaPu1tV3rBsmtN42+wycJYhxMBbaB4E0ZDshDLnBHn3AeLMPLtFUqiyyn48JluuBfD7KPkhA==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-gcp": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.2.tgz", + "integrity": "sha512-CuFqdUGfQtVJ6paaasUaUN6dHxbu0CpUFnHws4Vj/K5SDUxR4l3/Vy5SvMiQ21mRCkeDDDbnw8cPEoA/xGKTrg==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^4.1.4", + "semver": "7.3.5" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + } + }, + "@opentelemetry/sdk-node": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", + "integrity": "sha512-WVk4FfL+weXPFKBDUmJKc0e9xxhpmIB81dW+5Wohu56XAgItbm+cbLf9dH/vu++yMfeLwqfGQeDNGmbMoGAXJg==", + "requires": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "0.27.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "0.27.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "requires": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -9889,11 +11427,21 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, "@types/uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", @@ -9901,93 +11449,129 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz", - "integrity": "sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", + "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.13.0", - "@typescript-eslint/scope-manager": "4.13.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/type-utils": "5.12.1", + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz", - "integrity": "sha512-/ZsuWmqagOzNkx30VWYV3MNB/Re/CGv/7EzlqZo5RegBN8tMuPaBgNK6vPBCQA8tcYrbsrTdbx3ixMRRKEEGVw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } } }, "@typescript-eslint/parser": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.13.0.tgz", - "integrity": "sha512-KO0J5SRF08pMXzq9+abyHnaGQgUJZ3Z3ax+pmqz9vl81JxmTTOUfQmq7/4awVfq09b6C4owNlOgOwp61pYRBSg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.12.1.tgz", + "integrity": "sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz", - "integrity": "sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", + "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", + "integrity": "sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.12.1", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.13.0.tgz", - "integrity": "sha512-/+aPaq163oX+ObOG00M0t9tKkOgdv9lq0IQv/y4SqGkAXmhFmCfgsELV7kOCTb2vVU5VOmVwXBXJTDr353C1rQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz", + "integrity": "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz", - "integrity": "sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", + "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/visitor-keys": "5.12.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", + "integrity": "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.12.1", + "@typescript-eslint/types": "5.12.1", + "@typescript-eslint/typescript-estree": "5.12.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz", - "integrity": "sha512-6RoxWK05PAibukE7jElqAtNMq+RWZyqJ6Q/GdIxaiUj2Ept8jh8+FUVlbq9WxMYxkmEOPvCE5cRSyupMpwW31g==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz", + "integrity": "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.13.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.12.1", + "eslint-visitor-keys": "^3.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -10003,6 +11587,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -10269,6 +11861,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" + }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -10606,7 +12203,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -10616,26 +12212,22 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10646,7 +12238,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -10848,11 +12439,11 @@ "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -10929,14 +12520,6 @@ "dev": true, "requires": { "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } } }, "doctrine": { @@ -11050,8 +12633,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -11272,12 +12854,12 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -11356,6 +12938,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -11390,17 +12977,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -11420,9 +13006,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -11594,6 +13180,11 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "function-loop": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", @@ -11616,6 +13207,46 @@ "is-windows": "^1.0.2" } }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + } + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11625,8 +13256,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-function-location": { "version": "2.0.0", @@ -11718,9 +13348,15 @@ } }, "glob-parent": { +<<<<<<< HEAD "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", +======= + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", +>>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "requires": { "is-glob": "^4.0.1" @@ -11745,23 +13381,23 @@ } }, "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "dependencies": { "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true } } @@ -11791,6 +13427,11 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -11827,6 +13468,14 @@ } } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", @@ -11869,6 +13518,26 @@ "libhoney": "^2.2.1", "on-headers": "^1.0.2", "shimmer": "^1.2.1" + }, + "dependencies": { + "@opentelemetry/api": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", + "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", + "requires": { + "@opentelemetry/context-base": "^0.9.0" + } + }, + "@opentelemetry/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", + "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", + "requires": { + "@opentelemetry/api": "^0.9.0", + "@opentelemetry/context-base": "^0.9.0", + "semver": "^7.1.3" + } + } } }, "html-escaper": { @@ -12052,6 +13721,14 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12065,9 +13742,15 @@ "dev": true }, "is-glob": { +<<<<<<< HEAD "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", +======= + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", +>>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "requires": { "is-extglob": "^2.1.1" @@ -12110,8 +13793,7 @@ "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, "is-typedarray": { "version": "1.0.0", @@ -12309,6 +13991,14 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -12507,6 +14197,11 @@ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -12543,6 +14238,11 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -12554,6 +14254,14 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, +<<<<<<< HEAD +======= + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, +>>>>>>> 18b8135 (Update examples to use current release build) "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -12597,13 +14305,13 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mime": { @@ -12671,6 +14379,11 @@ "minimist": "^1.2.5" } }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12692,6 +14405,14 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -13170,6 +14891,17 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -13177,9 +14909,15 @@ "dev": true }, "picomatch": { +<<<<<<< HEAD "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", +======= + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", +>>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true }, "pkg-dir": { @@ -13276,6 +15014,29 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, +<<<<<<< HEAD +======= + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, +>>>>>>> 18b8135 (Update examples to use current release build) "proxy-agent": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", @@ -13343,6 +15104,12 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -13403,9 +15170,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -13491,20 +15258,39 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -13546,10 +15332,13 @@ "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "safe-buffer": { "version": "5.1.2", @@ -13570,9 +15359,27 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } }, "semver-diff": { "version": "3.1.1", @@ -13948,6 +15755,11 @@ } } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -15413,6 +17225,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -15430,9 +17247,9 @@ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, "tsutils": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", - "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -15484,6 +17301,13 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "peer": true + }, "uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -15709,6 +17533,20 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -15782,7 +17620,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15792,14 +17629,12 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -15808,7 +17643,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -15816,26 +17650,22 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15846,7 +17676,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -15900,8 +17729,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "3.1.1", @@ -15924,7 +17752,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -15938,26 +17765,22 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15968,7 +17791,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -15978,8 +17800,7 @@ "yargs-parser": { "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" }, "yocto-queue": { "version": "0.1.0", diff --git a/examples/website/package.json b/examples/website/package.json index a78c35bc..75cd0d8f 100644 --- a/examples/website/package.json +++ b/examples/website/package.json @@ -15,7 +15,21 @@ }, "dependencies": { "@entropic/bole": "^4.0.1", + "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", + "@opentelemetry/api": "^1.0.4", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/instrumentation": "^0.27.0", + "@opentelemetry/instrumentation-dns": "^0.27.0", + "@opentelemetry/instrumentation-graphql": "^0.27.1", + "@opentelemetry/instrumentation-grpc": "^0.27.0", + "@opentelemetry/instrumentation-http": "^0.27.0", + "@opentelemetry/resources": "^1.0.1", + "@opentelemetry/sdk-node": "^0.27.0", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/sdk-trace-node": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", "@types/uuid": "^8.3.0", "accepts": "^1.3.7", "ajv": "^8.0.5", @@ -37,8 +51,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -64,5 +78,19 @@ "posttest": "npm run lint", "start": "nodemon ./boltzmann.js", "test": "c8 tap --no-cov tests" +<<<<<<< HEAD +======= + }, + "boltzmann": { + "version": "0.5.3", + "csrf": true, + "githubci": false, + "honeycomb": true, + "jwt": true, + "ping": true, + "status": true, + "templates": true, + "debug": false +>>>>>>> 18b8135 (Update examples to use current release build) } -} +} \ No newline at end of file From 5387876aa38eb41a2fce2bbd17c144099f68eb73 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 14:21:54 -0500 Subject: [PATCH 108/167] Bump to 0.6.0 and fill out changelog fields --- Cargo.toml | 2 +- docs/content/reference/02-handlers.md | 2 ++ docs/content/reference/03-middleware.md | 4 ++++ examples/attaching-middleware/package.json | 2 +- examples/sessions/boltzmann.js | 19 +++++++++++++++++++ examples/sessions/package.json | 2 +- examples/typed/package.json | 2 +- examples/website/package.json | 4 ++-- 8 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index eb0c4a28..9ca048c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ authors = ["C J Silverio ", "Chris Dickinson "] edition = "2021" name = "boltzmann" -version = "0.5.3" +version = "0.6.0" documentation = "https://www.boltzmann.dev/en/docs/latest/" description = "A scaffolder for Boltzmann.js http service projects." license = "Apache-2.0" diff --git a/docs/content/reference/02-handlers.md b/docs/content/reference/02-handlers.md index ea83e397..a85e7037 100644 --- a/docs/content/reference/02-handlers.md +++ b/docs/content/reference/02-handlers.md @@ -394,6 +394,8 @@ async function host(context) { ### `id` {{ changelog(version = "0.0.0") }} +- **Changed in 0.6.0:** Use `traceparent` as the `id` when available. +{% end %} A unique string identifier for the request for tracing purposes. The value is drawn from: diff --git a/docs/content/reference/03-middleware.md b/docs/content/reference/03-middleware.md index 83a62294..93de9e52 100644 --- a/docs/content/reference/03-middleware.md +++ b/docs/content/reference/03-middleware.md @@ -773,6 +773,10 @@ Boltzmann automatically attaches one instance of [`route`](#route). ### `trace` +{% changelog(version="0.0.0") %} +- **Changed in 0.6.0:** Tracing now uses OpenTelemetry if `HONEYCOMB_API_HOST` is a `grpc://` url +{% end %} + This middleware is added to your service if you have enabled the `honeycomb` feature. This feature sends trace data to the [Honeycomb](https://www.honeycomb.io) service for deep observability of the performance of your handlers. diff --git a/examples/attaching-middleware/package.json b/examples/attaching-middleware/package.json index 342b7962..9e2a9a5a 100644 --- a/examples/attaching-middleware/package.json +++ b/examples/attaching-middleware/package.json @@ -58,4 +58,4 @@ "ping": true, "status": true } -} \ No newline at end of file +} diff --git a/examples/sessions/boltzmann.js b/examples/sessions/boltzmann.js index 806e575b..d5923ef4 100755 --- a/examples/sessions/boltzmann.js +++ b/examples/sessions/boltzmann.js @@ -475,6 +475,25 @@ OtelRedisInstrumentation, }; module.exports = {...module.exports, defaultOtelFactories, Honeycomb, HoneycombError, HoneycombSpanProcessor, }; void ``; +<<<<<<< HEAD +======= + +'use strict'; +// Boltzmann v0.6.0 +/**/ +const serviceName = _getServiceName(); +function _getServiceName() { + try { + return process.env.SERVICE_NAME || require('./package.json').name.split('/').pop(); + } + catch { + return 'boltzmann'; + } +} +/**/ +void ``; +void ``; +>>>>>>> 421582c (Bump to 0.6.0 and fill out changelog fields) if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET; } diff --git a/examples/sessions/package.json b/examples/sessions/package.json index 4f1b3cea..db01104e 100644 --- a/examples/sessions/package.json +++ b/examples/sessions/package.json @@ -87,4 +87,4 @@ "status": true, "templates": true } -} \ No newline at end of file +} diff --git a/examples/typed/package.json b/examples/typed/package.json index d1580416..728e5ff0 100644 --- a/examples/typed/package.json +++ b/examples/typed/package.json @@ -81,4 +81,4 @@ "status": true, "typescript": true } -} \ No newline at end of file +} diff --git a/examples/website/package.json b/examples/website/package.json index 75cd0d8f..dbd7f701 100644 --- a/examples/website/package.json +++ b/examples/website/package.json @@ -82,7 +82,7 @@ ======= }, "boltzmann": { - "version": "0.5.3", + "version": "0.6.0", "csrf": true, "githubci": false, "honeycomb": true, @@ -93,4 +93,4 @@ "debug": false >>>>>>> 18b8135 (Update examples to use current release build) } -} \ No newline at end of file +} From 77371a7d5ee10c91680a1ce886ba35441c6ca06c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 14:57:07 -0500 Subject: [PATCH 109/167] Expand middleware test to cover handlers --- templates/boltzmann/core/middleware.ts | 85 ++++++++++++++++++-------- 1 file changed, 60 insertions(+), 25 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index ac4d71e1..4536ba86 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -107,9 +107,9 @@ async function handler (context: Context) { handlerSpanName(handler), { attributes: { - [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: String(handler.method), - [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, - 'boltzmann.http.handler.name': handler.name || '', + 'boltzmann.http.handler.name': handler.name || '', + 'boltzmann.handler.method': String(handler.method), + 'boltzmann.handler.route': handler.route, 'boltzmann.http.handler.version': handler.version || '*', 'boltzmann.http.handler.decorators': String(handler.decorators) }, @@ -142,37 +142,41 @@ type Test = (typeof tap.Test)["prototype"] import { runserver } from '../bin/runserver' import { inject } from '@hapi/shot' -// A simple test middleware that intercepts the request prior to any -// handlers seeing it -const helloMiddleware: Middleware = () => { +const testMiddleware: Middleware = () => { return (next: Handler) => { return (context: Context) => { - return 'Hello!' + const span = otel.trace.getSpan(otel.context.active()) + if (span) { + span.setAttribute('middleware_attribute', 'testing 123') + } + return next(context) } } } -// A simple test handler which throws - useful for ensuring that the handler -// isn't called -const throwingHandler: Handler = (context: Context) => { - throw new Error('handler should not be called') +const testHandler: Handler = (context: Context) => { + const span = otel.trace.getSpan(otel.context.active()) + if (span) { + span.setAttribute('handler_attribute', 'testing 123') + } + return { ok: true } } -throwingHandler.route = 'GET /' +testHandler.route = 'GET /' /* c8 ignore next */ if (require.main === module) { const { test } = tap - test('honeycomb-instrumented middlewares emit spans', async (assert: Test) => { + test('honeycomb-instrumented middlewares and handlers emit spans', async (assert: Test) => { const server = await runserver({ middleware: [ // The "trace" middleware is marked as doNotTrace, so we shouldn't // be creating pre-trace spans (but should get a trace span) trace, // This middleware *should* get auto-spanned - helloMiddleware + testMiddleware ], - handlers: { handler: throwingHandler } + handlers: { handler: testHandler } }) const [onRequest] = server.listeners('request') @@ -193,13 +197,10 @@ if (require.main === module) { }) span.end() - - assert.same(response.payload, 'Hello!') + assert.same(response.payload, '{"ok":true}') const spans = getOtelMockSpans(honeycomb.spanProcessor) - // assert.same(spans, [], 'un-comment this to render all spans') - const boltzmannSpans = spans.map(span => { const context = span.spanContext() @@ -212,22 +213,56 @@ if (require.main === module) { parentSpanId: span.parentSpanId, attributes: span.attributes } - }) assert.same( boltzmannSpans, [ - // The middleware span + // The handler span { - spanName: 'mw: helloMiddleware', + spanName: 'handler: testHandler', serviceName: 'test-app', library: 'boltzmann', - traceId: boltzmannSpans[1].traceId, + traceId: boltzmannSpans[3].traceId, spanId: boltzmannSpans[0].spanId, parentSpanId: boltzmannSpans[1].spanId, // TODO: There *should* be attributes here, no? attributes: { + "handler_attribute": "testing 123", + "service_name": "test-app", + "boltzmann.honeycomb.trace_type": "otel", + "boltzmann.http.handler.name": "testHandler", + "boltzmann.handler.method": "GET", + "boltzmann.handler.route": "/", + "boltzmann.http.handler.version": "*", + "boltzmann.http.handler.decorators": "", + } + }, + // The route middleware span + { + spanName: 'mw: route', + serviceName: 'test-app', + library: 'boltzmann', + traceId: boltzmannSpans[3].traceId, + spanId: boltzmannSpans[1].spanId, + parentSpanId: boltzmannSpans[2].spanId, + // TODO: There *should* be attributes here, no? + attributes: { + "service_name": "test-app", + "boltzmann.honeycomb.trace_type": "otel", + } + }, + // The test middleware span + { + spanName: 'mw: testMiddleware', + serviceName: 'test-app', + library: 'boltzmann', + traceId: boltzmannSpans[3].traceId, + spanId: boltzmannSpans[2].spanId, + parentSpanId: boltzmannSpans[3].spanId, + // TODO: There *should* be attributes here, no? + attributes: { + "middleware_attribute": "testing 123", "service_name": "test-app", "boltzmann.honeycomb.trace_type": "otel", } @@ -237,8 +272,8 @@ if (require.main === module) { spanName: 'HTTP GET', serviceName: 'test-app', library: 'boltzmann', - traceId: boltzmannSpans[1].traceId, - spanId: boltzmannSpans[1].spanId, + traceId: boltzmannSpans[3].traceId, + spanId: boltzmannSpans[3].spanId, parentSpanId: undefined, attributes: { "boltzmann.http.query": "", From ac971baeb32325029919fcadd659fa292db02ab8 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 15:00:26 -0500 Subject: [PATCH 110/167] Regenerate all examples --- Cargo.lock | 2 +- examples/attaching-middleware/package.json | 2 +- examples/sessions/package.json | 2 +- examples/typed/package.json | 2 +- examples/website/boltzmann.js | 533 +++++++++++-------- examples/website/package-lock.json | 578 ++------------------- examples/website/package.json | 33 +- 7 files changed, 361 insertions(+), 791 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0dcbeb11..bf85959b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -101,7 +101,7 @@ dependencies = [ [[package]] name = "boltzmann" -version = "0.5.3" +version = "0.6.0" dependencies = [ "anyhow", "atty", diff --git a/examples/attaching-middleware/package.json b/examples/attaching-middleware/package.json index 9e2a9a5a..342b7962 100644 --- a/examples/attaching-middleware/package.json +++ b/examples/attaching-middleware/package.json @@ -58,4 +58,4 @@ "ping": true, "status": true } -} +} \ No newline at end of file diff --git a/examples/sessions/package.json b/examples/sessions/package.json index db01104e..4f1b3cea 100644 --- a/examples/sessions/package.json +++ b/examples/sessions/package.json @@ -87,4 +87,4 @@ "status": true, "templates": true } -} +} \ No newline at end of file diff --git a/examples/typed/package.json b/examples/typed/package.json index 728e5ff0..d1580416 100644 --- a/examples/typed/package.json +++ b/examples/typed/package.json @@ -81,4 +81,4 @@ "status": true, "typescript": true } -} +} \ No newline at end of file diff --git a/examples/website/boltzmann.js b/examples/website/boltzmann.js index 3f429c0b..d7659446 100755 --- a/examples/website/boltzmann.js +++ b/examples/website/boltzmann.js @@ -2,19 +2,21 @@ /* eslint-disable */ /* c8 ignore file */ 'use strict'; -<<<<<<< HEAD -======= /**/ -// Dependencies used downstream - it's worth your time to look at how these -// are treated in prelude.ts! +// Dependencies used outside of honeycomb const bole = require("@entropic/bole"); +const isDev = require("are-we-dev"); +module.exports = {...module.exports, bole, isDev }; +void ``; // We continue to support beelines... const beeline = require("honeycomb-beeline"); // ...but are migrating to OpenTelemetry: const grpc = require("@grpc/grpc-js"); const otel = require("@opentelemetry/api"); const otelCore = require("@opentelemetry/core"); -const { OTLPTraceExporter } = require("@opentelemetry/exporter-trace-otlp-grpc"); +const otlpHttp = require("@opentelemetry/exporter-trace-otlp-http"); +const otlpProto = require("@opentelemetry/exporter-trace-otlp-proto"); +const otlpGrpc = require("@opentelemetry/exporter-trace-otlp-grpc"); const otelResources = require("@opentelemetry/resources"); const { NodeSDK: OtelSDK } = require("@opentelemetry/sdk-node"); const otelTraceBase = require("@opentelemetry/sdk-trace-base"); @@ -26,6 +28,90 @@ void ``; void ``; class HoneycombError extends Error { } +// A diagnostic logger for OpenTelemetry. To log at a sensible level, +// call otel.diag.verbose. +class HoneycombDiagLogger { + // Ideally we would log to a bole logger. However, logger setup happens + // relatively late - in the log middleware - and it's very likely that such + // a log won't be in-place when we stand up the middleware stack! Therefore, + // we do log to bole if it's set in the middleware but will fall back to + // good ol' fashioned JSON.stringify if need be. + constructor() { + this._stream = process.stdout; + // So log messages roughly match what's output by the bole in dev mode :^) + if (isDev()) { + const pretty = require('bistre')({ time: true }); + this._stream = pretty.pipe(this._stream); + } + } + // OpenTelemetry's diagnostic logger has one more log level than bole - ie, + // verbose. + // + // For more details on how to treat each log level, see: + // https://github.com/open-telemetry/opentelemetry-js-api/blob/main/src/diag/consoleLogger.ts#L60 + // Log errors that caused an unexpected failure + error(message, ...args) { + this._log('error', message, args); + } + // Log warnings that aren't show-stopping but should REALLY be looked at + warn(message, ...args) { + this._log('warn', message, args); + } + // Log info if you want to be REALLY LOUD for some reason - you probably + // don't want to use this! + info(message, ...args) { + this._log('info', message, args); + } + // Log details that could be useful for identifying what went wrong, but + // aren't the thing that went wrong itself - treat this as you would info + // logging normally + debug(message, ...args) { + this._log('debug', message, args); + } + // Log fine-grained details that are mostly going to be useful to those + // adding new OpenTelemetry related features to boltzmann - treat this like + // you would debug level logging normally + verbose(message, ...args) { + this._log('debug', `VERBOSE: ${message}`, args); + } + _log(level, message, args) { + let isSelfTest = false; + void ``; + if (isSelfTest) { + return; + } + // Log to bole if we have it + if (this.logger) { + this.logger[level](message, ...args); + return; + } + const line = { + time: (new Date()).toISOString(), + level, + name: 'boltzmann:honeycomb', + message, + args + }; + try { + // are the args JSON-serializable? + this._writeLine(JSON.stringify(line)); + // SURVEY SAYS... + } + catch (_) { + // ...ok, make it a string as a fallback + line.args = require('util').format('%o', line.args); + this._writeLine(JSON.stringify(line)); + } + } + _writeLine(line) { + this._stream.write(Buffer.from(line + '\n')); + } +} +// We only do OpenTelemetry logging if boltzmann's main log level is debug +const _diagLogger = new HoneycombDiagLogger(); +if (!process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug') { + otel.diag.setLogger(_diagLogger, otelCore.getEnv().OTEL_LOG_LEVEL); +} const _OtelSpanProcessor = otelTraceBase.SimpleSpanProcessor; class HoneycombSpanProcessor extends _OtelSpanProcessor { constructor(_exporter) { @@ -40,70 +126,91 @@ class HoneycombSpanProcessor extends _OtelSpanProcessor { // just the active span. onStart(span, _) { span.setAttribute('service_name', span.resource.attributes['service.name']); - span.setAttribute('boltzmann.honeycomb.trace_type', 'otel'); + span.setAttribute('honeycomb.trace_type', 'otel'); otelTraceBase.SimpleSpanProcessor.prototype.onStart.call(this, span); } onEnd(span) { otelTraceBase.SimpleSpanProcessor.prototype.onEnd.call(this, span); } } -class HoneycombTraceExporter extends OTLPTraceExporter { - constructor(config = {}) { - super(config); - this._honeycomb = config.honeycomb; - } - log(message) { - if (this._honeycomb) { - this._honeycomb.log(message); - } - } - send(objects, onSuccess, onError) { - this.log(`sending ${objects.length} spans to ${this.url}`); - super.send(objects, () => { - this.log(`successfully send ${objects.length} spans to ${this.url}`); - return onSuccess(); - }, (error) => { - this.log(`error while sending ${objects.length} spans: ${error}`); - return onError(error); - }); - } -} const defaultOtelFactories = { - metadata(writeKey, dataset) { - const metadata = new grpc.Metadata(); - metadata.set('x-honeycomb-team', writeKey); - metadata.set('x-honeycomb-dataset', dataset); - return metadata; - }, - // create a Sampler object, which is used to tune - // the sampling rate - sampler(sampleRate) { - return new otelCore.ParentBasedSampler({ - root: new otelCore.TraceIdRatioBasedSampler(sampleRate) - }); + headers(writeKey, dataset) { + let headers = {}; + if (writeKey) { + headers['x-honeycomb-team'] = writeKey; + } + if (dataset) { + headers['x-honeycomb-dataset'] = dataset; + } + return headers; }, resource(serviceName) { return new otelResources.Resource({ [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName }); }, - // It provides tracers! - tracerProvider(resource, sampler) { - return new NodeTracerProvider({ resource, sampler }); + // A tracer provider is effectively a Tracer factory and is used to power + // the otel.getTrace API + tracerProvider(resource) { + return new NodeTracerProvider({ resource }); }, - // Export traces to an OTLP endpoint with GRPC - traceExporter(url, metadata, honeycomb) { - return new HoneycombTraceExporter({ - url, - credentials: grpc.credentials.createSsl(), - metadata, - honeycomb + // There are three different OTLP span exporter classes - one for grpc, one + // for http/protobuf and one for http/json - this will return the appropriate + // one for the configured protocol. + spanExporter(protocol, headers) { + // Instead of subclassing each implementation, monkey patch the send + // method on whichever instance we create + function patchSend(exporter) { + const send = exporter.send; + exporter.send = function (objects, onSuccess, + // This error is actually an Error subtype which corresponds 1:1 with + // the OTLPTraceExporter class being instrumented, but making this a + // proper generic type is hard - it's fine! + onError) { + otel.diag.debug(`sending ${objects.length} spans to ${this.url}`); + send.call(this, objects, () => { + otel.diag.debug(`successfully send ${objects.length} spans to ${this.url}`); + return onSuccess(); + }, (error) => { + otel.diag.debug(`error while sending ${objects.length} spans: ${error}`); + return onError(error); + }); + }; + } + if (protocol === 'grpc') { + const metadata = new grpc.Metadata(); + for (let [key, value] of Object.entries(headers)) { + metadata.set(key, value); + } + const credentials = grpc.credentials.createSsl(); + const exporter = new otlpGrpc.OTLPTraceExporter({ + credentials, + metadata + }); + patchSend(exporter); + return exporter; + } + if (protocol === 'http/json') { + otel.diag.warn("Honeycomb doesn't support the http/json OTLP protocol - but if you say so"); + const exporter = new otlpHttp.OTLPTraceExporter({ + headers + }); + patchSend(exporter); + return exporter; + } + if (protocol !== 'http/protobuf') { + otel.diag.warn(`Unknown OTLP protocol ${protocol} - using http/protobuf instead`); + } + const exporter = new otlpProto.OTLPTraceExporter({ + headers }); + patchSend(exporter); + return exporter; }, // Process spans, using the supplied trace exporter to // do the actual exporting. - spanProcessor(traceExporter) { - return new HoneycombSpanProcessor(traceExporter); + spanProcessor(spanExporter) { + return new HoneycombSpanProcessor(spanExporter); }, instrumentations() { // Any paths we add here will get no traces whatsoever. This is @@ -146,10 +253,9 @@ const defaultOtelFactories = { // The SDK will take a service name, instrumentations // and a trace exporter and give us a stateful singleton. // This is that singleton! - sdk(resource, instrumentations, traceExporter) { + sdk(resource, instrumentations) { return new OtelSDK({ resource, - traceExporter, instrumentations }); } @@ -166,7 +272,7 @@ class Honeycomb { this.initialized = false; this.started = false; this.tracerProvider = null; - this.traceExporter = null; + this.spanExporter = null; this.spanProcessor = null; this.instrumentations = null; this.sdk = null; @@ -174,48 +280,85 @@ class Honeycomb { ...defaultOtelFactories, ...(overrides || {}) }; - this.logger = null; + this._logger = null; } get tracer() { - // TODO: Can we do better than hard-coding 1.0.0? - return otel.trace.getTracer('boltzmann', '1.0.0'); + return otel.trace.getTracer('boltzmann', '0.6.0'); } // We (usually) load options from the environment. Unlike with Options, // we do a lot of feature detection here. - static fromEnv(serviceName, env = process.env, overrides = {}) { - return new Honeycomb(Honeycomb.parseEnv(serviceName, env), overrides); + static fromEnv(env = process.env, overrides = {}) { + return new Honeycomb(Honeycomb.parseEnv(env), overrides); } // serviceName is defined in the prelude, so rather than doing the same // logic twice we let the prelude inject it when creating the honeycomb // object. - static parseEnv(serviceName, env = process.env) { - // If there's no write key we won't get very far anyway - const disable = !env.HONEYCOMB_WRITEKEY; - let otel = false; + static parseEnv(env = process.env) { + // For beelines, if we don't have HONEYCOMB_WRITEKEY there isn't much we + // can do... + let disable = !env.HONEYCOMB_WRITEKEY; + // Beelines should pick these up automatically, but we'll need them to + // configure default OTLP headers const writeKey = env.HONEYCOMB_WRITEKEY || null; const dataset = env.HONEYCOMB_DATASET || null; - const apiHost = env.HONEYCOMB_API_HOST || null; - let sampleRate = 1; - sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1); + // OpenTelemetry is configured with a huge pile of `OTEL_*` environment + // variables. If any of them are defined, we'll use OpenTelemetry instead + // of beelines. Typically one would configure OTEL_EXPORTER_OTLP_ENDPOINT + // to point to either api.honeycomb.io or your local refinery, but this + // will flag on OTEL_ENABLED=1 as well if you want to use all the + // defaults. + // + // For a broad overview of common variables, see: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md + // + // For a list of variables the OTLP exporter respects, see: + // https://opentelemetry.io/docs/reference/specification/protocol/exporter/ + const isOtel = Object.entries(env).some(([name, value]) => { + return name.startsWith('OTEL_') && value && value.length; + }); + // OpenTelemetry can optionally load the honeycomb headers from the + // OTEL_EXPORTER_OTLP_HEADERS and/or OTEL_EXPORTER_OTLP_TRACE_HEADERS + // environment variables, so having HONEYCOMB_WRITEKEY be falsey is + // potentially OK. This strategy also allows people to use the + // honeycomb tracing for non-honeycomb use cases. + if (isOtel) { + disable = false; + } + // This sample rate is for beeline only - to set the OpenTelemetry sample + // rate, set OTEL_TRACES_SAMPLER=parentbased_traceidratio and + // OTEL_TRACES_SAMPLER_ARG=${SOME_NUMBER}. Note that beeline defines + // sample rate as total/sampled, but OpenTelemetry defines it as + // sampled/total! + let sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1); if (isNaN(sampleRate)) { - Honeycomb.log(`Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` - + 'defaulting to 1'); sampleRate = 1; } - // If the API host is a grpc:// endpoint, we feature switch to - // OpenTelemetry. There are prior uses of this variable here but - // they should've been using https://. - if (!disable && apiHost) { - otel = /^grpc:\/\//.test(apiHost); - } + // OTLP is supposed to be configured with this environment variable, but + // the OpenTelemetry SDKs leave this as a some-assembly-required job. + // We default to 'http/protobuf' because it's well-supported by both + // Honeycomb and AWS load balancers and because it's relatively snappy. + // + // For more information on how this is configured, see: + // https://opentelemetry.io/docs/reference/specification/protocol/exporter/#specify-protocol + const otlpProtocol = env.OTEL_EXPORTER_OTLP_PROTOCOL || env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL || 'http/protobuf'; + // The service name logic is VERY similar to what's in prelude.ts, + // except that OTEL_SERVICE_NAME takes precedence if defined + const serviceName = (() => { + try { + return env.OTEL_SERVICE_NAME || env.SERVICE_NAME || require('./package.json').name.split('/').pop(); + } + catch (err) { + return 'boltzmann'; + } + })(); return { serviceName, disable, - otel, + otel: isOtel, writeKey, dataset, - apiHost, - sampleRate + sampleRate, + otlpProtocol }; } // Initialize Honeycomb! Stands up the otel node SDK if enabled, @@ -231,26 +374,24 @@ class Honeycomb { try { const writeKey = this.writeKey; const dataset = this.dataset; - const sampleRate = this.options.sampleRate || 1; - const serviceName = this.options.serviceName; - if (!this.features.otel) { + const sampleRate = this.sampleRate; + const serviceName = this.serviceName; + if (this.features.beeline && writeKey) { beeline({ writeKey, dataset, sampleRate, serviceName }); this.initialized = true; return; } const f = this.factories; - const apiHost = this.apiHost; - const metadata = f.metadata(writeKey, dataset); + const headers = f.headers(writeKey, dataset); const resource = f.resource(serviceName); - const sampler = f.sampler(sampleRate); - const exporter = f.traceExporter(apiHost, metadata, this); + const exporter = f.spanExporter(this.options.otlpProtocol || 'http/protobuf', headers); const processor = f.spanProcessor(exporter); const instrumentations = f.instrumentations(); - const provider = f.tracerProvider(resource, sampler); + const provider = f.tracerProvider(resource); provider.addSpanProcessor(processor); provider.register(); - const sdk = f.sdk(resource, instrumentations, exporter); - this.traceExporter = exporter; + const sdk = f.sdk(resource, instrumentations); + this.spanExporter = exporter; this.spanProcessor = processor; this.instrumentations = instrumentations; this.tracerProvider = provider; @@ -259,7 +400,7 @@ class Honeycomb { } catch (err) { if (err instanceof HoneycombError) { - this.log(err); + otel.diag.error(err.stack || String(err)); return; } throw err; @@ -272,7 +413,7 @@ class Honeycomb { let exitCode = 0; const sdk = this.sdk; const die = async (err) => { - this.log(err); + otel.diag.error(err.stack || String(err)); exitCode = 1; await shutdown(); }; @@ -299,67 +440,35 @@ class Honeycomb { await sdk.shutdown(); } catch (err) { - this.log(err); + otel.diag.error(err.stack || String(err)); } } - // These accessors are type guards that ensure you're working - // with a defined/non-null property. It's a bit of 6-to-1 and - // half a dozen on the other, because you trade ifs for - // try/catches and honeycomb can basically never throw. Even - // so, it saves a little bit of boilerplate. get writeKey() { - if (this.options.writeKey) { - return this.options.writeKey; - } - throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!'); + return this.options.writeKey || null; } get dataset() { - if (this.options.dataset) { - return this.options.dataset; - } - throw new HoneycombError('HONEYCOMB_DATASET is undefined!'); + return this.options.dataset || null; } - get apiHost() { - if (this.options.apiHost) { - return this.options.apiHost; - } - throw new HoneycombError('HONEYCOMB_API_HOST is undefined!'); + get sampleRate() { + return this.options.sampleRate || 1; } - // We *do* have a handful of logging use cases... - static log(message) { - void ``; + get serviceName() { + return this.options.serviceName || 'boltzmann'; } - log(message) { - void ``; + get logger() { + return this._logger; + } + set logger(logger) { + this._logger = logger; + _diagLogger.logger = logger ? logger : undefined; } } -module.exports = {...module.exports, beeline, bole, grpc, otel, otelCore, OTLPTraceExporter, otelResources, OtelSDK, otelTraceBase, NodeTracerProvider, otelSemanticConventions, OtelDnsInstrumentation, OtelHttpInstrumentation, +module.exports = {...module.exports, beeline, otel, otelCore, otelResources, OtelSDK, otelTraceBase, NodeTracerProvider, otelSemanticConventions, OtelDnsInstrumentation, OtelHttpInstrumentation, // // }; module.exports = {...module.exports, defaultOtelFactories, Honeycomb, HoneycombError, HoneycombSpanProcessor, }; void ``; - -'use strict'; ->>>>>>> 18b8135 (Update examples to use current release build) -// Boltzmann v0.5.3 -/**/ -const serviceName = _getServiceName(); -function _getServiceName() { - try { - return process.env.SERVICE_NAME || require('./package.json').name.split('/').pop(); - } - catch { - return 'boltzmann'; - } -} -/**/ -void ``; -<<<<<<< HEAD -const beeline = require("honeycomb-beeline"); -======= -void ``; ->>>>>>> 18b8135 (Update examples to use current release build) if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET; } @@ -372,19 +481,27 @@ if (!process.env.HONEYCOMB_SAMPLE_RATE && process.env.HONEYCOMBIO_SAMPLE_RATE) { if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM; } -<<<<<<< HEAD -beeline({ - writeKey: process.env.HONEYCOMB_WRITEKEY, - dataset: process.env.HONEYCOMB_DATASET, - sampleRate: Number(process.env.HONEYCOMB_SAMPLE_RATE) || 1, - serviceName, -}); -======= -let honeycomb = Honeycomb.fromEnv(serviceName, process.env); +let honeycomb = Honeycomb.fromEnv(process.env); void ``; honeycomb.init(); module.exports = {...module.exports, honeycomb }; ->>>>>>> 18b8135 (Update examples to use current release build) +void ``; +void ``; + +'use strict'; +// Boltzmann v0.6.0 +/**/ +const serviceName = _getServiceName(); +function _getServiceName() { + try { + return process.env.SERVICE_NAME || require('./package.json').name.split('/').pop(); + } + catch { + return 'boltzmann'; + } +} +/**/ +void ``; const onHeaders = require("on-headers"); void ``; const ships = require("culture-ships"); @@ -415,7 +532,6 @@ void ``; const { Readable } = require("stream"); const querystring = require("querystring"); const { promisify } = require("util"); -const isDev = require("are-we-dev"); const fmw = require("find-my-way"); const accepts = require("accepts"); const { promises: fs } = require("fs"); @@ -501,32 +617,27 @@ function handlerSpanName(handler) { async function handler(context) { const handler = context.handler; // -<<<<<<< HEAD - let span = null; - if (process.env.HONEYCOMB_WRITEKEY) { - span = beeline.startSpan({ - name: `handler: ${handler.name}`, -======= let beelineSpan = null; let otelSpan = null; let traceContext = otel.context.active(); if (honeycomb.features.beeline) { beelineSpan = beeline.startSpan({ name: handlerSpanName(handler), ->>>>>>> 18b8135 (Update examples to use current release build) 'handler.name': handler.name, 'handler.method': String(handler.method), 'handler.route': handler.route, 'handler.version': handler.version || '*', 'handler.decorators': String(handler.decorators), + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'honeycomb.trace_type': 'beeline', }); } else if (honeycomb.features.otel) { otelSpan = honeycomb.tracer.startSpan(handlerSpanName(handler), { attributes: { - [otelSemanticConventions.SemanticAttributes.HTTP_METHOD]: String(handler.method), - [otelSemanticConventions.SemanticAttributes.HTTP_ROUTE]: handler.route, - 'boltzmann.http.handler.name': handler.name || '', + 'boltzmann.http.handler.name': handler.name || '', + 'boltzmann.handler.method': String(handler.method), + 'boltzmann.handler.route': handler.route, 'boltzmann.http.handler.version': handler.version || '*', 'boltzmann.http.handler.decorators': String(handler.decorators) }, @@ -542,16 +653,11 @@ async function handler(context) { }); } finally { -<<<<<<< HEAD - if (process.env.HONEYCOMB_WRITEKEY && span !== null) { - beeline.finishSpan(span); -======= if (beelineSpan !== null) { beeline.finishSpan(beelineSpan); } else if (otelSpan !== null) { otelSpan.end(); ->>>>>>> 18b8135 (Update examples to use current release build) } } // @@ -804,10 +910,6 @@ class Context { /**[Docs]("https://www.boltzmann.dev/en/latest/docs/reference/02-handlers#traceURL")*/ get traceURL() { const url = new URL(`https://ui.honeycomb.io/${process.env.HONEYCOMB_TEAM}/datasets/${process.env.HONEYCOMB_DATASET}/trace`); -<<<<<<< HEAD - url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']); - url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime / 1000 - 1))); -======= if (honeycomb.features.beeline) { url.searchParams.set('trace_id', this._honeycombTrace.payload['trace.trace_id']); url.searchParams.set('trace_start_ts', String(Math.floor(this._honeycombTrace.startTime / 1000 - 1))); @@ -822,7 +924,6 @@ class Context { url.searchParams.set('trace_id', spanCtx.traceId); url.searchParams.set('trace_start_ts', String(startTime)); } ->>>>>>> 18b8135 (Update examples to use current release build) return String(url); } // @@ -1557,18 +1658,28 @@ function handleCORS({ origins = isDev() ? '*' : String(process.env.CORS_ALLOW_OR const includesStar = originsArray.includes('*'); return (next) => { return async function cors(context) { - const reflectedOrigin = (includesStar - ? '*' - : (originsArray.includes(String(context.headers.origin)) - ? context.headers.origin - : false)); + const spanAttributes = { + 'boltzmann.http.origin': String(context.headers.origin) + }; + if (honeycomb.features.beeline) { + beeline.addContext(spanAttributes); + } + const span = otel.trace.getSpan(otel.context.active()); + if (span) { + span.setAttributes(spanAttributes); + } + if (!includesStar && !originsArray.includes(String(context.headers.origin))) { + throw Object.assign(new Error('Origin not allowed'), { + [Symbol.for('status')]: 400 + }); + } const response = (context.method === 'OPTIONS' ? Object.assign(Buffer.from(''), { [Symbol.for('status')]: 204, }) : await next(context)); response[Symbol.for('headers')] = { - ...(reflectedOrigin ? { 'Access-Control-Allow-Origin': reflectedOrigin } : {}), + 'Access-Control-Allow-Origin': includesStar ? '*' : context.headers.origin, 'Access-Control-Allow-Methods': [].concat(methods).join(','), 'Access-Control-Allow-Headers': [].concat(headers).join(',') }; @@ -1637,12 +1748,6 @@ function enforceInvariants() { void ``; function traceName(method, pathname) { - // This is how OpenTelemetry names request-level spans by default, so we - // go with the grain - if (honeycomb.features.otel) { - return `HTTP ${method}`; - } - // This is what the beeline traces are named today return `${method} ${pathname}`; } function middlewareSpanName(name) { @@ -1651,20 +1756,13 @@ function middlewareSpanName(name) { function paramSpanAttribute(param) { return `boltzmann.http.request.param.${param}`; } -function traceAttribute(key) { - return `app.${key}`; -} module.exports = {...module.exports, traceName, middlewareSpanName, paramSpanAttribute }; // The trace middleware creates a request-level span or trace. It delegates // to either a beeline or OpenTelemetry implementation depending on how // the honeycomb object is configured. trace.doNotTrace = true; function trace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } = {}) { -<<<<<<< HEAD - if (!process.env.HONEYCOMB_WRITEKEY) { -======= if (!honeycomb.features.honeycomb || !honeycomb.initialized) { ->>>>>>> 18b8135 (Update examples to use current release build) return (next) => (context) => next(context); } if (honeycomb.features.beeline) { @@ -1707,7 +1805,7 @@ function beelineTrace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } 'request.query': context.url.search, // for forward compatibility with OpenTelemetry traces [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, - 'boltzmann.honeycomb.trace_type': 'beeline' + 'honeycomb.trace_type': 'beeline' }, traceContext.traceId, traceContext.parentSpanId, traceContext.dataset); if (isDev()) { context._honeycombTrace = trace; @@ -1758,19 +1856,16 @@ function beelineTrace({ headerSources = ['x-honeycomb-trace', 'x-request-id'], } }; } } -<<<<<<< HEAD -function honeycombMiddlewareSpans({ name } = {}) { - if (!process.env.HONEYCOMB_WRITEKEY) { - return (next) => (context) => next(context); - } -======= function beelineMiddlewareSpans({ name } = {}) { ->>>>>>> 18b8135 (Update examples to use current release build) return function honeycombSpan(next) { return async (context) => { const span = beeline.startSpan({ name: middlewareSpanName(name) }); + beeline.addContext({ + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'honeycomb.trace_type': 'beeline' + }); // Assumption: the invariant middleware between each layer // will ensure that no errors are thrown from next(). const result = await next(context); @@ -1800,20 +1895,20 @@ function otelTrace() { // concerned the span could still be undefined. We could assert that it // exists, but throwing instrumentation-related errors is poor form. if (span) { - // for backwards compatibility with beeline traces span.setAttribute('boltzmann.http.query', context.url.search); + span.updateName(traceName(context.method, context.url.pathname)); traceContext = otel.trace.setSpan(traceContext, span); if (isDev()) { context._honeycombTrace = span; } } else { - honeycomb.log(new assert.AssertionError({ + otel.diag.error(String(new assert.AssertionError({ message: 'no parent span found or created', actual: span, expected: true, operator: '==' - })); + }).stack)); } onHeaders(context._response, function () { const handler = context.handler; @@ -1861,11 +1956,7 @@ function authenticateJWT({ scheme = 'Bearer', publicKey = process.env.AUTHENTICA if (!publicKey) { throw new Error(`To authenticate JWTs you must pass the path to a public key file in either the environment variable "AUTHENTICATION_KEY" or the publicKey config field -<<<<<<< HEAD -https://www.boltzmann.dev/en/docs/0.5.3/reference/middleware/#authenticatejwt -======= -https://www.boltzmann.dev/en/docs/v0.5.3/reference/middleware/#authenticatejwt ->>>>>>> 18b8135 (Update examples to use current release build) +https://www.boltzmann.dev/en/docs/v0.6.0/reference/middleware/#authenticatejwt `.trim().split('\n').join(' ')); } return async (next) => { @@ -1875,11 +1966,7 @@ https://www.boltzmann.dev/en/docs/v0.5.3/reference/middleware/#authenticatejwt boltzmann authenticateJWT middleware cannot read public key at "${publicKey}". Is the AUTHENTICATION_KEY environment variable set correctly? Is the file readable? -<<<<<<< HEAD - https://www.boltzmann.dev/en/docs/0.5.3/reference/middleware/#authenticatejwt -======= - https://www.boltzmann.dev/en/docs/v0.5.3/reference/middleware/#authenticatejwt ->>>>>>> 18b8135 (Update examples to use current release build) + https://www.boltzmann.dev/en/docs/v0.6.0/reference/middleware/#authenticatejwt `.trim().split('\n').join(' ')); throw err; }) @@ -1916,7 +2003,11 @@ void ``; void ``; -function log({ logger = bole(process.env.SERVICE_NAME || 'boltzmann'), level = process.env.LOG_LEVEL || 'debug', stream = process.stdout } = {}) { +function log({ logger = bole(serviceName), +// +honeycombLogger = bole(`${serviceName}:honeycomb`), +// +level = process.env.LOG_LEVEL || 'debug', stream = process.stdout, } = {}) { if (isDev()) { const pretty = require('bistre')({ time: true }); pretty.pipe(stream); @@ -1924,20 +2015,18 @@ function log({ logger = bole(process.env.SERVICE_NAME || 'boltzmann'), level = p } bole.output({ level, stream }); void ``; - honeycomb.logger = bole('boltzmann:honeycomb'); - if (honeycomb.features.beeline) { - honeycomb.logger.warn('Honeycomb beeline support is deprecated and will be removed in a future version. ' - + 'To use OpenTelemetry, set HONEYCOMB_API_HOST to a grpc:// endpoint.'); - } - honeycomb.log(`serviceName: ${honeycomb.options.serviceName}`); - for (let [key, value] of Object.entries(honeycomb.features)) { - honeycomb.log(`${key}: ${value}`); - } + honeycomb.logger = honeycombLogger; const hasWriteKey = Boolean(honeycomb.options.writeKey && honeycomb.options.writeKey.length); - honeycomb.log(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`); - honeycomb.log(`dataset: ${honeycomb.options.dataset}`); - honeycomb.log(`apiHost: ${honeycomb.options.apiHost}`); - honeycomb.log(`sampleRate: ${honeycomb.options.sampleRate}`); + let honeycombConfig = { + serviceName: honeycomb.options.serviceName, + writeKey: `${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`, + dataset: honeycomb.options.dataset + }; + Object.assign(honeycombConfig, honeycomb.features); + honeycombLogger.debug({ + message: 'Honeycomb tracing enabled', + ...honeycombConfig + }); void ``; return function logMiddleware(next) { return async function inner(context) { @@ -2215,7 +2304,7 @@ function handleStatus({ git = process.env.GIT_COMMIT, reachability = defaultReac // void ``; -const boltzmannVersion = `0.5.3`; +const boltzmannVersion = `0.6.0`; // const devErrorTemplateSource = ` @@ -2920,7 +3009,7 @@ const validate = { * * The `validate.body` middleware applies [JSON schema]( "https://json-schema.org/") validation to incoming * request bodies. It intercepts the body that would be returned by - * \[`context.body`\] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is + * \[`context.body`] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is * passed through. * * `Ajv` is configured with `{useDefaults: true, allErrors: true}` by default. In diff --git a/examples/website/package-lock.json b/examples/website/package-lock.json index 5f715335..63e33a6a 100644 --- a/examples/website/package-lock.json +++ b/examples/website/package-lock.json @@ -10,14 +10,13 @@ "license": "ISC", "dependencies": { "@entropic/bole": "^4.0.1", -<<<<<<< HEAD - "@hapi/iron": "^6.0.0", -======= "@grpc/grpc-js": "^1.5.0", "@hapi/iron": "^6.0.0", "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.27.0", "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", "@opentelemetry/instrumentation-graphql": "^0.27.1", @@ -28,7 +27,6 @@ "@opentelemetry/sdk-trace-base": "^1.0.1", "@opentelemetry/sdk-trace-node": "^1.0.1", "@opentelemetry/semantic-conventions": "^1.0.1", ->>>>>>> 18b8135 (Update examples to use current release build) "@types/uuid": "^8.3.0", "accepts": "^1.3.7", "ajv": "^8.0.5", @@ -50,13 +48,8 @@ "devDependencies": { "@hapi/shot": "^5.0.4", "@types/uuid": "^8.3.0", -<<<<<<< HEAD - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", -======= "@typescript-eslint/eslint-plugin": "^5.12.0", "@typescript-eslint/parser": "^5.12.1", ->>>>>>> 18b8135 (Update examples to use current release build) "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -664,8 +657,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, -<<<<<<< HEAD -======= "node_modules/@grpc/grpc-js": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", @@ -696,7 +687,6 @@ "node": ">=6" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -878,21 +868,12 @@ } }, "node_modules/@nodelib/fs.scandir": { -<<<<<<< HEAD - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.4", -======= "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", ->>>>>>> 18b8135 (Update examples to use current release build) "run-parallel": "^1.1.9" }, "engines": { @@ -900,36 +881,21 @@ } }, "node_modules/@nodelib/fs.stat": { -<<<<<<< HEAD - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", -======= "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { -<<<<<<< HEAD - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.4", -======= "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", ->>>>>>> 18b8135 (Update examples to use current release build) "fastq": "^1.6.0" }, "engines": { @@ -937,24 +903,13 @@ } }, "node_modules/@opentelemetry/api": { -<<<<<<< HEAD - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", - "integrity": "sha512-fJ0CzUf4favXihuD6dDUh4U6GPfEjswUy9w+N4SrIrX3wFi43bGb3BXPSctaWx3PQaRC3Rjsw12HWR+oRl9pRQ==", - "dependencies": { - "@opentelemetry/context-base": "^0.9.0" - }, -======= "version": "1.0.4", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8.0.0" } }, -<<<<<<< HEAD -======= "node_modules/@opentelemetry/api-metrics": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", @@ -974,7 +929,6 @@ "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@opentelemetry/context-base": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.9.0.tgz", @@ -984,20 +938,6 @@ } }, "node_modules/@opentelemetry/core": { -<<<<<<< HEAD - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.9.0.tgz", - "integrity": "sha512-OU4qmYbDTilvdNgr9rXIGgBh1GENPbQrkyAzob5l/4/blqTDi75a5S/ZfkNjweyVvufVbp81rpvSxu9oN9tg2g==", - "dependencies": { - "@opentelemetry/api": "^0.9.0", - "@opentelemetry/context-base": "^0.9.0", - "semver": "^7.1.3" - }, - "engines": { - "node": ">=8.5.0" - } - }, -======= "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", @@ -1046,6 +986,25 @@ "@opentelemetry/api": "^1.0.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.27.0.tgz", + "integrity": "sha512-Q1PlH9iR3RUiLDnSbKmaAdXEuquvI0oLIN1WW37tUyTuqK5BArPXMzcquQtX/aG+4T5I6IHzgCpZxiedhW42Wg==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "protobufjs": "^6.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, "node_modules/@opentelemetry/instrumentation": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", @@ -1336,7 +1295,6 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1377,13 +1335,6 @@ "dev": true }, "node_modules/@types/json-schema": { -<<<<<<< HEAD - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true - }, -======= "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", @@ -1399,7 +1350,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/@types/uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", @@ -1407,24 +1357,6 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { -<<<<<<< HEAD - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz", - "integrity": "sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "4.13.0", - "@typescript-eslint/scope-manager": "4.13.0", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" -======= "version": "5.12.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz", "integrity": "sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==", @@ -1442,20 +1374,14 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { -<<<<<<< HEAD - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" -======= "@typescript-eslint/parser": "^5.0.0", "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "peerDependenciesMeta": { "typescript": { @@ -1463,45 +1389,6 @@ } } }, -<<<<<<< HEAD - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz", - "integrity": "sha512-/ZsuWmqagOzNkx30VWYV3MNB/Re/CGv/7EzlqZo5RegBN8tMuPaBgNK6vPBCQA8tcYrbsrTdbx3ixMRRKEEGVw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.13.0.tgz", - "integrity": "sha512-KO0J5SRF08pMXzq9+abyHnaGQgUJZ3Z3ax+pmqz9vl81JxmTTOUfQmq7/4awVfq09b6C4owNlOgOwp61pYRBSg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "4.13.0", - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/typescript-estree": "4.13.0", - "debug": "^4.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" -======= "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -1524,18 +1411,13 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { -<<<<<<< HEAD - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" -======= "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "peerDependenciesMeta": { "typescript": { @@ -1544,18 +1426,6 @@ } }, "node_modules/@typescript-eslint/scope-manager": { -<<<<<<< HEAD - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz", - "integrity": "sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" -======= "version": "5.12.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz", "integrity": "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==", @@ -1566,22 +1436,12 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, -<<<<<<< HEAD - "node_modules/@typescript-eslint/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.13.0.tgz", - "integrity": "sha512-/+aPaq163oX+ObOG00M0t9tKkOgdv9lq0IQv/y4SqGkAXmhFmCfgsELV7kOCTb2vVU5VOmVwXBXJTDr353C1rQ==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" -======= "node_modules/@typescript-eslint/type-utils": { "version": "5.12.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz", @@ -1615,7 +1475,6 @@ "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", @@ -1623,24 +1482,6 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { -<<<<<<< HEAD - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz", - "integrity": "sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.13.0", - "@typescript-eslint/visitor-keys": "4.13.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" -======= "version": "5.12.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz", "integrity": "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==", @@ -1656,7 +1497,6 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", @@ -1668,19 +1508,6 @@ } } }, -<<<<<<< HEAD - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz", - "integrity": "sha512-6RoxWK05PAibukE7jElqAtNMq+RWZyqJ6Q/GdIxaiUj2Ept8jh8+FUVlbq9WxMYxkmEOPvCE5cRSyupMpwW31g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.13.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" -======= "node_modules/@typescript-eslint/utils": { "version": "5.12.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz", @@ -1743,7 +1570,6 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) }, "funding": { "type": "opencollective", @@ -1751,21 +1577,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { -<<<<<<< HEAD - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true, - "engines": { - "node": ">=10" -======= "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ->>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/a-sync-waterfall": { @@ -1779,8 +1596,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, -<<<<<<< HEAD -======= "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -1792,7 +1607,6 @@ "node": ">=6.5" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -2132,8 +1946,6 @@ "tweetnacl": "^0.14.3" } }, -<<<<<<< HEAD -======= "node_modules/bignumber.js": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", @@ -2142,7 +1954,6 @@ "node": "*" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -2585,10 +2396,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2599,10 +2406,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -2610,21 +2413,12 @@ "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", -<<<<<<< HEAD - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true -======= "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" ->>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -2633,10 +2427,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2650,10 +2440,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-regex": "^5.0.0" }, @@ -2912,14 +2698,6 @@ "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" }, "node_modules/debug": { -<<<<<<< HEAD - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" -======= "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", @@ -2933,7 +2711,6 @@ "supports-color": { "optional": true } ->>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/decamelize": { @@ -3036,18 +2813,6 @@ "node": ">=8" } }, -<<<<<<< HEAD - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -3172,10 +2937,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=6" } @@ -3317,21 +3078,12 @@ } }, "node_modules/eslint-scope": { -<<<<<<< HEAD - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", -======= "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", ->>>>>>> 18b8135 (Update examples to use current release build) "estraverse": "^4.1.1" }, "engines": { @@ -3611,8 +3363,6 @@ "node": ">=0.10.0" } }, -<<<<<<< HEAD -======= "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -3621,7 +3371,6 @@ "node": ">=6" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", @@ -3659,35 +3408,19 @@ "dev": true }, "node_modules/fast-glob": { -<<<<<<< HEAD - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", -======= "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", -<<<<<<< HEAD - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" -======= "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" ->>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/fast-json-stable-stringify": { @@ -3707,15 +3440,9 @@ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "node_modules/fastq": { -<<<<<<< HEAD - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", -======= "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3947,14 +3674,11 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, -<<<<<<< HEAD -======= "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/function-loop": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", @@ -3977,8 +3701,6 @@ "is-windows": "^1.0.2" } }, -<<<<<<< HEAD -======= "node_modules/gaxios": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", @@ -4029,7 +3751,6 @@ "node": ">=10" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4043,10 +3764,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -4158,15 +3875,9 @@ } }, "node_modules/glob-parent": { -<<<<<<< HEAD - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", -======= "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", ->>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "dependencies": { "is-glob": "^4.0.1" @@ -4203,28 +3914,16 @@ } }, "node_modules/globby": { -<<<<<<< HEAD - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", -======= "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", -<<<<<<< HEAD - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", -======= "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", ->>>>>>> 18b8135 (Update examples to use current release build) "slash": "^3.0.0" }, "engines": { @@ -4235,15 +3934,9 @@ } }, "node_modules/globby/node_modules/ignore": { -<<<<<<< HEAD - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", -======= "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "engines": { "node": ">= 4" @@ -4277,8 +3970,6 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, -<<<<<<< HEAD -======= "node_modules/graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", @@ -4287,7 +3978,6 @@ "node": ">= 10.x" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -4333,8 +4023,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, -<<<<<<< HEAD -======= "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4346,7 +4034,6 @@ "node": ">= 0.4.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/has-ansi": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", @@ -4409,8 +4096,6 @@ "shimmer": "^1.2.1" } }, -<<<<<<< HEAD -======= "node_modules/honeycomb-beeline/node_modules/@opentelemetry/api": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.9.0.tgz", @@ -4435,7 +4120,6 @@ "node": ">=8.5.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4661,8 +4345,6 @@ "is-ci": "bin.js" } }, -<<<<<<< HEAD -======= "node_modules/is-core-module": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", @@ -4674,7 +4356,6 @@ "url": "https://github.com/sponsors/ljharb" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4694,15 +4375,9 @@ } }, "node_modules/is-glob": { -<<<<<<< HEAD - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", -======= "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", ->>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" @@ -4767,10 +4442,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -5025,8 +4696,6 @@ "node": ">=4" } }, -<<<<<<< HEAD -======= "node_modules/json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", @@ -5035,7 +4704,6 @@ "bignumber.js": "^9.0.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -5276,14 +4944,11 @@ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, -<<<<<<< HEAD -======= "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -5320,14 +4985,11 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, -<<<<<<< HEAD -======= "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -5342,14 +5004,11 @@ "node": ">=0.8.6" } }, -<<<<<<< HEAD -======= "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -5409,18 +5068,6 @@ } }, "node_modules/micromatch": { -<<<<<<< HEAD - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" -======= "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", @@ -5431,7 +5078,6 @@ }, "engines": { "node": ">=8.6" ->>>>>>> 18b8135 (Update examples to use current release build) } }, "node_modules/mime": { @@ -5521,14 +5167,11 @@ "mkdirp": "bin/cmd.js" } }, -<<<<<<< HEAD -======= "node_modules/module-details-from-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5556,8 +5199,6 @@ "node": ">= 0.4.0" } }, -<<<<<<< HEAD -======= "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -5577,7 +5218,6 @@ } } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -6204,8 +5844,6 @@ "node": ">=8" } }, -<<<<<<< HEAD -======= "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -6220,7 +5858,6 @@ "node": ">=8" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -6228,15 +5865,9 @@ "dev": true }, "node_modules/picomatch": { -<<<<<<< HEAD - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", -======= "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", ->>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "engines": { "node": ">=8.6" @@ -6376,8 +6007,6 @@ "node": ">=0.4.0" } }, -<<<<<<< HEAD -======= "node_modules/protobufjs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", @@ -6403,7 +6032,6 @@ "pbts": "bin/pbts" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/proxy-agent": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", @@ -6486,8 +6114,6 @@ "url": "https://github.com/sponsors/ljharb" } }, -<<<<<<< HEAD -======= "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6508,7 +6134,6 @@ } ] }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -6582,15 +6207,9 @@ } }, "node_modules/regexpp": { -<<<<<<< HEAD - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", -======= "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "engines": { "node": ">=8" @@ -6704,10 +6323,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=0.10.0" } @@ -6720,8 +6335,6 @@ "node": ">=0.10.0" } }, -<<<<<<< HEAD -======= "node_modules/require-in-the-middle": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", @@ -6732,15 +6345,12 @@ "resolve": "^1.12.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, -<<<<<<< HEAD -======= "node_modules/resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -6757,7 +6367,6 @@ "url": "https://github.com/sponsors/ljharb" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -6812,15 +6421,9 @@ "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "node_modules/run-parallel": { -<<<<<<< HEAD - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", -======= "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "funding": [ { @@ -6835,14 +6438,10 @@ "type": "consulting", "url": "https://feross.org/support" } -<<<<<<< HEAD - ] -======= ], "dependencies": { "queue-microtask": "^1.2.2" } ->>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -6863,18 +6462,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { -<<<<<<< HEAD - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", -======= "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { "lru-cache": "^6.0.0" }, ->>>>>>> 18b8135 (Update examples to use current release build) "bin": { "semver": "bin/semver.js" }, @@ -6908,8 +6501,6 @@ "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" }, -<<<<<<< HEAD -======= "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6926,7 +6517,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -7375,8 +6965,6 @@ "node": ">=8" } }, -<<<<<<< HEAD -======= "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -7388,7 +6976,6 @@ "url": "https://github.com/sponsors/ljharb" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -9566,14 +9153,11 @@ "node": ">=0.8" } }, -<<<<<<< HEAD -======= "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", @@ -9594,15 +9178,9 @@ } }, "node_modules/tsutils": { -<<<<<<< HEAD - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", - "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", -======= "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", ->>>>>>> 18b8135 (Update examples to use current release build) "dev": true, "dependencies": { "tslib": "^1.8.1" @@ -9667,8 +9245,6 @@ "is-typedarray": "^1.0.0" } }, -<<<<<<< HEAD -======= "node_modules/typescript": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", @@ -9683,7 +9259,6 @@ "node": ">=4.2.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -9953,8 +9528,6 @@ "extsprintf": "^1.2.0" } }, -<<<<<<< HEAD -======= "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -9969,7 +9542,6 @@ "webidl-conversions": "^3.0.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10065,10 +9637,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10085,10 +9653,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -10097,10 +9661,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "color-convert": "^2.0.1" }, @@ -10115,10 +9675,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "color-name": "~1.1.4" }, @@ -10129,31 +9685,17 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", -<<<<<<< HEAD - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true -======= "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" ->>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", -<<<<<<< HEAD - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true -======= "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" ->>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -10162,10 +9704,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10179,10 +9717,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-regex": "^5.0.0" }, @@ -10250,10 +9784,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=10" } @@ -10282,10 +9812,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -10303,10 +9829,6 @@ "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=10" } @@ -10315,10 +9837,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -10326,21 +9844,12 @@ "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", -<<<<<<< HEAD - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true -======= "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" ->>>>>>> 18b8135 (Update examples to use current release build) }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "engines": { "node": ">=8" } @@ -10349,10 +9858,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10366,10 +9871,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", -<<<<<<< HEAD - "dev": true, -======= ->>>>>>> 18b8135 (Update examples to use current release build) "dependencies": { "ansi-regex": "^5.0.0" }, @@ -11187,6 +10688,19 @@ "@opentelemetry/sdk-trace-base": "1.0.1" } }, + "@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.27.0.tgz", + "integrity": "sha512-Q1PlH9iR3RUiLDnSbKmaAdXEuquvI0oLIN1WW37tUyTuqK5BArPXMzcquQtX/aG+4T5I6IHzgCpZxiedhW42Wg==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "protobufjs": "^6.9.0" + } + }, "@opentelemetry/instrumentation": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", @@ -13348,15 +12862,9 @@ } }, "glob-parent": { -<<<<<<< HEAD - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", -======= "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", ->>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "requires": { "is-glob": "^4.0.1" @@ -13742,15 +13250,9 @@ "dev": true }, "is-glob": { -<<<<<<< HEAD - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", -======= "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", ->>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true, "requires": { "is-extglob": "^2.1.1" @@ -14254,14 +13756,11 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, -<<<<<<< HEAD -======= "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, ->>>>>>> 18b8135 (Update examples to use current release build) "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -14909,15 +14408,9 @@ "dev": true }, "picomatch": { -<<<<<<< HEAD - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", -======= "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", ->>>>>>> 18b8135 (Update examples to use current release build) "devOptional": true }, "pkg-dir": { @@ -15014,8 +14507,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, -<<<<<<< HEAD -======= "protobufjs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", @@ -15036,7 +14527,6 @@ "long": "^4.0.0" } }, ->>>>>>> 18b8135 (Update examples to use current release build) "proxy-agent": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", diff --git a/examples/website/package.json b/examples/website/package.json index dbd7f701..d5f40711 100644 --- a/examples/website/package.json +++ b/examples/website/package.json @@ -1,18 +1,14 @@ { - "name": "website", - "description": "", - "version": "1.0.0", "author": "", - "boltzmann": { - "version": "0.5.3", - "csrf": true, - "githubci": false, - "honeycomb": true, - "jwt": true, - "ping": true, - "status": true, - "templates": true + "description": "", + "directories": { + "test": "tests" }, + "keywords": [], + "license": "ISC", + "main": "index.js", + "name": "website", + "version": "1.0.0", "dependencies": { "@entropic/bole": "^4.0.1", "@grpc/grpc-js": "^1.5.0", @@ -20,6 +16,8 @@ "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.27.0", "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", "@opentelemetry/instrumentation-graphql": "^0.27.1", @@ -67,9 +65,6 @@ "supports-hyperlinks": "^2.1.0", "tap": "^15.1.5" }, - "keywords": [], - "license": "ISC", - "main": "index.js", "scripts": { "boltzmann:docs": "npx boltzmann-cli --docs", "boltzmann:routes": "node -e 'require(\"./boltzmann\").printRoutes()'", @@ -78,8 +73,6 @@ "posttest": "npm run lint", "start": "nodemon ./boltzmann.js", "test": "c8 tap --no-cov tests" -<<<<<<< HEAD -======= }, "boltzmann": { "version": "0.6.0", @@ -89,8 +82,6 @@ "jwt": true, "ping": true, "status": true, - "templates": true, - "debug": false ->>>>>>> 18b8135 (Update examples to use current release build) + "templates": true } -} +} \ No newline at end of file From 1f7c14041572adabfa468c31479afd4bb4eecbab Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 21:31:57 -0500 Subject: [PATCH 111/167] Respect the same defaults as vanilla beelines --- templates/boltzmann/core/honeycomb.ts | 42 ++++++++++++++------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index e01c3889..4220e558 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -398,7 +398,7 @@ class Honeycomb { const writeKey = env.HONEYCOMB_WRITEKEY || null const dataset = env.HONEYCOMB_DATASET || null const apiHost = env.HONEYCOMB_API_HOST || null - let sampleRate = 1 + let sampleRate: number = 1 sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) @@ -438,15 +438,15 @@ class Honeycomb { this.initialized = true return } + try { const writeKey = this.writeKey const dataset = this.dataset - const sampleRate = this.options.sampleRate || 1 - const serviceName = this.options.serviceName + const sampleRate = this.sampleRate + const serviceName = this.serviceName - if (!this.features.otel) { + if (this.features.beeline) { beeline({ writeKey, dataset, sampleRate, serviceName }) - this.initialized = true return } @@ -528,11 +528,6 @@ class Honeycomb { } } - // These accessors are type guards that ensure you're working - // with a defined/non-null property. It's a bit of 6-to-1 and - // half a dozen on the other, because you trade ifs for - // try/catches and honeycomb can basically never throw. Even - // so, it saves a little bit of boilerplate. public get writeKey (): string { if (this.options.writeKey) { return this.options.writeKey @@ -540,18 +535,25 @@ class Honeycomb { throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!') } - public get dataset () { - if (this.options.dataset) { - return this.options.dataset - } - throw new HoneycombError('HONEYCOMB_DATASET is undefined!') + public get dataset (): string { + // The beeline default, here for OpenTelemetry's benefit + return this.options.dataset || "nodejs" } - public get apiHost () { - if (this.options.apiHost) { - return this.options.apiHost - } - throw new HoneycombError('HONEYCOMB_API_HOST is undefined!') + public get apiHost (): string { + return this.options.apiHost || ( + this.features.beeline + ? "https://api.honeycomb.io" + : "grpc://api.honeycomb.io:443" + ) + } + + public get sampleRate (): number { + return this.options.sampleRate || 1 + } + + public get serviceName (): string { + return this.options.serviceName || 'boltzmann' } // We *do* have a handful of logging use cases... From 4436a8555929b9761a11a1e0a4df6936a1a3b67e Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 21:32:53 -0500 Subject: [PATCH 112/167] Don't write debug feature to package.json --- src/settings.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/settings.rs b/src/settings.rs index 7b317e11..6cdb1ec7 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -103,7 +103,7 @@ pub struct Settings { #[serde(skip_serializing_if = "Option::is_none")] pub(crate) typescript: Option, - #[serde(skip_serializing_if = "Option::is_none")] + #[serde(skip_serializing)] pub(crate) debug: Option, #[serde(flatten)] @@ -168,6 +168,7 @@ impl Settings { // oddballs: typescript: if is_typescript { Some(true) } else { None }, version: Some(version), + volta: cast(&flags.volta, &self.volta, flags.all), #[cfg(debug_assertions)] debug: Some(true), From 363fae0351b58a9c45f0ccddc077c63a37584c24 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Feb 2022 21:33:15 -0500 Subject: [PATCH 113/167] Manage node version with volta (and also template it in the github action!) --- src/main.rs | 43 +++++++++++++++++++++++++++++++- src/settings.rs | 10 +++++++- templates/github-action-test.yml | 4 +-- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 585c92e3..8bb425ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,6 +25,9 @@ static NPM: &str = "npm"; #[cfg(target_os = "windows")] static NPM: &str = "npm.cmd"; +static VOLTA: &str = "volta"; +static NODE_VERSION: &str = "16"; + #[derive(Clone, Serialize, Parser)] #[clap( name = "boltzmann", @@ -95,6 +98,9 @@ pub struct Flags { /// Enable asset bundling via ESBuild esbuild: Option>, + #[structopt(long, help = "Enable node version management via Volta")] + volta: Option>, + // Convenient option groups next. These aren't saved individually. #[clap( long, @@ -161,6 +167,11 @@ struct RunScriptSpec { versions: Vec, } +#[derive(Debug, Deserialize, Serialize)] +struct VoltaSpec { + node: String, +} + #[derive(Debug, Default, Deserialize, Serialize)] struct PackageJson { #[serde(flatten)] @@ -177,6 +188,9 @@ struct PackageJson { scripts: Option>, boltzmann: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + volta: Option>, } fn load_package_json(flags: &Flags, default_settings: Settings) -> Option { @@ -395,7 +409,7 @@ fn main() -> anyhow::Result<(), anyhow::Error> { } let settings = package_json.boltzmann.take().unwrap(); - let updated_settings = settings.merge_flags(version.clone(), &flags); + let updated_settings = settings.merge_flags(version.clone(), NODE_VERSION.to_string(), &flags); render::scaffold(&mut target, &updated_settings).context("Failed to render Boltzmann files")?; @@ -498,6 +512,13 @@ fn main() -> anyhow::Result<(), anyhow::Error> { package_json.dev_dependencies.replace(devdeps); package_json.boltzmann.replace(updated_settings.clone()); + match updated_settings.volta { + Some(true) => (), + _ => { + package_json.volta.replace(None); + }, + } + // Update package.json run scripts. // We manage run scripts that meet the following criteria: // - name starts with `boltzman:`, always @@ -601,6 +622,26 @@ fn main() -> anyhow::Result<(), anyhow::Error> { serde_json::to_writer_pretty(&mut fd, &package_json)?; target.pop(); + if let Some(true) = updated_settings.volta { + let mut subproc = Exec::cmd(VOLTA).arg("pin").arg(format!("node@{}", NODE_VERSION)).cwd(&target); + + subproc = if verbosity < 2 { + subproc.stdout(NullFile).stderr(NullFile) + } else { + subproc + }; + + info!(" running volta pin..."); + let exit_status = subproc.join()?; + + match exit_status { + ExitStatus::Exited(0) => {}, + _ => { + return Err(anyhow!("volta pin exited with non-zero status").into()); + } + } + }; + let mut subproc = Exec::cmd(NPM).arg("i").cwd(&target); subproc = if verbosity < 2 { diff --git a/src/settings.rs b/src/settings.rs index 6cdb1ec7..5a638dde 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -58,6 +58,9 @@ pub struct Settings { #[serde(skip_serializing_if = "Option::is_none")] pub(crate) version: Option, + #[serde(skip_serializing)] + pub(crate) node_version: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub(crate) csrf: Option, @@ -106,12 +109,15 @@ pub struct Settings { #[serde(skip_serializing)] pub(crate) debug: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub(crate) volta: Option, + #[serde(flatten)] pub(crate) rest: HashMap, } impl Settings { - pub fn merge_flags(&self, version: String, flags: &Flags) -> Settings { + pub fn merge_flags(&self, version: String, node_version: String, flags: &Flags) -> Settings { // TODO: This is becoming horrifying. let cast = |xs: &Option>, default: &Option, @@ -168,6 +174,7 @@ impl Settings { // oddballs: typescript: if is_typescript { Some(true) } else { None }, version: Some(version), + node_version: Some(node_version), volta: cast(&flags.volta, &self.volta, flags.all), #[cfg(debug_assertions)] @@ -273,6 +280,7 @@ impl From for Context { .version .unwrap_or_else(|| "".to_string())[..], ); + ctxt.insert("node_version", &settings.node_version.unwrap()); ctxt } diff --git a/templates/github-action-test.yml b/templates/github-action-test.yml index 5654f62f..d079fb64 100644 --- a/templates/github-action-test.yml +++ b/templates/github-action-test.yml @@ -25,10 +25,10 @@ jobs: {% endif %} steps: - uses: actions/checkout@v2 - - name: Use Node.js 16.x + - name: Use Node.js {{ node_version }}.x uses: actions/setup-node@v2 with: - node-version: '16.x' + node-version: '{{ node_version }}.x' - name: npm ci run: npm ci From edb00e2198accce6f95718e8f1af2436c54c97c9 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Feb 2022 16:43:28 -0500 Subject: [PATCH 114/167] Switch from GRPC exporter to HTTP exporter - need to update env vars --- templates/boltzmann/core/honeycomb.ts | 74 +++++++++++++-------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 4220e558..276a3f6b 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -30,11 +30,9 @@ import bole from '@entropic/bole' import beeline from 'honeycomb-beeline' // ...but are migrating to OpenTelemetry: -import * as grpc from '@grpc/grpc-js' import * as otel from '@opentelemetry/api' import * as otelCore from '@opentelemetry/core' -import { OTLPExporterConfigNode, OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc' -import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http' +import { OTLPTraceExporter, otlpTypes } from '@opentelemetry/exporter-trace-otlp-http' import * as otelResources from '@opentelemetry/resources' import { NodeSDK as OtelSDK } from '@opentelemetry/sdk-node' import * as otelTraceBase from '@opentelemetry/sdk-trace-base' @@ -109,7 +107,12 @@ class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase } } -type HoneycombConfigNode = OTLPExporterConfigNode & { honeycomb?: Honeycomb } +type HoneycombOTLPHeaders = { + 'x-honeycomb-team': string, + 'x-honeycomb-dataset': string +} + +type HoneycombConfigNode = otlpTypes.OTLPExporterConfigBase & { honeycomb?: Honeycomb } class HoneycombTraceExporter extends OTLPTraceExporter { private _honeycomb?: Honeycomb @@ -180,14 +183,14 @@ interface HoneycombFeatures { // They're exposed on the Honeycomb class but in a nested // namespace. interface OtelFactories { - metadata: (writeKey: string, dataset: string) => grpc.Metadata + headers: (writeKey: string, dataset: string) => HoneycombOTLPHeaders sampler: (sampleRate: number) => otel.Sampler resource: (serviceName: string) => otelResources.Resource tracerProvider: ( resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter: (url: string, metadata: grpc.Metadata, honeycomb?: Honeycomb) => OTLPTraceExporter + traceExporter: (url: string, headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] sdk: ( @@ -198,11 +201,11 @@ interface OtelFactories { } const defaultOtelFactories: OtelFactories = { - metadata (writeKey: string, dataset: string): grpc.Metadata { - const metadata = new grpc.Metadata() - metadata.set('x-honeycomb-team', writeKey) - metadata.set('x-honeycomb-dataset', dataset) - return metadata + headers (writeKey: string, dataset: string): HoneycombOTLPHeaders { + return { + 'x-honeycomb-team': writeKey, + 'x-honeycomb-dataset': dataset + } }, // create a Sampler object, which is used to tune @@ -224,12 +227,11 @@ const defaultOtelFactories: OtelFactories = { return new NodeTracerProvider({ resource, sampler }) }, - // Export traces to an OTLP endpoint with GRPC - traceExporter (url: string, metadata: grpc.Metadata, honeycomb?: Honeycomb): OTLPTraceExporter { + // Export traces to an OTLP endpoint with HTTP + traceExporter (url: string, headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb): OTLPTraceExporter { return new HoneycombTraceExporter({ url, - credentials: grpc.credentials.createSsl(), - metadata, + headers, honeycomb }) }, @@ -309,14 +311,14 @@ const defaultOtelFactories: OtelFactories = { // are created. The Honeycomb class allows for // passing overrides into its constructor. interface OtelFactoryOverrides { - metadata?: (writeKey: string, dataset: string) => grpc.Metadata + headers?: (writeKey: string, dataset: string) => HoneycombOTLPHeaders sampler?: (sampleRate: Number) => otel.Sampler resource?: (serviceName: string) => otelResources.Resource tracerProvider?: ( resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter?: (url: string, metadata: grpc.Metadata, honeycomb?: Honeycomb) => OTLPTraceExporter + traceExporter?: (url: string, headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations?: () => OtelInstrumentation[]; sdk?: ( @@ -453,11 +455,11 @@ class Honeycomb { const f = this.factories const apiHost: string = this.apiHost - const metadata: grpc.Metadata = f.metadata(writeKey, dataset) + const headers: HoneycombOTLPHeaders = f.headers(writeKey, dataset) const resource: otelResources.Resource = f.resource(serviceName) const sampler: otel.Sampler = f.sampler(sampleRate) - const exporter = f.traceExporter(apiHost, metadata, this) + const exporter = f.traceExporter(apiHost, headers, this) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() @@ -619,7 +621,6 @@ class Honeycomb { export { beeline, bole, - grpc, otel, otelCore, OTLPTraceExporter, @@ -643,8 +644,9 @@ export { defaultOtelFactories, Honeycomb, HoneycombError, - HoneycombOptions, HoneycombFeatures, + HoneycombOptions, + HoneycombOTLPHeaders, HoneycombSpanProcessor, OtelFactories, OtelFactoryOverrides, @@ -860,21 +862,19 @@ if (require.main === module) { }) }) test('factories', async (t: Test) => { - t.test('metadata', async (assert: Test) => { - const metadata = defaultOtelFactories.metadata( + t.test('headers', async (assert: Test) => { + const headers = defaultOtelFactories.headers( 'some write key', 'some dataset' ) assert.same( - metadata.get('x-honeycomb-team'), - ['some write key'], - 'should have the write key set' - ) - assert.same( - metadata.get('x-honeycomb-dataset'), - ['some dataset'], - 'shoupld have the dataset set' + headers, + { + 'x-honeycomb-team': 'some write key', + 'x-honeycomb-dataset': 'some dataset' + }, + 'should have the expected headers' ) }) @@ -908,20 +908,20 @@ if (require.main === module) { test('traceExporter', async (assert: Test) => { const url = 'grpc://otel.website:9000' - const metadata = defaultOtelFactories.metadata( + const headers = defaultOtelFactories.headers( 'some write key', 'some dataset' ) - const exporter = defaultOtelFactories.traceExporter(url, metadata) - assert.equal(exporter.url, 'otel.website:9000') + const exporter = defaultOtelFactories.traceExporter(url, headers) + assert.equal(exporter.url, 'grpc://otel.website:9000') }) test('spanProcessor', async (assert: Test) => { assert.doesNotThrow(() => { const exporter = defaultOtelFactories.traceExporter( 'grpc://example.com', - defaultOtelFactories.metadata( + defaultOtelFactories.headers( 'some write key', 'some dataset' ) @@ -946,7 +946,7 @@ if (require.main === module) { const resource = defaultOtelFactories.resource('test-service') const exporter = defaultOtelFactories.traceExporter( 'grpc://example.com', - defaultOtelFactories.metadata( + defaultOtelFactories.headers( 'some write key', 'some dataset' ) @@ -962,7 +962,7 @@ if (require.main === module) { honeycomb.init() - assert.same(honeycomb.traceExporter?.url, 'otel.website:9000') + assert.same(honeycomb.traceExporter?.url, 'grpc://otel.website:9000') assert.doesNotThrow(async () => { await honeycomb.start() From b3f9ed422e2b6d29f4d10472355fa89b9ac55703 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Feb 2022 17:20:14 -0500 Subject: [PATCH 115/167] Switch on OTEL_* env vars instead of HONEYCOMB_API_HOST --- templates/boltzmann/core/honeycomb.ts | 113 ++++++++------------------ templates/boltzmann/middleware/log.ts | 1 - 2 files changed, 32 insertions(+), 82 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 276a3f6b..dfc504de 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -162,9 +162,6 @@ interface HoneycombOptions { writeKey?: string | null dataset?: string | null - // If using OpenTelemetry, this is a grpc:// address - apiHost?: string | null - // Tunables, etc. sampleRate?: number } @@ -190,7 +187,7 @@ interface OtelFactories { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter: (url: string, headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter + traceExporter: (headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] sdk: ( @@ -228,9 +225,8 @@ const defaultOtelFactories: OtelFactories = { }, // Export traces to an OTLP endpoint with HTTP - traceExporter (url: string, headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb): OTLPTraceExporter { + traceExporter (headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb): OTLPTraceExporter { return new HoneycombTraceExporter({ - url, headers, honeycomb }) @@ -318,7 +314,7 @@ interface OtelFactoryOverrides { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter?: (url: string, headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter + traceExporter?: (headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations?: () => OtelInstrumentation[]; sdk?: ( @@ -394,15 +390,29 @@ class Honeycomb { // logic twice we let the prelude inject it when creating the honeycomb // object. public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { - // If there's no write key we won't get very far anyway + // The bare minimum requirement for honeycomb tracing is the write key const disable = !env.HONEYCOMB_WRITEKEY - let otel: boolean = false + + // Beelines should pick these up automatically, but we'll need them to + // configure OTLP headers const writeKey = env.HONEYCOMB_WRITEKEY || null const dataset = env.HONEYCOMB_DATASET || null - const apiHost = env.HONEYCOMB_API_HOST || null - let sampleRate: number = 1 - sampleRate = Number(env.HONEYCOMB_SAMPLE_RATE || 1) + // OpenTelemetry is configured with a huge pile of `OTEL_*` environment + // variables. If any of them are defined, we'll use OpenTelemetry instead + // of beelines. + // + // For a broad overview of most of these variables, see: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md + const otel: boolean = Object.entries(env).some(([name, value]) => { + return name.startsWith('OTEL_') && value && value.length; + }); + + // beelines don't have a standard environment variable for configuring + // the sample rate. OpenTelemetry has *some* mechanisms for configuring + // samplers but are "involved." Therefore, this variable gets passed to + // both beelines and the OpenTelemetry Sampler. + let sampleRate: number = Number(env.HONEYCOMB_SAMPLE_RATE || 1) if (isNaN(sampleRate)) { Honeycomb.log( @@ -412,20 +422,12 @@ class Honeycomb { sampleRate = 1 } - // If the API host is a grpc:// endpoint, we feature switch to - // OpenTelemetry. There are prior uses of this variable here but - // they should've been using https://. - if (!disable && apiHost) { - otel = /^grpc:\/\//.test(apiHost) - } - return { serviceName, disable, otel, writeKey, dataset, - apiHost, sampleRate } } @@ -453,13 +455,12 @@ class Honeycomb { } const f = this.factories - const apiHost: string = this.apiHost const headers: HoneycombOTLPHeaders = f.headers(writeKey, dataset) const resource: otelResources.Resource = f.resource(serviceName) const sampler: otel.Sampler = f.sampler(sampleRate) - const exporter = f.traceExporter(apiHost, headers, this) + const exporter = f.traceExporter(headers, this) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() @@ -542,14 +543,6 @@ class Honeycomb { return this.options.dataset || "nodejs" } - public get apiHost (): string { - return this.options.apiHost || ( - this.features.beeline - ? "https://api.honeycomb.io" - : "grpc://api.honeycomb.io:443" - ) - } - public get sampleRate (): number { return this.options.sampleRate || 1 } @@ -716,7 +709,6 @@ function createMockHoneycomb(): Honeycomb { otel: true, writeKey: 'SOME_WRITEKEY', dataset: 'SOME_DATASET', - apiHost: 'grpc://otel.website:9000', sampleRate: 1 }, { @@ -766,48 +758,27 @@ if (require.main === module) { false, 'should not use otel when no env vars' ) - assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).otel, - false, - 'should not use otel when env vars are blank' - ) - assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).otel, - false, - 'should not use otel when only write key is defined' - ) assert.equal( Honeycomb.parseEnv( - 'boltzmann', + 'boltzmann', { - HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'https://refinery.website' + HONEYCOMB_WRITEKEY: '', + HONEYCOMB_API_HOST: 'https://refinery.tech' } ).otel, false, - 'should not use otel when API host is not grpc://' + 'should not use otel when only beeline variables are set' ) assert.equal( Honeycomb.parseEnv( 'boltzmann', { HONEYCOMB_WRITEKEY: 'some write key', - HONEYCOMB_API_HOST: 'grpc://otel.website' + OTEL_EXPORTER_OTLP_ENDPOINT: 'https://refinery.website' } ).otel, true, - '*should* use otel when API host is grpc://' - ) - assert.equal( - Honeycomb.parseEnv( - 'boltzmann', - { - HONEYCOMB_WRITEKEY: '', - HONEYCOMB_API_HOST: 'grpc://otel.website' - } - ).otel, - false, - 'should not use otel when write key is empty, even if API host is grpc://' + 'should use otel when OTEL_EXPORTER_OTLP_ENDPOINT is defined' ) }) @@ -844,22 +815,6 @@ if (require.main === module) { 'should be 1 if not parseable' ) }) - - t.test('options.apiHost', async (assert: Test) => { - assert.equal( - Honeycomb.parseEnv('boltzmann', {}).apiHost, - null, - 'should be null when no env var' - ) - assert.equal( - Honeycomb.parseEnv( - 'boltzmann',{ - HONEYCOMB_API_HOST: 'https://example.com' - }).apiHost, - 'https://example.com', - 'should be url if url' - ) - }) }) test('factories', async (t: Test) => { t.test('headers', async (assert: Test) => { @@ -907,20 +862,19 @@ if (require.main === module) { }) test('traceExporter', async (assert: Test) => { - const url = 'grpc://otel.website:9000' const headers = defaultOtelFactories.headers( 'some write key', 'some dataset' ) - const exporter = defaultOtelFactories.traceExporter(url, headers) - assert.equal(exporter.url, 'grpc://otel.website:9000') + assert.doesNotThrow(() => { + defaultOtelFactories.traceExporter(headers) + }) }) test('spanProcessor', async (assert: Test) => { assert.doesNotThrow(() => { const exporter = defaultOtelFactories.traceExporter( - 'grpc://example.com', defaultOtelFactories.headers( 'some write key', 'some dataset' @@ -945,7 +899,6 @@ if (require.main === module) { assert.doesNotThrow(() => { const resource = defaultOtelFactories.resource('test-service') const exporter = defaultOtelFactories.traceExporter( - 'grpc://example.com', defaultOtelFactories.headers( 'some write key', 'some dataset' @@ -962,8 +915,6 @@ if (require.main === module) { honeycomb.init() - assert.same(honeycomb.traceExporter?.url, 'grpc://otel.website:9000') - assert.doesNotThrow(async () => { await honeycomb.start() await honeycomb.stop() diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 1f6dfb46..7575f133 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -43,7 +43,6 @@ function log ({ honeycomb.log(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`) honeycomb.log(`dataset: ${honeycomb.options.dataset}`) - honeycomb.log(`apiHost: ${honeycomb.options.apiHost}`) honeycomb.log(`sampleRate: ${honeycomb.options.sampleRate}`) void `{% endif %}` From 7a0a172b4dffd27095d9e5968eebd72a3c8ec5a0 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 06:51:03 -0500 Subject: [PATCH 116/167] Use otel diagnostic logger --- templates/boltzmann/core/honeycomb.ts | 175 +++++++++++--------- templates/boltzmann/core/prelude.ts | 2 +- templates/boltzmann/middleware/honeycomb.ts | 4 +- templates/boltzmann/middleware/log.ts | 17 +- 4 files changed, 101 insertions(+), 97 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index dfc504de..b3bf8afa 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -25,6 +25,7 @@ Good luck! // Dependencies used downstream - it's worth your time to look at how these // are treated in prelude.ts! import bole from '@entropic/bole' +import isDev from 'are-we-dev' // We continue to support beelines... import beeline from 'honeycomb-beeline' @@ -69,6 +70,59 @@ void `{% endif %}` class HoneycombError extends Error { } +class HoneycombDiagLogger implements otel.DiagLogger { + public logger?: typeof bole + + private _log(level: 'error' | 'warn' | 'info' | 'debug', message: string, args: unknown[]): void { + if (this.logger) { + this.logger[level](message, ...args) + return + } + + if (isDev()) { + console.log(message) + return + } + + const line: any = { + time: (new Date()).toISOString(), + level, + name: 'boltzmann:honeycomb', + message, + args + } + + try { + // are the args JSON-serializable? + console.log(JSON.stringify(line)) + // SURVEY SAYS... + } catch (_) { + // ...ok, make it a string as a fallback + line.args = require('util').format('%o', line.args) + console.log(JSON.stringify(line)) + } + } + error(message: string, ...args: unknown[]): void { + this._log('error', message, args) + } + warn(message: string, ...args: unknown[]): void { + this._log('warn', message, args) + } + info(message: string, ...args: unknown[]): void { + this._log('info', message, args) + } + debug(message: string, ...args: unknown[]): void { + this._log('debug', message, args) + } + verbose(message: string, ...args: unknown[]): void { + this._log('debug', message, args) + } +} + +const _diagLogger = new HoneycombDiagLogger() + +otel.diag.setLogger(_diagLogger, otelCore.getEnv().OTEL_LOG_LEVEL) + // There's a bug in the trace base library where the SimpleSpanExporter doesn't // actually conform to the SpanExporter interface! onStart in particular // doesn't take the context argument. This makes typescript extremely @@ -115,17 +169,8 @@ type HoneycombOTLPHeaders = { type HoneycombConfigNode = otlpTypes.OTLPExporterConfigBase & { honeycomb?: Honeycomb } class HoneycombTraceExporter extends OTLPTraceExporter { - private _honeycomb?: Honeycomb - constructor(config: HoneycombConfigNode = {}) { super(config) - this._honeycomb = config.honeycomb - } - - log(message: string | Error): void { - if (this._honeycomb) { - this._honeycomb.log(message) - } } send( @@ -133,15 +178,15 @@ class HoneycombTraceExporter extends OTLPTraceExporter { onSuccess: () => void, onError: (error: otlpTypes.OTLPExporterError) => void ): void { - this.log(`sending ${objects.length} spans to ${this.url}`) + otel.diag.debug(`sending ${objects.length} spans to ${this.url}`) super.send( objects, () => { - this.log(`successfully send ${objects.length} spans to ${this.url}`) + otel.diag.debug(`successfully send ${objects.length} spans to ${this.url}`) return onSuccess() }, (error: otlpTypes.OTLPExporterError) => { - this.log(`error while sending ${objects.length} spans: ${error}`) + otel.diag.debug(`error while sending ${objects.length} spans: ${error}`) return onError(error) } ) @@ -187,7 +232,7 @@ interface OtelFactories { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter: (headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter + traceExporter: (headers: HoneycombOTLPHeaders) => OTLPTraceExporter spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] sdk: ( @@ -225,10 +270,9 @@ const defaultOtelFactories: OtelFactories = { }, // Export traces to an OTLP endpoint with HTTP - traceExporter (headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb): OTLPTraceExporter { + traceExporter (headers: HoneycombOTLPHeaders): OTLPTraceExporter { return new HoneycombTraceExporter({ - headers, - honeycomb + headers }) }, @@ -291,11 +335,24 @@ const defaultOtelFactories: OtelFactories = { // This is that singleton! sdk ( resource: otelResources.Resource, + // sampler: otel.Sampler, + // spanProcessor: otelTraceBase.SpanProcessor, instrumentations: OtelInstrumentation[], traceExporter: OTLPTraceExporter ): OtelSDK { + + /* + const defaultAttributes = { + 'service_name': resource.attributes['service.name']), + 'boltzmann.honeycomb.trace_type': 'otel' + } + */ + return new OtelSDK({ resource, + // sampler, + // spanProcessor, + // defaultAttributes, traceExporter, instrumentations }) @@ -314,7 +371,7 @@ interface OtelFactoryOverrides { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter?: (headers: HoneycombOTLPHeaders, honeycomb?: Honeycomb) => OTLPTraceExporter + traceExporter?: (headers: HoneycombOTLPHeaders) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor instrumentations?: () => OtelInstrumentation[]; sdk?: ( @@ -339,7 +396,7 @@ class Honeycomb { public initialized: boolean public started: boolean - public logger: typeof bole | null + private _logger: typeof bole | null constructor( options: HoneycombOptions, @@ -365,7 +422,7 @@ class Honeycomb { ...(overrides || {}) } - this.logger = null + this._logger = null } get tracer (): otel.Tracer { @@ -402,9 +459,12 @@ class Honeycomb { // variables. If any of them are defined, we'll use OpenTelemetry instead // of beelines. // - // For a broad overview of most of these variables, see: + // For a broad overview of common variables, see: // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md - const otel: boolean = Object.entries(env).some(([name, value]) => { + // + // For a list of variables the OTLP exporter respects, see: + // https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-core/src/utils/environment.ts#L117-L122 + const isOtel: boolean = Object.entries(env).some(([name, value]) => { return name.startsWith('OTEL_') && value && value.length; }); @@ -415,7 +475,7 @@ class Honeycomb { let sampleRate: number = Number(env.HONEYCOMB_SAMPLE_RATE || 1) if (isNaN(sampleRate)) { - Honeycomb.log( + otel.diag.verbose( `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` + 'defaulting to 1' ) @@ -425,7 +485,7 @@ class Honeycomb { return { serviceName, disable, - otel, + otel: isOtel, writeKey, dataset, sampleRate @@ -460,7 +520,7 @@ class Honeycomb { const resource: otelResources.Resource = f.resource(serviceName) const sampler: otel.Sampler = f.sampler(sampleRate) - const exporter = f.traceExporter(headers, this) + const exporter = f.traceExporter(headers) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() @@ -484,7 +544,7 @@ class Honeycomb { this.initialized = true } catch (err) { if (err instanceof HoneycombError) { - this.log(err); + otel.diag.error(err.stack || String(err)); return; } throw err; @@ -499,7 +559,7 @@ class Honeycomb { const sdk = this.sdk const die = async (err: Error) => { - this.log(err); + otel.diag.error(err.stack || String(err)); exitCode = 1 await shutdown() } @@ -527,7 +587,7 @@ class Honeycomb { try { await sdk.shutdown() } catch (err) { - this.log(err) + otel.diag.error(err.stack || String(err)) } } @@ -551,63 +611,13 @@ class Honeycomb { return this.options.serviceName || 'boltzmann' } - // We *do* have a handful of logging use cases... - - public static log(message: string | Error): void { - void `{% if debug %}`; - // Honeycomb starts up very early in the process's lifetime and - // can't count on bole being configured. In those cases, we fall - // back to console.log and JSON.stringify. Only use this if you - // can't use a bole logger! - - // We always log at the debug level, in an effort to make tracing as quiet - // as possible while still being stdout-debuggable. We also mute them - // during unit tests. - let isDebug = !process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug' - void `{% if selftest %}` - isDebug = false - void `{% endif %}` - if (isDebug) { - const line: any = { - time: (new Date()).toISOString(), - level: 'debug', - name: 'boltzmann:honeycomb' - } - - if (message instanceof Error) { - line.err = { - name: message.name, - message: message.message, - stack: String(message.stack) - } - } else { - line.message = message - } - - console.log(JSON.stringify(line)) - } - void `{% endif %}` + public get logger (): typeof bole | null { + return this._logger } - public log(message: string | Error): void { - void `{% if debug %}`; - let enabled: boolean = true - - void `{% if selftest %}` - enabled = false - void `{% endif %}` - // The logger middleware creates a logger on the honeycomb object. If it's - // in place, we'll gladly use it. - if (enabled) { - if (this.logger) { - this.logger.debug(message) - return - } - - // Otherwise, fall back to console.log + JSON.stringify - Honeycomb.log(message) - } - void `{% endif %}`; + public set logger (logger: typeof bole | null) { + this._logger = logger + _diagLogger.logger = logger ? logger : undefined } } @@ -702,6 +712,7 @@ function resetOtelMockSpans(spanProcessor: otelTraceBase.SpanProcessor | null): } function createMockHoneycomb(): Honeycomb { + process.env.OTEL_LOG_LEVEL = 'error' return new Honeycomb( { serviceName: 'test-app', diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index d19e5ee7..140c7e97 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -48,6 +48,7 @@ code, it must *also* be imported in a self-test scenario only. void `{% if honeycomb %}`; void `{% if selftest %}`; import { Honeycomb } from './honeycomb' +import isDev from 'are-we-dev' void `{% endif %}`; if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { @@ -135,7 +136,6 @@ import type tap from 'tap' import querystring from 'querystring' import { promisify } from 'util' -import isDev from 'are-we-dev' import fmw from 'find-my-way' import accepts from 'accepts' import { promises as fs } from 'fs' diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index d775a038..2699cc9a 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -217,12 +217,12 @@ function otelTrace () { context._honeycombTrace = span } } else { - honeycomb.log(new assert.AssertionError({ + otel.diag.error(String(new assert.AssertionError({ message: 'no parent span found or created', actual: span, expected: true, operator: '==' - })) + }).stack)) } onHeaders(context._response, function () { diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 7575f133..651599ad 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -24,26 +24,19 @@ function log ({ void `{% if honeycomb %}` honeycomb.logger = bole('boltzmann:honeycomb') - if (honeycomb.features.beeline) { - honeycomb.logger.warn( - 'Honeycomb beeline support is deprecated and will be removed in a future version. ' - + 'To use OpenTelemetry, set HONEYCOMB_API_HOST to a grpc:// endpoint.' - ) - } - - honeycomb.log(`serviceName: ${honeycomb.options.serviceName}`) + honeycomb.logger.debug(`serviceName: ${honeycomb.options.serviceName}`) for (let [key, value] of Object.entries(honeycomb.features)) { - honeycomb.log(`${key}: ${value}`) + honeycomb.logger.debug(`${key}: ${value}`) } const hasWriteKey: boolean = Boolean( honeycomb.options.writeKey && honeycomb.options.writeKey.length ) - honeycomb.log(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`) - honeycomb.log(`dataset: ${honeycomb.options.dataset}`) - honeycomb.log(`sampleRate: ${honeycomb.options.sampleRate}`) + honeycomb.logger.debug(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`) + honeycomb.logger.debug(`dataset: ${honeycomb.options.dataset}`) + honeycomb.logger.debug(`sampleRate: ${honeycomb.options.sampleRate}`) void `{% endif %}` return function logMiddleware (next: Handler) { From 1271b55df8c8ab9a3e2030a6fde132fa3357f3e4 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 07:16:21 -0500 Subject: [PATCH 117/167] Clean up SDK setup, get rid of errors --- templates/boltzmann/core/honeycomb.ts | 36 ++++++--------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index b3bf8afa..23006d1e 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -237,8 +237,7 @@ interface OtelFactories { instrumentations: () => OtelInstrumentation[] sdk: ( resource: otelResources.Resource, - instrumentations: OtelInstrumentation[], - traceExporter: OTLPTraceExporter + instrumentations: OtelInstrumentation[] ) => OtelSDK } @@ -335,25 +334,10 @@ const defaultOtelFactories: OtelFactories = { // This is that singleton! sdk ( resource: otelResources.Resource, - // sampler: otel.Sampler, - // spanProcessor: otelTraceBase.SpanProcessor, - instrumentations: OtelInstrumentation[], - traceExporter: OTLPTraceExporter + instrumentations: OtelInstrumentation[] ): OtelSDK { - - /* - const defaultAttributes = { - 'service_name': resource.attributes['service.name']), - 'boltzmann.honeycomb.trace_type': 'otel' - } - */ - return new OtelSDK({ resource, - // sampler, - // spanProcessor, - // defaultAttributes, - traceExporter, instrumentations }) } @@ -373,11 +357,10 @@ interface OtelFactoryOverrides { ) => NodeTracerProvider traceExporter?: (headers: HoneycombOTLPHeaders) => OTLPTraceExporter spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor - instrumentations?: () => OtelInstrumentation[]; + instrumentations?: () => OtelInstrumentation[] sdk?: ( resource: otelResources.Resource, instrumentations: OtelInstrumentation[], - traceExporter: OTLPTraceExporter ) => OtelSDK; } @@ -531,7 +514,6 @@ class Honeycomb { const sdk = f.sdk( resource, instrumentations, - exporter ) this.traceExporter = exporter @@ -909,14 +891,12 @@ if (require.main === module) { // run the init function assert.doesNotThrow(() => { const resource = defaultOtelFactories.resource('test-service') - const exporter = defaultOtelFactories.traceExporter( - defaultOtelFactories.headers( - 'some write key', - 'some dataset' - ) - ) const instrumentations = defaultOtelFactories.instrumentations() - defaultOtelFactories.sdk(resource, instrumentations, exporter) + + defaultOtelFactories.sdk( + resource, + instrumentations, + ) }, 'should create an sdk') }) }) From cf9b6ed2b0e287209a80c57c8d1484ca979f625e Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 08:07:34 -0500 Subject: [PATCH 118/167] Button up otel logging --- templates/boltzmann/core/honeycomb.ts | 79 ++++++++++++++++++++------- templates/boltzmann/middleware/log.ts | 25 +++++---- 2 files changed, 72 insertions(+), 32 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 23006d1e..a4c97d19 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -24,6 +24,7 @@ Good luck! // Dependencies used downstream - it's worth your time to look at how these // are treated in prelude.ts! +import { Writable } from 'stream' import bole from '@entropic/bole' import isDev from 'are-we-dev' @@ -70,20 +71,66 @@ void `{% endif %}` class HoneycombError extends Error { } +// A diagnostic logger for OpenTelemetry. To log at a sensible level, +// call otel.diag.verbose. class HoneycombDiagLogger implements otel.DiagLogger { public logger?: typeof bole + private _stream: Writable + + // OpenTelemetry's diagnostic logger has one more log level than bole - ie, + // verbose. + // + // For more details on how to treat each log level, see: + // https://github.com/open-telemetry/opentelemetry-js-api/blob/main/src/diag/consoleLogger.ts#L60 + + // Log errors that caused an unexpected failure + error(message: string, ...args: unknown[]): void { + this._log('error', message, args) + } + // Log warnings that aren't show-stopping but should REALLY be looked at + warn(message: string, ...args: unknown[]): void { + this._log('warn', message, args) + } + // Log info if you want to be REALLY LOUD for some reason - you probably + // don't want to use this! + info(message: string, ...args: unknown[]): void { + this._log('info', message, args) + } + // Log details that could be useful for identifying what went wrong, but + // aren't the thing that went wrong itself - treat this as you would info + // logging normally + debug(message: string, ...args: unknown[]): void { + this._log('debug', message, args) + } + // Log fine-grained details that are mostly going to be useful to those + // adding new OpenTelemetry related features to boltzmann - treat this like + // you would debug level logging normally + verbose(message: string, ...args: unknown[]): void { + this._log('debug', `VERBOSE: ${message}`, args) + } + + // Ideally we would log to a bole logger. However, logger setup happens + // relatively late - in the log middleware - and it's very likely that such + // a log won't be in-place when we stand up the middleware stack! Therefore, + // we do log to bole if it's set in the middleware but will fall back to + // good ol' fashioned JSON.stringify if need be. + constructor() { + this._stream = process.stdout + + // So log messages roughly match what's output by the bole in dev mode :^) + if (isDev()) { + const pretty = require('bistre')({ time: true }) + this._stream = pretty.pipe(this._stream) + } + } private _log(level: 'error' | 'warn' | 'info' | 'debug', message: string, args: unknown[]): void { + // Log to bole if we have it if (this.logger) { this.logger[level](message, ...args) return } - if (isDev()) { - console.log(message) - return - } - const line: any = { time: (new Date()).toISOString(), level, @@ -94,29 +141,19 @@ class HoneycombDiagLogger implements otel.DiagLogger { try { // are the args JSON-serializable? - console.log(JSON.stringify(line)) + this._writeLine(JSON.stringify(line)) // SURVEY SAYS... } catch (_) { // ...ok, make it a string as a fallback line.args = require('util').format('%o', line.args) - console.log(JSON.stringify(line)) + this._writeLine(JSON.stringify(line)) } } - error(message: string, ...args: unknown[]): void { - this._log('error', message, args) - } - warn(message: string, ...args: unknown[]): void { - this._log('warn', message, args) - } - info(message: string, ...args: unknown[]): void { - this._log('info', message, args) - } - debug(message: string, ...args: unknown[]): void { - this._log('debug', message, args) - } - verbose(message: string, ...args: unknown[]): void { - this._log('debug', message, args) + + private _writeLine(line: string): void { + this._stream.write(Buffer.from(line + '\n')) } + } const _diagLogger = new HoneycombDiagLogger() diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 651599ad..443ad16a 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -4,16 +4,17 @@ export { log } import bole from '@entropic/bole' import isDev from 'are-we-dev' -import { honeycomb } from '../core/prelude' +import { otel } from '../core/honeycomb' +import { honeycomb, serviceName } from '../core/prelude' import { Handler } from '../core/middleware' import { Context } from '../data/context' import { STATUS, THREW } from '../core/prelude' void `{% endif %}`; function log ({ - logger = bole(process.env.SERVICE_NAME || 'boltzmann'), + logger = bole(serviceName), level = process.env.LOG_LEVEL || 'debug', - stream = process.stdout + stream = process.stdout, } = {}) { if (isDev()) { const pretty = require('bistre')({ time: true }) @@ -24,19 +25,21 @@ function log ({ void `{% if honeycomb %}` honeycomb.logger = bole('boltzmann:honeycomb') - honeycomb.logger.debug(`serviceName: ${honeycomb.options.serviceName}`) - - for (let [key, value] of Object.entries(honeycomb.features)) { - honeycomb.logger.debug(`${key}: ${value}`) - } const hasWriteKey: boolean = Boolean( honeycomb.options.writeKey && honeycomb.options.writeKey.length ) - honeycomb.logger.debug(`writeKey: ${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`) - honeycomb.logger.debug(`dataset: ${honeycomb.options.dataset}`) - honeycomb.logger.debug(`sampleRate: ${honeycomb.options.sampleRate}`) + let otelConfig: Record = { + serviceName: honeycomb.options.serviceName, + writeKey: `${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`, + dataset: honeycomb.options.dataset + } + + Object.assign(otelConfig, honeycomb.features) + + otel.diag.verbose('OpenTelemetry config:', otelConfig) + void `{% endif %}` return function logMiddleware (next: Handler) { From 1947b2cffc985147f10e6be6410260e3dba5f4bd Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 08:09:07 -0500 Subject: [PATCH 119/167] Remove debug flag from boltzmann generator --- src/settings.rs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/settings.rs b/src/settings.rs index 5a638dde..1a2f44eb 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -106,9 +106,6 @@ pub struct Settings { #[serde(skip_serializing_if = "Option::is_none")] pub(crate) typescript: Option, - #[serde(skip_serializing)] - pub(crate) debug: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub(crate) volta: Option, @@ -177,12 +174,6 @@ impl Settings { node_version: Some(node_version), volta: cast(&flags.volta, &self.volta, flags.all), - #[cfg(debug_assertions)] - debug: Some(true), - - #[cfg(not(debug_assertions))] - debug: Some(false), - selftest: if flags.selftest { Some(true) } else { None }, rest: HashMap::new(), } @@ -233,9 +224,6 @@ impl Settings { if self.typescript.unwrap_or(false) { features.push("typescript"); } - if self.debug.unwrap_or(false) { - features.push("debug"); - } // In case we have some bad people who don't alphabetize the above. features.sort_unstable(); @@ -272,7 +260,6 @@ impl From for Context { ctxt.insert("status", &settings.status.unwrap_or(false)); ctxt.insert("templates", &settings.templates.unwrap_or(false)); ctxt.insert("typescript", &settings.typescript.unwrap_or(false)); - ctxt.insert("debug", &settings.debug.unwrap_or(false)); ctxt.insert("selftest", &settings.selftest.unwrap_or(false)); ctxt.insert( "version", From 79d34a196f239c4d831808cae9c5a1a610df12a0 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 09:00:30 -0500 Subject: [PATCH 120/167] Support ALL THREE OTLP trace exporters --- package-lock.json | 34 ++++++ package.json | 2 + src/dependencies.ron | 14 +++ templates/boltzmann/core/honeycomb.ts | 155 ++++++++++++++++++-------- 4 files changed, 156 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 091f6fc1..77ff6756 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,8 @@ "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.27.0", "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", "@opentelemetry/instrumentation-http": "^0.27.0", @@ -793,6 +795,25 @@ "@opentelemetry/api": "^1.0.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.27.0.tgz", + "integrity": "sha512-Q1PlH9iR3RUiLDnSbKmaAdXEuquvI0oLIN1WW37tUyTuqK5BArPXMzcquQtX/aG+4T5I6IHzgCpZxiedhW42Wg==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "protobufjs": "^6.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, "node_modules/@opentelemetry/instrumentation": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", @@ -12726,6 +12747,19 @@ "@opentelemetry/sdk-trace-base": "1.0.1" } }, + "@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.27.0.tgz", + "integrity": "sha512-Q1PlH9iR3RUiLDnSbKmaAdXEuquvI0oLIN1WW37tUyTuqK5BArPXMzcquQtX/aG+4T5I6IHzgCpZxiedhW42Wg==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "protobufjs": "^6.9.0" + } + }, "@opentelemetry/instrumentation": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", diff --git a/package.json b/package.json index 756cfdef..65031809 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ "@opentelemetry/api": "^1.0.4", "@opentelemetry/core": "^1.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.27.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.27.0", "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/instrumentation-dns": "^0.27.0", "@opentelemetry/instrumentation-http": "^0.27.0", diff --git a/src/dependencies.ron b/src/dependencies.ron index e610baae..e6b8eb19 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -55,6 +55,20 @@ preconditions: Some(When(all_of: ["honeycomb"])) ), + DependencySpec( + name: "@opentelemetry/exporter-trace-otlp-http", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + + DependencySpec( + name: "@opentelemetry/exporter-trace-otlp-proto", + version: "^0.27.0", + kind: Normal, + preconditions: Some(When(all_of: ["honeycomb"])) + ), + DependencySpec( name: "@opentelemetry/instrumentation", version: "^0.27.0", diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index a4c97d19..31e5422a 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -32,9 +32,12 @@ import isDev from 'are-we-dev' import beeline from 'honeycomb-beeline' // ...but are migrating to OpenTelemetry: +import * as grpc from '@grpc/grpc-js' import * as otel from '@opentelemetry/api' import * as otelCore from '@opentelemetry/core' -import { OTLPTraceExporter, otlpTypes } from '@opentelemetry/exporter-trace-otlp-http' +import * as otlpHttp from '@opentelemetry/exporter-trace-otlp-http' +import * as otlpProto from '@opentelemetry/exporter-trace-otlp-proto' +import * as otlpGrpc from '@opentelemetry/exporter-trace-otlp-grpc' import * as otelResources from '@opentelemetry/resources' import { NodeSDK as OtelSDK } from '@opentelemetry/sdk-node' import * as otelTraceBase from '@opentelemetry/sdk-trace-base' @@ -125,6 +128,14 @@ class HoneycombDiagLogger implements otel.DiagLogger { } private _log(level: 'error' | 'warn' | 'info' | 'debug', message: string, args: unknown[]): void { + let isSelfTest = false + void `{% if selftest %}` + isSelfTest = true + void `{% endif %}` + if (isSelfTest) { + return + } + // Log to bole if we have it if (this.logger) { this.logger[level](message, ...args) @@ -203,33 +214,6 @@ type HoneycombOTLPHeaders = { 'x-honeycomb-dataset': string } -type HoneycombConfigNode = otlpTypes.OTLPExporterConfigBase & { honeycomb?: Honeycomb } - -class HoneycombTraceExporter extends OTLPTraceExporter { - constructor(config: HoneycombConfigNode = {}) { - super(config) - } - - send( - objects: otelTraceBase.ReadableSpan[], - onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void - ): void { - otel.diag.debug(`sending ${objects.length} spans to ${this.url}`) - super.send( - objects, - () => { - otel.diag.debug(`successfully send ${objects.length} spans to ${this.url}`) - return onSuccess() - }, - (error: otlpTypes.OTLPExporterError) => { - otel.diag.debug(`error while sending ${objects.length} spans: ${error}`) - return onError(error) - } - ) - } -} - // Arguments passed to Honeycomb's constructor interface HoneycombOptions { serviceName: string @@ -246,6 +230,7 @@ interface HoneycombOptions { // Tunables, etc. sampleRate?: number + otlpProtocol?: string } // Whether or not otel, beelines and honeycomb are enabled @@ -269,8 +254,8 @@ interface OtelFactories { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter: (headers: HoneycombOTLPHeaders) => OTLPTraceExporter - spanProcessor: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor + spanExporter: (protocol: string, headers: HoneycombOTLPHeaders) => otelTraceBase.SpanExporter + spanProcessor: (spanExporter: otelTraceBase.SpanExporter) => otelTraceBase.SpanProcessor instrumentations: () => OtelInstrumentation[] sdk: ( resource: otelResources.Resource, @@ -306,16 +291,81 @@ const defaultOtelFactories: OtelFactories = { }, // Export traces to an OTLP endpoint with HTTP - traceExporter (headers: HoneycombOTLPHeaders): OTLPTraceExporter { - return new HoneycombTraceExporter({ + spanExporter (protocol: string, headers: HoneycombOTLPHeaders): otelTraceBase.SpanExporter { + // We want to log exporter sends and their success/error status, but there + // are three different classes to take care of! So instead of subclassing + // all of them, we'll patch the method. + function patchSend(exporter: any) { + const send = exporter.send + + exporter.send = function( + objects: otelTraceBase.ReadableSpan[], + onSuccess: () => void, + onError: (error: any) => void + ) { + otel.diag.debug(`sending ${objects.length} spans to ${this.url}`) + send.call(this, + objects, + () => { + otel.diag.debug(`successfully send ${objects.length} spans to ${this.url}`) + return onSuccess() + }, + (error: any) => { + otel.diag.debug(`error while sending ${objects.length} spans: ${error}`) + return onError(error) + } + ) + } + } + + if (protocol === 'grpc') { + const metadata = new grpc.Metadata() + metadata.set('x-honeycomb-team', headers['x-honeycomb-team']) + metadata.set('x-honeycomb-dataset', headers['x-honeycomb-dataset']) + const credentials = grpc.credentials.createSsl() + + const exporter = new otlpGrpc.OTLPTraceExporter({ + credentials, + metadata + }) + + patchSend(exporter) + + return exporter + } + + if (protocol === 'http/json') { + otel.diag.warn( + "Honeycomb doesn't support the http/json OTLP protocol - but if you say so" + ) + const exporter = new otlpHttp.OTLPTraceExporter({ + headers + }) + + patchSend(exporter) + + return exporter + } + + if (protocol !== 'http/protobuf') { + otel.diag.warn( + `Unknown OTLP protocol ${protocol} - using http/protobuf instead` + ) + } + + const exporter = new otlpHttp.OTLPTraceExporter({ headers }) + + patchSend(exporter) + + return exporter }, // Process spans, using the supplied trace exporter to // do the actual exporting. - spanProcessor (traceExporter: OTLPTraceExporter): otelTraceBase.SpanProcessor { - return new HoneycombSpanProcessor(traceExporter) + spanProcessor (spanExporter: otelTraceBase.SpanExporter): otelTraceBase.SpanProcessor { + return new HoneycombSpanProcessor(spanExporter) }, instrumentations () { @@ -392,8 +442,8 @@ interface OtelFactoryOverrides { resource: otelResources.Resource, sampler: otel.Sampler ) => NodeTracerProvider - traceExporter?: (headers: HoneycombOTLPHeaders) => OTLPTraceExporter - spanProcessor?: (traceExporter: OTLPTraceExporter) => otelTraceBase.SpanProcessor + spanExporter?: (protocol: string, headers: HoneycombOTLPHeaders) => otelTraceBase.SpanExporter + spanProcessor?: (spanExporter: otelTraceBase.SpanExporter) => otelTraceBase.SpanProcessor instrumentations?: () => OtelInstrumentation[] sdk?: ( resource: otelResources.Resource, @@ -408,7 +458,7 @@ class Honeycomb { public factories: OtelFactories public tracerProvider: NodeTracerProvider | null - public traceExporter: OTLPTraceExporter | null + public spanExporter: otelTraceBase.SpanExporter | null public spanProcessor: otelTraceBase.SpanProcessor | null public instrumentations: OtelInstrumentation[] | null public sdk: OtelSDK | null @@ -432,7 +482,7 @@ class Honeycomb { this.started = false this.tracerProvider = null - this.traceExporter = null + this.spanExporter = null this.spanProcessor = null this.instrumentations = null this.sdk = null @@ -502,13 +552,16 @@ class Honeycomb { sampleRate = 1 } + const otlpProtocol = env.OTEL_EXPORTER_OTLP_PROTOCOL || env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL || 'http/protobuf' + return { serviceName, disable, otel: isOtel, writeKey, dataset, - sampleRate + sampleRate, + otlpProtocol } } @@ -540,7 +593,7 @@ class Honeycomb { const resource: otelResources.Resource = f.resource(serviceName) const sampler: otel.Sampler = f.sampler(sampleRate) - const exporter = f.traceExporter(headers) + const exporter = f.spanExporter(this.options.otlpProtocol || 'http/protobuf', headers) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() @@ -553,7 +606,7 @@ class Honeycomb { instrumentations, ) - this.traceExporter = exporter + this.spanExporter = exporter this.spanProcessor = processor this.instrumentations = instrumentations this.tracerProvider = provider @@ -645,7 +698,6 @@ export { bole, otel, otelCore, - OTLPTraceExporter, otelResources, OtelSDK, otelTraceBase, @@ -742,8 +794,8 @@ function createMockHoneycomb(): Honeycomb { sampleRate: 1 }, { - spanProcessor(traceExporter) { - return new OtelMockSpanProcessor(traceExporter) + spanProcessor(spanExporter) { + return new OtelMockSpanProcessor(spanExporter) } } ) @@ -891,20 +943,25 @@ if (require.main === module) { ) }) - test('traceExporter', async (assert: Test) => { + test('spanExporter', async (assert: Test) => { const headers = defaultOtelFactories.headers( 'some write key', 'some dataset' ) - assert.doesNotThrow(() => { - defaultOtelFactories.traceExporter(headers) - }) + process.env.OTEL_LOG_LEVEL = 'error' + + for (let protocol of ['grpc', 'http/protobuf', 'http/json']) { + assert.doesNotThrow(() => { + defaultOtelFactories.spanExporter(protocol, headers) + }) + } }) test('spanProcessor', async (assert: Test) => { assert.doesNotThrow(() => { - const exporter = defaultOtelFactories.traceExporter( + const exporter = defaultOtelFactories.spanExporter( + 'http/protobuf', defaultOtelFactories.headers( 'some write key', 'some dataset' From f372189f5284c94a3ffb90cd92909c8277525cf6 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 09:09:28 -0500 Subject: [PATCH 121/167] Improved comments --- templates/boltzmann/core/honeycomb.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 31e5422a..6d069b88 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -271,7 +271,7 @@ const defaultOtelFactories: OtelFactories = { } }, - // create a Sampler object, which is used to tune + // Create a Sampler object, which is used to tune // the sampling rate sampler (sampleRate: number): otel.Sampler { return new otelCore.ParentBasedSampler({ @@ -285,22 +285,27 @@ const defaultOtelFactories: OtelFactories = { }) }, - // It provides tracers! + // A tracer provider is effectively a Tracer factory and is used to power + // the otel.getTrace API tracerProvider (resource: otelResources.Resource, sampler: otel.Sampler): NodeTracerProvider { return new NodeTracerProvider({ resource, sampler }) }, - // Export traces to an OTLP endpoint with HTTP + // There are three different OTLP span exporter classes - one for grpc, one + // for http/protobuf and one for http/json - this will return the appropriate + // one for the configured protocol spanExporter (protocol: string, headers: HoneycombOTLPHeaders): otelTraceBase.SpanExporter { - // We want to log exporter sends and their success/error status, but there - // are three different classes to take care of! So instead of subclassing - // all of them, we'll patch the method. + // Instead of subclassing each implementation, monkey patch the send + // method on whichever instance we create function patchSend(exporter: any) { const send = exporter.send exporter.send = function( objects: otelTraceBase.ReadableSpan[], onSuccess: () => void, + // This error is actually an Error subtype which corresponds 1:1 with + // the OTLPTraceExporter class being instrumented, but making this a + // proper generic type is hard - it's fine! onError: (error: any) => void ) { otel.diag.debug(`sending ${objects.length} spans to ${this.url}`) From 5e61afb3d8f201b4e3fcafdfc5f70f133cdb28ef Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 09:12:51 -0500 Subject: [PATCH 122/167] More comments --- templates/boltzmann/core/honeycomb.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 6d069b88..ce9eb071 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -171,8 +171,8 @@ const _diagLogger = new HoneycombDiagLogger() otel.diag.setLogger(_diagLogger, otelCore.getEnv().OTEL_LOG_LEVEL) -// There's a bug in the trace base library where the SimpleSpanExporter doesn't -// actually conform to the SpanExporter interface! onStart in particular +// There's a bug in the trace base library where the SimpleSpanProcessor doesn't +// actually conform to the SpanProcessor interface! onStart in particular // doesn't take the context argument. This makes typescript extremely // cranky. // @@ -293,7 +293,7 @@ const defaultOtelFactories: OtelFactories = { // There are three different OTLP span exporter classes - one for grpc, one // for http/protobuf and one for http/json - this will return the appropriate - // one for the configured protocol + // one for the configured protocol. spanExporter (protocol: string, headers: HoneycombOTLPHeaders): otelTraceBase.SpanExporter { // Instead of subclassing each implementation, monkey patch the send // method on whichever instance we create @@ -557,6 +557,13 @@ class Honeycomb { sampleRate = 1 } + // OTLP is supposed to be configured with this environment variable, but + // the OpenTelemetry SDKs leave this as a some-assembly-required job. + // We default to 'http/protobuf' because it's well-supported by both + // Honeycomb and AWS load balancers and because it's relatively snappy. + // + // For more information on how this is configured, see: + // https://opentelemetry.io/docs/reference/specification/protocol/exporter/#specify-protocol const otlpProtocol = env.OTEL_EXPORTER_OTLP_PROTOCOL || env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL || 'http/protobuf' return { From 7bc9563988a4e0d1ecdca3e7b98ab01615807a4e Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 09:28:26 -0500 Subject: [PATCH 123/167] Only do otel logging if LOG_LEVEL === "debug" --- templates/boltzmann/core/honeycomb.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index ce9eb071..218a95a1 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -167,9 +167,12 @@ class HoneycombDiagLogger implements otel.DiagLogger { } +// We only do OpenTelemetry logging if boltzmann's main log level is debug const _diagLogger = new HoneycombDiagLogger() -otel.diag.setLogger(_diagLogger, otelCore.getEnv().OTEL_LOG_LEVEL) +if (!process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug') { + otel.diag.setLogger(_diagLogger, otelCore.getEnv().OTEL_LOG_LEVEL) +} // There's a bug in the trace base library where the SimpleSpanProcessor doesn't // actually conform to the SpanProcessor interface! onStart in particular From aeb6f6a6cad9c478bffc619df0d44f1cfe4f41c1 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 09:38:24 -0500 Subject: [PATCH 124/167] Improved comments for OTEL_EXPORTER_OTLP_ENDPOINT --- templates/boltzmann/core/honeycomb.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 218a95a1..386037df 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -535,13 +535,16 @@ class Honeycomb { // OpenTelemetry is configured with a huge pile of `OTEL_*` environment // variables. If any of them are defined, we'll use OpenTelemetry instead - // of beelines. + // of beelines. Typically one would configure OTEL_EXPORTER_OTLP_ENDPOINT + // to point to either api.honeycomb.io or your local refinery, but this + // will flag on OTEL_ENABLED=1 as well if you want to use all the + // defaults. // // For a broad overview of common variables, see: // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md // // For a list of variables the OTLP exporter respects, see: - // https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-core/src/utils/environment.ts#L117-L122 + // https://opentelemetry.io/docs/reference/specification/protocol/exporter/ const isOtel: boolean = Object.entries(env).some(([name, value]) => { return name.startsWith('OTEL_') && value && value.length; }); From ffe9d6f637e63138c57081f2b0c949e20b6e99aa Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 10:06:35 -0500 Subject: [PATCH 125/167] one OVER sampling rate --- templates/boltzmann/core/honeycomb.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 386037df..25301919 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -278,7 +278,9 @@ const defaultOtelFactories: OtelFactories = { // the sampling rate sampler (sampleRate: number): otel.Sampler { return new otelCore.ParentBasedSampler({ - root: new otelCore.TraceIdRatioBasedSampler(sampleRate) + // Honeycomb's sample rate is defined as total / sampled, but otel's + // is defined as sampled / total + root: new otelCore.TraceIdRatioBasedSampler(1/sampleRate) }) }, From 2d416d438768cd9ded21c73cdcda27656ff2bfd2 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 11:40:21 -0500 Subject: [PATCH 126/167] bugfix - use proto exporter when protocol is http/protobuf --- templates/boltzmann/core/honeycomb.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 25301919..808f6e1b 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -363,7 +363,7 @@ const defaultOtelFactories: OtelFactories = { ) } - const exporter = new otlpHttp.OTLPTraceExporter({ + const exporter = new otlpProto.OTLPTraceExporter({ headers }) From 445d3195dfe0529154788606d8dc63ec7569f4a6 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 11:40:38 -0500 Subject: [PATCH 127/167] Let otel use the automatically-configured sampler --- templates/boltzmann/core/honeycomb.ts | 48 +++++---------------------- 1 file changed, 9 insertions(+), 39 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 808f6e1b..b57c5911 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -251,11 +251,9 @@ interface HoneycombFeatures { // namespace. interface OtelFactories { headers: (writeKey: string, dataset: string) => HoneycombOTLPHeaders - sampler: (sampleRate: number) => otel.Sampler resource: (serviceName: string) => otelResources.Resource tracerProvider: ( resource: otelResources.Resource, - sampler: otel.Sampler ) => NodeTracerProvider spanExporter: (protocol: string, headers: HoneycombOTLPHeaders) => otelTraceBase.SpanExporter spanProcessor: (spanExporter: otelTraceBase.SpanExporter) => otelTraceBase.SpanProcessor @@ -274,16 +272,6 @@ const defaultOtelFactories: OtelFactories = { } }, - // Create a Sampler object, which is used to tune - // the sampling rate - sampler (sampleRate: number): otel.Sampler { - return new otelCore.ParentBasedSampler({ - // Honeycomb's sample rate is defined as total / sampled, but otel's - // is defined as sampled / total - root: new otelCore.TraceIdRatioBasedSampler(1/sampleRate) - }) - }, - resource (serviceName: string): otelResources.Resource { return new otelResources.Resource({ [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: serviceName @@ -292,8 +280,8 @@ const defaultOtelFactories: OtelFactories = { // A tracer provider is effectively a Tracer factory and is used to power // the otel.getTrace API - tracerProvider (resource: otelResources.Resource, sampler: otel.Sampler): NodeTracerProvider { - return new NodeTracerProvider({ resource, sampler }) + tracerProvider (resource: otelResources.Resource): NodeTracerProvider { + return new NodeTracerProvider({ resource }) }, // There are three different OTLP span exporter classes - one for grpc, one @@ -446,11 +434,9 @@ const defaultOtelFactories: OtelFactories = { // passing overrides into its constructor. interface OtelFactoryOverrides { headers?: (writeKey: string, dataset: string) => HoneycombOTLPHeaders - sampler?: (sampleRate: Number) => otel.Sampler resource?: (serviceName: string) => otelResources.Resource tracerProvider?: ( resource: otelResources.Resource, - sampler: otel.Sampler ) => NodeTracerProvider spanExporter?: (protocol: string, headers: HoneycombOTLPHeaders) => otelTraceBase.SpanExporter spanProcessor?: (spanExporter: otelTraceBase.SpanExporter) => otelTraceBase.SpanProcessor @@ -551,10 +537,11 @@ class Honeycomb { return name.startsWith('OTEL_') && value && value.length; }); - // beelines don't have a standard environment variable for configuring - // the sample rate. OpenTelemetry has *some* mechanisms for configuring - // samplers but are "involved." Therefore, this variable gets passed to - // both beelines and the OpenTelemetry Sampler. + // This sample rate is for beeline only - to set the OpenTelemetry sample + // rate, set OTEL_TRACES_SAMPLER=parentbased_traceidratio and + // OTEL_TRACES_SAMPLER_ARG=${SOME_NUMBER}. Note that beeline defines + // sample rate as total/sampled, but OpenTelemetry defines it as + // sampled/total! let sampleRate: number = Number(env.HONEYCOMB_SAMPLE_RATE || 1) if (isNaN(sampleRate)) { @@ -612,12 +599,11 @@ class Honeycomb { const headers: HoneycombOTLPHeaders = f.headers(writeKey, dataset) const resource: otelResources.Resource = f.resource(serviceName) - const sampler: otel.Sampler = f.sampler(sampleRate) const exporter = f.spanExporter(this.options.otlpProtocol || 'http/protobuf', headers) const processor = f.spanProcessor(exporter) const instrumentations = f.instrumentations() - const provider: NodeTracerProvider = f.tracerProvider(resource, sampler) + const provider: NodeTracerProvider = f.tracerProvider(resource) provider.addSpanProcessor(processor) provider.register() @@ -939,26 +925,10 @@ if (require.main === module) { assert.doesNotThrow(() => defaultOtelFactories.resource('test-service')) }) - t.test('sampler', async (assert: Test) => { - assert.ok( - defaultOtelFactories.sampler(1) instanceof otelCore.ParentBasedSampler, - 'sampler(1) should be a otelCore.ParentBasedSampler' - ) - assert.ok( - defaultOtelFactories.sampler(0) instanceof otelCore.ParentBasedSampler, - 'sampler(0) should be a otelCore.ParentBasedSampler' - ) - assert.ok( - defaultOtelFactories.sampler(0.5) instanceof otelCore.ParentBasedSampler, - 'sampler(0.5) should be a otelCore.ParentBasedSampler' - ) - }) - test('tracerProvider', async (assert: Test) => { - const sampler = defaultOtelFactories.sampler(1) const resource = defaultOtelFactories.resource('test-service') assert.doesNotThrow( - () => defaultOtelFactories.tracerProvider(resource, sampler), + () => defaultOtelFactories.tracerProvider(resource), 'should create a tracer provider' ) }) From 6b3f8f2a8569662653ea5ea687f5ad053e607406 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 12:58:49 -0500 Subject: [PATCH 128/167] Make HONEYCOMB_WRITEKEY optional for otel --- templates/boltzmann/core/honeycomb.ts | 82 +++++++++++++++++---------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index b57c5911..be4c8908 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -213,8 +213,7 @@ class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase } type HoneycombOTLPHeaders = { - 'x-honeycomb-team': string, - 'x-honeycomb-dataset': string + [s: string]: string } // Arguments passed to Honeycomb's constructor @@ -250,7 +249,7 @@ interface HoneycombFeatures { // They're exposed on the Honeycomb class but in a nested // namespace. interface OtelFactories { - headers: (writeKey: string, dataset: string) => HoneycombOTLPHeaders + headers: (writeKey: string | null, dataset: string | null) => HoneycombOTLPHeaders resource: (serviceName: string) => otelResources.Resource tracerProvider: ( resource: otelResources.Resource, @@ -265,11 +264,15 @@ interface OtelFactories { } const defaultOtelFactories: OtelFactories = { - headers (writeKey: string, dataset: string): HoneycombOTLPHeaders { - return { - 'x-honeycomb-team': writeKey, - 'x-honeycomb-dataset': dataset + headers (writeKey: string | null, dataset: string | null): HoneycombOTLPHeaders { + let headers: HoneycombOTLPHeaders = {} + if (writeKey) { + headers['x-honeycomb-team'] = writeKey + } + if (dataset) { + headers['x-honeycomb-dataset'] = dataset } + return headers }, resource (serviceName: string): otelResources.Resource { @@ -318,8 +321,9 @@ const defaultOtelFactories: OtelFactories = { if (protocol === 'grpc') { const metadata = new grpc.Metadata() - metadata.set('x-honeycomb-team', headers['x-honeycomb-team']) - metadata.set('x-honeycomb-dataset', headers['x-honeycomb-dataset']) + for (let [key, value] of Object.entries(headers)) { + metadata.set(key, value) + } const credentials = grpc.credentials.createSsl() const exporter = new otlpGrpc.OTLPTraceExporter({ @@ -433,7 +437,7 @@ const defaultOtelFactories: OtelFactories = { // are created. The Honeycomb class allows for // passing overrides into its constructor. interface OtelFactoryOverrides { - headers?: (writeKey: string, dataset: string) => HoneycombOTLPHeaders + headers?: (writeKey: string | null, dataset: string | null) => HoneycombOTLPHeaders resource?: (serviceName: string) => otelResources.Resource tracerProvider?: ( resource: otelResources.Resource, @@ -513,11 +517,12 @@ class Honeycomb { // logic twice we let the prelude inject it when creating the honeycomb // object. public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { - // The bare minimum requirement for honeycomb tracing is the write key - const disable = !env.HONEYCOMB_WRITEKEY + // For beelines, if we don't have HONEYCOMB_WRITEKEY there isn't much we + // can do... + let disable = !env.HONEYCOMB_WRITEKEY // Beelines should pick these up automatically, but we'll need them to - // configure OTLP headers + // configure default OTLP headers const writeKey = env.HONEYCOMB_WRITEKEY || null const dataset = env.HONEYCOMB_DATASET || null @@ -537,6 +542,15 @@ class Honeycomb { return name.startsWith('OTEL_') && value && value.length; }); + // OpenTelemetry can optionally load the honeycomb headers from the + // OTEL_EXPORTER_OTLP_HEADERS and/or OTEL_EXPORTER_OTLP_TRACE_HEADERS + // environment variables, so having HONEYCOMB_WRITEKEY be falsey is + // potentially OK. This strategy also allows people to use the + // honeycomb tracing for non-honeycomb use cases. + if (isOtel) { + disable = false + } + // This sample rate is for beeline only - to set the OpenTelemetry sample // rate, set OTEL_TRACES_SAMPLER=parentbased_traceidratio and // OTEL_TRACES_SAMPLER_ARG=${SOME_NUMBER}. Note that beeline defines @@ -545,10 +559,6 @@ class Honeycomb { let sampleRate: number = Number(env.HONEYCOMB_SAMPLE_RATE || 1) if (isNaN(sampleRate)) { - otel.diag.verbose( - `Unable to parse HONEYCOMB_SAMPLE_RATE=${env.HONEYCOMB_SAMPLE_RATE}, ` - + 'defaulting to 1' - ) sampleRate = 1 } @@ -584,12 +594,12 @@ class Honeycomb { } try { - const writeKey = this.writeKey - const dataset = this.dataset - const sampleRate = this.sampleRate - const serviceName = this.serviceName + const writeKey: string | null = this.writeKey + const dataset: string | null = this.dataset + const sampleRate: number = this.sampleRate + const serviceName: string = this.serviceName - if (this.features.beeline) { + if (this.features.beeline && writeKey) { beeline({ writeKey, dataset, sampleRate, serviceName }) return } @@ -669,16 +679,12 @@ class Honeycomb { } } - public get writeKey (): string { - if (this.options.writeKey) { - return this.options.writeKey - } - throw new HoneycombError('HONEYCOMB_WRITEKEY is undefined!') + public get writeKey (): string | null { + return this.options.writeKey || null } - public get dataset (): string { - // The beeline default, here for OpenTelemetry's benefit - return this.options.dataset || "nodejs" + public get dataset (): string | null { + return this.options.dataset || null } public get sampleRate (): number { @@ -838,6 +844,11 @@ if (require.main === module) { false, 'should be enabled when write key is defined' ) + assert.equal( + Honeycomb.parseEnv('boltzmann', {OTEL_ENABLED: '1'}).disable, + false, + 'should be enabled if any otel env var is set' + ) }) t.test('options.otel', async (assert: Test) => { @@ -868,6 +879,17 @@ if (require.main === module) { true, 'should use otel when OTEL_EXPORTER_OTLP_ENDPOINT is defined' ) + assert.equal( + Honeycomb.parseEnv( + 'boltzmann', + { + OTEL_ENABLED: '1' + } + ).otel, + true, + 'should use otel when any OTEL_* variable is defined, even if HONEYCOMB_WRITEKEY is missing' + ) + }) t.test('options.sampleRate', async (assert: Test) => { From 5606948f943ab7697345a0ecf535dc6739ec8986 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 13:12:02 -0500 Subject: [PATCH 129/167] Fix volta feature bug --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 8bb425ee..c23071be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -515,7 +515,7 @@ fn main() -> anyhow::Result<(), anyhow::Error> { match updated_settings.volta { Some(true) => (), _ => { - package_json.volta.replace(None); + package_json.volta = None; }, } From 73076f77476d19d9ead1d9ba7bb99cc6eb6c0c88 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 13:58:55 -0500 Subject: [PATCH 130/167] Respect OTEL_SERVICE_NAME --- templates/boltzmann/core/honeycomb.ts | 70 +++++++++++++++++++------- templates/boltzmann/core/middleware.ts | 2 +- templates/boltzmann/core/prelude.ts | 22 ++++---- 3 files changed, 62 insertions(+), 32 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index be4c8908..0a9e676d 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -22,12 +22,15 @@ to and different from that one: Good luck! #}*/ -// Dependencies used downstream - it's worth your time to look at how these -// are treated in prelude.ts! -import { Writable } from 'stream' +// Dependencies used outside of honeycomb import bole from '@entropic/bole' import isDev from 'are-we-dev' +export { bole, isDev } + +void `{% if honeycomb %}` + +import { Writable } from 'stream' // We continue to support beelines... import beeline from 'honeycomb-beeline' @@ -503,12 +506,11 @@ class Honeycomb { // We (usually) load options from the environment. Unlike with Options, // we do a lot of feature detection here. public static fromEnv( - serviceName: string, env: typeof process.env = process.env, overrides: OtelFactoryOverrides = {} ): Honeycomb { return new Honeycomb( - Honeycomb.parseEnv(serviceName, env), + Honeycomb.parseEnv(env), overrides ) } @@ -516,7 +518,7 @@ class Honeycomb { // serviceName is defined in the prelude, so rather than doing the same // logic twice we let the prelude inject it when creating the honeycomb // object. - public static parseEnv(serviceName: string, env: typeof process.env = process.env): HoneycombOptions { + public static parseEnv(env: typeof process.env = process.env): HoneycombOptions { // For beelines, if we don't have HONEYCOMB_WRITEKEY there isn't much we // can do... let disable = !env.HONEYCOMB_WRITEKEY @@ -571,6 +573,16 @@ class Honeycomb { // https://opentelemetry.io/docs/reference/specification/protocol/exporter/#specify-protocol const otlpProtocol = env.OTEL_EXPORTER_OTLP_PROTOCOL || env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL || 'http/protobuf' + // The service name logic is VERY similar to what's in prelude.ts, + // except that OTEL_SERVICE_NAME takes precedence if defined + const serviceName: string = ((): string => { + try { + return env.OTEL_SERVICE_NAME || env.SERVICE_NAME || require('./package.json').name.split('/').pop() + } catch (err) { + return 'boltzmann' + } + })() + return { serviceName, disable, @@ -707,7 +719,6 @@ class Honeycomb { export { beeline, - bole, otel, otelCore, otelResources, @@ -830,22 +841,22 @@ if (require.main === module) { test('Honeycomb.parseEnv', async (t: Test) => { t.test('options.disable', async (assert: Test) => { assert.equal( - Honeycomb.parseEnv('boltzmann', {}).disable, + Honeycomb.parseEnv({}).disable, true, 'should be disabled when no env vars' ) assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: ''}).disable, + Honeycomb.parseEnv({HONEYCOMB_WRITEKEY: ''}).disable, true, 'should be disabled when env vars are blank' ) assert.equal( - Honeycomb.parseEnv('boltzmann', {HONEYCOMB_WRITEKEY: 'some write key'}).disable, + Honeycomb.parseEnv({HONEYCOMB_WRITEKEY: 'some write key'}).disable, false, 'should be enabled when write key is defined' ) assert.equal( - Honeycomb.parseEnv('boltzmann', {OTEL_ENABLED: '1'}).disable, + Honeycomb.parseEnv({OTEL_ENABLED: '1'}).disable, false, 'should be enabled if any otel env var is set' ) @@ -853,13 +864,12 @@ if (require.main === module) { t.test('options.otel', async (assert: Test) => { assert.equal( - Honeycomb.parseEnv('boltzmann', {}).otel, + Honeycomb.parseEnv({}).otel, false, 'should not use otel when no env vars' ) assert.equal( Honeycomb.parseEnv( - 'boltzmann', { HONEYCOMB_WRITEKEY: '', HONEYCOMB_API_HOST: 'https://refinery.tech' @@ -870,7 +880,6 @@ if (require.main === module) { ) assert.equal( Honeycomb.parseEnv( - 'boltzmann', { HONEYCOMB_WRITEKEY: 'some write key', OTEL_EXPORTER_OTLP_ENDPOINT: 'https://refinery.website' @@ -881,7 +890,6 @@ if (require.main === module) { ) assert.equal( Honeycomb.parseEnv( - 'boltzmann', { OTEL_ENABLED: '1' } @@ -894,13 +902,12 @@ if (require.main === module) { t.test('options.sampleRate', async (assert: Test) => { assert.equal( - Honeycomb.parseEnv('boltzmann', {}).sampleRate, + Honeycomb.parseEnv({}).sampleRate, 1, 'should be 1 by default' ) assert.equal( Honeycomb.parseEnv( - 'boltzmann', { HONEYCOMB_SAMPLE_RATE: '1' } ).sampleRate, 1, @@ -908,7 +915,6 @@ if (require.main === module) { ) assert.equal( Honeycomb.parseEnv( - 'boltzmann', { HONEYCOMB_SAMPLE_RATE: '0.5' } @@ -918,13 +924,38 @@ if (require.main === module) { ) assert.equal( Honeycomb.parseEnv( - 'boltzmann', { HONEYCOMB_SAMPLE_RATE: 'pony' } ).sampleRate, 1, 'should be 1 if not parseable' ) }) + + t.test('options.serviceName', async (assert: Test) => { + assert.equal( + Honeycomb.parseEnv({}).serviceName, + 'boltzmann', + 'should fall back to "boltzmann" when no env vars (nor package.json)' + ) + assert.equal( + Honeycomb.parseEnv({ SERVICE_NAME: 'test-app' }).serviceName, + 'test-app', + 'should use SERVICE_NAME when defined' + ) + assert.equal( + Honeycomb.parseEnv({ OTEL_SERVICE_NAME: 'test-app' }).serviceName, + 'test-app', + 'should use OTEL_SERVICE_NAME when defined' + ) + assert.equal( + Honeycomb.parseEnv({ + SERVICE_NAME: 'test-app', + OTEL_SERVICE_NAME: 'otel-test-app' + }).serviceName, + 'otel-test-app', + 'OTEL_SERVICE_NAME should take precedence over SERVICE_NAME' + ) + }) }) test('factories', async (t: Test) => { t.test('headers', async (assert: Test) => { @@ -1020,3 +1051,4 @@ if (require.main === module) { } void `{% endif %}` +void `{% endif %}` diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 4536ba86..06fd3df4 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,7 +1,7 @@ void `{% if selftest %}`; export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } import { honeycomb } from '../core/prelude' -import { beeline, getOtelMockSpans, otel, otelSemanticConventions } from '../core/honeycomb' +import { beeline, getOtelMockSpans, otel } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 140c7e97..1ad7f6ae 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -36,19 +36,19 @@ Honeycomb instrumentation is in index.tera *before* the prelude. This is because instrumentation needs to be installed prior to instrumented modules being imported. -In production, honeycomb.ts defines a class called Honeycomb, so we can -simply reach for it. In self-test mode, we need to import it, as is typical -for non-prelude files. - -For the most part, dependencies should be contained within honeycomb.ts. -HOWEVER, in cases where a honeycomb.ts dependency is also required by other -code, it must *also* be imported in a self-test scenario only. +In production, honeycomb.ts defines a class called Honeycomb and a singleton +instance, so we can simply reach for it. In self-test mode, we need to import +it, as is typical for non-prelude files. +For the most part, dependencies used by honeycomb core should be properly +exported even when honeycomb is disabled. However, dependencies used by +honeycomb middlewares, etc., should still be imported and exported here. #}*/ void `{% if honeycomb %}`; +import onHeaders from 'on-headers' + void `{% if selftest %}`; import { Honeycomb } from './honeycomb' -import isDev from 'are-we-dev' void `{% endif %}`; if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { @@ -67,7 +67,8 @@ if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM } -let honeycomb: Honeycomb = Honeycomb.fromEnv(serviceName, process.env); +let honeycomb: Honeycomb = Honeycomb.fromEnv(process.env); + void `{% if selftest %}`; import { createMockHoneycomb } from './honeycomb' honeycomb = createMockHoneycomb() @@ -76,8 +77,6 @@ void `{% endif %}`; honeycomb.init() export { honeycomb } - -import onHeaders from 'on-headers' void `{% endif %}`; import ships from 'culture-ships' @@ -232,7 +231,6 @@ export { fs, accepts, fmw, - isDev, promisify, querystring, ships, From 95a066dedb78788fa029d144ce20fd0513143d64 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 14:04:24 -0500 Subject: [PATCH 131/167] More tests for parseEnv --- templates/boltzmann/core/honeycomb.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 0a9e676d..f396b76c 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -897,7 +897,15 @@ if (require.main === module) { true, 'should use otel when any OTEL_* variable is defined, even if HONEYCOMB_WRITEKEY is missing' ) - + assert.equal( + Honeycomb.parseEnv( + { + OTEL_ENABLED: '' + } + ).otel, + false, + 'should NOT use otel when all OTEL_* variables are defined as empty strings' + ) }) t.test('options.sampleRate', async (assert: Test) => { @@ -955,6 +963,14 @@ if (require.main === module) { 'otel-test-app', 'OTEL_SERVICE_NAME should take precedence over SERVICE_NAME' ) + assert.equal( + Honeycomb.parseEnv({ + SERVICE_NAME: 'test-app', + OTEL_SERVICE_NAME: '' + }).serviceName, + 'test-app', + "OTEL_SERVICE_NAME should be ignored when it's a blank string" + ) }) }) test('factories', async (t: Test) => { From 6d696e8aeac76d821722a06b0328e72674e7ea9b Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 14:10:21 -0500 Subject: [PATCH 132/167] Move honeycomb singleton out of prelude --- templates/boltzmann/core/entrypoint.ts | 2 +- templates/boltzmann/core/honeycomb.ts | 27 ++++++++++++++++++ templates/boltzmann/core/middleware.ts | 3 +- templates/boltzmann/core/prelude.ts | 31 --------------------- templates/boltzmann/data/context.ts | 3 +- templates/boltzmann/middleware/honeycomb.ts | 7 +---- templates/boltzmann/middleware/log.ts | 4 +-- 7 files changed, 33 insertions(+), 44 deletions(-) diff --git a/templates/boltzmann/core/entrypoint.ts b/templates/boltzmann/core/entrypoint.ts index c52351de..42a40cfe 100644 --- a/templates/boltzmann/core/entrypoint.ts +++ b/templates/boltzmann/core/entrypoint.ts @@ -2,6 +2,7 @@ void `{% if selftest %}`; import bole from '@entropic/bole' import isDev from 'are-we-dev' +import { honeycomb } from '../core/honeycomb' import { MiddlewareConfig } from '../core/middleware' import { _processMiddleware, _requireOr } from '../core/utils' import { attachPostgres } from '../middleware/postgres' @@ -12,7 +13,6 @@ import { handlePing } from '../middleware/ping' import { trace } from '../middleware/honeycomb' import { runserver } from '../bin/runserver' import { log } from '../middleware/log' -import { honeycomb } from '../core/prelude' void `{% endif %}`; /* c8 ignore next */ diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index f396b76c..c976110e 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -831,6 +831,33 @@ export { resetOtelMockSpans } + +if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { + process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET +} + +if (!process.env.HONEYCOMB_WRITEKEY && process.env.HONEYCOMBIO_WRITEKEY) { + process.env.HONEYCOMB_WRITEKEY = process.env.HONEYCOMBIO_WRITEKEY +} + +if (!process.env.HONEYCOMB_SAMPLE_RATE && process.env.HONEYCOMBIO_SAMPLE_RATE) { + process.env.HONEYCOMB_SAMPLE_RATE = process.env.HONEYCOMBIO_SAMPLE_RATE +} + +if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { + process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM +} + +let honeycomb: Honeycomb = Honeycomb.fromEnv(process.env); + +void `{% if selftest %}`; +honeycomb = createMockHoneycomb() +void `{% endif %}`; + +honeycomb.init() + +export { honeycomb } + import tap from 'tap' type Test = (typeof tap.Test)["prototype"] diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 06fd3df4..d072f608 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,7 +1,6 @@ void `{% if selftest %}`; export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } -import { honeycomb } from '../core/prelude' -import { beeline, getOtelMockSpans, otel } from '../core/honeycomb' +import { beeline, getOtelMockSpans, honeycomb, otel } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 1ad7f6ae..3886789e 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -46,37 +46,6 @@ honeycomb middlewares, etc., should still be imported and exported here. #}*/ void `{% if honeycomb %}`; import onHeaders from 'on-headers' - -void `{% if selftest %}`; -import { Honeycomb } from './honeycomb' -void `{% endif %}`; - -if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { - process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET -} - -if (!process.env.HONEYCOMB_WRITEKEY && process.env.HONEYCOMBIO_WRITEKEY) { - process.env.HONEYCOMB_WRITEKEY = process.env.HONEYCOMBIO_WRITEKEY -} - -if (!process.env.HONEYCOMB_SAMPLE_RATE && process.env.HONEYCOMBIO_SAMPLE_RATE) { - process.env.HONEYCOMB_SAMPLE_RATE = process.env.HONEYCOMBIO_SAMPLE_RATE -} - -if (!process.env.HONEYCOMB_TEAM && process.env.HONEYCOMBIO_TEAM) { - process.env.HONEYCOMB_TEAM = process.env.HONEYCOMBIO_TEAM -} - -let honeycomb: Honeycomb = Honeycomb.fromEnv(process.env); - -void `{% if selftest %}`; -import { createMockHoneycomb } from './honeycomb' -honeycomb = createMockHoneycomb() -void `{% endif %}`; - -honeycomb.init() - -export { honeycomb } void `{% endif %}`; import ships from 'culture-ships' diff --git a/templates/boltzmann/data/context.ts b/templates/boltzmann/data/context.ts index bc903c08..d09f84a0 100644 --- a/templates/boltzmann/data/context.ts +++ b/templates/boltzmann/data/context.ts @@ -1,6 +1,5 @@ void `{% if selftest %}`; -import { honeycomb } from '../core/prelude' -import { beeline, otel } from '../core/honeycomb' +import { honeycomb } from '../core/honeycomb' import { IncomingMessage, ServerResponse } from 'http' import { Accepts } from 'accepts' import accepts from 'accepts' diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 2699cc9a..c2db2275 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -1,8 +1,7 @@ void `{% if selftest %}`; -import { honeycomb } from '../core/prelude' +import { beeline, honeycomb, otel, otelSemanticConventions } from '../core/honeycomb' import assert from 'assert' export { trace, honeycombMiddlewareSpans } -import { beeline, otel, otelSemanticConventions } from '../core/honeycomb' import { ServerResponse } from 'http' import { Handler } from '../core/middleware' import { Context } from '../data/context' @@ -28,10 +27,6 @@ function paramSpanAttribute(param: string): string { return `boltzmann.http.request.param.${param}` } -function traceAttribute(key: string) { - return `app.${key}` -} - export { traceName, middlewareSpanName, diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 443ad16a..3325bd44 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -4,8 +4,8 @@ export { log } import bole from '@entropic/bole' import isDev from 'are-we-dev' -import { otel } from '../core/honeycomb' -import { honeycomb, serviceName } from '../core/prelude' +import { honeycomb, otel } from '../core/honeycomb' +import { serviceName } from '../core/prelude' import { Handler } from '../core/middleware' import { Context } from '../data/context' import { STATUS, THREW } from '../core/prelude' From 043a057b67b7515b03c5458681d3951c5c814e87 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Tue, 1 Mar 2022 14:13:58 -0500 Subject: [PATCH 133/167] Don't run honeycomb init inside test block, oops --- templates/boltzmann/core/honeycomb.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index c976110e..3a223e0f 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -831,6 +831,7 @@ export { resetOtelMockSpans } +void `{% endif %}`; if (!process.env.HONEYCOMB_DATASET && process.env.HONEYCOMBIO_DATASET) { process.env.HONEYCOMB_DATASET = process.env.HONEYCOMBIO_DATASET @@ -858,6 +859,8 @@ honeycomb.init() export { honeycomb } +void `{% if selftest %}`; + import tap from 'tap' type Test = (typeof tap.Test)["prototype"] From d00fcb6baca85bc76ddb5ac7ed35656121f84b08 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 2 Mar 2022 13:18:52 -0500 Subject: [PATCH 134/167] Rename the default otel http span --- templates/boltzmann/core/middleware.ts | 2 +- templates/boltzmann/middleware/honeycomb.ts | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index d072f608..b634560c 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -268,7 +268,7 @@ if (require.main === module) { }, // The request-level parent span { - spanName: 'HTTP GET', + spanName: 'GET /', serviceName: 'test-app', library: 'boltzmann', traceId: boltzmannSpans[3].traceId, diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index c2db2275..c91eeab7 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -10,12 +10,6 @@ import isDev from 'are-we-dev' void `{% endif %}`; function traceName(method: string, pathname: string) { - // This is how OpenTelemetry names request-level spans by default, so we - // go with the grain - if (honeycomb.features.otel) { - return `HTTP ${method}` - } - // This is what the beeline traces are named today return `${method} ${pathname}` } @@ -206,6 +200,10 @@ function otelTrace () { if (span) { // for backwards compatibility with beeline traces span.setAttribute('boltzmann.http.query', context.url.search) + + // the default name for the http span is BAD - let's fix it + span.updateName(traceName(context.method, context.url.pathname)) + traceContext = otel.trace.setSpan(traceContext, span) if (isDev()) { @@ -280,7 +278,7 @@ if (require.main === module) { test('traceName', async (assert: Test) => { assert.same( traceName('GET', '/echo'), - 'HTTP GET' + 'GET /echo' ) }); From aec735faaed36ca948f1dea823995d1968fdda62 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 2 Mar 2022 13:24:18 -0500 Subject: [PATCH 135/167] Remove comment --- templates/boltzmann/middleware/honeycomb.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index c91eeab7..e5fe60a8 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -201,7 +201,6 @@ function otelTrace () { // for backwards compatibility with beeline traces span.setAttribute('boltzmann.http.query', context.url.search) - // the default name for the http span is BAD - let's fix it span.updateName(traceName(context.method, context.url.pathname)) traceContext = otel.trace.setSpan(traceContext, span) From cff8da621ff099fe6b15c3574c99ef8cce5cc29f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Wed, 2 Mar 2022 15:16:31 -0500 Subject: [PATCH 136/167] Add span attributes for CORS origin --- templates/boltzmann/middleware/cors.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/templates/boltzmann/middleware/cors.ts b/templates/boltzmann/middleware/cors.ts index 831c7777..150f335f 100644 --- a/templates/boltzmann/middleware/cors.ts +++ b/templates/boltzmann/middleware/cors.ts @@ -1,6 +1,7 @@ void `{% if selftest %}`; export { handleCORS } +import { beeline, honeycomb, otel } from '../core/honeycomb' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' @@ -31,6 +32,16 @@ function handleCORS ({ : false ) ) + const spanAttributes = { + 'boltzmann.http.origin': String(context.headers.origin) + } + if (honeycomb.features.beeline) { + beeline.addContext(spanAttributes) + } + const span = otel.trace.getSpan(otel.context.active()) + if (span) { + span.setAttributes(spanAttributes) + } const response = ( context.method === 'OPTIONS' From a2649b6687f271b6348af88991f67b4972797e96 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 3 Mar 2022 13:52:26 -0500 Subject: [PATCH 137/167] Make honeycomb settings logging more useful for beelines --- templates/boltzmann/middleware/log.ts | 34 +++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 3325bd44..025ab273 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -13,6 +13,9 @@ void `{% endif %}`; function log ({ logger = bole(serviceName), + // {% if honeycomb %} + honeycombLogger = bole(`${serviceName}:honeycomb`), + // {% endif %} level = process.env.LOG_LEVEL || 'debug', stream = process.stdout, } = {}) { @@ -24,21 +27,21 @@ function log ({ bole.output({ level, stream }) void `{% if honeycomb %}` - honeycomb.logger = bole('boltzmann:honeycomb') + honeycomb.logger = honeycombLogger const hasWriteKey: boolean = Boolean( honeycomb.options.writeKey && honeycomb.options.writeKey.length ) - let otelConfig: Record = { + let honeycombConfig: Record = { serviceName: honeycomb.options.serviceName, writeKey: `${hasWriteKey ? "DEFINED" : "NOT DEFINED"}`, dataset: honeycomb.options.dataset } - Object.assign(otelConfig, honeycomb.features) + Object.assign(honeycombConfig, honeycomb.features) - otel.diag.verbose('OpenTelemetry config:', otelConfig) + honeycombLogger.debug('Honeycomb tracing config:', honeycombConfig) void `{% endif %}` @@ -80,6 +83,7 @@ if (require.main === module) { test('log: logs expected keys for success responses', async (assert) => { const logged: [string, Record][] = [] + const loggedByHoneycomb: [string, Record][] = [] const handler = (_: Context) => { return { [STATUS]: 202, result: 'ok' } @@ -87,6 +91,9 @@ if (require.main === module) { const middleware = log({ logger: { + debug(what: object) { + logged.push(['debug', what]) + }, info(what: object) { logged.push(['info', what]) }, @@ -94,6 +101,11 @@ if (require.main === module) { logged.push(['error', what]) }, }, + honeycombLogger: { + debug(what: object) { + loggedByHoneycomb.push(['debug', what]) + }, + }, })((context: Context) => handler(context)) await middleware({ request: { @@ -114,10 +126,15 @@ if (require.main === module) { assert.ok('url' in logged[0][1]) assert.ok('host' in logged[0][1]) assert.ok('ip' in logged[0][1]) + + assert.equal(loggedByHoneycomb.length, 1) + assert.equal(loggedByHoneycomb[0][0], 'debug') + assert.equal(loggedByHoneycomb[0][1], 'Honeycomb tracing config:') }) test('log: logs expected keys for thrown error responses', async (assert) => { const logged: [string, Record][] = [] + const loggedByHoneycomb: [string, Record][] = [] const handler = (_: Context) => { throw new Error('foo') } @@ -131,6 +148,11 @@ if (require.main === module) { logged.push(['error', what]) }, }, + honeycombLogger: { + debug(what: object) { + loggedByHoneycomb.push(['debug', what]) + }, + }, })(enforceInvariants()((context: Context) => handler(context))) await middleware({ request: { @@ -146,6 +168,10 @@ if (require.main === module) { assert.equal(logged[0][1].message, 'foo') assert.equal(logged[1][0], 'info') assert.equal(logged[1][1].message, '500 GET /bloo') + + assert.equal(loggedByHoneycomb.length, 1) + assert.equal(loggedByHoneycomb[0][0], 'debug') + assert.equal(loggedByHoneycomb[0][1], 'Honeycomb tracing config:') }) } void `{% endif %}`; From 5ebf5c2a132e832681598e449cf84328312a2aec Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 3 Mar 2022 13:52:46 -0500 Subject: [PATCH 138/167] Set the initialized flag when beeline --- templates/boltzmann/core/honeycomb.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 3a223e0f..d335bdce 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -613,6 +613,7 @@ class Honeycomb { if (this.features.beeline && writeKey) { beeline({ writeKey, dataset, sampleRate, serviceName }) + this.initialized = true return } From 96407b06374c7a0c235c189c053f4193ea4a0708 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 3 Mar 2022 14:13:27 -0500 Subject: [PATCH 139/167] Minor logging tweaks --- templates/boltzmann/middleware/log.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/templates/boltzmann/middleware/log.ts b/templates/boltzmann/middleware/log.ts index 025ab273..5f6c3c53 100644 --- a/templates/boltzmann/middleware/log.ts +++ b/templates/boltzmann/middleware/log.ts @@ -41,7 +41,10 @@ function log ({ Object.assign(honeycombConfig, honeycomb.features) - honeycombLogger.debug('Honeycomb tracing config:', honeycombConfig) + honeycombLogger.debug({ + message: 'Honeycomb tracing enabled', + ...honeycombConfig + }); void `{% endif %}` @@ -129,7 +132,7 @@ if (require.main === module) { assert.equal(loggedByHoneycomb.length, 1) assert.equal(loggedByHoneycomb[0][0], 'debug') - assert.equal(loggedByHoneycomb[0][1], 'Honeycomb tracing config:') + assert.equal(loggedByHoneycomb[0][1].message, 'Honeycomb tracing enabled') }) test('log: logs expected keys for thrown error responses', async (assert) => { @@ -171,7 +174,7 @@ if (require.main === module) { assert.equal(loggedByHoneycomb.length, 1) assert.equal(loggedByHoneycomb[0][0], 'debug') - assert.equal(loggedByHoneycomb[0][1], 'Honeycomb tracing config:') + assert.equal(loggedByHoneycomb[0][1].message, 'Honeycomb tracing enabled') }) } void `{% endif %}`; From 025b1c2dc0f91e9d4701a0eb2246519695613d81 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 3 Mar 2022 18:05:11 -0500 Subject: [PATCH 140/167] Some gaps on beeline trace_type/service.name attributes --- templates/boltzmann/core/middleware.ts | 4 +++- templates/boltzmann/middleware/honeycomb.ts | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index b634560c..82d92e56 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -1,6 +1,6 @@ void `{% if selftest %}`; export { Handler, Adaptor, Middleware, MiddlewareConfig, Response, buildMiddleware, handler } -import { beeline, getOtelMockSpans, honeycomb, otel } from '../core/honeycomb' +import { beeline, getOtelMockSpans, honeycomb, otel, otelSemanticConventions } from '../core/honeycomb' import { HttpMetadata } from '../core/prelude' import { HTTPMethod } from 'find-my-way' import isDev from 'are-we-dev' @@ -99,6 +99,8 @@ async function handler (context: Context) { 'handler.route': handler.route, 'handler.version': handler.version || '*', 'handler.decorators': String(handler.decorators), + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'boltzmann.honeycomb.trace_type': 'beeline', }) } else if (honeycomb.features.otel) { diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index e5fe60a8..9789b695 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -165,6 +165,11 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { name: middlewareSpanName(name) }) + beeline.addContext({ + [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, + 'boltzmann.honeycomb.trace_type': 'beeline' + }) + // Assumption: the invariant middleware between each layer // will ensure that no errors are thrown from next(). const result = await next(context) From 3c21e108c57e16a0b2210bc0802182b3f498cdac Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 3 Mar 2022 20:27:07 -0500 Subject: [PATCH 141/167] Rename boltzman.honeycomb.trace_type to honeycomb.trace_type --- templates/boltzmann/core/honeycomb.ts | 2 +- templates/boltzmann/core/middleware.ts | 2 +- templates/boltzmann/middleware/honeycomb.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index d335bdce..3509c059 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -205,7 +205,7 @@ class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase // just the active span. onStart(span: otelTraceBase.Span, _: otel.Context): void { span.setAttribute('service_name', span.resource.attributes['service.name']) - span.setAttribute('boltzmann.honeycomb.trace_type', 'otel') + span.setAttribute('honeycomb.trace_type', 'otel') otelTraceBase.SimpleSpanProcessor.prototype.onStart.call(this, span) } diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 82d92e56..16537c7a 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -100,7 +100,7 @@ async function handler (context: Context) { 'handler.version': handler.version || '*', 'handler.decorators': String(handler.decorators), [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, - 'boltzmann.honeycomb.trace_type': 'beeline', + 'honeycomb.trace_type': 'beeline', }) } else if (honeycomb.features.otel) { diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 9789b695..15515ee5 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -88,7 +88,7 @@ function beelineTrace ({ 'request.query': context.url.search, // for forward compatibility with OpenTelemetry traces [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, - 'boltzmann.honeycomb.trace_type': 'beeline' + 'honeycomb.trace_type': 'beeline' }, traceContext.traceId, traceContext.parentSpanId, @@ -167,7 +167,7 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { beeline.addContext({ [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, - 'boltzmann.honeycomb.trace_type': 'beeline' + 'honeycomb.trace_type': 'beeline' }) // Assumption: the invariant middleware between each layer From 12a9eb4e0396729fee36498170e6ef703c1f8012 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 12:06:52 -0500 Subject: [PATCH 142/167] Use {{ version }} instead of hard-coding 1.0 --- templates/boltzmann/core/honeycomb.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 3509c059..ec3b97a2 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -499,8 +499,7 @@ class Honeycomb { } get tracer (): otel.Tracer { - // TODO: Can we do better than hard-coding 1.0.0? - return otel.trace.getTracer('boltzmann', '1.0.0') + return otel.trace.getTracer('boltzmann', '{{ version }}') } // We (usually) load options from the environment. Unlike with Options, From c616d61301d51ea4da941f8f179ea366ab16b37f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 12:07:42 -0500 Subject: [PATCH 143/167] Remove stale comment --- templates/boltzmann/core/honeycomb.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index ec3b97a2..282b0802 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -760,9 +760,6 @@ class OtelMockSpanProcessor extends HoneycombSpanProcessor { } onEnd(span: otelTraceBase.ReadableSpan): void { - // don't call super's onEnd, if only because it mysteriously causes - // sdk startup to time out in test - // note that this collects spans as they *close*, meaning a parent span // will be *behind* its children this._exporterCreatedSpans.push(span) From 00ad2258b9e6840992e1345699757a77b5c759be Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 12:10:44 -0500 Subject: [PATCH 144/167] Update stale test description --- templates/boltzmann/core/middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 16537c7a..e2085642 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -283,7 +283,7 @@ if (require.main === module) { } }, ], - "There are two nested spans, in the same trace, with service name and attributes" + "There are four spans, with the expected relationships and attributes" ) }) } From 646ec889e3af68f59e2e5adc53b8f72c1b8f4297 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 12:12:21 -0500 Subject: [PATCH 145/167] Remove stale comment --- templates/boltzmann/middleware/honeycomb.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index 15515ee5..b760b60c 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -203,7 +203,6 @@ function otelTrace () { // concerned the span could still be undefined. We could assert that it // exists, but throwing instrumentation-related errors is poor form. if (span) { - // for backwards compatibility with beeline traces span.setAttribute('boltzmann.http.query', context.url.search) span.updateName(traceName(context.method, context.url.pathname)) From 34344042b481472ddf6ed19ee7b83cc6f57f25b7 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 12:32:49 -0500 Subject: [PATCH 146/167] Update honeycomb middleware configuration docs --- docs/content/reference/03-middleware.md | 45 ++++++++++++++++++------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/docs/content/reference/03-middleware.md b/docs/content/reference/03-middleware.md index 93de9e52..edc17375 100644 --- a/docs/content/reference/03-middleware.md +++ b/docs/content/reference/03-middleware.md @@ -774,23 +774,44 @@ Boltzmann automatically attaches one instance of [`route`](#route). ### `trace` {% changelog(version="0.0.0") %} -- **Changed in 0.6.0:** Tracing now uses OpenTelemetry if `HONEYCOMB_API_HOST` is a `grpc://` url +- **Changed in 0.6.0:** Tracing now uses OpenTelemetry if any `OTEL_*` environment +variable is defined {% end %} This middleware is added to your service if you have enabled the `honeycomb` feature. This feature sends trace data to the [Honeycomb](https://www.honeycomb.io) service for deep observability of the performance of your handlers. -To configure this middleware, set the following environment variables: - -- `HONEYCOMB_API_HOST`: the honeycomb API endpoint to use; `https://` URLs use [beeline](https://www.npmjs.com/package/honeycomb-beeline) and `grpc://` URLs use [OpenTelemetry](https://opentelemetry.io/docs/instrumentation/js/getting-started/nodejs/) -- `HONEYCOMB_WRITEKEY`: the honeycomb API key to use; required to enable tracing -- `HONEYCOMB_DATASET`: the name of the dataset to send trace data to; required to enable tracing -- `HONEYCOMB_TEAM`: optional; set this to enable links to traces from error reporting -- `HONEYCOMB_SAMPLE_RATE`: optional; passed to `honeycomb-beeline` to set the sampling rate for events - -The sampling rate defaults to 1 if neither sample rate env var is set. Tracing is -disabled if a write key and dataset are not provided; the middleware is still -attached but does nothing in this case. +To configure this middleware for [beeline](https://www.npmjs.com/package/honeycomb-beeline) +tracing, set the following environment variables: + +- `HONEYCOMB_API_HOST`: (optional) the honeycomb API endpoint to use - defaults to localhost +- `HONEYCOMB_WRITEKEY`: the honeycomb API key to use - required to enable beeline tracing +- `HONEYCOMB_DATASET`: the name of the dataset to send trace data to - defaults to `nodejs` +- `HONEYCOMB_TEAM`: (optional) set this to enable links to traces from development error reporting +- `HONEYCOMB_SAMPLE_RATE`: (optional) passed to `honeycomb-beeline` to set the sampling rate for events - defaults to 1 + +The honeycomb middleware also supports +[OpenTelemetry](https://opentelemetry.io/docs/instrumentation/js/getting-started/nodejs/) +tracing over [the OTLP http/protobuf protocol](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md). +This is enabled if any `OTEL_*` environment variables are defined. + +OpenTelemetry supports many, many environment variables - they document both +[common SDK environment variables](https://opentelemetry.io/docs/reference/specification/sdk-environment-variables/) +and [OTLP exporter-specific environment variables](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md), +and it's worth perusing all of them. However, if you are in a rush: + +- `HONEYCOMB_WRITEKEY`: this is still used in an OpenTelemetry configuration +- `OTEL_EXPORTER_OTLP_ENDPOINT`: the API endpoint - i.e. `https://api.honeycomb.io`, or your [refinery](https://docs.honeycomb.io/manage-data-volume/refinery/) instance if using one +- ` + +In you really, really want to use the default OpenTelemetry configuration, +you can set `OTEL_ENABLE=1` - this isn't meaningful for the OpenTelemetry SDKs +or OTLP exporters but will trigger the enabling of OpenTelemetry in boltzmann. + +Note that OpenTelemetry tracing, while intended for use with Honeycomb, may be +used with any OTLP tracing backend. You can do this by foregoing the setting of +`HONEYCOMB_WRITEKEY` and setting `OTEL_EXPORTER_OTLP_HEADERS` to contain the +alternate headers for your backend. * * * From 68df8343ddfad505aed50d2698b0a4e2de7bbdc4 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 12:38:22 -0500 Subject: [PATCH 147/167] Tweaks to honeycomb middleware docs --- docs/content/reference/03-middleware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/reference/03-middleware.md b/docs/content/reference/03-middleware.md index edc17375..091f3bfd 100644 --- a/docs/content/reference/03-middleware.md +++ b/docs/content/reference/03-middleware.md @@ -802,8 +802,8 @@ and [OTLP exporter-specific environment variables](https://github.com/open-telem and it's worth perusing all of them. However, if you are in a rush: - `HONEYCOMB_WRITEKEY`: this is still used in an OpenTelemetry configuration +- `HONEYCOMB_DATASET`: this is also still used in an OpenTelemetry configuration - `OTEL_EXPORTER_OTLP_ENDPOINT`: the API endpoint - i.e. `https://api.honeycomb.io`, or your [refinery](https://docs.honeycomb.io/manage-data-volume/refinery/) instance if using one -- ` In you really, really want to use the default OpenTelemetry configuration, you can set `OTEL_ENABLE=1` - this isn't meaningful for the OpenTelemetry SDKs From 69c351af35753253c675c5965659e88785e2eb7d Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 14:38:23 -0500 Subject: [PATCH 148/167] Wrap honeycomb tracing in cors with template if block --- templates/boltzmann/middleware/cors.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/templates/boltzmann/middleware/cors.ts b/templates/boltzmann/middleware/cors.ts index 150f335f..b67fee67 100644 --- a/templates/boltzmann/middleware/cors.ts +++ b/templates/boltzmann/middleware/cors.ts @@ -32,6 +32,9 @@ function handleCORS ({ : false ) ) + + void `{% if honeycomb %}` + const spanAttributes = { 'boltzmann.http.origin': String(context.headers.origin) } @@ -43,6 +46,8 @@ function handleCORS ({ span.setAttributes(spanAttributes) } + void `{% endif %}` + const response = ( context.method === 'OPTIONS' ? Object.assign(Buffer.from(''), { From c3c582d8301c5b2ecfb0bf74a44b0c02ab0c52b5 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 14:38:29 -0500 Subject: [PATCH 149/167] Fix tests --- templates/boltzmann/core/middleware.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index e2085642..7316df0c 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -231,7 +231,7 @@ if (require.main === module) { attributes: { "handler_attribute": "testing 123", "service_name": "test-app", - "boltzmann.honeycomb.trace_type": "otel", + "honeycomb.trace_type": "otel", "boltzmann.http.handler.name": "testHandler", "boltzmann.handler.method": "GET", "boltzmann.handler.route": "/", @@ -250,7 +250,7 @@ if (require.main === module) { // TODO: There *should* be attributes here, no? attributes: { "service_name": "test-app", - "boltzmann.honeycomb.trace_type": "otel", + "honeycomb.trace_type": "otel", } }, // The test middleware span @@ -265,7 +265,7 @@ if (require.main === module) { attributes: { "middleware_attribute": "testing 123", "service_name": "test-app", - "boltzmann.honeycomb.trace_type": "otel", + "honeycomb.trace_type": "otel", } }, // The request-level parent span @@ -279,7 +279,7 @@ if (require.main === module) { attributes: { "boltzmann.http.query": "", "service_name": "test-app", - "boltzmann.honeycomb.trace_type": "otel" + "honeycomb.trace_type": "otel" } }, ], From 1f8a01d61300f1a3d09d0bac25dffedf1bcde8e0 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 7 Mar 2022 14:39:03 -0500 Subject: [PATCH 150/167] fix typed example build --- examples/typed/boltzmann.ts | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/examples/typed/boltzmann.ts b/examples/typed/boltzmann.ts index 804afbb4..40eae5d3 100755 --- a/examples/typed/boltzmann.ts +++ b/examples/typed/boltzmann.ts @@ -1375,22 +1375,17 @@ function handleCORS ({ return (next: Handler) => { return async function cors (context: Context) { - const spanAttributes = { - 'boltzmann.http.origin': String(context.headers.origin) - } - if (honeycomb.features.beeline) { - beeline.addContext(spanAttributes) - } - const span = otel.trace.getSpan(otel.context.active()) - if (span) { - span.setAttributes(spanAttributes) - } + const reflectedOrigin = ( + includesStar + ? '*' + : ( + originsArray.includes(String(context.headers.origin)) + ? context.headers.origin + : false + ) + ) - if (!includesStar && !originsArray.includes(String(context.headers.origin))) { - throw Object.assign(new Error('Origin not allowed'), { - [Symbol.for('status')]: 400 - }) - } + void `` const response = ( context.method === 'OPTIONS' @@ -1401,7 +1396,7 @@ function handleCORS ({ ) response[Symbol.for('headers')] = { - 'Access-Control-Allow-Origin': includesStar ? '*' : context.headers.origin, + ...(reflectedOrigin ? { 'Access-Control-Allow-Origin': reflectedOrigin } : {}), 'Access-Control-Allow-Methods': ([] as any[]).concat(methods).join(','), 'Access-Control-Allow-Headers': ([] as any[]).concat(headers).join(',') } @@ -2026,7 +2021,7 @@ const validate = { * * The `validate.body` middleware applies [JSON schema]( "https://json-schema.org/") validation to incoming * request bodies. It intercepts the body that would be returned by - * \[`context.body`] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is + * \[`context.body`\] and validates it against the given schema, throwing a `400 Bad Request` error on validation failure. If the body passes validation it is * passed through. * * `Ajv` is configured with `{useDefaults: true, allErrors: true}` by default. In From 58353e8c1fc99dfbf801b51403c14b7e6354b451 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 17 Mar 2022 13:23:23 -0400 Subject: [PATCH 151/167] Remove ctor def in span processor + comment onEnd --- templates/boltzmann/core/honeycomb.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 282b0802..e6802d77 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -192,10 +192,6 @@ type _OtelSpanProcessorClass = new(_exporter: otelTraceBase.SpanExporter) => { const _OtelSpanProcessor: _OtelSpanProcessorClass = otelTraceBase.SimpleSpanProcessor class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase.SpanProcessor { - constructor(_exporter: otelTraceBase.SpanExporter) { - super(_exporter) - } - // We want every span in the process to contain a couple of extra attributes. // Right now that's just service_name (for backwards compatibility with // beeline) and a trace type (so we can detect whether a service is using @@ -210,6 +206,8 @@ class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase otelTraceBase.SimpleSpanProcessor.prototype.onStart.call(this, span) } + // We need to define this method to override the types, even though there's + // no change in logic - c'est la vie! onEnd(span: otelTraceBase.ReadableSpan): void { otelTraceBase.SimpleSpanProcessor.prototype.onEnd.call(this, span) } From 131950c9390904f77891ad49852006fea340ad86 Mon Sep 17 00:00:00 2001 From: "Josh Holbrook (at work!)" <93009469+jfhbrook-at-work@users.noreply.github.com> Date: Thu, 17 Mar 2022 13:29:28 -0400 Subject: [PATCH 152/167] Comment update Co-authored-by: Chris Dickinson --- templates/boltzmann/core/prelude.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/boltzmann/core/prelude.ts b/templates/boltzmann/core/prelude.ts index 3886789e..df35c4c8 100644 --- a/templates/boltzmann/core/prelude.ts +++ b/templates/boltzmann/core/prelude.ts @@ -36,7 +36,7 @@ Honeycomb instrumentation is in index.tera *before* the prelude. This is because instrumentation needs to be installed prior to instrumented modules being imported. -In production, honeycomb.ts defines a class called Honeycomb and a singleton +When templated into a service scaffold, honeycomb.ts defines a class called Honeycomb and a singleton instance, so we can simply reach for it. In self-test mode, we need to import it, as is typical for non-prelude files. From 1399cd71990dee7d70a04aa247ea8ce842a459cd Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 17 Mar 2022 16:10:25 -0400 Subject: [PATCH 153/167] Improved documentation and comments --- HACKING.md | 6 +- docs/content/reference/01-cli.md | 127 ++++++++++++++++++++------ templates/boltzmann/core/honeycomb.ts | 3 - 3 files changed, 102 insertions(+), 34 deletions(-) diff --git a/HACKING.md b/HACKING.md index d81f8048..8032da67 100644 --- a/HACKING.md +++ b/HACKING.md @@ -36,6 +36,10 @@ The files in `templates/boltzmann/` include inline `tap` tests. You can run `npm ci; npm t` to run those tests. This tests the files in-situ. Integration tests for the compiled scaffold can be run using the `bin/test` tool. +You can also check whether the TypeScript will compile by running +`bin/checkts.sh`, which unlike `bin/buildjs.sh` will merely check that the +code is valid TypeScript. + When writing a module in `templates/boltzmann`, keep the following in mind: - All modules are concatenated inline using `templates/boltzmann/index.tera`. @@ -85,7 +89,7 @@ Dependencies are controlled by `src/runscripts.ron`. You should have: - Rust installed (use [rustup]) -- node 14+ +- node 16+ Check the project out and run `npm ci`. diff --git a/docs/content/reference/01-cli.md b/docs/content/reference/01-cli.md index ddcf2d0e..90fd242d 100644 --- a/docs/content/reference/01-cli.md +++ b/docs/content/reference/01-cli.md @@ -397,12 +397,26 @@ boltzmann.d.ts handlers.ts node_modules/ package.json tests/ boltzmann.js* middleware.ts nodemon.json target/ tsconfig.json ``` +#### `--volta` + +{{ changelog(version="0.6.0" }} + +Runs [volta](https://volta.sh/) in the project, pinning the Node.js version to +v16. + +**Example use:** + +```shell +$ npx boltzmann-cli . --volta +``` + ## Full usage The current output of `npx boltzmann-cli help`: ```shell -boltzmann 0.3.0 +boltzmann 0.6.0 +C J Silverio , Chris Dickinson Generate or update scaffolding for a Boltzmann service. To enable a feature, mention it or set the option to `on`. To remove a feature from an existing project, set it to `off`. @@ -412,39 +426,92 @@ boltzmann my-project --redis --website boltzmann my-project --githubci=off --honeycomb --jwt USAGE: - boltzmann [FLAGS] [OPTIONS] [destination] - -FLAGS: - --all Enable everything! - --docs Open the Boltzmann documentation in a web browser - --force Update a git-repo destination even if there are changes - -h, --help Prints help information - -q, --quiet Suppress all output except errors - --selftest Build for a self-test - -s, --silent Suppress all output except errors - -V, --version Prints version information - -v, --verbose Pass -v or -vv to increase verbosity - --website Enable website feature set (templates, csrf, staticfiles, jwt, livereload, ping, status) + boltzmann [OPTIONS] [DESTINATION] + +ARGS: + + The path to the Boltzmann service + + [default: ] OPTIONS: - --csrf Enable csrf protection middleware - --esbuild Enable asset bundling via ESBuild - --githubci Enable GitHub actions CI - --honeycomb Enable tracing via Honeycomb - --jwt Enable jwt middleware - --livereload Enable live reload in development - --oauth Enable OAuth - --ping Enable /monitor/ping liveness endpoint; on by default - --postgres Enable postgres - --redis Enable redis - --staticfiles Enable static file serving in development - --status Enable /monitor/status healthcheck endpoint; on by default - --templates Enable Nunjucks templates - --typescript Scaffold a project implemented in TypeScript + --all + Enable everything (mostly for testing) -ARGS: - The path to the Boltzmann service [default: ] + --csrf [] + Enable csrf protection middleware + + --docs + Open the Boltzmann documentation in a web browser + + --esbuild [] + Enable asset bundling via ESBuild + + --force + Update a git-repo destination even if there are changes + + --githubci [] + Enable GitHub actions CI + + -h, --help + Print help information + + --honeycomb [] + Enable tracing via Honeycomb + + --jwt [] + Enable jwt middleware + + --livereload [] + Enable live reload in development + + --oauth [] + Enable OAuth + + --ping [] + Enable /monitor/ping liveness endpoint; on by default + + --postgres [] + Enable postgres middleware + + -q, --quiet + Suppress all output except errors; an alias for silent + + --redis [] + Enable redis middleware + + -s, --silent + Suppress all output except errors + + --selftest + Template a project with the self-test code enabled + + --staticfiles [] + Enable static file serving in development + + --status [] + Enable /monitor/status healthcheck endpoint; on by default + + --templates [] + Enable Nunjucks templates + + --typescript [] + Scaffold a project implemented in TypeScript + + -v, --verbose + Pass -v or -vv to increase verbosity + + -V, --version + Print version information + + --volta [] + Enable node version management via Volta + --website + Enable all features relevant to building websites + + This option group enables the templates, csrf, staticfile, jwt, livereload, ping, and + status options. ``` [`test`]: #TKTKTK diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index e6802d77..f8fd740f 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -512,9 +512,6 @@ class Honeycomb { ) } - // serviceName is defined in the prelude, so rather than doing the same - // logic twice we let the prelude inject it when creating the honeycomb - // object. public static parseEnv(env: typeof process.env = process.env): HoneycombOptions { // For beelines, if we don't have HONEYCOMB_WRITEKEY there isn't much we // can do... From dd448f90c070b7bf8d33bb906407f82d24cba9d0 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Mar 2022 13:59:43 -0400 Subject: [PATCH 154/167] Use INTERNAL SpanKind instead of SERVER --- templates/boltzmann/core/middleware.ts | 4 ++-- templates/boltzmann/middleware/honeycomb.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 7316df0c..5bfa11ed 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -114,7 +114,7 @@ async function handler (context: Context) { 'boltzmann.http.handler.version': handler.version || '*', 'boltzmann.http.handler.decorators': String(handler.decorators) }, - kind: otel.SpanKind.SERVER + kind: otel.SpanKind.INTERNAL }, traceContext ) @@ -187,7 +187,7 @@ if (require.main === module) { let traceContext = otel.context.active() const span = honeycomb.tracer.startSpan( 'HTTP GET', - { kind: otel.SpanKind.SERVER, }, + { kind: otel.SpanKind.INTERNAL, }, traceContext ) diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index b760b60c..da02b095 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -254,7 +254,7 @@ function otelMiddlewareSpans ({name}: {name?: string} = {}) { const span = honeycomb.tracer.startSpan( middlewareSpanName(name), - { kind: otel.SpanKind.SERVER }, + { kind: otel.SpanKind.INTERNAL }, traceContext ) traceContext = otel.trace.setSpan(traceContext, span) From 193214bfc8c24b5fe1fd9a0340d019b9db05ef97 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Mar 2022 15:19:59 -0400 Subject: [PATCH 155/167] Document factory overrides as internal --- templates/boltzmann/core/honeycomb.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index f8fd740f..dd2298a2 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -433,10 +433,10 @@ const defaultOtelFactories: OtelFactories = { } } -// For testing purposes, it can be beneficial to -// override how objects in OpenTelemetry initialization -// are created. The Honeycomb class allows for -// passing overrides into its constructor. +// For testing purposes, it can be beneficial to override how objects in +// OpenTelemetry initialization are created. The Honeycomb class allows for +// passing overrides into its constructor. This is an INTERNAL API - unless +// you're writing honeycomb-related unit tests, it won't be relevant to you. interface OtelFactoryOverrides { headers?: (writeKey: string | null, dataset: string | null) => HoneycombOTLPHeaders resource?: (serviceName: string) => otelResources.Resource From 4aaacc3bf2d37a4340b5b95a771bce0f75e4f8f9 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Mar 2022 15:20:16 -0400 Subject: [PATCH 156/167] Remove graceful shutdown code --- templates/boltzmann/core/honeycomb.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index dd2298a2..98ed7a06 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -650,27 +650,15 @@ class Honeycomb { // a no-op. This needs to happen before anything happens in // the entrypoint and is an async operation. public async start(): Promise { - let exitCode = 0 const sdk = this.sdk - const die = async (err: Error) => { - otel.diag.error(err.stack || String(err)); - exitCode = 1 - await shutdown() - } - const shutdown = async () => { await this.stop() - process.exit(exitCode) } if (sdk) { - process.once('SIGTERM', shutdown) process.once('beforeExit', shutdown) - process.once('uncaughtException', die) - process.once('unhandledRejection', async (reason: Error | any, _: Promise) => { - await die(reason) - }) + await sdk.start() } this.started = true From b602bd33226456c2231d26221e790017a28343ff Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Mar 2022 15:20:41 -0400 Subject: [PATCH 157/167] Expose boltzmann version in /monitor/status --- templates/boltzmann/middleware/status.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/boltzmann/middleware/status.ts b/templates/boltzmann/middleware/status.ts index 5128c62b..d9cd135e 100644 --- a/templates/boltzmann/middleware/status.ts +++ b/templates/boltzmann/middleware/status.ts @@ -68,6 +68,7 @@ function handleStatus ({ git, uptime: process.uptime(), service: serviceName, + version: '{{ version }}', hostname, memory: process.memoryUsage(), downstream, From b767076a9ff8d0aaea53c486f2fae5b057a74772 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 21 Mar 2022 15:22:01 -0400 Subject: [PATCH 158/167] Remove compatibility + trace_type attributes --- templates/boltzmann/core/honeycomb.ts | 46 ++++----------------- templates/boltzmann/core/middleware.ts | 15 +------ templates/boltzmann/middleware/honeycomb.ts | 10 +---- 3 files changed, 10 insertions(+), 61 deletions(-) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 98ed7a06..5f2f7ae9 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -177,42 +177,6 @@ if (!process.env.LOG_LEVEL || process.env.LOG_LEVEL === 'debug') { otel.diag.setLogger(_diagLogger, otelCore.getEnv().OTEL_LOG_LEVEL) } -// There's a bug in the trace base library where the SimpleSpanProcessor doesn't -// actually conform to the SpanProcessor interface! onStart in particular -// doesn't take the context argument. This makes typescript extremely -// cranky. -// -// We work around this by defining a new type which is the same as a -// SimpleSpanProcessor, but without enforcing onStart and onEnd. Then, we -// implement those methods as specified by the SpanProcessor interface. -type _OtelSpanProcessorClass = new(_exporter: otelTraceBase.SpanExporter) => { - [P in Exclude]: otelTraceBase.SpanProcessor[P] -} - -const _OtelSpanProcessor: _OtelSpanProcessorClass = otelTraceBase.SimpleSpanProcessor - -class HoneycombSpanProcessor extends _OtelSpanProcessor implements otelTraceBase.SpanProcessor { - // We want every span in the process to contain a couple of extra attributes. - // Right now that's just service_name (for backwards compatibility with - // beeline) and a trace type (so we can detect whether a service is using - // beeline or otel). This could theoretically be extended to allow - // customization a la beeline.addTraceContext, but that problem is really - // hairy and there are a lot of good reasons to add most attributes to - // just the active span. - onStart(span: otelTraceBase.Span, _: otel.Context): void { - span.setAttribute('service_name', span.resource.attributes['service.name']) - span.setAttribute('honeycomb.trace_type', 'otel') - - otelTraceBase.SimpleSpanProcessor.prototype.onStart.call(this, span) - } - - // We need to define this method to override the types, even though there's - // no change in logic - c'est la vie! - onEnd(span: otelTraceBase.ReadableSpan): void { - otelTraceBase.SimpleSpanProcessor.prototype.onEnd.call(this, span) - } -} - type HoneycombOTLPHeaders = { [s: string]: string } @@ -368,7 +332,12 @@ const defaultOtelFactories: OtelFactories = { // Process spans, using the supplied trace exporter to // do the actual exporting. spanProcessor (spanExporter: otelTraceBase.SpanExporter): otelTraceBase.SpanProcessor { - return new HoneycombSpanProcessor(spanExporter) + // There's a bug in the trace base library where the SimpleSpanProcessor doesn't + // actually conform to the SpanProcessor interface! Luckily this difference + // comes from not including an optional argument in the type signature and is + // safe to cast. + + return (new otelTraceBase.SimpleSpanProcessor(spanExporter)) }, instrumentations () { @@ -727,14 +696,13 @@ export { HoneycombFeatures, HoneycombOptions, HoneycombOTLPHeaders, - HoneycombSpanProcessor, OtelFactories, OtelFactoryOverrides, } void `{% if selftest %}` -class OtelMockSpanProcessor extends HoneycombSpanProcessor { +class OtelMockSpanProcessor extends otelTraceBase.SimpleSpanProcessor { public _exporterCreatedSpans: otelTraceBase.ReadableSpan[] = [] constructor(_exporter: otelTraceBase.SpanExporter) { diff --git a/templates/boltzmann/core/middleware.ts b/templates/boltzmann/core/middleware.ts index 5bfa11ed..e0b6faa7 100644 --- a/templates/boltzmann/core/middleware.ts +++ b/templates/boltzmann/core/middleware.ts @@ -98,9 +98,7 @@ async function handler (context: Context) { 'handler.method': String(handler.method), 'handler.route': handler.route, 'handler.version': handler.version || '*', - 'handler.decorators': String(handler.decorators), - [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, - 'honeycomb.trace_type': 'beeline', + 'handler.decorators': String(handler.decorators) }) } else if (honeycomb.features.otel) { @@ -230,8 +228,6 @@ if (require.main === module) { // TODO: There *should* be attributes here, no? attributes: { "handler_attribute": "testing 123", - "service_name": "test-app", - "honeycomb.trace_type": "otel", "boltzmann.http.handler.name": "testHandler", "boltzmann.handler.method": "GET", "boltzmann.handler.route": "/", @@ -248,10 +244,7 @@ if (require.main === module) { spanId: boltzmannSpans[1].spanId, parentSpanId: boltzmannSpans[2].spanId, // TODO: There *should* be attributes here, no? - attributes: { - "service_name": "test-app", - "honeycomb.trace_type": "otel", - } + attributes: {} }, // The test middleware span { @@ -264,8 +257,6 @@ if (require.main === module) { // TODO: There *should* be attributes here, no? attributes: { "middleware_attribute": "testing 123", - "service_name": "test-app", - "honeycomb.trace_type": "otel", } }, // The request-level parent span @@ -278,8 +269,6 @@ if (require.main === module) { parentSpanId: undefined, attributes: { "boltzmann.http.query": "", - "service_name": "test-app", - "honeycomb.trace_type": "otel" } }, ], diff --git a/templates/boltzmann/middleware/honeycomb.ts b/templates/boltzmann/middleware/honeycomb.ts index da02b095..0fd3a9d8 100644 --- a/templates/boltzmann/middleware/honeycomb.ts +++ b/templates/boltzmann/middleware/honeycomb.ts @@ -85,10 +85,7 @@ function beelineTrace ({ 'request.method': context.method, 'request.scheme': context.url.protocol, 'request.path': context.url.pathname, - 'request.query': context.url.search, - // for forward compatibility with OpenTelemetry traces - [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, - 'honeycomb.trace_type': 'beeline' + 'request.query': context.url.search }, traceContext.traceId, traceContext.parentSpanId, @@ -165,11 +162,6 @@ function beelineMiddlewareSpans ({name}: {name?: string} = {}) { name: middlewareSpanName(name) }) - beeline.addContext({ - [otelSemanticConventions.SemanticResourceAttributes.SERVICE_NAME]: honeycomb.options.serviceName, - 'honeycomb.trace_type': 'beeline' - }) - // Assumption: the invariant middleware between each layer // will ensure that no errors are thrown from next(). const result = await next(context) From 5502b7e26057968908ce050af13503e0774b670e Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Thu, 24 Mar 2022 12:37:09 -0400 Subject: [PATCH 159/167] Install volta during tests --- .github/workflows/test.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9240598b..fa50e521 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,6 +24,11 @@ jobs: with: node-version: ${{ matrix.node_version }} + - name: Install volta + run: | + curl https://get.volta.sh | bash + echo "PATH='${PATH}:${HOME}/.volta/bin'" >> "${GITHUB_ENV}" + - uses: actions-rs/toolchain@v1 with: toolchain: stable From a4085e0bf575a8bd740b1eb65542640858a1f19a Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Mar 2022 14:40:49 -0400 Subject: [PATCH 160/167] Try a different strategy to add volta to the PATH --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fa50e521..9a7abc0f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,7 +27,8 @@ jobs: - name: Install volta run: | curl https://get.volta.sh | bash - echo "PATH='${PATH}:${HOME}/.volta/bin'" >> "${GITHUB_ENV}" + echo "VOLTA_HOME='${HOME}/.volta'" >> "${GITHUB_ENV}" + echo "${HOME}/.volta/bin" >> "${GITHUB_PATH}" - uses: actions-rs/toolchain@v1 with: From af6d060e65b6f4570b77ec437e37a74ca536cf5f Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Fri, 25 Mar 2022 15:14:32 -0400 Subject: [PATCH 161/167] why isnt volta working?? --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9a7abc0f..2e83fad6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,6 +30,12 @@ jobs: echo "VOLTA_HOME='${HOME}/.volta'" >> "${GITHUB_ENV}" echo "${HOME}/.volta/bin" >> "${GITHUB_PATH}" + - name: Why isn't volta working? + run: | + echo "${PATH}" + echo "${VOLTA_HOME}" + ls ~/.volta + - uses: actions-rs/toolchain@v1 with: toolchain: stable From b84a31e1f262c23db767d6e3c6af94d190cc1ae2 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Mar 2022 12:57:51 -0400 Subject: [PATCH 162/167] Try running "volta install node" --- .github/workflows/test.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2e83fad6..50bb9f9c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,11 +30,9 @@ jobs: echo "VOLTA_HOME='${HOME}/.volta'" >> "${GITHUB_ENV}" echo "${HOME}/.volta/bin" >> "${GITHUB_PATH}" - - name: Why isn't volta working? + - name: Run volta install run: | - echo "${PATH}" - echo "${VOLTA_HOME}" - ls ~/.volta + volta install node - uses: actions-rs/toolchain@v1 with: From fcdcd07b00fe678604f0ee8ae68667b608175313 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Mar 2022 13:07:01 -0400 Subject: [PATCH 163/167] Try installing volta during the build step --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 50bb9f9c..c60cce65 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,13 +30,10 @@ jobs: echo "VOLTA_HOME='${HOME}/.volta'" >> "${GITHUB_ENV}" echo "${HOME}/.volta/bin" >> "${GITHUB_PATH}" - - name: Run volta install - run: | - volta install node - - uses: actions-rs/toolchain@v1 with: toolchain: stable + - uses: actions/cache@v2 if: runner.os != 'macOS' with: @@ -58,6 +55,9 @@ jobs: - name: run cargo build --release for caching run: | + volta install node + echo "${PATH}" + echo "$(which node)" bin/buildjs.sh cargo build --release From 59a8e922318b2812718e7973948c52f0740cdccf Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Mar 2022 13:22:17 -0400 Subject: [PATCH 164/167] Remove volta from --all --- .github/workflows/test.yml | 6 ------ src/settings.rs | 9 ++++++++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c60cce65..bbb46981 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,12 +24,6 @@ jobs: with: node-version: ${{ matrix.node_version }} - - name: Install volta - run: | - curl https://get.volta.sh | bash - echo "VOLTA_HOME='${HOME}/.volta'" >> "${GITHUB_ENV}" - echo "${HOME}/.volta/bin" >> "${GITHUB_PATH}" - - uses: actions-rs/toolchain@v1 with: toolchain: stable diff --git a/src/settings.rs b/src/settings.rs index 1a2f44eb..99ec528a 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -138,6 +138,13 @@ impl Settings { None => self.typescript.unwrap_or(false), }; + let is_volta = match &flags.volta { + Some(None) => true, + Some(Some(Flipper::On)) => true, + Some(Some(Flipper::Off)) => false, + None => self.volta.unwrap_or(false), + }; + Settings { // website features, grouped csrf: cast(&flags.csrf, &self.csrf, flags.all || flags.website), @@ -172,7 +179,7 @@ impl Settings { typescript: if is_typescript { Some(true) } else { None }, version: Some(version), node_version: Some(node_version), - volta: cast(&flags.volta, &self.volta, flags.all), + volta: if is_volta { Some(true) } else { None}, selftest: if flags.selftest { Some(true) } else { None }, rest: HashMap::new(), From 8873022a302a9e9c872cbd8db7bac1763fd32b1c Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Mar 2022 13:36:06 -0400 Subject: [PATCH 165/167] Clean up release build task --- .github/workflows/test.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bbb46981..f9954f0b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,9 +49,6 @@ jobs: - name: run cargo build --release for caching run: | - volta install node - echo "${PATH}" - echo "$(which node)" bin/buildjs.sh cargo build --release From a02f344040ce23bde518c228a3347763271b4990 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Mar 2022 15:20:21 -0400 Subject: [PATCH 166/167] updated package.json --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 65031809..55e1422f 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@opentelemetry/sdk-trace-base": "^1.0.1", "@opentelemetry/sdk-trace-node": "^1.0.1", "@opentelemetry/semantic-conventions": "^1.0.1", + "@types/uuid": "^8.3.0", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", @@ -70,8 +71,8 @@ "@types/pg": "^7.14.11", "@types/tap": "^15.0.0", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", From 2405c2bef09e09a404d2bf7955293a406075ce33 Mon Sep 17 00:00:00 2001 From: Josh Holbrook Date: Mon, 28 Mar 2022 15:31:23 -0400 Subject: [PATCH 167/167] Handle peer dependencies shenanigans as best we can --- package-lock.json | 8384 ++++++++--------- src/dependencies.ron | 14 - src/main.rs | 5 +- templates/boltzmann/core/honeycomb.ts | 4 +- templates/boltzmann/core/utils/index.ts | 5 +- templates/boltzmann/middleware/csrf.ts | 2 +- .../middleware/enforce-invariants.ts | 3 +- templates/boltzmann/middleware/jwt.ts | 4 +- templates/boltzmann/middleware/status.ts | 2 +- templates/boltzmann/middleware/template.ts | 4 +- 10 files changed, 4155 insertions(+), 4272 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77ff6756..7fd0107c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@opentelemetry/sdk-trace-base": "^1.0.1", "@opentelemetry/sdk-trace-node": "^1.0.1", "@opentelemetry/semantic-conventions": "^1.0.1", + "@types/uuid": "^8.3.0", "accepts": "^1.3.7", "ajv": "^8.0.5", "ajv-formats": "^2.0.2", @@ -71,8 +72,8 @@ "@types/pg": "^7.14.11", "@types/tap": "^15.0.0", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.11.0", - "@typescript-eslint/parser": "^4.11.0", + "@typescript-eslint/eslint-plugin": "^5.12.0", + "@typescript-eslint/parser": "^5.12.1", "ansi-escapes": "^4.3.1", "bistre": "^1.0.1", "c8": "^7.7.1", @@ -91,42 +92,57 @@ "typescript": "^4.2.3" } }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.10.4" } }, "node_modules/@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", - "dev": true + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/core": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", - "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.15", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.14", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -136,6 +152,18 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -145,46 +173,34 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, "dependencies": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } @@ -198,131 +214,155 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight/node_modules/ansi-styles": { @@ -397,9 +437,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", - "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -409,41 +449,84 @@ } }, "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", - "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.15", - "@babel/types": "^7.13.14", + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { @@ -462,15 +545,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", @@ -497,19 +580,13 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { @@ -519,9 +596,9 @@ "dev": true }, "node_modules/@grpc/grpc-js": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", - "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.10.tgz", + "integrity": "sha512-++oAubX/7rJzlqH0ShyzDENNNDHYrlttdc3NM40KlaVQDcgGqQknuPoavmyTC+oNUDyxPCX5dHceKhfcgN3tiw==", "dependencies": { "@grpc/proto-loader": "^0.6.4", "@types/node": ">=12.12.47" @@ -548,39 +625,6 @@ "node": ">=6" } }, - "node_modules/@grpc/proto-loader/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@grpc/proto-loader/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, "node_modules/@hapi/b64": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", @@ -590,9 +634,9 @@ } }, "node_modules/@hapi/boom": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.2.tgz", - "integrity": "sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q==", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", "dependencies": { "@hapi/hoek": "9.x.x" } @@ -614,9 +658,9 @@ } }, "node_modules/@hapi/hoek": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz", - "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" }, "node_modules/@hapi/iron": { "version": "6.0.0", @@ -641,9 +685,9 @@ } }, "node_modules/@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0" @@ -659,6 +703,26 @@ "@hapi/topo": "^5.0.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -675,89 +739,175 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@opentelemetry/api": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", - "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", - "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, "engines": { - "node": ">=8.1.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "node": ">=8" } }, - "node_modules/@opentelemetry/context-base": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", - "integrity": "sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true, "engines": { - "node": ">=8.0.0" + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz", + "integrity": "sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.1.1.tgz", + "integrity": "sha512-17wlKOwcWzo1Eo2T1OJqWTnrUZ6vTdmHs9XhcqChvyx6N8DRIP096qQxfebk/zDzVgvjryv+K2pYjONPH404hQ==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.2.0" } }, "node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.1.1.tgz", + "integrity": "sha512-rNYVBLzO+gXeYmNVcm4NfKw9x+nTy08Qp8SMpkmM5cqfdEwEtKw83vpSrFKzafy2aOIpmUkKGpi2k/m5kiDP9w==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/semantic-conventions": "1.1.1" }, "engines": { "node": ">=8.5.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": ">=1.0.0 <1.2.0" } }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { @@ -779,6 +929,59 @@ "@opentelemetry/api": "^1.0.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.27.0.tgz", @@ -795,6 +998,59 @@ "@opentelemetry/api": "^1.0.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.27.0.tgz", @@ -814,6 +1070,59 @@ "@opentelemetry/api": "^1.0.0" } }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "dependencies": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@opentelemetry/instrumentation": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.27.0.tgz", @@ -829,9 +1138,9 @@ } }, "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", - "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.1.tgz", + "integrity": "sha512-NwLMHthT7/YncTZcfYbb24n8z/mFYSWPlZkWOhG6XVRAE0KsDLlMsrwvha5Yg/4vhv4nj2qLM9bk5+zA5a/ZfA==", "dependencies": { "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/semantic-conventions": "^1.0.0", @@ -861,6 +1170,28 @@ "@opentelemetry/api": "^1.0.0" } }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@opentelemetry/instrumentation-pg": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.27.0.tgz", @@ -904,46 +1235,38 @@ "@opentelemetry/api": "^1.0.2" } }, - "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", - "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.1.1.tgz", + "integrity": "sha512-FzrImysl3cVrPUm9mTTCN4Z/A6lYEyuKe6cE/SV9Avek6EKY8Ibgxqsg76T0KN27gm/i3YEbd/NL/+HZit0Wgw==", "dependencies": { - "@opentelemetry/core": "1.0.1" + "@opentelemetry/core": "1.1.1" }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": ">=1.0.0 <1.2.0" } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", - "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.1.1.tgz", + "integrity": "sha512-l1uuJN4phlsZgqGJLEJRo+QDnXizIwV9oC1N2+8KWpA+cKbAG0Wa4+JGjgio8vnF0kccJDQ02CG7cBbkcleBgA==", "dependencies": { - "@opentelemetry/core": "1.0.1" + "@opentelemetry/core": "1.1.1" }, "engines": { "node": ">=8.5.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": ">=1.0.0 <1.2.0" } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", - "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.3.tgz", + "integrity": "sha512-0bhy8L1JZfqGqMjaPu1tV3rBsmtN42+wycJYhxMBbaB4E0ZDshDLnBHn3AeLMPLtFUqiyyn48JluuBfD7KPkhA==", "dependencies": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.0.0", @@ -957,9 +1280,9 @@ } }, "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", - "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.2.tgz", + "integrity": "sha512-CuFqdUGfQtVJ6paaasUaUN6dHxbu0CpUFnHws4Vj/K5SDUxR4l3/Vy5SvMiQ21mRCkeDDDbnw8cPEoA/xGKTrg==", "dependencies": { "@opentelemetry/resources": "^1.0.0", "@opentelemetry/semantic-conventions": "^1.0.0", @@ -974,6 +1297,52 @@ } }, "node_modules/@opentelemetry/resources": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.1.1.tgz", + "integrity": "sha512-w0X65ufTaRevIumjylWzYhRquRNoM5T6e0ARNcE0o2YkYPkAxTr3PYkcXG8hUdWRAglqliZKG4IlMv03Q0wOXA==", + "dependencies": { + "@opentelemetry/core": "1.1.1", + "@opentelemetry/semantic-conventions": "1.1.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.2.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "dependencies": { + "@opentelemetry/api-metrics": "0.27.0", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/resources": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", @@ -988,6 +1357,14 @@ "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, + "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@opentelemetry/sdk-node": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.27.0.tgz", @@ -1010,32 +1387,75 @@ "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==", + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "dependencies": { + "@opentelemetry/core": "1.0.1" + }, "engines": { - "node": ">=8.0.0" + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics-base": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", - "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", "dependencies": { - "@opentelemetry/api-metrics": "0.27.0", "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "lodash.merge": "^4.6.2" + "@opentelemetry/semantic-conventions": "1.0.1" }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", @@ -1051,7 +1471,7 @@ "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/sdk-trace-node": { + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", @@ -1070,7 +1490,7 @@ "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", @@ -1078,6 +1498,49 @@ "node": ">=8.0.0" } }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.1.1.tgz", + "integrity": "sha512-nj5kFly/d6V2UXZNi3jCaRBw44/7Z91xH0PcemXJTO3B6gyMx8zIHXdnECxrTVR1pglDWYCGs84uXPavu5SULw==", + "dependencies": { + "@opentelemetry/core": "1.1.1", + "@opentelemetry/resources": "1.1.1", + "@opentelemetry/semantic-conventions": "1.1.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.1.0 <1.2.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.1.1.tgz", + "integrity": "sha512-wb/BONBrBs/EDN24AqB1KAAygVUiD8WdufaprLdv1LGTNat2ETCVVX+jKoi3K8W6y1KVLeEM5GjBV3Ww0E40nA==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.1.1", + "@opentelemetry/core": "1.1.1", + "@opentelemetry/propagator-b3": "1.1.1", + "@opentelemetry/propagator-jaeger": "1.1.1", + "@opentelemetry/sdk-trace-base": "1.1.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.1.0 <1.2.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.1.1.tgz", + "integrity": "sha512-GdTwDHSaZ6iP5LUdvS/SLUjn3067xn1HcBsLZCh8YOsf22d/YWTBcnFl3buieBP4KiajwHLho4I8HSMDKACBSg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -1162,9 +1625,9 @@ } }, "node_modules/@tsconfig/node14": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", - "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", "dev": true }, "node_modules/@types/accepts": { @@ -1186,15 +1649,10 @@ "ajv": "*" } }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, "node_modules/@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "node_modules/@types/csrf": { @@ -1218,36 +1676,30 @@ } }, "node_modules/@types/hapi__shot": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.1.tgz", - "integrity": "sha512-44Jj7jJAFgNVgfdbyVtBUbEIbYqWRKAbLR4kiQxBbVEdf8ZKfa5Hg1qg4QdzXBgjw0mopewU4wx1/eWRTVelNQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.2.tgz", + "integrity": "sha512-8wWgLVP1TeGqgzZtCdt+F+k15DWQvLG1Yv6ZzPfb3D5WIo5/S+GGKtJBVo2uNEcqabP5Ifc71QnJTDnTmw1axA==", "dev": true, "dependencies": { "@types/node": "*" } }, - "node_modules/@types/is-windows": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", - "integrity": "sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg==", - "dev": true - }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-rNAPdomlIUX0i0cg2+I+Q1wOUr531zHBQ+cV/28PJ39bSPKjahatZZ2LMuhiguETkCgLVzfruw/ZvNMNkKoSzw==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", + "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", "dev": true, "dependencies": { "@types/node": "*" @@ -1265,14 +1717,14 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" }, "node_modules/@types/nunjucks": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.1.4.tgz", - "integrity": "sha512-cR65PLlHKW/qxxj840dbNb3ICO+iAVQzaNKJ8TcKOVKFi+QcAkhw9SCY8VFAyU41SmJMs+2nrIN2JGhX+jYb7A==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.1.tgz", + "integrity": "sha512-hUh5HIC7peH+0MvlYU5KM2RydWxG1mBceivHsQGwlelU9zlczLICyJmjMwgjkI3m0+N50n46GVHkw35lIim6LQ==", "dev": true }, "node_modules/@types/oauth": { @@ -1320,45 +1772,46 @@ } }, "node_modules/@types/tap": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.0.tgz", - "integrity": "sha512-AAsxWamgPOFWAQoSVOkQgGpi/wdk28Bmof7/KWI8T97mnDsjwHFrwclLBNGhaeXYhQABQZ1e2ovPIS7OAuM4vQ==", + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.6.tgz", + "integrity": "sha512-ScXtRg7oSra4sBmq534voWPNUrbwt8q9kABA6SsEXx1qXnaxf/mf0BzfRPHW4xem7I0PlzrmWIIXP/iDNeoCvw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz", - "integrity": "sha512-FPUyCPKZbVGexmbCFI3EQHzCZdy2/5f+jv6k2EDljGdXSRc0cKvbndd2nHZkSLqCNOPk0jB6lGzwIkglXcYVsQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.21.0", - "@typescript-eslint/scope-manager": "4.21.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1366,83 +1819,69 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/parser": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "debug": "^4.3.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.21.0.tgz", - "integrity": "sha512-cEbgosW/tUFvKmkg3cU7LBoZhvUs+ZPVM9alb25XvR0dal4qHL3SiUqHNrzoWSxaXA9gsifrYrS1xdDV6w/gIA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.21.0.tgz", - "integrity": "sha512-eyNf7QmE5O/l1smaQgN0Lj2M/1jOuNg2NrBm1dqqQN0sVngTLyw8tdCbih96ixlhbF1oINoN8fDCyEH9SjLeIA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "debug": "^4.1.1" + "@typescript-eslint/utils": "5.17.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "*" }, "peerDependenciesMeta": { "typescript": { @@ -1450,30 +1889,13 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.21.0.tgz", - "integrity": "sha512-kfOjF0w1Ix7+a5T1knOw00f7uAP9Gx44+OEsNQi0PvvTPLYeXJlsCJ4tYnDj5PQEYfpcgOH5yBlw7K+UEI9Agw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.21.0.tgz", - "integrity": "sha512-+OQaupjGVVc8iXbt6M1oZMwyKQNehAfLYJJ3SdvnofK2qcjfor9pEM62rVjBknhowTkh+2HF+/KdRAc/wGBN2w==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1481,21 +1903,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.21.0.tgz", - "integrity": "sha512-ZD3M7yLaVGVYLw4nkkoGKumb7Rog7QID9YOWobFDMQKNl+vPxqVIW/uDk+MDeGc+OHcoG2nJ2HphwiPNajKw3w==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1507,50 +1929,41 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.21.0.tgz", - "integrity": "sha512-dH22dROWGi5Z6p+Igc8bLVLmwy7vEe8r+8c+raPQU0LxgogPUrRAtRGtvBWmlr9waTu3n+QLt/qrS/hWzk1x5w==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.21.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.17.0", + "eslint-visitor-keys": "^3.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1580,12 +1993,12 @@ } }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -1604,14 +2017,22 @@ } }, "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/after-all-results": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/after-all-results/-/after-all-results-2.0.0.tgz", @@ -1643,9 +2064,9 @@ } }, "node_modules/ajv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", - "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -1658,9 +2079,9 @@ } }, "node_modules/ajv-formats": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", - "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dependencies": { "ajv": "^8.0.0" }, @@ -1674,43 +2095,23 @@ } }, "node_modules/ajv-keywords": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.0.0.tgz", - "integrity": "sha512-ULd1QMjRoH6JDNUQIfDLrlE+OgZlFaxyYCjzt58uNuUQtKXt8/U+vK/8Ql0gyn/C5mqZzUWtKMqr/4YquvTrWA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { - "ajv": "^8.0.0" + "ajv": "^8.8.2" } }, "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" + "string-width": "^4.1.0" } }, "node_modules/ansi-colors": { @@ -1737,37 +2138,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", - "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -1841,9 +2231,9 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "dependencies": { "safer-buffer": "~2.1.0" @@ -1869,11 +2259,6 @@ "node": ">=4" } }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1887,6 +2272,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", "integrity": "sha1-SppaidBl7F2OUlS9nulrp2xTK1o=", + "deprecated": "No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option.", "dev": true, "dependencies": { "lru-cache": "^4.0.0" @@ -1938,9 +2324,9 @@ "dev": true }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/bcrypt-pbkdf": { @@ -2064,22 +2450,62 @@ } }, "node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "dependencies": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2099,7 +2525,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -2108,26 +2533,32 @@ } }, "node_modules/browserslist": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", - "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001208", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.712", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/buffer-equal-constant-time": { @@ -2136,9 +2567,9 @@ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/buffer-writer": { @@ -2150,30 +2581,29 @@ } }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/c8": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.7.1.tgz", - "integrity": "sha512-OO9KpDGv1iTd/MBNUForJH7vPKt9XnRPWSBKeRJGma4xfTaKBObA0zWAplFpFRuf/qRmATFqGFrzxqDk51LXsw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.11.0.tgz", + "integrity": "sha512-XqPyj1uvlHMr+Y1IeRndC2X5P7iJzJlEJwBpCdBbq2JocXOgJfr+JVfJkyNMGROke5LfKrhSFXGFXnwnRJAUJw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@istanbuljs/schema": "^0.1.2", "find-up": "^5.0.0", "foreground-child": "^2.0.0", - "furi": "^2.0.0", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.0.1", "istanbul-lib-report": "^3.0.0", "istanbul-reports": "^3.0.2", "rimraf": "^3.0.0", "test-exclude": "^6.0.0", - "v8-to-istanbul": "^7.1.0", + "v8-to-istanbul": "^8.0.0", "yargs": "^16.2.0", "yargs-parser": "^20.2.7" }, @@ -2184,103 +2614,6 @@ "node": ">=10.12.0" } }, - "node_modules/c8/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/c8/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/c8/node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -2369,10 +2702,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001208", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", - "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==", - "dev": true + "version": "1.0.30001320", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz", + "integrity": "sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/caseless": { "version": "0.12.0", @@ -2393,24 +2736,30 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/ci-info": { @@ -2450,25 +2799,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -2503,12 +2833,6 @@ "color-support": "bin.js" } }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2563,26 +2887,32 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } }, "node_modules/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" }, "node_modules/core-util-is": { "version": "1.0.2", @@ -2590,9 +2920,9 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/coveralls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", - "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", "dev": true, "dependencies": { "js-yaml": "^3.13.1", @@ -2608,12 +2938,6 @@ "node": ">=6" } }, - "node_modules/coveralls/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2675,9 +2999,9 @@ } }, "node_modules/culture-ships": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/culture-ships/-/culture-ships-1.0.0.tgz", - "integrity": "sha512-RbXG1PRc4f/QDLnYh/DPw5q7eo8hiYaJF2/5aBrgg+EP9GfWBrX02NvWRBzXnte91l21hzs/j8A39NK9lsaxPg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/culture-ships/-/culture-ships-1.0.1.tgz", + "integrity": "sha512-awmnjQpfYTJj6hl/l0ICcBZdb4WBZ0waqdTTua2bSMtfaTFEi7iM82CwzLpXTCMM/XZC4NeO07UIgok08FvtHA==", "bin": { "culture-ships": "culture-ship.js" } @@ -2703,12 +3027,19 @@ } }, "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decamelize": { @@ -2742,9 +3073,9 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/default-require-extensions": { "version": "3.0.0", @@ -2765,13 +3096,14 @@ "dev": true }, "node_modules/degenerator": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", "dependencies": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", - "esprima": "^4.0.0" + "esprima": "^4.0.0", + "vm2": "^3.9.8" }, "engines": { "node": ">= 6" @@ -2786,19 +3118,19 @@ } }, "node_modules/denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", "engines": { "node": ">=0.10" } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/diff": { @@ -2847,11 +3179,11 @@ } }, "node_modules/dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/duplexer": { @@ -2885,9 +3217,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.715", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.715.tgz", - "integrity": "sha512-VCWxo9RqTYhcCsHtG+l0TEOS6H5QmO1JyVCQB9nv8fllmAzj1VcCYH3qBCXP75/En6FeoepefnogLPE+5W7OiQ==", + "version": "1.4.96", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.96.tgz", + "integrity": "sha512-DPNjvNGPabv6FcyjzLAN4C0psN/GgD9rSGvMTuv81SeXG/EX3mCz0wiw9N1tUEnfQXYCJi3H8M0oFPRziZh7rw==", "dev": true }, "node_modules/emoji-regex": { @@ -2917,10 +3249,13 @@ } }, "node_modules/error-callsites": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/error-callsites/-/error-callsites-2.0.3.tgz", - "integrity": "sha512-v036z4IEffZFE5kBkV5/F2MzhLnG0vuDyN+VXpzCf4yWXvX/1WJCI0A+TGTr8HWzBfCw5k8gr9rwAo09V+obTA==", - "dev": true + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-callsites/-/error-callsites-2.0.4.tgz", + "integrity": "sha512-V877Ch4FC4FN178fDK1fsrHN4I1YQIBdtjKrHh3BUHMnh3SMvwUVrqkaOgDpUuevgSNna0RBq6Ox9SGlxYrigA==", + "dev": true, + "engines": { + "node": ">=6.x" + } }, "node_modules/es6-error": { "version": "4.1.1", @@ -2929,9 +3264,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.11.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.11.9.tgz", - "integrity": "sha512-qP7w/oWjJBIh9x+H37DbpkMtmSnLm63VDyA06+vkJJEHlVR7QSDiPAaka7mtMQZHoBn87irUx5rDxbXMKaf8xw==", + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.11.23.tgz", + "integrity": "sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==", "dev": true, "hasInstallScript": true, "bin": { @@ -2956,58 +3291,120 @@ } }, "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">= 0.8.0" } }, "node_modules/eslint": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz", - "integrity": "sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", @@ -3016,7 +3413,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -3025,7 +3422,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -3055,9 +3452,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", - "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0" @@ -3089,45 +3486,39 @@ } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint/node_modules/ajv": { @@ -3146,19 +3537,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -3171,145 +3553,52 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", - "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/eslint/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">=4" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { "node": ">=10" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/eslint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/espree": { @@ -3360,9 +3649,9 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -3381,9 +3670,9 @@ } }, "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -3450,44 +3739,19 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-glob/node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -3502,14 +3766,14 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3539,7 +3803,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3548,9 +3811,9 @@ } }, "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { "commondir": "^1.0.1", @@ -3565,9 +3828,9 @@ } }, "node_modules/find-my-way": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.1.0.tgz", - "integrity": "sha512-UBD94MdO6cBi6E97XA0fBA9nwqw+xG5x1TYIPHats33gEi/kNqy7BWHAWx8QHCQQRSU5Txc0JiD8nzba39gvMQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.5.1.tgz", + "integrity": "sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==", "dependencies": { "fast-decode-uri-component": "^1.0.1", "fast-deep-equal": "^3.1.3", @@ -3579,16 +3842,19 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/findit": { @@ -3611,9 +3877,9 @@ } }, "node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "node_modules/foreground-child": { @@ -3639,22 +3905,22 @@ } }, "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" @@ -3731,11 +3997,6 @@ "node": ">=0.8.0" } }, - "node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, "node_modules/ftp/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -3769,16 +4030,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "node_modules/furi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/furi/-/furi-2.0.0.tgz", - "integrity": "sha512-uKuNsaU0WVaK/vmvj23wW1bicOFfyqSsAIH71bRZx8kA4Xj+YCHin7CJKJJjkIsmxYaPFLk9ljmjEyB7xF7WvQ==", - "dev": true, - "dependencies": { - "@types/is-windows": "^1.0.0", - "is-windows": "^1.0.2" - } - }, "node_modules/gaxios": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", @@ -3913,9 +4164,9 @@ } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3945,12 +4196,27 @@ } }, "node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "dependencies": { - "ini": "1.3.7" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" @@ -3959,26 +4225,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -3988,15 +4257,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -4020,16 +4280,16 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "node_modules/handy-redis": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/handy-redis/-/handy-redis-2.2.1.tgz", - "integrity": "sha512-Kmz9HhdAA9tGV1b1R6m3AJ8GcC+r/0uzyiTia39Q8tseJJc4kOwGGQr7cfPppD/xlO2ENE5IK+ToRahLuX1JVg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/handy-redis/-/handy-redis-2.3.1.tgz", + "integrity": "sha512-ilZYZ4l9+BSxavnjzSbI0yNpM8wfuEP8wAjsPAoL5ThfcCEswN7EpuSCJ4PfRpuGvxRRrivjSImbqpM9NkDB7w==", "dependencies": { - "@types/redis": "^2.8.27" + "@types/redis": "^2.8.30" }, "engines": { "node": ">= 10.0.0" @@ -4124,9 +4384,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -4159,59 +4419,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/honeycomb-beeline": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/honeycomb-beeline/-/honeycomb-beeline-2.6.0.tgz", - "integrity": "sha512-YSvZYs7fJj+YAemimqiRiyUzqnuz+MOm/x4vqc5pnSAgYg3sgKnMUgfsdHqHmpUfqYmOsp7oxsyotSNB227tAA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/honeycomb-beeline/-/honeycomb-beeline-2.8.1.tgz", + "integrity": "sha512-FCbxtK9uzr4JXVM4SmsJKVx2rnaUn6qIFP4TH8RMtu2cydv3qKMjSF+103/WpPJqk2FyXaNvB+4hanAHnxObFQ==", "dependencies": { - "@opentelemetry/core": "^0.12.0", + "@opentelemetry/api": "^1.0.2", + "@opentelemetry/core": "^0.24.0", + "@types/node": "^16.3.2", "array-flatten": "^3.0.0", "debug": "^4.2.0", "libhoney": "^2.2.1", "on-headers": "^1.0.2", "shimmer": "^1.2.1" - } - }, - "node_modules/honeycomb-beeline/node_modules/@opentelemetry/api": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", - "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", - "dependencies": { - "@opentelemetry/context-base": "^0.12.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 10.*" } }, "node_modules/honeycomb-beeline/node_modules/@opentelemetry/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", - "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", + "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", "dependencies": { - "@opentelemetry/api": "^0.12.0", - "@opentelemetry/context-base": "^0.12.0", + "@opentelemetry/semantic-conventions": "0.24.0", "semver": "^7.1.3" }, "engines": { "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" } }, - "node_modules/honeycomb-beeline/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, + "node_modules/honeycomb-beeline/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", + "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8.0.0" } }, + "node_modules/honeycomb-beeline/node_modules/@types/node": { + "version": "16.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz", + "integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4225,18 +4487,18 @@ "dev": true }, "node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-proxy-agent": { @@ -4291,9 +4553,9 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -4321,15 +4583,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -4390,10 +4643,13 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/ip": { "version": "1.1.5", @@ -4412,21 +4668,6 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -4460,18 +4701,17 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" @@ -4481,51 +4721,41 @@ } }, "node_modules/is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, "engines": { "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -4545,23 +4775,14 @@ } }, "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" - } - }, - "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true, - "engines": { - "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-typedarray": { @@ -4586,9 +4807,9 @@ "dev": true }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "node_modules/isexe": { "version": "2.0.0", @@ -4603,9 +4824,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" @@ -4690,9 +4911,9 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -4700,13 +4921,22 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4747,19 +4977,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -4793,9 +5010,9 @@ "dev": true }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { @@ -4816,13 +5033,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -4830,12 +5044,6 @@ "node": ">=6" } }, - "node_modules/json5/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -4874,18 +5082,18 @@ } }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/jwa": { @@ -4946,24 +5154,25 @@ } }, "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/libhoney": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/libhoney/-/libhoney-2.2.3.tgz", - "integrity": "sha512-TojbNL0k50tzjiuI7ker4sNox2jYhhGycyfSK3HrA9R7mFo4oaKmxYDli4Hg9uizJukmxJUVVfhOaB9JquuGkw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/libhoney/-/libhoney-2.3.3.tgz", + "integrity": "sha512-WfujgzJjIxN4ZwRwX7iO1LFvzB9x+M7MGEN+FsPrCjTti+cA3CMYR400ElqRO84/ZwEphjiJrO+yqvVceu4N6Q==", "dependencies": { - "superagent": "^3.8.3", - "superagent-proxy": "^2.0.0", + "superagent": "^6.1.0", + "superagent-proxy": "^3.0.0", "urljoin": "^0.1.5" }, "engines": { @@ -4971,9 +5180,9 @@ } }, "node_modules/libtap": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.1.3.tgz", - "integrity": "sha512-BfbhcSlcFngZWYvDt+gs4m1BkjP0LaFEg6+4FBAXD0E8Br95wpXCCvS5JZHW1a5QPWMrFD4LhsqBpTPRB3Em8g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.3.0.tgz", + "integrity": "sha512-yU5uSY987sVwpWiR5h84ZM96bxvmCQFZ/bOEJ1M7+Us8oez25fLmmLNGFRFGWi2PzuLqAzqzESH7HCaZ/b9IZA==", "dev": true, "dependencies": { "async-hook-domain": "^2.0.4", @@ -4985,11 +5194,10 @@ "own-or-env": "^1.0.2", "signal-exit": "^3.0.4", "stack-utils": "^2.0.4", - "tap-parser": "^10.0.1", + "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "tcompare": "^5.0.6", - "trivial-deferred": "^1.0.1", - "yapool": "^1.0.0" + "trivial-deferred": "^1.0.1" }, "engines": { "node": ">=10" @@ -5018,50 +5226,26 @@ "semver": "bin/semver" } }, - "node_modules/load-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -5189,69 +5373,28 @@ }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/micromatch/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/micromatch/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/micromatch/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "engines": { - "node": ">=0.12.0" + "node": ">= 0.6" } }, - "node_modules/micromatch/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "is-number": "^7.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8.0" + "node": ">=8.6" } }, "node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "bin": { "mime": "cli.js" }, @@ -5260,19 +5403,19 @@ } }, "node_modules/mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.42.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -5288,9 +5431,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -5300,9 +5443,9 @@ } }, "node_modules/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minipass": { "version": "3.1.6", @@ -5345,9 +5488,9 @@ "dev": true }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -5361,14 +5504,22 @@ } }, "node_modules/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-preload": { @@ -5384,28 +5535,28 @@ } }, "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "node_modules/nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "dev": true, "hasInstallScript": true, "dependencies": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "bin": { "nodemon": "bin/nodemon.js" @@ -5482,18 +5633,18 @@ } }, "node_modules/normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/npm": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.5.2.tgz", - "integrity": "sha512-fQRPOSrQfO3AG1JEOgScVrYhOfprZbhSKAjY4goESGPKMflWHxyQt8djo6EZhNjxCNIUAPtT75hkCN902SeYAw==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.5.5.tgz", + "integrity": "sha512-a1vl26nokCNlD+my/iNYmOUPx/hpYR4ZyZk8gb7/A2XXtrPZf2gTSJOnVjS77jQS+BSfIVQpipZwXWCL0+5wzg==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -5568,77 +5719,77 @@ "write-file-atomic" ], "dependencies": { - "@isaacs/string-locale-compare": "*", - "@npmcli/arborist": "*", - "@npmcli/ci-detect": "*", - "@npmcli/config": "*", - "@npmcli/map-workspaces": "*", - "@npmcli/package-json": "*", - "@npmcli/run-script": "*", - "abbrev": "*", - "ansicolors": "*", - "ansistyles": "*", - "archy": "*", - "cacache": "*", - "chalk": "*", - "chownr": "*", - "cli-columns": "*", - "cli-table3": "*", - "columnify": "*", - "fastest-levenshtein": "*", - "glob": "*", - "graceful-fs": "*", - "hosted-git-info": "*", - "ini": "*", - "init-package-json": "*", - "is-cidr": "*", - "json-parse-even-better-errors": "*", - "libnpmaccess": "*", - "libnpmdiff": "*", - "libnpmexec": "*", - "libnpmfund": "*", - "libnpmhook": "*", - "libnpmorg": "*", - "libnpmpack": "*", - "libnpmpublish": "*", - "libnpmsearch": "*", - "libnpmteam": "*", - "libnpmversion": "*", - "make-fetch-happen": "*", - "minipass": "*", - "minipass-pipeline": "*", - "mkdirp": "*", - "mkdirp-infer-owner": "*", - "ms": "*", - "node-gyp": "*", - "nopt": "*", - "npm-audit-report": "*", - "npm-install-checks": "*", - "npm-package-arg": "*", - "npm-pick-manifest": "*", - "npm-profile": "*", - "npm-registry-fetch": "*", - "npm-user-validate": "*", - "npmlog": "*", - "opener": "*", - "pacote": "*", - "parse-conflict-json": "*", - "proc-log": "*", - "qrcode-terminal": "*", - "read": "*", - "read-package-json": "*", - "read-package-json-fast": "*", - "readdir-scoped-modules": "*", - "rimraf": "*", - "semver": "*", - "ssri": "*", - "tar": "*", - "text-table": "*", - "tiny-relative-date": "*", - "treeverse": "*", - "validate-npm-package-name": "*", - "which": "*", - "write-file-atomic": "*" + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.0.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.0.1", + "@npmcli/map-workspaces": "^2.0.2", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^3.0.1", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "archy": "~1.0.0", + "cacache": "^16.0.2", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.1", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "glob": "^7.2.0", + "graceful-fs": "^4.2.9", + "hosted-git-info": "^5.0.0", + "ini": "^2.0.0", + "init-package-json": "^3.0.1", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.2", + "libnpmdiff": "^4.0.2", + "libnpmexec": "^4.0.2", + "libnpmfund": "^3.0.1", + "libnpmhook": "^8.0.2", + "libnpmorg": "^4.0.2", + "libnpmpack": "^4.0.2", + "libnpmpublish": "^6.0.2", + "libnpmsearch": "^5.0.2", + "libnpmteam": "^4.0.2", + "libnpmversion": "^3.0.1", + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.0.0", + "nopt": "^5.0.0", + "npm-audit-report": "^2.1.5", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-pick-manifest": "^7.0.0", + "npm-profile": "^6.0.2", + "npm-registry-fetch": "^13.0.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.1", + "opener": "^1.5.2", + "pacote": "^13.0.5", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "ssri": "^8.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^1.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" }, "bin": { "npm": "bin/npm-cli.js", @@ -5649,7 +5800,7 @@ } }, "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.2", + "version": "1.1.3", "inBundle": true, "license": "MIT" }, @@ -5659,21 +5810,21 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.0.0", + "version": "5.0.3", "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/installed-package-contents": "^1.0.7", "@npmcli/map-workspaces": "^2.0.0", - "@npmcli/metavuln-calculator": "^3.0.0", + "@npmcli/metavuln-calculator": "^3.0.1", "@npmcli/move-file": "^1.1.0", "@npmcli/name-from-folder": "^1.0.1", "@npmcli/node-gyp": "^1.0.3", "@npmcli/package-json": "^1.0.1", "@npmcli/run-script": "^3.0.0", "bin-links": "^3.0.0", - "cacache": "^15.0.3", + "cacache": "^16.0.0", "common-ancestor-path": "^1.0.1", "json-parse-even-better-errors": "^2.3.1", "json-stringify-nice": "^1.1.4", @@ -5685,7 +5836,7 @@ "npm-pick-manifest": "^7.0.0", "npm-registry-fetch": "^13.0.0", "npmlog": "^6.0.1", - "pacote": "^13.0.2", + "pacote": "^13.0.5", "parse-conflict-json": "^2.0.1", "proc-log": "^2.0.0", "promise-all-reject-late": "^1.0.0", @@ -5714,11 +5865,11 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.0.0", + "version": "4.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^2.0.0", + "@npmcli/map-workspaces": "^2.0.1", "ini": "^2.0.0", "mkdirp-infer-owner": "^2.0.0", "nopt": "^5.0.0", @@ -5773,14 +5924,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/npm/node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.3.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", "inBundle": true, @@ -5797,27 +5940,46 @@ } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.0", + "version": "2.0.2", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" + "glob": "^7.2.0", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16" } }, + "node_modules/npm/node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.0.0", + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "cacache": "^15.3.0", + "cacache": "^16.0.0", "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.1", + "pacote": "^13.0.3", "semver": "^7.3.5" }, "engines": { @@ -5863,13 +6025,13 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "3.0.0", + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^1.0.3", "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^8.4.1", + "node-gyp": "^9.0.0", "read-package-json-fast": "^2.0.3" }, "engines": { @@ -5901,7 +6063,7 @@ } }, "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.0", + "version": "4.2.1", "inBundle": true, "license": "MIT", "dependencies": { @@ -5925,6 +6087,14 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/npm/node_modules/ansi-styles": { "version": "4.3.0", "inBundle": true, @@ -6020,31 +6190,31 @@ "license": "MIT" }, "node_modules/npm/node_modules/cacache": { - "version": "15.3.0", + "version": "16.0.2", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/move-file": "^1.1.2", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^7.2.0", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.0.2", + "tar": "^6.1.11", "unique-filename": "^1.1.1" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/chalk": { @@ -6101,25 +6271,6 @@ "node": ">= 10" } }, - "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.1", "inBundle": true, @@ -6198,25 +6349,6 @@ "node": ">=8.0.0" } }, - "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", "inBundle": true, @@ -6353,43 +6485,23 @@ "license": "MIT" }, "node_modules/npm/node_modules/gauge": { - "version": "4.0.1", + "version": "4.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "ansi-regex": "^5.0.1", "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", - "signal-exit": "^3.0.0", + "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "wide-align": "^1.1.5" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/glob": { "version": "7.2.0", "inBundle": true, @@ -6439,14 +6551,14 @@ "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "4.1.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/http-cache-semantics": { @@ -6554,14 +6666,14 @@ } }, "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.0", + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { "npm-package-arg": "^9.0.0", "promzard": "^0.3.0", "read": "^1.0.7", - "read-package-json": "^4.1.1", + "read-package-json": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" @@ -6618,11 +6730,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/is-typedarray": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", "inBundle": true, @@ -6660,13 +6767,13 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.0", + "version": "6.0.2", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", "minipass": "^3.1.1", - "npm-package-arg": "^9.0.0", + "npm-package-arg": "^9.0.1", "npm-registry-fetch": "^13.0.0" }, "engines": { @@ -6674,7 +6781,7 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.0", + "version": "4.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6683,8 +6790,8 @@ "binary-extensions": "^2.2.0", "diff": "^5.0.0", "minimatch": "^3.0.4", - "npm-package-arg": "^9.0.0", - "pacote": "^13.0.2", + "npm-package-arg": "^9.0.1", + "pacote": "^13.0.5", "tar": "^6.1.0" }, "engines": { @@ -6692,7 +6799,7 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.0", + "version": "4.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6701,9 +6808,9 @@ "@npmcli/run-script": "^3.0.0", "chalk": "^4.1.0", "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.0", + "npm-package-arg": "^9.0.1", "npmlog": "^6.0.1", - "pacote": "^13.0.2", + "pacote": "^13.0.5", "proc-log": "^2.0.0", "read": "^1.0.7", "read-package-json-fast": "^2.0.2", @@ -6714,7 +6821,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.0", + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -6725,7 +6832,7 @@ } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.0", + "version": "8.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6737,7 +6844,7 @@ } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.0", + "version": "4.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6749,25 +6856,25 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "4.0.0", + "version": "4.0.2", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/run-script": "^3.0.0", - "npm-package-arg": "^9.0.0", - "pacote": "^13.0.2" + "npm-package-arg": "^9.0.1", + "pacote": "^13.0.5" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.0", + "version": "6.0.2", "inBundle": true, "license": "ISC", "dependencies": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^9.0.0", + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", "npm-registry-fetch": "^13.0.0", "semver": "^7.1.3", "ssri": "^8.0.1" @@ -6777,7 +6884,7 @@ } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.0", + "version": "5.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6788,7 +6895,7 @@ } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.0", + "version": "4.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6800,7 +6907,7 @@ } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.0", + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -6816,31 +6923,28 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "6.0.0", + "version": "7.5.1", "inBundle": true, "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.0.3", + "version": "10.0.6", "inBundle": true, "license": "ISC", "dependencies": { - "agentkeepalive": "^4.2.0", - "cacache": "^15.3.0", + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.3.1", + "lru-cache": "^7.5.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.4.1", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", @@ -6852,16 +6956,8 @@ "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/npm/node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.3.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/npm/node_modules/minimatch": { - "version": "3.0.4", + "version": "3.1.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6894,19 +6990,19 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "1.4.1", + "version": "2.0.3", "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^3.1.0", + "minipass": "^3.1.6", "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "minizlib": "^2.1.2" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16" }, "optionalDependencies": { - "encoding": "^0.1.12" + "encoding": "^0.1.13" } }, "node_modules/npm/node_modules/minipass-flush": { @@ -7006,73 +7102,26 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "8.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/@tootallnate/once": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/http-proxy-agent": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "9.1.0", + "version": "9.0.0", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 10" + "node": "^12.22 || ^14.13 || >=16" } }, "node_modules/npm/node_modules/nopt": { @@ -7090,17 +7139,17 @@ } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "3.0.3", + "version": "4.0.0", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/npm-audit-report": { @@ -7139,11 +7188,11 @@ "license": "ISC" }, "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.0.0", + "version": "9.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^4.1.0", + "hosted-git-info": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^3.0.0" }, @@ -7152,20 +7201,20 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "3.0.0", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "glob": "^7.1.6", + "glob": "^7.2.0", "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.1", + "npm-bundled": "^1.1.2", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "npm-packlist": "bin/index.js" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/npm-pick-manifest": { @@ -7195,13 +7244,13 @@ } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.0.0", + "version": "13.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "make-fetch-happen": "^10.0.2", + "make-fetch-happen": "^10.0.3", "minipass": "^3.1.6", - "minipass-fetch": "^1.4.1", + "minipass-fetch": "^2.0.1", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^9.0.0", @@ -7261,27 +7310,27 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "13.0.3", + "version": "13.0.5", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^3.0.0", "@npmcli/installed-package-contents": "^1.0.7", "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^3.0.0", - "cacache": "^15.3.0", + "@npmcli/run-script": "^3.0.1", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", "minipass": "^3.1.6", "mkdirp": "^1.0.4", "npm-package-arg": "^9.0.0", - "npm-packlist": "^3.0.0", + "npm-packlist": "^4.0.0", "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", + "npm-registry-fetch": "^13.0.1", "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^4.1.1", + "read-package-json": "^5.0.0", "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", "ssri": "^8.0.1", @@ -7388,17 +7437,17 @@ "license": "ISC" }, "node_modules/npm/node_modules/read-package-json": { - "version": "4.1.1", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" + "glob": "^7.2.0", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/read-package-json-fast": { @@ -7498,13 +7547,24 @@ "node": ">=10" } }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm/node_modules/set-blocking": { "version": "2.0.0", "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.6", + "version": "3.0.7", "inBundle": true, "license": "ISC" }, @@ -7518,12 +7578,12 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.6.1", + "version": "2.6.2", "inBundle": true, "license": "MIT", "dependencies": { "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.13.0", @@ -7603,15 +7663,12 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/npm/node_modules/stringify-package": { + "version": "1.0.1", "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { + "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", "inBundle": true, "license": "MIT", @@ -7622,11 +7679,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/stringify-package": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/supports-color": { "version": "7.2.0", "inBundle": true, @@ -7669,25 +7721,6 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/typedarray-to-buffer": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/unique-filename": { "version": "1.1.1", "inBundle": true, @@ -7767,14 +7800,12 @@ "license": "ISC" }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.0", + "version": "4.0.1", "inBundle": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^4.0.0" + "signal-exit": "^3.0.7" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16" @@ -7850,6 +7881,133 @@ "node": ">=8.9" } }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -7865,9 +8023,9 @@ } }, "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7907,16 +8065,17 @@ } }, "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "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.3" }, "engines": { "node": ">= 0.8.0" @@ -7947,30 +8106,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -7995,9 +8157,9 @@ } }, "node_modules/pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -8005,25 +8167,25 @@ "get-uri": "3", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", + "pac-resolver": "^5.0.0", "raw-body": "^2.2.0", "socks-proxy-agent": "5" }, "engines": { - "node": ">= 6" + "node": ">= 8" } }, "node_modules/pac-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz", - "integrity": "sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", + "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", "dependencies": { - "degenerator": "^2.2.0", + "degenerator": "^3.0.1", "ip": "^1.1.5", "netmask": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">= 8" } }, "node_modules/package-hash": { @@ -8130,14 +8292,14 @@ "dev": true }, "node_modules/pg": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz", - "integrity": "sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==", + "version": "8.7.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz", + "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "^2.5.0", - "pg-pool": "^3.3.0", + "pg-pool": "^3.5.1", "pg-protocol": "^1.5.0", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -8168,17 +8330,17 @@ } }, "node_modules/pg-pool": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz", - "integrity": "sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz", + "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -8195,25 +8357,29 @@ "node": ">=4" } }, - "node_modules/pg/node_modules/pg-protocol": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", - "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" - }, "node_modules/pgpass": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", - "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "dependencies": { - "split2": "^3.1.1" + "split2": "^4.1.0" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", - "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pkg-dir": { @@ -8228,6 +8394,58 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -8264,9 +8482,10 @@ } }, "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -8281,15 +8500,18 @@ } }, "node_modules/prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz", + "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -8304,11 +8526,6 @@ "node": ">=6.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -8356,21 +8573,21 @@ } }, "node_modules/proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", - "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dependencies": { "agent-base": "^6.0.0", "debug": "4", "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", + "pac-proxy-agent": "^5.0.0", "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">= 8" } }, "node_modules/proxy-agent/node_modules/lru-cache": { @@ -8440,9 +8657,9 @@ } }, "node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dependencies": { "side-channel": "^1.0.4" }, @@ -8482,12 +8699,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.3", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -8510,6 +8727,12 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -8520,23 +8743,22 @@ } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, "dependencies": { "picomatch": "^2.2.1" @@ -8545,22 +8767,10 @@ "node": ">=8.10.0" } }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "devOptional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/redis": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.0.tgz", - "integrity": "sha512-//lAOcEtNIKk2ekZibes5oyWKYUVWMvMB71lyD/hS9KRePNkB7AU3nXGkArX6uDKEb2N23EyJBthAv6pagD0uw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", "dependencies": { "denque": "^1.5.0", "redis-commands": "^1.7.0", @@ -8600,9 +8810,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" @@ -8694,9 +8904,9 @@ } }, "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -8745,11 +8955,11 @@ "dev": true }, "node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dependencies": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -8761,12 +8971,12 @@ } }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/responselike": { @@ -8840,9 +9050,23 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safe-regex2": { "version": "2.0.0", @@ -8904,9 +9128,9 @@ "dev": true }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -8948,9 +9172,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/slash": { @@ -8979,31 +9203,22 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.0.tgz", - "integrity": "sha512-mNmr9owlinMplev0Wd7UHFlqI4ofnBnNzFuzrm63PPaHgbkqCFe4T5LzwKmtQ/f2tX0NTpcdVLyD/FHxFBstYw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "dependencies": { "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.13.0", @@ -9011,11 +9226,11 @@ } }, "node_modules/socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dependencies": { - "agent-base": "6", + "agent-base": "^6.0.2", "debug": "4", "socks": "^2.3.3" }, @@ -9024,24 +9239,33 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -9072,24 +9296,11 @@ } }, "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", "engines": { - "node": ">= 6" + "node": ">= 10.x" } }, "node_modules/sprintf-js": { @@ -9099,9 +9310,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -9135,6 +9346,15 @@ "node": ">=10" } }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/stackman": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/stackman/-/stackman-4.0.1.tgz", @@ -9149,11 +9369,11 @@ } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/stream-combiner": { @@ -9167,63 +9387,35 @@ } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/strip-bom": { @@ -9248,71 +9440,46 @@ } }, "node_modules/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/superagent-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-2.1.0.tgz", - "integrity": "sha512-DnarpKN6Xn8e3pYlFV4Yvsj9yxLY4q5FIsUe5JvN7vjzP+YCfzXv03dTkZSD2yzrSadsNYHf0IgOUJwKjX457A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dependencies": { - "debug": "^3.1.0", - "proxy-agent": "^4.0.0" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "engines": { - "node": ">=6" - }, - "peerDependencies": { - "superagent": ">= 0.15.4 || 1 || 2 || 3" - } - }, - "node_modules/superagent-proxy/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node": ">= 7.0.0" } }, - "node_modules/superagent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "peerDependencies": { + "superagent": ">= 0.15.4 || 1 || 2 || 3" } }, "node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -9345,95 +9512,25 @@ } }, "node_modules/table": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", - "integrity": "sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dev": true, "dependencies": { "ajv": "^8.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz", - "integrity": "sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tap": { - "version": "15.1.5", - "resolved": "https://registry.npmjs.org/tap/-/tap-15.1.5.tgz", - "integrity": "sha512-ha9ify0cagIOENV5D+T8ys+FFOWqPaWAKk66hjtUWjywXdGmnL8LRxloZa8sHiaB+Az1GYx4ufEaflOpedSCbQ==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/tap/-/tap-15.2.3.tgz", + "integrity": "sha512-EVbovHd/SdevGMUnkNU5JJqC1YC0hzaaZ2jnqs0fKHv9Oudx27qW3Xwox7A6TB92wvR0mqgQPr+Au2w56kD+aQ==", "bundleDependencies": [ "ink", "treport", @@ -9455,7 +9552,7 @@ "isexe": "^2.0.0", "istanbul-lib-processinfo": "^2.0.2", "jackspeak": "^1.4.1", - "libtap": "^1.1.3", + "libtap": "^1.3.0", "minipass": "^3.1.1", "mkdirp": "^1.0.4", "nyc": "^15.1.0", @@ -9464,10 +9561,10 @@ "rimraf": "^3.0.0", "signal-exit": "^3.0.6", "source-map-support": "^0.5.16", - "tap-mocha-reporter": "^5.0.0", - "tap-parser": "^10.0.1", + "tap-mocha-reporter": "^5.0.3", + "tap-parser": "^11.0.1", "tap-yaml": "^1.0.0", - "tcompare": "^5.0.6", + "tcompare": "^5.0.7", "treport": "*", "which": "^2.0.2" }, @@ -9498,9 +9595,9 @@ } }, "node_modules/tap-mocha-reporter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.1.tgz", - "integrity": "sha512-1knFWOwd4khx/7uSEnUeaP9IPW3w+sqTgJMhrwah6t46nZ8P25atOKAjSvVDsT67lOPu0nfdOqUwoyKn+3E5pA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz", + "integrity": "sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==", "dev": true, "dependencies": { "color-support": "^1.1.0", @@ -9508,7 +9605,7 @@ "diff": "^4.0.1", "escape-string-regexp": "^2.0.0", "glob": "^7.0.5", - "tap-parser": "^10.0.0", + "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "unicode-length": "^2.0.2" }, @@ -9519,14 +9616,23 @@ "node": ">= 8" } }, + "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/tap-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz", - "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.1.tgz", + "integrity": "sha512-5ow0oyFOnXVSALYdidMX94u0GEjIlgc/BPFYLx0yRh9hb8+cFGNJqJzDJlUqbLOwx8+NBrIbxCWkIQi7555c0w==", "dev": true, "dependencies": { "events-to-array": "^1.0.1", - "minipass": "^3.0.0", + "minipass": "^3.1.6", "tap-yaml": "^1.0.0" }, "bin": { @@ -10737,7 +10843,7 @@ "license": "MIT" }, "node_modules/tap/node_modules/minipass": { - "version": "3.1.5", + "version": "3.1.6", "dev": true, "inBundle": true, "license": "ISC", @@ -11122,13 +11228,13 @@ } }, "node_modules/tap/node_modules/tap-parser": { - "version": "10.1.0", + "version": "11.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "events-to-array": "^1.0.1", - "minipass": "^3.0.0", + "minipass": "^3.1.6", "tap-yaml": "^1.0.0" }, "bin": { @@ -11157,7 +11263,7 @@ } }, "node_modules/tap/node_modules/treport": { - "version": "3.0.2", + "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -11167,7 +11273,7 @@ "chalk": "^3.0.0", "ink": "^3.2.0", "ms": "^2.1.2", - "tap-parser": "^10.0.1", + "tap-parser": "^11.0.0", "unicode-length": "^2.0.2" }, "peerDependencies": { @@ -11409,18 +11515,6 @@ "node": ">=10" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -11457,12 +11551,6 @@ "xtend": "~3.0.0" } }, - "node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "node_modules/through2/node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -11512,7 +11600,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, "dependencies": { "is-number": "^7.0.0" }, @@ -11521,9 +11608,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -11591,10 +11678,9 @@ } }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -11619,6 +11705,12 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -11638,23 +11730,27 @@ "dev": true }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typedarray-to-buffer": { @@ -11667,9 +11763,9 @@ } }, "node_modules/typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -11691,27 +11787,9 @@ } }, "node_modules/undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "dependencies": { - "debug": "^2.2.0" - } - }, - "node_modules/undefsafe/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/undefsafe/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, "node_modules/unicode-length": { @@ -11774,32 +11852,49 @@ } }, "node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dev": true, "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -11853,9 +11948,9 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", - "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -11863,7 +11958,7 @@ "source-map": "^0.7.3" }, "engines": { - "node": ">=10.10.0" + "node": ">=10.12.0" } }, "node_modules/v8-to-istanbul/node_modules/source-map": { @@ -11889,6 +11984,32 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vm2": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/vm2/node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -11960,25 +12081,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -12023,110 +12125,50 @@ } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yapool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", - "dev": true - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/yargs/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/yn": { @@ -12152,86 +12194,90 @@ } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.10.4" } }, "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, "@babel/core": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", - "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.15", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.14", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, "requires": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, "dependencies": { @@ -12243,129 +12289,117 @@ } } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/types": "^7.16.7" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -12429,46 +12463,75 @@ } }, "@babel/parser": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", - "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + } } }, "@babel/traverse": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", - "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.15", - "@babel/types": "^7.13.14", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -12488,15 +12551,15 @@ } }, "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", @@ -12516,14 +12579,11 @@ "uri-js": "^4.2.2" } }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -12534,9 +12594,9 @@ } }, "@grpc/grpc-js": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", - "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.10.tgz", + "integrity": "sha512-++oAubX/7rJzlqH0ShyzDENNNDHYrlttdc3NM40KlaVQDcgGqQknuPoavmyTC+oNUDyxPCX5dHceKhfcgN3tiw==", "requires": { "@grpc/proto-loader": "^0.6.4", "@types/node": ">=12.12.47" @@ -12552,32 +12612,6 @@ "long": "^4.0.0", "protobufjs": "^6.10.0", "yargs": "^16.2.0" - }, - "dependencies": { - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - } } }, "@hapi/b64": { @@ -12589,9 +12623,9 @@ } }, "@hapi/boom": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.2.tgz", - "integrity": "sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q==", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", "requires": { "@hapi/hoek": "9.x.x" } @@ -12610,9 +12644,9 @@ } }, "@hapi/hoek": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz", - "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" }, "@hapi/iron": { "version": "6.0.0", @@ -12637,9 +12671,9 @@ } }, "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0" @@ -12655,6 +12689,23 @@ "@hapi/topo": "^5.0.0" } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -12666,6 +12717,51 @@ "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@istanbuljs/schema": { @@ -12674,54 +12770,76 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "@opentelemetry/api": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", - "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz", + "integrity": "sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ==" + }, + "@opentelemetry/api-metrics": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", + "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" }, "@opentelemetry/context-async-hooks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", - "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.1.1.tgz", + "integrity": "sha512-17wlKOwcWzo1Eo2T1OJqWTnrUZ6vTdmHs9XhcqChvyx6N8DRIP096qQxfebk/zDzVgvjryv+K2pYjONPH404hQ==", "requires": {} }, - "@opentelemetry/context-base": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.12.0.tgz", - "integrity": "sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA==" - }, "@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.1.1.tgz", + "integrity": "sha512-rNYVBLzO+gXeYmNVcm4NfKw9x+nTy08Qp8SMpkmM5cqfdEwEtKw83vpSrFKzafy2aOIpmUkKGpi2k/m5kiDP9w==", "requires": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/semantic-conventions": "1.1.1" } }, "@opentelemetry/exporter-trace-otlp-grpc": { @@ -12735,6 +12853,40 @@ "@opentelemetry/exporter-trace-otlp-http": "0.27.0", "@opentelemetry/resources": "1.0.1", "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + } } }, "@opentelemetry/exporter-trace-otlp-http": { @@ -12745,6 +12897,40 @@ "@opentelemetry/core": "1.0.1", "@opentelemetry/resources": "1.0.1", "@opentelemetry/sdk-trace-base": "1.0.1" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + } } }, "@opentelemetry/exporter-trace-otlp-proto": { @@ -12758,6 +12944,40 @@ "@opentelemetry/resources": "1.0.1", "@opentelemetry/sdk-trace-base": "1.0.1", "protobufjs": "^6.9.0" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + } } }, "@opentelemetry/instrumentation": { @@ -12769,19 +12989,12 @@ "require-in-the-middle": "^5.0.3", "semver": "^7.3.2", "shimmer": "^1.2.1" - }, - "dependencies": { - "@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" - } } }, "@opentelemetry/instrumentation-dns": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.0.tgz", - "integrity": "sha512-0UxCW+zdnD2cqduwpym4boNWsdRI3pRLt7e80FPxCmuGZ8X45UoJoYvd1Isb0/hWZCQ/+vzXYnVuo4LvE743pg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.27.1.tgz", + "integrity": "sha512-NwLMHthT7/YncTZcfYbb24n8z/mFYSWPlZkWOhG6XVRAE0KsDLlMsrwvha5Yg/4vhv4nj2qLM9bk5+zA5a/ZfA==", "requires": { "@opentelemetry/instrumentation": "^0.27.0", "@opentelemetry/semantic-conventions": "^1.0.0", @@ -12797,6 +13010,21 @@ "@opentelemetry/instrumentation": "0.27.0", "@opentelemetry/semantic-conventions": "1.0.1", "semver": "^7.3.5" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + } } }, "@opentelemetry/instrumentation-pg": { @@ -12833,25 +13061,25 @@ } }, "@opentelemetry/propagator-b3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", - "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.1.1.tgz", + "integrity": "sha512-FzrImysl3cVrPUm9mTTCN4Z/A6lYEyuKe6cE/SV9Avek6EKY8Ibgxqsg76T0KN27gm/i3YEbd/NL/+HZit0Wgw==", "requires": { - "@opentelemetry/core": "1.0.1" + "@opentelemetry/core": "1.1.1" } }, "@opentelemetry/propagator-jaeger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", - "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.1.1.tgz", + "integrity": "sha512-l1uuJN4phlsZgqGJLEJRo+QDnXizIwV9oC1N2+8KWpA+cKbAG0Wa4+JGjgio8vnF0kccJDQ02CG7cBbkcleBgA==", "requires": { - "@opentelemetry/core": "1.0.1" + "@opentelemetry/core": "1.1.1" } }, "@opentelemetry/resource-detector-aws": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.2.tgz", - "integrity": "sha512-a/Bc2W6ey+p0My0IQPZbRbpzU4mehWZmovkSXpFRQPuyadct3cHWgmB5wDrSiJ0yqfhKt1GQVpF8A8N/oRURUw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.0.3.tgz", + "integrity": "sha512-0bhy8L1JZfqGqMjaPu1tV3rBsmtN42+wycJYhxMBbaB4E0ZDshDLnBHn3AeLMPLtFUqiyyn48JluuBfD7KPkhA==", "requires": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.0.0", @@ -12859,9 +13087,9 @@ } }, "@opentelemetry/resource-detector-gcp": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.1.tgz", - "integrity": "sha512-7I4UPhfhssFQ/r+TE8uhO1pQ0bGO8zQHKUi7zhoh4dCWy9ralk+8x26qiZe21nrmTVL9F/h0+g6AUEifZPBicg==", + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.26.2.tgz", + "integrity": "sha512-CuFqdUGfQtVJ6paaasUaUN6dHxbu0CpUFnHws4Vj/K5SDUxR4l3/Vy5SvMiQ21mRCkeDDDbnw8cPEoA/xGKTrg==", "requires": { "@opentelemetry/resources": "^1.0.0", "@opentelemetry/semantic-conventions": "^1.0.0", @@ -12870,12 +13098,47 @@ } }, "@opentelemetry/resources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", - "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.1.1.tgz", + "integrity": "sha512-w0X65ufTaRevIumjylWzYhRquRNoM5T6e0ARNcE0o2YkYPkAxTr3PYkcXG8hUdWRAglqliZKG4IlMv03Q0wOXA==", + "requires": { + "@opentelemetry/core": "1.1.1", + "@opentelemetry/semantic-conventions": "1.1.1" + } + }, + "@opentelemetry/sdk-metrics-base": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", + "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", "requires": { + "@opentelemetry/api-metrics": "0.27.0", "@opentelemetry/core": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/resources": "1.0.1", + "lodash.merge": "^4.6.2" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + } } }, "@opentelemetry/sdk-node": { @@ -12894,51 +13157,102 @@ "@opentelemetry/sdk-trace-node": "~1.0.0" }, "dependencies": { - "@opentelemetry/api-metrics": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.27.0.tgz", - "integrity": "sha512-tB79288bwjkdhPNpw4UdOEy3bacVwtol6Que7cAu8KEJ9ULjRfSiwpYEwJY/oER3xZ7zNFz0uiJ7N1jSiotpVA==" + "@opentelemetry/context-async-hooks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", + "requires": {} + }, + "@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "requires": { + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/propagator-b3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.1.tgz", + "integrity": "sha512-UQQiOpR/WXyoqIRQEkn6RuXtGfpjhBDMq/1HrVxRCRPMVn7f4e+zxZWoQSsCOvSGQTu9S+W8eAutm00sRJN7fg==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/propagator-jaeger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.1.tgz", + "integrity": "sha512-bzvXksBn3j0GyiFXQbx87CUSGC1UDyp4hjL+CCOrQfzIEdp6usKCLHv40Ib5WU6739hPMkyr59CPfKwzlviTtA==", + "requires": { + "@opentelemetry/core": "1.0.1" + } + }, + "@opentelemetry/resources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "requires": { + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" + } }, - "@opentelemetry/sdk-metrics-base": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.27.0.tgz", - "integrity": "sha512-HpiWI4sVNsjp3FGyUlc24KvUY2Whl4PQVwcbA/gWv2kHaLQrDJrWC+3rjUR+87Mrd0nsiqJ85xhGFU6IK8h7gg==", + "@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", "requires": { - "@opentelemetry/api-metrics": "0.27.0", "@opentelemetry/core": "1.0.1", "@opentelemetry/resources": "1.0.1", - "lodash.merge": "^4.6.2" + "@opentelemetry/semantic-conventions": "1.0.1" + } + }, + "@opentelemetry/sdk-trace-node": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", + "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", + "requires": { + "@opentelemetry/context-async-hooks": "1.0.1", + "@opentelemetry/core": "1.0.1", + "@opentelemetry/propagator-b3": "1.0.1", + "@opentelemetry/propagator-jaeger": "1.0.1", + "@opentelemetry/sdk-trace-base": "1.0.1", + "semver": "^7.3.5" } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" } } }, "@opentelemetry/sdk-trace-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", - "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.1.1.tgz", + "integrity": "sha512-nj5kFly/d6V2UXZNi3jCaRBw44/7Z91xH0PcemXJTO3B6gyMx8zIHXdnECxrTVR1pglDWYCGs84uXPavu5SULw==", "requires": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/core": "1.1.1", + "@opentelemetry/resources": "1.1.1", + "@opentelemetry/semantic-conventions": "1.1.1" } }, "@opentelemetry/sdk-trace-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.1.tgz", - "integrity": "sha512-0ifT2pEI5aXy14zDDUQkl3ODzY6jjaC1plbxyAuz5BdPxGJzav9vzIJ2BhEwfXDn1LKqpQ5D1Yy+XnNRQpOo3w==", - "requires": { - "@opentelemetry/context-async-hooks": "1.0.1", - "@opentelemetry/core": "1.0.1", - "@opentelemetry/propagator-b3": "1.0.1", - "@opentelemetry/propagator-jaeger": "1.0.1", - "@opentelemetry/sdk-trace-base": "1.0.1", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.1.1.tgz", + "integrity": "sha512-wb/BONBrBs/EDN24AqB1KAAygVUiD8WdufaprLdv1LGTNat2ETCVVX+jKoi3K8W6y1KVLeEM5GjBV3Ww0E40nA==", + "requires": { + "@opentelemetry/context-async-hooks": "1.1.1", + "@opentelemetry/core": "1.1.1", + "@opentelemetry/propagator-b3": "1.1.1", + "@opentelemetry/propagator-jaeger": "1.1.1", + "@opentelemetry/sdk-trace-base": "1.1.1", "semver": "^7.3.5" } }, "@opentelemetry/semantic-conventions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", - "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.1.1.tgz", + "integrity": "sha512-GdTwDHSaZ6iP5LUdvS/SLUjn3067xn1HcBsLZCh8YOsf22d/YWTBcnFl3buieBP4KiajwHLho4I8HSMDKACBSg==" }, "@protobufjs/aspromise": { "version": "1.1.2", @@ -13015,9 +13329,9 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, "@tsconfig/node14": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", - "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", "dev": true }, "@types/accepts": { @@ -13038,15 +13352,10 @@ "ajv": "*" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, "@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "@types/csrf": { @@ -13068,36 +13377,30 @@ } }, "@types/hapi__shot": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.1.tgz", - "integrity": "sha512-44Jj7jJAFgNVgfdbyVtBUbEIbYqWRKAbLR4kiQxBbVEdf8ZKfa5Hg1qg4QdzXBgjw0mopewU4wx1/eWRTVelNQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.2.tgz", + "integrity": "sha512-8wWgLVP1TeGqgzZtCdt+F+k15DWQvLG1Yv6ZzPfb3D5WIo5/S+GGKtJBVo2uNEcqabP5Ifc71QnJTDnTmw1axA==", "dev": true, "requires": { "@types/node": "*" } }, - "@types/is-windows": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", - "integrity": "sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg==", - "dev": true - }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-rNAPdomlIUX0i0cg2+I+Q1wOUr531zHBQ+cV/28PJ39bSPKjahatZZ2LMuhiguETkCgLVzfruw/ZvNMNkKoSzw==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", + "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", "dev": true, "requires": { "@types/node": "*" @@ -13115,14 +13418,14 @@ "dev": true }, "@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" }, "@types/nunjucks": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.1.4.tgz", - "integrity": "sha512-cR65PLlHKW/qxxj840dbNb3ICO+iAVQzaNKJ8TcKOVKFi+QcAkhw9SCY8VFAyU41SmJMs+2nrIN2JGhX+jYb7A==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.1.tgz", + "integrity": "sha512-hUh5HIC7peH+0MvlYU5KM2RydWxG1mBceivHsQGwlelU9zlczLICyJmjMwgjkI3m0+N50n46GVHkw35lIim6LQ==", "dev": true }, "@types/oauth": { @@ -13170,153 +13473,113 @@ } }, "@types/tap": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.0.tgz", - "integrity": "sha512-AAsxWamgPOFWAQoSVOkQgGpi/wdk28Bmof7/KWI8T97mnDsjwHFrwclLBNGhaeXYhQABQZ1e2ovPIS7OAuM4vQ==", + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.6.tgz", + "integrity": "sha512-ScXtRg7oSra4sBmq534voWPNUrbwt8q9kABA6SsEXx1qXnaxf/mf0BzfRPHW4xem7I0PlzrmWIIXP/iDNeoCvw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz", - "integrity": "sha512-FPUyCPKZbVGexmbCFI3EQHzCZdy2/5f+jv6k2EDljGdXSRc0cKvbndd2nHZkSLqCNOPk0jB6lGzwIkglXcYVsQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.21.0", - "@typescript-eslint/scope-manager": "4.21.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" } }, - "@typescript-eslint/experimental-utils": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.21.0.tgz", - "integrity": "sha512-cEbgosW/tUFvKmkg3cU7LBoZhvUs+ZPVM9alb25XvR0dal4qHL3SiUqHNrzoWSxaXA9gsifrYrS1xdDV6w/gIA==", + "@typescript-eslint/parser": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "debug": "^4.3.2" } }, - "@typescript-eslint/parser": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.21.0.tgz", - "integrity": "sha512-eyNf7QmE5O/l1smaQgN0Lj2M/1jOuNg2NrBm1dqqQN0sVngTLyw8tdCbih96ixlhbF1oINoN8fDCyEH9SjLeIA==", + "@typescript-eslint/scope-manager": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "debug": "^4.1.1" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" } }, - "@typescript-eslint/scope-manager": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.21.0.tgz", - "integrity": "sha512-kfOjF0w1Ix7+a5T1knOw00f7uAP9Gx44+OEsNQi0PvvTPLYeXJlsCJ4tYnDj5PQEYfpcgOH5yBlw7K+UEI9Agw==", + "@typescript-eslint/type-utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0" + "@typescript-eslint/utils": "5.17.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.21.0.tgz", - "integrity": "sha512-+OQaupjGVVc8iXbt6M1oZMwyKQNehAfLYJJ3SdvnofK2qcjfor9pEM62rVjBknhowTkh+2HF+/KdRAc/wGBN2w==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.21.0.tgz", - "integrity": "sha512-ZD3M7yLaVGVYLw4nkkoGKumb7Rog7QID9YOWobFDMQKNl+vPxqVIW/uDk+MDeGc+OHcoG2nJ2HphwiPNajKw3w==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.21.0.tgz", - "integrity": "sha512-dH22dROWGi5Z6p+Igc8bLVLmwy7vEe8r+8c+raPQU0LxgogPUrRAtRGtvBWmlr9waTu3n+QLt/qrS/hWzk1x5w==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.21.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.17.0", + "eslint-visitor-keys": "^3.0.0" } }, "a-sync-waterfall": { @@ -13339,12 +13602,12 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -13354,12 +13617,17 @@ "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, "after-all-results": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/after-all-results/-/after-all-results-2.0.0.tgz", @@ -13385,9 +13653,9 @@ } }, "ajv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", - "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -13396,47 +13664,28 @@ } }, "ajv-formats": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", - "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "requires": { "ajv": "^8.0.0" } }, "ajv-keywords": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.0.0.tgz", - "integrity": "sha512-ULd1QMjRoH6JDNUQIfDLrlE+OgZlFaxyYCjzt58uNuUQtKXt8/U+vK/8Ql0gyn/C5mqZzUWtKMqr/4YquvTrWA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "requires": { "fast-deep-equal": "^3.1.3" } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-colors": { @@ -13452,28 +13701,18 @@ "dev": true, "requires": { "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } } }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", - "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -13539,9 +13778,9 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -13559,13 +13798,6 @@ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "requires": { "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } } }, "astral-regex": { @@ -13625,9 +13857,9 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "bcrypt-pbkdf": { @@ -13717,19 +13949,43 @@ } }, "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } } }, "brace-expansion": { @@ -13746,22 +14002,21 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, "requires": { "fill-range": "^7.0.1" } }, "browserslist": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", - "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001208", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.712", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "buffer-equal-constant-time": { @@ -13770,9 +14025,9 @@ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "buffer-writer": { @@ -13781,95 +14036,28 @@ "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "c8": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.7.1.tgz", - "integrity": "sha512-OO9KpDGv1iTd/MBNUForJH7vPKt9XnRPWSBKeRJGma4xfTaKBObA0zWAplFpFRuf/qRmATFqGFrzxqDk51LXsw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.11.0.tgz", + "integrity": "sha512-XqPyj1uvlHMr+Y1IeRndC2X5P7iJzJlEJwBpCdBbq2JocXOgJfr+JVfJkyNMGROke5LfKrhSFXGFXnwnRJAUJw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@istanbuljs/schema": "^0.1.2", "find-up": "^5.0.0", "foreground-child": "^2.0.0", - "furi": "^2.0.0", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.0.1", "istanbul-lib-report": "^3.0.0", "istanbul-reports": "^3.0.2", "rimraf": "^3.0.0", "test-exclude": "^6.0.0", - "v8-to-istanbul": "^7.1.0", + "v8-to-istanbul": "^8.0.0", "yargs": "^16.2.0", "yargs-parser": "^20.2.7" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - } } }, "cacheable-request": { @@ -13938,9 +14126,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001208", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", - "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==", + "version": "1.0.30001320", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz", + "integrity": "sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA==", "dev": true }, "caseless": { @@ -13959,19 +14147,19 @@ } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "devOptional": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "ci-info": { @@ -14000,21 +14188,6 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "clone-response": { @@ -14045,12 +14218,6 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -14096,23 +14263,31 @@ } }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" }, "core-util-is": { "version": "1.0.2", @@ -14120,9 +14295,9 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "coveralls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", - "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", "dev": true, "requires": { "js-yaml": "^3.13.1", @@ -14130,14 +14305,6 @@ "log-driver": "^1.2.7", "minimist": "^1.2.5", "request": "^2.88.2" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "create-require": { @@ -14183,9 +14350,9 @@ } }, "culture-ships": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/culture-ships/-/culture-ships-1.0.0.tgz", - "integrity": "sha512-RbXG1PRc4f/QDLnYh/DPw5q7eo8hiYaJF2/5aBrgg+EP9GfWBrX02NvWRBzXnte91l21hzs/j8A39NK9lsaxPg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/culture-ships/-/culture-ships-1.0.1.tgz", + "integrity": "sha512-awmnjQpfYTJj6hl/l0ICcBZdb4WBZ0waqdTTua2bSMtfaTFEi7iM82CwzLpXTCMM/XZC4NeO07UIgok08FvtHA==" }, "dashdash": { "version": "1.14.1", @@ -14202,11 +14369,11 @@ "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -14231,9 +14398,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "default-require-extensions": { "version": "3.0.0", @@ -14251,13 +14418,14 @@ "dev": true }, "degenerator": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", "requires": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", - "esprima": "^4.0.0" + "esprima": "^4.0.0", + "vm2": "^3.9.8" } }, "delayed-stream": { @@ -14266,14 +14434,14 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "diff": { "version": "4.0.2", @@ -14309,9 +14477,9 @@ } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" }, "duplexer": { "version": "0.1.2", @@ -14344,9 +14512,9 @@ } }, "electron-to-chromium": { - "version": "1.3.715", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.715.tgz", - "integrity": "sha512-VCWxo9RqTYhcCsHtG+l0TEOS6H5QmO1JyVCQB9nv8fllmAzj1VcCYH3qBCXP75/En6FeoepefnogLPE+5W7OiQ==", + "version": "1.4.96", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.96.tgz", + "integrity": "sha512-DPNjvNGPabv6FcyjzLAN4C0psN/GgD9rSGvMTuv81SeXG/EX3mCz0wiw9N1tUEnfQXYCJi3H8M0oFPRziZh7rw==", "dev": true }, "emoji-regex": { @@ -14373,9 +14541,9 @@ } }, "error-callsites": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/error-callsites/-/error-callsites-2.0.3.tgz", - "integrity": "sha512-v036z4IEffZFE5kBkV5/F2MzhLnG0vuDyN+VXpzCf4yWXvX/1WJCI0A+TGTr8HWzBfCw5k8gr9rwAo09V+obTA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-callsites/-/error-callsites-2.0.4.tgz", + "integrity": "sha512-V877Ch4FC4FN178fDK1fsrHN4I1YQIBdtjKrHh3BUHMnh3SMvwUVrqkaOgDpUuevgSNna0RBq6Ox9SGlxYrigA==", "dev": true }, "es6-error": { @@ -14385,9 +14553,9 @@ "dev": true }, "esbuild": { - "version": "0.11.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.11.9.tgz", - "integrity": "sha512-qP7w/oWjJBIh9x+H37DbpkMtmSnLm63VDyA06+vkJJEHlVR7QSDiPAaka7mtMQZHoBn87irUx5rDxbXMKaf8xw==", + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.11.23.tgz", + "integrity": "sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==", "dev": true }, "escalade": { @@ -14402,9 +14570,9 @@ "dev": true }, "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "escodegen": { @@ -14417,31 +14585,77 @@ "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } } }, "eslint": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz", - "integrity": "sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", @@ -14450,7 +14664,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -14459,20 +14673,11 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -14485,123 +14690,50 @@ "uri-js": "^4.2.2" } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, - "globals": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", - "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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.3" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -14615,9 +14747,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", - "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -14634,26 +14766,26 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true } } }, "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, "espree": { @@ -14690,9 +14822,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -14707,9 +14839,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -14763,34 +14895,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - } + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -14805,14 +14919,14 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -14836,15 +14950,14 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, "requires": { "to-regex-range": "^5.0.1" } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -14853,9 +14966,9 @@ } }, "find-my-way": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.1.0.tgz", - "integrity": "sha512-UBD94MdO6cBi6E97XA0fBA9nwqw+xG5x1TYIPHats33gEi/kNqy7BWHAWx8QHCQQRSU5Txc0JiD8nzba39gvMQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.5.1.tgz", + "integrity": "sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==", "requires": { "fast-decode-uri-component": "^1.0.1", "fast-deep-equal": "^3.1.3", @@ -14864,12 +14977,12 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -14890,9 +15003,9 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "foreground-child": { @@ -14912,19 +15025,19 @@ "dev": true }, "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" }, "fromentries": { "version": "1.3.2", @@ -14970,11 +15083,6 @@ "xregexp": "2.0.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -15010,16 +15118,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "furi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/furi/-/furi-2.0.0.tgz", - "integrity": "sha512-uKuNsaU0WVaK/vmvj23wW1bicOFfyqSsAIH71bRZx8kA4Xj+YCHin7CJKJJjkIsmxYaPFLk9ljmjEyB7xF7WvQ==", - "dev": true, - "requires": { - "@types/is-windows": "^1.0.0", - "is-windows": "^1.0.2" - } - }, "gaxios": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", @@ -15123,9 +15221,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -15146,40 +15244,43 @@ } }, "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dev": true, "requires": { - "ini": "1.3.7" + "ini": "2.0.0" } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } } }, "got": { @@ -15202,16 +15303,16 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "handy-redis": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/handy-redis/-/handy-redis-2.2.1.tgz", - "integrity": "sha512-Kmz9HhdAA9tGV1b1R6m3AJ8GcC+r/0uzyiTia39Q8tseJJc4kOwGGQr7cfPppD/xlO2ENE5IK+ToRahLuX1JVg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/handy-redis/-/handy-redis-2.3.1.tgz", + "integrity": "sha512-ilZYZ4l9+BSxavnjzSbI0yNpM8wfuEP8wAjsPAoL5ThfcCEswN7EpuSCJ4PfRpuGvxRRrivjSImbqpM9NkDB7w==", "requires": { - "@types/redis": "^2.8.27" + "@types/redis": "^2.8.30" } }, "har-schema": { @@ -15281,9 +15382,9 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-yarn": { "version": "2.1.0", @@ -15299,14 +15400,24 @@ "requires": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "honeycomb-beeline": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/honeycomb-beeline/-/honeycomb-beeline-2.6.0.tgz", - "integrity": "sha512-YSvZYs7fJj+YAemimqiRiyUzqnuz+MOm/x4vqc5pnSAgYg3sgKnMUgfsdHqHmpUfqYmOsp7oxsyotSNB227tAA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/honeycomb-beeline/-/honeycomb-beeline-2.8.1.tgz", + "integrity": "sha512-FCbxtK9uzr4JXVM4SmsJKVx2rnaUn6qIFP4TH8RMtu2cydv3qKMjSF+103/WpPJqk2FyXaNvB+4hanAHnxObFQ==", "requires": { - "@opentelemetry/core": "^0.12.0", + "@opentelemetry/api": "^1.0.2", + "@opentelemetry/core": "^0.24.0", + "@types/node": "^16.3.2", "array-flatten": "^3.0.0", "debug": "^4.2.0", "libhoney": "^2.2.1", @@ -15314,31 +15425,24 @@ "shimmer": "^1.2.1" }, "dependencies": { - "@opentelemetry/api": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.12.0.tgz", - "integrity": "sha512-Dn4vU5GlaBrIWzLpsM6xbJwKHdlpwBQ4Bd+cL9ofJP3hKT8jBXpBpribmyaqAzrajzzl2Yt8uTa9rFVLfjDAvw==", - "requires": { - "@opentelemetry/context-base": "^0.12.0" - } - }, "@opentelemetry/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.12.0.tgz", - "integrity": "sha512-oLZIkmTNWTJXzo1eA4dGu/S7wOVtylsgnEsCmhSJGhrJVDXm1eW/aGuNs3DVBeuxp0ZvQLAul3/PThsC3YrnzA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz", + "integrity": "sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw==", "requires": { - "@opentelemetry/api": "^0.12.0", - "@opentelemetry/context-base": "^0.12.0", + "@opentelemetry/semantic-conventions": "0.24.0", "semver": "^7.1.3" } }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } + "@opentelemetry/semantic-conventions": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz", + "integrity": "sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA==" + }, + "@types/node": { + "version": "16.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz", + "integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==" } } }, @@ -15355,15 +15459,15 @@ "dev": true }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-proxy-agent": { @@ -15405,9 +15509,9 @@ } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "ignore-by-default": { @@ -15424,14 +15528,6 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } } }, "import-lazy": { @@ -15479,9 +15575,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, "ip": { @@ -15498,15 +15594,6 @@ "binary-extensions": "^2.0.0" } }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -15531,47 +15618,39 @@ "devOptional": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "devOptional": true, "requires": { "is-extglob": "^2.1.1" } }, "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-obj": { "version": "2.0.0", @@ -15586,15 +15665,9 @@ "dev": true }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-typedarray": { "version": "1.0.0", @@ -15615,9 +15688,9 @@ "dev": true }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isexe": { "version": "2.0.0", @@ -15632,9 +15705,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-hook": { @@ -15701,20 +15774,28 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -15744,14 +15825,6 @@ "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } } }, "jsbn": { @@ -15781,9 +15854,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -15804,21 +15877,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -15853,14 +15915,14 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -15916,28 +15978,29 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "libhoney": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/libhoney/-/libhoney-2.2.3.tgz", - "integrity": "sha512-TojbNL0k50tzjiuI7ker4sNox2jYhhGycyfSK3HrA9R7mFo4oaKmxYDli4Hg9uizJukmxJUVVfhOaB9JquuGkw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/libhoney/-/libhoney-2.3.3.tgz", + "integrity": "sha512-WfujgzJjIxN4ZwRwX7iO1LFvzB9x+M7MGEN+FsPrCjTti+cA3CMYR400ElqRO84/ZwEphjiJrO+yqvVceu4N6Q==", "requires": { - "superagent": "^3.8.3", - "superagent-proxy": "^2.0.0", + "superagent": "^6.1.0", + "superagent-proxy": "^3.0.0", "urljoin": "^0.1.5" } }, "libtap": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.1.3.tgz", - "integrity": "sha512-BfbhcSlcFngZWYvDt+gs4m1BkjP0LaFEg6+4FBAXD0E8Br95wpXCCvS5JZHW1a5QPWMrFD4LhsqBpTPRB3Em8g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.3.0.tgz", + "integrity": "sha512-yU5uSY987sVwpWiR5h84ZM96bxvmCQFZ/bOEJ1M7+Us8oez25fLmmLNGFRFGWi2PzuLqAzqzESH7HCaZ/b9IZA==", "dev": true, "requires": { "async-hook-domain": "^2.0.4", @@ -15949,11 +16012,10 @@ "own-or-env": "^1.0.2", "signal-exit": "^3.0.4", "stack-utils": "^2.0.4", - "tap-parser": "^10.0.1", + "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "tcompare": "^5.0.6", - "trivial-deferred": "^1.0.1", - "yapool": "^1.0.0" + "trivial-deferred": "^1.0.1" } }, "load-source-map": { @@ -15972,47 +16034,23 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -16125,61 +16163,30 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" }, "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.42.0" + "mime-db": "1.52.0" } }, "mimic-response": { @@ -16189,18 +16196,18 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minipass": { "version": "3.1.6", @@ -16234,9 +16241,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "netmask": { "version": "2.0.2", @@ -16244,9 +16251,9 @@ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } @@ -16261,27 +16268,27 @@ } }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "dev": true, "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "dependencies": { "debug": { @@ -16332,91 +16339,91 @@ "devOptional": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "npm": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.5.2.tgz", - "integrity": "sha512-fQRPOSrQfO3AG1JEOgScVrYhOfprZbhSKAjY4goESGPKMflWHxyQt8djo6EZhNjxCNIUAPtT75hkCN902SeYAw==", - "requires": { - "@isaacs/string-locale-compare": "*", - "@npmcli/arborist": "*", - "@npmcli/ci-detect": "*", - "@npmcli/config": "*", - "@npmcli/map-workspaces": "*", - "@npmcli/package-json": "*", - "@npmcli/run-script": "*", - "abbrev": "*", - "ansicolors": "*", - "ansistyles": "*", - "archy": "*", - "cacache": "*", - "chalk": "*", - "chownr": "*", - "cli-columns": "*", - "cli-table3": "*", - "columnify": "*", - "fastest-levenshtein": "*", - "glob": "*", - "graceful-fs": "*", - "hosted-git-info": "*", - "ini": "*", - "init-package-json": "*", - "is-cidr": "*", - "json-parse-even-better-errors": "*", - "libnpmaccess": "*", - "libnpmdiff": "*", - "libnpmexec": "*", - "libnpmfund": "*", - "libnpmhook": "*", - "libnpmorg": "*", - "libnpmpack": "*", - "libnpmpublish": "*", - "libnpmsearch": "*", - "libnpmteam": "*", - "libnpmversion": "*", - "make-fetch-happen": "*", - "minipass": "*", - "minipass-pipeline": "*", - "mkdirp": "*", - "mkdirp-infer-owner": "*", - "ms": "*", - "node-gyp": "*", - "nopt": "*", - "npm-audit-report": "*", - "npm-install-checks": "*", - "npm-package-arg": "*", - "npm-pick-manifest": "*", - "npm-profile": "*", - "npm-registry-fetch": "*", - "npm-user-validate": "*", - "npmlog": "*", - "opener": "*", - "pacote": "*", - "parse-conflict-json": "*", - "proc-log": "*", - "qrcode-terminal": "*", - "read": "*", - "read-package-json": "*", - "read-package-json-fast": "*", - "readdir-scoped-modules": "*", - "rimraf": "*", - "semver": "*", - "ssri": "*", - "tar": "*", - "text-table": "*", - "tiny-relative-date": "*", - "treeverse": "*", - "validate-npm-package-name": "*", - "which": "*", - "write-file-atomic": "*" + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.5.5.tgz", + "integrity": "sha512-a1vl26nokCNlD+my/iNYmOUPx/hpYR4ZyZk8gb7/A2XXtrPZf2gTSJOnVjS77jQS+BSfIVQpipZwXWCL0+5wzg==", + "requires": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.0.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.0.1", + "@npmcli/map-workspaces": "^2.0.2", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^3.0.1", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "archy": "~1.0.0", + "cacache": "^16.0.2", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.1", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "glob": "^7.2.0", + "graceful-fs": "^4.2.9", + "hosted-git-info": "^5.0.0", + "ini": "^2.0.0", + "init-package-json": "^3.0.1", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.2", + "libnpmdiff": "^4.0.2", + "libnpmexec": "^4.0.2", + "libnpmfund": "^3.0.1", + "libnpmhook": "^8.0.2", + "libnpmorg": "^4.0.2", + "libnpmpack": "^4.0.2", + "libnpmpublish": "^6.0.2", + "libnpmsearch": "^5.0.2", + "libnpmteam": "^4.0.2", + "libnpmversion": "^3.0.1", + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.0.0", + "nopt": "^5.0.0", + "npm-audit-report": "^2.1.5", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-pick-manifest": "^7.0.0", + "npm-profile": "^6.0.2", + "npm-registry-fetch": "^13.0.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.1", + "opener": "^1.5.2", + "pacote": "^13.0.5", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "ssri": "^8.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^1.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" }, "dependencies": { "@gar/promisify": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true }, "@isaacs/string-locale-compare": { @@ -16424,20 +16431,20 @@ "bundled": true }, "@npmcli/arborist": { - "version": "5.0.0", + "version": "5.0.3", "bundled": true, "requires": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/installed-package-contents": "^1.0.7", "@npmcli/map-workspaces": "^2.0.0", - "@npmcli/metavuln-calculator": "^3.0.0", + "@npmcli/metavuln-calculator": "^3.0.1", "@npmcli/move-file": "^1.1.0", "@npmcli/name-from-folder": "^1.0.1", "@npmcli/node-gyp": "^1.0.3", "@npmcli/package-json": "^1.0.1", "@npmcli/run-script": "^3.0.0", "bin-links": "^3.0.0", - "cacache": "^15.0.3", + "cacache": "^16.0.0", "common-ancestor-path": "^1.0.1", "json-parse-even-better-errors": "^2.3.1", "json-stringify-nice": "^1.1.4", @@ -16449,7 +16456,7 @@ "npm-pick-manifest": "^7.0.0", "npm-registry-fetch": "^13.0.0", "npmlog": "^6.0.1", - "pacote": "^13.0.2", + "pacote": "^13.0.5", "parse-conflict-json": "^2.0.1", "proc-log": "^2.0.0", "promise-all-reject-late": "^1.0.0", @@ -16468,10 +16475,10 @@ "bundled": true }, "@npmcli/config": { - "version": "4.0.0", + "version": "4.0.1", "bundled": true, "requires": { - "@npmcli/map-workspaces": "^2.0.0", + "@npmcli/map-workspaces": "^2.0.1", "ini": "^2.0.0", "mkdirp-infer-owner": "^2.0.0", "nopt": "^5.0.0", @@ -16509,12 +16516,6 @@ "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "7.3.1", - "bundled": true - } } }, "@npmcli/installed-package-contents": { @@ -16526,22 +16527,38 @@ } }, "@npmcli/map-workspaces": { - "version": "2.0.0", + "version": "2.0.2", "bundled": true, "requires": { "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" + "glob": "^7.2.0", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "bundled": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "@npmcli/metavuln-calculator": { - "version": "3.0.0", + "version": "3.0.1", "bundled": true, "requires": { - "cacache": "^15.3.0", + "cacache": "^16.0.0", "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.1", + "pacote": "^13.0.3", "semver": "^7.3.5" } }, @@ -16576,12 +16593,12 @@ } }, "@npmcli/run-script": { - "version": "3.0.0", + "version": "3.0.1", "bundled": true, "requires": { "@npmcli/node-gyp": "^1.0.3", "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^8.4.1", + "node-gyp": "^9.0.0", "read-package-json-fast": "^2.0.3" } }, @@ -16601,7 +16618,7 @@ } }, "agentkeepalive": { - "version": "4.2.0", + "version": "4.2.1", "bundled": true, "requires": { "debug": "^4.1.0", @@ -16617,6 +16634,10 @@ "indent-string": "^4.0.0" } }, + "ansi-regex": { + "version": "5.0.1", + "bundled": true + }, "ansi-styles": { "version": "4.3.0", "bundled": true, @@ -16685,26 +16706,26 @@ "bundled": true }, "cacache": { - "version": "15.3.0", + "version": "16.0.2", "bundled": true, "requires": { "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/move-file": "^1.1.2", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^7.2.0", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.0.2", + "tar": "^6.1.11", "unique-filename": "^1.1.1" } }, @@ -16737,19 +16758,6 @@ "requires": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "cli-table3": { @@ -16797,19 +16805,6 @@ "requires": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "common-ancestor-path": { @@ -16908,31 +16903,17 @@ "bundled": true }, "gauge": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "requires": { - "ansi-regex": "^5.0.1", "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", - "signal-exit": "^3.0.0", + "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } + "wide-align": "^1.1.5" } }, "glob": { @@ -16967,10 +16948,10 @@ "bundled": true }, "hosted-git-info": { - "version": "4.1.0", + "version": "5.0.0", "bundled": true, "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" } }, "http-cache-semantics": { @@ -17045,13 +17026,13 @@ "bundled": true }, "init-package-json": { - "version": "3.0.0", + "version": "3.0.1", "bundled": true, "requires": { "npm-package-arg": "^9.0.0", "promzard": "^0.3.0", "read": "^1.0.7", - "read-package-json": "^4.1.1", + "read-package-json": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" @@ -17087,10 +17068,6 @@ "version": "1.0.1", "bundled": true }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, "isexe": { "version": "2.0.0", "bundled": true @@ -17116,17 +17093,17 @@ "bundled": true }, "libnpmaccess": { - "version": "6.0.0", + "version": "6.0.2", "bundled": true, "requires": { "aproba": "^2.0.0", "minipass": "^3.1.1", - "npm-package-arg": "^9.0.0", + "npm-package-arg": "^9.0.1", "npm-registry-fetch": "^13.0.0" } }, "libnpmdiff": { - "version": "4.0.0", + "version": "4.0.2", "bundled": true, "requires": { "@npmcli/disparity-colors": "^1.0.1", @@ -17134,13 +17111,13 @@ "binary-extensions": "^2.2.0", "diff": "^5.0.0", "minimatch": "^3.0.4", - "npm-package-arg": "^9.0.0", - "pacote": "^13.0.2", + "npm-package-arg": "^9.0.1", + "pacote": "^13.0.5", "tar": "^6.1.0" } }, "libnpmexec": { - "version": "4.0.0", + "version": "4.0.2", "bundled": true, "requires": { "@npmcli/arborist": "^5.0.0", @@ -17148,9 +17125,9 @@ "@npmcli/run-script": "^3.0.0", "chalk": "^4.1.0", "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.0", + "npm-package-arg": "^9.0.1", "npmlog": "^6.0.1", - "pacote": "^13.0.2", + "pacote": "^13.0.5", "proc-log": "^2.0.0", "read": "^1.0.7", "read-package-json-fast": "^2.0.2", @@ -17158,14 +17135,14 @@ } }, "libnpmfund": { - "version": "3.0.0", + "version": "3.0.1", "bundled": true, "requires": { "@npmcli/arborist": "^5.0.0" } }, "libnpmhook": { - "version": "8.0.0", + "version": "8.0.2", "bundled": true, "requires": { "aproba": "^2.0.0", @@ -17173,7 +17150,7 @@ } }, "libnpmorg": { - "version": "4.0.0", + "version": "4.0.2", "bundled": true, "requires": { "aproba": "^2.0.0", @@ -17181,34 +17158,34 @@ } }, "libnpmpack": { - "version": "4.0.0", + "version": "4.0.2", "bundled": true, "requires": { "@npmcli/run-script": "^3.0.0", - "npm-package-arg": "^9.0.0", - "pacote": "^13.0.2" + "npm-package-arg": "^9.0.1", + "pacote": "^13.0.5" } }, "libnpmpublish": { - "version": "6.0.0", + "version": "6.0.2", "bundled": true, "requires": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^9.0.0", + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", "npm-registry-fetch": "^13.0.0", "semver": "^7.1.3", "ssri": "^8.0.1" } }, "libnpmsearch": { - "version": "5.0.0", + "version": "5.0.2", "bundled": true, "requires": { "npm-registry-fetch": "^13.0.0" } }, "libnpmteam": { - "version": "4.0.0", + "version": "4.0.2", "bundled": true, "requires": { "aproba": "^2.0.0", @@ -17216,7 +17193,7 @@ } }, "libnpmversion": { - "version": "3.0.0", + "version": "3.0.1", "bundled": true, "requires": { "@npmcli/git": "^3.0.0", @@ -17228,42 +17205,33 @@ } }, "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } + "version": "7.5.1", + "bundled": true }, "make-fetch-happen": { - "version": "10.0.3", + "version": "10.0.6", "bundled": true, "requires": { - "agentkeepalive": "^4.2.0", - "cacache": "^15.3.0", + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.3.1", + "lru-cache": "^7.5.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.4.1", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^6.1.1", "ssri": "^8.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.3.1", - "bundled": true - } } }, "minimatch": { - "version": "3.0.4", + "version": "3.1.2", "bundled": true, "requires": { "brace-expansion": "^1.1.7" @@ -17284,13 +17252,13 @@ } }, "minipass-fetch": { - "version": "1.4.1", + "version": "2.0.3", "bundled": true, "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", + "encoding": "^0.1.13", + "minipass": "^3.1.6", "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "minizlib": "^2.1.2" } }, "minipass-flush": { @@ -17356,56 +17324,19 @@ "bundled": true }, "node-gyp": { - "version": "8.4.1", + "version": "9.0.0", "bundled": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", + "make-fetch-happen": "^10.0.3", "nopt": "^5.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^2.0.2" - }, - "dependencies": { - "@tootallnate/once": { - "version": "1.1.2", - "bundled": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "bundled": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "make-fetch-happen": { - "version": "9.1.0", - "bundled": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - } } }, "nopt": { @@ -17416,13 +17347,13 @@ } }, "normalize-package-data": { - "version": "3.0.3", + "version": "4.0.0", "bundled": true, "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" } }, "npm-audit-report": { @@ -17451,21 +17382,21 @@ "bundled": true }, "npm-package-arg": { - "version": "9.0.0", + "version": "9.0.1", "bundled": true, "requires": { - "hosted-git-info": "^4.1.0", + "hosted-git-info": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^3.0.0" } }, "npm-packlist": { - "version": "3.0.0", + "version": "4.0.0", "bundled": true, "requires": { - "glob": "^7.1.6", + "glob": "^7.2.0", "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.1", + "npm-bundled": "^1.1.2", "npm-normalize-package-bin": "^1.0.1" } }, @@ -17488,12 +17419,12 @@ } }, "npm-registry-fetch": { - "version": "13.0.0", + "version": "13.0.1", "bundled": true, "requires": { - "make-fetch-happen": "^10.0.2", + "make-fetch-happen": "^10.0.3", "minipass": "^3.1.6", - "minipass-fetch": "^1.4.1", + "minipass-fetch": "^2.0.1", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^9.0.0", @@ -17533,26 +17464,26 @@ } }, "pacote": { - "version": "13.0.3", + "version": "13.0.5", "bundled": true, "requires": { "@npmcli/git": "^3.0.0", "@npmcli/installed-package-contents": "^1.0.7", "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^3.0.0", - "cacache": "^15.3.0", + "@npmcli/run-script": "^3.0.1", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", "minipass": "^3.1.6", "mkdirp": "^1.0.4", "npm-package-arg": "^9.0.0", - "npm-packlist": "^3.0.0", + "npm-packlist": "^4.0.0", "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", + "npm-registry-fetch": "^13.0.1", "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^4.1.1", + "read-package-json": "^5.0.0", "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", "ssri": "^8.0.1", @@ -17619,13 +17550,13 @@ "bundled": true }, "read-package-json": { - "version": "4.1.1", + "version": "5.0.0", "bundled": true, "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" + "glob": "^7.2.0", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" } }, "read-package-json-fast": { @@ -17680,6 +17611,15 @@ "bundled": true, "requires": { "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "set-blocking": { @@ -17687,7 +17627,7 @@ "bundled": true }, "signal-exit": { - "version": "3.0.6", + "version": "3.0.7", "bundled": true }, "smart-buffer": { @@ -17695,11 +17635,11 @@ "bundled": true }, "socks": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "requires": { "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { @@ -17756,25 +17696,19 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "stringify-package": { "version": "1.0.1", "bundled": true }, + "strip-ansi": { + "version": "6.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "supports-color": { "version": "7.2.0", "bundled": true, @@ -17806,10 +17740,6 @@ "version": "1.0.4", "bundled": true }, - "typedarray-to-buffer": { - "version": "4.0.0", - "bundled": true - }, "unique-filename": { "version": "1.1.1", "bundled": true, @@ -17873,66 +17803,166 @@ "bundled": true }, "write-file-atomic": { - "version": "4.0.0", + "version": "4.0.1", "bundled": true, "requires": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^4.0.0" + "signal-exit": "^3.0.7" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "nunjucks": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + } + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" } }, - "yallist": { - "version": "4.0.0", - "bundled": true + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, - "nunjucks": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", - "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", - "requires": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - } - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - } - }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -17945,9 +17975,9 @@ "dev": true }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "oblique-strategies": { "version": "1.0.1", @@ -17975,16 +18005,17 @@ "dev": true }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "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.3" } }, "own-or": { @@ -18009,21 +18040,21 @@ "dev": true }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-map": { @@ -18042,9 +18073,9 @@ "dev": true }, "pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "requires": { "@tootallnate/once": "1", "agent-base": "6", @@ -18052,17 +18083,17 @@ "get-uri": "3", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", + "pac-resolver": "^5.0.0", "raw-body": "^2.2.0", "socks-proxy-agent": "5" } }, "pac-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz", - "integrity": "sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", + "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", "requires": { - "degenerator": "^2.2.0", + "degenerator": "^3.0.1", "ip": "^1.1.5", "netmask": "^2.0.1" } @@ -18149,24 +18180,17 @@ "dev": true }, "pg": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz", - "integrity": "sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==", + "version": "8.7.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz", + "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "^2.5.0", - "pg-pool": "^3.3.0", + "pg-pool": "^3.5.1", "pg-protocol": "^1.5.0", "pg-types": "^2.1.0", "pgpass": "1.x" - }, - "dependencies": { - "pg-protocol": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", - "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" - } } }, "pg-connection-string": { @@ -18180,15 +18204,15 @@ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, "pg-pool": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz", - "integrity": "sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz", + "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==", "requires": {} }, "pg-protocol": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" }, "pg-types": { "version": "2.2.0", @@ -18203,17 +18227,23 @@ } }, "pgpass": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", - "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "requires": { - "split2": "^3.1.1" + "split2": "^4.1.0" } }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", - "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pkg-dir": { "version": "4.2.0", @@ -18222,6 +18252,45 @@ "dev": true, "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } } }, "postgres-array": { @@ -18248,9 +18317,10 @@ } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true }, "prepend-http": { "version": "2.0.0", @@ -18259,9 +18329,9 @@ "dev": true }, "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz", + "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==", "dev": true }, "prettier-linter-helpers": { @@ -18273,11 +18343,6 @@ "fast-diff": "^1.1.2" } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -18314,16 +18379,16 @@ } }, "proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", - "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "requires": { "agent-base": "^6.0.0", "debug": "4", "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", + "pac-proxy-agent": "^5.0.0", "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^5.0.0" }, @@ -18391,9 +18456,9 @@ } }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "requires": { "side-channel": "^1.0.4" } @@ -18410,12 +18475,12 @@ "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" }, "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -18432,6 +18497,12 @@ "strip-json-comments": "~2.0.1" }, "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -18441,40 +18512,28 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, "requires": { "picomatch": "^2.2.1" - }, - "dependencies": { - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "devOptional": true - } } }, "redis": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.0.tgz", - "integrity": "sha512-//lAOcEtNIKk2ekZibes5oyWKYUVWMvMB71lyD/hS9KRePNkB7AU3nXGkArX6uDKEb2N23EyJBthAv6pagD0uw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", "requires": { "denque": "^1.5.0", "redis-commands": "^1.7.0", @@ -18501,9 +18560,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -18573,9 +18632,9 @@ } }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "uuid": { @@ -18613,19 +18672,19 @@ "dev": true }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "requires": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "responselike": { @@ -18672,9 +18731,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex2": { "version": "2.0.0", @@ -18726,9 +18785,9 @@ "dev": true }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "2.0.0", @@ -18761,9 +18820,9 @@ } }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "slash": { @@ -18781,54 +18840,54 @@ "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } } }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.0.tgz", - "integrity": "sha512-mNmr9owlinMplev0Wd7UHFlqI4ofnBnNzFuzrm63PPaHgbkqCFe4T5LzwKmtQ/f2tX0NTpcdVLyD/FHxFBstYw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "requires": { "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "requires": { - "agent-base": "6", + "agent-base": "^6.0.2", "debug": "4", "socks": "^2.3.3" } }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "spawn-wrap": { @@ -18855,24 +18914,9 @@ } }, "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" }, "sprintf-js": { "version": "1.0.3", @@ -18881,9 +18925,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -18904,6 +18948,14 @@ "dev": true, "requires": { "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } } }, "stackman": { @@ -18920,9 +18972,9 @@ } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "stream-combiner": { "version": "0.2.2", @@ -18935,50 +18987,29 @@ } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -18994,60 +19025,36 @@ "dev": true }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" } }, "superagent-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-2.1.0.tgz", - "integrity": "sha512-DnarpKN6Xn8e3pYlFV4Yvsj9yxLY4q5FIsUe5JvN7vjzP+YCfzXv03dTkZSD2yzrSadsNYHf0IgOUJwKjX457A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", "requires": { - "debug": "^3.1.0", - "proxy-agent": "^4.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -19068,78 +19075,22 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "table": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", - "integrity": "sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dev": true, "requires": { "ajv": "^8.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ajv": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz", - "integrity": "sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" } }, "tap": { - "version": "15.1.5", - "resolved": "https://registry.npmjs.org/tap/-/tap-15.1.5.tgz", - "integrity": "sha512-ha9ify0cagIOENV5D+T8ys+FFOWqPaWAKk66hjtUWjywXdGmnL8LRxloZa8sHiaB+Az1GYx4ufEaflOpedSCbQ==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/tap/-/tap-15.2.3.tgz", + "integrity": "sha512-EVbovHd/SdevGMUnkNU5JJqC1YC0hzaaZ2jnqs0fKHv9Oudx27qW3Xwox7A6TB92wvR0mqgQPr+Au2w56kD+aQ==", "dev": true, "requires": { "@isaacs/import-jsx": "*", @@ -19154,7 +19105,7 @@ "isexe": "^2.0.0", "istanbul-lib-processinfo": "^2.0.2", "jackspeak": "^1.4.1", - "libtap": "^1.1.3", + "libtap": "^1.3.0", "minipass": "^3.1.1", "mkdirp": "^1.0.4", "nyc": "^15.1.0", @@ -19163,10 +19114,10 @@ "rimraf": "^3.0.0", "signal-exit": "^3.0.6", "source-map-support": "^0.5.16", - "tap-mocha-reporter": "^5.0.0", - "tap-parser": "^10.0.1", + "tap-mocha-reporter": "^5.0.3", + "tap-parser": "^11.0.1", "tap-yaml": "^1.0.0", - "tcompare": "^5.0.6", + "tcompare": "^5.0.7", "treport": "*", "which": "^2.0.2" }, @@ -19954,7 +19905,7 @@ "dev": true }, "minipass": { - "version": "3.1.5", + "version": "3.1.6", "bundled": true, "dev": true, "requires": { @@ -20213,12 +20164,12 @@ } }, "tap-parser": { - "version": "10.1.0", + "version": "11.0.1", "bundled": true, "dev": true, "requires": { "events-to-array": "^1.0.1", - "minipass": "^3.0.0", + "minipass": "^3.1.6", "tap-yaml": "^1.0.0" } }, @@ -20236,7 +20187,7 @@ "dev": true }, "treport": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true, "requires": { @@ -20245,7 +20196,7 @@ "chalk": "^3.0.0", "ink": "^3.2.0", "ms": "^2.1.2", - "tap-parser": "^10.0.1", + "tap-parser": "^11.0.0", "unicode-length": "^2.0.2" }, "dependencies": { @@ -20396,9 +20347,9 @@ } }, "tap-mocha-reporter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.1.tgz", - "integrity": "sha512-1knFWOwd4khx/7uSEnUeaP9IPW3w+sqTgJMhrwah6t46nZ8P25atOKAjSvVDsT67lOPu0nfdOqUwoyKn+3E5pA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz", + "integrity": "sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==", "dev": true, "requires": { "color-support": "^1.1.0", @@ -20406,19 +20357,27 @@ "diff": "^4.0.1", "escape-string-regexp": "^2.0.0", "glob": "^7.0.5", - "tap-parser": "^10.0.0", + "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "unicode-length": "^2.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } } }, "tap-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz", - "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.1.tgz", + "integrity": "sha512-5ow0oyFOnXVSALYdidMX94u0GEjIlgc/BPFYLx0yRh9hb8+cFGNJqJzDJlUqbLOwx8+NBrIbxCWkIQi7555c0w==", "dev": true, "requires": { "events-to-array": "^1.0.1", - "minipass": "^3.0.0", + "minipass": "^3.1.6", "tap-yaml": "^1.0.0" } }, @@ -20440,12 +20399,6 @@ "diff": "^4.0.2" } }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -20479,12 +20432,6 @@ "xtend": "~3.0.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -20527,15 +20474,14 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, "requires": { "is-number": "^7.0.0" } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -20582,10 +20528,9 @@ } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "tsscmp": { "version": "1.0.6", @@ -20599,6 +20544,14 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "tunnel-agent": { @@ -20617,17 +20570,18 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "typedarray-to-buffer": { @@ -20640,9 +20594,9 @@ } }, "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "uid-safe": { @@ -20654,30 +20608,10 @@ } }, "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, "unicode-length": { "version": "2.0.2", @@ -20726,24 +20660,37 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dev": true, "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "uri-js": { @@ -20795,9 +20742,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", - "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -20824,6 +20771,22 @@ "extsprintf": "^1.2.0" } }, + "vm2": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + } + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -20875,21 +20838,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "wrappy": { @@ -20927,10 +20875,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -20943,79 +20890,24 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, - "yapool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", - "dev": true - }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yn": { "version": "3.1.1", diff --git a/src/dependencies.ron b/src/dependencies.ron index e6b8eb19..07283af2 100644 --- a/src/dependencies.ron +++ b/src/dependencies.ron @@ -83,20 +83,6 @@ preconditions: Some(When(all_of: ["honeycomb"])) ), - DependencySpec( - name: "@opentelemetry/instrumentation-graphql", - version: "^0.27.1", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - - DependencySpec( - name: "@opentelemetry/instrumentation-grpc", - version: "^0.27.0", - kind: Normal, - preconditions: Some(When(all_of: ["honeycomb"])) - ), - DependencySpec( name: "@opentelemetry/instrumentation-http", version: "^0.27.0", diff --git a/src/main.rs b/src/main.rs index c23071be..937640e8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -642,7 +642,10 @@ fn main() -> anyhow::Result<(), anyhow::Error> { } }; - let mut subproc = Exec::cmd(NPM).arg("i").cwd(&target); + // It's not actually possible, afaict, to install the opentelemetry libraries + // with versions that will completely satisfy the peer deps rules, so we + // use the "legacy" behavior which makes a best effort. + let mut subproc = Exec::cmd(NPM).arg("i").arg("--legacy-peer-deps").cwd(&target); subproc = if verbosity < 2 { subproc.stdout(NullFile).stderr(NullFile) diff --git a/templates/boltzmann/core/honeycomb.ts b/templates/boltzmann/core/honeycomb.ts index 5f2f7ae9..8e007493 100644 --- a/templates/boltzmann/core/honeycomb.ts +++ b/templates/boltzmann/core/honeycomb.ts @@ -608,7 +608,7 @@ class Honeycomb { this.initialized = true } catch (err) { if (err instanceof HoneycombError) { - otel.diag.error(err.stack || String(err)); + otel.diag.error((err as any).stack || String(err)); return; } throw err; @@ -639,7 +639,7 @@ class Honeycomb { try { await sdk.shutdown() } catch (err) { - otel.diag.error(err.stack || String(err)) + otel.diag.error((err as any).stack || String(err)) } } diff --git a/templates/boltzmann/core/utils/index.ts b/templates/boltzmann/core/utils/index.ts index dd0c9ae9..9b96bc10 100644 --- a/templates/boltzmann/core/utils/index.ts +++ b/templates/boltzmann/core/utils/index.ts @@ -40,7 +40,8 @@ function _processBodyParsers(parsers: BodyImport) { async function _requireOr(target: string, value: any) { try { return require(target) - } catch (err) { + } catch (_err) { + const err = _err; if (err.code === 'MODULE_NOT_FOUND' && err.requireStack && err.requireStack[0] === __filename) { return value } @@ -62,7 +63,7 @@ if (require.main === module) { await _requireOr('./require-or-test', []) assert.fail('expected to fail with MODULE_NOT_FOUND') } catch (err) { - assert.equal(err.code, 'MODULE_NOT_FOUND') + assert.equal((err as any).code, 'MODULE_NOT_FOUND') } }) diff --git a/templates/boltzmann/middleware/csrf.ts b/templates/boltzmann/middleware/csrf.ts index 7ab7e440..b06b85da 100644 --- a/templates/boltzmann/middleware/csrf.ts +++ b/templates/boltzmann/middleware/csrf.ts @@ -136,7 +136,7 @@ if (require.main === module) { } assert.ok(threw) - assert.ok(/a secret for signing cookies/.test(error.message)) + assert.ok(/a secret for signing cookies/.test((error as any).message)) }) test('csrf middleware adds a token generator to the context', async (assert) => { diff --git a/templates/boltzmann/middleware/enforce-invariants.ts b/templates/boltzmann/middleware/enforce-invariants.ts index dff82f6f..e99e4a15 100644 --- a/templates/boltzmann/middleware/enforce-invariants.ts +++ b/templates/boltzmann/middleware/enforce-invariants.ts @@ -11,7 +11,8 @@ function enforceInvariants () { // the "...args" here are load-bearing: this is applied between // decorators _and_ middleware return async function invariant (ctx: Context) { - let error, result + let error: any + let result try { result = await next(ctx) diff --git a/templates/boltzmann/middleware/jwt.ts b/templates/boltzmann/middleware/jwt.ts index 4b120072..c0db3ebe 100644 --- a/templates/boltzmann/middleware/jwt.ts +++ b/templates/boltzmann/middleware/jwt.ts @@ -206,7 +206,7 @@ if (require.main === module) { assert.fail('expected failure, unexpected success. not cause for celebration') } catch (err) { assert.equal(called, 0) - assert.equal(err[Symbol.for('status')], 403) + assert.equal((err as any)[Symbol.for('status')], 403) } }) @@ -226,7 +226,7 @@ if (require.main === module) { assert.fail('expected failure, unexpected success. not cause for celebration') } catch (err) { assert.equal(called, 0) - assert.equal(err[Symbol.for('status')], 403) + assert.equal((err as any)[Symbol.for('status')], 403) } }) diff --git a/templates/boltzmann/middleware/status.ts b/templates/boltzmann/middleware/status.ts index d9cd135e..07db56a0 100644 --- a/templates/boltzmann/middleware/status.ts +++ b/templates/boltzmann/middleware/status.ts @@ -57,7 +57,7 @@ function handleStatus ({ await test(context, meta) meta.status = 'healthy' } catch (err) { - meta.error = err + meta.error = err } finally { meta.latency = Date.now() - start } diff --git a/templates/boltzmann/middleware/template.ts b/templates/boltzmann/middleware/template.ts index 8f052c6d..50281e88 100644 --- a/templates/boltzmann/middleware/template.ts +++ b/templates/boltzmann/middleware/template.ts @@ -588,7 +588,7 @@ function template ({ }) }) } catch (err) { - status = err[STATUS] || 500 + status = (err as any)[STATUS] || 500 const target = !renderingErrorTemplate && isDev() ? devErrorTemplate : '5xx.html' rendered = await new Promise((resolve, _) => { @@ -651,7 +651,7 @@ if (require.main === module) { try { template({ paths: { foo: 'bar' } }) } catch (err) { - assert.match(err.message, /must be an array/) + assert.match((err as any).message, /must be an array/) caught++ } assert.equal(caught, 1)