diff --git a/.gitignore b/.gitignore index 7624e00c..603212d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ +dist/ node_modules/ deps/librdkafka npm-debug.log @@ -15,3 +16,4 @@ deps/* .idea .vscode +coverage diff --git a/Makefile.schemaregistry b/Makefile.schemaregistry index 248ff096..37f002bc 100644 --- a/Makefile.schemaregistry +++ b/Makefile.schemaregistry @@ -9,7 +9,7 @@ TS_NODE ?= ./node_modules/.bin/ts-node # Paths SRC_DIR = schemaregistry SR_TEST_DIR = test/schemaregistry -DEK_TEST_DIR = test/schemaregistry/dekregistry +DEK_TEST_DIR = test/schemaregistry/rules/encryption/dekregistry INTEG_DIR = e2e/schemaregistry # Tasks diff --git a/jest.config.js b/jest.config.js index a6110529..e3471a95 100644 --- a/jest.config.js +++ b/jest.config.js @@ -3,4 +3,3 @@ module.exports = { '^.+\\.tsx?$': 'ts-jest', }, }; - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index cf540dae..aacda59a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,16 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@bufbuild/buf": "^1.37.0", + "@aws-sdk/client-kms": "^3.637.0", + "@azure/identity": "^4.4.1", + "@azure/keyvault-keys": "^4.8.0", "@bufbuild/protobuf": "^2.0.0", - "@bufbuild/protoc-gen-es": "^2.0.0", "@criteria/json-schema": "^0.10.0", "@criteria/json-schema-validation": "^0.10.0", + "@google-cloud/kms": "^4.5.0", "@hackbg/miscreant-esm": "^0.3.2-patch.3", "@mapbox/node-pre-gyp": "^1.0.11", + "@smithy/types": "^3.3.0", "@types/validator": "^13.12.0", "ajv": "^8.17.1", "async-mutex": "^0.5.0", @@ -24,16 +27,19 @@ "axios": "^1.7.3", "bindings": "^1.3.1", "json-stringify-deterministic": "^1.0.12", + "jsonata": "^2.0.5", "lru-cache": "^11.0.0", - "miscreant": "^0.3.2", "nan": "^2.17.0", + "node-vault": "^0.10.2", "ts-jest": "^29.2.4", "validator": "^13.12.0" }, "devDependencies": { + "@bufbuild/buf": "^1.37.0", + "@bufbuild/protoc-gen-es": "^2.0.0", "@eslint/js": "^9.9.0", "@types/eslint__js": "^8.42.3", - "@types/node": "^20.4.5", + "@types/node": "^20.16.1", "bluebird": "^3.5.3", "eslint": "^8.57.0", "eslint-plugin-jest": "^28.6.0", @@ -60,1357 +66,2962 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node": ">=14.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "dependencies": { - "yallist": "^3.0.2" + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-kms": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.637.0.tgz", + "integrity": "sha512-bqppLpmIPl6eZkZx/9axnr4CBbhtrRKe3LffW8320DlwCqP3zU+c500vXMjEgYdrAqkqOFyDY/FYMAgZhtHVCQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", + "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", + "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@aws-sdk/client-sts": "^3.637.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", + "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.635.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", + "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", + "dependencies": { + "@smithy/core": "^2.4.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.635.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", + "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", + "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.637.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.637.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", + "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-ini": "3.637.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.637.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", + "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", + "dependencies": { + "@aws-sdk/client-sso": "3.637.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", + "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", "dependencies": { - "color-convert": "^1.9.0" + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", + "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", "dependencies": { - "has-flag": "^3.0.0" + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "tslib": "^2.2.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@azure/core-auth": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", + "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "node_modules/@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@azure/core-http-compat": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz", + "integrity": "sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@azure/abort-controller": "^2.0.0", + "@azure/core-client": "^1.3.0", + "@azure/core-rest-pipeline": "^1.3.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@azure/core-http-compat/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@azure/core-lro": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", + "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@azure/core-lro/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@azure/core-paging": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", + "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@azure/core-rest-pipeline": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.3.tgz", + "integrity": "sha512-VxLk4AHLyqcHsfKe4MZ6IQ+D+ShuByy+RfStKfSjxJoL3WBWq17VNmrz8aT8etKzqc2nAeIyLxScjpzsS4fz8w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.9.0", + "@azure/logger": "^1.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "debug": "^4.3.4" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14" } }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14" } }, - "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==", + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, "engines": { - "node": ">=4" + "node": ">= 14" } }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "node_modules/@azure/core-tracing": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", + "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + "node_modules/@azure/core-util": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.2.tgz", + "integrity": "sha512-l1Qrqhi4x1aekkV+OlcqsJa4AnAkj5p0JV8omgwjaV9OAbP41lvrMvs+CptfetKkeEaGRGSzby7sjPZEX7+kkQ==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/@bufbuild/buf": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@bufbuild/buf/-/buf-1.37.0.tgz", - "integrity": "sha512-33Rp90nRa7ebTwAjI8Yc7f8WOQMOEfRM0mg/o1bkNvE6cGQhYiq82Ag27pcegvYIyXl413XCeLMAUegsqjuFqw==", - "hasInstallScript": true, - "bin": { - "buf": "bin/buf", - "protoc-gen-buf-breaking": "bin/protoc-gen-buf-breaking", - "protoc-gen-buf-lint": "bin/protoc-gen-buf-lint" + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", + "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.5.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.14.0", + "@azure/msal-node": "^2.9.2", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" }, - "optionalDependencies": { - "@bufbuild/buf-darwin-arm64": "1.37.0", - "@bufbuild/buf-darwin-x64": "1.37.0", - "@bufbuild/buf-linux-aarch64": "1.37.0", - "@bufbuild/buf-linux-x64": "1.37.0", - "@bufbuild/buf-win32-arm64": "1.37.0", - "@bufbuild/buf-win32-x64": "1.37.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@bufbuild/buf-darwin-arm64": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.37.0.tgz", - "integrity": "sha512-YrT0HqLf7qJJ9VjXmnG900oGOjskerqfY4UTbpLb67b76uRxZm7pfSfqpM4bCaSru4j6GPBDwH9dkwiuNOenEA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@azure/keyvault-keys": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.8.0.tgz", + "integrity": "sha512-jkuYxgkw0aaRfk40OQhFqDIupqblIOIlYESWB6DKCVDxQet1pyv86Tfk9M+5uFM0+mCs6+MUHU+Hxh3joiUn4Q==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.5.0", + "@azure/core-http-compat": "^2.0.1", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-rest-pipeline": "^1.8.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, "engines": { - "node": ">=12" + "node": ">=18.0.0" } }, - "node_modules/@bufbuild/buf-darwin-x64": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.37.0.tgz", - "integrity": "sha512-c1iDr1LaYcdzAK7v4ZBTiYVRPltPa1UNFQ3JJ6BI/RUaBk/eYFsykuNtsJQb5lXh/usjMz76juzOxAdYikcw7w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@azure/logger": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", + "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=12" + "node": ">=18.0.0" } }, - "node_modules/@bufbuild/buf-linux-aarch64": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.37.0.tgz", - "integrity": "sha512-ENaCLU4XZxQFc6+pWjNGeKITlzY0jYeEmz6R2cEeR9kVl+HyNNcTMaKxdffG5HNU5Ci1dC3pSY/ZIF3ck8UHVw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@azure/msal-browser": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.21.0.tgz", + "integrity": "sha512-BAwcFsVvOrYzKuUZHhFuvRykUmQGq6lDxst2qGnjxnpNZc3d/tnVPcmhgvUdeKl28VSE0ltgBzT3HkdpDtz9rg==", + "dependencies": { + "@azure/msal-common": "14.14.1" + }, "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/@bufbuild/buf-linux-x64": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.37.0.tgz", - "integrity": "sha512-/buQuUaBVU4rYqdoS/xmbyohJFaE4uy7boHMabCnI2aLsVBNPHYa/k0JMc+ZDRqgq0Wnth9VbIHn6DSGHG+cmw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@azure/msal-common": { + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.1.tgz", + "integrity": "sha512-2Q3tqNz/PZLfSr8BvcHZVpRRfSn4MjGSqjj9J+HlBsmbf1Uu4P0WeXnemjTJwwx9KrmplsrN3UkZ/LPOR720rw==", "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/@bufbuild/buf-win32-arm64": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.37.0.tgz", - "integrity": "sha512-5Y1aaHge9iQP+YNyxUayMd+rSVbjNXLBXniJDQhim56B+6eufPiKzmTgAKjDE9hGTT+mcBdLznrCMI0fzDLHJw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], + "node_modules/@azure/msal-node": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.13.0.tgz", + "integrity": "sha512-DhP97ycs7qlCVzzzWGzJiwAFyFj5okno74E4FUZ61oCLfKh4IxA1kxirqzrWuYZWpBe9HVPL6GA4NvmlEOBN5Q==", + "dependencies": { + "@azure/msal-common": "14.14.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/@bufbuild/buf-win32-x64": { + "node_modules/@azure/msal-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@bufbuild/buf": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf/-/buf-1.37.0.tgz", + "integrity": "sha512-33Rp90nRa7ebTwAjI8Yc7f8WOQMOEfRM0mg/o1bkNvE6cGQhYiq82Ag27pcegvYIyXl413XCeLMAUegsqjuFqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "buf": "bin/buf", + "protoc-gen-buf-breaking": "bin/protoc-gen-buf-breaking", + "protoc-gen-buf-lint": "bin/protoc-gen-buf-lint" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@bufbuild/buf-darwin-arm64": "1.37.0", + "@bufbuild/buf-darwin-x64": "1.37.0", + "@bufbuild/buf-linux-aarch64": "1.37.0", + "@bufbuild/buf-linux-x64": "1.37.0", + "@bufbuild/buf-win32-arm64": "1.37.0", + "@bufbuild/buf-win32-x64": "1.37.0" + } + }, + "node_modules/@bufbuild/buf-darwin-arm64": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.37.0.tgz", + "integrity": "sha512-YrT0HqLf7qJJ9VjXmnG900oGOjskerqfY4UTbpLb67b76uRxZm7pfSfqpM4bCaSru4j6GPBDwH9dkwiuNOenEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-darwin-x64": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.37.0.tgz", + "integrity": "sha512-c1iDr1LaYcdzAK7v4ZBTiYVRPltPa1UNFQ3JJ6BI/RUaBk/eYFsykuNtsJQb5lXh/usjMz76juzOxAdYikcw7w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-linux-aarch64": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.37.0.tgz", + "integrity": "sha512-ENaCLU4XZxQFc6+pWjNGeKITlzY0jYeEmz6R2cEeR9kVl+HyNNcTMaKxdffG5HNU5Ci1dC3pSY/ZIF3ck8UHVw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-linux-x64": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.37.0.tgz", + "integrity": "sha512-/buQuUaBVU4rYqdoS/xmbyohJFaE4uy7boHMabCnI2aLsVBNPHYa/k0JMc+ZDRqgq0Wnth9VbIHn6DSGHG+cmw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-win32-arm64": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.37.0.tgz", + "integrity": "sha512-5Y1aaHge9iQP+YNyxUayMd+rSVbjNXLBXniJDQhim56B+6eufPiKzmTgAKjDE9hGTT+mcBdLznrCMI0fzDLHJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-win32-x64": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-x64/-/buf-win32-x64-1.37.0.tgz", "integrity": "sha512-2BioEPdC6EM5zEKmTmM14ZJuuPjKuYIvoAwQ4hoCSJBllIhGvshk61NDYBorr1huEEq6baa4ITL/gWHJ86B0bw==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=12" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.0.0.tgz", + "integrity": "sha512-sw2JhwJyvyL0zlhG61aDzOVryEfJg2PDZFSV7i7IdC7nAE41WuXCru3QWLGiP87At0BMzKOoKO/FqEGoKygGZQ==" + }, + "node_modules/@bufbuild/protoc-gen-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protoc-gen-es/-/protoc-gen-es-2.0.0.tgz", + "integrity": "sha512-xXDrDFjSD97jGu9RMA8O4Myj66DdCLOFeYG7Z0mX1aCE9hayymfor+BKgKCQouUfty6CYv8709FPYpEtDurLFQ==", + "dev": true, + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "@bufbuild/protoplugin": "2.0.0" + }, + "bin": { + "protoc-gen-es": "bin/protoc-gen-es" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@bufbuild/protobuf": "2.0.0" + }, + "peerDependenciesMeta": { + "@bufbuild/protobuf": { + "optional": true + } + } + }, + "node_modules/@bufbuild/protoplugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protoplugin/-/protoplugin-2.0.0.tgz", + "integrity": "sha512-y77IarGNbJfr5YZHQ+biO0O9B8rXicKLLOFRJu9mKr9LYE5/CLIKqonIBfkc/lggCK2YOtinjZJEYb39HymIog==", + "dev": true, + "dependencies": { + "@bufbuild/protobuf": "2.0.0", + "@typescript/vfs": "^1.5.2", + "typescript": "5.4.5" + } + }, + "node_modules/@bufbuild/protoplugin/node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@criteria/json-pointer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@criteria/json-pointer/-/json-pointer-0.2.1.tgz", + "integrity": "sha512-+UcEXcbZLkmhB4vuuuLAfnWD7cGmUGrZxzldFFdLwFKglkGuLiE4YTBX0gvEQuVHTwMN/f1R/0TB3YRzf5/BPw==", + "engines": { + "node": ">=18.12.1" + } + }, + "node_modules/@criteria/json-schema": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@criteria/json-schema/-/json-schema-0.10.0.tgz", + "integrity": "sha512-Y+gLIVPdgflQ3zeayUcfYjHOf+KJOp8dx5LWpLfy3XJ0P61JxU5srk2cGpVZYPJNTnixm8tBwb8T26DCMjw+hw==", + "dependencies": { + "@criteria/json-pointer": "^0.2.1", + "toad-uri-js": "^5.0.1" + }, + "engines": { + "node": ">=18.12.1" + } + }, + "node_modules/@criteria/json-schema-validation": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@criteria/json-schema-validation/-/json-schema-validation-0.10.0.tgz", + "integrity": "sha512-QqkO0uEAjMIEdybZPSGZEOa2HExAr83lE5ya3bRTVFMByb9sXq7JK7ZyHHAhSOWQyUN1Tgkk/sozfLygG5VOuw==", + "dependencies": { + "@criteria/json-pointer": "^0.2.1", + "@criteria/json-schema": "^0.10.0", + "fast-deep-equal": "^3.1.3", + "punycode": "^2.3.1", + "smtp-address-parser": "^1.0.10", + "toad-uri-js": "^5.0.1" + }, + "engines": { + "node": ">=18.12.1" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/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/js": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", + "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@google-cloud/kms": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@google-cloud/kms/-/kms-4.5.0.tgz", + "integrity": "sha512-i2vC0DI7bdfEhQszqASTw0KVvbB7HsO2CwTBod423NawAu7FWi+gVVa7NLfXVNGJaZZayFfci2Hu+om/HmyEjQ==", + "dependencies": { + "google-gax": "^4.0.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.1.tgz", + "integrity": "sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hackbg/miscreant-esm": { + "version": "0.3.2-patch.3", + "resolved": "https://registry.npmjs.org/@hackbg/miscreant-esm/-/miscreant-esm-0.3.2-patch.3.tgz", + "integrity": "sha512-CxWupG9uSc0e0toliMBc+ZSC2cXuHqcSgvwCgCiWXkpF6adzcttNFr6KyumI3utO/WQKQrdgq93LcQEueBjTHQ==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@bufbuild/protobuf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.0.0.tgz", - "integrity": "sha512-sw2JhwJyvyL0zlhG61aDzOVryEfJg2PDZFSV7i7IdC7nAE41WuXCru3QWLGiP87At0BMzKOoKO/FqEGoKygGZQ==" - }, - "node_modules/@bufbuild/protoc-gen-es": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protoc-gen-es/-/protoc-gen-es-2.0.0.tgz", - "integrity": "sha512-xXDrDFjSD97jGu9RMA8O4Myj66DdCLOFeYG7Z0mX1aCE9hayymfor+BKgKCQouUfty6CYv8709FPYpEtDurLFQ==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@bufbuild/protobuf": "^2.0.0", - "@bufbuild/protoplugin": "2.0.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, - "bin": { - "protoc-gen-es": "bin/protoc-gen-es" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=14" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@bufbuild/protobuf": "2.0.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "@bufbuild/protobuf": { + "node-notifier": { "optional": true } } }, - "node_modules/@bufbuild/protoplugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protoplugin/-/protoplugin-2.0.0.tgz", - "integrity": "sha512-y77IarGNbJfr5YZHQ+biO0O9B8rXicKLLOFRJu9mKr9LYE5/CLIKqonIBfkc/lggCK2YOtinjZJEYb39HymIog==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "@bufbuild/protobuf": "2.0.0", - "@typescript/vfs": "^1.5.2", - "typescript": "5.4.5" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@bufbuild/protoplugin/node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">=14.17" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@criteria/json-pointer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@criteria/json-pointer/-/json-pointer-0.2.1.tgz", - "integrity": "sha512-+UcEXcbZLkmhB4vuuuLAfnWD7cGmUGrZxzldFFdLwFKglkGuLiE4YTBX0gvEQuVHTwMN/f1R/0TB3YRzf5/BPw==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", + "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "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": ">=18.12.1" + "node": ">= 8" } }, - "node_modules/@criteria/json-schema": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@criteria/json-schema/-/json-schema-0.10.0.tgz", - "integrity": "sha512-Y+gLIVPdgflQ3zeayUcfYjHOf+KJOp8dx5LWpLfy3XJ0P61JxU5srk2cGpVZYPJNTnixm8tBwb8T26DCMjw+hw==", + "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": { - "@criteria/json-pointer": "^0.2.1", - "toad-uri-js": "^5.0.1" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=18.12.1" + "node": ">= 8" } }, - "node_modules/@criteria/json-schema-validation": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@criteria/json-schema-validation/-/json-schema-validation-0.10.0.tgz", - "integrity": "sha512-QqkO0uEAjMIEdybZPSGZEOa2HExAr83lE5ya3bRTVFMByb9sXq7JK7ZyHHAhSOWQyUN1Tgkk/sozfLygG5VOuw==", + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, "dependencies": { - "@criteria/json-pointer": "^0.2.1", - "@criteria/json-schema": "^0.10.0", - "fast-deep-equal": "^3.1.3", - "punycode": "^2.3.1", - "smtp-address-parser": "^1.0.10", - "toad-uri-js": "^5.0.1" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" }, "engines": { - "node": ">=18.12.1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, + "node_modules/@postman/form-data": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", + "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@postman/tough-cookie": { + "version": "4.1.3-postman.1", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", + "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@postman/tunnel-agent": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.4.tgz", + "integrity": "sha512-CJJlq8V7rNKhAw4sBfjixKpJW00SHqebqNUQKxMoepgeWZIbdPcD+rguRcivGhS4N12PymDcKgUgSD4rVC+RjQ==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "safe-buffer": "^5.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "*" } }, - "node_modules/@eslint/eslintrc/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/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, - "node_modules/@eslint/js": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", - "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "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/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "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/@hackbg/miscreant-esm": { - "version": "0.3.2-patch.3", - "resolved": "https://registry.npmjs.org/@hackbg/miscreant-esm/-/miscreant-esm-0.3.2-patch.3.tgz", - "integrity": "sha512-CxWupG9uSc0e0toliMBc+ZSC2cXuHqcSgvwCgCiWXkpF6adzcttNFr6KyumI3utO/WQKQrdgq93LcQEueBjTHQ==" + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, - "node_modules/@istanbuljs/load-nyc-config": { + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" + "type-detect": "4.0.8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dependencies": { - "sprintf-js": "~1.0.2" + "@sinonjs/commons": "^3.0.0" } }, - "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==", + "node_modules/@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@smithy/config-resolver": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=16.0.0" } }, - "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==", + "node_modules/@smithy/core": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.0.tgz", + "integrity": "sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==", "dependencies": { - "p-locate": "^4.1.0" + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "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==", + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", + "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", "dependencies": { - "p-try": "^2.0.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0" } }, - "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==", + "node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", "dependencies": { - "p-limit": "^2.2.0" + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "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==", + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "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/@smithy/middleware-content-length": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", + "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@smithy/middleware-retry": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz", + "integrity": "sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ==", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=16.0.0" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", "dependencies": { - "jest-get-type": "^29.6.3" + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=16.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@smithy/types": "^3.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@smithy/signature-v4": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", + "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@smithy/smithy-client": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.2.0.tgz", + "integrity": "sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw==", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" + "node_modules/@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "dependencies": { + "tslib": "^2.6.2" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@jsdoc/salty": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", - "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", - "dev": true, + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", "dependencies": { - "lodash": "^4.17.21" + "tslib": "^2.6.2" }, "engines": { - "node": ">=v12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz", + "integrity": "sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg==", "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "engines": { + "node": ">= 10.0.0" } }, - "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, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz", + "integrity": "sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">= 10.0.0" } }, - "node_modules/@nodelib/fs.stat": { + "node_modules/@smithy/util-endpoints": { "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, + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", + "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "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, + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, + "node_modules/@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, + "node_modules/@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16.0.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + "node_modules/@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "dependencies": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dependencies": { - "type-detect": "4.0.8" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, "engines": { "node": ">= 10" } @@ -1452,6 +3063,11 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==" + }, "node_modules/@types/eslint": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", @@ -1518,6 +3134,11 @@ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "node_modules/@types/markdown-it": { "version": "14.1.2", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", @@ -1535,11 +3156,35 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", - "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, "node_modules/@types/semver": { @@ -1555,6 +3200,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + }, "node_modules/@types/validator": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", @@ -2181,6 +3831,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.0.tgz", "integrity": "sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg==", + "dev": true, "dependencies": { "debug": "^4.1.1" }, @@ -2199,6 +3850,17 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "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/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", @@ -2372,6 +4034,22 @@ "node": ">=8" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", @@ -2401,6 +4079,19 @@ "node": ">=0.11" } }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", + "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==" + }, "node_modules/axios": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", @@ -2526,6 +4217,41 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "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", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -2552,6 +4278,11 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2572,6 +4303,14 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2629,6 +4368,11 @@ "node-int64": "^0.4.0" } }, + "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", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2748,6 +4492,11 @@ } ] }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -2938,6 +4687,11 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -2971,6 +4725,17 @@ "node": ">= 8" } }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", @@ -3026,6 +4791,14 @@ "node": ">=0.10.0" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3102,6 +4875,39 @@ "node": ">=6.0.0" } }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -3147,6 +4953,14 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3412,6 +5226,22 @@ "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": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -3463,6 +5293,19 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3512,6 +5355,27 @@ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -3652,6 +5516,14 @@ } } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3720,7 +5592,57 @@ "wide-align": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" } }, "node_modules/gensync": { @@ -3758,6 +5680,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3825,6 +5755,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/google-auth-library": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.14.0.tgz", + "integrity": "sha512-Y/eq+RWVs55Io/anIsm24sDS8X79Tq948zVLGaa7+KlJYYqaGwp1YI37w48nzrNi12RgnzMrQD4NzdmCowT90g==", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.9.tgz", + "integrity": "sha512-tcjQr7sXVGMdlvcG25wSv98ap1dtF4Z6mcV0rztGIddOcezw4YMb/uTXg72JPrLep+kXcVjaJjg6oo3KLf4itQ==", + "dependencies": { + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^9.3.0", + "node-fetch": "^2.7.0", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^2.0.2", + "protobufjs": "^7.3.2", + "retry-request": "^7.0.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3836,6 +5804,59 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/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==" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3884,7 +5905,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -3894,6 +5914,19 @@ "node": ">= 6" } }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -4060,6 +6093,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4140,6 +6187,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -4152,11 +6204,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -4858,6 +6926,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.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4869,6 +6945,11 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4889,6 +6970,11 @@ "node": ">= 4" } }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -4900,6 +6986,87 @@ "node": ">=6" } }, + "node_modules/jsonata": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-2.0.5.tgz", + "integrity": "sha512-wEse9+QLIIU5IaCgtJCPsFi/H4F3qcikWzF4bAELZiRz08ohfx3Q6CjDRf4ZPF5P/92RI3KIHtb7u3jqPaHXdQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4982,6 +7149,41 @@ "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": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -4994,6 +7196,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -5010,6 +7217,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/lru-cache": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", @@ -5300,11 +7512,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/miscreant": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/miscreant/-/miscreant-0.3.2.tgz", - "integrity": "sha512-fL9KxsQz9BJB2KGPMHFrReioywkiomBiuaLk6EuChijK0BsJsIKJXdVomR+/bPj5mvbFD6wM0CM3bZio9g7OHA==" - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -5452,6 +7659,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, "node_modules/nan": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", @@ -5611,6 +7826,20 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, + "node_modules/node-vault": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/node-vault/-/node-vault-0.10.2.tgz", + "integrity": "sha512-//uc9/YImE7Dx0QHdwMiAzLaOumiKUnOUP8DymgtkZ8nsq6/V2LKvEu6kw91Lcruw8lWUfj4DO7CIXNPRWBuuA==", + "dependencies": { + "debug": "^4.3.4", + "mustache": "^4.2.0", + "postman-request": "^2.88.1-postman.33", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">= 16.0.0" + } + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -5656,6 +7885,14 @@ "set-blocking": "^2.0.0" } }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5664,6 +7901,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5686,6 +7931,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5822,6 +8083,11 @@ "node": ">=8" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -5905,6 +8171,46 @@ "node": ">=8" } }, + "node_modules/postman-request": { + "version": "2.88.1-postman.39", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.39.tgz", + "integrity": "sha512-rsncxxDlbn1YpygXSgJqbJzIjGlHFcZjbYDzeBPTQHMDfLuSTzZz735JHV8i1+lOROuJ7MjNap4eaSD3UijHzQ==", + "dependencies": { + "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.3-postman.1", + "@postman/tunnel-agent": "^0.6.4", + "aws-sign2": "~0.7.0", + "aws4": "^1.12.0", + "brotli": "^1.3.3", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "har-validator": "~5.1.3", + "http-signature": "~1.3.1", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "^2.1.35", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.3", + "safe-buffer": "^5.1.2", + "stream-length": "^1.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/postman-request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5969,12 +8275,51 @@ "node": ">= 6" } }, + "node_modules/proto3-json-serializer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", + "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", + "dependencies": { + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6007,6 +8352,19 @@ } ] }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6099,6 +8457,11 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", @@ -6177,6 +8540,19 @@ "node": ">= 4" } }, + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "dependencies": { + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6247,8 +8623,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { "version": "7.6.3", @@ -6384,6 +8759,35 @@ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, "node_modules/ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", @@ -6415,6 +8819,41 @@ "node": ">=8" } }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", + "dependencies": { + "bluebird": "^2.6.2" + } + }, + "node_modules/stream-length/node_modules/bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -6486,6 +8925,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6537,6 +8986,21 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -6668,6 +9132,19 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "license": "0BSD" }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6954,9 +9431,9 @@ "dev": true }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unique-filename": { "version": "2.0.1", @@ -6982,6 +9459,14 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -7015,16 +9500,36 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -7046,6 +9551,19 @@ "node": ">= 0.10" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/package.json b/package.json index 085efcfa..b133aa13 100644 --- a/package.json +++ b/package.json @@ -32,9 +32,11 @@ }, "license": "MIT", "devDependencies": { + "@bufbuild/buf": "^1.37.0", + "@bufbuild/protoc-gen-es": "^2.0.0", "@eslint/js": "^9.9.0", "@types/eslint__js": "^8.42.3", - "@types/node": "^20.4.5", + "@types/node": "^20.16.1", "bluebird": "^3.5.3", "eslint": "^8.57.0", "eslint-plugin-jest": "^28.6.0", @@ -46,13 +48,16 @@ "typescript-eslint": "^8.2.0" }, "dependencies": { - "@bufbuild/buf": "^1.37.0", + "@aws-sdk/client-kms": "^3.637.0", + "@azure/identity": "^4.4.1", + "@azure/keyvault-keys": "^4.8.0", "@bufbuild/protobuf": "^2.0.0", - "@bufbuild/protoc-gen-es": "^2.0.0", "@criteria/json-schema": "^0.10.0", "@criteria/json-schema-validation": "^0.10.0", + "@google-cloud/kms": "^4.5.0", "@hackbg/miscreant-esm": "^0.3.2-patch.3", "@mapbox/node-pre-gyp": "^1.0.11", + "@smithy/types": "^3.3.0", "@types/validator": "^13.12.0", "ajv": "^8.17.1", "async-mutex": "^0.5.0", @@ -60,9 +65,10 @@ "axios": "^1.7.3", "bindings": "^1.3.1", "json-stringify-deterministic": "^1.0.12", + "jsonata": "^2.0.5", "lru-cache": "^11.0.0", - "miscreant": "^0.3.2", "nan": "^2.17.0", + "node-vault": "^0.10.2", "ts-jest": "^29.2.4", "validator": "^13.12.0" }, diff --git a/proto/test/schemaregistry/serde/cycle.proto b/proto/test/schemaregistry/serde/cycle.proto new file mode 100644 index 00000000..a5351102 --- /dev/null +++ b/proto/test/schemaregistry/serde/cycle.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +message LinkedList { + int32 value = 1; + LinkedList next = 10; +} \ No newline at end of file diff --git a/proto/test/schemaregistry/serde/dep.proto b/proto/test/schemaregistry/serde/dep.proto new file mode 100644 index 00000000..c0beccf9 --- /dev/null +++ b/proto/test/schemaregistry/serde/dep.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +import "test/schemaregistry/serde/test.proto"; + +message DependencyMessage { + bool is_active = 1; + TestMessage test_messsage = 2; +} diff --git a/proto/test/schemaregistry/serde/example.proto b/proto/test/schemaregistry/serde/example.proto new file mode 100644 index 00000000..a8e65fca --- /dev/null +++ b/proto/test/schemaregistry/serde/example.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +import "confluent/meta.proto"; + +message Author { + string name = 1 [ + (confluent.field_meta).tags = "PII" + ]; + int32 id = 2; + bytes picture = 3 [ + (confluent.field_meta).tags = "PII" + ]; + repeated string works = 4; +} + +message Pizza { + string size = 1; + repeated string toppings = 2; +} diff --git a/proto/test/schemaregistry/serde/nested.proto b/proto/test/schemaregistry/serde/nested.proto new file mode 100644 index 00000000..3b7ce1b5 --- /dev/null +++ b/proto/test/schemaregistry/serde/nested.proto @@ -0,0 +1,59 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +import "google/protobuf/timestamp.proto"; + +message UserId { + oneof user_id { + string kafka_user_id = 1; + int32 other_user_id = 2; + MessageId another_id = 3; + } +} + +message MessageId { + string id = 1; +} + +enum Status { + ACTIVE = 0; + INACTIVE = 1; +} + +message ComplexType { + oneof some_val { + string one_id = 1; + int32 other_id = 2; + } + bool is_active = 3; +} + +/* + * Complex message using nested protos and repeated fields + */ +message NestedMessage { + UserId user_id = 1; + bool is_active = 2; + repeated string experiments_active = 3; + google.protobuf.Timestamp updated_at = 4; + Status status = 5; + ComplexType complex_type = 6; + map map_type = 7; + InnerMessage inner = 8; + + message InnerMessage { + string id = 1 [json_name="id"]; + repeated int32 ids = 2 [packed=true]; + } + + enum InnerEnum { + option allow_alias = true; + ZERO = 0; + ALSO_ZERO = 0; + } + + reserved 14, 15, 9 to 11; + reserved "foo", "bar"; +} diff --git a/proto/test/schemaregistry/serde/newerwidget.proto b/proto/test/schemaregistry/serde/newerwidget.proto new file mode 100644 index 00000000..4243c0eb --- /dev/null +++ b/proto/test/schemaregistry/serde/newerwidget.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +message NewerWidget { + string name = 1; + int32 length = 2; + int32 version = 3; +} diff --git a/proto/test/schemaregistry/serde/newwidget.proto b/proto/test/schemaregistry/serde/newwidget.proto new file mode 100644 index 00000000..fdca7b28 --- /dev/null +++ b/proto/test/schemaregistry/serde/newwidget.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +message NewWidget { + string name = 1; + int32 height = 2; + int32 version = 3; +} diff --git a/proto/test/schemaregistry/serde/test.proto b/proto/test/schemaregistry/serde/test.proto new file mode 100644 index 00000000..28afb444 --- /dev/null +++ b/proto/test/schemaregistry/serde/test.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +import "google/protobuf/descriptor.proto"; + +message TestMessage { + string test_string = 1; + bool test_bool = 2; + bytes test_bytes = 3; + double test_double = 4; + float test_float = 5; + fixed32 test_fixed32 = 6; + fixed64 test_fixed64 = 7; + int32 test_int32 = 8; + int64 test_int64 = 9; + sfixed32 test_sfixed32 = 10; + sfixed64 test_sfixed64 = 11; + sint32 test_sint32 = 12; + sint64 test_sint64 = 13; + uint32 test_uint32 = 14; + uint64 test_uint64 = 15; +} \ No newline at end of file diff --git a/proto/test/schemaregistry/serde/widget.proto b/proto/test/schemaregistry/serde/widget.proto new file mode 100644 index 00000000..94a99c2d --- /dev/null +++ b/proto/test/schemaregistry/serde/widget.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package test; +option go_package="../test"; + +message Widget { + string name = 1; + int32 size = 2; + int32 version = 3; +} diff --git a/schemaregistry/google/type/calendar_period_pb.ts b/schemaregistry/google/type/calendar_period_pb.ts new file mode 100644 index 00000000..a8ad8988 --- /dev/null +++ b/schemaregistry/google/type/calendar_period_pb.ts @@ -0,0 +1,102 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/calendar_period.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc } from "@bufbuild/protobuf/codegenv1"; + +/** + * Describes the file google/type/calendar_period.proto. + */ +export const file_google_type_calendar_period: GenFile = /*@__PURE__*/ + fileDesc("CiFnb29nbGUvdHlwZS9jYWxlbmRhcl9wZXJpb2QucHJvdG8SC2dvb2dsZS50eXBlKn8KDkNhbGVuZGFyUGVyaW9kEh8KG0NBTEVOREFSX1BFUklPRF9VTlNQRUNJRklFRBAAEgcKA0RBWRABEggKBFdFRUsQAhINCglGT1JUTklHSFQQAxIJCgVNT05USBAEEgsKB1FVQVJURVIQBRIICgRIQUxGEAYSCAoEWUVBUhAHQngKD2NvbS5nb29nbGUudHlwZUITQ2FsZW5kYXJQZXJpb2RQcm90b1ABWkhnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvY2FsZW5kYXJwZXJpb2Q7Y2FsZW5kYXJwZXJpb2SiAgNHVFBiBnByb3RvMw"); + +/** + * A `CalendarPeriod` represents the abstract concept of a time period that has + * a canonical start. Grammatically, "the start of the current + * `CalendarPeriod`." All calendar times begin at midnight UTC. + * + * @generated from enum google.type.CalendarPeriod + */ +export enum CalendarPeriod { + /** + * Undefined period, raises an error. + * + * @generated from enum value: CALENDAR_PERIOD_UNSPECIFIED = 0; + */ + CALENDAR_PERIOD_UNSPECIFIED = 0, + + /** + * A day. + * + * @generated from enum value: DAY = 1; + */ + DAY = 1, + + /** + * A week. Weeks begin on Monday, following + * [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). + * + * @generated from enum value: WEEK = 2; + */ + WEEK = 2, + + /** + * A fortnight. The first calendar fortnight of the year begins at the start + * of week 1 according to + * [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). + * + * @generated from enum value: FORTNIGHT = 3; + */ + FORTNIGHT = 3, + + /** + * A month. + * + * @generated from enum value: MONTH = 4; + */ + MONTH = 4, + + /** + * A quarter. Quarters start on dates 1-Jan, 1-Apr, 1-Jul, and 1-Oct of each + * year. + * + * @generated from enum value: QUARTER = 5; + */ + QUARTER = 5, + + /** + * A half-year. Half-years start on dates 1-Jan and 1-Jul. + * + * @generated from enum value: HALF = 6; + */ + HALF = 6, + + /** + * A year. + * + * @generated from enum value: YEAR = 7; + */ + YEAR = 7, +} + +/** + * Describes the enum google.type.CalendarPeriod. + */ +export const CalendarPeriodSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_google_type_calendar_period, 0); + diff --git a/schemaregistry/google/type/color_pb.ts b/schemaregistry/google/type/color_pb.ts new file mode 100644 index 00000000..462d70da --- /dev/null +++ b/schemaregistry/google/type/color_pb.ts @@ -0,0 +1,204 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/color.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/color.proto. + */ +export const file_google_type_color: GenFile = /*@__PURE__*/ + fileDesc("Chdnb29nbGUvdHlwZS9jb2xvci5wcm90bxILZ29vZ2xlLnR5cGUiXQoFQ29sb3ISCwoDcmVkGAEgASgCEg0KBWdyZWVuGAIgASgCEgwKBGJsdWUYAyABKAISKgoFYWxwaGEYBCABKAsyGy5nb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZUJgCg9jb20uZ29vZ2xlLnR5cGVCCkNvbG9yUHJvdG9QAVo2Z29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy90eXBlL2NvbG9yO2NvbG9y+AEBogIDR1RQYgZwcm90bzM", [file_google_protobuf_wrappers]); + +/** + * Represents a color in the RGBA color space. This representation is designed + * for simplicity of conversion to/from color representations in various + * languages over compactness. For example, the fields of this representation + * can be trivially provided to the constructor of `java.awt.Color` in Java; it + * can also be trivially provided to UIColor's `+colorWithRed:green:blue:alpha` + * method in iOS; and, with just a little work, it can be easily formatted into + * a CSS `rgba()` string in JavaScript. + * + * This reference page doesn't carry information about the absolute color + * space + * that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, + * DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color + * space. + * + * When color equality needs to be decided, implementations, unless + * documented otherwise, treat two colors as equal if all their red, + * green, blue, and alpha values each differ by at most 1e-5. + * + * Example (Java): + * + * import com.google.type.Color; + * + * // ... + * public static java.awt.Color fromProto(Color protocolor) { + * float alpha = protocolor.hasAlpha() + * ? protocolor.getAlpha().getValue() + * : 1.0; + * + * return new java.awt.Color( + * protocolor.getRed(), + * protocolor.getGreen(), + * protocolor.getBlue(), + * alpha); + * } + * + * public static Color toProto(java.awt.Color color) { + * float red = (float) color.getRed(); + * float green = (float) color.getGreen(); + * float blue = (float) color.getBlue(); + * float denominator = 255.0; + * Color.Builder resultBuilder = + * Color + * .newBuilder() + * .setRed(red / denominator) + * .setGreen(green / denominator) + * .setBlue(blue / denominator); + * int alpha = color.getAlpha(); + * if (alpha != 255) { + * result.setAlpha( + * FloatValue + * .newBuilder() + * .setValue(((float) alpha) / denominator) + * .build()); + * } + * return resultBuilder.build(); + * } + * // ... + * + * Example (iOS / Obj-C): + * + * // ... + * static UIColor* fromProto(Color* protocolor) { + * float red = [protocolor red]; + * float green = [protocolor green]; + * float blue = [protocolor blue]; + * FloatValue* alpha_wrapper = [protocolor alpha]; + * float alpha = 1.0; + * if (alpha_wrapper != nil) { + * alpha = [alpha_wrapper value]; + * } + * return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; + * } + * + * static Color* toProto(UIColor* color) { + * CGFloat red, green, blue, alpha; + * if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) { + * return nil; + * } + * Color* result = [[Color alloc] init]; + * [result setRed:red]; + * [result setGreen:green]; + * [result setBlue:blue]; + * if (alpha <= 0.9999) { + * [result setAlpha:floatWrapperWithValue(alpha)]; + * } + * [result autorelease]; + * return result; + * } + * // ... + * + * Example (JavaScript): + * + * // ... + * + * var protoToCssColor = function(rgb_color) { + * var redFrac = rgb_color.red || 0.0; + * var greenFrac = rgb_color.green || 0.0; + * var blueFrac = rgb_color.blue || 0.0; + * var red = Math.floor(redFrac * 255); + * var green = Math.floor(greenFrac * 255); + * var blue = Math.floor(blueFrac * 255); + * + * if (!('alpha' in rgb_color)) { + * return rgbToCssColor(red, green, blue); + * } + * + * var alphaFrac = rgb_color.alpha.value || 0.0; + * var rgbParams = [red, green, blue].join(','); + * return ['rgba(', rgbParams, ',', alphaFrac, ')'].join(''); + * }; + * + * var rgbToCssColor = function(red, green, blue) { + * var rgbNumber = new Number((red << 16) | (green << 8) | blue); + * var hexString = rgbNumber.toString(16); + * var missingZeros = 6 - hexString.length; + * var resultBuilder = ['#']; + * for (var i = 0; i < missingZeros; i++) { + * resultBuilder.push('0'); + * } + * resultBuilder.push(hexString); + * return resultBuilder.join(''); + * }; + * + * // ... + * + * @generated from message google.type.Color + */ +export type Color = Message<"google.type.Color"> & { + /** + * The amount of red in the color as a value in the interval [0, 1]. + * + * @generated from field: float red = 1; + */ + red: number; + + /** + * The amount of green in the color as a value in the interval [0, 1]. + * + * @generated from field: float green = 2; + */ + green: number; + + /** + * The amount of blue in the color as a value in the interval [0, 1]. + * + * @generated from field: float blue = 3; + */ + blue: number; + + /** + * The fraction of this color that should be applied to the pixel. That is, + * the final pixel color is defined by the equation: + * + * `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + * + * This means that a value of 1.0 corresponds to a solid color, whereas + * a value of 0.0 corresponds to a completely transparent color. This + * uses a wrapper message rather than a simple float scalar so that it is + * possible to distinguish between a default value and the value being unset. + * If omitted, this color object is rendered as a solid color + * (as if the alpha value had been explicitly given a value of 1.0). + * + * @generated from field: google.protobuf.FloatValue alpha = 4; + */ + alpha?: number; +}; + +/** + * Describes the message google.type.Color. + * Use `create(ColorSchema)` to create a new message. + */ +export const ColorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_color, 0); + diff --git a/schemaregistry/google/type/date_pb.ts b/schemaregistry/google/type/date_pb.ts new file mode 100644 index 00000000..eaf34962 --- /dev/null +++ b/schemaregistry/google/type/date_pb.ts @@ -0,0 +1,79 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/date.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/date.proto. + */ +export const file_google_type_date: GenFile = /*@__PURE__*/ + fileDesc("ChZnb29nbGUvdHlwZS9kYXRlLnByb3RvEgtnb29nbGUudHlwZSIwCgREYXRlEgwKBHllYXIYASABKAUSDQoFbW9udGgYAiABKAUSCwoDZGF5GAMgASgFQl0KD2NvbS5nb29nbGUudHlwZUIJRGF0ZVByb3RvUAFaNGdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvdHlwZS9kYXRlO2RhdGX4AQGiAgNHVFBiBnByb3RvMw"); + +/** + * Represents a whole or partial calendar date, such as a birthday. The time of + * day and time zone are either specified elsewhere or are insignificant. The + * date is relative to the Gregorian Calendar. This can represent one of the + * following: + * + * * A full date, with non-zero year, month, and day values + * * A month and day value, with a zero year, such as an anniversary + * * A year on its own, with zero month and day values + * * A year and month value, with a zero day, such as a credit card expiration + * date + * + * Related types are [google.type.TimeOfDay][google.type.TimeOfDay] and + * `google.protobuf.Timestamp`. + * + * @generated from message google.type.Date + */ +export type Date = Message<"google.type.Date"> & { + /** + * Year of the date. Must be from 1 to 9999, or 0 to specify a date without + * a year. + * + * @generated from field: int32 year = 1; + */ + year: number; + + /** + * Month of a year. Must be from 1 to 12, or 0 to specify a year without a + * month and day. + * + * @generated from field: int32 month = 2; + */ + month: number; + + /** + * Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 + * to specify a year by itself or a year and month where the day isn't + * significant. + * + * @generated from field: int32 day = 3; + */ + day: number; +}; + +/** + * Describes the message google.type.Date. + * Use `create(DateSchema)` to create a new message. + */ +export const DateSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_date, 0); + diff --git a/schemaregistry/google/type/datetime_pb.ts b/schemaregistry/google/type/datetime_pb.ts new file mode 100644 index 00000000..511b0859 --- /dev/null +++ b/schemaregistry/google/type/datetime_pb.ts @@ -0,0 +1,180 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/datetime.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Duration } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_duration } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/datetime.proto. + */ +export const file_google_type_datetime: GenFile = /*@__PURE__*/ + fileDesc("Chpnb29nbGUvdHlwZS9kYXRldGltZS5wcm90bxILZ29vZ2xlLnR5cGUi4AEKCERhdGVUaW1lEgwKBHllYXIYASABKAUSDQoFbW9udGgYAiABKAUSCwoDZGF5GAMgASgFEg0KBWhvdXJzGAQgASgFEg8KB21pbnV0ZXMYBSABKAUSDwoHc2Vjb25kcxgGIAEoBRINCgVuYW5vcxgHIAEoBRIvCgp1dGNfb2Zmc2V0GAggASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uSAASKgoJdGltZV96b25lGAkgASgLMhUuZ29vZ2xlLnR5cGUuVGltZVpvbmVIAEINCgt0aW1lX29mZnNldCInCghUaW1lWm9uZRIKCgJpZBgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJQmkKD2NvbS5nb29nbGUudHlwZUINRGF0ZVRpbWVQcm90b1ABWjxnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvZGF0ZXRpbWU7ZGF0ZXRpbWX4AQGiAgNHVFBiBnByb3RvMw", [file_google_protobuf_duration]); + +/** + * Represents civil time (or occasionally physical time). + * + * This type can represent a civil time in one of a few possible ways: + * + * * When utc_offset is set and time_zone is unset: a civil time on a calendar + * day with a particular offset from UTC. + * * When time_zone is set and utc_offset is unset: a civil time on a calendar + * day in a particular time zone. + * * When neither time_zone nor utc_offset is set: a civil time on a calendar + * day in local time. + * + * The date is relative to the Proleptic Gregorian Calendar. + * + * If year is 0, the DateTime is considered not to have a specific year. month + * and day must have valid, non-zero values. + * + * This type may also be used to represent a physical time if all the date and + * time fields are set and either case of the `time_offset` oneof is set. + * Consider using `Timestamp` message for physical time instead. If your use + * case also would like to store the user's timezone, that can be done in + * another field. + * + * This type is more flexible than some applications may want. Make sure to + * document and validate your application's limitations. + * + * @generated from message google.type.DateTime + */ +export type DateTime = Message<"google.type.DateTime"> & { + /** + * Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + * datetime without a year. + * + * @generated from field: int32 year = 1; + */ + year: number; + + /** + * Required. Month of year. Must be from 1 to 12. + * + * @generated from field: int32 month = 2; + */ + month: number; + + /** + * Required. Day of month. Must be from 1 to 31 and valid for the year and + * month. + * + * @generated from field: int32 day = 3; + */ + day: number; + + /** + * Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + * may choose to allow the value "24:00:00" for scenarios like business + * closing time. + * + * @generated from field: int32 hours = 4; + */ + hours: number; + + /** + * Required. Minutes of hour of day. Must be from 0 to 59. + * + * @generated from field: int32 minutes = 5; + */ + minutes: number; + + /** + * Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + * API may allow the value 60 if it allows leap-seconds. + * + * @generated from field: int32 seconds = 6; + */ + seconds: number; + + /** + * Required. Fractions of seconds in nanoseconds. Must be from 0 to + * 999,999,999. + * + * @generated from field: int32 nanos = 7; + */ + nanos: number; + + /** + * Optional. Specifies either the UTC offset or the time zone of the DateTime. + * Choose carefully between them, considering that time zone data may change + * in the future (for example, a country modifies their DST start/end dates, + * and future DateTimes in the affected range had already been stored). + * If omitted, the DateTime is considered to be in local time. + * + * @generated from oneof google.type.DateTime.time_offset + */ + timeOffset: { + /** + * UTC offset. Must be whole seconds, between -18 hours and +18 hours. + * For example, a UTC offset of -4:00 would be represented as + * { seconds: -14400 }. + * + * @generated from field: google.protobuf.Duration utc_offset = 8; + */ + value: Duration; + case: "utcOffset"; + } | { + /** + * Time zone. + * + * @generated from field: google.type.TimeZone time_zone = 9; + */ + value: TimeZone; + case: "timeZone"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message google.type.DateTime. + * Use `create(DateTimeSchema)` to create a new message. + */ +export const DateTimeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_datetime, 0); + +/** + * Represents a time zone from the + * [IANA Time Zone Database](https://www.iana.org/time-zones). + * + * @generated from message google.type.TimeZone + */ +export type TimeZone = Message<"google.type.TimeZone"> & { + /** + * IANA Time Zone Database time zone, e.g. "America/New_York". + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * Optional. IANA Time Zone Database version number, e.g. "2019a". + * + * @generated from field: string version = 2; + */ + version: string; +}; + +/** + * Describes the message google.type.TimeZone. + * Use `create(TimeZoneSchema)` to create a new message. + */ +export const TimeZoneSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_datetime, 1); + diff --git a/schemaregistry/google/type/dayofweek_pb.ts b/schemaregistry/google/type/dayofweek_pb.ts new file mode 100644 index 00000000..8932990c --- /dev/null +++ b/schemaregistry/google/type/dayofweek_pb.ts @@ -0,0 +1,96 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/dayofweek.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc } from "@bufbuild/protobuf/codegenv1"; + +/** + * Describes the file google/type/dayofweek.proto. + */ +export const file_google_type_dayofweek: GenFile = /*@__PURE__*/ + fileDesc("Chtnb29nbGUvdHlwZS9kYXlvZndlZWsucHJvdG8SC2dvb2dsZS50eXBlKoQBCglEYXlPZldlZWsSGwoXREFZX09GX1dFRUtfVU5TUEVDSUZJRUQQABIKCgZNT05EQVkQARILCgdUVUVTREFZEAISDQoJV0VETkVTREFZEAMSDAoIVEhVUlNEQVkQBBIKCgZGUklEQVkQBRIMCghTQVRVUkRBWRAGEgoKBlNVTkRBWRAHQmkKD2NvbS5nb29nbGUudHlwZUIORGF5T2ZXZWVrUHJvdG9QAVo+Z29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy90eXBlL2RheW9md2VlaztkYXlvZndlZWuiAgNHVFBiBnByb3RvMw"); + +/** + * Represents a day of the week. + * + * @generated from enum google.type.DayOfWeek + */ +export enum DayOfWeek { + /** + * The day of the week is unspecified. + * + * @generated from enum value: DAY_OF_WEEK_UNSPECIFIED = 0; + */ + DAY_OF_WEEK_UNSPECIFIED = 0, + + /** + * Monday + * + * @generated from enum value: MONDAY = 1; + */ + MONDAY = 1, + + /** + * Tuesday + * + * @generated from enum value: TUESDAY = 2; + */ + TUESDAY = 2, + + /** + * Wednesday + * + * @generated from enum value: WEDNESDAY = 3; + */ + WEDNESDAY = 3, + + /** + * Thursday + * + * @generated from enum value: THURSDAY = 4; + */ + THURSDAY = 4, + + /** + * Friday + * + * @generated from enum value: FRIDAY = 5; + */ + FRIDAY = 5, + + /** + * Saturday + * + * @generated from enum value: SATURDAY = 6; + */ + SATURDAY = 6, + + /** + * Sunday + * + * @generated from enum value: SUNDAY = 7; + */ + SUNDAY = 7, +} + +/** + * Describes the enum google.type.DayOfWeek. + */ +export const DayOfWeekSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_google_type_dayofweek, 0); + diff --git a/schemaregistry/google/type/decimal_pb.ts b/schemaregistry/google/type/decimal_pb.ts new file mode 100644 index 00000000..f3c65377 --- /dev/null +++ b/schemaregistry/google/type/decimal_pb.ts @@ -0,0 +1,114 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/decimal.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/decimal.proto. + */ +export const file_google_type_decimal: GenFile = /*@__PURE__*/ + fileDesc("Chlnb29nbGUvdHlwZS9kZWNpbWFsLnByb3RvEgtnb29nbGUudHlwZSIYCgdEZWNpbWFsEg0KBXZhbHVlGAEgASgJQmYKD2NvbS5nb29nbGUudHlwZUIMRGVjaW1hbFByb3RvUAFaOmdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvdHlwZS9kZWNpbWFsO2RlY2ltYWz4AQGiAgNHVFBiBnByb3RvMw"); + +/** + * A representation of a decimal value, such as 2.5. Clients may convert values + * into language-native decimal formats, such as Java's [BigDecimal][] or + * Python's [decimal.Decimal][]. + * + * [BigDecimal]: + * https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html + * [decimal.Decimal]: https://docs.python.org/3/library/decimal.html + * + * @generated from message google.type.Decimal + */ +export type Decimal = Message<"google.type.Decimal"> & { + /** + * The decimal value, as a string. + * + * The string representation consists of an optional sign, `+` (`U+002B`) + * or `-` (`U+002D`), followed by a sequence of zero or more decimal digits + * ("the integer"), optionally followed by a fraction, optionally followed + * by an exponent. + * + * The fraction consists of a decimal point followed by zero or more decimal + * digits. The string must contain at least one digit in either the integer + * or the fraction. The number formed by the sign, the integer and the + * fraction is referred to as the significand. + * + * The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`) + * followed by one or more decimal digits. + * + * Services **should** normalize decimal values before storing them by: + * + * - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`). + * - Replacing a zero-length integer value with `0` (`.5` -> `0.5`). + * - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`). + * - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`). + * + * Services **may** perform additional normalization based on its own needs + * and the internal decimal implementation selected, such as shifting the + * decimal point and exponent value together (example: `2.5e-1` <-> `0.25`). + * Additionally, services **may** preserve trailing zeroes in the fraction + * to indicate increased precision, but are not required to do so. + * + * Note that only the `.` character is supported to divide the integer + * and the fraction; `,` **should not** be supported regardless of locale. + * Additionally, thousand separators **should not** be supported. If a + * service does support them, values **must** be normalized. + * + * The ENBF grammar is: + * + * DecimalString = + * [Sign] Significand [Exponent]; + * + * Sign = '+' | '-'; + * + * Significand = + * Digits ['.'] [Digits] | [Digits] '.' Digits; + * + * Exponent = ('e' | 'E') [Sign] Digits; + * + * Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' }; + * + * Services **should** clearly document the range of supported values, the + * maximum supported precision (total number of digits), and, if applicable, + * the scale (number of digits after the decimal point), as well as how it + * behaves when receiving out-of-bounds values. + * + * Services **may** choose to accept values passed as input even when the + * value has a higher precision or scale than the service supports, and + * **should** round the value to fit the supported scale. Alternatively, the + * service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) + * if precision would be lost. + * + * Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in + * gRPC) if the service receives a value outside of the supported range. + * + * @generated from field: string value = 1; + */ + value: string; +}; + +/** + * Describes the message google.type.Decimal. + * Use `create(DecimalSchema)` to create a new message. + */ +export const DecimalSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_decimal, 0); + diff --git a/schemaregistry/google/type/expr_pb.ts b/schemaregistry/google/type/expr_pb.ts new file mode 100644 index 00000000..a4dd114b --- /dev/null +++ b/schemaregistry/google/type/expr_pb.ts @@ -0,0 +1,105 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/expr.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/expr.proto. + */ +export const file_google_type_expr: GenFile = /*@__PURE__*/ + fileDesc("ChZnb29nbGUvdHlwZS9leHByLnByb3RvEgtnb29nbGUudHlwZSJQCgRFeHByEhIKCmV4cHJlc3Npb24YASABKAkSDQoFdGl0bGUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIbG9jYXRpb24YBCABKAlCWgoPY29tLmdvb2dsZS50eXBlQglFeHByUHJvdG9QAVo0Z29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy90eXBlL2V4cHI7ZXhwcqICA0dUUGIGcHJvdG8z"); + +/** + * Represents a textual expression in the Common Expression Language (CEL) + * syntax. CEL is a C-like expression language. The syntax and semantics of CEL + * are documented at https://github.com/google/cel-spec. + * + * Example (Comparison): + * + * title: "Summary size limit" + * description: "Determines if a summary is less than 100 chars" + * expression: "document.summary.size() < 100" + * + * Example (Equality): + * + * title: "Requestor is owner" + * description: "Determines if requestor is the document owner" + * expression: "document.owner == request.auth.claims.email" + * + * Example (Logic): + * + * title: "Public documents" + * description: "Determine whether the document should be publicly visible" + * expression: "document.type != 'private' && document.type != 'internal'" + * + * Example (Data Manipulation): + * + * title: "Notification string" + * description: "Create a notification string with a timestamp." + * expression: "'New message received at ' + string(document.create_time)" + * + * The exact variables and functions that may be referenced within an expression + * are determined by the service that evaluates it. See the service + * documentation for additional information. + * + * @generated from message google.type.Expr + */ +export type Expr = Message<"google.type.Expr"> & { + /** + * Textual representation of an expression in Common Expression Language + * syntax. + * + * @generated from field: string expression = 1; + */ + expression: string; + + /** + * Optional. Title for the expression, i.e. a short string describing + * its purpose. This can be used e.g. in UIs which allow to enter the + * expression. + * + * @generated from field: string title = 2; + */ + title: string; + + /** + * Optional. Description of the expression. This is a longer text which + * describes the expression, e.g. when hovered over it in a UI. + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Optional. String indicating the location of the expression for error + * reporting, e.g. a file name and a position in the file. + * + * @generated from field: string location = 4; + */ + location: string; +}; + +/** + * Describes the message google.type.Expr. + * Use `create(ExprSchema)` to create a new message. + */ +export const ExprSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_expr, 0); + diff --git a/schemaregistry/google/type/fraction_pb.ts b/schemaregistry/google/type/fraction_pb.ts new file mode 100644 index 00000000..2d180530 --- /dev/null +++ b/schemaregistry/google/type/fraction_pb.ts @@ -0,0 +1,57 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/fraction.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/fraction.proto. + */ +export const file_google_type_fraction: GenFile = /*@__PURE__*/ + fileDesc("Chpnb29nbGUvdHlwZS9mcmFjdGlvbi5wcm90bxILZ29vZ2xlLnR5cGUiMgoIRnJhY3Rpb24SEQoJbnVtZXJhdG9yGAEgASgDEhMKC2Rlbm9taW5hdG9yGAIgASgDQmYKD2NvbS5nb29nbGUudHlwZUINRnJhY3Rpb25Qcm90b1ABWjxnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvZnJhY3Rpb247ZnJhY3Rpb26iAgNHVFBiBnByb3RvMw"); + +/** + * Represents a fraction in terms of a numerator divided by a denominator. + * + * @generated from message google.type.Fraction + */ +export type Fraction = Message<"google.type.Fraction"> & { + /** + * The numerator in the fraction, e.g. 2 in 2/3. + * + * @generated from field: int64 numerator = 1; + */ + numerator: bigint; + + /** + * The value by which the numerator is divided, e.g. 3 in 2/3. Must be + * positive. + * + * @generated from field: int64 denominator = 2; + */ + denominator: bigint; +}; + +/** + * Describes the message google.type.Fraction. + * Use `create(FractionSchema)` to create a new message. + */ +export const FractionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_fraction, 0); + diff --git a/schemaregistry/google/type/interval_pb.ts b/schemaregistry/google/type/interval_pb.ts new file mode 100644 index 00000000..ae5ffa96 --- /dev/null +++ b/schemaregistry/google/type/interval_pb.ts @@ -0,0 +1,69 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/interval.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/interval.proto. + */ +export const file_google_type_interval: GenFile = /*@__PURE__*/ + fileDesc("Chpnb29nbGUvdHlwZS9pbnRlcnZhbC5wcm90bxILZ29vZ2xlLnR5cGUiaAoISW50ZXJ2YWwSLgoKc3RhcnRfdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLAoIZW5kX3RpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQmkKD2NvbS5nb29nbGUudHlwZUINSW50ZXJ2YWxQcm90b1ABWjxnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvaW50ZXJ2YWw7aW50ZXJ2YWz4AQGiAgNHVFBiBnByb3RvMw", [file_google_protobuf_timestamp]); + +/** + * Represents a time interval, encoded as a Timestamp start (inclusive) and a + * Timestamp end (exclusive). + * + * The start must be less than or equal to the end. + * When the start equals the end, the interval is empty (matches no time). + * When both start and end are unspecified, the interval matches any time. + * + * @generated from message google.type.Interval + */ +export type Interval = Message<"google.type.Interval"> & { + /** + * Optional. Inclusive start of the interval. + * + * If specified, a Timestamp matching this interval will have to be the same + * or after the start. + * + * @generated from field: google.protobuf.Timestamp start_time = 1; + */ + startTime?: Timestamp; + + /** + * Optional. Exclusive end of the interval. + * + * If specified, a Timestamp matching this interval will have to be before the + * end. + * + * @generated from field: google.protobuf.Timestamp end_time = 2; + */ + endTime?: Timestamp; +}; + +/** + * Describes the message google.type.Interval. + * Use `create(IntervalSchema)` to create a new message. + */ +export const IntervalSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_interval, 0); + diff --git a/schemaregistry/google/type/latlng_pb.ts b/schemaregistry/google/type/latlng_pb.ts new file mode 100644 index 00000000..41c99c15 --- /dev/null +++ b/schemaregistry/google/type/latlng_pb.ts @@ -0,0 +1,60 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/latlng.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/latlng.proto. + */ +export const file_google_type_latlng: GenFile = /*@__PURE__*/ + fileDesc("Chhnb29nbGUvdHlwZS9sYXRsbmcucHJvdG8SC2dvb2dsZS50eXBlIi0KBkxhdExuZxIQCghsYXRpdHVkZRgBIAEoARIRCglsb25naXR1ZGUYAiABKAFCYwoPY29tLmdvb2dsZS50eXBlQgtMYXRMbmdQcm90b1ABWjhnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvbGF0bG5nO2xhdGxuZ/gBAaICA0dUUGIGcHJvdG8z"); + +/** + * An object that represents a latitude/longitude pair. This is expressed as a + * pair of doubles to represent degrees latitude and degrees longitude. Unless + * specified otherwise, this must conform to the + * WGS84 + * standard. Values must be within normalized ranges. + * + * @generated from message google.type.LatLng + */ +export type LatLng = Message<"google.type.LatLng"> & { + /** + * The latitude in degrees. It must be in the range [-90.0, +90.0]. + * + * @generated from field: double latitude = 1; + */ + latitude: number; + + /** + * The longitude in degrees. It must be in the range [-180.0, +180.0]. + * + * @generated from field: double longitude = 2; + */ + longitude: number; +}; + +/** + * Describes the message google.type.LatLng. + * Use `create(LatLngSchema)` to create a new message. + */ +export const LatLngSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_latlng, 0); + diff --git a/schemaregistry/google/type/localized_text_pb.ts b/schemaregistry/google/type/localized_text_pb.ts new file mode 100644 index 00000000..80235333 --- /dev/null +++ b/schemaregistry/google/type/localized_text_pb.ts @@ -0,0 +1,59 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/localized_text.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/localized_text.proto. + */ +export const file_google_type_localized_text: GenFile = /*@__PURE__*/ + fileDesc("CiBnb29nbGUvdHlwZS9sb2NhbGl6ZWRfdGV4dC5wcm90bxILZ29vZ2xlLnR5cGUiNAoNTG9jYWxpemVkVGV4dBIMCgR0ZXh0GAEgASgJEhUKDWxhbmd1YWdlX2NvZGUYAiABKAlCegoPY29tLmdvb2dsZS50eXBlQhJMb2NhbGl6ZWRUZXh0UHJvdG9QAVpIZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy90eXBlL2xvY2FsaXplZF90ZXh0O2xvY2FsaXplZF90ZXh0+AEBogIDR1RQYgZwcm90bzM"); + +/** + * Localized variant of a text in a particular language. + * + * @generated from message google.type.LocalizedText + */ +export type LocalizedText = Message<"google.type.LocalizedText"> & { + /** + * Localized string in the language corresponding to `language_code' below. + * + * @generated from field: string text = 1; + */ + text: string; + + /** + * The text's BCP-47 language code, such as "en-US" or "sr-Latn". + * + * For more information, see + * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. + * + * @generated from field: string language_code = 2; + */ + languageCode: string; +}; + +/** + * Describes the message google.type.LocalizedText. + * Use `create(LocalizedTextSchema)` to create a new message. + */ +export const LocalizedTextSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_localized_text, 0); + diff --git a/schemaregistry/google/type/money_pb.ts b/schemaregistry/google/type/money_pb.ts new file mode 100644 index 00000000..de6bd31d --- /dev/null +++ b/schemaregistry/google/type/money_pb.ts @@ -0,0 +1,69 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/money.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/money.proto. + */ +export const file_google_type_money: GenFile = /*@__PURE__*/ + fileDesc("Chdnb29nbGUvdHlwZS9tb25leS5wcm90bxILZ29vZ2xlLnR5cGUiPAoFTW9uZXkSFQoNY3VycmVuY3lfY29kZRgBIAEoCRINCgV1bml0cxgCIAEoAxINCgVuYW5vcxgDIAEoBUJgCg9jb20uZ29vZ2xlLnR5cGVCCk1vbmV5UHJvdG9QAVo2Z29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy90eXBlL21vbmV5O21vbmV5+AEBogIDR1RQYgZwcm90bzM"); + +/** + * Represents an amount of money with its currency type. + * + * @generated from message google.type.Money + */ +export type Money = Message<"google.type.Money"> & { + /** + * The three-letter currency code defined in ISO 4217. + * + * @generated from field: string currency_code = 1; + */ + currencyCode: string; + + /** + * The whole units of the amount. + * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar. + * + * @generated from field: int64 units = 2; + */ + units: bigint; + + /** + * Number of nano (10^-9) units of the amount. + * The value must be between -999,999,999 and +999,999,999 inclusive. + * If `units` is positive, `nanos` must be positive or zero. + * If `units` is zero, `nanos` can be positive, zero, or negative. + * If `units` is negative, `nanos` must be negative or zero. + * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000. + * + * @generated from field: int32 nanos = 3; + */ + nanos: number; +}; + +/** + * Describes the message google.type.Money. + * Use `create(MoneySchema)` to create a new message. + */ +export const MoneySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_money, 0); + diff --git a/schemaregistry/google/type/month_pb.ts b/schemaregistry/google/type/month_pb.ts new file mode 100644 index 00000000..072f60b1 --- /dev/null +++ b/schemaregistry/google/type/month_pb.ts @@ -0,0 +1,131 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/month.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc } from "@bufbuild/protobuf/codegenv1"; + +/** + * Describes the file google/type/month.proto. + */ +export const file_google_type_month: GenFile = /*@__PURE__*/ + fileDesc("Chdnb29nbGUvdHlwZS9tb250aC5wcm90bxILZ29vZ2xlLnR5cGUqsAEKBU1vbnRoEhUKEU1PTlRIX1VOU1BFQ0lGSUVEEAASCwoHSkFOVUFSWRABEgwKCEZFQlJVQVJZEAISCQoFTUFSQ0gQAxIJCgVBUFJJTBAEEgcKA01BWRAFEggKBEpVTkUQBhIICgRKVUxZEAcSCgoGQVVHVVNUEAgSDQoJU0VQVEVNQkVSEAkSCwoHT0NUT0JFUhAKEgwKCE5PVkVNQkVSEAsSDAoIREVDRU1CRVIQDEJdCg9jb20uZ29vZ2xlLnR5cGVCCk1vbnRoUHJvdG9QAVo2Z29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy90eXBlL21vbnRoO21vbnRoogIDR1RQYgZwcm90bzM"); + +/** + * Represents a month in the Gregorian calendar. + * + * @generated from enum google.type.Month + */ +export enum Month { + /** + * The unspecified month. + * + * @generated from enum value: MONTH_UNSPECIFIED = 0; + */ + MONTH_UNSPECIFIED = 0, + + /** + * The month of January. + * + * @generated from enum value: JANUARY = 1; + */ + JANUARY = 1, + + /** + * The month of February. + * + * @generated from enum value: FEBRUARY = 2; + */ + FEBRUARY = 2, + + /** + * The month of March. + * + * @generated from enum value: MARCH = 3; + */ + MARCH = 3, + + /** + * The month of April. + * + * @generated from enum value: APRIL = 4; + */ + APRIL = 4, + + /** + * The month of May. + * + * @generated from enum value: MAY = 5; + */ + MAY = 5, + + /** + * The month of June. + * + * @generated from enum value: JUNE = 6; + */ + JUNE = 6, + + /** + * The month of July. + * + * @generated from enum value: JULY = 7; + */ + JULY = 7, + + /** + * The month of August. + * + * @generated from enum value: AUGUST = 8; + */ + AUGUST = 8, + + /** + * The month of September. + * + * @generated from enum value: SEPTEMBER = 9; + */ + SEPTEMBER = 9, + + /** + * The month of October. + * + * @generated from enum value: OCTOBER = 10; + */ + OCTOBER = 10, + + /** + * The month of November. + * + * @generated from enum value: NOVEMBER = 11; + */ + NOVEMBER = 11, + + /** + * The month of December. + * + * @generated from enum value: DECEMBER = 12; + */ + DECEMBER = 12, +} + +/** + * Describes the enum google.type.Month. + */ +export const MonthSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_google_type_month, 0); + diff --git a/schemaregistry/google/type/phone_number_pb.ts b/schemaregistry/google/type/phone_number_pb.ts new file mode 100644 index 00000000..f11e0e54 --- /dev/null +++ b/schemaregistry/google/type/phone_number_pb.ts @@ -0,0 +1,165 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/phone_number.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/phone_number.proto. + */ +export const file_google_type_phone_number: GenFile = /*@__PURE__*/ + fileDesc("Ch5nb29nbGUvdHlwZS9waG9uZV9udW1iZXIucHJvdG8SC2dvb2dsZS50eXBlIqsBCgtQaG9uZU51bWJlchIVCgtlMTY0X251bWJlchgBIAEoCUgAEjgKCnNob3J0X2NvZGUYAiABKAsyIi5nb29nbGUudHlwZS5QaG9uZU51bWJlci5TaG9ydENvZGVIABIRCglleHRlbnNpb24YAyABKAkaMAoJU2hvcnRDb2RlEhMKC3JlZ2lvbl9jb2RlGAEgASgJEg4KBm51bWJlchgCIAEoCUIGCgRraW5kQnQKD2NvbS5nb29nbGUudHlwZUIQUGhvbmVOdW1iZXJQcm90b1ABWkRnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvcGhvbmVfbnVtYmVyO3Bob25lX251bWJlcvgBAaICA0dUUGIGcHJvdG8z"); + +/** + * An object representing a phone number, suitable as an API wire format. + * + * This representation: + * + * - should not be used for locale-specific formatting of a phone number, such + * as "+1 (650) 253-0000 ext. 123" + * + * - is not designed for efficient storage + * - may not be suitable for dialing - specialized libraries (see references) + * should be used to parse the number for that purpose + * + * To do something meaningful with this number, such as format it for various + * use-cases, convert it to an `i18n.phonenumbers.PhoneNumber` object first. + * + * For instance, in Java this would be: + * + * com.google.type.PhoneNumber wireProto = + * com.google.type.PhoneNumber.newBuilder().build(); + * com.google.i18n.phonenumbers.Phonenumber.PhoneNumber phoneNumber = + * PhoneNumberUtil.getInstance().parse(wireProto.getE164Number(), "ZZ"); + * if (!wireProto.getExtension().isEmpty()) { + * phoneNumber.setExtension(wireProto.getExtension()); + * } + * + * Reference(s): + * - https://github.com/google/libphonenumber + * + * @generated from message google.type.PhoneNumber + */ +export type PhoneNumber = Message<"google.type.PhoneNumber"> & { + /** + * Required. Either a regular number, or a short code. New fields may be + * added to the oneof below in the future, so clients should ignore phone + * numbers for which none of the fields they coded against are set. + * + * @generated from oneof google.type.PhoneNumber.kind + */ + kind: { + /** + * The phone number, represented as a leading plus sign ('+'), followed by a + * phone number that uses a relaxed ITU E.164 format consisting of the + * country calling code (1 to 3 digits) and the subscriber number, with no + * additional spaces or formatting, e.g.: + * - correct: "+15552220123" + * - incorrect: "+1 (555) 222-01234 x123". + * + * The ITU E.164 format limits the latter to 12 digits, but in practice not + * all countries respect that, so we relax that restriction here. + * National-only numbers are not allowed. + * + * References: + * - https://www.itu.int/rec/T-REC-E.164-201011-I + * - https://en.wikipedia.org/wiki/E.164. + * - https://en.wikipedia.org/wiki/List_of_country_calling_codes + * + * @generated from field: string e164_number = 1; + */ + value: string; + case: "e164Number"; + } | { + /** + * A short code. + * + * Reference(s): + * - https://en.wikipedia.org/wiki/Short_code + * + * @generated from field: google.type.PhoneNumber.ShortCode short_code = 2; + */ + value: PhoneNumber_ShortCode; + case: "shortCode"; + } | { case: undefined; value?: undefined }; + + /** + * The phone number's extension. The extension is not standardized in ITU + * recommendations, except for being defined as a series of numbers with a + * maximum length of 40 digits. Other than digits, some other dialing + * characters such as ',' (indicating a wait) or '#' may be stored here. + * + * Note that no regions currently use extensions with short codes, so this + * field is normally only set in conjunction with an E.164 number. It is held + * separately from the E.164 number to allow for short code extensions in the + * future. + * + * @generated from field: string extension = 3; + */ + extension: string; +}; + +/** + * Describes the message google.type.PhoneNumber. + * Use `create(PhoneNumberSchema)` to create a new message. + */ +export const PhoneNumberSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_phone_number, 0); + +/** + * An object representing a short code, which is a phone number that is + * typically much shorter than regular phone numbers and can be used to + * address messages in MMS and SMS systems, as well as for abbreviated dialing + * (e.g. "Text 611 to see how many minutes you have remaining on your plan."). + * + * Short codes are restricted to a region and are not internationally + * dialable, which means the same short code can exist in different regions, + * with different usage and pricing, even if those regions share the same + * country calling code (e.g. US and CA). + * + * @generated from message google.type.PhoneNumber.ShortCode + */ +export type PhoneNumber_ShortCode = Message<"google.type.PhoneNumber.ShortCode"> & { + /** + * Required. The BCP-47 region code of the location where calls to this + * short code can be made, such as "US" and "BB". + * + * Reference(s): + * - http://www.unicode.org/reports/tr35/#unicode_region_subtag + * + * @generated from field: string region_code = 1; + */ + regionCode: string; + + /** + * Required. The short code digits, without a leading plus ('+') or country + * calling code, e.g. "611". + * + * @generated from field: string number = 2; + */ + number: string; +}; + +/** + * Describes the message google.type.PhoneNumber.ShortCode. + * Use `create(PhoneNumber_ShortCodeSchema)` to create a new message. + */ +export const PhoneNumber_ShortCodeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_phone_number, 0, 0); + diff --git a/schemaregistry/google/type/postal_address_pb.ts b/schemaregistry/google/type/postal_address_pb.ts new file mode 100644 index 00000000..2bde15eb --- /dev/null +++ b/schemaregistry/google/type/postal_address_pb.ts @@ -0,0 +1,193 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/postal_address.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/postal_address.proto. + */ +export const file_google_type_postal_address: GenFile = /*@__PURE__*/ + fileDesc("CiBnb29nbGUvdHlwZS9wb3N0YWxfYWRkcmVzcy5wcm90bxILZ29vZ2xlLnR5cGUi/QEKDVBvc3RhbEFkZHJlc3MSEAoIcmV2aXNpb24YASABKAUSEwoLcmVnaW9uX2NvZGUYAiABKAkSFQoNbGFuZ3VhZ2VfY29kZRgDIAEoCRITCgtwb3N0YWxfY29kZRgEIAEoCRIUCgxzb3J0aW5nX2NvZGUYBSABKAkSGwoTYWRtaW5pc3RyYXRpdmVfYXJlYRgGIAEoCRIQCghsb2NhbGl0eRgHIAEoCRITCgtzdWJsb2NhbGl0eRgIIAEoCRIVCg1hZGRyZXNzX2xpbmVzGAkgAygJEhIKCnJlY2lwaWVudHMYCiADKAkSFAoMb3JnYW5pemF0aW9uGAsgASgJQngKD2NvbS5nb29nbGUudHlwZUISUG9zdGFsQWRkcmVzc1Byb3RvUAFaRmdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvdHlwZS9wb3N0YWxhZGRyZXNzO3Bvc3RhbGFkZHJlc3P4AQGiAgNHVFBiBnByb3RvMw"); + +/** + * Represents a postal address, e.g. for postal delivery or payments addresses. + * Given a postal address, a postal service can deliver items to a premise, P.O. + * Box or similar. + * It is not intended to model geographical locations (roads, towns, + * mountains). + * + * In typical usage an address would be created via user input or from importing + * existing data, depending on the type of process. + * + * Advice on address input / editing: + * - Use an i18n-ready address widget such as + * https://github.com/google/libaddressinput) + * - Users should not be presented with UI elements for input or editing of + * fields outside countries where that field is used. + * + * For more guidance on how to use this schema, please see: + * https://support.google.com/business/answer/6397478 + * + * @generated from message google.type.PostalAddress + */ +export type PostalAddress = Message<"google.type.PostalAddress"> & { + /** + * The schema revision of the `PostalAddress`. This must be set to 0, which is + * the latest revision. + * + * All new revisions **must** be backward compatible with old revisions. + * + * @generated from field: int32 revision = 1; + */ + revision: number; + + /** + * Required. CLDR region code of the country/region of the address. This + * is never inferred and it is up to the user to ensure the value is + * correct. See http://cldr.unicode.org/ and + * http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + * for details. Example: "CH" for Switzerland. + * + * @generated from field: string region_code = 2; + */ + regionCode: string; + + /** + * Optional. BCP-47 language code of the contents of this address (if + * known). This is often the UI language of the input form or is expected + * to match one of the languages used in the address' country/region, or their + * transliterated equivalents. + * This can affect formatting in certain countries, but is not critical + * to the correctness of the data and will never affect any validation or + * other non-formatting related operations. + * + * If this value is not known, it should be omitted (rather than specifying a + * possibly incorrect default). + * + * Examples: "zh-Hant", "ja", "ja-Latn", "en". + * + * @generated from field: string language_code = 3; + */ + languageCode: string; + + /** + * Optional. Postal code of the address. Not all countries use or require + * postal codes to be present, but where they are used, they may trigger + * additional validation with other parts of the address (e.g. state/zip + * validation in the U.S.A.). + * + * @generated from field: string postal_code = 4; + */ + postalCode: string; + + /** + * Optional. Additional, country-specific, sorting code. This is not used + * in most regions. Where it is used, the value is either a string like + * "CEDEX", optionally followed by a number (e.g. "CEDEX 7"), or just a number + * alone, representing the "sector code" (Jamaica), "delivery area indicator" + * (Malawi) or "post office indicator" (e.g. Côte d'Ivoire). + * + * @generated from field: string sorting_code = 5; + */ + sortingCode: string; + + /** + * Optional. Highest administrative subdivision which is used for postal + * addresses of a country or region. + * For example, this can be a state, a province, an oblast, or a prefecture. + * Specifically, for Spain this is the province and not the autonomous + * community (e.g. "Barcelona" and not "Catalonia"). + * Many countries don't use an administrative area in postal addresses. E.g. + * in Switzerland this should be left unpopulated. + * + * @generated from field: string administrative_area = 6; + */ + administrativeArea: string; + + /** + * Optional. Generally refers to the city/town portion of the address. + * Examples: US city, IT comune, UK post town. + * In regions of the world where localities are not well defined or do not fit + * into this structure well, leave locality empty and use address_lines. + * + * @generated from field: string locality = 7; + */ + locality: string; + + /** + * Optional. Sublocality of the address. + * For example, this can be neighborhoods, boroughs, districts. + * + * @generated from field: string sublocality = 8; + */ + sublocality: string; + + /** + * Unstructured address lines describing the lower levels of an address. + * + * Because values in address_lines do not have type information and may + * sometimes contain multiple values in a single field (e.g. + * "Austin, TX"), it is important that the line order is clear. The order of + * address lines should be "envelope order" for the country/region of the + * address. In places where this can vary (e.g. Japan), address_language is + * used to make it explicit (e.g. "ja" for large-to-small ordering and + * "ja-Latn" or "en" for small-to-large). This way, the most specific line of + * an address can be selected based on the language. + * + * The minimum permitted structural representation of an address consists + * of a region_code with all remaining information placed in the + * address_lines. It would be possible to format such an address very + * approximately without geocoding, but no semantic reasoning could be + * made about any of the address components until it was at least + * partially resolved. + * + * Creating an address only containing a region_code and address_lines, and + * then geocoding is the recommended way to handle completely unstructured + * addresses (as opposed to guessing which parts of the address should be + * localities or administrative areas). + * + * @generated from field: repeated string address_lines = 9; + */ + addressLines: string[]; + + /** + * Optional. The recipient at the address. + * This field may, under certain circumstances, contain multiline information. + * For example, it might contain "care of" information. + * + * @generated from field: repeated string recipients = 10; + */ + recipients: string[]; + + /** + * Optional. The name of the organization at the address. + * + * @generated from field: string organization = 11; + */ + organization: string; +}; + +/** + * Describes the message google.type.PostalAddress. + * Use `create(PostalAddressSchema)` to create a new message. + */ +export const PostalAddressSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_postal_address, 0); + diff --git a/schemaregistry/google/type/quaternion_pb.ts b/schemaregistry/google/type/quaternion_pb.ts new file mode 100644 index 00000000..b0047bef --- /dev/null +++ b/schemaregistry/google/type/quaternion_pb.ts @@ -0,0 +1,125 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/quaternion.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/quaternion.proto. + */ +export const file_google_type_quaternion: GenFile = /*@__PURE__*/ + fileDesc("Chxnb29nbGUvdHlwZS9xdWF0ZXJuaW9uLnByb3RvEgtnb29nbGUudHlwZSI4CgpRdWF0ZXJuaW9uEgkKAXgYASABKAESCQoBeRgCIAEoARIJCgF6GAMgASgBEgkKAXcYBCABKAFCbwoPY29tLmdvb2dsZS50eXBlQg9RdWF0ZXJuaW9uUHJvdG9QAVpAZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy90eXBlL3F1YXRlcm5pb247cXVhdGVybmlvbvgBAaICA0dUUGIGcHJvdG8z"); + +/** + * A quaternion is defined as the quotient of two directed lines in a + * three-dimensional space or equivalently as the quotient of two Euclidean + * vectors (https://en.wikipedia.org/wiki/Quaternion). + * + * Quaternions are often used in calculations involving three-dimensional + * rotations (https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation), + * as they provide greater mathematical robustness by avoiding the gimbal lock + * problems that can be encountered when using Euler angles + * (https://en.wikipedia.org/wiki/Gimbal_lock). + * + * Quaternions are generally represented in this form: + * + * w + xi + yj + zk + * + * where x, y, z, and w are real numbers, and i, j, and k are three imaginary + * numbers. + * + * Our naming choice `(x, y, z, w)` comes from the desire to avoid confusion for + * those interested in the geometric properties of the quaternion in the 3D + * Cartesian space. Other texts often use alternative names or subscripts, such + * as `(a, b, c, d)`, `(1, i, j, k)`, or `(0, 1, 2, 3)`, which are perhaps + * better suited for mathematical interpretations. + * + * To avoid any confusion, as well as to maintain compatibility with a large + * number of software libraries, the quaternions represented using the protocol + * buffer below *must* follow the Hamilton convention, which defines `ij = k` + * (i.e. a right-handed algebra), and therefore: + * + * i^2 = j^2 = k^2 = ijk = −1 + * ij = −ji = k + * jk = −kj = i + * ki = −ik = j + * + * Please DO NOT use this to represent quaternions that follow the JPL + * convention, or any of the other quaternion flavors out there. + * + * Definitions: + * + * - Quaternion norm (or magnitude): `sqrt(x^2 + y^2 + z^2 + w^2)`. + * - Unit (or normalized) quaternion: a quaternion whose norm is 1. + * - Pure quaternion: a quaternion whose scalar component (`w`) is 0. + * - Rotation quaternion: a unit quaternion used to represent rotation. + * - Orientation quaternion: a unit quaternion used to represent orientation. + * + * A quaternion can be normalized by dividing it by its norm. The resulting + * quaternion maintains the same direction, but has a norm of 1, i.e. it moves + * on the unit sphere. This is generally necessary for rotation and orientation + * quaternions, to avoid rounding errors: + * https://en.wikipedia.org/wiki/Rotation_formalisms_in_three_dimensions + * + * Note that `(x, y, z, w)` and `(-x, -y, -z, -w)` represent the same rotation, + * but normalization would be even more useful, e.g. for comparison purposes, if + * it would produce a unique representation. It is thus recommended that `w` be + * kept positive, which can be achieved by changing all the signs when `w` is + * negative. + * + * + * @generated from message google.type.Quaternion + */ +export type Quaternion = Message<"google.type.Quaternion"> & { + /** + * The x component. + * + * @generated from field: double x = 1; + */ + x: number; + + /** + * The y component. + * + * @generated from field: double y = 2; + */ + y: number; + + /** + * The z component. + * + * @generated from field: double z = 3; + */ + z: number; + + /** + * The scalar component. + * + * @generated from field: double w = 4; + */ + w: number; +}; + +/** + * Describes the message google.type.Quaternion. + * Use `create(QuaternionSchema)` to create a new message. + */ +export const QuaternionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_quaternion, 0); + diff --git a/schemaregistry/google/type/timeofday_pb.ts b/schemaregistry/google/type/timeofday_pb.ts new file mode 100644 index 00000000..ddcca796 --- /dev/null +++ b/schemaregistry/google/type/timeofday_pb.ts @@ -0,0 +1,75 @@ +// Copyright 2021-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file google/type/timeofday.proto (package google.type, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/type/timeofday.proto. + */ +export const file_google_type_timeofday: GenFile = /*@__PURE__*/ + fileDesc("Chtnb29nbGUvdHlwZS90aW1lb2ZkYXkucHJvdG8SC2dvb2dsZS50eXBlIksKCVRpbWVPZkRheRINCgVob3VycxgBIAEoBRIPCgdtaW51dGVzGAIgASgFEg8KB3NlY29uZHMYAyABKAUSDQoFbmFub3MYBCABKAVCbAoPY29tLmdvb2dsZS50eXBlQg5UaW1lT2ZEYXlQcm90b1ABWj5nb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvdGltZW9mZGF5O3RpbWVvZmRhefgBAaICA0dUUGIGcHJvdG8z"); + +/** + * Represents a time of day. The date and time zone are either not significant + * or are specified elsewhere. An API may choose to allow leap seconds. Related + * types are [google.type.Date][google.type.Date] and + * `google.protobuf.Timestamp`. + * + * @generated from message google.type.TimeOfDay + */ +export type TimeOfDay = Message<"google.type.TimeOfDay"> & { + /** + * Hours of day in 24 hour format. Should be from 0 to 23. An API may choose + * to allow the value "24:00:00" for scenarios like business closing time. + * + * @generated from field: int32 hours = 1; + */ + hours: number; + + /** + * Minutes of hour of day. Must be from 0 to 59. + * + * @generated from field: int32 minutes = 2; + */ + minutes: number; + + /** + * Seconds of minutes of the time. Must normally be from 0 to 59. An API may + * allow the value 60 if it allows leap-seconds. + * + * @generated from field: int32 seconds = 3; + */ + seconds: number; + + /** + * Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999. + * + * @generated from field: int32 nanos = 4; + */ + nanos: number; +}; + +/** + * Describes the message google.type.TimeOfDay. + * Use `create(TimeOfDaySchema)` to create a new message. + */ +export const TimeOfDaySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_type_timeofday, 0); + diff --git a/schemaregistry/mock-schemaregistry-client.ts b/schemaregistry/mock-schemaregistry-client.ts index 7e018983..c2d754f5 100644 --- a/schemaregistry/mock-schemaregistry-client.ts +++ b/schemaregistry/mock-schemaregistry-client.ts @@ -1,7 +1,15 @@ -import { Client, Compatibility, SchemaInfo, SchemaMetadata, ServerConfig } from './schemaregistry-client'; +import { + Client, + Compatibility, + minimize, + SchemaInfo, + SchemaMetadata, + ServerConfig +} from './schemaregistry-client'; import stringify from "json-stringify-deterministic"; import {ClientConfig} from "./rest-service"; +import {RestError} from "./rest-error"; interface VersionCacheEntry { version: number; @@ -57,13 +65,13 @@ class MockClient implements Client { async register(subject: string, schema: SchemaInfo, normalize: boolean = false): Promise { const metadata = await this.registerFullResponse(subject, schema, normalize); if (!metadata) { - throw new Error("Failed to register schema"); + throw new RestError("Failed to register schema", 422, 42200); } return metadata.id; } async registerFullResponse(subject: string, schema: SchemaInfo, normalize: boolean = false): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); const cacheEntry = this.infoToSchemaCache.get(cacheKey); if (cacheEntry && !cacheEntry.softDeleted) { @@ -72,7 +80,7 @@ class MockClient implements Client { const id = await this.getIDFromRegistry(subject, schema); if (id === -1) { - throw new Error("Failed to retrieve schema ID from registry"); + throw new RestError("Failed to retrieve schema ID from registry", 422, 42200); } const metadata: SchemaMetadata = { ...schema, id }; @@ -112,49 +120,49 @@ class MockClient implements Client { newVersion = versions[versions.length - 1] + 1; } - const cacheKey = stringify({ subject, schema: schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); this.schemaToVersionCache.set(cacheKey, { version: newVersion, softDeleted: false }); } - async getBySubjectAndId(subject: string, id: number): Promise { + async getBySubjectAndId(subject: string, id: number, format?: string): Promise { const cacheKey = stringify({ subject, id }); const cacheEntry = this.idToSchemaCache.get(cacheKey); if (!cacheEntry || cacheEntry.softDeleted) { - throw new Error("Schema not found"); + throw new RestError("Schema not found", 404, 40400); } return cacheEntry.info; } async getId(subject: string, schema: SchemaInfo): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); const cacheEntry = this.infoToSchemaCache.get(cacheKey); if (!cacheEntry || cacheEntry.softDeleted) { - throw new Error("Schema not found"); + throw new RestError("Schema not found", 404, 40400); } return cacheEntry.metadata.id; } - async getLatestSchemaMetadata(subject: string): Promise { + async getLatestSchemaMetadata(subject: string, format?: string): Promise { const version = await this.latestVersion(subject); if (version === -1) { - throw new Error("No versions found for subject"); + throw new RestError("No versions found for subject", 404, 40400); } return this.getSchemaMetadata(subject, version); } - async getSchemaMetadata(subject: string, version: number, deleted: boolean = false): Promise { + async getSchemaMetadata(subject: string, version: number, deleted: boolean = false, format?: string): Promise { let json; for (const [key, value] of this.schemaToVersionCache.entries()) { const parsedKey = JSON.parse(key); - if (parsedKey.subject === subject && value.version === version && value.softDeleted === deleted) { + if (parsedKey.subject === subject && value.version === version) { json = parsedKey; } } if (!json) { - throw new Error("Schema not found"); + throw new RestError("Schema not found", 404, 40400); } let id: number = -1; @@ -165,7 +173,7 @@ class MockClient implements Client { } } if (id === -1) { - throw new Error("Schema not found"); + throw new RestError("Schema not found", 404, 40400); } @@ -173,11 +181,12 @@ class MockClient implements Client { id, version, subject, - schema: json.schema.schema + ...json.schema, }; } - async getLatestWithMetadata(subject: string, metadata: { [key: string]: string }, deleted: boolean = false): Promise { + async getLatestWithMetadata(subject: string, metadata: { [key: string]: string }, + deleted: boolean = false, format?: string): Promise { let metadataStr = ''; for (const key in metadata) { @@ -198,7 +207,7 @@ class MockClient implements Client { } if (results.length === 0) { - throw new Error("Schema not found"); + throw new RestError("Schema not found", 404, 40400); } let latest: SchemaMetadata = results[0]; @@ -225,7 +234,7 @@ class MockClient implements Client { const results = await this.allVersions(subject); if (results.length === 0) { - throw new Error("No versions found for subject"); + throw new RestError("No versions found for subject", 404, 40400); } return results; } @@ -275,11 +284,11 @@ class MockClient implements Client { } async getVersion(subject: string, schema: SchemaInfo, normalize: boolean = false): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); const cacheEntry = this.schemaToVersionCache.get(cacheKey); if (!cacheEntry || cacheEntry.softDeleted) { - throw new Error("Schema not found"); + throw new RestError("Schema not found", 404, 40400); } return cacheEntry.version; @@ -333,7 +342,7 @@ class MockClient implements Client { if (parsedKey.subject === subject && value.version === version) { await this.deleteVersion(key, version, permanent); - const cacheKeySchema = stringify({ subject, schema: parsedKey.schema }); + const cacheKeySchema = stringify({ subject, schema: minimize(parsedKey.schema) }); const cacheEntry = this.infoToSchemaCache.get(cacheKeySchema); if (cacheEntry) { await this.deleteMetadata(cacheKeySchema, cacheEntry.metadata, permanent); @@ -363,7 +372,7 @@ class MockClient implements Client { async getCompatibility(subject: string): Promise { const cacheEntry = this.configCache.get(subject); if (!cacheEntry) { - throw new Error("Subject not found"); + throw new RestError("Subject not found", 404, 40400); } return cacheEntry.compatibilityLevel as Compatibility; } @@ -376,7 +385,7 @@ class MockClient implements Client { async getDefaultCompatibility(): Promise { const cacheEntry = this.configCache.get(noSubject); if (!cacheEntry) { - throw new Error("Default compatibility not found"); + throw new RestError("Default compatibility not found", 404, 40400); } return cacheEntry.compatibilityLevel as Compatibility; } @@ -389,7 +398,7 @@ class MockClient implements Client { async getConfig(subject: string): Promise { const cacheEntry = this.configCache.get(subject); if (!cacheEntry) { - throw new Error("Subject not found"); + throw new RestError("Subject not found", 404, 40400); } return cacheEntry; } @@ -402,7 +411,7 @@ class MockClient implements Client { async getDefaultConfig(): Promise { const cacheEntry = this.configCache.get(noSubject); if (!cacheEntry) { - throw new Error("Default config not found"); + throw new RestError("Default config not found", 404, 40400); } return cacheEntry; } diff --git a/schemaregistry/rules/encryption/awskms/aws-client.ts b/schemaregistry/rules/encryption/awskms/aws-client.ts new file mode 100644 index 00000000..c1f2f6f5 --- /dev/null +++ b/schemaregistry/rules/encryption/awskms/aws-client.ts @@ -0,0 +1,46 @@ +import {KmsClient} from "../kms-registry"; +import {AwsKmsDriver} from "./aws-driver"; +import { + DecryptCommand, + EncryptCommand, + KMSClient +} from '@aws-sdk/client-kms' +import {AwsCredentialIdentity} from "@smithy/types"; + +export class AwsKmsClient implements KmsClient { + + private kmsClient: KMSClient + private keyId: string + + constructor(keyUri: string, creds?: AwsCredentialIdentity) { + if (!keyUri.startsWith(AwsKmsDriver.PREFIX)) { + throw new Error(`key uri must start with ${AwsKmsDriver.PREFIX}`) + } + this.keyId = keyUri.substring(AwsKmsDriver.PREFIX.length) + const tokens = this.keyId.split(':') + if (tokens.length < 4) { + throw new Error(`invalid key uri ${this.keyId}`) + } + const regionName = tokens[3] + this.kmsClient = new KMSClient({ + region: regionName, + ...creds && {credentials: creds} + }) + } + + supported(keyUri: string): boolean { + return keyUri.startsWith(AwsKmsDriver.PREFIX) + } + + async encrypt(plaintext: Buffer): Promise { + const encryptCommand = new EncryptCommand({KeyId: this.keyId, Plaintext: plaintext}); + const data = await this.kmsClient.send(encryptCommand) + return Buffer.from(data.CiphertextBlob!); + } + + async decrypt(ciphertext: Buffer): Promise { + const decryptCommand = new DecryptCommand({KeyId: this.keyId, CiphertextBlob: ciphertext}); + const data = await this.kmsClient.send(decryptCommand); + return Buffer.from(data.Plaintext!) + } +} diff --git a/schemaregistry/rules/encryption/awskms/aws-driver.ts b/schemaregistry/rules/encryption/awskms/aws-driver.ts new file mode 100644 index 00000000..e01d8afa --- /dev/null +++ b/schemaregistry/rules/encryption/awskms/aws-driver.ts @@ -0,0 +1,29 @@ +import {KmsClient, KmsDriver, registerKmsDriver} from "../kms-registry"; +import {AwsKmsClient} from "./aws-client"; +import {AwsCredentialIdentity} from "@smithy/types"; + +export class AwsKmsDriver implements KmsDriver { + + static PREFIX = 'aws-kms://' + static ACCESS_KEY_ID = 'access.key.id' + static SECRET_ACCESS_KEY = 'secret.access.key' + + static register(): void { + registerKmsDriver(new AwsKmsDriver()) + } + + getKeyUrlPrefix(): string { + return AwsKmsDriver.PREFIX + } + + newKmsClient(config: Map, keyUrl?: string): KmsClient { + const uriPrefix = keyUrl != null ? keyUrl : AwsKmsDriver.PREFIX + const key = config.get(AwsKmsDriver.ACCESS_KEY_ID) + const secret = config.get(AwsKmsDriver.SECRET_ACCESS_KEY) + let creds: AwsCredentialIdentity | undefined + if (key != null && secret != null) { + creds = {accessKeyId: key, secretAccessKey: secret} + } + return new AwsKmsClient(uriPrefix, creds) + } +} diff --git a/schemaregistry/rules/encryption/azurekms/azure-client.ts b/schemaregistry/rules/encryption/azurekms/azure-client.ts new file mode 100644 index 00000000..da4c3312 --- /dev/null +++ b/schemaregistry/rules/encryption/azurekms/azure-client.ts @@ -0,0 +1,33 @@ +import {KmsClient} from "../kms-registry"; +import {AzureKmsDriver} from "./azure-driver"; +import {TokenCredential} from "@azure/identity"; +import {CryptographyClient, EncryptionAlgorithm} from "@azure/keyvault-keys"; + +export class AzureKmsClient implements KmsClient { + private static ALGORITHM: EncryptionAlgorithm = 'RSA-OAEP-256' + + private kmsClient: CryptographyClient + private keyId: string + + constructor(keyUri: string, creds: TokenCredential) { + if (!keyUri.startsWith(AzureKmsDriver.PREFIX)) { + throw new Error(`key uri must start with ${AzureKmsDriver.PREFIX}`) + } + this.keyId = keyUri.substring(AzureKmsDriver.PREFIX.length) + this.kmsClient = new CryptographyClient(this.keyId, creds) + } + + supported(keyUri: string): boolean { + return keyUri.startsWith(AzureKmsDriver.PREFIX) + } + + async encrypt(plaintext: Buffer): Promise { + const result = await this.kmsClient.encrypt(AzureKmsClient.ALGORITHM, plaintext) + return Buffer.from(result.result) + } + + async decrypt(ciphertext: Buffer): Promise { + const result = await this.kmsClient.decrypt(AzureKmsClient.ALGORITHM, ciphertext) + return Buffer.from(result.result) + } +} diff --git a/schemaregistry/rules/encryption/azurekms/azure-driver.ts b/schemaregistry/rules/encryption/azurekms/azure-driver.ts new file mode 100644 index 00000000..42d6cc84 --- /dev/null +++ b/schemaregistry/rules/encryption/azurekms/azure-driver.ts @@ -0,0 +1,33 @@ +import {KmsClient, KmsDriver, registerKmsDriver} from "../kms-registry"; +import {ClientSecretCredential, DefaultAzureCredential, TokenCredential} from '@azure/identity' +import {AzureKmsClient} from "./azure-client"; + +export class AzureKmsDriver implements KmsDriver { + + static PREFIX = 'azure-kms://' + static TENANT_ID = 'tenant_id' + static CLIENT_ID = 'client.id' + static CLIENT_SECRET = 'client.secret' + + static register(): void { + registerKmsDriver(new AzureKmsDriver()) + } + + getKeyUrlPrefix(): string { + return AzureKmsDriver.PREFIX + } + + newKmsClient(config: Map, keyUrl?: string): KmsClient { + const uriPrefix = keyUrl != null ? keyUrl : AzureKmsDriver.PREFIX + const tenantId = config.get(AzureKmsDriver.TENANT_ID) + const clientId = config.get(AzureKmsDriver.CLIENT_ID) + const clientSecret = config.get(AzureKmsDriver.CLIENT_SECRET) + let creds: TokenCredential + if (tenantId != null && clientId != null && clientSecret != null) { + creds = new ClientSecretCredential(tenantId, clientId, clientSecret) + } else { + creds = new DefaultAzureCredential() + } + return new AzureKmsClient(uriPrefix, creds) + } +} diff --git a/schemaregistry/dekregistry/constants.ts b/schemaregistry/rules/encryption/dekregistry/constants.ts similarity index 100% rename from schemaregistry/dekregistry/constants.ts rename to schemaregistry/rules/encryption/dekregistry/constants.ts diff --git a/schemaregistry/dekregistry/dekregistry-client.ts b/schemaregistry/rules/encryption/dekregistry/dekregistry-client.ts similarity index 95% rename from schemaregistry/dekregistry/dekregistry-client.ts rename to schemaregistry/rules/encryption/dekregistry/dekregistry-client.ts index 84216a62..00f49886 100644 --- a/schemaregistry/dekregistry/dekregistry-client.ts +++ b/schemaregistry/rules/encryption/dekregistry/dekregistry-client.ts @@ -1,7 +1,8 @@ import { LRUCache } from 'lru-cache'; import { Mutex } from 'async-mutex'; -import { ClientConfig, RestService } from '../rest-service'; +import { ClientConfig, RestService } from '../../../rest-service'; import stringify from 'json-stringify-deterministic'; +import {MockDekRegistryClient} from "./mock-dekregistry-client"; /* * Confluent-Schema-Registry-TypeScript - Node.js wrapper for Confluent Schema Registry @@ -76,6 +77,14 @@ class DekRegistryClient implements Client { this.dekMutex = new Mutex(); } + static newClient(config: ClientConfig): Client { + let url = config.baseURLs[0] + if (url.startsWith("mock://")) { + return new MockDekRegistryClient() + } + return new DekRegistryClient(config) + } + static getEncryptedKeyMaterialBytes(dek: Dek): Buffer | null { if (!dek.encryptedKeyMaterial) { return null; diff --git a/schemaregistry/dekregistry/mock-dekregistry-client.ts b/schemaregistry/rules/encryption/dekregistry/mock-dekregistry-client.ts similarity index 90% rename from schemaregistry/dekregistry/mock-dekregistry-client.ts rename to schemaregistry/rules/encryption/dekregistry/mock-dekregistry-client.ts index f0145275..febfbb66 100644 --- a/schemaregistry/dekregistry/mock-dekregistry-client.ts +++ b/schemaregistry/rules/encryption/dekregistry/mock-dekregistry-client.ts @@ -1,6 +1,7 @@ import { Client, Dek, Kek } from "./dekregistry-client"; import { MOCK_TS } from "./constants"; import stringify from "json-stringify-deterministic"; +import {RestError} from "../../../rest-error"; class MockDekRegistryClient implements Client { private kekCache: Map; @@ -39,7 +40,7 @@ class MockDekRegistryClient implements Client { return cachedKek; } - throw new Error(`Kek not found: ${name}`); + throw new RestError(`Kek not found: ${name}`, 404, 40400); } async registerDek(kekName: string, subject: string, algorithm: string, @@ -75,18 +76,18 @@ class MockDekRegistryClient implements Client { } } if (latestVersion === 0) { - throw new Error(`Dek not found: ${subject}`); + throw new RestError(`Dek not found: ${subject}`, 404, 40400); } version = latestVersion; } - const cacheKey = stringify({ kekName, subject, version, algorithm, deleted }); + const cacheKey = stringify({ kekName, subject, version, algorithm, deleted: false }); const cachedDek = this.dekCache.get(cacheKey); if (cachedDek) { return cachedDek; } - throw new Error(`Dek not found: ${subject}`); + throw new RestError(`Dek not found: ${subject}`, 404, 40400); } async close() { diff --git a/schemaregistry/rules/encryption/encrypt-executor.ts b/schemaregistry/rules/encryption/encrypt-executor.ts index 6ba09148..cd5b7fb1 100644 --- a/schemaregistry/rules/encryption/encrypt-executor.ts +++ b/schemaregistry/rules/encryption/encrypt-executor.ts @@ -5,11 +5,11 @@ import { FieldType, MAGIC_BYTE, RuleContext, - RuleError + RuleError, } from "../../serde/serde"; import {RuleMode,} from "../../schemaregistry-client"; -import {Client, Dek, DekRegistryClient, Kek} from "../../dekregistry/dekregistry-client"; -import {registerRuleExecutor} from "../../serde/rule-registry"; +import {Client, Dek, DekRegistryClient, Kek} from "./dekregistry/dekregistry-client"; +import {RuleRegistry} from "../../serde/rule-registry"; import {ClientConfig} from "../../rest-service"; import {RestError} from "../../rest-error"; import * as Random from './tink/random'; @@ -35,7 +35,7 @@ const ENCRYPT_DEK_EXPIRY_DAYS = 'encrypt.dek.expiry.days' // MillisInDay represents number of milliseconds in a day const MILLIS_IN_DAY = 24 * 60 * 60 * 1000 -enum DekFormat { +export enum DekFormat { AES128_GCM = 'AES128_GCM', AES256_GCM = 'AES256_GCM', AES256_SIV = 'AES256_SIV', @@ -57,13 +57,14 @@ interface DekId { export class FieldEncryptionExecutor extends FieldRuleExecutor { client: Client | null = null - static register() { - registerRuleExecutor(new FieldEncryptionExecutor()) + static register(): FieldEncryptionExecutor { + const executor = new FieldEncryptionExecutor() + RuleRegistry.registerRuleExecutor(executor) + return executor } override configure(clientConfig: ClientConfig, config: Map) { - // TODO use mock - this.client = new DekRegistryClient(clientConfig) + this.client = DekRegistryClient.newClient(clientConfig) this.config = config } @@ -80,9 +81,9 @@ export class FieldEncryptionExecutor extends FieldRuleExecutor { return transform } - override close() { + async close(): Promise { if (this.client != null) { - this.client.close() + await this.client.close() } } diff --git a/schemaregistry/rules/encryption/gcpkms/gcp-client.ts b/schemaregistry/rules/encryption/gcpkms/gcp-client.ts new file mode 100644 index 00000000..4b51f4f4 --- /dev/null +++ b/schemaregistry/rules/encryption/gcpkms/gcp-client.ts @@ -0,0 +1,43 @@ +import {KmsClient} from "../kms-registry"; +import {GcpCredentials, GcpKmsDriver} from "./gcp-driver"; +import {KeyManagementServiceClient} from "@google-cloud/kms"; + +export class GcpKmsClient implements KmsClient { + + private kmsClient: KeyManagementServiceClient + private keyId: string + + constructor(keyUri: string, creds?: GcpCredentials) { + if (!keyUri.startsWith(GcpKmsDriver.PREFIX)) { + throw new Error(`key uri must start with ${GcpKmsDriver.PREFIX}`) + } + this.keyId = keyUri.substring(GcpKmsDriver.PREFIX.length) + const tokens = this.keyId.split(':') + if (tokens.length < 4) { + throw new Error(`invalid key uri ${this.keyId}`) + } + this.kmsClient = creds != null + ? new KeyManagementServiceClient() + : new KeyManagementServiceClient({credentials: creds}) + } + + supported(keyUri: string): boolean { + return keyUri.startsWith(GcpKmsDriver.PREFIX) + } + + async encrypt(plaintext: Buffer): Promise { + const [result] = await this.kmsClient.encrypt({ + name: this.keyId, + plaintext: plaintext + }) + return Buffer.from(result.ciphertext as string) + } + + async decrypt(ciphertext: Buffer): Promise { + const [result] = await this.kmsClient.decrypt({ + name: this.keyId, + ciphertext: ciphertext + }) + return Buffer.from(result.plaintext as string) + } +} diff --git a/schemaregistry/rules/encryption/gcpkms/gcp-driver.ts b/schemaregistry/rules/encryption/gcpkms/gcp-driver.ts new file mode 100644 index 00000000..73021678 --- /dev/null +++ b/schemaregistry/rules/encryption/gcpkms/gcp-driver.ts @@ -0,0 +1,51 @@ +import {KmsClient, KmsDriver, registerKmsDriver} from "../kms-registry"; +import {GcpKmsClient} from "./gcp-client"; + +export class GcpKmsDriver implements KmsDriver { + + static PREFIX = 'gcp-kms://' + static ACCOUNT_TYPE = "account.type"; + static CLIENT_ID= "client.id"; + static CLIENT_EMAIL = "client.email"; + static PRIVATE_KEY_ID = "private.key.id"; + static PRIVATE_KEY= "private.key"; + + static register(): void { + registerKmsDriver(new GcpKmsDriver()) + } + + getKeyUrlPrefix(): string { + return GcpKmsDriver.PREFIX + } + + newKmsClient(config: Map, keyUrl?: string): KmsClient { + const uriPrefix = keyUrl != null ? keyUrl : GcpKmsDriver.PREFIX + let accountType = config.get(GcpKmsDriver.ACCOUNT_TYPE) + const clientId = config.get(GcpKmsDriver.CLIENT_ID) + const clientEmail = config.get(GcpKmsDriver.CLIENT_EMAIL) + const privateKeyId = config.get(GcpKmsDriver.PRIVATE_KEY_ID) + const privateKey = config.get(GcpKmsDriver.PRIVATE_KEY) + let creds: GcpCredentials | undefined + if (clientId != null && clientEmail != null && privateKeyId != null && privateKey != null) { + if (accountType == null) { + accountType = "service_account" + } + creds = { + ...accountType && {type: accountType}, + private_key_id: privateKeyId, + private_key: privateKey, + client_email: clientEmail, + client_id: clientId, + } + } + return new GcpKmsClient(uriPrefix, creds) + } +} + +export interface GcpCredentials { + type?: string + private_key_id?: string + private_key?: string + client_email?: string + client_id?: string +} diff --git a/schemaregistry/rules/encryption/hcvault/hcvault-client.ts b/schemaregistry/rules/encryption/hcvault/hcvault-client.ts new file mode 100644 index 00000000..53434b14 --- /dev/null +++ b/schemaregistry/rules/encryption/hcvault/hcvault-client.ts @@ -0,0 +1,47 @@ +import {KmsClient} from "../kms-registry"; +import {HcVaultDriver} from "./hcvault-driver"; +import NodeVault from "node-vault"; + +export class HcVaultClient implements KmsClient { + + private kmsClient: NodeVault.client + private keyId: string + private keyName: string + + constructor(keyUri: string, namespace?: string, token?: string) { + if (token == null) + { + namespace = process.env["VAULT_NAMESPACE"] + } + if (!keyUri.startsWith(HcVaultDriver.PREFIX)) { + throw new Error(`key uri must start with ${HcVaultDriver.PREFIX}`) + } + this.keyId = keyUri.substring(HcVaultDriver.PREFIX.length) + let url = new URL(this.keyId) + let parts = url.pathname.split('/') + if (parts.length === 0) { + throw new Error('key uri must contain a key name') + } + this.keyName = parts.pop()! + this.kmsClient = NodeVault({ + endpoint: url.protocol + '//' + url.host, + ...namespace && { namespace }, + ...token && { token }, + apiVersion: 'v1', + }) + } + + supported(keyUri: string): boolean { + return keyUri.startsWith(HcVaultDriver.PREFIX) + } + + async encrypt(plaintext: Buffer): Promise { + const data = await this.kmsClient.encryptData({name: this.keyName, plainText: plaintext.toString('base64') }) + return Buffer.from(data.ciphertext, 'base64') + } + + async decrypt(ciphertext: Buffer): Promise { + const data = await this.kmsClient.decryptData({name: this.keyName, cipherText: ciphertext.toString('base64') }) + return Buffer.from(data.plaintext, 'base64') + } +} diff --git a/schemaregistry/rules/encryption/hcvault/hcvault-driver.ts b/schemaregistry/rules/encryption/hcvault/hcvault-driver.ts new file mode 100644 index 00000000..ccdcdc90 --- /dev/null +++ b/schemaregistry/rules/encryption/hcvault/hcvault-driver.ts @@ -0,0 +1,24 @@ +import {KmsClient, KmsDriver, registerKmsDriver} from "../kms-registry"; +import {HcVaultClient} from "./hcvault-client"; + +export class HcVaultDriver implements KmsDriver { + + static PREFIX = 'hcvault-kms://' + static TOKEN_ID = 'token.id' + static NAMESPACE = 'namespace' + + static register(): void { + registerKmsDriver(new HcVaultDriver()) + } + + getKeyUrlPrefix(): string { + return HcVaultDriver.PREFIX + } + + newKmsClient(config: Map, keyUrl?: string): KmsClient { + const uriPrefix = keyUrl != null ? keyUrl : HcVaultDriver.PREFIX + const tokenId = config.get(HcVaultDriver.TOKEN_ID) + const ns = config.get(HcVaultDriver.NAMESPACE) + return new HcVaultClient(uriPrefix, ns, tokenId) + } +} diff --git a/schemaregistry/rules/encryption/localkms/local-client.ts b/schemaregistry/rules/encryption/localkms/local-client.ts new file mode 100644 index 00000000..c65cc089 --- /dev/null +++ b/schemaregistry/rules/encryption/localkms/local-client.ts @@ -0,0 +1,44 @@ +import {KmsClient} from "../kms-registry"; +import {Cryptor, DekFormat} from "../encrypt-executor"; +import * as Hkdf from '../tink/hkdf'; +import {LocalKmsDriver} from "./local-driver"; +import {AesGcmKey, AesGcmKeySchema} from "../tink/proto/aes_gcm_pb"; +import {create, toBinary} from "@bufbuild/protobuf"; + +export class LocalKmsClient implements KmsClient { + + private secret: string + private cryptor: Cryptor + + constructor(secret?: string) { + if (secret == null) { + secret = process.env['LOCAL_SECRET'] + } + if (secret == null) { + throw new Error('cannot load secret') + } + this.secret = secret + this.cryptor = new Cryptor(DekFormat.AES128_GCM) + } + + async getKey(): Promise { + const rawKey = await Hkdf.compute(16, 'SHA-256', Buffer.from(this.secret, 'utf8'), new Uint8Array(0)); + const aesGcmKey: AesGcmKey = create(AesGcmKeySchema, { + version: 0, + keyValue: rawKey + }); + return Buffer.from(toBinary(AesGcmKeySchema, aesGcmKey)) + } + + supported(keyUri: string): boolean { + return keyUri.startsWith(LocalKmsDriver.PREFIX) + } + + async encrypt(plaintext: Buffer): Promise { + return this.cryptor.encrypt(await this.getKey(), plaintext) + } + + async decrypt(ciphertext: Buffer): Promise { + return this.cryptor.decrypt(await this.getKey(), ciphertext) + } +} diff --git a/schemaregistry/rules/encryption/localkms/local-driver.ts b/schemaregistry/rules/encryption/localkms/local-driver.ts new file mode 100644 index 00000000..96ecb481 --- /dev/null +++ b/schemaregistry/rules/encryption/localkms/local-driver.ts @@ -0,0 +1,21 @@ +import {KmsClient, KmsDriver, registerKmsDriver} from "../kms-registry"; +import {LocalKmsClient} from "./local-client"; + +export class LocalKmsDriver implements KmsDriver { + + static PREFIX: string = 'local-kms://' + static SECRET: string = 'secret' + + static register(): void { + registerKmsDriver(new LocalKmsDriver()) + } + + getKeyUrlPrefix(): string { + return LocalKmsDriver.PREFIX + } + + newKmsClient(config: Map, keyUrl: string): KmsClient { + const secret = config.get(LocalKmsDriver.SECRET) + return new LocalKmsClient(secret) + } +} diff --git a/schemaregistry/rules/encryption/tink/aes_gcm.ts b/schemaregistry/rules/encryption/tink/aes_gcm.ts index d9723abe..fcce0110 100644 --- a/schemaregistry/rules/encryption/tink/aes_gcm.ts +++ b/schemaregistry/rules/encryption/tink/aes_gcm.ts @@ -10,6 +10,7 @@ import {SecurityException} from './exception/security_exception'; import * as Bytes from './bytes'; import * as Random from './random'; import * as Validators from './validators'; +import * as crypto from 'crypto'; /** * The only supported IV size. @@ -51,7 +52,7 @@ export class AesGcm extends Aead { alg['additionalData'] = associatedData; } const ciphertext = - await self.crypto.subtle.encrypt(alg, this.key, plaintext); + await crypto.subtle.encrypt(alg, this.key, plaintext); return Bytes.concat(iv, new Uint8Array(ciphertext)); } @@ -77,7 +78,7 @@ export class AesGcm extends Aead { alg['additionalData'] = associatedData; } try { - return new Uint8Array(await self.crypto.subtle.decrypt( + return new Uint8Array(await crypto.subtle.decrypt( alg, this.key, new Uint8Array(ciphertext.subarray(IV_SIZE_IN_BYTES)))); // Preserving old behavior when moving to @@ -92,7 +93,7 @@ export class AesGcm extends Aead { export async function fromRawKey(key: Uint8Array): Promise { Validators.requireUint8Array(key); Validators.validateAesKeySize(key.length); - const webCryptoKey = await self.crypto.subtle.importKey( + const webCryptoKey = await crypto.subtle.importKey( /* format */ 'raw', key, /* keyData */ diff --git a/schemaregistry/rules/encryption/tink/aes_siv.ts b/schemaregistry/rules/encryption/tink/aes_siv.ts index 5f9521b6..5d2fc4a0 100644 --- a/schemaregistry/rules/encryption/tink/aes_siv.ts +++ b/schemaregistry/rules/encryption/tink/aes_siv.ts @@ -7,7 +7,8 @@ import {Aead} from './aead'; // @ts-expect-error miscreant does not have types -import {AEAD} from "@hackbg/miscreant-esm"; +import {SIV, WebCryptoProvider} from "@hackbg/miscreant-esm"; +import * as crypto from 'crypto'; /** * Implementation of AES-SIV. @@ -23,16 +24,16 @@ export class AesSiv extends Aead { */ async encrypt(plaintext: Uint8Array, associatedData?: Uint8Array): Promise { - let key = await AEAD.importKey(this.key, "AES-CMAC-SIV"); - return key.seal(plaintext, null, associatedData); + let key = await SIV.importKey(this.key, "AES-CMAC-SIV", new WebCryptoProvider(crypto)); + return key.seal(plaintext, [associatedData]); } /** */ async decrypt(ciphertext: Uint8Array, associatedData?: Uint8Array): Promise { - let key = await AEAD.importKey(this.key, "AES-CMAC-SIV"); - return key.open(ciphertext, null, associatedData); + let key = await SIV.importKey(this.key, "AES-CMAC-SIV", new WebCryptoProvider(crypto)); + return key.open(ciphertext, [associatedData]); } } diff --git a/schemaregistry/rules/encryption/tink/hkdf.ts b/schemaregistry/rules/encryption/tink/hkdf.ts new file mode 100644 index 00000000..5a411222 --- /dev/null +++ b/schemaregistry/rules/encryption/tink/hkdf.ts @@ -0,0 +1,99 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + + +/** + * @fileoverview An implementation of HKDF, RFC 5869. + */ +import {InvalidArgumentsException} from './exception/invalid_arguments_exception'; + +import {fromRawKey as hmacFromRawKey} from './hmac'; +import * as Validators from './validators'; + +/** + * Computes an HKDF. + * + * @param size The length of the generated pseudorandom string in + * bytes. The maximal size is 255 * DigestSize, where DigestSize is the size + * of the underlying HMAC. + * @param hash the name of the hash function. Accepted names are SHA-1, + * SHA-256 and SHA-512 + * @param ikm Input keying material. + * @param info Context and application specific + * information (can be a zero-length array). + * @param opt_salt Salt value (a non-secret random + * value). If not provided, it is set to a string of hash length zeros. + * @return Output keying material (okm). + */ +export async function compute( + size: number, hash: string, ikm: Uint8Array, info: Uint8Array, + opt_salt?: Uint8Array): Promise { + let digestSize; + if (!Number.isInteger(size)) { + throw new InvalidArgumentsException('size must be an integer'); + } + if (size <= 0) { + throw new InvalidArgumentsException('size must be positive'); + } + switch (hash) { + case 'SHA-1': + digestSize = 20; + if (size > 255 * 20) { + throw new InvalidArgumentsException('size too large'); + } + break; + case 'SHA-256': + digestSize = 32; + if (size > 255 * 32) { + throw new InvalidArgumentsException('size too large'); + } + break; + case 'SHA-512': + digestSize = 64; + if (size > 255 * 64) { + throw new InvalidArgumentsException('size too large'); + } + break; + default: + throw new InvalidArgumentsException(hash + ' is not supported'); + } + Validators.requireUint8Array(ikm); + Validators.requireUint8Array(info); + let salt = opt_salt; + if (opt_salt == null || salt === undefined || salt.length == 0) { + salt = new Uint8Array(digestSize); + } + Validators.requireUint8Array(salt); + + // Extract. + let hmac = await hmacFromRawKey(hash, salt, digestSize); + const prk = await hmac.computeMac( + // Pseudorandom Key + ikm); + + // Expand + hmac = await hmacFromRawKey(hash, prk, digestSize); + let ctr = 1; + let pos = 0; + let digest = new Uint8Array(0); + const result = new Uint8Array(size); + while (true) { + const input = new Uint8Array(digest.length + info.length + 1); + input.set(digest, 0); + input.set(info, digest.length); + input[input.length - 1] = ctr; + digest = await hmac.computeMac(input); + if (pos + digest.length < size) { + result.set(digest, pos); + pos += digest.length; + ctr++; + } else { + result.set(digest.subarray(0, size - pos), pos); + break; + } + } + return result; +} diff --git a/schemaregistry/rules/encryption/tink/hmac.ts b/schemaregistry/rules/encryption/tink/hmac.ts new file mode 100644 index 00000000..15045e68 --- /dev/null +++ b/schemaregistry/rules/encryption/tink/hmac.ts @@ -0,0 +1,98 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {InvalidArgumentsException} from './exception/invalid_arguments_exception'; +import {Mac} from './mac'; + +import * as Bytes from './bytes'; +import * as Validators from './validators'; +import * as crypto from 'crypto'; + +/** + * The minimum tag size. + * + */ +const MIN_TAG_SIZE_IN_BYTES: number = 10; + +/** + * Implementation of HMAC. + * + * @final + */ +export class Hmac extends Mac { + /** + * @param hash accepted names are SHA-1, SHA-256 and SHA-512 + * @param tagSize the size of the tag + */ + constructor( + private readonly hash: string, private readonly key: CryptoKey, + private readonly tagSize: number) { + super(); + } + + /** + */ + async computeMac(data: Uint8Array): Promise { + Validators.requireUint8Array(data); + const tag = await crypto.subtle.sign( + {'name': 'HMAC', 'hash': {'name': this.hash}}, this.key, data); + return new Uint8Array(tag.slice(0, this.tagSize)); + } + + /** + */ + async verifyMac(tag: Uint8Array, data: Uint8Array): Promise { + Validators.requireUint8Array(tag); + Validators.requireUint8Array(data); + const computedTag = await this.computeMac(data); + return Bytes.isEqual(tag, computedTag); + } +} + +/** + * @param hash accepted names are SHA-1, SHA-256 and SHA-512 + * @param tagSize the size of the tag + */ +export async function fromRawKey( + hash: string, key: Uint8Array, tagSize: number): Promise { + Validators.requireUint8Array(key); + if (!Number.isInteger(tagSize)) { + throw new InvalidArgumentsException('invalid tag size, must be an integer'); + } + if (tagSize < MIN_TAG_SIZE_IN_BYTES) { + throw new InvalidArgumentsException( + 'tag too short, must be at least ' + MIN_TAG_SIZE_IN_BYTES + ' bytes'); + } + switch (hash) { + case 'SHA-1': + if (tagSize > 20) { + throw new InvalidArgumentsException( + 'tag too long, must not be larger than 20 bytes'); + } + break; + case 'SHA-256': + if (tagSize > 32) { + throw new InvalidArgumentsException( + 'tag too long, must not be larger than 32 bytes'); + } + break; + case 'SHA-512': + if (tagSize > 64) { + throw new InvalidArgumentsException( + 'tag too long, must not be larger than 64 bytes'); + } + break; + default: + throw new InvalidArgumentsException(hash + ' is not supported'); + } + + // TODO(b/115974209): Add check that key.length > 16. + const cryptoKey = await crypto.subtle.importKey( + 'raw', key, + {'name': 'HMAC', 'hash': {'name': hash}, 'length': key.length * 8}, false, + ['sign', 'verify']); + return new Hmac(hash, cryptoKey, tagSize); +} diff --git a/schemaregistry/rules/encryption/tink/mac.ts b/schemaregistry/rules/encryption/tink/mac.ts new file mode 100644 index 00000000..31e422da --- /dev/null +++ b/schemaregistry/rules/encryption/tink/mac.ts @@ -0,0 +1,34 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + + +/** + * Interface for Message Authentication Codes (MAC). + * + * Security guarantees: Message Authentication Codes provide symmetric message + * authentication. Instances implementing this interface are secure against + * existential forgery under chosen plaintext attack, and can be deterministic + * or randomized. This interface should be used for authentication only, and not + * for other purposes like generation of pseudorandom bytes. + * + */ +export abstract class Mac { + /** + * Computes message authentication code (MAC) for `data`. + * + * @param data the data to compute MAC + * @return the MAC tag + */ + abstract computeMac(data: Uint8Array): Promise; + + /** + * Verifies whether `tag` is a correct authentication code for `data`. + * + * @param tag the MAC tag + * @param data the data to compute MAC + */ + abstract verifyMac(tag: Uint8Array, data: Uint8Array): Promise; +} diff --git a/schemaregistry/rules/encryption/tink/random.ts b/schemaregistry/rules/encryption/tink/random.ts index 89315cf2..b139bc08 100644 --- a/schemaregistry/rules/encryption/tink/random.ts +++ b/schemaregistry/rules/encryption/tink/random.ts @@ -9,6 +9,7 @@ * @fileoverview Several simple wrappers of crypto.getRandomValues. */ import {InvalidArgumentsException} from './exception/invalid_arguments_exception'; +import * as crypto from 'crypto'; /** * Randomly generates `n` bytes. diff --git a/schemaregistry/rules/jsonata/jsonata-executor.ts b/schemaregistry/rules/jsonata/jsonata-executor.ts new file mode 100644 index 00000000..cd9209dd --- /dev/null +++ b/schemaregistry/rules/jsonata/jsonata-executor.ts @@ -0,0 +1,40 @@ +import {RuleRegistry} from "../../serde/rule-registry"; +import {RuleContext, RuleExecutor} from "../../serde/serde"; +import {ClientConfig} from "../../rest-service"; +import {LRUCache} from "lru-cache"; +import jsonata, {Expression} from "jsonata"; + +export class JsonataExecutor implements RuleExecutor { + config: Map | null = null + cache: LRUCache = new LRUCache({max: 1000}) + + static register(): JsonataExecutor { + const executor = new JsonataExecutor() + RuleRegistry.registerRuleExecutor(executor) + return executor + } + + configure(clientConfig: ClientConfig, config: Map) { + this.config = config + } + + type(): string { + return "JSONATA" + } + + async transform(ctx: RuleContext, msg: any): Promise { + let expr = ctx.rule.expr + if (expr == null) { + return msg + } + let jsonataExpr = this.cache.get(expr) + if (jsonataExpr == null) { + jsonataExpr = jsonata(expr) + this.cache.set(expr, jsonataExpr) + } + return jsonataExpr.evaluate(msg) + } + + async close(): Promise { + } +} diff --git a/schemaregistry/schemaregistry-client.ts b/schemaregistry/schemaregistry-client.ts index 2e0145a5..89d64b39 100644 --- a/schemaregistry/schemaregistry-client.ts +++ b/schemaregistry/schemaregistry-client.ts @@ -3,6 +3,7 @@ import { AxiosResponse } from 'axios'; import stringify from "json-stringify-deterministic"; import { LRUCache } from 'lru-cache'; import { Mutex } from 'async-mutex'; +import {MockClient} from "./mock-schemaregistry-client"; /* * Confluent-Schema-Registry-TypeScript - Node.js wrapper for Confluent Schema Registry @@ -34,7 +35,7 @@ export interface Rule { kind?: string mode?: RuleMode type: string - tags?: Set + tags?: string[] params?: { [key: string]: string } expr?: string onSuccess?: string @@ -59,6 +60,17 @@ export interface SchemaInfo { ruleSet?: RuleSet; } +// Ensure that SchemaMetadata fields are removed +export function minimize(info: SchemaInfo): SchemaInfo { + return { + schemaType: info.schemaType, + schema: info.schema, + references: info.references, + metadata: info.metadata, + ruleSet: info.ruleSet + } +} + export interface SchemaMetadata extends SchemaInfo { id: number; subject?: string; @@ -72,9 +84,9 @@ export interface Reference { } export interface Metadata { - tags?: { [key: string]: Set }; + tags?: { [key: string]: string[] }; properties?: { [key: string]: string }; - sensitive?: Set; + sensitive?: string[]; } export interface RuleSet { @@ -102,11 +114,12 @@ export interface Client { config(): ClientConfig; register(subject: string, schema: SchemaInfo, normalize: boolean): Promise; registerFullResponse(subject: string, schema: SchemaInfo, normalize: boolean): Promise; - getBySubjectAndId(subject: string, id: number): Promise; + getBySubjectAndId(subject: string, id: number, format?: string): Promise; getId(subject: string, schema: SchemaInfo, normalize: boolean): Promise; - getLatestSchemaMetadata(subject: string): Promise; - getSchemaMetadata(subject: string, version: number, deleted: boolean): Promise; - getLatestWithMetadata(subject: string, metadata: { [key: string]: string }, deleted: boolean): Promise; + getLatestSchemaMetadata(subject: string, format?: string): Promise; + getSchemaMetadata(subject: string, version: number, deleted: boolean, format?: string): Promise; + getLatestWithMetadata(subject: string, metadata: { [key: string]: string }, + deleted: boolean, format?: string): Promise; getAllVersions(subject: string): Promise; getVersion(subject: string, schema: SchemaInfo, normalize: boolean): Promise; getAllSubjects(): Promise; @@ -170,6 +183,14 @@ export class SchemaRegistryClient implements Client { this.metadataToSchemaMutex = new Mutex(); } + static newClient(config: ClientConfig): Client { + let url = config.baseURLs[0] + if (url.startsWith("mock://")) { + return new MockClient(config) + } + return new SchemaRegistryClient(config) + } + config(): ClientConfig { return this.clientConfig } @@ -181,7 +202,7 @@ export class SchemaRegistryClient implements Client { } async registerFullResponse(subject: string, schema: SchemaInfo, normalize: boolean = false): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); return await this.infoToSchemaMutex.runExclusive(async () => { const cachedSchemaMetadata: SchemaMetadata | undefined = this.infoToSchemaCache.get(cacheKey); @@ -201,7 +222,7 @@ export class SchemaRegistryClient implements Client { }); } - async getBySubjectAndId(subject: string, id: number): Promise { + async getBySubjectAndId(subject: string, id: number, format?: string): Promise { const cacheKey = stringify({ subject, id }); return await this.idToSchemaInfoMutex.runExclusive(async () => { const cachedSchema: SchemaInfo | undefined = this.idToSchemaInfoCache.get(cacheKey); @@ -211,8 +232,10 @@ export class SchemaRegistryClient implements Client { subject = encodeURIComponent(subject); + let formatStr = format != null ? `&format=${format}` : ''; + const response: AxiosResponse = await this.restService.handleRequest( - `/schemas/ids/${id}?subject=${subject}`, + `/schemas/ids/${id}?subject=${subject}${formatStr}`, 'GET' ); this.idToSchemaInfoCache.set(cacheKey, response.data); @@ -221,7 +244,7 @@ export class SchemaRegistryClient implements Client { } async getId(subject: string, schema: SchemaInfo, normalize: boolean = false): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); return await this.schemaToIdMutex.runExclusive(async () => { const cachedId: number | undefined = this.schemaToIdCache.get(cacheKey); @@ -241,7 +264,7 @@ export class SchemaRegistryClient implements Client { }); } - async getLatestSchemaMetadata(subject: string): Promise { + async getLatestSchemaMetadata(subject: string, format?: string): Promise { return await this.latestToSchemaMutex.runExclusive(async () => { const cachedSchema: SchemaMetadata | undefined = this.latestToSchemaCache.get(subject); if (cachedSchema) { @@ -250,8 +273,10 @@ export class SchemaRegistryClient implements Client { subject = encodeURIComponent(subject); + let formatStr = format != null ? `?format=${format}` : ''; + const response: AxiosResponse = await this.restService.handleRequest( - `/subjects/${subject}/versions/latest`, + `/subjects/${subject}/versions/latest${formatStr}`, 'GET' ); this.latestToSchemaCache.set(subject, response.data); @@ -259,7 +284,7 @@ export class SchemaRegistryClient implements Client { }); } - async getSchemaMetadata(subject: string, version: number, deleted: boolean = false): Promise { + async getSchemaMetadata(subject: string, version: number, deleted: boolean = false, format?: string): Promise { const cacheKey = stringify({ subject, version, deleted }); return await this.versionToSchemaMutex.runExclusive(async () => { @@ -270,8 +295,10 @@ export class SchemaRegistryClient implements Client { subject = encodeURIComponent(subject); + let formatStr = format != null ? `&format=${format}` : ''; + const response: AxiosResponse = await this.restService.handleRequest( - `/subjects/${subject}/versions/${version}?deleted=${deleted}`, + `/subjects/${subject}/versions/${version}?deleted=${deleted}${formatStr}`, 'GET' ); this.versionToSchemaCache.set(cacheKey, response.data); @@ -279,7 +306,8 @@ export class SchemaRegistryClient implements Client { }); } - async getLatestWithMetadata(subject: string, metadata: { [key: string]: string }, deleted: boolean = false): Promise { + async getLatestWithMetadata(subject: string, metadata: { [key: string]: string }, + deleted: boolean = false, format?: string): Promise { const cacheKey = stringify({ subject, metadata, deleted }); return await this.metadataToSchemaMutex.runExclusive(async () => { @@ -298,8 +326,10 @@ export class SchemaRegistryClient implements Client { metadataStr += `&key=${encodedKey}&value=${encodedValue}`; } + let formatStr = format != null ? `&format=${format}` : ''; + const response: AxiosResponse = await this.restService.handleRequest( - `/subjects/${subject}/metadata?deleted=${deleted}&${metadataStr}`, + `/subjects/${subject}/metadata?deleted=${deleted}&${metadataStr}${formatStr}`, 'GET' ); this.metadataToSchemaCache.set(cacheKey, response.data); @@ -317,7 +347,7 @@ export class SchemaRegistryClient implements Client { } async getVersion(subject: string, schema: SchemaInfo, normalize: boolean = false): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); return await this.schemaToVersionMutex.runExclusive(async () => { const cachedVersion: number | undefined = this.schemaToVersionCache.get(cacheKey); @@ -399,7 +429,7 @@ export class SchemaRegistryClient implements Client { const parsedKey = JSON.parse(key); if (parsedKey.subject === subject && value === version) { this.schemaToVersionCache.delete(key); - const infoToSchemaCacheKey = stringify({ subject: subject, schema: parsedKey.schema }); + const infoToSchemaCacheKey = stringify({ subject: subject, schema: minimize(parsedKey.schema) }); this.infoToSchemaMutex.runExclusive(async () => { metadataValue = this.infoToSchemaCache.get(infoToSchemaCacheKey); @@ -537,14 +567,14 @@ export class SchemaRegistryClient implements Client { // Cache methods for testing async addToInfoToSchemaCache(subject: string, schema: SchemaInfo, metadata: SchemaMetadata): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); await this.infoToSchemaMutex.runExclusive(async () => { this.infoToSchemaCache.set(cacheKey, metadata); }); } async addToSchemaToVersionCache(subject: string, schema: SchemaInfo, version: number): Promise { - const cacheKey = stringify({ subject, schema }); + const cacheKey = stringify({ subject, schema: minimize(schema) }); await this.schemaToVersionMutex.runExclusive(async () => { this.schemaToVersionCache.set(cacheKey, version); }); diff --git a/schemaregistry/serde/avro.ts b/schemaregistry/serde/avro.ts index d1590607..5444e938 100644 --- a/schemaregistry/serde/avro.ts +++ b/schemaregistry/serde/avro.ts @@ -10,7 +10,7 @@ import { Client, RuleMode, SchemaInfo } from "../schemaregistry-client"; -import avro, { ForSchemaOptions, Type, types } from "avsc"; +import avro, {ForSchemaOptions, Type, types} from "avsc"; import UnwrappedUnionType = types.UnwrappedUnionType import WrappedUnionType = types.WrappedUnionType import ArrayType = types.ArrayType @@ -18,7 +18,7 @@ import MapType = types.MapType import RecordType = types.RecordType import Field = types.Field import { LRUCache } from 'lru-cache' -import {getRuleExecutors} from "./rule-registry"; +import {RuleRegistry} from "./rule-registry"; import stringify from "json-stringify-deterministic"; type TypeHook = (schema: avro.Schema, opts: ForSchemaOptions) => Type | undefined @@ -26,22 +26,22 @@ type TypeHook = (schema: avro.Schema, opts: ForSchemaOptions) => Type | undefine export type AvroSerdeConfig = Partial export interface AvroSerde { - schemaToTypeCache: LRUCache + schemaToTypeCache: LRUCache]> } export type AvroSerializerConfig = SerializerConfig & AvroSerdeConfig export class AvroSerializer extends Serializer implements AvroSerde { - schemaToTypeCache: LRUCache + schemaToTypeCache: LRUCache]> - constructor(client: Client, serdeType: SerdeType, conf: AvroSerializerConfig) { - super(client, serdeType, conf) - this.schemaToTypeCache = new LRUCache({ max: this.conf.cacheCapacity ?? 1000 }) + constructor(client: Client, serdeType: SerdeType, conf: AvroSerializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) + this.schemaToTypeCache = new LRUCache]>({ max: this.conf.cacheCapacity ?? 1000 }) this.fieldTransformer = async (ctx: RuleContext, fieldTransform: FieldTransform, msg: any) => { return await this.fieldTransform(ctx, fieldTransform, msg) } - for (const rule of getRuleExecutors()) { - rule.configure(client.config(), conf.ruleConfig ?? new Map) + for (const rule of this.ruleRegistry.getExecutors()) { + rule.configure(client.config(), new Map(Object.entries(conf.ruleConfig ?? {}))) } } @@ -53,25 +53,51 @@ export class AvroSerializer extends Serializer implements AvroSerde { throw new Error('message is empty') } - let avroSchema = Type.forValue(msg) + let enumIndex = 1 + let fixedIndex = 1 + let recordIndex = 1 + + const namingHook: TypeHook = ( + avroSchema: avro.Schema, + opts: ForSchemaOptions, + ) => { + let schema = avroSchema as any + switch (schema.type) { + case 'enum': + schema.name = `Enum${enumIndex++}`; + break; + case 'fixed': + schema.name = `Fixed${fixedIndex++}`; + break; + case 'record': + schema.name = `Record${recordIndex++}`; + break; + default: + } + return undefined + } + + let avroSchema = Type.forValue(msg, { typeHook: namingHook }) const schema: SchemaInfo = { schemaType: 'AVRO', schema: JSON.stringify(avroSchema), } const [id, info] = await this.getId(topic, msg, schema) - avroSchema = await this.toType(info) + let deps: Map + [avroSchema, deps] = await this.toType(info) const subject = this.subjectName(topic, info) - msg = await this.executeRules(subject, topic, RuleMode.WRITE, null, info, msg, getInlineTags(avroSchema)) + msg = await this.executeRules( + subject, topic, RuleMode.WRITE, null, info, msg, getInlineTags(info, deps)) const msgBytes = avroSchema.toBuffer(msg) return this.writeBytes(id, msgBytes) } async fieldTransform(ctx: RuleContext, fieldTransform: FieldTransform, msg: any): Promise { - const schema = await this.toType(ctx.target) + const [schema, ] = await this.toType(ctx.target) return await transform(ctx, schema, msg, fieldTransform) } - async toType(info: SchemaInfo): Promise { + async toType(info: SchemaInfo): Promise<[Type, Map]> { return toType(this.client, this.conf as AvroDeserializerConfig, this, info, async (client, info) => { const deps = new Map() await this.resolveReferences(client, info, deps) @@ -83,16 +109,16 @@ export class AvroSerializer extends Serializer implements AvroSerde { export type AvroDeserializerConfig = DeserializerConfig & AvroSerdeConfig export class AvroDeserializer extends Deserializer implements AvroSerde { - schemaToTypeCache: LRUCache + schemaToTypeCache: LRUCache]> - constructor(client: Client, serdeType: SerdeType, conf: AvroDeserializerConfig) { - super(client, serdeType, conf) - this.schemaToTypeCache = new LRUCache({ max: this.conf.cacheCapacity ?? 1000 }) + constructor(client: Client, serdeType: SerdeType, conf: AvroDeserializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) + this.schemaToTypeCache = new LRUCache]>({ max: this.conf.cacheCapacity ?? 1000 }) this.fieldTransformer = async (ctx: RuleContext, fieldTransform: FieldTransform, msg: any) => { return await this.fieldTransform(ctx, fieldTransform, msg) } - for (const rule of getRuleExecutors()) { - rule.configure(client.config(), conf.ruleConfig ?? new Map) + for (const rule of this.ruleRegistry.getExecutors()) { + rule.configure(client.config(), new Map(Object.entries(conf.ruleConfig ?? {}))) } } @@ -111,7 +137,7 @@ export class AvroDeserializer extends Deserializer implements AvroSerde { if (readerMeta != null) { migrations = await this.getMigrations(subject, info, readerMeta) } - const writer = await this.toType(info) + const [writer, deps] = await this.toType(info) let msg: any const msgBytes = payload.subarray(5) @@ -120,7 +146,7 @@ export class AvroDeserializer extends Deserializer implements AvroSerde { msg = await this.executeMigrations(migrations, subject, topic, msg) } else { if (readerMeta != null) { - const reader = await this.toType(readerMeta) + const [reader, ] = await this.toType(readerMeta) if (reader.equals(writer)) { msg = reader.fromBuffer(msgBytes) } else { @@ -136,16 +162,17 @@ export class AvroDeserializer extends Deserializer implements AvroSerde { } else { target = info } - msg = await this.executeRules(subject, topic, RuleMode.READ, null, target, msg, getInlineTags(writer)) + msg = await this.executeRules( + subject, topic, RuleMode.READ, null, target, msg, getInlineTags(info, deps)) return msg } async fieldTransform(ctx: RuleContext, fieldTransform: FieldTransform, msg: any): Promise { - const schema = await this.toType(ctx.target) + const [schema, ] = await this.toType(ctx.target) return await transform(ctx, schema, msg, fieldTransform) } - async toType(info: SchemaInfo): Promise { + async toType(info: SchemaInfo): Promise<[Type, Map]> { return toType(this.client, this.conf as AvroDeserializerConfig, this, info, async (client, info) => { const deps = new Map() await this.resolveReferences(client, info, deps) @@ -160,10 +187,10 @@ async function toType( serde: AvroSerde, info: SchemaInfo, refResolver: RefResolver, -): Promise { - let type = serde.schemaToTypeCache.get(stringify(info.schema)) - if (type != null) { - return type +): Promise<[Type, Map]> { + let tuple = serde.schemaToTypeCache.get(stringify(info.schema)) + if (tuple != null) { + return tuple } const deps = await refResolver(client, info) @@ -172,8 +199,10 @@ async function toType( schema: avro.Schema, opts: ForSchemaOptions, ) => { - deps.forEach((_name, schema) => { - avro.Type.forSchema(JSON.parse(schema), opts) + const avroOpts = opts as AvroSerdeConfig + deps.forEach((schema, _name) => { + avroOpts.typeHook = userHook + avro.Type.forSchema(JSON.parse(schema), avroOpts) }) if (userHook) { return userHook(schema, opts) @@ -182,12 +211,12 @@ async function toType( } const avroOpts = conf - type = avro.Type.forSchema(JSON.parse(info.schema), { + let type = avro.Type.forSchema(JSON.parse(info.schema), { ...avroOpts, typeHook: addReferencedSchemas(avroOpts?.typeHook), }) - serde.schemaToTypeCache.set(stringify(info.schema), type) - return type + serde.schemaToTypeCache.set(stringify(info.schema), [type, deps]) + return [type, deps] } async function transform(ctx: RuleContext, schema: Type, msg: any, fieldTransform: FieldTransform): Promise { @@ -226,8 +255,8 @@ async function transform(ctx: RuleContext, schema: Type, msg: any, fieldTransfor return record default: if (fieldCtx != null) { - const ruleTags = ctx.rule.tags - if (ruleTags == null || ruleTags.size === 0 || !disjoint(ruleTags, fieldCtx.tags)) { + const ruleTags = ctx.rule.tags ?? [] + if (ruleTags == null || ruleTags.length === 0 || !disjoint(new Set(ruleTags), fieldCtx.tags)) { return await fieldTransform.transform(ctx, fieldCtx, msg) } } @@ -246,7 +275,7 @@ async function transformField( const fullName = recordSchema.name + '.' + field.name try { ctx.enterField( - val.Interface(), + val, fullName, field.name, getType(field.type), @@ -330,9 +359,12 @@ function resolveUnion(schema: Type, msg: any): Type | null { return null } -function getInlineTags(schema: object): Map> { +function getInlineTags(info: SchemaInfo, deps: Map): Map> { const inlineTags = new Map>() - getInlineTagsRecursively('', '', schema, inlineTags) + getInlineTagsRecursively('', '', JSON.parse(info.schema), inlineTags) + for (const depSchema of Object.values(deps)) { + getInlineTagsRecursively('', '', JSON.parse(depSchema), inlineTags) + } return inlineTags } @@ -378,3 +410,5 @@ function impliedNamespace(name: string): string | null { const match = /^(.*)\.[^.]+$/.exec(name) return match ? match[1] : null } + + diff --git a/schemaregistry/serde/json_util.ts b/schemaregistry/serde/json-util.ts similarity index 100% rename from schemaregistry/serde/json_util.ts rename to schemaregistry/serde/json-util.ts diff --git a/schemaregistry/serde/json.ts b/schemaregistry/serde/json.ts index 7c53d1db..a40632d9 100644 --- a/schemaregistry/serde/json.ts +++ b/schemaregistry/serde/json.ts @@ -27,8 +27,8 @@ import { } from '@criteria/json-schema/draft-07' import { validateJSON } from '@criteria/json-schema-validation' import { LRUCache } from "lru-cache"; -import { generateSchema } from "./json_util"; -import {getRuleExecutors} from "./rule-registry"; +import { generateSchema } from "./json-util"; +import {RuleRegistry} from "./rule-registry"; import stringify from "json-stringify-deterministic"; export interface ValidateFunction { @@ -53,15 +53,15 @@ export class JsonSerializer extends Serializer implements JsonSerde { schemaToTypeCache: LRUCache schemaToValidateCache: LRUCache - constructor(client: Client, serdeType: SerdeType, conf: JsonSerializerConfig) { - super(client, serdeType, conf) + constructor(client: Client, serdeType: SerdeType, conf: JsonSerializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) this.schemaToTypeCache = new LRUCache({ max: this.config().cacheCapacity ?? 1000 }) this.schemaToValidateCache = new LRUCache({ max: this.config().cacheCapacity ?? 1000 }) this.fieldTransformer = async (ctx: RuleContext, fieldTransform: FieldTransform, msg: any) => { return await this.fieldTransform(ctx, fieldTransform, msg) } - for (const rule of getRuleExecutors()) { - rule.configure(client.config(), conf.ruleConfig ?? new Map) + for (const rule of this.ruleRegistry.getExecutors()) { + rule.configure(client.config(), new Map(Object.entries(conf.ruleConfig ?? {}))) } } @@ -123,15 +123,15 @@ export class JsonDeserializer extends Deserializer implements JsonSerde { schemaToTypeCache: LRUCache schemaToValidateCache: LRUCache - constructor(client: Client, serdeType: SerdeType, conf: JsonDeserializerConfig) { - super(client, serdeType, conf) + constructor(client: Client, serdeType: SerdeType, conf: JsonDeserializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) this.schemaToTypeCache = new LRUCache({ max: this.config().cacheCapacity ?? 1000 }) this.schemaToValidateCache = new LRUCache({ max: this.config().cacheCapacity ?? 1000 }) this.fieldTransformer = async (ctx: RuleContext, fieldTransform: FieldTransform, msg: any) => { return await this.fieldTransform(ctx, fieldTransform, msg) } - for (const rule of getRuleExecutors()) { - rule.configure(client.config(), conf.ruleConfig ?? new Map) + for (const rule of this.ruleRegistry.getExecutors()) { + rule.configure(client.config(), new Map(Object.entries(conf.ruleConfig ?? {}))) } } @@ -213,7 +213,7 @@ async function toValidateFunction( const spec = json.$schema if (spec === 'http://json-schema.org/draft/2020-12/schema') { const ajv2020 = new Ajv2020(conf as JsonSerdeConfig) - deps.forEach((name, schema) => { + deps.forEach((schema, name) => { ajv2020.addSchema(JSON.parse(schema), name) }) fn = ajv2020.compile(json) @@ -221,7 +221,7 @@ async function toValidateFunction( const ajv = new Ajv2019(conf as JsonSerdeConfig) ajv.addMetaSchema(draft6MetaSchema) ajv.addMetaSchema(draft7MetaSchema) - deps.forEach((name, schema) => { + deps.forEach((schema, name) => { ajv.addSchema(JSON.parse(schema), name) }) fn = ajv.compile(json) @@ -317,7 +317,7 @@ async function transform(ctx: RuleContext, schema: DereferencedJSONSchema, path: case FieldType.BOOLEAN: if (fieldCtx != null) { const ruleTags = ctx.rule.tags - if (ruleTags == null || ruleTags.size === 0 || !disjoint(ruleTags, fieldCtx.tags)) { + if (ruleTags == null || ruleTags.length === 0 || !disjoint(new Set(ruleTags), fieldCtx.tags)) { return await fieldTransform.transform(ctx, fieldCtx, msg) } } diff --git a/schemaregistry/serde/protobuf.ts b/schemaregistry/serde/protobuf.ts index 363a322c..cfa59ce7 100644 --- a/schemaregistry/serde/protobuf.ts +++ b/schemaregistry/serde/protobuf.ts @@ -14,47 +14,99 @@ import { SchemaMetadata } from "../schemaregistry-client"; import { - createFileRegistry, + createFileRegistry, createMutableRegistry, DescField, DescFile, DescMessage, FileRegistry, - fromBinary, getExtension, hasExtension, - Registry, + fromBinary, getExtension, hasExtension, MutableRegistry, ScalarType, - toBinary + toBinary, } from "@bufbuild/protobuf"; -import { FileDescriptorProtoSchema } from "@bufbuild/protobuf/wkt"; +import { + file_google_protobuf_any, + file_google_protobuf_api, + file_google_protobuf_descriptor, + file_google_protobuf_duration, + file_google_protobuf_empty, + file_google_protobuf_field_mask, + file_google_protobuf_source_context, + file_google_protobuf_struct, + file_google_protobuf_timestamp, file_google_protobuf_type, file_google_protobuf_wrappers, + FileDescriptorProtoSchema +} from "@bufbuild/protobuf/wkt"; import { BufferWrapper, MAX_VARINT_LEN_64 } from "./buffer-wrapper"; import { LRUCache } from "lru-cache"; -import {field_meta, Meta} from "../confluent/meta_pb"; -import {getRuleExecutors} from "./rule-registry"; +import {field_meta, file_confluent_meta, Meta} from "../confluent/meta_pb"; +import {RuleRegistry} from "./rule-registry"; import stringify from "json-stringify-deterministic"; +import {file_confluent_types_decimal} from "../confluent/types/decimal_pb"; +import {file_google_type_calendar_period} from "../google/type/calendar_period_pb"; +import {file_google_type_color} from "../google/type/color_pb"; +import {file_google_type_date} from "../google/type/date_pb"; +import {file_google_type_datetime} from "../google/type/datetime_pb"; +import {file_google_type_dayofweek} from "../google/type/dayofweek_pb"; +import {file_google_type_fraction} from "../google/type/fraction_pb"; +import {file_google_type_expr} from "../google/type/expr_pb"; +import {file_google_type_latlng} from "../google/type/latlng_pb"; +import {file_google_type_money} from "../google/type/money_pb"; +import {file_google_type_postal_address} from "../google/type/postal_address_pb"; +import {file_google_type_quaternion} from "../google/type/quaternion_pb"; +import {file_google_type_timeofday} from "../google/type/timeofday_pb"; +import {file_google_type_month} from "../google/type/month_pb"; + +const builtinDeps = new Map([ + ['confluent/meta.proto', file_confluent_meta], + ['confluent/type/decimal.proto', file_confluent_types_decimal], + ['google/type/calendar_period.proto', file_google_type_calendar_period], + ['google/type/color.proto', file_google_type_color], + ['google/type/date.proto', file_google_type_date], + ['google/type/datetime.proto', file_google_type_datetime], + ['google/type/dayofweek.proto', file_google_type_dayofweek], + ['google/type/expr.proto', file_google_type_expr], + ['google/type/fraction.proto', file_google_type_fraction], + ['google/type/latlng.proto', file_google_type_latlng], + ['google/type/money.proto', file_google_type_money], + ['google/type/month.proto', file_google_type_month], + ['google/type/postal_address.proto', file_google_type_postal_address], + ['google/type/quaternion.proto', file_google_type_quaternion], + ['google/type/timeofday.proto', file_google_type_timeofday], + ['google/protobuf/any.proto', file_google_protobuf_any], + ['google/protobuf/api.proto', file_google_protobuf_api], + ['google/protobuf/descriptor.proto', file_google_protobuf_descriptor], + ['google/protobuf/duration.proto', file_google_protobuf_duration], + ['google/protobuf/empty.proto', file_google_protobuf_empty], + ['google/protobuf/field_mask.proto', file_google_protobuf_field_mask], + ['google/protobuf/source_context.proto', file_google_protobuf_source_context], + ['google/protobuf/struct.proto', file_google_protobuf_struct], + ['google/protobuf/timestamp.proto', file_google_protobuf_timestamp], + ['google/protobuf/type.proto', file_google_protobuf_type], + ['google/protobuf/wrappers.proto', file_google_protobuf_wrappers], +]) export interface ProtobufSerde { schemaToDescCache: LRUCache } export type ProtobufSerializerConfig = SerializerConfig & { - registry: Registry - descToSchemaCache: LRUCache + registry?: MutableRegistry } export class ProtobufSerializer extends Serializer implements ProtobufSerde { - registry: Registry + registry: MutableRegistry schemaToDescCache: LRUCache descToSchemaCache: LRUCache - constructor(client: Client, serdeType: SerdeType, conf: ProtobufSerializerConfig) { - super(client, serdeType, conf) - this.registry = conf.registry + constructor(client: Client, serdeType: SerdeType, conf: ProtobufSerializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) + this.registry = conf.registry ?? createMutableRegistry() this.schemaToDescCache = new LRUCache({ max: this.config().cacheCapacity ?? 1000 } ) this.descToSchemaCache = new LRUCache({ max: this.config().cacheCapacity ?? 1000 } ) this.fieldTransformer = async (ctx: RuleContext, fieldTransform: FieldTransform, msg: any) => { return await this.fieldTransform(ctx, fieldTransform, msg) } - for (const rule of getRuleExecutors()) { - rule.configure(client.config(), conf.ruleConfig ?? new Map) + for (const rule of this.ruleRegistry.getExecutors()) { + rule.configure(client.config(), new Map(Object.entries(conf.ruleConfig ?? {}))) } } @@ -76,7 +128,7 @@ export class ProtobufSerializer extends Serializer implements ProtobufSerde { } const fileDesc = messageDesc.file const schema = await this.getSchemaInfo(fileDesc) - const [id, info] = await this.getId(topic, msg, schema) + const [id, info] = await this.getId(topic, msg, schema, 'serialized') const subject = this.subjectName(topic, info) msg = await this.executeRules(subject, topic, RuleMode.WRITE, null, info, msg, null) const msgIndexBytes = this.toMessageIndexBytes(messageDesc) @@ -114,7 +166,7 @@ export class ProtobufSerializer extends Serializer implements ProtobufSerde { toDependencies(fileDesc: DescFile, deps: Map) { deps.set(fileDesc.name, Buffer.from(toBinary(FileDescriptorProtoSchema, fileDesc.proto)).toString('base64')) fileDesc.dependencies.forEach((dep) => { - if (!this.ignoreFile(dep.name)) { + if (!isBuiltin(dep.name)) { this.toDependencies(dep, deps) } }) @@ -123,17 +175,17 @@ export class ProtobufSerializer extends Serializer implements ProtobufSerde { async resolveDependencies(fileDesc: DescFile, deps: Map, subject: string, autoRegister: boolean, normalize: boolean): Promise { const refs: Reference[] = [] - refs.length = fileDesc.dependencies.length for (let i = 0; i < fileDesc.dependencies.length; i++) { const dep = fileDesc.dependencies[i] - if (this.ignoreFile(dep.name)) { + const depName = dep.name + '.proto' + if (isBuiltin(depName)) { continue } - const ref = await this.resolveDependencies(dep, deps, dep.name, autoRegister, normalize) + const ref = await this.resolveDependencies(dep, deps, depName, autoRegister, normalize) if (ref == null) { throw new SerializationError('dependency not found') } - refs.push({name: dep.name, subject: ref.subject!, version: ref.version!}) + refs.push({name: depName, subject: ref.subject!, version: ref.version!}) } const info: SchemaInfo = { schema: deps.get(fileDesc.name)!, @@ -182,8 +234,7 @@ export class ProtobufSerializer extends Serializer implements ProtobufSerde { // done. Allocate an array large enough to hold count+1 entries and // populate first value with index const msgIndexes: number[] = [] - msgIndexes.length = count + 1 - msgIndexes[0] = index + msgIndexes.push(index) return msgIndexes } else { const msgIndexes = this.toMessageIndexes(parent, count + 1) @@ -211,12 +262,6 @@ export class ProtobufSerializer extends Serializer implements ProtobufSerde { throw new SerializationError('message descriptor not found in file descriptor'); } - ignoreFile(name: string): boolean { - return name.startsWith('confluent/') || - name.startsWith('google/protobuf/') || - name.startsWith('google/type/') - } - async fieldTransform(ctx: RuleContext, fieldTransform: FieldTransform, msg: any): Promise { const typeName = msg.$typeName if (typeName == null) { @@ -236,15 +281,15 @@ export class ProtobufDeserializer extends Deserializer implements ProtobufSerde registry: FileRegistry schemaToDescCache: LRUCache - constructor(client: Client, serdeType: SerdeType, conf: ProtobufDeserializerConfig) { - super(client, serdeType, conf) + constructor(client: Client, serdeType: SerdeType, conf: ProtobufDeserializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) this.registry = createFileRegistry() this.schemaToDescCache = new LRUCache({ max: this.config().cacheCapacity ?? 1000 } ) this.fieldTransformer = async (ctx: RuleContext, fieldTransform: FieldTransform, msg: any) => { return await this.fieldTransform(ctx, fieldTransform, msg) } - for (const rule of getRuleExecutors()) { - rule.configure(client.config(), conf.ruleConfig ?? new Map) + for (const rule of this.ruleRegistry.getExecutors()) { + rule.configure(client.config(), new Map(Object.entries(conf.ruleConfig ?? {}))) } } @@ -256,13 +301,13 @@ export class ProtobufDeserializer extends Deserializer implements ProtobufSerde return null } - const info = await this.getSchema(topic, payload) + const info = await this.getSchema(topic, payload, 'serialized') const fd = await this.toFileDesc(this.client, info) const [bytesRead, msgIndexes] = this.readMessageIndexes(payload.subarray(5)) const messageDesc = this.toMessageDesc(fd, msgIndexes) const subject = this.subjectName(topic, info) - const readerMeta = await this.getReaderSchema(subject) + const readerMeta = await this.getReaderSchema(subject, 'serialized') const msgBytes = payload.subarray(5 + bytesRead) let msg = fromBinary(messageDesc, msgBytes) @@ -306,16 +351,25 @@ export class ProtobufDeserializer extends Deserializer implements ProtobufSerde async parseFileDesc(client: Client, info: SchemaInfo): Promise { const deps = new Map() - await this.resolveReferences(client, info, deps) + await this.resolveReferences(client, info, deps, 'serialized') const fileDesc = fromBinary(FileDescriptorProtoSchema, Buffer.from(info.schema, 'base64')) const resolve = (depName: string) => { - const dep = deps.get(depName) - if (dep == null) { - throw new SerializationError('dependency not found') + if (isBuiltin(depName)) { + const dep = builtinDeps.get(depName) + if (dep == null) { + throw new SerializationError(`dependency ${depName} not found`) + } + return dep + } else { + const dep = deps.get(depName) + if (dep == null) { + throw new SerializationError(`dependency ${depName} not found`) + } + const fileDesc = fromBinary(FileDescriptorProtoSchema, Buffer.from(dep, 'base64')) + fileDesc.name = depName + return fileDesc } - return fromBinary(FileDescriptorProtoSchema, Buffer.from(dep, 'base64')) } - // TODO check google protos already in registry const fileRegistry = createFileRegistry(fileDesc, resolve) this.registry = createFileRegistry(this.registry, fileRegistry) return this.registry.getFile(fileDesc.name) @@ -325,9 +379,8 @@ export class ProtobufDeserializer extends Deserializer implements ProtobufSerde const bw = new BufferWrapper(payload) const count = bw.readVarInt() const msgIndexes = [] - msgIndexes.length = count for (let i = 0; i < count; i++) { - msgIndexes[i] = bw.readVarInt() + msgIndexes.push(bw.readVarInt()) } return [bw.pos, msgIndexes] } @@ -372,8 +425,8 @@ async function transform(ctx: RuleContext, descriptor: DescMessage, msg: any, fi } const fieldCtx = ctx.currentField() if (fieldCtx != null) { - const ruleTags = ctx.rule.tags - if (ruleTags == null || ruleTags.size === 0 || !disjoint(ruleTags, fieldCtx.tags)) { + const ruleTags = ctx.rule.tags ?? [] + if (ruleTags == null || ruleTags.length === 0 || !disjoint(new Set(ruleTags), fieldCtx.tags)) { return await fieldTransform.transform(ctx, fieldCtx, msg) } } @@ -461,5 +514,8 @@ function disjoint(tags1: Set, tags2: Set): boolean { return true } - - +function isBuiltin(name: string): boolean { + return name.startsWith('confluent/') || + name.startsWith('google/protobuf/') || + name.startsWith('google/type/') +} diff --git a/schemaregistry/serde/rule-registry.ts b/schemaregistry/serde/rule-registry.ts index e1fb1514..d10320f8 100644 --- a/schemaregistry/serde/rule-registry.ts +++ b/schemaregistry/serde/rule-registry.ts @@ -1,42 +1,56 @@ import {RuleAction, RuleExecutor} from "./serde"; -const ruleExecutors = new Map - -const ruleActions = new Map - - -// registerRuleExecutor is used to register a new rule executor. -export function registerRuleExecutor(ruleExecutor: RuleExecutor): void { - ruleExecutors.set(ruleExecutor.type(), ruleExecutor) -} - -// getRuleExecutor fetches a rule executor by a given name. -export function getRuleExecutor(name: string): RuleExecutor | undefined { - return ruleExecutors.get(name) -} - -// getRuleExecutors fetches all rule executors -export function getRuleExecutors(): RuleExecutor[] { - return Array.from(ruleExecutors.values()) -} - -// registerRuleAction is used to register a new rule action. -export function registerRuleAction(ruleAction: RuleAction): void { - ruleActions.set(ruleAction.type(), ruleAction) -} - -// getRuleAction fetches a rule action by a given name. -export function getRuleAction(name: string): RuleAction | undefined { - return ruleActions.get(name) -} - -// getRuleActions fetches all rule actions -export function getRuleActions(): RuleAction[] { - return Array.from(ruleActions.values()) -} - -// clearRules clears all registered rules -export function clearRules(): void { - ruleExecutors.clear() - ruleActions.clear() +export class RuleRegistry { + private ruleExecutors: Map = new Map() + private ruleActions: Map = new Map() + + private static globalInstance: RuleRegistry = new RuleRegistry() + + // registerExecutor is used to register a new rule executor. + public registerExecutor(ruleExecutor: RuleExecutor): void { + this.ruleExecutors.set(ruleExecutor.type(), ruleExecutor) + } + + // getExecutor fetches a rule executor by a given name. + public getExecutor(name: string): RuleExecutor | undefined { + return this.ruleExecutors.get(name) + } + + // getExecutors fetches all rule executors + public getExecutors(): RuleExecutor[] { + return Array.from(this.ruleExecutors.values()) + } + + // registerAction is used to register a new rule action. + public registerAction(ruleAction: RuleAction): void { + this.ruleActions.set(ruleAction.type(), ruleAction) + } + + // getAction fetches a rule action by a given name. + public getAction(name: string): RuleAction | undefined { + return this.ruleActions.get(name) + } + + // getActions fetches all rule actions + public getActions(): RuleAction[] { + return Array.from(this.ruleActions.values()) + } + + // clear clears all registered rules + public clear(): void { + this.ruleExecutors.clear() + this.ruleActions.clear() + } + + public static getGlobalInstance(): RuleRegistry { + return RuleRegistry.globalInstance + } + + public static registerRuleExecutor(ruleExecutor: RuleExecutor): void { + RuleRegistry.globalInstance.registerExecutor(ruleExecutor) + } + + public static registerRuleAction(ruleAction: RuleAction): void { + RuleRegistry.globalInstance.registerAction(ruleAction) + } } diff --git a/schemaregistry/serde/serde.ts b/schemaregistry/serde/serde.ts index b550c941..18a5321a 100644 --- a/schemaregistry/serde/serde.ts +++ b/schemaregistry/serde/serde.ts @@ -5,11 +5,10 @@ import { RuleMode, RuleSet, SchemaInfo, - SchemaMetadata, SchemaRegistryClient + SchemaMetadata } from "../schemaregistry-client"; -import {getRuleAction, getRuleExecutor} from "./rule-registry"; +import {RuleRegistry} from "./rule-registry"; import {ClientConfig} from "../rest-service"; -import {MockClient} from "../mock-schemaregistry-client"; export enum SerdeType { KEY = 'KEY', @@ -29,13 +28,13 @@ export interface SerdeConfig { // useLatestVersion specifies whether to use the latest schema version useLatestVersion?: boolean // useLatestWithMetadata specifies whether to use the latest schema with metadata - useLatestWithMetadata?: Map + useLatestWithMetadata?: { [key: string]: string }; // cacheCapacity specifies the cache capacity cacheCapacity?: number, // cacheLatestTtlSecs specifies the cache latest TTL in seconds cacheLatestTtlSecs?: number // ruleConfig specifies configuration options to the rules - ruleConfig?: Map + ruleConfig?: { [key: string]: string }; // subjectNameStrategy specifies a function to generate a subject name subjectNameStrategy?: SubjectNameStrategyFunc } @@ -47,11 +46,13 @@ export abstract class Serde { serdeType: SerdeType conf: SerdeConfig fieldTransformer: FieldTransformer | null = null + ruleRegistry: RuleRegistry - protected constructor(client: Client, serdeType: SerdeType, conf: SerdeConfig) { + protected constructor(client: Client, serdeType: SerdeType, conf: SerdeConfig, ruleRegistry?: RuleRegistry) { this.client = client this.serdeType = serdeType this.conf = conf + this.ruleRegistry = ruleRegistry ?? RuleRegistry.getGlobalInstance() } abstract config(): SerdeConfig @@ -65,22 +66,15 @@ export abstract class Serde { return strategy(topic, this.serdeType, info) } - async resolveReferences(client: Client, schema: SchemaInfo, deps: Map): Promise { + async resolveReferences(client: Client, schema: SchemaInfo, deps: Map, format?: string): Promise { let references = schema.references if (references == null) { return } for (let ref of references) { - let metadata = await client.getSchemaMetadata(ref.subject, ref.version, true) - let info = { - schema: schema.schema, - schemaType: schema.schemaType, - references: schema.references, - metadata: schema.metadata, - ruleSet: schema.ruleSet, - } + let metadata = await client.getSchemaMetadata(ref.subject, ref.version, true, format) deps.set(ref.name, metadata.schema) - await this.resolveReferences(client, info, deps) + await this.resolveReferences(client, metadata, deps) } } @@ -134,7 +128,7 @@ export abstract class Serde { } let ctx = new RuleContext(source, target, subject, topic, this.serdeType === SerdeType.KEY, ruleMode, rule, i, rules, inlineTags, this.fieldTransformer!) - let ruleExecutor = getRuleExecutor(rule.type) + let ruleExecutor = this.ruleRegistry.getExecutor(rule.type) if (ruleExecutor == null) { await this.runAction(ctx, ruleMode, rule, rule.onFailure, msg, new Error(`could not find rule executor of type ${rule.type}`), 'ERROR') @@ -208,7 +202,7 @@ export abstract class Serde { } else if (actionName === 'NONE') { return new NoneAction() } - return getRuleAction(actionName) + return this.ruleRegistry.getAction(actionName) } } @@ -222,8 +216,8 @@ export interface SerializerConfig extends SerdeConfig { } export abstract class Serializer extends Serde { - protected constructor(client: Client, serdeType: SerdeType, conf: SerializerConfig) { - super(client, serdeType, conf) + protected constructor(client: Client, serdeType: SerdeType, conf: SerializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) } override config(): SerializerConfig { @@ -234,7 +228,7 @@ export abstract class Serializer extends Serde { abstract serialize(topic: string, msg: any): Promise // GetID returns a schema ID for the given schema - async getId(topic: string, msg: any, info: SchemaInfo): Promise<[number, SchemaInfo]> { + async getId(topic: string, msg: any, info: SchemaInfo, format?: string): Promise<[number, SchemaInfo]> { let autoRegister = this.config().autoRegisterSchemas let useSchemaId = this.config().useSchemaId let useLatestWithMetadata = this.conf.useLatestWithMetadata @@ -246,17 +240,16 @@ export abstract class Serializer extends Serde { if (autoRegister) { id = await this.client.register(subject, info, Boolean(normalizeSchema)) } else if (useSchemaId != null && useSchemaId >= 0) { - info = await this.client.getBySubjectAndId(subject, useSchemaId) + info = await this.client.getBySubjectAndId(subject, useSchemaId, format) id = await this.client.getId(subject, info, false) if (id !== useSchemaId) { throw new SerializationError(`failed to match schema ID (${id} != ${useSchemaId})`) } - } else if (useLatestWithMetadata != null && useLatestWithMetadata.size !== 0) { - info = await this.client.getLatestWithMetadata( - subject, Object.fromEntries(useLatestWithMetadata), true) + } else if (useLatestWithMetadata != null && Object.keys(useLatestWithMetadata).length !== 0) { + info = await this.client.getLatestWithMetadata(subject, useLatestWithMetadata, true, format) id = await this.client.getId(subject, info, false) } else if (useLatest) { - info = await this.client.getLatestSchemaMetadata(subject) + info = await this.client.getLatestSchemaMetadata(subject, format) id = await this.client.getId(subject, info, false) } else { id = await this.client.getId(subject, info, Boolean(normalizeSchema)) @@ -281,15 +274,15 @@ export interface Migration { } export abstract class Deserializer extends Serde { - protected constructor(client: Client, serdeType: SerdeType, conf: DeserializerConfig) { - super(client, serdeType, conf) + protected constructor(client: Client, serdeType: SerdeType, conf: DeserializerConfig, ruleRegistry?: RuleRegistry) { + super(client, serdeType, conf, ruleRegistry) } override config(): DeserializerConfig { return this.conf as DeserializerConfig } - async getSchema(topic: string, payload: Buffer): Promise { + async getSchema(topic: string, payload: Buffer, format?: string): Promise { const magicByte = payload.subarray(0, 1) if (!magicByte.equals(MAGIC_BYTE)) { throw new SerializationError( @@ -300,18 +293,17 @@ export abstract class Deserializer extends Serde { } const id = payload.subarray(1, 5).readInt32BE(0) let subject = this.subjectName(topic) - return await this.client.getBySubjectAndId(subject, id) + return await this.client.getBySubjectAndId(subject, id, format) } - async getReaderSchema(subject: string): Promise { + async getReaderSchema(subject: string, format?: string): Promise { let useLatestWithMetadata = this.config().useLatestWithMetadata let useLatest = this.config().useLatestVersion - if (useLatestWithMetadata != null && useLatestWithMetadata.size !== 0) { - return await this.client.getLatestWithMetadata( - subject, Object.fromEntries(useLatestWithMetadata), true) + if (useLatestWithMetadata != null && Object.keys(useLatestWithMetadata).length !== 0) { + return await this.client.getLatestWithMetadata(subject, useLatestWithMetadata, true, format) } if (useLatest) { - return await this.client.getLatestSchemaMetadata(subject) + return await this.client.getLatestSchemaMetadata(subject, format) } return null } @@ -349,7 +341,7 @@ export abstract class Deserializer extends Serde { } async getMigrations(subject: string, sourceInfo: SchemaInfo, - target: SchemaMetadata): Promise { + target: SchemaMetadata, format?: string): Promise { let version = await this.client.getVersion(subject, sourceInfo, false) let source: SchemaMetadata = { id: 0, @@ -375,7 +367,7 @@ export abstract class Deserializer extends Serde { return migrations } let previous: SchemaMetadata | null = null - let versions = await this.getSchemasBetween(subject, first, last) + let versions = await this.getSchemasBetween(subject, first, last, format) for (let i = 0; i < versions.length; i++) { let version = versions[i] if (i === 0) { @@ -408,7 +400,7 @@ export abstract class Deserializer extends Serde { } async getSchemasBetween(subject: string, first: SchemaMetadata, - last: SchemaMetadata): Promise { + last: SchemaMetadata, format?: string): Promise { if (last.version!-first.version! <= 1) { return [first, last] } @@ -416,7 +408,7 @@ export abstract class Deserializer extends Serde { let version2 = last.version! let result = [first] for (let i = version1 + 1; i < version2; i++) { - let meta = await this.client.getSchemaMetadata(subject, i, true) + let meta = await this.client.getSchemaMetadata(subject, i, true, format) result.push(meta) } result.push(last) @@ -615,7 +607,7 @@ export abstract class FieldRuleExecutor implements RuleExecutor { } function areTransformsWithSameTag(rule1: Rule, rule2: Rule): boolean { - return rule1.tags != null && rule1.tags.size > 0 + return rule1.tags != null && rule1.tags.length > 0 && rule1.kind === 'TRANSFORM' && rule1.kind === rule2.kind && rule1.mode === rule2.mode @@ -736,11 +728,3 @@ export class RuleConditionError extends RuleError { return errMsg } } - -export function newClient(config: ClientConfig): Client { - let url = config.baseURLs[0] - if (url.startsWith("mock://")) { - return new MockClient(config) - } - return new SchemaRegistryClient(config) -} diff --git a/test/schemaregistry/dekregistry/dekregistry-client.spec.ts b/test/schemaregistry/rules/encryption/dekregistry/dekregistry-client.spec.ts similarity index 94% rename from test/schemaregistry/dekregistry/dekregistry-client.spec.ts rename to test/schemaregistry/rules/encryption/dekregistry/dekregistry-client.spec.ts index 4a7eb47c..5dc3da20 100644 --- a/test/schemaregistry/dekregistry/dekregistry-client.spec.ts +++ b/test/schemaregistry/rules/encryption/dekregistry/dekregistry-client.spec.ts @@ -1,14 +1,14 @@ -import { DekRegistryClient, Dek, Kek } from "../../../schemaregistry/dekregistry/dekregistry-client"; -import { RestService } from "../../../schemaregistry/rest-service"; +import { DekRegistryClient, Dek, Kek } from "../../../../../schemaregistry/rules/encryption/dekregistry/dekregistry-client"; +import { RestService } from "../../../../../schemaregistry/rest-service"; import { AxiosResponse } from 'axios'; import { beforeEach, afterEach, describe, expect, it, jest } from '@jest/globals'; import { TEST_KEK, TEST_KEK_2, TEST_KEK_NAME, TEST_KEK_NAME_2, TEST_KMS_TYPE, TEST_KMS_KEY_ID, TEST_KMS_PROPS, TEST_DOC, TEST_DEK, TEST_DEK_2, TEST_ALGORITHM, TEST_ENCRYPTED_KEY_MATERIAL, TEST_SUBJECT, TEST_VERSION, TEST_DEK_LATEST} from "./test-constants"; -import { mockClientConfig } from "../test-constants"; +import { mockClientConfig } from "../../../test-constants"; -jest.mock('../../../schemaregistry/rest-service'); +jest.mock('../../../../../schemaregistry/rest-service'); let client: DekRegistryClient; diff --git a/test/schemaregistry/dekregistry/mock-dekregistry-client.spec.ts b/test/schemaregistry/rules/encryption/dekregistry/mock-dekregistry-client.spec.ts similarity index 90% rename from test/schemaregistry/dekregistry/mock-dekregistry-client.spec.ts rename to test/schemaregistry/rules/encryption/dekregistry/mock-dekregistry-client.spec.ts index 71176814..a5ed3cb2 100644 --- a/test/schemaregistry/dekregistry/mock-dekregistry-client.spec.ts +++ b/test/schemaregistry/rules/encryption/dekregistry/mock-dekregistry-client.spec.ts @@ -1,5 +1,5 @@ -import { Dek, Kek } from "../../../schemaregistry/dekregistry/dekregistry-client"; -import { MockDekRegistryClient } from "../../../schemaregistry/dekregistry/mock-dekregistry-client"; +import { Dek, Kek } from "../../../../../schemaregistry/rules/encryption/dekregistry/dekregistry-client"; +import { MockDekRegistryClient } from "../../../../../schemaregistry/rules/encryption/dekregistry/mock-dekregistry-client"; import { beforeEach, afterEach, describe, expect, it, jest } from '@jest/globals'; import { TEST_KEK, TEST_KEK_NAME, TEST_KMS_TYPE, TEST_KMS_KEY_ID, TEST_KMS_PROPS, TEST_DOC, TEST_DEK, TEST_DEK_V2, TEST_ALGORITHM, diff --git a/test/schemaregistry/dekregistry/test-constants.ts b/test/schemaregistry/rules/encryption/dekregistry/test-constants.ts similarity index 90% rename from test/schemaregistry/dekregistry/test-constants.ts rename to test/schemaregistry/rules/encryption/dekregistry/test-constants.ts index 4719fdce..b5cae073 100644 --- a/test/schemaregistry/dekregistry/test-constants.ts +++ b/test/schemaregistry/rules/encryption/dekregistry/test-constants.ts @@ -1,5 +1,5 @@ -import { MOCK_TS } from "../../../schemaregistry/dekregistry/constants"; -import { Kek, Dek } from "../../../schemaregistry/dekregistry/dekregistry-client"; +import { MOCK_TS } from "../../../../../schemaregistry/rules/encryption/dekregistry/constants"; +import { Kek, Dek } from "../../../../../schemaregistry/rules/encryption/dekregistry/dekregistry-client"; const TEST_KEK_NAME: string = 'test-kek-name'; const TEST_KEK_NAME_2: string = 'test-kek-name2'; @@ -71,4 +71,4 @@ export { TEST_KEK_NAME, TEST_KEK_NAME_2, TEST_KMS_TYPE, TEST_KMS_KEY_ID, TEST_KMS_PROPS, TEST_DOC, TEST_SUBJECT, TEST_ALGORITHM, TEST_ENCRYPTED_KEY_MATERIAL, TEST_VERSION, TEST_KEK, TEST_KEK_2, TEST_DEK, TEST_DEK_V2, TEST_DEK_2, TEST_DEK_LATEST -}; \ No newline at end of file +}; diff --git a/test/schemaregistry/serde/avro.spec.ts b/test/schemaregistry/serde/avro.spec.ts index 068d99e9..ec7abec9 100644 --- a/test/schemaregistry/serde/avro.spec.ts +++ b/test/schemaregistry/serde/avro.spec.ts @@ -1,32 +1,516 @@ -import {describe, expect, it} from '@jest/globals'; +import {afterEach, describe, expect, it} from '@jest/globals'; import {ClientConfig} from "../../../schemaregistry/rest-service"; -import {AvroDeserializer, AvroSerializer} from "../../../schemaregistry/serde/avro"; -import {newClient, SerdeType} from "../../../schemaregistry/serde/serde"; +import { + AvroDeserializer, AvroDeserializerConfig, + AvroSerializer, + AvroSerializerConfig +} from "../../../schemaregistry/serde/avro"; +import {SerdeType} from "../../../schemaregistry/serde/serde"; +import { + Rule, + RuleMode, + RuleSet, + SchemaInfo, + SchemaRegistryClient +} from "../../../schemaregistry/schemaregistry-client"; +import {LocalKmsDriver} from "../../../schemaregistry/rules/encryption/localkms/local-driver"; +import {FieldEncryptionExecutor} from "../../../schemaregistry/rules/encryption/encrypt-executor"; + +const demoSchema = ` +{ + "name": "DemoSchema", + "type": "record", + "fields": [ + { + "name": "intField", + "type": "int" + }, + { + "name": "doubleField", + "type": "double" + }, + { + "name": "stringField", + "type": "string", + "confluent:tags": [ "PII" ] + }, + { + "name": "boolField", + "type": "boolean" + }, + { + "name": "bytesField", + "type": "bytes", + "confluent:tags": [ "PII" ] + } + ] +} +` +const demoSchemaWithLogicalType = ` +{ + "name": "DemoSchema", + "type": "record", + "fields": [ + { + "name": "intField", + "type": "int" + }, + { + "name": "doubleField", + "type": "double" + }, + { + "name": "stringField", + "type": { + "type": "string", + "logicalType": "uuid" + }, + "confluent:tags": [ "PII" ] + }, + { + "name": "boolField", + "type": "boolean" + }, + { + "name": "bytesField", + "type": "bytes", + "confluent:tags": [ "PII" ] + } + ] +} +` +const rootPointerSchema = ` +{ + "name": "NestedTestPointerRecord", + "type": "record", + "fields": [ + { + "name": "otherField", + "type": ["null", "DemoSchema"] + } +] +} +` +const f1Schema = ` +{ + "name": "F1Schema", + "type": "record", + "fields": [ + { + "name": "f1", + "type": "string", + "confluent:tags": [ "PII" ] + } + ] +} +` + +const fieldEncryptionExecutor = FieldEncryptionExecutor.register() +LocalKmsDriver.register() + +//const baseURL = 'http://localhost:8081' +const baseURL = 'mock://' + +const topic = 'topic1' +const subject = topic + '-value' describe('AvroSerializer', () => { + afterEach(async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + await client.deleteSubject(subject, false) + await client.deleteSubject(subject, true) + }) it('basic serialization', async () => { let conf: ClientConfig = { - baseURLs: ['mock://'], - cacheCapacity: 1000, - createAxiosDefaults: {} + baseURLs: [baseURL], + cacheCapacity: 1000 } - let client = newClient(conf) + let client = SchemaRegistryClient.newClient(conf) let ser = new AvroSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) let obj = { intField: 123, doubleField: 45.67, stringField: 'hi', boolField: true, - bytesField: new Buffer([1, 2]), + bytesField: Buffer.from([1, 2]), + } + let bytes = await ser.serialize(topic, obj) + + let deser = new AvroDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.intField).toEqual(obj.intField); + expect(obj2.doubleField).toBeCloseTo(obj.doubleField, 0.001); + expect(obj2.stringField).toEqual(obj.stringField); + expect(obj2.boolField).toEqual(obj.boolField); + expect(obj2.bytesField).toEqual(obj.bytesField); + }) + it('serialize nested', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new AvroSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) + + let nested = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([1, 2]), + } + let obj = { + otherField: nested + } + let bytes = await ser.serialize(topic, obj) + + let deser = new AvroDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.otherField.intField).toEqual(nested.intField); + expect(obj2.otherField.doubleField).toBeCloseTo(nested.doubleField, 0.001); + expect(obj2.otherField.stringField).toEqual(nested.stringField); + expect(obj2.otherField.boolField).toEqual(nested.boolField); + expect(obj2.otherField.bytesField).toEqual(nested.bytesField); + }) + it('serialize reference', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new AvroSerializer(client, SerdeType.VALUE, {useLatestVersion: true}) + + let info: SchemaInfo = { + schemaType: 'AVRO', + schema: demoSchema, + } + await client.register('demo-value', info , false) + + info = { + schemaType: 'AVRO', + schema: rootPointerSchema, + references: [{ + name: 'DemoSchema', + subject: 'demo-value', + version: 1 + }] + } + await client.register(subject, info , false) + + let nested = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([1, 2]), } - let bytes = await ser.serialize("topic1", obj) + let obj = { + otherField: nested + } + let bytes = await ser.serialize(topic, obj) let deser = new AvroDeserializer(client, SerdeType.VALUE, {}) - let obj2 = await deser.deserialize("topic1", bytes) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.otherField.intField).toEqual(nested.intField); + expect(obj2.otherField.doubleField).toBeCloseTo(nested.doubleField, 0.001); + expect(obj2.otherField.stringField).toEqual(nested.stringField); + expect(obj2.otherField.boolField).toEqual(nested.boolField); + expect(obj2.otherField.bytesField).toEqual(nested.bytesField); + }) + it('basic encryption', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let serConfig: AvroSerializerConfig = { + useLatestVersion: true, + ruleConfig: { + secret: 'mysecret' + } + } + let ser = new AvroSerializer(client, SerdeType.VALUE, serConfig) + let dekClient = fieldEncryptionExecutor.client! + + let encRule: Rule = { + name: 'test-encrypt', + kind: 'TRANSFORM', + mode: RuleMode.WRITEREAD, + type: 'ENCRYPT', + tags: ['PII'], + params: { + 'encrypt.kek.name': 'kek1', + 'encrypt.kms.type': 'local-kms', + 'encrypt.kms.key.id': 'mykey', + }, + onFailure: 'ERROR,ERROR' + } + let ruleSet: RuleSet = { + domainRules: [encRule] + } + + let info: SchemaInfo = { + schemaType: 'AVRO', + schema: demoSchema, + ruleSet + } + + await client.register(subject, info, false) + + let obj = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([1, 2]), + } + let bytes = await ser.serialize(topic, obj) + + // reset encrypted field + obj.stringField = 'hi' + obj.bytesField = Buffer.from([1, 2]) + + let deserConfig: AvroDeserializerConfig = { + ruleConfig: { + secret: 'mysecret' + } + } + let deser = new AvroDeserializer(client, SerdeType.VALUE, deserConfig) + fieldEncryptionExecutor.client = dekClient + let obj2 = await deser.deserialize(topic, bytes) expect(obj2.intField).toEqual(obj.intField); expect(obj2.doubleField).toBeCloseTo(obj.doubleField, 0.001); expect(obj2.stringField).toEqual(obj.stringField); expect(obj2.boolField).toEqual(obj.boolField); expect(obj2.bytesField).toEqual(obj.bytesField); }) + it('basic encryption with logical type', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let serConfig: AvroSerializerConfig = { + useLatestVersion: true, + ruleConfig: { + secret: 'mysecret' + } + } + let ser = new AvroSerializer(client, SerdeType.VALUE, serConfig) + let dekClient = fieldEncryptionExecutor.client! + + let encRule: Rule = { + name: 'test-encrypt', + kind: 'TRANSFORM', + mode: RuleMode.WRITEREAD, + type: 'ENCRYPT', + tags: ['PII'], + params: { + 'encrypt.kek.name': 'kek1', + 'encrypt.kms.type': 'local-kms', + 'encrypt.kms.key.id': 'mykey', + }, + onFailure: 'ERROR,ERROR' + } + let ruleSet: RuleSet = { + domainRules: [encRule] + } + + let info: SchemaInfo = { + schemaType: 'AVRO', + schema: demoSchemaWithLogicalType, + ruleSet + } + + await client.register(subject, info, false) + + let obj = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([1, 2]), + } + let bytes = await ser.serialize(topic, obj) + + // reset encrypted field + obj.stringField = 'hi' + obj.bytesField = Buffer.from([1, 2]) + + let deserConfig: AvroDeserializerConfig = { + ruleConfig: { + secret: 'mysecret' + } + } + let deser = new AvroDeserializer(client, SerdeType.VALUE, deserConfig) + fieldEncryptionExecutor.client = dekClient + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.intField).toEqual(obj.intField); + expect(obj2.doubleField).toBeCloseTo(obj.doubleField, 0.001); + expect(obj2.stringField).toEqual(obj.stringField); + expect(obj2.boolField).toEqual(obj.boolField); + expect(obj2.bytesField).toEqual(obj.bytesField); + }) + it('basic encryption with preserialized data', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + + let encRule: Rule = { + name: 'test-encrypt', + kind: 'TRANSFORM', + mode: RuleMode.WRITEREAD, + type: 'ENCRYPT', + tags: ['PII'], + params: { + 'encrypt.kek.name': 'kek1', + 'encrypt.kms.type': 'local-kms', + 'encrypt.kms.key.id': 'mykey', + }, + onFailure: 'ERROR,ERROR' + } + let ruleSet: RuleSet = { + domainRules: [encRule] + } + + let info: SchemaInfo = { + schemaType: 'AVRO', + schema: f1Schema, + ruleSet + } + + await client.register(subject, info, false) + + let obj = { + f1: 'hello world' + } + + let deserConfig: AvroDeserializerConfig = { + ruleConfig: { + secret: 'mysecret' + } + } + let deser = new AvroDeserializer(client, SerdeType.VALUE, deserConfig) + let dekClient = fieldEncryptionExecutor.client! + + await dekClient.registerKek("kek1", "local-kms", "mykey", false) + const encryptedDek = "07V2ndh02DA73p+dTybwZFm7DKQSZN1tEwQh+FoX1DZLk4Yj2LLu4omYjp/84tAg3BYlkfGSz+zZacJHIE4=" + await dekClient.registerDek("kek1", subject, "AES256_GCM", 1, encryptedDek) + + const bytes = Buffer.from([0, 0, 0, 0, 1, 104, 122, 103, 121, 47, 106, 70, 78, 77, 86, 47, 101, 70, 105, 108, 97, 72, 114, 77, 121, 101, 66, 103, 100, 97, 86, 122, 114, 82, 48, 117, 100, 71, 101, 111, 116, 87, 56, 99, 65, 47, 74, 97, 108, 55, 117, 107, 114, 43, 77, 47, 121, 122]) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.f1).toEqual(obj.f1); + }) + it('deterministic encryption with preserialized data', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + + let encRule: Rule = { + name: 'test-encrypt', + kind: 'TRANSFORM', + mode: RuleMode.WRITEREAD, + type: 'ENCRYPT', + tags: ['PII'], + params: { + 'encrypt.kek.name': 'kek1', + 'encrypt.kms.type': 'local-kms', + 'encrypt.kms.key.id': 'mykey', + 'encrypt.dek.algorithm': 'AES256_SIV', + }, + onFailure: 'ERROR,ERROR' + } + let ruleSet: RuleSet = { + domainRules: [encRule] + } + + let info: SchemaInfo = { + schemaType: 'AVRO', + schema: f1Schema, + ruleSet + } + + await client.register(subject, info, false) + + let obj = { + f1: 'hello world' + } + + let deserConfig: AvroDeserializerConfig = { + ruleConfig: { + secret: 'mysecret' + } + } + let deser = new AvroDeserializer(client, SerdeType.VALUE, deserConfig) + let dekClient = fieldEncryptionExecutor.client! + + await dekClient.registerKek("kek1", "local-kms", "mykey", false) + const encryptedDek = "YSx3DTlAHrmpoDChquJMifmPntBzxgRVdMzgYL82rgWBKn7aUSnG+WIu9ozBNS3y2vXd++mBtK07w4/W/G6w0da39X9hfOVZsGnkSvry/QRht84V8yz3dqKxGMOK5A==" + await dekClient.registerDek("kek1", subject, "AES256_SIV", 1, encryptedDek) + + const bytes = Buffer.from([0, 0, 0, 0, 1, 72, 68, 54, 89, 116, 120, 114, 108, 66, 110, 107, 84, 87, 87, 57, 78, 54, 86, 98, 107, 51, 73, 73, 110, 106, 87, 72, 56, 49, 120, 109, 89, 104, 51, 107, 52, 100]) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.f1).toEqual(obj.f1); + }) + it('dek rotation encryption with preserialized data', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + + let encRule: Rule = { + name: 'test-encrypt', + kind: 'TRANSFORM', + mode: RuleMode.WRITEREAD, + type: 'ENCRYPT', + tags: ['PII'], + params: { + 'encrypt.kek.name': 'kek1', + 'encrypt.kms.type': 'local-kms', + 'encrypt.kms.key.id': 'mykey', + 'encrypt.dek.expiry.days': '1', + }, + onFailure: 'ERROR,ERROR' + } + let ruleSet: RuleSet = { + domainRules: [encRule] + } + + let info: SchemaInfo = { + schemaType: 'AVRO', + schema: f1Schema, + ruleSet + } + + await client.register(subject, info, false) + + let obj = { + f1: 'hello world' + } + + let deserConfig: AvroDeserializerConfig = { + ruleConfig: { + secret: 'mysecret' + } + } + let deser = new AvroDeserializer(client, SerdeType.VALUE, deserConfig) + let dekClient = fieldEncryptionExecutor.client! + + await dekClient.registerKek("kek1", "local-kms", "mykey", false) + const encryptedDek = "W/v6hOQYq1idVAcs1pPWz9UUONMVZW4IrglTnG88TsWjeCjxmtRQ4VaNe/I5dCfm2zyY9Cu0nqdvqImtUk4=" + await dekClient.registerDek("kek1", subject, "AES256_GCM", 1, encryptedDek) + + const bytes = Buffer.from([0, 0, 0, 0, 1, 120, 65, 65, 65, 65, 65, 65, 71, 52, 72, 73, 54, 98, 49, 110, 88, 80, 88, 113, 76, 121, 71, 56, 99, 73, 73, 51, 53, 78, 72, 81, 115, 101, 113, 113, 85, 67, 100, 43, 73, 101, 76, 101, 70, 86, 65, 101, 78, 112, 83, 83, 51, 102, 120, 80, 110, 74, 51, 50, 65, 61]) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.f1).toEqual(obj.f1); + }) }) diff --git a/test/schemaregistry/serde/buffer-wrapper.spec.ts b/test/schemaregistry/serde/buffer-wrapper.spec.ts index 5c4ed3af..f3ac5f76 100644 --- a/test/schemaregistry/serde/buffer-wrapper.spec.ts +++ b/test/schemaregistry/serde/buffer-wrapper.spec.ts @@ -3,21 +3,21 @@ import { BufferWrapper, MAX_VARINT_LEN_32 } from "../../../schemaregistry/serde/ describe('BufferWrapper', () => { it('write and read 100', () => { - const buf = new Buffer(MAX_VARINT_LEN_32) + const buf = Buffer.alloc(MAX_VARINT_LEN_32) const bw = new BufferWrapper(buf) bw.writeVarInt(100) const bw2 = new BufferWrapper(bw.buf.subarray(0, bw.pos)) expect(bw2.readVarInt()).toBe(100) }) it('write and read max pos int', () => { - const buf = new Buffer(MAX_VARINT_LEN_32) + const buf = Buffer.alloc(MAX_VARINT_LEN_32) const bw = new BufferWrapper(buf) bw.writeVarInt(2147483647) const bw2 = new BufferWrapper(bw.buf.subarray(0, bw.pos)) expect(bw2.readVarInt()).toBe(2147483647) }) it('write and read max neg int', () => { - const buf = new Buffer(MAX_VARINT_LEN_32) + const buf = Buffer.alloc(MAX_VARINT_LEN_32) const bw = new BufferWrapper(buf) bw.writeVarInt(-2147483648) const bw2 = new BufferWrapper(bw.buf.subarray(0, bw.pos)) diff --git a/test/schemaregistry/serde/json.spec.ts b/test/schemaregistry/serde/json.spec.ts new file mode 100644 index 00000000..c28f6f9d --- /dev/null +++ b/test/schemaregistry/serde/json.spec.ts @@ -0,0 +1,209 @@ +import {afterEach, describe, expect, it} from '@jest/globals'; +import {ClientConfig} from "../../../schemaregistry/rest-service"; +import {SerdeType} from "../../../schemaregistry/serde/serde"; +import { + Rule, + RuleMode, + RuleSet, + SchemaInfo, + SchemaRegistryClient +} from "../../../schemaregistry/schemaregistry-client"; +import {LocalKmsDriver} from "../../../schemaregistry/rules/encryption/localkms/local-driver"; +import {FieldEncryptionExecutor} from "../../../schemaregistry/rules/encryption/encrypt-executor"; +import { + JsonDeserializer, JsonDeserializerConfig, + JsonSerializer, + JsonSerializerConfig +} from "../../../schemaregistry/serde/json"; + +const fieldEncryptionExecutor = FieldEncryptionExecutor.register() +LocalKmsDriver.register() + +//const baseURL = 'http://localhost:8081' +const baseURL = 'mock://' + +const topic = 'topic1' +const subject = topic + '-value' + +const rootSchema = ` +{ + "type": "object", + "properties": { + "otherField": { "$ref": "DemoSchema" } + } +} +` + +const demoSchema = ` +{ + "type": "object", + "properties": { + "intField": { "type": "integer" }, + "doubleField": { "type": "number" }, + "stringField": { + "type": "string", + "confluent:tags": [ "PII" ] + }, + "boolField": { "type": "boolean" }, + "bytesField": { + "type": "string", + "contentEncoding": "base64", + "confluent:tags": [ "PII" ] + } + } +} +` + +describe('JsonSerializer', () => { + afterEach(async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + await client.deleteSubject(subject, false) + await client.deleteSubject(subject, true) + }) + it('basic serialization', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new JsonSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) + let obj = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([0, 0, 0, 1]).toString('base64') + } + let bytes = await ser.serialize(topic, obj) + + let deser = new JsonDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) + it('serialize nested', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new JsonSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) + + let obj = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([0, 0, 0, 1]).toString('base64') + } + let bytes = await ser.serialize(topic, obj) + + let deser = new JsonDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) + it('serialize reference', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new JsonSerializer(client, SerdeType.VALUE, {useLatestVersion: true}) + + let info: SchemaInfo = { + schemaType: 'JSON', + schema: demoSchema + } + await client.register('demo-value', info, false) + + info = { + schemaType: 'JSON', + schema: rootSchema, + references: [{ + name: 'DemoSchema', + subject: 'demo-value', + version: 1 + }] + } + await client.register(subject, info, false) + + let obj = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([0, 0, 0, 1]).toString('base64') + } + let bytes = await ser.serialize(topic, obj) + + let deser = new JsonDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) + it('basic encryption', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let serConfig: JsonSerializerConfig = { + useLatestVersion: true, + ruleConfig: { + secret: 'mysecret' + } + } + let ser = new JsonSerializer(client, SerdeType.VALUE, serConfig) + let dekClient = fieldEncryptionExecutor.client! + + let encRule: Rule = { + name: 'test-encrypt', + kind: 'TRANSFORM', + mode: RuleMode.WRITEREAD, + type: 'ENCRYPT', + tags: ['PII'], + params: { + 'encrypt.kek.name': 'kek1', + 'encrypt.kms.type': 'local-kms', + 'encrypt.kms.key.id': 'mykey', + }, + onFailure: 'ERROR,ERROR' + } + let ruleSet: RuleSet = { + domainRules: [encRule] + } + + let info: SchemaInfo = { + schemaType: 'JSON', + schema: demoSchema, + ruleSet + } + + await client.register(subject, info, false) + + let obj = { + intField: 123, + doubleField: 45.67, + stringField: 'hi', + boolField: true, + bytesField: Buffer.from([0, 0, 0, 1]).toString('base64') + } + let bytes = await ser.serialize(topic, obj) + + // reset encrypted field + obj.stringField = 'hi' + obj.bytesField = Buffer.from([0, 0, 0, 1]).toString('base64') + + let deserConfig: JsonDeserializerConfig = { + ruleConfig: { + secret: 'mysecret' + } + } + let deser = new JsonDeserializer(client, SerdeType.VALUE, deserConfig) + fieldEncryptionExecutor.client = dekClient + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) +}) diff --git a/test/schemaregistry/serde/protobuf.spec.ts b/test/schemaregistry/serde/protobuf.spec.ts new file mode 100644 index 00000000..de238e35 --- /dev/null +++ b/test/schemaregistry/serde/protobuf.spec.ts @@ -0,0 +1,205 @@ +import {afterEach, describe, expect, it} from '@jest/globals'; +import {ClientConfig} from "../../../schemaregistry/rest-service"; +import { + ProtobufDeserializer, ProtobufDeserializerConfig, + ProtobufSerializer, ProtobufSerializerConfig, +} from "../../../schemaregistry/serde/protobuf"; +import {SerdeType} from "../../../schemaregistry/serde/serde"; +import { + Rule, + RuleMode, + RuleSet, + SchemaInfo, + SchemaRegistryClient +} from "../../../schemaregistry/schemaregistry-client"; +import {LocalKmsDriver} from "../../../schemaregistry/rules/encryption/localkms/local-driver"; +import {FieldEncryptionExecutor} from "../../../schemaregistry/rules/encryption/encrypt-executor"; +import {AuthorSchema, file_test_schemaregistry_serde_example, PizzaSchema} from "./test/example_pb"; +import {create, toBinary} from "@bufbuild/protobuf"; +import {FileDescriptorProtoSchema} from "@bufbuild/protobuf/wkt"; +import { + NestedMessage_InnerMessageSchema +} from "./test/nested_pb"; +import {TestMessageSchema} from "./test/test_pb"; +import {DependencyMessageSchema} from "./test/dep_pb"; + +const fieldEncryptionExecutor = FieldEncryptionExecutor.register() +LocalKmsDriver.register() + +//const baseURL = 'http://localhost:8081' +const baseURL = 'mock://' + +const topic = 'topic1' +const subject = topic + '-value' + +describe('ProtobufSerializer', () => { + afterEach(async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + await client.deleteSubject(subject, false) + await client.deleteSubject(subject, true) + }) + it('basic serialization', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new ProtobufSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) + ser.registry.add(AuthorSchema) + let obj = create(AuthorSchema, { + name: 'Kafka', + id: 123, + picture: Buffer.from([1, 2]), + works: ['The Castle', 'The Trial'] + }) + let bytes = await ser.serialize(topic, obj) + + let deser = new ProtobufDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) + it('serialize second messsage', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new ProtobufSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) + ser.registry.add(PizzaSchema) + let obj = create(PizzaSchema, { + size: 'Extra extra large', + toppings: ['anchovies', 'mushrooms'] + }) + let bytes = await ser.serialize(topic, obj) + + let deser = new ProtobufDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) + it('serialize nested messsage', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new ProtobufSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) + ser.registry.add(NestedMessage_InnerMessageSchema) + let obj = create(NestedMessage_InnerMessageSchema, { + id: "inner" + }) + let bytes = await ser.serialize(topic, obj) + + let deser = new ProtobufDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) + it('serialize reference', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let ser = new ProtobufSerializer(client, SerdeType.VALUE, {autoRegisterSchemas: true}) + ser.registry.add(TestMessageSchema) + ser.registry.add(DependencyMessageSchema) + let msg = create(TestMessageSchema, { + testString: "hi", + testBool: true, + testBytes: Buffer.from([1, 2]), + testDouble: 1.23, + testFloat: 3.45, + testFixed32: 67, + testFixed64: 89n, + testInt32: 100, + testInt64: 200n, + testSfixed32: 300, + testSfixed64: 400n, + testSint32: 500, + testSint64: 600n, + testUint32: 700, + testUint64: 800n, + }) + let obj = create(DependencyMessageSchema, { + isActive: true, + testMesssage: msg + }) + let bytes = await ser.serialize(topic, obj) + + let deser = new ProtobufDeserializer(client, SerdeType.VALUE, {}) + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2.testMesssage.testString).toEqual(msg.testString); + expect(obj2.testMesssage.testBool).toEqual(msg.testBool); + expect(obj2.testMesssage.testBytes).toEqual(msg.testBytes); + expect(obj2.testMesssage.testDouble).toBeCloseTo(msg.testDouble, 0.001); + expect(obj2.testMesssage.testFloat).toBeCloseTo(msg.testFloat, 0.001); + expect(obj2.testMesssage.testFixed32).toEqual(msg.testFixed32); + expect(obj2.testMesssage.testFixed64).toEqual(msg.testFixed64); + }) + it('basic encryption', async () => { + let conf: ClientConfig = { + baseURLs: [baseURL], + cacheCapacity: 1000 + } + let client = SchemaRegistryClient.newClient(conf) + let serConfig: ProtobufSerializerConfig = { + useLatestVersion: true, + ruleConfig: { + secret: 'mysecret' + } + } + let ser = new ProtobufSerializer(client, SerdeType.VALUE, serConfig) + ser.registry.add(AuthorSchema) + let dekClient = fieldEncryptionExecutor.client! + + let encRule: Rule = { + name: 'test-encrypt', + kind: 'TRANSFORM', + mode: RuleMode.WRITEREAD, + type: 'ENCRYPT', + tags: ['PII'], + params: { + 'encrypt.kek.name': 'kek1', + 'encrypt.kms.type': 'local-kms', + 'encrypt.kms.key.id': 'mykey', + }, + onFailure: 'ERROR,ERROR' + } + let ruleSet: RuleSet = { + domainRules: [encRule] + } + + let info: SchemaInfo = { + schemaType: 'PROTOBUF', + schema: Buffer.from(toBinary(FileDescriptorProtoSchema, file_test_schemaregistry_serde_example.proto)).toString('base64'), + ruleSet + } + + await client.register(subject, info, false) + + let obj = create(AuthorSchema, { + name: 'Kafka', + id: 123, + picture: Buffer.from([1, 2]), + works: ['The Castle', 'The Trial'] + }) + let bytes = await ser.serialize(topic, obj) + + // reset encrypted field + obj.name = 'Kafka' + obj.picture = Buffer.from([1, 2]) + + let deserConfig: ProtobufDeserializerConfig = { + ruleConfig: { + secret: 'mysecret' + } + } + let deser = new ProtobufDeserializer(client, SerdeType.VALUE, deserConfig) + fieldEncryptionExecutor.client = dekClient + let obj2 = await deser.deserialize(topic, bytes) + expect(obj2).toEqual(obj) + }) +}) diff --git a/test/schemaregistry/serde/test/cycle_pb.ts b/test/schemaregistry/serde/test/cycle_pb.ts new file mode 100644 index 00000000..73e60993 --- /dev/null +++ b/test/schemaregistry/serde/test/cycle_pb.ts @@ -0,0 +1,36 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/cycle.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/cycle.proto. + */ +export const file_test_schemaregistry_serde_cycle: GenFile = /*@__PURE__*/ + fileDesc("CiV0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL2N5Y2xlLnByb3RvEgR0ZXN0IjsKCkxpbmtlZExpc3QSDQoFdmFsdWUYASABKAUSHgoEbmV4dBgKIAEoCzIQLnRlc3QuTGlua2VkTGlzdEIJWgcuLi90ZXN0YgZwcm90bzM"); + +/** + * @generated from message test.LinkedList + */ +export type LinkedList = Message<"test.LinkedList"> & { + /** + * @generated from field: int32 value = 1; + */ + value: number; + + /** + * @generated from field: test.LinkedList next = 10; + */ + next?: LinkedList; +}; + +/** + * Describes the message test.LinkedList. + * Use `create(LinkedListSchema)` to create a new message. + */ +export const LinkedListSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_cycle, 0); + diff --git a/test/schemaregistry/serde/test/dep_pb.ts b/test/schemaregistry/serde/test/dep_pb.ts new file mode 100644 index 00000000..80783aee --- /dev/null +++ b/test/schemaregistry/serde/test/dep_pb.ts @@ -0,0 +1,38 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/dep.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { TestMessage } from "./test_pb"; +import { file_test_schemaregistry_serde_test } from "./test_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/dep.proto. + */ +export const file_test_schemaregistry_serde_dep: GenFile = /*@__PURE__*/ + fileDesc("CiN0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL2RlcC5wcm90bxIEdGVzdCJQChFEZXBlbmRlbmN5TWVzc2FnZRIRCglpc19hY3RpdmUYASABKAgSKAoNdGVzdF9tZXNzc2FnZRgCIAEoCzIRLnRlc3QuVGVzdE1lc3NhZ2VCCVoHLi4vdGVzdGIGcHJvdG8z", [file_test_schemaregistry_serde_test]); + +/** + * @generated from message test.DependencyMessage + */ +export type DependencyMessage = Message<"test.DependencyMessage"> & { + /** + * @generated from field: bool is_active = 1; + */ + isActive: boolean; + + /** + * @generated from field: test.TestMessage test_messsage = 2; + */ + testMesssage?: TestMessage; +}; + +/** + * Describes the message test.DependencyMessage. + * Use `create(DependencyMessageSchema)` to create a new message. + */ +export const DependencyMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_dep, 0); + diff --git a/test/schemaregistry/serde/test/example_pb.ts b/test/schemaregistry/serde/test/example_pb.ts new file mode 100644 index 00000000..2120dfd8 --- /dev/null +++ b/test/schemaregistry/serde/test/example_pb.ts @@ -0,0 +1,69 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/example.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_confluent_meta } from "../../../../schemaregistry/confluent/meta_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/example.proto. + */ +export const file_test_schemaregistry_serde_example: GenFile = /*@__PURE__*/ + fileDesc("Cid0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL2V4YW1wbGUucHJvdG8SBHRlc3QiVgoGQXV0aG9yEhYKBG5hbWUYASABKAlCCIJEBRoDUElJEgoKAmlkGAIgASgFEhkKB3BpY3R1cmUYAyABKAxCCIJEBRoDUElJEg0KBXdvcmtzGAQgAygJIicKBVBpenphEgwKBHNpemUYASABKAkSEAoIdG9wcGluZ3MYAiADKAlCCVoHLi4vdGVzdGIGcHJvdG8z", [file_confluent_meta]); + +/** + * @generated from message test.Author + */ +export type Author = Message<"test.Author"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: int32 id = 2; + */ + id: number; + + /** + * @generated from field: bytes picture = 3; + */ + picture: Uint8Array; + + /** + * @generated from field: repeated string works = 4; + */ + works: string[]; +}; + +/** + * Describes the message test.Author. + * Use `create(AuthorSchema)` to create a new message. + */ +export const AuthorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_example, 0); + +/** + * @generated from message test.Pizza + */ +export type Pizza = Message<"test.Pizza"> & { + /** + * @generated from field: string size = 1; + */ + size: string; + + /** + * @generated from field: repeated string toppings = 2; + */ + toppings: string[]; +}; + +/** + * Describes the message test.Pizza. + * Use `create(PizzaSchema)` to create a new message. + */ +export const PizzaSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_example, 1); + diff --git a/test/schemaregistry/serde/test/nested_pb.ts b/test/schemaregistry/serde/test/nested_pb.ts new file mode 100644 index 00000000..a76d1dfb --- /dev/null +++ b/test/schemaregistry/serde/test/nested_pb.ts @@ -0,0 +1,221 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/nested.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/nested.proto. + */ +export const file_test_schemaregistry_serde_nested: GenFile = /*@__PURE__*/ + fileDesc("CiZ0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL25lc3RlZC5wcm90bxIEdGVzdCJsCgZVc2VySWQSFwoNa2Fma2FfdXNlcl9pZBgBIAEoCUgAEhcKDW90aGVyX3VzZXJfaWQYAiABKAVIABIlCgphbm90aGVyX2lkGAMgASgLMg8udGVzdC5NZXNzYWdlSWRIAEIJCgd1c2VyX2lkIhcKCU1lc3NhZ2VJZBIKCgJpZBgBIAEoCSJSCgtDb21wbGV4VHlwZRIQCgZvbmVfaWQYASABKAlIABISCghvdGhlcl9pZBgCIAEoBUgAEhEKCWlzX2FjdGl2ZRgDIAEoCEIKCghzb21lX3ZhbCLcAwoNTmVzdGVkTWVzc2FnZRIdCgd1c2VyX2lkGAEgASgLMgwudGVzdC5Vc2VySWQSEQoJaXNfYWN0aXZlGAIgASgIEhoKEmV4cGVyaW1lbnRzX2FjdGl2ZRgDIAMoCRIuCgp1cGRhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIcCgZzdGF0dXMYBSABKA4yDC50ZXN0LlN0YXR1cxInCgxjb21wbGV4X3R5cGUYBiABKAsyES50ZXN0LkNvbXBsZXhUeXBlEjIKCG1hcF90eXBlGAcgAygLMiAudGVzdC5OZXN0ZWRNZXNzYWdlLk1hcFR5cGVFbnRyeRIvCgVpbm5lchgIIAEoCzIgLnRlc3QuTmVzdGVkTWVzc2FnZS5Jbm5lck1lc3NhZ2UaLgoMTWFwVHlwZUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaKwoMSW5uZXJNZXNzYWdlEgoKAmlkGAEgASgJEg8KA2lkcxgCIAMoBUICEAEiKAoJSW5uZXJFbnVtEggKBFpFUk8QABINCglBTFNPX1pFUk8QABoCEAFKBAgOEA9KBAgPEBBKBAgJEAxSA2Zvb1IDYmFyKiIKBlN0YXR1cxIKCgZBQ1RJVkUQABIMCghJTkFDVElWRRABQglaBy4uL3Rlc3RiBnByb3RvMw", [file_google_protobuf_timestamp]); + +/** + * @generated from message test.UserId + */ +export type UserId = Message<"test.UserId"> & { + /** + * @generated from oneof test.UserId.user_id + */ + userId: { + /** + * @generated from field: string kafka_user_id = 1; + */ + value: string; + case: "kafkaUserId"; + } | { + /** + * @generated from field: int32 other_user_id = 2; + */ + value: number; + case: "otherUserId"; + } | { + /** + * @generated from field: test.MessageId another_id = 3; + */ + value: MessageId; + case: "anotherId"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message test.UserId. + * Use `create(UserIdSchema)` to create a new message. + */ +export const UserIdSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_nested, 0); + +/** + * @generated from message test.MessageId + */ +export type MessageId = Message<"test.MessageId"> & { + /** + * @generated from field: string id = 1; + */ + id: string; +}; + +/** + * Describes the message test.MessageId. + * Use `create(MessageIdSchema)` to create a new message. + */ +export const MessageIdSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_nested, 1); + +/** + * @generated from message test.ComplexType + */ +export type ComplexType = Message<"test.ComplexType"> & { + /** + * @generated from oneof test.ComplexType.some_val + */ + someVal: { + /** + * @generated from field: string one_id = 1; + */ + value: string; + case: "oneId"; + } | { + /** + * @generated from field: int32 other_id = 2; + */ + value: number; + case: "otherId"; + } | { case: undefined; value?: undefined }; + + /** + * @generated from field: bool is_active = 3; + */ + isActive: boolean; +}; + +/** + * Describes the message test.ComplexType. + * Use `create(ComplexTypeSchema)` to create a new message. + */ +export const ComplexTypeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_nested, 2); + +/** + * + * Complex message using nested protos and repeated fields + * + * @generated from message test.NestedMessage + */ +export type NestedMessage = Message<"test.NestedMessage"> & { + /** + * @generated from field: test.UserId user_id = 1; + */ + userId?: UserId; + + /** + * @generated from field: bool is_active = 2; + */ + isActive: boolean; + + /** + * @generated from field: repeated string experiments_active = 3; + */ + experimentsActive: string[]; + + /** + * @generated from field: google.protobuf.Timestamp updated_at = 4; + */ + updatedAt?: Timestamp; + + /** + * @generated from field: test.Status status = 5; + */ + status: Status; + + /** + * @generated from field: test.ComplexType complex_type = 6; + */ + complexType?: ComplexType; + + /** + * @generated from field: map map_type = 7; + */ + mapType: { [key: string]: string }; + + /** + * @generated from field: test.NestedMessage.InnerMessage inner = 8; + */ + inner?: NestedMessage_InnerMessage; +}; + +/** + * Describes the message test.NestedMessage. + * Use `create(NestedMessageSchema)` to create a new message. + */ +export const NestedMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_nested, 3); + +/** + * @generated from message test.NestedMessage.InnerMessage + */ +export type NestedMessage_InnerMessage = Message<"test.NestedMessage.InnerMessage"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: repeated int32 ids = 2 [packed = true]; + */ + ids: number[]; +}; + +/** + * Describes the message test.NestedMessage.InnerMessage. + * Use `create(NestedMessage_InnerMessageSchema)` to create a new message. + */ +export const NestedMessage_InnerMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_nested, 3, 0); + +/** + * @generated from enum test.NestedMessage.InnerEnum + */ +export enum NestedMessage_InnerEnum { + /** + * @generated from enum value: ZERO = 0; + */ + ZERO = 0, + + /** + * @generated from enum value: ALSO_ZERO = 0; + */ + ALSO_ZERO = 0, +} + +/** + * Describes the enum test.NestedMessage.InnerEnum. + */ +export const NestedMessage_InnerEnumSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_test_schemaregistry_serde_nested, 3, 0); + +/** + * @generated from enum test.Status + */ +export enum Status { + /** + * @generated from enum value: ACTIVE = 0; + */ + ACTIVE = 0, + + /** + * @generated from enum value: INACTIVE = 1; + */ + INACTIVE = 1, +} + +/** + * Describes the enum test.Status. + */ +export const StatusSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_test_schemaregistry_serde_nested, 0); + diff --git a/test/schemaregistry/serde/test/newerwidget_pb.ts b/test/schemaregistry/serde/test/newerwidget_pb.ts new file mode 100644 index 00000000..69749e4d --- /dev/null +++ b/test/schemaregistry/serde/test/newerwidget_pb.ts @@ -0,0 +1,41 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/newerwidget.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/newerwidget.proto. + */ +export const file_test_schemaregistry_serde_newerwidget: GenFile = /*@__PURE__*/ + fileDesc("Cit0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL25ld2Vyd2lkZ2V0LnByb3RvEgR0ZXN0IjwKC05ld2VyV2lkZ2V0EgwKBG5hbWUYASABKAkSDgoGbGVuZ3RoGAIgASgFEg8KB3ZlcnNpb24YAyABKAVCCVoHLi4vdGVzdGIGcHJvdG8z"); + +/** + * @generated from message test.NewerWidget + */ +export type NewerWidget = Message<"test.NewerWidget"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: int32 length = 2; + */ + length: number; + + /** + * @generated from field: int32 version = 3; + */ + version: number; +}; + +/** + * Describes the message test.NewerWidget. + * Use `create(NewerWidgetSchema)` to create a new message. + */ +export const NewerWidgetSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_newerwidget, 0); + diff --git a/test/schemaregistry/serde/test/newwidget_pb.ts b/test/schemaregistry/serde/test/newwidget_pb.ts new file mode 100644 index 00000000..a24ad209 --- /dev/null +++ b/test/schemaregistry/serde/test/newwidget_pb.ts @@ -0,0 +1,41 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/newwidget.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/newwidget.proto. + */ +export const file_test_schemaregistry_serde_newwidget: GenFile = /*@__PURE__*/ + fileDesc("Cil0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL25ld3dpZGdldC5wcm90bxIEdGVzdCI6CglOZXdXaWRnZXQSDAoEbmFtZRgBIAEoCRIOCgZoZWlnaHQYAiABKAUSDwoHdmVyc2lvbhgDIAEoBUIJWgcuLi90ZXN0YgZwcm90bzM"); + +/** + * @generated from message test.NewWidget + */ +export type NewWidget = Message<"test.NewWidget"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: int32 height = 2; + */ + height: number; + + /** + * @generated from field: int32 version = 3; + */ + version: number; +}; + +/** + * Describes the message test.NewWidget. + * Use `create(NewWidgetSchema)` to create a new message. + */ +export const NewWidgetSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_newwidget, 0); + diff --git a/test/schemaregistry/serde/test/test_pb.ts b/test/schemaregistry/serde/test/test_pb.ts new file mode 100644 index 00000000..09126158 --- /dev/null +++ b/test/schemaregistry/serde/test/test_pb.ts @@ -0,0 +1,102 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/test.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/test.proto. + */ +export const file_test_schemaregistry_serde_test: GenFile = /*@__PURE__*/ + fileDesc("CiR0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL3Rlc3QucHJvdG8SBHRlc3QiyAIKC1Rlc3RNZXNzYWdlEhMKC3Rlc3Rfc3RyaW5nGAEgASgJEhEKCXRlc3RfYm9vbBgCIAEoCBISCgp0ZXN0X2J5dGVzGAMgASgMEhMKC3Rlc3RfZG91YmxlGAQgASgBEhIKCnRlc3RfZmxvYXQYBSABKAISFAoMdGVzdF9maXhlZDMyGAYgASgHEhQKDHRlc3RfZml4ZWQ2NBgHIAEoBhISCgp0ZXN0X2ludDMyGAggASgFEhIKCnRlc3RfaW50NjQYCSABKAMSFQoNdGVzdF9zZml4ZWQzMhgKIAEoDxIVCg10ZXN0X3NmaXhlZDY0GAsgASgQEhMKC3Rlc3Rfc2ludDMyGAwgASgREhMKC3Rlc3Rfc2ludDY0GA0gASgSEhMKC3Rlc3RfdWludDMyGA4gASgNEhMKC3Rlc3RfdWludDY0GA8gASgEQglaBy4uL3Rlc3RiBnByb3RvMw", [file_google_protobuf_descriptor]); + +/** + * @generated from message test.TestMessage + */ +export type TestMessage = Message<"test.TestMessage"> & { + /** + * @generated from field: string test_string = 1; + */ + testString: string; + + /** + * @generated from field: bool test_bool = 2; + */ + testBool: boolean; + + /** + * @generated from field: bytes test_bytes = 3; + */ + testBytes: Uint8Array; + + /** + * @generated from field: double test_double = 4; + */ + testDouble: number; + + /** + * @generated from field: float test_float = 5; + */ + testFloat: number; + + /** + * @generated from field: fixed32 test_fixed32 = 6; + */ + testFixed32: number; + + /** + * @generated from field: fixed64 test_fixed64 = 7; + */ + testFixed64: bigint; + + /** + * @generated from field: int32 test_int32 = 8; + */ + testInt32: number; + + /** + * @generated from field: int64 test_int64 = 9; + */ + testInt64: bigint; + + /** + * @generated from field: sfixed32 test_sfixed32 = 10; + */ + testSfixed32: number; + + /** + * @generated from field: sfixed64 test_sfixed64 = 11; + */ + testSfixed64: bigint; + + /** + * @generated from field: sint32 test_sint32 = 12; + */ + testSint32: number; + + /** + * @generated from field: sint64 test_sint64 = 13; + */ + testSint64: bigint; + + /** + * @generated from field: uint32 test_uint32 = 14; + */ + testUint32: number; + + /** + * @generated from field: uint64 test_uint64 = 15; + */ + testUint64: bigint; +}; + +/** + * Describes the message test.TestMessage. + * Use `create(TestMessageSchema)` to create a new message. + */ +export const TestMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_test, 0); + diff --git a/test/schemaregistry/serde/test/widget_pb.ts b/test/schemaregistry/serde/test/widget_pb.ts new file mode 100644 index 00000000..a8924d86 --- /dev/null +++ b/test/schemaregistry/serde/test/widget_pb.ts @@ -0,0 +1,41 @@ +// @generated by protoc-gen-es v2.0.0 with parameter "target=ts" +// @generated from file test/schemaregistry/serde/widget.proto (package test, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file test/schemaregistry/serde/widget.proto. + */ +export const file_test_schemaregistry_serde_widget: GenFile = /*@__PURE__*/ + fileDesc("CiZ0ZXN0L3NjaGVtYXJlZ2lzdHJ5L3NlcmRlL3dpZGdldC5wcm90bxIEdGVzdCI1CgZXaWRnZXQSDAoEbmFtZRgBIAEoCRIMCgRzaXplGAIgASgFEg8KB3ZlcnNpb24YAyABKAVCCVoHLi4vdGVzdGIGcHJvdG8z"); + +/** + * @generated from message test.Widget + */ +export type Widget = Message<"test.Widget"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: int32 size = 2; + */ + size: number; + + /** + * @generated from field: int32 version = 3; + */ + version: number; +}; + +/** + * Describes the message test.Widget. + * Use `create(WidgetSchema)` to create a new message. + */ +export const WidgetSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_test_schemaregistry_serde_widget, 0); + diff --git a/tsconfig.json b/tsconfig.json index 52031e99..b3650ce2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,12 +4,12 @@ "lib": [ "es2021", "dom" ], - "module": "commonjs", + "module": "preserve", "target": "es2021", "strict": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "moduleResolution": "node16", + "moduleResolution": "bundler", "allowUnusedLabels": false, "allowUnreachableCode": false, "noFallthroughCasesInSwitch": true, @@ -18,10 +18,11 @@ "noPropertyAccessFromIndexSignature": true, "noUnusedLocals": true, "useUnknownInCatchVariables": true, - "types": ["node_modules/@types/node", "jest"], + "types": ["node_modules/@types/node"], "typeRoots": ["."], "noEmit": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "skipLibCheck": true }, "include": [ "index.d.ts",