From 402437fc4ebb8697a262030fac011c6f4da722cc Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 31 Mar 2022 17:33:50 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E2=9C=A8=20feat:=20initialize=20ofn=20knat?= =?UTF-8?q?ive=20and=20async=20runtimes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 29 +- docs/async-server.puml | 61 + docs/http-binding.puml | 76 + package-lock.json | 2568 ++++++++++++++--- package.json | 19 +- src/functions.ts | 10 +- src/main.ts | 43 +- src/openfunction/async_server.ts | 66 + .../dapr_binding_output_middleware.ts | 38 + src/openfunction/decs.d.ts | 1 + src/openfunction/function_context.ts | 123 + src/openfunction/function_runtime.ts | 108 + src/options.ts | 31 +- src/server.ts | 11 +- test/conformance/.env-cmdrc.js | 34 + test/conformance/function.js | 14 + test/conformance/package.json | 15 +- test/data/components/async/binding-cron.yaml | 10 + .../components/async/binding-localfs.yaml | 10 + test/data/components/async/binding-mqtt.yaml | 14 + test/data/components/async/pubsub-mqtt.yaml | 12 + test/data/components/cron/binding-cron.yaml | 10 + test/data/components/http/localstorage.yaml | 10 + test/integration/async_server.ts | 180 ++ test/integration/http_binding.ts | 104 + test/options.ts | 8 + 27 files changed, 3171 insertions(+), 435 deletions(-) create mode 100644 docs/async-server.puml create mode 100644 docs/http-binding.puml create mode 100644 src/openfunction/async_server.ts create mode 100644 src/openfunction/dapr_binding_output_middleware.ts create mode 100644 src/openfunction/decs.d.ts create mode 100644 src/openfunction/function_context.ts create mode 100644 src/openfunction/function_runtime.ts create mode 100644 test/conformance/.env-cmdrc.js create mode 100644 test/data/components/async/binding-cron.yaml create mode 100644 test/data/components/async/binding-localfs.yaml create mode 100644 test/data/components/async/binding-mqtt.yaml create mode 100644 test/data/components/async/pubsub-mqtt.yaml create mode 100644 test/data/components/cron/binding-cron.yaml create mode 100644 test/data/components/http/localstorage.yaml create mode 100644 test/integration/async_server.ts create mode 100644 test/integration/http_binding.ts diff --git a/.gitignore b/.gitignore index d0765455..54e089a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules/ build/ .coverage/ +.history/ npm-debug.log .nyc_output .vscode diff --git a/README.md b/README.md index f9355f1e..d1475269 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,12 @@ for writing portable Node.js functions The Functions Framework lets you write lightweight functions that run in many different environments, including: -* [Google Cloud Functions](https://cloud.google.com/functions/) -* Your local development machine -* [Cloud Run](https://cloud.google.com/run/) and [Cloud Run for Anthos](https://cloud.google.com/anthos/run) -* [Knative](https://github.com/knative/)-based environments -* [OpenFunction](https://github.com/OpenFunction/OpenFunction) +* [Google Cloud Functions](https://cloud.google.com/functions/) +* Your local development machine +* [Cloud Run](https://cloud.google.com/run/) and [Cloud Run for Anthos](https://cloud.google.com/anthos/run) +* [Knative](https://github.com/knative/)-based environments +* [Dapr](https://dapr.io/)-based environments +* [OpenFunction](https://github.com/OpenFunction/OpenFunction) The framework allows you to go from: @@ -45,11 +46,11 @@ handling logic. ## Features -- Spin up a local development server for quick testing -- Invoke a function in response to a request -- Automatically unmarshal events conforming to the +* Spin up a local development server for quick testing +* Invoke a function in response to a request +* Automatically unmarshal events conforming to the [CloudEvents](https://cloudevents.io/) spec -- Portable between serverless platforms +* Portable between serverless platforms ## Installation @@ -77,7 +78,7 @@ npm install @openfunction/functions-framework npx @openfunction/functions-framework --target=helloWorld ``` -1. Open http://localhost:8080/ in your browser and see _Hello, World_. +1. Open in your browser and see _Hello, World_. ### Quickstart: Set up a new project @@ -132,7 +133,7 @@ command-line arguments: 1. Install [Docker](https://store.docker.com/search?type=edition&offering=community) and the [`pack` tool](https://buildpacks.io/docs/install-pack/). 1. Build a container from your function using the Functions [buildpacks](https://github.com/GoogleCloudPlatform/buildpacks): - + ```sh pack build \ --builder openfunction/builder-node:v2-16.13 \ @@ -142,14 +143,14 @@ command-line arguments: ``` 1. Start the built container: - + ```sh docker run --rm -p 8080:8080 my-first-function # Output: Serving function... ``` 1. Send requests to this function using `curl` from another terminal window: - + ```sh curl localhost:8080 # Output: Hello, World! @@ -249,7 +250,7 @@ To enable the CloudEvent functions, you must list the Functions Framework as a d ```json { "dependencies": { - "@openfunction/functions-framework": "~0.3.6" + "@openfunction/functions-framework": "~0.4.0" } } ``` diff --git a/docs/async-server.puml b/docs/async-server.puml new file mode 100644 index 00000000..f0e7c2e6 --- /dev/null +++ b/docs/async-server.puml @@ -0,0 +1,61 @@ +@startuml Async Server + +box Function Process in Local Environment or Container +control ENTRYPOINT +participant Main +participant AsyncServer +participant DaprServer +participant Restana [ + Web Server + ---- + ""Restana"" +] +end box + +entity "Dapr Sidecar " as DaprSidecar + +== OpenFunction Serving == + +ENTRYPOINT -> Main ** : execute +note over ENTRYPOINT, Main: Pass through __CLI arguments__ and \ncontainer __environment variables__ + +Main -> Main : load user function file +note left: ""function (ctx, data) {}"" + +Main -> AsyncServer ** : create +note over Main, AsyncServer: Hand over __user function__ and __context__ + +AsyncServer -> DaprServer ** : ""new"" +note over AsyncServer, DaprServer: Extract __port__ from __context__ and pass down + +DaprServer -> Restana ** : ""new"" +note over Restana: Super fast and minimalist framework \nfor building REST micro-services +||| +DaprServer --> DaprSidecar : Waiting till Dapr sidecar started +note over DaprServer, DaprSidecar #FFAAAA: Using HTTP channel due to lack of good support of gRPC in Dapr Node.js SDK +... +AsyncServer -> DaprServer : register __user function__ as handler \nfor each of __inputs__ in __context__ +DaprServer -> Restana : add routes for Dapr style \nsubscriptions and input bindings + +... + +== OpenFunction Triggering == + +DaprSidecar <--] : sub / input data + +DaprSidecar -> Restana ++ : Dapr request with "data" + +Restana -> Restana ++ : invoke user function + +alt + Restana -> DaprSidecar ++ : publish data or invoke output binding + DaprSidecar --> Restana -- : execution result +end + +return + +return server app response + +... + +@enduml \ No newline at end of file diff --git a/docs/http-binding.puml b/docs/http-binding.puml new file mode 100644 index 00000000..e87cd3db --- /dev/null +++ b/docs/http-binding.puml @@ -0,0 +1,76 @@ +@startuml HTTP Binding + +box Function Process in Local Environment or Container +control ENTRYPOINT +participant Main +participant Server +participant Express [ + Web Server + ---- + ""Express"" +] +participant Interceptor +participant "User Function" as UserFunction +participant DaprClient +end box + +entity "Dapr Sidecar " as DaprSidecar + +== OpenFunction Serving == + +ENTRYPOINT -> Main ** : execute +note over ENTRYPOINT, Main: Pass through __CLI arguments__ and \ncontainer __environment variables__ + +Main -> Main : load user function file +note left: ""function (req, res) {}"" + +Main -> Server ** : create +note over Main, Server: Hand over __user function__, __function type__ \nand __context__ parsed from env variables + +Server -> Express ** : new + +Server -> Express : use init middleware +note over Server, Express: Store context in ""res.locals.context"" + +Server -> Interceptor ** : new +Server -> Express : use interceptor +||| +Server -> Express : use others middlewares +||| +Server -> UserFunction ** : wrap user function +note over Server, UserFunction: Use Node.js ""Domain"" to run function and catch exceptions +Server -> Express : bind wrapper to "/*" route + +... + +== OpenFunction Invocation == + +[-> Express ++ : HTTP request to "/" + +Express -> UserFunction ++ : execute user function +UserFunction --> Express -- : return execution result "data" + +alt ""runtime"" = ""knative"" and ""outputs"" is not empty + Express -> Interceptor ++ : invoke interceptor + + Interceptor -> Interceptor : load context + Interceptor -> DaprClient ** : new + + loop each OpenFunction Output + Interceptor -> DaprClient ++ : send "data" + + DaprClient -> DaprSidecar ++ : invoke binding or publication with "data" + DaprSidecar --> DaprClient -- : return result + + DaprClient --> Interceptor -- : forward result + end + + Interceptor -> DaprClient !! + Interceptor --> Express -- : return "data" as response +end + +[<- Express -- : send response + +... + +@enduml diff --git a/package-lock.json b/package-lock.json index 6f7fd2a4..73183c1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,14 @@ "version": "0.3.6", "license": "Apache-2.0", "dependencies": { + "@openfunction/functions-framework": "0.3.6", "body-parser": "^1.18.3", "cloudevents": "^5.3.2", + "dapr-client": "^2.1.0", + "debug": "^4.3.4", "express": "^4.16.4", + "express-interceptor": "^1.2.0", + "lodash": "^4.17.21", "minimist": "^1.2.5", "on-finished": "^2.3.0", "read-pkg-up": "^7.0.1", @@ -24,20 +29,29 @@ "devDependencies": { "@microsoft/api-extractor": "^7.18.20", "@types/body-parser": "1.19.2", + "@types/debug": "^4.1.7", "@types/express": "4.17.13", + "@types/lodash": "^4.14.179", "@types/minimist": "1.2.2", "@types/mocha": "9.0.0", "@types/node": "14.18.11", "@types/on-finished": "2.3.1", "@types/semver": "^7.3.6", + "@types/shelljs": "^0.8.11", "@types/sinon": "^10.0.0", "@types/supertest": "2.0.11", + "aedes": "^0.46.3", + "concurrently": "^7.0.0", + "cross-env": "^7.0.3", + "env-cmd": "^10.1.0", "gts": "3.1.0", "mocha": "9.1.2", "pack-n-play": "^1.0.0-2", + "shelljs": "^0.8.5", "sinon": "^12.0.0", "supertest": "6.1.6", - "typescript": "^4.5.5" + "typescript": "^4.5.5", + "wait-on": "^6.0.1" }, "engines": { "node": ">=10.0.0" @@ -95,23 +109,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -121,12 +118,51 @@ "node": ">= 4" } }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/@grpc/grpc-js": { + "version": "1.5.7", + "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", + "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==", "dev": true }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -141,35 +177,29 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@js-temporal/polyfill": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/@js-temporal/polyfill/-/polyfill-0.3.0.tgz", + "integrity": "sha512-cxxxis19j0WvK3+kUwKrXeXaDBaWxLeRfKqlVz7g50Cly6UgGs2p3wovH9zjtZ4TtjYHDR4De/880+aalduDZQ==", + "dependencies": { + "big-integer": "^1.6.51", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@js-temporal/polyfill/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/@microsoft/api-extractor": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.4.tgz", @@ -282,6 +312,82 @@ "node": ">= 8" } }, + "node_modules/@openfunction/functions-framework": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@openfunction/functions-framework/-/functions-framework-0.3.6.tgz", + "integrity": "sha512-V8ONTJHkLzgyCQSQsNNJi0N4i0cwkF0C1OAZi0RKMWxakCfcYTg6IbtOvFbYmNhQG1xk1BHOJEDIRHW5WXzsCw==", + "dependencies": { + "@openfunction/functions-framework": "0.3.6", + "body-parser": "^1.18.3", + "cloudevents": "^5.3.2", + "express": "^4.16.4", + "minimist": "^1.2.5", + "on-finished": "^2.3.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.5" + }, + "bin": { + "functions-framework": "build/src/main.js", + "functions-framework-nodejs": "build/src/main.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@rushstack/node-core-library": { "version": "3.45.0", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.0.tgz", @@ -351,6 +457,27 @@ "string-argv": "~0.3.1" } }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -438,6 +565,15 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -461,18 +597,45 @@ "@types/range-parser": "*" } }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.179", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.179.tgz", + "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -485,11 +648,16 @@ "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, "node_modules/@types/node": { "version": "14.18.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.11.tgz", - "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==", - "dev": true + "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -533,6 +701,16 @@ "@types/node": "*" } }, + "node_modules/@types/shelljs": { + "version": "0.8.11", + "resolved": "https://registry.npmmirror.com/@types/shelljs/-/shelljs-0.8.11.tgz", + "integrity": "sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw==", + "dev": true, + "dependencies": { + "@types/glob": "*", + "@types/node": "*" + } + }, "node_modules/@types/sinon": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", @@ -593,29 +771,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", @@ -667,29 +822,6 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", @@ -747,29 +879,6 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", @@ -793,6 +902,19 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "node_modules/0http": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/0http/-/0http-3.1.2.tgz", + "integrity": "sha512-Cs/dy31/kvPNZnTxEJCyrWEqwl4LOF5Xv9+/tButVWTLJWiFZiECWzOcZKkctmJFWTCd0k0vL5bwmEOmxDJqfQ==", + "dependencies": { + "lru-cache": "^6.0.0", + "regexparam": "^2.0.0", + "trouter": "^3.2.0" + }, + "engines": { + "node": ">=10.x" + } + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -826,6 +948,68 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/aedes": { + "version": "0.46.3", + "resolved": "https://registry.npmmirror.com/aedes/-/aedes-0.46.3.tgz", + "integrity": "sha512-i3B+H74uNRhlqcs/JdrMp7e3daz4Cwls0x4yLcfjGXz2tIwnxhF6od4m86O6yyNdz/Gg3jfY3q0sc/Cz8qzg6g==", + "dev": true, + "dependencies": { + "aedes-packet": "^2.3.1", + "aedes-persistence": "^8.1.3", + "bulk-write-stream": "^2.0.1", + "end-of-stream": "^1.4.4", + "fastfall": "^1.5.1", + "fastparallel": "^2.4.1", + "fastseries": "^2.0.0", + "hyperid": "^3.0.0", + "mqemitter": "^4.5.0", + "mqtt-packet": "^7.1.2", + "readable-stream": "^3.6.0", + "retimer": "^3.0.0", + "reusify": "^1.0.4", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/aedes-packet": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/aedes-packet/-/aedes-packet-2.3.1.tgz", + "integrity": "sha512-LqBd57uc2rui2RbjycW17dylglejG26mM4ewVXGNDnVp/SUHFVEgm7d1HTmYrnSkSCNoHti042qgcTwv/F+BtQ==", + "dev": true, + "dependencies": { + "mqtt-packet": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aedes-packet/node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "dev": true, + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/aedes-persistence": { + "version": "8.1.3", + "resolved": "https://registry.npmmirror.com/aedes-persistence/-/aedes-persistence-8.1.3.tgz", + "integrity": "sha512-VMCjEV+2g1TNJb/IlDEUy6SP9crT+QUhe2xc6UjyqrFNBNgTvHmOefXY7FxWrwmR2QA02vwg3+5p/JXkyg/Dkw==", + "dev": true, + "dependencies": { + "aedes-packet": "^2.3.1", + "from2": "^2.3.0", + "qlobber": "^5.0.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -890,7 +1074,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -977,12 +1160,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -992,6 +1198,23 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1012,6 +1235,24 @@ "node": ">= 0.8" } }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" + }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -1156,6 +1397,26 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bulk-write-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz", + "integrity": "sha512-XWOLjgHtpDasHfwM8oO4df1JoZwa7/OwTsXDzh4rUTo+9CowzeOFBZz43w+H14h1fyq+xl28tVIBrdjcjj4Gug==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -1342,7 +1603,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1381,46 +1641,144 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concurrently": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.0.0.tgz", + "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "bin": { + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/concurrently/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concurrently/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -1476,6 +1834,30 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1499,12 +1881,44 @@ "node": ">=8" } }, + "node_modules/dapr-client": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/dapr-client/-/dapr-client-2.1.0.tgz", + "integrity": "sha512-6dEyNmvGq+r1QHUlbXVk43FaJBIuywLm1nvlr1ZaU8nThzWK6mLzstsgMqwCYzGNU8LvVpB+yIM5X/+XeFvquA==", + "dependencies": { + "@grpc/grpc-js": "^1.3.7", + "@js-temporal/polyfill": "^0.3.0", + "body-parser": "^1.19.0", + "google-protobuf": "^3.18.0", + "http-terminator": "^3.0.4", + "node-fetch": "^2.6.1", + "restana": "^4.9.1", + "uuid": "^8.3.2" + } + }, + "node_modules/date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "dev": true, + "engines": { + "node": ">=0.11" + } + }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decamelize": { @@ -1565,6 +1979,14 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -1582,6 +2004,14 @@ "node": ">= 0.4" } }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "engines": { + "node": ">=10" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1663,8 +2093,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -1695,6 +2124,31 @@ "node": ">=8.6" } }, + "node_modules/env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dev": true, + "dependencies": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "bin": { + "env-cmd": "bin/env-cmd.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/env-cmd/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1756,7 +2210,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -2067,23 +2520,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2138,12 +2574,6 @@ "node": ">= 4" } }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2323,6 +2753,40 @@ "node": ">= 0.10.0" } }, + "node_modules/express-interceptor": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/express-interceptor/-/express-interceptor-1.2.0.tgz", + "integrity": "sha512-fCbcJv8ZwabDg0M/3PmHUxfr/WKHGMpAicR9TfGdhANV4M1GBDSrBTenHIK3aegyRN5S6eDwlvyNFiLynnc19w==", + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/express-interceptor/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express-interceptor/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -2349,9 +2813,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2361,7 +2825,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -2369,17 +2833,63 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fast-json-stringify": { + "version": "2.7.13", + "resolved": "https://registry.npmmirror.com/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", + "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", + "dependencies": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-printf": { + "version": "1.6.9", + "resolved": "https://registry.npmmirror.com/fast-printf/-/fast-printf-1.6.9.tgz", + "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==", + "dependencies": { + "boolean": "^3.1.4" + }, + "engines": { + "node": ">=10.0" + } + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastfall": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/fastfall/-/fastfall-1.5.1.tgz", + "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==", + "dev": true, + "dependencies": { + "reusify": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fastparallel": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/fastparallel/-/fastparallel-2.4.1.tgz", + "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4", + "xtend": "^4.0.2" + } }, "node_modules/fastq": { "version": "1.13.0", @@ -2390,6 +2900,12 @@ "reusify": "^1.0.4" } }, + "node_modules/fastseries": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/fastseries/-/fastseries-2.0.0.tgz", + "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==", + "dev": true + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -2446,6 +2962,19 @@ "node": ">= 0.8" } }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2486,6 +3015,20 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -2531,6 +3074,46 @@ "node": ">= 0.6" } }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -2592,7 +3175,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -2711,6 +3293,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/globby": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", @@ -2731,6 +3324,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/google-protobuf": { + "version": "3.19.4", + "resolved": "https://registry.npmmirror.com/google-protobuf/-/google-protobuf-3.19.4.tgz", + "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==" + }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -2988,6 +3586,28 @@ "node": ">= 0.6" } }, + "node_modules/http-terminator": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/http-terminator/-/http-terminator-3.1.0.tgz", + "integrity": "sha512-c57dUVVHs+jLXeJvs3Y+GrEGMnGE5yxS8ngNTSh5HlP3Q12s6cxVlukE4UcI0xfWyfcm8RRPMAoaFVAlylKcYg==", + "dependencies": { + "delay": "^5.0.0", + "p-wait-for": "^3.2.0", + "roarr": "^7.0.4", + "type-fest": "^2.3.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/http-terminator/node_modules/type-fest": { + "version": "2.12.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-2.12.0.tgz", + "integrity": "sha512-Qe5GRT+n/4GoqCNGGVp5Snapg1Omq3V7irBJB3EaKsp7HWDo5Gv2d/67gfNyV+d5EXD+x/RF5l1h4yJ7qNkcGA==", + "engines": { + "node": ">=12.20" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -2997,6 +3617,16 @@ "node": ">=10.17.0" } }, + "node_modules/hyperid": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hyperid/-/hyperid-3.0.1.tgz", + "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==", + "dev": true, + "dependencies": { + "uuid": "^8.3.2", + "uuid-parse": "^1.1.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3008,10 +3638,16 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -3200,6 +3836,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -3327,7 +3972,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -3581,6 +4225,19 @@ "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", "dev": true }, + "node_modules/joi": { + "version": "17.6.0", + "resolved": "https://registry.npmmirror.com/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3712,9 +4369,13 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/lodash.get": { "version": "4.4.2", @@ -3826,6 +4487,11 @@ "node": ">=8" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4337,10 +5003,34 @@ "node": ">=10" } }, + "node_modules/mqemitter": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/mqemitter/-/mqemitter-4.5.0.tgz", + "integrity": "sha512-Mp/zytFeIv6piJQkEKnncHcP4R/ErJc5C7dfonkhkNUT2LA/nTayrfNxbipp3M5iCJUTQSUtzfQAQA3XVcKz6w==", + "dev": true, + "dependencies": { + "fastparallel": "^2.3.0", + "qlobber": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mqtt-packet": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-7.1.2.tgz", + "integrity": "sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mute-stream": { "version": "0.0.8", @@ -4405,6 +5095,25 @@ "isarray": "0.0.1" } }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4590,6 +5299,14 @@ "node": ">=6" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4615,6 +5332,17 @@ "node": ">=8" } }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4623,6 +5351,17 @@ "node": ">=6" } }, + "node_modules/p-wait-for": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/p-wait-for/-/p-wait-for-3.2.0.tgz", + "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==", + "dependencies": { + "p-timeout": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pack-n-play": { "version": "1.0.0-2", "resolved": "https://registry.npmjs.org/pack-n-play/-/pack-n-play-1.0.0-2.tgz", @@ -4824,6 +5563,12 @@ "node": ">=6.0.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -4833,6 +5578,31 @@ "node": ">=0.4.0" } }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -4875,6 +5645,15 @@ "node": ">=8" } }, + "node_modules/qlobber": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-5.0.3.tgz", + "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -5037,6 +5816,18 @@ "node": ">=8.10.0" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -5050,6 +5841,14 @@ "node": ">=8" } }, + "node_modules/regexparam": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/regexparam/-/regexparam-2.0.0.tgz", + "integrity": "sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==", + "engines": { + "node": ">=8" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -5090,7 +5889,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5134,6 +5932,18 @@ "lowercase-keys": "^1.0.0" } }, + "node_modules/restana": { + "version": "4.9.3", + "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.3.tgz", + "integrity": "sha512-oyGgDPmO+zUSjShjUwEFX/7Tk3x1K3bYBBpIa5uZwHLBdkqdEApmGq32+U9yOk6zP7h4xcWyGKsLDRUJKHtXow==", + "hasInstallScript": true, + "dependencies": { + "0http": "^3.1.2" + }, + "engines": { + "node": ">=10.x" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -5147,6 +5957,12 @@ "node": ">=8" } }, + "node_modules/retimer": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/retimer/-/retimer-3.0.0.tgz", + "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==", + "dev": true + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -5157,6 +5973,11 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5172,6 +5993,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/roarr": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/roarr/-/roarr-7.8.2.tgz", + "integrity": "sha512-55yK+LC9FcsGZOheIEGgXzi+pdRhqN/kjWjEzLUYZBRPt5zzakVHc3sZ74FuQ2zz73YfiA5PjnUOFFXbG7n9cA==", + "dependencies": { + "boolean": "^3.1.4", + "fast-json-stringify": "^2.7.10", + "fast-printf": "^1.6.9", + "fast-safe-stringify": "^2.1.1", + "globalthis": "^1.0.2", + "semver-compare": "^1.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -5240,6 +6077,11 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, "node_modules/semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", @@ -5284,6 +6126,19 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/send/node_modules/ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -5338,6 +6193,23 @@ "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5473,6 +6345,12 @@ "node": ">=0.10.0" } }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "dev": true + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -5553,11 +6431,15 @@ "node": ">=0.6.19" } }, + "node_modules/string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5595,7 +6477,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5659,23 +6540,6 @@ "node": ">= 7.0.0" } }, - "node_modules/superagent/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -5688,12 +6552,6 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/superagent/node_modules/qs": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", @@ -5847,6 +6705,20 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -5856,6 +6728,25 @@ "node": ">=8" } }, + "node_modules/trouter": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/trouter/-/trouter-3.2.0.tgz", + "integrity": "sha512-rLLXbhTObLy2MBVjLC+jTnoIKw99n0GuJs9ov10J870vDw5qhTurPzsDrudNtBf5w/CZ9ctZy2p2IMmhGcel2w==", + "dependencies": { + "regexparam": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/trouter/node_modules/regexparam": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/regexparam/-/regexparam-1.3.0.tgz", + "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==", + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -6145,6 +7036,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/uuid-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/uuid-parse/-/uuid-parse-1.1.0.tgz", + "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==", + "dev": true + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -6177,6 +7074,54 @@ "node": ">= 0.8" } }, + "node_modules/wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dev": true, + "dependencies": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/wait-on/node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/wait-on/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6257,7 +7202,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6274,7 +7218,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -6289,7 +7232,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -6300,8 +7242,7 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrappy": { "version": "1.0.2", @@ -6330,11 +7271,19 @@ "node": ">=8" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -6348,7 +7297,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -6366,7 +7314,6 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, "engines": { "node": ">=10" } @@ -6493,29 +7440,50 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, + "@grpc/grpc-js": { + "version": "1.5.7", + "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", + "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + } + }, + "@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -6525,23 +7493,6 @@ "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@humanwhocodes/object-schema": { @@ -6550,6 +7501,22 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@js-temporal/polyfill": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/@js-temporal/polyfill/-/polyfill-0.3.0.tgz", + "integrity": "sha512-cxxxis19j0WvK3+kUwKrXeXaDBaWxLeRfKqlVz7g50Cly6UgGs2p3wovH9zjtZ4TtjYHDR4De/880+aalduDZQ==", + "requires": { + "big-integer": "^1.6.51", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, "@microsoft/api-extractor": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.4.tgz", @@ -6632,22 +7599,91 @@ "run-parallel": "^1.1.9" } }, - "@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 + "@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 + }, + "@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, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@openfunction/functions-framework": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@openfunction/functions-framework/-/functions-framework-0.3.6.tgz", + "integrity": "sha512-V8ONTJHkLzgyCQSQsNNJi0N4i0cwkF0C1OAZi0RKMWxakCfcYTg6IbtOvFbYmNhQG1xk1BHOJEDIRHW5WXzsCw==", + "requires": { + "@openfunction/functions-framework": "0.3.6", + "body-parser": "^1.18.3", + "cloudevents": "^5.3.2", + "express": "^4.16.4", + "minimist": "^1.2.5", + "on-finished": "^2.3.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.5" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, - "@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, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@rushstack/node-core-library": { "version": "3.45.0", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.0.tgz", @@ -6715,6 +7751,27 @@ "string-argv": "~0.3.1" } }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -6796,6 +7853,15 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -6819,18 +7885,45 @@ "@types/range-parser": "*" } }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/lodash": { + "version": "4.14.179", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.179.tgz", + "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==", + "dev": true + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -6843,11 +7936,16 @@ "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", "dev": true }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, "@types/node": { "version": "14.18.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.11.tgz", - "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==", - "dev": true + "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -6891,6 +7989,16 @@ "@types/node": "*" } }, + "@types/shelljs": { + "version": "0.8.11", + "resolved": "https://registry.npmmirror.com/@types/shelljs/-/shelljs-0.8.11.tgz", + "integrity": "sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, "@types/sinon": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", @@ -6933,23 +8041,6 @@ "regexpp": "^3.1.0", "semver": "^7.3.5", "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/experimental-utils": { @@ -6976,23 +8067,6 @@ "@typescript-eslint/types": "4.33.0", "@typescript-eslint/typescript-estree": "4.33.0", "debug": "^4.3.1" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/scope-manager": { @@ -7024,23 +8098,6 @@ "is-glob": "^4.0.1", "semver": "^7.3.5", "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/visitor-keys": { @@ -7059,6 +8116,16 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "0http": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/0http/-/0http-3.1.2.tgz", + "integrity": "sha512-Cs/dy31/kvPNZnTxEJCyrWEqwl4LOF5Xv9+/tButVWTLJWiFZiECWzOcZKkctmJFWTCd0k0vL5bwmEOmxDJqfQ==", + "requires": { + "lru-cache": "^6.0.0", + "regexparam": "^2.0.0", + "trouter": "^3.2.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -7081,6 +8148,61 @@ "dev": true, "requires": {} }, + "aedes": { + "version": "0.46.3", + "resolved": "https://registry.npmmirror.com/aedes/-/aedes-0.46.3.tgz", + "integrity": "sha512-i3B+H74uNRhlqcs/JdrMp7e3daz4Cwls0x4yLcfjGXz2tIwnxhF6od4m86O6yyNdz/Gg3jfY3q0sc/Cz8qzg6g==", + "dev": true, + "requires": { + "aedes-packet": "^2.3.1", + "aedes-persistence": "^8.1.3", + "bulk-write-stream": "^2.0.1", + "end-of-stream": "^1.4.4", + "fastfall": "^1.5.1", + "fastparallel": "^2.4.1", + "fastseries": "^2.0.0", + "hyperid": "^3.0.0", + "mqemitter": "^4.5.0", + "mqtt-packet": "^7.1.2", + "readable-stream": "^3.6.0", + "retimer": "^3.0.0", + "reusify": "^1.0.4", + "uuid": "^8.3.2" + } + }, + "aedes-packet": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/aedes-packet/-/aedes-packet-2.3.1.tgz", + "integrity": "sha512-LqBd57uc2rui2RbjycW17dylglejG26mM4ewVXGNDnVp/SUHFVEgm7d1HTmYrnSkSCNoHti042qgcTwv/F+BtQ==", + "dev": true, + "requires": { + "mqtt-packet": "^6.3.0" + }, + "dependencies": { + "mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "dev": true, + "requires": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + } + } + }, + "aedes-persistence": { + "version": "8.1.3", + "resolved": "https://registry.npmmirror.com/aedes-persistence/-/aedes-persistence-8.1.3.tgz", + "integrity": "sha512-VMCjEV+2g1TNJb/IlDEUy6SP9crT+QUhe2xc6UjyqrFNBNgTvHmOefXY7FxWrwmR2QA02vwg3+5p/JXkyg/Dkw==", + "dev": true, + "requires": { + "aedes-packet": "^2.3.1", + "from2": "^2.3.0", + "qlobber": "^5.0.3" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7127,8 +8249,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -7191,18 +8312,57 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, + "axios": { + "version": "0.25.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.7" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -7218,8 +8378,28 @@ "qs": "6.7.0", "raw-body": "2.4.0", "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, + "boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" + }, "boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -7324,6 +8504,26 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "bulk-write-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz", + "integrity": "sha512-XWOLjgHtpDasHfwM8oO4df1JoZwa7/OwTsXDzh4rUTo+9CowzeOFBZz43w+H14h1fyq+xl28tVIBrdjcjj4Gug==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -7462,7 +8662,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -7535,6 +8734,84 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concurrently": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.0.0.tgz", + "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -7578,6 +8855,21 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -7595,12 +8887,33 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "dapr-client": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/dapr-client/-/dapr-client-2.1.0.tgz", + "integrity": "sha512-6dEyNmvGq+r1QHUlbXVk43FaJBIuywLm1nvlr1ZaU8nThzWK6mLzstsgMqwCYzGNU8LvVpB+yIM5X/+XeFvquA==", + "requires": { + "@grpc/grpc-js": "^1.3.7", + "@js-temporal/polyfill": "^0.3.0", + "body-parser": "^1.19.0", + "google-protobuf": "^3.18.0", + "http-terminator": "^3.0.4", + "node-fetch": "^2.6.1", + "restana": "^4.9.1", + "uuid": "^8.3.2" + } + }, + "date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "dev": true + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "decamelize": { @@ -7648,6 +8961,11 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -7662,6 +8980,11 @@ "object-keys": "^1.0.12" } }, + "delay": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==" + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -7725,8 +9048,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -7751,6 +9073,24 @@ "ansi-colors": "^4.1.1" } }, + "env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dev": true, + "requires": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7798,9 +9138,8 @@ }, "escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -7909,15 +9248,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -7953,12 +9283,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8203,6 +9527,44 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "express-interceptor": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/express-interceptor/-/express-interceptor-1.2.0.tgz", + "integrity": "sha512-fCbcJv8ZwabDg0M/3PmHUxfr/WKHGMpAicR9TfGdhANV4M1GBDSrBTenHIK3aegyRN5S6eDwlvyNFiLynnc19w==", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "external-editor": { @@ -8228,9 +9590,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -8245,17 +9607,54 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-json-stringify": { + "version": "2.7.13", + "resolved": "https://registry.npmmirror.com/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", + "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", + "requires": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-printf": { + "version": "1.6.9", + "resolved": "https://registry.npmmirror.com/fast-printf/-/fast-printf-1.6.9.tgz", + "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==", + "requires": { + "boolean": "^3.1.4" + } + }, "fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fastfall": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/fastfall/-/fastfall-1.5.1.tgz", + "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==", + "dev": true, + "requires": { + "reusify": "^1.0.0" + } + }, + "fastparallel": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/fastparallel/-/fastparallel-2.4.1.tgz", + "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==", + "dev": true, + "requires": { + "reusify": "^1.0.4", + "xtend": "^4.0.2" + } }, "fastq": { "version": "1.13.0", @@ -8266,6 +9665,12 @@ "reusify": "^1.0.4" } }, + "fastseries": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/fastseries/-/fastseries-2.0.0.tgz", + "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==", + "dev": true + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -8305,6 +9710,21 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "find-up": { @@ -8338,6 +9758,12 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true + }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -8370,6 +9796,48 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -8417,8 +9885,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.1", @@ -8494,6 +9961,14 @@ } } }, + "globalthis": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", @@ -8508,6 +9983,11 @@ "slash": "^3.0.0" } }, + "google-protobuf": { + "version": "3.19.4", + "resolved": "https://registry.npmmirror.com/google-protobuf/-/google-protobuf-3.19.4.tgz", + "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==" + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -8697,12 +10177,40 @@ "toidentifier": "1.0.0" } }, + "http-terminator": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/http-terminator/-/http-terminator-3.1.0.tgz", + "integrity": "sha512-c57dUVVHs+jLXeJvs3Y+GrEGMnGE5yxS8ngNTSh5HlP3Q12s6cxVlukE4UcI0xfWyfcm8RRPMAoaFVAlylKcYg==", + "requires": { + "delay": "^5.0.0", + "p-wait-for": "^3.2.0", + "roarr": "^7.0.4", + "type-fest": "^2.3.3" + }, + "dependencies": { + "type-fest": { + "version": "2.12.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-2.12.0.tgz", + "integrity": "sha512-Qe5GRT+n/4GoqCNGGVp5Snapg1Omq3V7irBJB3EaKsp7HWDo5Gv2d/67gfNyV+d5EXD+x/RF5l1h4yJ7qNkcGA==" + } + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "hyperid": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hyperid/-/hyperid-3.0.1.tgz", + "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==", + "dev": true, + "requires": { + "uuid": "^8.3.2", + "uuid-parse": "^1.1.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -8711,10 +10219,16 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "ignore-walk": { @@ -8857,6 +10371,12 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -8941,8 +10461,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-function": { "version": "1.0.10", @@ -9106,6 +10625,19 @@ "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", "dev": true }, + "joi": { + "version": "17.6.0", + "resolved": "https://registry.npmmirror.com/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9216,9 +10748,13 @@ }, "lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "lodash.get": { "version": "4.4.2", @@ -9305,6 +10841,11 @@ } } }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -9667,10 +11208,31 @@ } } }, + "mqemitter": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/mqemitter/-/mqemitter-4.5.0.tgz", + "integrity": "sha512-Mp/zytFeIv6piJQkEKnncHcP4R/ErJc5C7dfonkhkNUT2LA/nTayrfNxbipp3M5iCJUTQSUtzfQAQA3XVcKz6w==", + "dev": true, + "requires": { + "fastparallel": "^2.3.0", + "qlobber": "^5.0.0" + } + }, + "mqtt-packet": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-7.1.2.tgz", + "integrity": "sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==", + "dev": true, + "requires": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stream": { "version": "0.0.8", @@ -9725,6 +11287,14 @@ } } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -9864,6 +11434,11 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -9880,11 +11455,27 @@ "p-limit": "^2.2.0" } }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "p-wait-for": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/p-wait-for/-/p-wait-for-3.2.0.tgz", + "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==", + "requires": { + "p-timeout": "^3.0.0" + } + }, "pack-n-play": { "version": "1.0.0-2", "resolved": "https://registry.npmjs.org/pack-n-play/-/pack-n-play-1.0.0-2.tgz", @@ -10032,12 +11623,38 @@ "fast-diff": "^1.1.2" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -10071,6 +11688,12 @@ "escape-goat": "^2.0.0" } }, + "qlobber": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-5.0.3.tgz", + "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==", + "dev": true + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -10187,6 +11810,15 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -10197,6 +11829,11 @@ "strip-indent": "^3.0.0" } }, + "regexparam": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/regexparam/-/regexparam-2.0.0.tgz", + "integrity": "sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==" + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -10224,8 +11861,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", @@ -10257,6 +11893,14 @@ "lowercase-keys": "^1.0.0" } }, + "restana": { + "version": "4.9.3", + "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.3.tgz", + "integrity": "sha512-oyGgDPmO+zUSjShjUwEFX/7Tk3x1K3bYBBpIa5uZwHLBdkqdEApmGq32+U9yOk6zP7h4xcWyGKsLDRUJKHtXow==", + "requires": { + "0http": "^3.1.2" + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -10267,12 +11911,23 @@ "signal-exit": "^3.0.2" } }, + "retimer": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/retimer/-/retimer-3.0.0.tgz", + "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -10282,6 +11937,19 @@ "glob": "^7.1.3" } }, + "roarr": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/roarr/-/roarr-7.8.2.tgz", + "integrity": "sha512-55yK+LC9FcsGZOheIEGgXzi+pdRhqN/kjWjEzLUYZBRPt5zzakVHc3sZ74FuQ2zz73YfiA5PjnUOFFXbG7n9cA==", + "requires": { + "boolean": "^3.1.4", + "fast-json-stringify": "^2.7.10", + "fast-printf": "^1.6.9", + "fast-safe-stringify": "^2.1.1", + "globalthis": "^1.0.2", + "semver-compare": "^1.0.0" + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -10324,6 +11992,11 @@ "lru-cache": "^6.0.0" } }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, "semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", @@ -10361,6 +12034,21 @@ "statuses": "~1.5.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -10408,6 +12096,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -10513,6 +12212,12 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "dev": true + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -10575,11 +12280,15 @@ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10608,7 +12317,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -10653,27 +12361,12 @@ "semver": "^7.3.2" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "qs": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", @@ -10797,12 +12490,38 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "trouter": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/trouter/-/trouter-3.2.0.tgz", + "integrity": "sha512-rLLXbhTObLy2MBVjLC+jTnoIKw99n0GuJs9ov10J870vDw5qhTurPzsDrudNtBf5w/CZ9ctZy2p2IMmhGcel2w==", + "requires": { + "regexparam": "^1.3.0" + }, + "dependencies": { + "regexparam": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/regexparam/-/regexparam-1.3.0.tgz", + "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==" + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -11018,6 +12737,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "uuid-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/uuid-parse/-/uuid-parse-1.1.0.tgz", + "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==", + "dev": true + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -11044,6 +12769,50 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dev": true, + "requires": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "dependencies": { + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -11103,7 +12872,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11114,7 +12882,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -11123,7 +12890,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -11131,8 +12897,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -11160,11 +12925,16 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -11175,7 +12945,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -11189,8 +12958,7 @@ "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index 0136bc9f..7f1f319f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@openfunction/functions-framework", - "version": "0.3.6", + "version": "0.4.0", "description": "FaaS (Function as a service) framework for writing portable Node.js functions", "engines": { "node": ">=10.0.0" @@ -16,14 +16,18 @@ "@openfunction/functions-framework": "0.3.6", "body-parser": "^1.18.3", "cloudevents": "^5.3.2", + "dapr-client": "^2.1.0", + "debug": "^4.3.4", "express": "^4.16.4", + "express-interceptor": "^1.2.0", + "lodash": "^4.17.21", "minimist": "^1.2.5", "on-finished": "^2.3.0", "read-pkg-up": "^7.0.1", "semver": "^7.3.5" }, "scripts": { - "test": "mocha build/test --recursive", + "test": "cross-env DEBUG=common:*,ofn:* mocha build/test -t 60000 --recursive --exit", "build": "npm run clean && npm run compile", "conformance": "./run_conformance_tests.sh", "check": "gts check", @@ -48,19 +52,28 @@ "devDependencies": { "@microsoft/api-extractor": "^7.18.20", "@types/body-parser": "1.19.2", + "@types/debug": "^4.1.7", "@types/express": "4.17.13", + "@types/lodash": "^4.14.179", "@types/minimist": "1.2.2", "@types/mocha": "9.0.0", "@types/node": "14.18.11", "@types/on-finished": "2.3.1", "@types/semver": "^7.3.6", + "@types/shelljs": "^0.8.11", "@types/sinon": "^10.0.0", "@types/supertest": "2.0.11", + "aedes": "^0.46.3", + "concurrently": "^7.0.0", + "cross-env": "^7.0.3", + "env-cmd": "^10.1.0", "gts": "3.1.0", "mocha": "9.1.2", "pack-n-play": "^1.0.0-2", + "shelljs": "^0.8.5", "sinon": "^12.0.0", "supertest": "6.1.6", - "typescript": "^4.5.5" + "typescript": "^4.5.5", + "wait-on": "^6.0.1" } } diff --git a/src/functions.ts b/src/functions.ts index 50b1adad..a40cac7d 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -19,6 +19,8 @@ import {Request as ExpressRequest, Response} from 'express'; import {CloudEventV1 as CloudEvent} from 'cloudevents'; +import {OpenFunctionRuntime} from './openfunction/function_runtime'; + /** * @public */ @@ -74,6 +76,11 @@ export interface CloudEventFunction { export interface CloudEventFunctionWithCallback { (cloudEvent: CloudEvent, callback: Function): any; } + +export interface OpenFunction { + (ctx: OpenFunctionRuntime, data: {}): any; +} + /** * A function handler. * @public @@ -83,7 +90,8 @@ export type HandlerFunction = | EventFunction | EventFunctionWithCallback | CloudEventFunction - | CloudEventFunctionWithCallback; + | CloudEventFunctionWithCallback + | OpenFunction; /** * A legacy event. diff --git a/src/main.ts b/src/main.ts index 4aaaba1c..1622a9c5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -20,6 +20,12 @@ import {getUserFunction} from './loader'; import {ErrorHandler} from './invoker'; import {getServer} from './server'; import {parseOptions, helpText, OptionsError} from './options'; +import {OpenFunction} from './functions'; +import getAysncServer from './openfunction/async_server'; +import { + OpenFunctionContext, + ContextUtils, +} from './openfunction/function_context'; /** * Main entrypoint for the functions framework that loads the user's function @@ -44,19 +50,30 @@ export const main = async () => { process.exit(1); } const {userFunction, signatureType} = loadedFunction; - const server = getServer(userFunction!, signatureType); - const errorHandler = new ErrorHandler(server); - server - .listen(options.port, () => { - errorHandler.register(); - if (process.env.NODE_ENV !== 'production') { - console.log('Serving function...'); - console.log(`Function: ${options.target}`); - console.log(`Signature type: ${signatureType}`); - console.log(`URL: http://localhost:${options.port}/`); - } - }) - .setTimeout(0); // Disable automatic timeout on incoming connections. + + if (ContextUtils.IsAsyncRuntime(options.context as OpenFunctionContext)) { + options.context!.port = options.port; + + const server = getAysncServer( + userFunction! as OpenFunction, + options.context! + ); + await server.start(); + } else { + const server = getServer(userFunction!, signatureType, options.context); + const errorHandler = new ErrorHandler(server); + server + .listen(options.port, () => { + errorHandler.register(); + if (process.env.NODE_ENV !== 'production') { + console.log('Serving function...'); + console.log(`Function: ${options.target}`); + console.log(`Signature type: ${signatureType}`); + console.log(`URL: http://localhost:${options.port}/`); + } + }) + .setTimeout(0); // Disable automatic timeout on incoming connections. + } } catch (e) { if (e instanceof OptionsError) { console.error(e.message); diff --git a/src/openfunction/async_server.ts b/src/openfunction/async_server.ts new file mode 100644 index 00000000..1c4b7cc4 --- /dev/null +++ b/src/openfunction/async_server.ts @@ -0,0 +1,66 @@ +import {forEach, has, get} from 'lodash'; +import {DaprServer} from 'dapr-client'; + +import {OpenFunction} from '../functions'; + +import {OpenFunctionContext, ContextUtils} from './function_context'; +import {OpenFunctionRuntime} from './function_runtime'; + +export type AsyncFunctionServer = DaprServer; + +/** + * Creates and configures an Dapr server and returns an HTTP server + * which will run it. + * @param userFunction User's function. + * @param functionSignatureType Type of user's function signature. + * @return HTTP server. + */ +export default function ( + userFunction: OpenFunction, + context: OpenFunctionContext +): AsyncFunctionServer { + const app = new DaprServer('localhost', context.port); + const ctx = getContextProxy(context); + + const wrapper = async (data: object) => { + await userFunction(ctx, data); + }; + + // Initialize the server with the user's function. + // For server interfaces, refer to https://github.com/dapr/js-sdk/blob/master/src/interfaces/Server/ + + // For each input in context, bind the user function according to the component type. + forEach(context.inputs, component => { + if (ContextUtils.IsBindingComponent(component)) { + app.binding.receive(component.componentName, wrapper); + } else if (ContextUtils.IsPubSubComponent(component)) { + app.pubsub.subscribe( + component.componentName, + component.uri || '', + wrapper + ); + } + }); + + return app; +} + +/** + * It creates a proxy for the runtime object, which delegates all property access to the runtime object + * @param {OpenFunctionContext} context - The context object to be proxied. + * @returns The proxy object. + */ +function getContextProxy(context: OpenFunctionContext): OpenFunctionRuntime { + // Get a proper runtime for the context + const runtime = OpenFunctionRuntime.Parse(context); + + // Create a proxy for the context + return new Proxy(runtime, { + get: (target, prop) => { + // Provide delegated property access of the context object + if (has(target.context, prop)) return get(target.context, prop); + // Otherwise, return the property of the runtime object + else return Reflect.get(target, prop); + }, + }); +} diff --git a/src/openfunction/dapr_binding_output_middleware.ts b/src/openfunction/dapr_binding_output_middleware.ts new file mode 100644 index 00000000..c8a19d52 --- /dev/null +++ b/src/openfunction/dapr_binding_output_middleware.ts @@ -0,0 +1,38 @@ +import {Request, Response} from 'express'; +import * as interceptor from 'express-interceptor'; + +import * as Debug from 'debug'; +import {isEmpty} from 'lodash'; + +import {OpenFunctionContext, ContextUtils} from './function_context'; +import {OpenFunctionRuntime} from './function_runtime'; + +const debug = Debug('ofn:middleware:dapr:binding'); + +/** + * The handler to invoke Dapr output binding before sending the response. + * @param req express request object + * @param res express response object + */ +const daprBindingOutputHandler = (req: Request, res: Response) => { + return { + isInterceptable: () => { + return ( + !isEmpty(res.locals.context?.outputs) && + ContextUtils.IsKnativeRuntime(res.locals.context as OpenFunctionContext) + ); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + intercept: (body: any, send: Function) => { + const context = res.locals.context; + const runtime = OpenFunctionRuntime.Parse(context); + + runtime.send(body).then(data => { + debug('🎩 Dapr results: %j', data); + send(body); + }); + }, + }; +}; + +export default interceptor(daprBindingOutputHandler); diff --git a/src/openfunction/decs.d.ts b/src/openfunction/decs.d.ts new file mode 100644 index 00000000..2b551564 --- /dev/null +++ b/src/openfunction/decs.d.ts @@ -0,0 +1 @@ +declare module 'express-interceptor'; diff --git a/src/openfunction/function_context.ts b/src/openfunction/function_context.ts new file mode 100644 index 00000000..847b48c0 --- /dev/null +++ b/src/openfunction/function_context.ts @@ -0,0 +1,123 @@ +/** + * The OpenFunction's serving context. + */ +export interface OpenFunctionContext { + /** + * The name of the context. + */ + name: string; + /** + * The version of the context. + */ + version: string; + /** + * The target runtime of the context, only available as "knative" and "async". + */ + runtime: RuntimeType[keyof RuntimeType]; + /** + * Optional port string of the server. + */ + port?: string; + /** + * Optional input binding object. + */ + inputs?: OpenFunctionBinding; + /** + * Optional output binding object. + */ + outputs?: OpenFunctionBinding; +} + +/** + * The binding interface of the context. + */ +export interface OpenFunctionBinding { + /** + * The hash map of the binding. + */ + [key: string]: OpenFunctionComponent; +} + +/** + * The component interface of the context. + */ +export interface OpenFunctionComponent { + /** + * The name of the component. + */ + componentName: string; + /** + * The type of the component. + */ + componentType: `${ComponentType.Binding | ComponentType.PubSub}.${string}`; + /** + * The uri of the component. + */ + uri?: string; + /** + * Optional operation of the component. + */ + operation?: string; + /** + * Optional metadata as hash map for the component. + */ + metadata?: {[key: string]: string}; +} + +export enum RuntimeType { + /** + * The Knative type. + */ + Knative = 'Knative', + /** + * The async type. + */ + Async = 'Async', +} + +export enum ComponentType { + /** + * The binding type. + */ + Binding = 'bindings', + /** + * The pubsub type. + */ + PubSub = 'pubsub', +} + +export class ContextUtils { + /** + * Returns true if the runtime is Knative. + * @param {OpenFunctionContext} context - The OpenFunctionContext object. + * @returns A boolean value. + */ + static IsKnativeRuntime(context: OpenFunctionContext): boolean { + return context?.runtime === RuntimeType.Knative; + } + /** + * Returns true if the runtime is Async. + * @param {OpenFunctionContext} context - The OpenFunctionContext object. + * @returns A boolean value. + */ + static IsAsyncRuntime(context: OpenFunctionContext): boolean { + return context?.runtime === RuntimeType.Async; + } + + /** + * Checks if the component is a binding component. + * @param {OpenFunctionComponent} component - The component to check. + * @returns A boolean value. + */ + static IsBindingComponent(component: OpenFunctionComponent): boolean { + return component?.componentType.split('.')[0] === ComponentType.Binding; + } + /** + * Checks if the component is a pubsub component. + * @param {OpenFunctionComponent} component - The component to check. + * @returns A boolean value. + */ + static IsPubSubComponent(component: OpenFunctionComponent): boolean { + return component?.componentType.split('.')[0] === ComponentType.PubSub; + } +} diff --git a/src/openfunction/function_runtime.ts b/src/openfunction/function_runtime.ts new file mode 100644 index 00000000..4c8a878e --- /dev/null +++ b/src/openfunction/function_runtime.ts @@ -0,0 +1,108 @@ +import {env} from 'process'; + +import {chain} from 'lodash'; +import {DaprClient, CommunicationProtocolEnum} from 'dapr-client'; + +import { + OpenFunctionComponent, + OpenFunctionContext, + ContextUtils, +} from './function_context'; + +/** + * The OpenFunction's serving runtime abstract class. + */ +export abstract class OpenFunctionRuntime { + /** + * The context of the OpenFunction. + */ + readonly context: OpenFunctionContext; + + /** + * Constructor of the OpenFunctionRuntime. + */ + constructor(context: OpenFunctionContext) { + this.context = context; + } + + /** + * Static method to parse the context and get runtime. + */ + static Parse(context: OpenFunctionContext): OpenFunctionRuntime { + return new DaprRuntime(context); + } + + /** + * Getter for the port of Dapr sidecar + */ + get sidecarPort() { + return { + HTTP: env.DAPR_HTTP_PORT || '3500', + GRRC: env.DAPR_GRPC_PORT || '50001', + }; + } + + /** + * The promise that send data to certain ouput binding. + */ + abstract send(data: object, output?: string): Promise; +} + +/** + * Dapr runtime class derived from OpenFunctionRuntime. + */ +class DaprRuntime extends OpenFunctionRuntime { + /** + * The Dapr client instance. + */ + private daprClient!: DaprClient; + + /** + * Constructor of the DaprRuntime. + */ + constructor(context: OpenFunctionContext) { + super(context); + + /** + * NOTE: GRPC is not well supported so far in Dapr Node.js SDK + * TODO: Should determine whether to use GRPC channel + */ + this.daprClient = new DaprClient( + undefined, + this.sidecarPort.HTTP, + CommunicationProtocolEnum.HTTP + ); + } + + /** + * Send data to the Dapr runtime (sidecar). + * @param {object} data - The data to send to the output. + * @param {string} [output] - The output to send the data to. + * @returns The promise of the actions being executed. + */ + send(data: object, output?: string): Promise { + const actions = chain(this.context.outputs) + .filter((v, k) => !output || k === output) + .map((component: OpenFunctionComponent) => { + if (ContextUtils.IsBindingComponent(component)) { + return this.daprClient.binding.send( + component.componentName, + component.operation || '', + data, + component.metadata + ); + } else if (ContextUtils.IsPubSubComponent(component)) { + return this.daprClient.pubsub.publish( + component.componentName, + component.uri || '', + data + ); + } + + return Promise.resolve(undefined); + }) + .value(); + + return Promise.allSettled(actions); + } +} diff --git a/src/options.ts b/src/options.ts index 63d0d762..c3611304 100644 --- a/src/options.ts +++ b/src/options.ts @@ -12,9 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as minimist from 'minimist'; import {resolve} from 'path'; + +import * as Debug from 'debug'; +import * as minimist from 'minimist'; + import {SignatureType, isValidSignatureType} from './types'; +import {OpenFunctionContext} from './openfunction/function_context'; + +const debug = Debug('common:options'); /** * Error thrown when an invalid option is provided. @@ -43,6 +49,10 @@ export interface FrameworkOptions { * The signature type of the client function. */ signatureType: SignatureType; + /** + * The context to use for the function when serving. + */ + context?: OpenFunctionContext; /** * Whether or not the --help CLI flag was provided. */ @@ -107,6 +117,23 @@ const SignatureOption = new ConfigurableOption( ); } ); +const FunctionContextOption = new ConfigurableOption( + 'context', + 'FUNC_CONTEXT', + undefined, + x => { + // Try to parse context string + debug('ℹ️ Context loaded: %s', x); + + try { + const context = JSON.parse(x); + return context as OpenFunctionContext; + } catch (e) { + debug('Failed to parse context: %s', e); + return undefined; + } + } +); export const helpText = `Example usage: functions-framework --target=helloWorld --port=8080 @@ -130,6 +157,7 @@ export const parseOptions = ( FunctionTargetOption.cliOption, SignatureOption.cliOption, SourceLocationOption.cliOption, + FunctionContextOption.cliOption, ], }); return { @@ -137,6 +165,7 @@ export const parseOptions = ( target: FunctionTargetOption.parse(argv, envVars), sourceLocation: SourceLocationOption.parse(argv, envVars), signatureType: SignatureOption.parse(argv, envVars), + context: FunctionContextOption.parse(argv, envVars), printHelp: cliArgs[2] === '-h' || cliArgs[2] === '--help', }; }; diff --git a/src/server.ts b/src/server.ts index a4faa250..d2f38225 100644 --- a/src/server.ts +++ b/src/server.ts @@ -24,6 +24,8 @@ import {cloudEventToBackgroundEventMiddleware} from './middleware/cloud_event_to import {backgroundEventToCloudEventMiddleware} from './middleware/background_event_to_cloud_event'; import {wrapUserFunction} from './function_wrappers'; +import daprBindingOutputMiddleware from './openfunction/dapr_binding_output_middleware'; + /** * Creates and configures an Express application and returns an HTTP server * which will run it. @@ -33,7 +35,8 @@ import {wrapUserFunction} from './function_wrappers'; */ export function getServer( userFunction: HandlerFunction, - functionSignatureType: SignatureType + functionSignatureType: SignatureType, + context?: object ): http.Server { // App to use for function executions. const app = express(); @@ -42,11 +45,17 @@ export function getServer( // Set request-specific values in the very first middleware. app.use('/*', (req, res, next) => { + // Set function context in app locals for the lifetime of the request. + res.locals.context = context || {}; + setLatestRes(res); res.locals.functionExecutionFinished = false; next(); }); + // Use OpenFunction middlewares + app.use(daprBindingOutputMiddleware); + /** * Retains a reference to the raw body buffer to allow access to the raw body * for things like request signature validation. This is used as the "verify" diff --git a/test/conformance/.env-cmdrc.js b/test/conformance/.env-cmdrc.js new file mode 100644 index 00000000..4e2d094f --- /dev/null +++ b/test/conformance/.env-cmdrc.js @@ -0,0 +1,34 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'test-knative', + version: '1.0.0', + runtime: 'Knative', + outputs: { + fs: { + componentName: 'local', + componentType: 'bindings.localstorage', + operation: 'list', + metadata: { + fileName: '.', + }, + }, + }, + }), + }, + async: { + FUNC_CONTEXT: JSON.stringify({ + name: 'test-async', + version: '1.0.0', + runtime: 'Async', + port: '8080', + inputs: { + cron: { + uri: 'cron_input', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + }, + }), + }, +}; diff --git a/test/conformance/function.js b/test/conformance/function.js index 0e7a46c0..77bff4a8 100644 --- a/test/conformance/function.js +++ b/test/conformance/function.js @@ -1,5 +1,8 @@ /* eslint-disable node/no-missing-require */ const fs = require('fs'); + +const debug = require('debug')('test:conformance'); + const functions = require('@openfunction/functions-framework'); const fileName = 'function_output.json'; @@ -41,8 +44,19 @@ function writeJson(content) { fs.writeFileSync(fileName, json); } +function tryKnative(req, res) { + debug('✅ Function should receive request: %o', req.body); + res.send(req.body); +} + +function tryAsync(ctx, data) { + debug('✅ Function should receive from "%o": %o', ctx.inputs, data); +} + module.exports = { writeHttp, writeCloudEvent, writeLegacyEvent, + tryKnative, + tryAsync, }; diff --git a/test/conformance/package.json b/test/conformance/package.json index a48ebda8..761fec54 100644 --- a/test/conformance/package.json +++ b/test/conformance/package.json @@ -1,8 +1,19 @@ { "dependencies": { - "@openfunction/functions-framework": "file:../../" + "@openfunction/functions-framework": "file:../../", + "concurrently": "file:../../node_modules/concurrently", + "debug": "file:../../node_modules/debug", + "env-cmd": "file:../../node_modules/env-cmd", + "wait-on": "file:../../node_modules/wait-on" }, "scripts": { - "start": "functions-framework" + "start": "functions-framework", + "knative": "concurrently npm:knative:run:* npm:knative:test", + "knative:run:func": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --target=tryKnative", + "knative:run:dapr": "dapr run -H 3500 -d ../data/components/http --log-level warn", + "knative:test": "wait-on tcp:3500 tcp:8080 && curl -s -d '{\"data\": \"hello\"}' -H 'Content-Type: application/json' localhost:8080", + "async": "concurrently npm:async:run:*", + "async:run:func": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e async functions-framework --target=tryAsync", + "async:run:dapr": "dapr run -H 3500 -p 8080 -d ../data/components/cron --log-level info" } } diff --git a/test/data/components/async/binding-cron.yaml b/test/data/components/async/binding-cron.yaml new file mode 100644 index 00000000..d80aba75 --- /dev/null +++ b/test/data/components/async/binding-cron.yaml @@ -0,0 +1,10 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: binding-cron +spec: + type: bindings.cron + version: v1 + metadata: + - name: schedule + value: "@every 5s" diff --git a/test/data/components/async/binding-localfs.yaml b/test/data/components/async/binding-localfs.yaml new file mode 100644 index 00000000..b6ba81bb --- /dev/null +++ b/test/data/components/async/binding-localfs.yaml @@ -0,0 +1,10 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: binding-localfs +spec: + type: bindings.localstorage + version: v1 + metadata: + - name: rootPath + value: . diff --git a/test/data/components/async/binding-mqtt.yaml b/test/data/components/async/binding-mqtt.yaml new file mode 100644 index 00000000..75d8b0a7 --- /dev/null +++ b/test/data/components/async/binding-mqtt.yaml @@ -0,0 +1,14 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: binding-mqtt +spec: + type: bindings.mqtt + version: v1 + metadata: + - name: consumerID + value: "{uuid}" + - name: url + value: "tcp://localhost:1883" + - name: topic + value: "default" \ No newline at end of file diff --git a/test/data/components/async/pubsub-mqtt.yaml b/test/data/components/async/pubsub-mqtt.yaml new file mode 100644 index 00000000..e50bb1bb --- /dev/null +++ b/test/data/components/async/pubsub-mqtt.yaml @@ -0,0 +1,12 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: pubsub-mqtt +spec: + type: pubsub.mqtt + version: v1 + metadata: + # - name: consumerID + # value: "{uuid}" + - name: url + value: "tcp://localhost:1883" \ No newline at end of file diff --git a/test/data/components/cron/binding-cron.yaml b/test/data/components/cron/binding-cron.yaml new file mode 100644 index 00000000..d80aba75 --- /dev/null +++ b/test/data/components/cron/binding-cron.yaml @@ -0,0 +1,10 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: binding-cron +spec: + type: bindings.cron + version: v1 + metadata: + - name: schedule + value: "@every 5s" diff --git a/test/data/components/http/localstorage.yaml b/test/data/components/http/localstorage.yaml new file mode 100644 index 00000000..d987d04d --- /dev/null +++ b/test/data/components/http/localstorage.yaml @@ -0,0 +1,10 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: local +spec: + type: bindings.localstorage + version: v1 + metadata: + - name: rootPath + value: . diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts new file mode 100644 index 00000000..7a155277 --- /dev/null +++ b/test/integration/async_server.ts @@ -0,0 +1,180 @@ +/* eslint-disable no-restricted-properties */ +import {deepStrictEqual, ifError, ok} from 'assert'; +import {createServer} from 'net'; + +import {get} from 'lodash'; +import * as shell from 'shelljs'; +import * as MQTT from 'aedes'; + +import {OpenFunctionContext} from '../../src/openfunction/function_context'; +import getAysncServer from '../../src/openfunction/async_server'; + +const TEST_CONTEXT: OpenFunctionContext = { + name: 'test-context', + version: '1.0.0', + runtime: 'Async', + port: '8080', + inputs: { + cron: { + uri: 'cron_input', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + mqtt_binding: { + uri: 'default', + componentName: 'binding-mqtt', + componentType: 'bindings.mqtt', + }, + mqtt_sub: { + uri: 'webup', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, + outputs: { + cron: { + uri: 'cron_output', + operation: 'delete', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + localfs: { + uri: 'localstorage', + operation: 'create', + componentName: 'binding-localfs', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'output-file.txt', + }, + }, + mqtt_pub: { + uri: 'webup_pub', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, +}; +const TEST_PAYLOAD = {data: 'hello world'}; + +describe('OpenFunction - Async - Binding', () => { + const APPID = 'async.dapr'; + const broker = MQTT.Server(); + + before(done => { + // Start simple plain MQTT server via aedes + const server = createServer(broker.handle); + server.listen(1883, () => { + // Try to run Dapr sidecar and listen for the async server + shell.exec( + `dapr run -H 3500 -G 50001 -p ${TEST_CONTEXT.port} -d ./test/data/components/async -a ${APPID} --log-level debug`, + { + silent: true, + async: true, + } + ); + done(); + }); + }); + + after(done => { + // Stop dapr sidecar process + shell.exec(`dapr stop ${APPID}`, { + silent: true, + }); + + broker.close(done); + }); + + it('stop cron after first trigger recived', done => { + const app = getAysncServer((ctx, data) => { + // Assert that user function receives data from input binding + ok(data); + + // Assert that context data was passed through + deepStrictEqual(get(ctx, 'runtime'), TEST_CONTEXT.runtime); + deepStrictEqual( + get(ctx, 'inputs.cron.uri'), + TEST_CONTEXT.inputs!.cron.uri + ); + + // Then stop the cron scheduler + ctx.send({}, 'cron').then(() => app.stop().finally(done)); + }, TEST_CONTEXT); + + app.start(); + }); + + it('mqtt binding w/ file output', done => { + const app = getAysncServer((ctx, data) => { + // Assert that user function receives correct data from input binding + deepStrictEqual(data, TEST_PAYLOAD); + + // Then write recived data to a local file + ctx.send(data, 'localfs').then(() => { + const file = TEST_CONTEXT.outputs!.localfs.metadata!.fileName; + // Assert that the file is created + deepStrictEqual(shell.ls(file).code, 0); + + shell.rm(file); + app.stop().finally(done); + }); + }, TEST_CONTEXT); + + // First, we start the async server + app.start().then(() => { + // Then, we send a message to the async server + broker.publish( + { + cmd: 'publish', + topic: 'default', + payload: JSON.stringify(TEST_PAYLOAD), + qos: 1, + retain: false, + dup: false, + }, + err => ifError(err) + ); + }); + }); + + it('mqtt sub w/ pub output', done => { + const app = getAysncServer((ctx, data) => { + // Assert that user function receives correct data from input binding + try { + const recieved = JSON.parse(data as string); + deepStrictEqual(recieved, TEST_PAYLOAD); + } catch (err) { + ifError(err); + } + + // Then write recived data to a local file + const output = 'mqtt_pub'; + broker.subscribe( + get(TEST_CONTEXT, `outputs.${output}.uri`), + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (packet, _) => { + const payload = JSON.parse(Buffer.from(packet.payload).toString()); + deepStrictEqual(payload.data, TEST_PAYLOAD); + app.stop().finally(done); + }, + () => { + ctx.send(TEST_PAYLOAD, output); + } + ); + }, TEST_CONTEXT); + + // First, we start the async server + app.start().then(() => { + // Then, we publish a message via Dapr CLI + const formatted = JSON.stringify(TEST_PAYLOAD).replace(/"/g, '\\"'); + shell.exec( + `dapr publish -i ${APPID} -p ${ + TEST_CONTEXT.inputs!.mqtt_sub!.componentName + } -t ${TEST_CONTEXT.inputs!.mqtt_sub.uri} -d '"${formatted}"'`, + { + silent: true, + } + ); + }); + }); +}); diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts new file mode 100644 index 00000000..feb5dc43 --- /dev/null +++ b/test/integration/http_binding.ts @@ -0,0 +1,104 @@ +import {deepStrictEqual} from 'assert'; + +import * as sinon from 'sinon'; +import * as supertest from 'supertest'; +import * as shell from 'shelljs'; +import {Request, Response} from 'express'; +import {cloneDeep, forEach, set} from 'lodash'; + +import {getServer} from '../../src/server'; +import {OpenFunctionContext} from '../../src/openfunction/function_context'; + +const TEST_CONTEXT: OpenFunctionContext = { + name: 'test-context', + version: '1.0.0', + runtime: 'Knative', + outputs: { + file1: { + componentName: 'local', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'my-file1.txt', + }, + }, + file2: { + componentName: 'local', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'my-file2.txt', + }, + }, + }, +}; +const TEST_PAYLOAD = {echo: 'hello world'}; + +describe('OpenFunction - HTTP Binding', () => { + const APPID = 'http.dapr'; + + before(done => { + if (shell.exec('dapr', {silent: true}).code !== 0) + throw new Error('Please ensure "dapr" is installed'); + + // Try to run Dapr sidecar on port 3500 with components for testing + shell.exec( + `dapr run -H 3500 -G 50001 -d ./test/data/components/http -a ${APPID}`, + { + silent: true, + async: true, + } + ); + + // Wait 5 seconds for dapr sidecar to start + setTimeout(done, 5000); + }); + + after(() => { + // Stop dapr sidecar process + shell.exec(`dapr stop ${APPID}`, { + silent: true, + }); + }); + + beforeEach(() => { + // Prevent log spew from the PubSub emulator request. + sinon.stub(console, 'error'); + }); + afterEach(() => { + (console.error as sinon.SinonSpy).restore(); + }); + + const testData = [ + {name: 'Save data', operation: 'create', listable: true}, + {name: 'Get data', operation: 'get', listable: true}, + {name: 'Delete data', operation: 'delete', listable: false}, + ]; + + testData.forEach(test => { + it(test.name, async () => { + const context = cloneDeep(TEST_CONTEXT); + forEach(context.outputs, output => + set(output, 'operation', test.operation) + ); + + const server = getServer( + (req: Request, res: Response) => { + res.status(200).json(TEST_PAYLOAD); + }, + 'http', + context + ); + + await supertest(server) + .get('/') + .expect(200) + .expect(res => { + deepStrictEqual(res.body, TEST_PAYLOAD); + }); + + forEach(context.outputs, output => { + const listable = shell.ls(output.metadata!.fileName).code === 0; + deepStrictEqual(listable, test.listable); + }); + }); + }); +}); diff --git a/test/options.ts b/test/options.ts index d0a1a887..f7cf727a 100644 --- a/test/options.ts +++ b/test/options.ts @@ -82,12 +82,15 @@ describe('parseOptions', () => { FUNCTION_TARGET: 'helloWorld', FUNCTION_SIGNATURE_TYPE: 'cloudevent', FUNCTION_SOURCE: '/source', + FUNC_CONTEXT: + '{ "name": "foo", "version": "1.0.0", "runtime": "Knative" }', }, expectedOptions: { port: '1234', target: 'helloWorld', sourceLocation: resolve('/source'), signatureType: 'cloudevent', + context: {name: 'foo', version: '1.0.0', runtime: 'Knative'}, printHelp: false, }, }, @@ -102,18 +105,23 @@ describe('parseOptions', () => { '--signature-type', 'cloudevent', '--source=/source', + '--context', + '{ "name": "foo", "version": "1.0.0", "runtime": "Knative" }', ], envVars: { PORT: '4567', FUNCTION_TARGET: 'fooBar', FUNCTION_SIGNATURE_TYPE: 'event', FUNCTION_SOURCE: '/somewhere/else', + FUNC_CONTEXT: + '{ "name": "foo", "version": "1.0.0", "runtime": "Async" }', }, expectedOptions: { port: '1234', target: 'helloWorld', sourceLocation: resolve('/source'), signatureType: 'cloudevent', + context: {name: 'foo', version: '1.0.0', runtime: 'Knative'}, printHelp: false, }, }, From a8d551a018d3bf6e41192749bcf9d052da7afa09 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 3 Apr 2022 13:43:30 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E2=9E=96=20chore:=20remove=20self=20dep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 42 ++---------------------------------------- package.json | 1 - 2 files changed, 2 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 73183c1c..ec18af68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,14 @@ { "name": "@openfunction/functions-framework", - "version": "0.3.6", + "version": "0.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@openfunction/functions-framework", - "version": "0.3.6", + "version": "0.4.0", "license": "Apache-2.0", "dependencies": { - "@openfunction/functions-framework": "0.3.6", "body-parser": "^1.18.3", "cloudevents": "^5.3.2", "dapr-client": "^2.1.0", @@ -312,28 +311,6 @@ "node": ">= 8" } }, - "node_modules/@openfunction/functions-framework": { - "version": "0.3.6", - "resolved": "https://registry.npmmirror.com/@openfunction/functions-framework/-/functions-framework-0.3.6.tgz", - "integrity": "sha512-V8ONTJHkLzgyCQSQsNNJi0N4i0cwkF0C1OAZi0RKMWxakCfcYTg6IbtOvFbYmNhQG1xk1BHOJEDIRHW5WXzsCw==", - "dependencies": { - "@openfunction/functions-framework": "0.3.6", - "body-parser": "^1.18.3", - "cloudevents": "^5.3.2", - "express": "^4.16.4", - "minimist": "^1.2.5", - "on-finished": "^2.3.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.5" - }, - "bin": { - "functions-framework": "build/src/main.js", - "functions-framework-nodejs": "build/src/main.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -7615,21 +7592,6 @@ "fastq": "^1.6.0" } }, - "@openfunction/functions-framework": { - "version": "0.3.6", - "resolved": "https://registry.npmmirror.com/@openfunction/functions-framework/-/functions-framework-0.3.6.tgz", - "integrity": "sha512-V8ONTJHkLzgyCQSQsNNJi0N4i0cwkF0C1OAZi0RKMWxakCfcYTg6IbtOvFbYmNhQG1xk1BHOJEDIRHW5WXzsCw==", - "requires": { - "@openfunction/functions-framework": "0.3.6", - "body-parser": "^1.18.3", - "cloudevents": "^5.3.2", - "express": "^4.16.4", - "minimist": "^1.2.5", - "on-finished": "^2.3.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.5" - } - }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", diff --git a/package.json b/package.json index 7f1f319f..f4467455 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "./testing": "./build/src/testing.js" }, "dependencies": { - "@openfunction/functions-framework": "0.3.6", "body-parser": "^1.18.3", "cloudevents": "^5.3.2", "dapr-client": "^2.1.0", From 56a04f0f06b442140dc7af3bc16d4284d302b266 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 3 Apr 2022 13:51:46 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=8E=A8=20cosm:=20code=20style=20and?= =?UTF-8?q?=20comment=20polish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/openfunction/function_context.ts | 6 +++--- src/openfunction/function_runtime.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/openfunction/function_context.ts b/src/openfunction/function_context.ts index 847b48c0..34d29a26 100644 --- a/src/openfunction/function_context.ts +++ b/src/openfunction/function_context.ts @@ -11,9 +11,9 @@ export interface OpenFunctionContext { */ version: string; /** - * The target runtime of the context, only available as "knative" and "async". + * The target runtime of the context. */ - runtime: RuntimeType[keyof RuntimeType]; + runtime: keyof typeof RuntimeType; /** * Optional port string of the server. */ @@ -49,7 +49,7 @@ export interface OpenFunctionComponent { /** * The type of the component. */ - componentType: `${ComponentType.Binding | ComponentType.PubSub}.${string}`; + componentType: `${ComponentType}.${string}`; /** * The uri of the component. */ diff --git a/src/openfunction/function_runtime.ts b/src/openfunction/function_runtime.ts index 4c8a878e..c5746983 100644 --- a/src/openfunction/function_runtime.ts +++ b/src/openfunction/function_runtime.ts @@ -43,7 +43,7 @@ export abstract class OpenFunctionRuntime { } /** - * The promise that send data to certain ouput binding. + * The promise that send data to certain ouput binding or pubsub topic. */ abstract send(data: object, output?: string): Promise; } From 8d8dcbe9217715ee6addde921e50fb1c24aae400 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 8 Apr 2022 22:38:23 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=F0=9F=8E=A8=20cosm:=20refine=20the=20namin?= =?UTF-8?q?g=20of=20dapr=20output=20middleware?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...binding_output_middleware.ts => dapr_output_middleware.ts} | 4 ++-- src/server.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/openfunction/{dapr_binding_output_middleware.ts => dapr_output_middleware.ts} (89%) diff --git a/src/openfunction/dapr_binding_output_middleware.ts b/src/openfunction/dapr_output_middleware.ts similarity index 89% rename from src/openfunction/dapr_binding_output_middleware.ts rename to src/openfunction/dapr_output_middleware.ts index c8a19d52..478d6392 100644 --- a/src/openfunction/dapr_binding_output_middleware.ts +++ b/src/openfunction/dapr_output_middleware.ts @@ -14,7 +14,7 @@ const debug = Debug('ofn:middleware:dapr:binding'); * @param req express request object * @param res express response object */ -const daprBindingOutputHandler = (req: Request, res: Response) => { +const daprOutputHandler = (req: Request, res: Response) => { return { isInterceptable: () => { return ( @@ -35,4 +35,4 @@ const daprBindingOutputHandler = (req: Request, res: Response) => { }; }; -export default interceptor(daprBindingOutputHandler); +export default interceptor(daprOutputHandler); diff --git a/src/server.ts b/src/server.ts index d2f38225..5b762339 100644 --- a/src/server.ts +++ b/src/server.ts @@ -24,7 +24,7 @@ import {cloudEventToBackgroundEventMiddleware} from './middleware/cloud_event_to import {backgroundEventToCloudEventMiddleware} from './middleware/background_event_to_cloud_event'; import {wrapUserFunction} from './function_wrappers'; -import daprBindingOutputMiddleware from './openfunction/dapr_binding_output_middleware'; +import daprOutputMiddleware from './openfunction/dapr_output_middleware'; /** * Creates and configures an Express application and returns an HTTP server @@ -54,7 +54,7 @@ export function getServer( }); // Use OpenFunction middlewares - app.use(daprBindingOutputMiddleware); + app.use(daprOutputMiddleware); /** * Retains a reference to the raw body buffer to allow access to the raw body From 939925cb5d4b69b7497f5cbfb1f72377a0f3803e Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 10 Apr 2022 17:41:20 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=F0=9F=94=A8=20dep:=20require=20node=20engi?= =?UTF-8?q?ne=20>=3D=2013?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4467455..ac679d7c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.4.0", "description": "FaaS (Function as a service) framework for writing portable Node.js functions", "engines": { - "node": ">=10.0.0" + "node": ">=13.0.0" }, "repository": "openfunction/functions-framework-nodejs", "main": "build/src/index.js", From e5be7b8d0b0cde9088dd5198c5c6704f34364a8f Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 10 Apr 2022 17:44:46 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=F0=9F=93=9D=20docs(api):=20update=20api-ex?= =?UTF-8?q?tractor=20generated=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generated/api.json | 848 ++++++++++++++++++++++++++- docs/generated/api.md | 56 +- package.json | 2 +- src/functions.ts | 4 + src/index.ts | 5 + src/openfunction/function_context.ts | 23 +- 6 files changed, 901 insertions(+), 37 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index a653f7e5..3f71fb9c 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -503,6 +503,63 @@ ], "extendsTokenRanges": [] }, + { + "kind": "Enum", + "canonicalReference": "@openfunction/functions-framework!ComponentType:enum", + "docComment": "/**\n * Defining component type enumeration.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare enum ComponentType " + } + ], + "releaseTag": "Public", + "name": "ComponentType", + "members": [ + { + "kind": "EnumMember", + "canonicalReference": "@openfunction/functions-framework!ComponentType.Binding:member", + "docComment": "/**\n * The binding type.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "Binding = " + }, + { + "kind": "Content", + "text": "\"bindings\"" + } + ], + "releaseTag": "Public", + "name": "Binding", + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "EnumMember", + "canonicalReference": "@openfunction/functions-framework!ComponentType.PubSub:member", + "docComment": "/**\n * The pubsub type.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "PubSub = " + }, + { + "kind": "Content", + "text": "\"pubsub\"" + } + ], + "releaseTag": "Public", + "name": "PubSub", + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ] + }, { "kind": "TypeAlias", "canonicalReference": "@openfunction/functions-framework!Context:type", @@ -542,6 +599,206 @@ "endIndex": 5 } }, + { + "kind": "Class", + "canonicalReference": "@openfunction/functions-framework!ContextUtils:class", + "docComment": "/**\n * Provides a set of methods to help determine types used in FunctionContext.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare class ContextUtils " + } + ], + "releaseTag": "Public", + "name": "ContextUtils", + "members": [ + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!ContextUtils.IsAsyncRuntime:member(1)", + "docComment": "/**\n * Returns true if the runtime is Async.\n *\n * @param context - The OpenFunctionContext object.\n *\n * @returns A boolean value.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static IsAsyncRuntime(context: " + }, + { + "kind": "Reference", + "text": "OpenFunctionContext", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "boolean" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "isStatic": true, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "context", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "name": "IsAsyncRuntime" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!ContextUtils.IsBindingComponent:member(1)", + "docComment": "/**\n * Checks if the component is a binding component.\n *\n * @param component - The component to check.\n *\n * @returns A boolean value.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static IsBindingComponent(component: " + }, + { + "kind": "Reference", + "text": "OpenFunctionComponent", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "boolean" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "isStatic": true, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "component", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "name": "IsBindingComponent" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!ContextUtils.IsKnativeRuntime:member(1)", + "docComment": "/**\n * Returns true if the runtime is Knative.\n *\n * @param context - The OpenFunctionContext object.\n *\n * @returns A boolean value.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static IsKnativeRuntime(context: " + }, + { + "kind": "Reference", + "text": "OpenFunctionContext", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "boolean" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "isStatic": true, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "context", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "name": "IsKnativeRuntime" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!ContextUtils.IsPubSubComponent:member(1)", + "docComment": "/**\n * Checks if the component is a pubsub component.\n *\n * @param component - The component to check.\n *\n * @returns A boolean value.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static IsPubSubComponent(component: " + }, + { + "kind": "Reference", + "text": "OpenFunctionComponent", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "boolean" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "isStatic": true, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "component", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "name": "IsPubSubComponent" + } + ], + "implementsTokenRanges": [] + }, { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!Data:interface", @@ -808,7 +1065,12 @@ }, { "kind": "Content", - "text": "" + "text": " | " + }, + { + "kind": "Reference", + "text": "OpenFunction", + "canonicalReference": "@openfunction/functions-framework!OpenFunction:interface" }, { "kind": "Content", @@ -832,7 +1094,7 @@ ], "typeTokenRange": { "startIndex": 3, - "endIndex": 13 + "endIndex": 14 } }, { @@ -1046,58 +1308,582 @@ }, { "kind": "Interface", - "canonicalReference": "@openfunction/functions-framework!Request_2:interface", - "docComment": "/**\n * @public\n */\n", + "canonicalReference": "@openfunction/functions-framework!OpenFunction:interface", + "docComment": "/**\n * A OpenFunction async function handler.\n *\n * @public\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "export interface Request extends " - }, - { - "kind": "Reference", - "text": "ExpressRequest", - "canonicalReference": "@types/express!~e.Request:interface" - }, - { - "kind": "Content", - "text": " " + "text": "export interface OpenFunction " } ], "releaseTag": "Public", - "name": "Request_2", + "name": "OpenFunction", "members": [ { - "kind": "PropertySignature", - "canonicalReference": "@openfunction/functions-framework!Request_2#rawBody:member", - "docComment": "/**\n * A buffer which provides access to the request's raw HTTP body.\n */\n", + "kind": "CallSignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunction:call(1)", + "docComment": "", "excerptTokens": [ { "kind": "Content", - "text": "rawBody?: " + "text": "(ctx: " }, { "kind": "Reference", - "text": "Buffer", - "canonicalReference": "!Buffer:class" + "text": "OpenFunctionRuntime", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class" + }, + { + "kind": "Content", + "text": ", data: " + }, + { + "kind": "Content", + "text": "{}" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "any" }, { "kind": "Content", "text": ";" } ], - "isOptional": true, + "returnTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, "releaseTag": "Public", - "name": "rawBody", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "ctx", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "parameterName": "data", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + } + } + ] } ], - "extendsTokenRanges": [ - { - "startIndex": 1, - "endIndex": 3 + "extendsTokenRanges": [] + }, + { + "kind": "Interface", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:interface", + "docComment": "/**\n * The binding interface of the context.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export interface OpenFunctionBinding " + } + ], + "releaseTag": "Public", + "name": "OpenFunctionBinding", + "members": [ + { + "kind": "IndexSignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:index(1)", + "docComment": "/**\n * The hash map of the binding.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "[key: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": "]: " + }, + { + "kind": "Reference", + "text": "OpenFunctionComponent", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "key", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ] + } + ], + "extendsTokenRanges": [] + }, + { + "kind": "Interface", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent:interface", + "docComment": "/**\n * The component interface of the context.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export interface OpenFunctionComponent " + } + ], + "releaseTag": "Public", + "name": "OpenFunctionComponent", + "members": [ + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent#componentName:member", + "docComment": "/**\n * The name of the component.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "componentName: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "releaseTag": "Public", + "name": "componentName", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent#componentType:member", + "docComment": "/**\n * The type of the component.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "componentType: " + }, + { + "kind": "Content", + "text": "`${" + }, + { + "kind": "Reference", + "text": "ComponentType", + "canonicalReference": "@openfunction/functions-framework!ComponentType:enum" + }, + { + "kind": "Content", + "text": "}.${string}`" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "releaseTag": "Public", + "name": "componentType", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent#metadata:member", + "docComment": "/**\n * Optional metadata as hash map for the component.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "metadata?: " + }, + { + "kind": "Content", + "text": "{\n [key: string]: string;\n }" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "metadata", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent#operation:member", + "docComment": "/**\n * Optional operation of the component.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "operation?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "operation", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent#uri:member", + "docComment": "/**\n * The uri of the component.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "uri?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "uri", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "extendsTokenRanges": [] + }, + { + "kind": "Interface", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext:interface", + "docComment": "/**\n * The OpenFunction's serving context.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export interface OpenFunctionContext " + } + ], + "releaseTag": "Public", + "name": "OpenFunctionContext", + "members": [ + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#inputs:member", + "docComment": "/**\n * Optional input binding object.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "inputs?: " + }, + { + "kind": "Reference", + "text": "OpenFunctionBinding", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "inputs", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#name:member", + "docComment": "/**\n * The name of the context.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "name: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "releaseTag": "Public", + "name": "name", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#outputs:member", + "docComment": "/**\n * Optional output binding object.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "outputs?: " + }, + { + "kind": "Reference", + "text": "OpenFunctionBinding", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "outputs", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#port:member", + "docComment": "/**\n * Optional port string of the server.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "port?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "port", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#runtime:member", + "docComment": "/**\n * The target runtime of the context.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "runtime: " + }, + { + "kind": "Content", + "text": "keyof typeof " + }, + { + "kind": "Reference", + "text": "RuntimeType", + "canonicalReference": "@openfunction/functions-framework!RuntimeType:enum" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "releaseTag": "Public", + "name": "runtime", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 3 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#version:member", + "docComment": "/**\n * The version of the context.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "version: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "releaseTag": "Public", + "name": "version", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "extendsTokenRanges": [] + }, + { + "kind": "Interface", + "canonicalReference": "@openfunction/functions-framework!Request_2:interface", + "docComment": "/**\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export interface Request extends " + }, + { + "kind": "Reference", + "text": "ExpressRequest", + "canonicalReference": "@types/express!~e.Request:interface" + }, + { + "kind": "Content", + "text": " " + } + ], + "releaseTag": "Public", + "name": "Request_2", + "members": [ + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!Request_2#rawBody:member", + "docComment": "/**\n * A buffer which provides access to the request's raw HTTP body.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "rawBody?: " + }, + { + "kind": "Reference", + "text": "Buffer", + "canonicalReference": "!Buffer:class" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "rawBody", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "extendsTokenRanges": [ + { + "startIndex": 1, + "endIndex": 3 + } + ] + }, + { + "kind": "Enum", + "canonicalReference": "@openfunction/functions-framework!RuntimeType:enum", + "docComment": "/**\n * Defining runtime type enumeration.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare enum RuntimeType " + } + ], + "releaseTag": "Public", + "name": "RuntimeType", + "members": [ + { + "kind": "EnumMember", + "canonicalReference": "@openfunction/functions-framework!RuntimeType.Async:member", + "docComment": "/**\n * The async type.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "Async = " + }, + { + "kind": "Content", + "text": "\"Async\"" + } + ], + "releaseTag": "Public", + "name": "Async", + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "EnumMember", + "canonicalReference": "@openfunction/functions-framework!RuntimeType.Knative:member", + "docComment": "/**\n * The Knative type.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "Knative = " + }, + { + "kind": "Content", + "text": "\"Knative\"" + } + ], + "releaseTag": "Public", + "name": "Knative", + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + } } ] } diff --git a/docs/generated/api.md b/docs/generated/api.md index caae47d1..be597ab1 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -37,9 +37,23 @@ export interface CloudFunctionsContext { timestamp?: string; } +// @public +export enum ComponentType { + Binding = "bindings", + PubSub = "pubsub" +} + // @public export type Context = CloudFunctionsContext | CloudEvent; +// @public +export class ContextUtils { + static IsAsyncRuntime(context: OpenFunctionContext): boolean; + static IsBindingComponent(component: OpenFunctionComponent): boolean; + static IsKnativeRuntime(context: OpenFunctionContext): boolean; + static IsPubSubComponent(component: OpenFunctionComponent): boolean; +} + // @public export interface Data { // (undocumented) @@ -59,7 +73,7 @@ export interface EventFunctionWithCallback { } // @public -export type HandlerFunction = HttpFunction | EventFunction | EventFunctionWithCallback | CloudEventFunction | CloudEventFunctionWithCallback; +export type HandlerFunction = HttpFunction | EventFunction | EventFunctionWithCallback | CloudEventFunction | CloudEventFunctionWithCallback | OpenFunction; // @public export const http: (functionName: string, handler: HttpFunction) => void; @@ -83,6 +97,40 @@ export interface LegacyEvent { }; } +// @public +export interface OpenFunction { + // Warning: (ae-forgotten-export) The symbol "OpenFunctionRuntime" needs to be exported by the entry point index.d.ts + // + // (undocumented) + (ctx: OpenFunctionRuntime, data: {}): any; +} + +// @public +export interface OpenFunctionBinding { + [key: string]: OpenFunctionComponent; +} + +// @public +export interface OpenFunctionComponent { + componentName: string; + componentType: `${ComponentType}.${string}`; + metadata?: { + [key: string]: string; + }; + operation?: string; + uri?: string; +} + +// @public +export interface OpenFunctionContext { + inputs?: OpenFunctionBinding; + name: string; + outputs?: OpenFunctionBinding; + port?: string; + runtime: keyof typeof RuntimeType; + version: string; +} + // @public (undocumented) interface Request_2 extends Request_3 { rawBody?: Buffer; @@ -91,6 +139,12 @@ export { Request_2 as Request } export { Response_2 as Response } +// @public +export enum RuntimeType { + Async = "Async", + Knative = "Knative" +} + // (No @packageDocumentation comment for this package) ``` diff --git a/package.json b/package.json index ac679d7c..a61f2325 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "clean": "gts clean", "compile": "tsc -p .", "fix": "gts fix", - "docs": "api-extractor run --local --verbose", + "docs": "npm run compile && api-extractor run --local --verbose", "watch": "npm run compile -- --watch", "prepare": "npm run build", "pretest": "npm run compile" diff --git a/src/functions.ts b/src/functions.ts index a40cac7d..49a1a5ce 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -77,6 +77,10 @@ export interface CloudEventFunctionWithCallback { (cloudEvent: CloudEvent, callback: Function): any; } +/** + * A OpenFunction async function handler. + * @public + */ export interface OpenFunction { (ctx: OpenFunctionRuntime, data: {}): any; } diff --git a/src/index.ts b/src/index.ts index 9c804b63..84d159f3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,3 +21,8 @@ export * from './functions'; * @public */ export {http, cloudEvent} from './function_registry'; + +/** + * @public + */ +export * from './openfunction/function_context'; diff --git a/src/openfunction/function_context.ts b/src/openfunction/function_context.ts index 34d29a26..fb0779ec 100644 --- a/src/openfunction/function_context.ts +++ b/src/openfunction/function_context.ts @@ -1,5 +1,6 @@ /** * The OpenFunction's serving context. + * @public */ export interface OpenFunctionContext { /** @@ -30,6 +31,7 @@ export interface OpenFunctionContext { /** * The binding interface of the context. + * @public */ export interface OpenFunctionBinding { /** @@ -40,6 +42,7 @@ export interface OpenFunctionBinding { /** * The component interface of the context. + * @public */ export interface OpenFunctionComponent { /** @@ -64,6 +67,10 @@ export interface OpenFunctionComponent { metadata?: {[key: string]: string}; } +/** + * Defining runtime type enumeration. + * @public + */ export enum RuntimeType { /** * The Knative type. @@ -75,6 +82,10 @@ export enum RuntimeType { Async = 'Async', } +/** + * Defining component type enumeration. + * @public + */ export enum ComponentType { /** * The binding type. @@ -86,10 +97,14 @@ export enum ComponentType { PubSub = 'pubsub', } +/** + * Provides a set of methods to help determine types used in FunctionContext. + * @public + */ export class ContextUtils { /** * Returns true if the runtime is Knative. - * @param {OpenFunctionContext} context - The OpenFunctionContext object. + * @param context - The OpenFunctionContext object. * @returns A boolean value. */ static IsKnativeRuntime(context: OpenFunctionContext): boolean { @@ -97,7 +112,7 @@ export class ContextUtils { } /** * Returns true if the runtime is Async. - * @param {OpenFunctionContext} context - The OpenFunctionContext object. + * @param context - The OpenFunctionContext object. * @returns A boolean value. */ static IsAsyncRuntime(context: OpenFunctionContext): boolean { @@ -106,7 +121,7 @@ export class ContextUtils { /** * Checks if the component is a binding component. - * @param {OpenFunctionComponent} component - The component to check. + * @param component - The component to check. * @returns A boolean value. */ static IsBindingComponent(component: OpenFunctionComponent): boolean { @@ -114,7 +129,7 @@ export class ContextUtils { } /** * Checks if the component is a pubsub component. - * @param {OpenFunctionComponent} component - The component to check. + * @param component - The component to check. * @returns A boolean value. */ static IsPubSubComponent(component: OpenFunctionComponent): boolean { From b2373e07288ac53a125369c272598facaa5887a0 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 10 Apr 2022 17:48:33 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=F0=9F=93=9D=20docs(README):=20refine=20som?= =?UTF-8?q?e=20feature=20descriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 115 +++++++++++++++++++++--------------------------------- 1 file changed, 44 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index d1475269..45288287 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,19 @@ > This is OpenFunction's nodejs functions-framework forked from [GCP functions-framework-nodejs](https://github.com/GoogleCloudPlatform/functions-framework-nodejs) An open source FaaS (Function as a Service) framework based on [Express](https://expressjs.com/) -for writing portable Node.js functions + and [Restana](https://github.com/BackendStack21/restana) for writing portable sync and async Node.js functions. The Functions Framework lets you write lightweight functions that run in many different environments, including: -* [Google Cloud Functions](https://cloud.google.com/functions/) -* Your local development machine -* [Cloud Run](https://cloud.google.com/run/) and [Cloud Run for Anthos](https://cloud.google.com/anthos/run) +* [OpenFunction](https://github.com/OpenFunction/OpenFunction) * [Knative](https://github.com/knative/)-based environments * [Dapr](https://dapr.io/)-based environments -* [OpenFunction](https://github.com/OpenFunction/OpenFunction) +* [Google Cloud Functions](https://cloud.google.com/functions/) +* [Cloud Run](https://cloud.google.com/run/) and [Cloud Run for Anthos](https://cloud.google.com/anthos/run) +* Your local development machine -The framework allows you to go from: +Generally speaking, the framework allows you to go from: ```js /** @@ -39,8 +39,7 @@ curl http://my-url # Output: Hello, World! ``` -All without needing to worry about writing an HTTP server or complicated request -handling logic. +All without needing to worry about writing an HTTP server or complicated request handling logic. > Watch [this video](https://youtu.be/yMEcyAkTliU?t=912) to learn more about the Node Functions Framework. @@ -48,8 +47,8 @@ handling logic. * Spin up a local development server for quick testing * Invoke a function in response to a request -* Automatically unmarshal events conforming to the - [CloudEvents](https://cloudevents.io/) spec +* Listen and respond to the events bridged from Dapr system +* Automatically unmarshal events conforming to the [CloudEvents](https://cloudevents.io/) spec * Portable between serverless platforms ## Installation @@ -62,7 +61,7 @@ npm install @openfunction/functions-framework ## Quickstarts -### Quickstart: Hello, World on your local machine +### Quickstart: "Hello, World" on your local machine 1. Create an `index.js` file with the following contents: @@ -118,6 +117,7 @@ command-line arguments: ... Serving function... Function: helloWorld + Signature type: http URL: http://localhost:8080/ ``` @@ -130,9 +130,9 @@ command-line arguments: ### Quickstart: Build a Deployable Container -1. Install [Docker](https://store.docker.com/search?type=edition&offering=community) and the [`pack` tool](https://buildpacks.io/docs/install-pack/). +1. Install [Docker](https://store.docker.com/search?type=edition&offering=community) and the [pack](https://buildpacks.io/docs/install-pack/) tool. -1. Build a container from your function using the Functions [buildpacks](https://github.com/GoogleCloudPlatform/buildpacks): +2. Build a container from your function using the [Cloud Native Buildpacks](https://buildpacks.io/): ```sh pack build \ @@ -142,44 +142,22 @@ command-line arguments: my-first-function ``` -1. Start the built container: +3. Start the built function container: ```sh - docker run --rm -p 8080:8080 my-first-function + docker run --rm -p 8080:8080 -e NODE_ENV=dev my-first-function # Output: Serving function... ``` -1. Send requests to this function using `curl` from another terminal window: + > NOTICE: `-e NODE_ENV=dev` is required to display "Serving function...", and you can also append `-e DEBUG=*` to display Express internal debug messages. + +4. Send requests to this function using `curl` from another terminal window: ```sh curl localhost:8080 # Output: Hello, World! ``` -## Run your function on serverless platforms - -### Google Cloud Functions - -The -[Node.js 10 runtime on Google Cloud Functions](https://cloud.google.com/functions/docs/concepts/nodejs-10-runtime) -is based on the Functions Framework. On Cloud Functions, the Functions Framework -is completely optional: if you don't add it to your `package.json`, it will be -installed automatically. - -After you've written your function, you can simply deploy it from your local -machine using the `gcloud` command-line tool. -[Check out the Cloud Functions quickstart](https://cloud.google.com/functions/docs/quickstart). - -### Cloud Run / Cloud Run for Anthos - -After you've written your function, added the Functions Framework and updated your `start` script in `package.json`, deploy it to Cloud Run with `gcloud run deploy`. Check out the [Cloud Run quickstart for Node.js](https://cloud.google.com/run/docs/quickstarts/build-and-deploy/nodejs). - -If you want even more control over the environment, you can [deploy to Cloud Run for Anthos](https://cloud.google.com/anthos/run/docs/quickstarts/prebuilt-deploy-gke). With Cloud Run for Anthos, you can run your function on a GKE cluster, which gives you additional control over the environment (including use of GPU-based instances, longer timeouts and more). - -### Container environments based on Knative - -Cloud Run and Cloud Run for Anthos both implement the [Knative Serving API](https://www.knative.dev/docs/). The Functions Framework is designed to be compatible with Knative environments. Just build and deploy your container to a Knative environment. - ## Configure the Functions Framework You can configure the Functions Framework using command-line flags or @@ -202,34 +180,39 @@ For example: } ``` -## Enable Google Cloud Functions Events +## Run your function on Serverless platforms -The Functions Framework can unmarshall incoming -Google Cloud Functions [event](https://cloud.google.com/functions/docs/concepts/events-triggers#events) payloads to `data` and `context` objects. -These will be passed as arguments to your function when it receives a request. -Note that your function must use the `event`-style function signature: +### Container environments based on Knative -```js -exports.helloEvents = (data, context) => { - console.log(data); - console.log(context); -}; -``` +The Functions Framework is designed to be compatible with Knative environments. Build and deploy your container to a Knative environment. + +### OpenFunction -To enable automatic unmarshalling, set the function signature type to `event` -using a command-line flag or an environment variable. By default, the HTTP -signature will be used and automatic event unmarshalling will be disabled. +![OpenFunction Platform Overview](https://openfunction.dev/openfunction-0.5-architecture.png) + +Besides Knative function support, one notable feature of OpenFunction is embracing Dapr system, so far Dapr pub/sub and bindings have been support. + +Dapr bindings allows you to trigger your applications or services with events coming in from external systems, or interface with external systems. OpenFunction [0.6.0 release](https://openfunction.dev/blog/2022/03/25/announcing-openfunction-0.6.0-faas-observability-http-trigger-and-more/) adds Dapr output bindings to its synchronous functions which enables HTTP triggers for asynchronous functions. For example, synchronous functions backed by the Knative runtime can now interact with middlewares defined by Dapr output binding or pub/sub, and an asynchronous function will be triggered by the events sent from the synchronous function. + +Asynchronous function introduces Dapr pub/sub to provide a platform-agnostic API to send and receive messages. A typical use case is that you can leverage synchronous functions to receive an event in plain JSON or Cloud Events format, and then send the received event to a Dapr output binding or pub/sub component, most likely a message queue (e.g. Kafka, NATS Streaming, GCP PubSub, MQTT). Finally, the asynchronous function could be triggered from the message queue. + +More details would be brought up to you in some quickstart samples, stay tuned. + +### Google Cloud Functions -For more details on this signature type, check out the Google Cloud Functions -documentation on -[background functions](https://cloud.google.com/functions/docs/writing/background#cloud_pubsub_example). +The [Node.js 10 runtime on Google Cloud Functions](https://cloud.google.com/functions/docs/concepts/nodejs-10-runtime) is based on the Functions Framework. On Cloud Functions, the Functions Framework is completely optional: if you don't add it to your `package.json`, it will be installed automatically. + +After you've written your function, you can deploy it from your local machine using the `gcloud` command-line tool. [Check out the Cloud Functions quickstart](https://cloud.google.com/functions/docs/quickstart). + +### Cloud Run / Cloud Run for Anthos + +After you've written your function, added the Functions Framework and updated your `start` script in `package.json`, deploy it to Cloud Run with `gcloud run deploy`. Check out the [Cloud Run quickstart for Node.js](https://cloud.google.com/run/docs/quickstarts/build-and-deploy/nodejs). + +If you want even more control over the environment, you can [deploy to Cloud Run for Anthos](https://cloud.google.com/anthos/run/docs/quickstarts/prebuilt-deploy-gke). With Cloud Run for Anthos, you can run your function on a GKE cluster, which gives you additional control over the environment (including use of GPU-based instances, longer timeouts and more). ## Enable CloudEvents -The Functions Framework can unmarshall incoming -[CloudEvents](http://cloudevents.io) payloads to a `cloudevent` object. -It will be passed as an argument to your function when it receives a request. -Note that your function must use the `cloudevent`-style function signature: +The Functions Framework can unmarshall incoming [CloudEvents](http://cloudevents.io) payloads to a `cloudevent` object. It will be passed as an argument to your function when it receives a request. Note that your function must use the `cloudevent`-style function signature: ```js const functions = require('@openfunction/functions-framework'); @@ -245,16 +228,6 @@ functions.cloudEvent('helloCloudEvents', (cloudevent) => { }); ``` -To enable the CloudEvent functions, you must list the Functions Framework as a dependency in your `package.json`: - -```json -{ - "dependencies": { - "@openfunction/functions-framework": "~0.4.0" - } -} -``` - Learn how to use CloudEvents in this [guide](docs/cloudevents.md). ## Advanced Docs