From 7b2bc9154ae65991a53d264b3ba0c34c01e389e5 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 13 May 2022 16:40:42 +0800 Subject: [PATCH 01/42] =?UTF-8?q?=F0=9F=91=B7=20ci(bot):=20init=20some=20c?= =?UTF-8?q?onfigs=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/auto_assign.yml | 22 +++++++++++++++++++ .github/labeler.yml | 25 +++++++++++++++++++++ .github/mergable.yml | 48 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 .github/auto_assign.yml create mode 100644 .github/labeler.yml create mode 100644 .github/mergable.yml diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml new file mode 100644 index 00000000..a3a822b3 --- /dev/null +++ b/.github/auto_assign.yml @@ -0,0 +1,22 @@ +# Set to true to add reviewers to pull requests +addReviewers: true + +# Set to author to set pr creator as assignee +addAssignees: author + +# A list of reviewers to be added to pull requests (GitHub user name) +reviewers: + - webup + - benjaminhuo + +# A number of reviewers added to the pull request +# Set 0 to add all the reviewers (default: 0) +numberOfReviewers: 1 + +# A list of keywords to be skipped the process that add reviewers if pull requests include it +skipKeywords: + - wip + +# A list of users to be skipped by both the add reviewers and add assignees processes +skipUsers: + - dependabot[bot] diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 00000000..7cd8fb8b --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,25 @@ +# Number of labels to fetch (optional). Defaults to 100 +numLabels: '40' +# These labels will not be used even if the issue contains them (optional). +# Pass a blank array if no labels are to be excluded. +# excludeLabels: [] +excludeLabels: + - pinned +# custom configuration to override default behaviour +# control explicitly what gets added and when +# custom: +# - location: title +# keywords: +# - enable +# labels: +# - enhancement +# - location: title +# keywords: +# - fix +# labels: +# - bug +# - location: title +# keywords: +# - doc +# labels: +# - documentation diff --git a/.github/mergable.yml b/.github/mergable.yml new file mode 100644 index 00000000..fd73bfbd --- /dev/null +++ b/.github/mergable.yml @@ -0,0 +1,48 @@ +version: 2 +mergeable: + - when: pull_request.* + name: 'Ingore WIP' + validate: + - do: title + must_exclude: + regex: ^\[WIP\] + - do: label + must_exclude: + regex: 'wip' + - when: pull_request.* + name: 'NO empty description' + validate: + - do: description + no_empty: + enabled: true + message: Description matter and should not be empty. Provide detail with either **what** was changed, **why** it was changed, or **how** it was changed. + - when: schedule.repository + name: 'Check stale PR and issues' + validate: + - do: stale + days: 20 + type: pull_request, issues + pass: + - do: comment + payload: + body: This is old. Is it still relevant? + - when: pull_request.opened + name: 'Greet a contributor' + validate: [] + pass: + - do: comment + payload: + body: > + Thanks for creating a pull request! A maintainer will review your changes shortly. Please don't be discouraged if it takes a while. + - when: pull_request.*, pull_request_review.* + name: 'Draft check' + validate: + - do: payload + pull_request: + draft: + boolean: + match: false + fail: + - do: comment + payload: + body: This PR is STILL a draft! From 7d1aee15b07de3c9ac1b4f51195d0a79bead9e77 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 13 May 2022 21:37:03 +0800 Subject: [PATCH 02/42] =?UTF-8?q?=F0=9F=8E=A8=20cosm(function=5Fcontext):?= =?UTF-8?q?=20typings=20polish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/openfunction/function_context.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/openfunction/function_context.ts b/src/openfunction/function_context.ts index fb0779ec..450d7c07 100644 --- a/src/openfunction/function_context.ts +++ b/src/openfunction/function_context.ts @@ -14,7 +14,10 @@ export interface OpenFunctionContext { /** * The target runtime of the context. */ - runtime: keyof typeof RuntimeType; + runtime: + | `${RuntimeType}` + | `${Capitalize}` + | `${Uppercase}`; /** * Optional port string of the server. */ @@ -64,7 +67,7 @@ export interface OpenFunctionComponent { /** * Optional metadata as hash map for the component. */ - metadata?: {[key: string]: string}; + metadata?: Record; } /** @@ -75,11 +78,11 @@ export enum RuntimeType { /** * The Knative type. */ - Knative = 'Knative', + Knative = 'knative', /** * The async type. */ - Async = 'Async', + Async = 'async', } /** @@ -108,7 +111,7 @@ export class ContextUtils { * @returns A boolean value. */ static IsKnativeRuntime(context: OpenFunctionContext): boolean { - return context?.runtime === RuntimeType.Knative; + return context?.runtime?.toLowerCase() === RuntimeType.Knative; } /** * Returns true if the runtime is Async. @@ -116,7 +119,7 @@ export class ContextUtils { * @returns A boolean value. */ static IsAsyncRuntime(context: OpenFunctionContext): boolean { - return context?.runtime === RuntimeType.Async; + return context?.runtime?.toLowerCase() === RuntimeType.Async; } /** From 9089abdf431fd4bbfae0eca415cc1978297bfc88 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 13 May 2022 22:02:11 +0800 Subject: [PATCH 03/42] =?UTF-8?q?=F0=9F=93=9D=20doc(api):=20update=20funct?= =?UTF-8?q?ion=20context=20typings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generated/api.json | 57 ++++++++++++++++++++++++++++++++++++----- docs/generated/api.md | 10 +++----- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index 3f71fb9c..5f84bf41 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1522,9 +1522,14 @@ "kind": "Content", "text": "metadata?: " }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, { "kind": "Content", - "text": "{\n [key: string]: string;\n }" + "text": "" }, { "kind": "Content", @@ -1536,7 +1541,7 @@ "name": "metadata", "propertyTypeTokenRange": { "startIndex": 1, - "endIndex": 2 + "endIndex": 3 } }, { @@ -1724,13 +1729,53 @@ }, { "kind": "Content", - "text": "keyof typeof " + "text": "`${" + }, + { + "kind": "Reference", + "text": "RuntimeType", + "canonicalReference": "@openfunction/functions-framework!RuntimeType:enum" + }, + { + "kind": "Content", + "text": "}` | `${" + }, + { + "kind": "Reference", + "text": "Capitalize", + "canonicalReference": "!Capitalize:type" + }, + { + "kind": "Content", + "text": "<" }, { "kind": "Reference", "text": "RuntimeType", "canonicalReference": "@openfunction/functions-framework!RuntimeType:enum" }, + { + "kind": "Content", + "text": ">}` | `${" + }, + { + "kind": "Reference", + "text": "Uppercase", + "canonicalReference": "!Uppercase:type" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "RuntimeType", + "canonicalReference": "@openfunction/functions-framework!RuntimeType:enum" + }, + { + "kind": "Content", + "text": ">}`" + }, { "kind": "Content", "text": ";" @@ -1741,7 +1786,7 @@ "name": "runtime", "propertyTypeTokenRange": { "startIndex": 1, - "endIndex": 3 + "endIndex": 12 } }, { @@ -1854,7 +1899,7 @@ }, { "kind": "Content", - "text": "\"Async\"" + "text": "\"async\"" } ], "releaseTag": "Public", @@ -1875,7 +1920,7 @@ }, { "kind": "Content", - "text": "\"Knative\"" + "text": "\"knative\"" } ], "releaseTag": "Public", diff --git a/docs/generated/api.md b/docs/generated/api.md index be597ab1..0128b70e 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -114,9 +114,7 @@ export interface OpenFunctionBinding { export interface OpenFunctionComponent { componentName: string; componentType: `${ComponentType}.${string}`; - metadata?: { - [key: string]: string; - }; + metadata?: Record; operation?: string; uri?: string; } @@ -127,7 +125,7 @@ export interface OpenFunctionContext { name: string; outputs?: OpenFunctionBinding; port?: string; - runtime: keyof typeof RuntimeType; + runtime: `${RuntimeType}` | `${Capitalize}` | `${Uppercase}`; version: string; } @@ -141,8 +139,8 @@ export { Response_2 as Response } // @public export enum RuntimeType { - Async = "Async", - Knative = "Knative" + Async = "async", + Knative = "knative" } // (No @packageDocumentation comment for this package) From ce63398713a77eaf83b69ad5cfa6ceb1472b7f31 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 14 May 2022 17:38:23 +0800 Subject: [PATCH 04/42] =?UTF-8?q?=F0=9F=91=B7=20ci:=20add=20pre-push=20hoo?= =?UTF-8?q?k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 297 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 6 +- 2 files changed, 302 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 6cbc416d..f98880d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,6 +46,7 @@ "gts": "^3.1.0", "mocha": "9.1.2", "pack-n-play": "^1.0.0-2", + "pre-push": "^0.1.2", "shelljs": "^0.8.5", "sinon": "^12.0.0", "supertest": "6.1.6", @@ -1384,6 +1385,12 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "node_modules/bulk-write-stream": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz", @@ -1658,6 +1665,51 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/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/concat-stream/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/concat-stream/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/concurrently": { "version": "7.0.0", "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.0.0.tgz", @@ -5258,6 +5310,15 @@ "node": ">= 0.8.0" } }, + "node_modules/os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5498,6 +5559,78 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pre-push": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.2.tgz", + "integrity": "sha512-WymiU20I3W1yGV4VEqa+xOqaqGHYUz49R4ARvEdmYPgL07E/Gn7NLewI9k5g6KUc2EOaWE42rBb7nfVKYtkpCA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "node_modules/pre-push/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-push/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/pre-push/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-push/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-push/node_modules/which": { + "version": "1.2.14", + "resolved": "https://registry.npmmirror.com/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/pre-push/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5592,6 +5725,12 @@ "node": ">= 0.10" } }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -6328,6 +6467,16 @@ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", "dev": true }, + "node_modules/spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmmirror.com/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "dependencies": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -6786,6 +6935,12 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -8476,6 +8631,12 @@ "ieee754": "^1.1.13" } }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "bulk-write-stream": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz", @@ -8696,6 +8857,50 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "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" + } + } + } + }, "concurrently": { "version": "7.0.0", "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.0.0.tgz", @@ -11384,6 +11589,12 @@ "word-wrap": "^1.2.3" } }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -11558,6 +11769,70 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "pre-push": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.2.tgz", + "integrity": "sha512-WymiU20I3W1yGV4VEqa+xOqaqGHYUz49R4ARvEdmYPgL07E/Gn7NLewI9k5g6KUc2EOaWE42rBb7nfVKYtkpCA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmmirror.com/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11626,6 +11901,12 @@ "ipaddr.js": "1.9.1" } }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -12180,6 +12461,16 @@ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", "dev": true }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmmirror.com/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -12528,6 +12819,12 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", diff --git a/package.json b/package.json index 4edab8fc..30af98c0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "scripts": { "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", "clean": "gts clean", "compile": "tsc -p .", @@ -38,6 +37,10 @@ "prepare": "npm run build", "pretest": "npm run compile" }, + "prepush": [ + "build", + "test" + ], "files": [ "build/src/**/*.js", "build/src/**/*.d.ts" @@ -69,6 +72,7 @@ "gts": "^3.1.0", "mocha": "9.1.2", "pack-n-play": "^1.0.0-2", + "pre-push": "^0.1.2", "shelljs": "^0.8.5", "sinon": "^12.0.0", "supertest": "6.1.6", From 797b912455965653a4cff1930873be57a76e3cd2 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 15 May 2022 16:02:37 +0800 Subject: [PATCH 05/42] =?UTF-8?q?=E2=9C=A8=20feat:=20enable=20HTTP=20trigg?= =?UTF-8?q?er=20async=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- src/function_wrappers.ts | 50 ++++++++++++++++++++++++++-- src/functions.ts | 27 ++++++++++++++- src/openfunction/async_server.ts | 24 ++----------- src/openfunction/function_runtime.ts | 46 +++++++++++++++++++++++-- src/server.ts | 12 +++---- test/conformance/function.js | 9 ++--- test/conformance/package.json | 8 ++--- test/integration/http_binding.ts | 13 +++++--- 8 files changed, 143 insertions(+), 46 deletions(-) diff --git a/src/function_wrappers.ts b/src/function_wrappers.ts index 55ad558b..d9c36077 100644 --- a/src/function_wrappers.ts +++ b/src/function_wrappers.ts @@ -14,6 +14,10 @@ // eslint-disable-next-line node/no-deprecated-api import * as domain from 'domain'; + +import * as Debug from 'debug'; +import {get, isEmpty} from 'lodash'; + import {Request, Response, RequestHandler} from 'express'; import {sendCrashResponse} from './logger'; import {sendResponse} from './invoker'; @@ -27,9 +31,14 @@ import { CloudEventFunctionWithCallback, HandlerFunction, } from './functions'; -import {CloudEvent} from './functions'; +import {CloudEvent, OpenFunction} from './functions'; import {SignatureType} from './types'; +import {OpenFunctionContext} from './openfunction/function_context'; +import {OpenFunctionRuntime} from './openfunction/function_runtime'; + +const debug = Debug('common:wrapper'); + /** * The handler function used to signal completion of event functions. */ @@ -122,6 +131,37 @@ const wrapHttpFunction = (execute: HttpFunction): RequestHandler => { }; }; +const wrapHttpAsyncFunction = ( + userFunction: OpenFunction, + context: OpenFunctionContext +): RequestHandler => { + const ctx = OpenFunctionRuntime.ProxyContext(context); + const httpHandler = (req: Request, res: Response) => { + const callback = getOnDoneCallback(res); + + Promise.resolve() + .then(() => userFunction(ctx, req.body)) + .then(result => { + debug('â„šī¸ User function returned: %j', result); + + const data = get(result, 'body'); + const code = get(result, 'code', 200); + const headers = get(result, 'headers'); + + !isEmpty(headers) && res.set(headers); + + if (data !== undefined) { + res.status(code).send(data); + } else { + res.status(code).end(); + } + }) + .catch(err => callback(err, undefined)); + }; + + return wrapHttpFunction(httpHandler); +}; + /** * Wraps an async CloudEvent function in an express RequestHandler. * @param userFunction User's function. @@ -202,10 +242,16 @@ const wrapEventFunctionWithCallback = ( */ export const wrapUserFunction = ( userFunction: HandlerFunction, - signatureType: SignatureType + signatureType: SignatureType, + context?: object ): RequestHandler => { switch (signatureType) { case 'http': + if (!isEmpty((context as OpenFunctionContext)?.outputs)) + return wrapHttpAsyncFunction( + userFunction as OpenFunction, + context as OpenFunctionContext + ); return wrapHttpFunction(userFunction as HttpFunction); case 'event': // Callback style if user function has more than 2 arguments. diff --git a/src/functions.ts b/src/functions.ts index 49a1a5ce..aa1d64f4 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -78,13 +78,38 @@ export interface CloudEventFunctionWithCallback { } /** - * A OpenFunction async function handler. + * An OpenFunction async function handler. * @public */ export interface OpenFunction { (ctx: OpenFunctionRuntime, data: {}): any; } +/** + * OpenFunction runtime as the context handler. + * @public + */ +export {OpenFunctionRuntime}; + +/** + * HTTP response ouput from OpenFunction async function + * @public + */ +export interface HttpFunctionResponse { + /** + * Status code of the response. + */ + code?: number; + /** + * Headers of the response. + */ + headers?: Record; + /** + * Body of the response. + */ + body?: any; +} + /** * A function handler. * @public diff --git a/src/openfunction/async_server.ts b/src/openfunction/async_server.ts index 1c4b7cc4..4944ce79 100644 --- a/src/openfunction/async_server.ts +++ b/src/openfunction/async_server.ts @@ -1,4 +1,4 @@ -import {forEach, has, get} from 'lodash'; +import {forEach} from 'lodash'; import {DaprServer} from 'dapr-client'; import {OpenFunction} from '../functions'; @@ -20,7 +20,7 @@ export default function ( context: OpenFunctionContext ): AsyncFunctionServer { const app = new DaprServer('localhost', context.port); - const ctx = getContextProxy(context); + const ctx = OpenFunctionRuntime.ProxyContext(context); const wrapper = async (data: object) => { await userFunction(ctx, data); @@ -44,23 +44,3 @@ export default function ( 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/function_runtime.ts b/src/openfunction/function_runtime.ts index c5746983..87a93353 100644 --- a/src/openfunction/function_runtime.ts +++ b/src/openfunction/function_runtime.ts @@ -1,8 +1,10 @@ import {env} from 'process'; -import {chain} from 'lodash'; +import {chain, get, has} from 'lodash'; import {DaprClient, CommunicationProtocolEnum} from 'dapr-client'; +import {HttpFunctionResponse} from '../functions'; + import { OpenFunctionComponent, OpenFunctionContext, @@ -11,6 +13,7 @@ import { /** * The OpenFunction's serving runtime abstract class. + * @public */ export abstract class OpenFunctionRuntime { /** @@ -32,6 +35,26 @@ export abstract class OpenFunctionRuntime { return new DaprRuntime(context); } + /** + * It creates a proxy for the runtime object, which delegates all property access to the runtime object + * @param context - The context object to be proxied. + * @returns The proxy object. + */ + static ProxyContext(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); + }, + }); + } + /** * Getter for the port of Dapr sidecar */ @@ -43,7 +66,26 @@ export abstract class OpenFunctionRuntime { } /** - * The promise that send data to certain ouput binding or pubsub topic. + * It returns an HTTP style response object with a `code`, `headers`, and `body` property + * @param body - The data you want to send back to the client. + * @param code - The HTTP status code to return. + * @param headers - An object containing the headers to be sent with the response. + * @returns A function that takes in data, code, and headers and returns an response object. + */ + response( + body: unknown, + code = 200, + headers?: Record + ): HttpFunctionResponse { + return { + code, + headers, + body, + }; + } + + /** + * The promise that send data to certain ouput. */ abstract send(data: object, output?: string): Promise; } diff --git a/src/server.ts b/src/server.ts index 5b762339..deea0e9c 100644 --- a/src/server.ts +++ b/src/server.ts @@ -24,13 +24,12 @@ import {cloudEventToBackgroundEventMiddleware} from './middleware/cloud_event_to import {backgroundEventToCloudEventMiddleware} from './middleware/background_event_to_cloud_event'; import {wrapUserFunction} from './function_wrappers'; -import daprOutputMiddleware from './openfunction/dapr_output_middleware'; - /** * Creates and configures an Express application and returns an HTTP server * which will run it. * @param userFunction User's function. * @param functionSignatureType Type of user's function signature. + * @param context Optional context object. * @return HTTP server. */ export function getServer( @@ -53,9 +52,6 @@ export function getServer( next(); }); - // Use OpenFunction middlewares - app.use(daprOutputMiddleware); - /** * 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" @@ -139,7 +135,11 @@ export function getServer( } // Set up the routes for the user's function - const requestHandler = wrapUserFunction(userFunction, functionSignatureType); + const requestHandler = wrapUserFunction( + userFunction, + functionSignatureType, + context + ); if (functionSignatureType === 'http') { app.all('/*', requestHandler); } else { diff --git a/test/conformance/function.js b/test/conformance/function.js index 77bff4a8..cc3e71cd 100644 --- a/test/conformance/function.js +++ b/test/conformance/function.js @@ -44,9 +44,10 @@ function writeJson(content) { fs.writeFileSync(fileName, json); } -function tryKnative(req, res) { - debug('✅ Function should receive request: %o', req.body); - res.send(req.body); +async function tryKnativeAsync(ctx, data) { + debug('✅ Function should receive request: %o', data); + await ctx.send(data); + return ctx.response(data); } function tryAsync(ctx, data) { @@ -57,6 +58,6 @@ module.exports = { writeHttp, writeCloudEvent, writeLegacyEvent, - tryKnative, + tryKnativeAsync, tryAsync, }; diff --git a/test/conformance/package.json b/test/conformance/package.json index 761fec54..3270ff21 100644 --- a/test/conformance/package.json +++ b/test/conformance/package.json @@ -8,10 +8,10 @@ }, "scripts": { "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", + "knative:async": "concurrently npm:knative:async:run:* npm:knative:async:test", + "knative:async:run:func": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --target=tryKnativeAsync", + "knative:async:run:dapr": "dapr run -H 3500 -d ../data/components/http --log-level warn", + "knative:async: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/integration/http_binding.ts b/test/integration/http_binding.ts index feb5dc43..8e5712c0 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -3,12 +3,13 @@ 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'; +import {OpenFunctionRuntime} from '../../src/functions'; +import {getServer} from '../../src/server'; + const TEST_CONTEXT: OpenFunctionContext = { name: 'test-context', version: '1.0.0', @@ -81,15 +82,17 @@ describe('OpenFunction - HTTP Binding', () => { ); const server = getServer( - (req: Request, res: Response) => { - res.status(200).json(TEST_PAYLOAD); + async (ctx: OpenFunctionRuntime, data: {}) => { + await ctx.send(data); + return ctx.response(data); }, 'http', context ); await supertest(server) - .get('/') + .post('/') + .send(TEST_PAYLOAD) .expect(200) .expect(res => { deepStrictEqual(res.body, TEST_PAYLOAD); From add584485c596ee7d430ec409962ee1ee6cf34e4 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 15 May 2022 16:14:20 +0800 Subject: [PATCH 06/42] =?UTF-8?q?=F0=9F=93=9D=20doc:=20update=20README=20a?= =?UTF-8?q?nd=20API=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- README.md | 41 +++- docs/generated/api.json | 443 +++++++++++++++++++++++++++++++++++++++- docs/generated/api.md | 23 ++- 3 files changed, 501 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e6564cad..8d526053 100644 --- a/README.md +++ b/README.md @@ -196,7 +196,44 @@ Dapr bindings allows you to trigger your applications or services with events co 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. +Async function use below function signature which is quite difference from that of Express style sync function: + +```js +function (ctx, data) {} +``` + +* `ctx`: OpenFunction [context](https://github.com/OpenFunction/functions-framework-nodejs/blob/master/src/openfunction/function_context.ts) object + * `ctx.send(payload, output?)`: Send `payload` to all or one specific `output` of Dapr Output [Binding](https://docs.dapr.io/reference/components-reference/supported-bindings/) or Pub [Broker](https://docs.dapr.io/reference/components-reference/supported-pubsub/) + * Notice that `ctx.send` CAN be invoked where necessary, when you have certain outgoing data to send +* `data`: Data recieved from Dapr Input Binding or Sub Broker + +For more details about async function and demo, please check out our [Node.js Async Function Quickstart](https://openfunction-talks.netlify.app/2022/202-node-async/). + +#### HTTP Trigger Async Function + +Sync functions is triggered by HTTP request, so Dapr is not used in sync function input. Whenever there are functions output requirements, sync functions can also send output to Dapr output binding or pubsub components. + +Here is another function sample: + +* Users send a HTTP request to a [Knative Sync function](https://github.com/OpenFunction/samples/tree/main/functions/knative/with-output-binding). +* This sync function handles the request and then send its output to Kafka through a Dapr Kafka output binding or pubsub component. +* An [async function](https://github.com/OpenFunction/samples/tree/main/functions/async/bindings/kafka-input) is then triggered by this output event in Kafka (through a Dapr Kafka input binding or pubsub component) + +![HTTP Trigger Async Function](https://raw.githubusercontent.com/OpenFunction/samples/main/images/knative-dapr.png) + +Node.js Functions Framework also supports such use case, you can switch Express function signature to typical async style as below example indicates: + +```js +async function tryKnativeAsync(ctx, data) { + // Receive and handle data from HTTP request's body + console.log('Function should receive request: %o', data); + + // Send output in async way via Dapr + await ctx.send(data); + + // Use `response` method to prepare data as HTTP response + return ctx.response(data); +``` ### Google Cloud Functions @@ -243,5 +280,3 @@ Contributions to this library are welcome and encouraged. See [ff_node_unit_link]: https://github.com/openfunction/functions-framework-nodejs/actions?query=workflow%3A"Node.js+Unit+CI" [ff_node_lint_img]: https://github.com/openfunction/functions-framework-nodejs/workflows/Node.js%20Lint%20CI/badge.svg [ff_node_lint_link]: https://github.com/openfunction/functions-framework-nodejs/actions?query=workflow%3A"Node.js+Lint+CI" -[ff_node_conformance_img]: https://github.com/openfunction/functions-framework-nodejs/workflows/Node.js%20Conformance%20CI/badge.svg -[ff_node_conformance_link]: https://github.com/openfunction/functions-framework-nodejs/actions?query=workflow%3A"Node.js+Conformance+CI" diff --git a/docs/generated/api.json b/docs/generated/api.json index 5f84bf41..85184b4b 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1202,6 +1202,105 @@ ], "extendsTokenRanges": [] }, + { + "kind": "Interface", + "canonicalReference": "@openfunction/functions-framework!HttpFunctionResponse:interface", + "docComment": "/**\n * HTTP response ouput from OpenFunction async function\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export interface HttpFunctionResponse " + } + ], + "releaseTag": "Public", + "name": "HttpFunctionResponse", + "members": [ + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!HttpFunctionResponse#body:member", + "docComment": "/**\n * Body of the response.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "body?: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "body", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!HttpFunctionResponse#code:member", + "docComment": "/**\n * Status code of the response.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "code?: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "code", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!HttpFunctionResponse#headers:member", + "docComment": "/**\n * Headers of the response.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "headers?: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "headers", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 3 + } + } + ], + "extendsTokenRanges": [] + }, { "kind": "TypeAlias", "canonicalReference": "@openfunction/functions-framework!LegacyCloudFunctionsContext:type", @@ -1309,7 +1408,7 @@ { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!OpenFunction:interface", - "docComment": "/**\n * A OpenFunction async function handler.\n *\n * @public\n */\n", + "docComment": "/**\n * An OpenFunction async function handler.\n *\n * @public\n */\n", "excerptTokens": [ { "kind": "Content", @@ -1818,6 +1917,348 @@ ], "extendsTokenRanges": [] }, + { + "kind": "Class", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class", + "docComment": "/**\n * The OpenFunction's serving runtime abstract class.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare abstract class OpenFunctionRuntime " + } + ], + "releaseTag": "Public", + "name": "OpenFunctionRuntime", + "members": [ + { + "kind": "Constructor", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:constructor(1)", + "docComment": "/**\n * Constructor of the OpenFunctionRuntime.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(context: " + }, + { + "kind": "Reference", + "text": "OpenFunctionContext", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext:interface" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "context", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ] + }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#context:member", + "docComment": "/**\n * The context of the OpenFunction.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "readonly context: " + }, + { + "kind": "Reference", + "text": "OpenFunctionContext", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "releaseTag": "Public", + "name": "context", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime.Parse:member(1)", + "docComment": "/**\n * Static method to parse the context and get runtime.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static Parse(context: " + }, + { + "kind": "Reference", + "text": "OpenFunctionContext", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "OpenFunctionRuntime", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class" + }, + { + "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": "Parse" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime.ProxyContext:member(1)", + "docComment": "/**\n * It creates a proxy for the runtime object, which delegates all property access to the runtime object\n *\n * @param context - The context object to be proxied.\n *\n * @returns The proxy object.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static ProxyContext(context: " + }, + { + "kind": "Reference", + "text": "OpenFunctionContext", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "OpenFunctionRuntime", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class" + }, + { + "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": "ProxyContext" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#response:member(1)", + "docComment": "/**\n * It returns an HTTP style response object with a `code`, `headers`, and `body` property\n *\n * @param body - The data you want to send back to the client.\n *\n * @param code - The HTTP status code to return.\n *\n * @param headers - An object containing the headers to be sent with the response.\n *\n * @returns A function that takes in data, code, and headers and returns an response object.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "response(body: " + }, + { + "kind": "Content", + "text": "unknown" + }, + { + "kind": "Content", + "text": ", code?: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ", headers?: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "HttpFunctionResponse", + "canonicalReference": "@openfunction/functions-framework!HttpFunctionResponse:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 8, + "endIndex": 9 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "body", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "parameterName": "code", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + } + }, + { + "parameterName": "headers", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 7 + } + } + ], + "name": "response" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#send:member(1)", + "docComment": "/**\n * The promise that send data to certain ouput.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract send(data: " + }, + { + "kind": "Content", + "text": "object" + }, + { + "kind": "Content", + "text": ", output?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 5, + "endIndex": 7 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "data", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "parameterName": "output", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + } + } + ], + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#sidecarPort:member", + "docComment": "/**\n * Getter for the port of Dapr sidecar\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "get sidecarPort(): " + }, + { + "kind": "Content", + "text": "{\n HTTP: string;\n GRRC: string;\n }" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "releaseTag": "Public", + "name": "sidecarPort", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false + } + ], + "implementsTokenRanges": [] + }, { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!Request_2:interface", diff --git a/docs/generated/api.md b/docs/generated/api.md index 0128b70e..a5e9a133 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -84,6 +84,13 @@ export interface HttpFunction { (req: Request_2, res: Response_2): any; } +// @public +export interface HttpFunctionResponse { + body?: any; + code?: number; + headers?: Record; +} + // @public export type LegacyCloudFunctionsContext = CloudFunctionsContext | Data; @@ -99,8 +106,6 @@ 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; } @@ -129,6 +134,20 @@ export interface OpenFunctionContext { version: string; } +// @public +export abstract class OpenFunctionRuntime { + constructor(context: OpenFunctionContext); + readonly context: OpenFunctionContext; + static Parse(context: OpenFunctionContext): OpenFunctionRuntime; + static ProxyContext(context: OpenFunctionContext): OpenFunctionRuntime; + response(body: unknown, code?: number, headers?: Record): HttpFunctionResponse; + abstract send(data: object, output?: string): Promise; + get sidecarPort(): { + HTTP: string; + GRRC: string; + }; +} + // @public (undocumented) interface Request_2 extends Request_3 { rawBody?: Buffer; From 63b7b79471655d06f8144f35999b44ad03db671d Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 15 May 2022 16:50:52 +0800 Subject: [PATCH 07/42] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20ci:=20fix=20mergeabl?= =?UTF-8?q?e=20bot=20config=20filename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/{mergable.yml => mergeable.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{mergable.yml => mergeable.yml} (100%) diff --git a/.github/mergable.yml b/.github/mergeable.yml similarity index 100% rename from .github/mergable.yml rename to .github/mergeable.yml From da606dd3f74a9a2a82110eb81ac8902543a3928a Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Mon, 16 May 2022 21:25:17 +0800 Subject: [PATCH 08/42] =?UTF-8?q?=F0=9F=91=94=20refactor:=20add=20`openfun?= =?UTF-8?q?ction`=20signature=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- src/function_wrappers.ts | 12 ++++++------ src/types.ts | 7 ++++++- test/conformance/package.json | 4 ++-- test/integration/http_binding.ts | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/function_wrappers.ts b/src/function_wrappers.ts index d9c36077..3f416270 100644 --- a/src/function_wrappers.ts +++ b/src/function_wrappers.ts @@ -131,7 +131,7 @@ const wrapHttpFunction = (execute: HttpFunction): RequestHandler => { }; }; -const wrapHttpAsyncFunction = ( +const wrapOpenFunction = ( userFunction: OpenFunction, context: OpenFunctionContext ): RequestHandler => { @@ -247,12 +247,12 @@ export const wrapUserFunction = ( ): RequestHandler => { switch (signatureType) { case 'http': - if (!isEmpty((context as OpenFunctionContext)?.outputs)) - return wrapHttpAsyncFunction( - userFunction as OpenFunction, - context as OpenFunctionContext - ); return wrapHttpFunction(userFunction as HttpFunction); + case 'openfunction': + return wrapOpenFunction( + userFunction as OpenFunction, + context as OpenFunctionContext + ); case 'event': // Callback style if user function has more than 2 arguments. if (userFunction!.length > 2) { diff --git a/src/types.ts b/src/types.ts index 7d2d2f5b..44865026 100644 --- a/src/types.ts +++ b/src/types.ts @@ -19,7 +19,12 @@ export const FUNCTION_STATUS_HEADER_FIELD = 'X-Google-Status'; /** * List of function signature types that are supported by the framework. */ -export const SignatureType = ['http', 'event', 'cloudevent'] as const; +export const SignatureType = [ + 'http', + 'event', + 'cloudevent', + 'openfunction', +] as const; /** * Union type of all valid function SignatureType values. diff --git a/test/conformance/package.json b/test/conformance/package.json index 3270ff21..f4eb9778 100644 --- a/test/conformance/package.json +++ b/test/conformance/package.json @@ -7,9 +7,9 @@ "wait-on": "file:../../node_modules/wait-on" }, "scripts": { - "start": "functions-framework", + "start": "functions-framework --target=writeHttp", "knative:async": "concurrently npm:knative:async:run:* npm:knative:async:test", - "knative:async:run:func": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --target=tryKnativeAsync", + "knative:async:run:func": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsync", "knative:async:run:dapr": "dapr run -H 3500 -d ../data/components/http --log-level warn", "knative:async:test": "wait-on tcp:3500 tcp:8080 && curl -s -d '{\"data\": \"hello\"}' -H 'Content-Type: application/json' localhost:8080", "async": "concurrently npm:async:run:*", diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts index 8e5712c0..a573d017 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -86,7 +86,7 @@ describe('OpenFunction - HTTP Binding', () => { await ctx.send(data); return ctx.response(data); }, - 'http', + 'openfunction', context ); From 74cbea98b61e377fd9570a122482c784b55f23e5 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Tue, 17 May 2022 10:50:06 +0800 Subject: [PATCH 09/42] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(ofn/runtime?= =?UTF-8?q?):=20=20refine=20context=20proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/generated/api.json | 209 +++++++++++++++++++++------ docs/generated/api.md | 13 +- src/function_wrappers.ts | 23 +-- src/functions.ts | 4 +- src/openfunction/function_runtime.ts | 63 +++++--- test/integration/http_binding.ts | 2 +- 6 files changed, 221 insertions(+), 93 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index 85184b4b..3b526f88 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1022,6 +1022,15 @@ "kind": "Content", "text": "> = " }, + { + "kind": "Reference", + "text": "OpenFunction", + "canonicalReference": "@openfunction/functions-framework!OpenFunction:interface" + }, + { + "kind": "Content", + "text": " | " + }, { "kind": "Reference", "text": "HttpFunction", @@ -1065,12 +1074,7 @@ }, { "kind": "Content", - "text": " | " - }, - { - "kind": "Reference", - "text": "OpenFunction", - "canonicalReference": "@openfunction/functions-framework!OpenFunction:interface" + "text": "" }, { "kind": "Content", @@ -1094,7 +1098,7 @@ ], "typeTokenRange": { "startIndex": 3, - "endIndex": 14 + "endIndex": 15 } }, { @@ -1968,7 +1972,7 @@ "excerptTokens": [ { "kind": "Content", - "text": "readonly context: " + "text": "protected readonly context: " }, { "kind": "Reference", @@ -2084,47 +2088,49 @@ "name": "ProxyContext" }, { - "kind": "Method", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#response:member(1)", - "docComment": "/**\n * It returns an HTTP style response object with a `code`, `headers`, and `body` property\n *\n * @param body - The data you want to send back to the client.\n *\n * @param code - The HTTP status code to return.\n *\n * @param headers - An object containing the headers to be sent with the response.\n *\n * @returns A function that takes in data, code, and headers and returns an response object.\n */\n", + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#req:member", + "docComment": "/**\n * Getter returns the request object from the trigger.\n *\n * @returns The request object.\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "response(body: " + "text": "get req(): " }, { - "kind": "Content", - "text": "unknown" + "kind": "Reference", + "text": "Request", + "canonicalReference": "@types/express!~e.Request:interface" }, { "kind": "Content", - "text": ", code?: " + "text": "" + "text": ", " }, { - "kind": "Content", - "text": "): " + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" }, { - "kind": "Reference", - "text": "HttpFunctionResponse", - "canonicalReference": "@openfunction/functions-framework!HttpFunctionResponse:interface" + "kind": "Content", + "text": "> | undefined" }, { "kind": "Content", @@ -2132,37 +2138,54 @@ } ], "isOptional": false, - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 8, + "releaseTag": "Public", + "name": "req", + "propertyTypeTokenRange": { + "startIndex": 1, "endIndex": 9 }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [ + "isStatic": false + }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#res:member", + "docComment": "/**\n * Getter returns the response object from the trigger.\n *\n * @returns The res property of the trigger object.\n */\n", + "excerptTokens": [ { - "parameterName": "body", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } + "kind": "Content", + "text": "get res(): " }, { - "parameterName": "code", - "parameterTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - } + "kind": "Reference", + "text": "Response", + "canonicalReference": "@types/express!~e.Response:interface" }, { - "parameterName": "headers", - "parameterTypeTokenRange": { - "startIndex": 5, - "endIndex": 7 - } + "kind": "Content", + "text": "> | undefined" + }, + { + "kind": "Content", + "text": ";" } ], - "name": "response" + "isOptional": false, + "releaseTag": "Public", + "name": "res", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "isStatic": false }, { "kind": "Method", @@ -2229,6 +2252,68 @@ ], "name": "send" }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#setTrigger:member(1)", + "docComment": "/**\n * It sets the trigger object to the request and response objects passed in\n *\n * @param req - The HTTP request object\n *\n * @param res - The HTTP response object\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "setTrigger(req: " + }, + { + "kind": "Reference", + "text": "Request", + "canonicalReference": "@types/express!~e.Request:interface" + }, + { + "kind": "Content", + "text": ", res?: " + }, + { + "kind": "Reference", + "text": "Response", + "canonicalReference": "@types/express!~e.Response:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": false, + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "req", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "parameterName": "res", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + } + } + ], + "name": "setTrigger" + }, { "kind": "Property", "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#sidecarPort:member", @@ -2255,6 +2340,34 @@ "endIndex": 2 }, "isStatic": false + }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#trigger:member", + "docComment": "/**\n * The optional trigger of OpenFunction.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "protected trigger?: " + }, + { + "kind": "Reference", + "text": "OpenFunctionTrigger", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionTrigger:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isOptional": true, + "releaseTag": "Public", + "name": "trigger", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false } ], "implementsTokenRanges": [] diff --git a/docs/generated/api.md b/docs/generated/api.md index a5e9a133..6abdb6b4 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -5,8 +5,11 @@ ```ts /// +/// import { CloudEventV1 as CloudEvent } from 'cloudevents'; +import { ParamsDictionary } from 'express-serve-static-core'; +import { ParsedQs } from 'qs'; import { Request as Request_3 } from 'express'; import { Response as Response_2 } from 'express'; @@ -73,7 +76,7 @@ export interface EventFunctionWithCallback { } // @public -export type HandlerFunction = HttpFunction | EventFunction | EventFunctionWithCallback | CloudEventFunction | CloudEventFunctionWithCallback | OpenFunction; +export type HandlerFunction = OpenFunction | HttpFunction | EventFunction | EventFunctionWithCallback | CloudEventFunction | CloudEventFunctionWithCallback; // @public export const http: (functionName: string, handler: HttpFunction) => void; @@ -137,15 +140,19 @@ export interface OpenFunctionContext { // @public export abstract class OpenFunctionRuntime { constructor(context: OpenFunctionContext); - readonly context: OpenFunctionContext; + protected readonly context: OpenFunctionContext; static Parse(context: OpenFunctionContext): OpenFunctionRuntime; static ProxyContext(context: OpenFunctionContext): OpenFunctionRuntime; - response(body: unknown, code?: number, headers?: Record): HttpFunctionResponse; + get req(): Request_3> | undefined; + get res(): Response_2> | undefined; abstract send(data: object, output?: string): Promise; + setTrigger(req: Request_3, res?: Response_2): void; get sidecarPort(): { HTTP: string; GRRC: string; }; + // Warning: (ae-forgotten-export) The symbol "OpenFunctionTrigger" needs to be exported by the entry point index.d.ts + protected trigger?: OpenFunctionTrigger; } // @public (undocumented) diff --git a/src/function_wrappers.ts b/src/function_wrappers.ts index 3f416270..aaf95ff1 100644 --- a/src/function_wrappers.ts +++ b/src/function_wrappers.ts @@ -15,9 +15,6 @@ // eslint-disable-next-line node/no-deprecated-api import * as domain from 'domain'; -import * as Debug from 'debug'; -import {get, isEmpty} from 'lodash'; - import {Request, Response, RequestHandler} from 'express'; import {sendCrashResponse} from './logger'; import {sendResponse} from './invoker'; @@ -37,8 +34,6 @@ import {SignatureType} from './types'; import {OpenFunctionContext} from './openfunction/function_context'; import {OpenFunctionRuntime} from './openfunction/function_runtime'; -const debug = Debug('common:wrapper'); - /** * The handler function used to signal completion of event functions. */ @@ -136,26 +131,14 @@ const wrapOpenFunction = ( context: OpenFunctionContext ): RequestHandler => { const ctx = OpenFunctionRuntime.ProxyContext(context); + const httpHandler = (req: Request, res: Response) => { const callback = getOnDoneCallback(res); + ctx.setTrigger(req, res); Promise.resolve() .then(() => userFunction(ctx, req.body)) - .then(result => { - debug('â„šī¸ User function returned: %j', result); - - const data = get(result, 'body'); - const code = get(result, 'code', 200); - const headers = get(result, 'headers'); - - !isEmpty(headers) && res.set(headers); - - if (data !== undefined) { - res.status(code).send(data); - } else { - res.status(code).end(); - } - }) + .then(() => res.end()) .catch(err => callback(err, undefined)); }; diff --git a/src/functions.ts b/src/functions.ts index aa1d64f4..cc3cba1f 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -115,12 +115,12 @@ export interface HttpFunctionResponse { * @public */ export type HandlerFunction = + | OpenFunction | HttpFunction | EventFunction | EventFunctionWithCallback | CloudEventFunction - | CloudEventFunctionWithCallback - | OpenFunction; + | CloudEventFunctionWithCallback; /** * A legacy event. diff --git a/src/openfunction/function_runtime.ts b/src/openfunction/function_runtime.ts index 87a93353..9a1ea3c9 100644 --- a/src/openfunction/function_runtime.ts +++ b/src/openfunction/function_runtime.ts @@ -1,16 +1,30 @@ import {env} from 'process'; -import {chain, get, has} from 'lodash'; +import {chain, get, has, extend} from 'lodash'; +import {Request, Response} from 'express'; import {DaprClient, CommunicationProtocolEnum} from 'dapr-client'; -import {HttpFunctionResponse} from '../functions'; - import { OpenFunctionComponent, OpenFunctionContext, ContextUtils, } from './function_context'; +/** + * Defining the interface of the HttpTarget. + * @public + */ +export interface HttpTrigger { + req?: Request; + res?: Response; +} + +/** + * Defining the type union of OpenFunction trigger. + * @public + */ +export type OpenFunctionTrigger = HttpTrigger; + /** * The OpenFunction's serving runtime abstract class. * @public @@ -19,7 +33,12 @@ export abstract class OpenFunctionRuntime { /** * The context of the OpenFunction. */ - readonly context: OpenFunctionContext; + protected readonly context: OpenFunctionContext; + + /** + * The optional trigger of OpenFunction. + */ + protected trigger?: OpenFunctionTrigger; /** * Constructor of the OpenFunctionRuntime. @@ -66,22 +85,28 @@ export abstract class OpenFunctionRuntime { } /** - * It returns an HTTP style response object with a `code`, `headers`, and `body` property - * @param body - The data you want to send back to the client. - * @param code - The HTTP status code to return. - * @param headers - An object containing the headers to be sent with the response. - * @returns A function that takes in data, code, and headers and returns an response object. + * Getter returns the request object from the trigger. + * @returns The request object. */ - response( - body: unknown, - code = 200, - headers?: Record - ): HttpFunctionResponse { - return { - code, - headers, - body, - }; + get req() { + return this.trigger?.req; + } + + /** + * Getter returns the response object from the trigger. + * @returns The res property of the trigger object. + */ + get res() { + return this.trigger?.res; + } + + /** + * It sets the trigger object to the request and response objects passed in + * @param req - The HTTP request object + * @param res - The HTTP response object + */ + setTrigger(req: Request, res?: Response) { + this.trigger = extend(this.trigger, {req, res}); } /** diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts index a573d017..ad6f4a46 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -84,7 +84,7 @@ describe('OpenFunction - HTTP Binding', () => { const server = getServer( async (ctx: OpenFunctionRuntime, data: {}) => { await ctx.send(data); - return ctx.response(data); + ctx.res?.send(data); }, 'openfunction', context From 8284d9fc9951569fdf76fd271e2472f09da939e0 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Tue, 17 May 2022 10:50:41 +0800 Subject: [PATCH 10/42] =?UTF-8?q?=F0=9F=93=9D=20doc:=20update=20REAMDE=20a?= =?UTF-8?q?nd=20CONTRUBUTINIG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- CONTRIBUTING.md | 43 +++++++++++++------------------------------ README.md | 14 +++++++++++--- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d5aec42..4c9412c2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,26 +1,16 @@ # How to Contribute -We'd love to accept your patches and contributions to this project. There are -just a few small guidelines you need to follow. +We'd love to accept your patches and contributions to this project. There are a few small guidelines you need to follow. ## Contributor License Agreement -Contributions to this project must be accompanied by a Contributor License -Agreement. You (or your employer) retain the copyright to your contribution; -this simply gives us permission to use and redistribute your contributions as -part of the project. Head over to to see -your current agreements on file or to sign a new one. +Contributions to this project must be accompanied by a Developer Certificate of Origin (DCO). You (or your employer) retain the copyright to your contribution; this gives us permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or to sign a new one. -You generally only need to submit a CLA once, so if you've already submitted one -(even if it was for a different project), you probably don't need to do it -again. +You only need to submit a DTO once, so if you've already submitted one (even if it was for a different project), you probably don't need to do it again. ## Code reviews -All submissions, including submissions by project members, require review. We -use GitHub pull requests for this purpose. Consult -[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more -information on using pull requests. +All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. ## Testing @@ -28,34 +18,27 @@ information on using pull requests. All pull requests should have an associated test to ensure foward compatibility. +> Make sure you have installed [Dapr](https://dapr.io/) before running unit tests, check out [Install Dapr CLI](https://docs.dapr.io/getting-started/install-dapr-cli/) for more details + To run an individual test, you can run a command such as the following: -``` +```sh npm run test -- -g 'loading function' ``` -### Conformance Tests - -To run the conformance tests, first install Go 1.16+, then run the tests: - -``` -npm run conformance -``` - ### Manual Testing -When developing a feature locally, you can install a local version of the Functions Framework -using `npm link`. First compile your local clone of the Functions Framework: +When developing a feature locally, you can install a local version of the Functions Framework using `npm link`. First compile your local clone of the Functions Framework: > You'll need to install typescript first by: `npm install typescript --save-dev` -``` +```sh npx tsc ``` Then link the Functions Framework using `npm link`. -``` +```sh npm link ``` @@ -65,7 +48,7 @@ You can then run the Functions Framework locally using `functions-framework`. This module is published using Release Please. When you merge a release PR, the npm package will be automatically published. -```shell +```sh # Login to npm registry, contact repo admin for https://www.npmjs.com/ user name and password npm login # First run a dry run to find out errors @@ -73,6 +56,7 @@ npm publish ./ --access public --dry-run # Then publish the package npm publish --access public ``` + ### Reverting a Publish If the release process fails, you can revert the publish by running the following (i.e. unpublishing `1.10.0`): @@ -101,5 +85,4 @@ The docs will be generated in [`docs/generated/`](docs/generated/). ## Community Guidelines -This project follows [Google's Open Source Community -Guidelines](https://opensource.google.com/conduct/). +This project follows [CNCF openness guidelines](https://www.cncf.io/blog/2019/06/11/cncf-openness-guidelines/). diff --git a/README.md b/README.md index 8d526053..ee6b1d02 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ ignored. | ------------------ | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `--port` | `PORT` | The port on which the Functions Framework listens for requests. Default: `8080` | | `--target` | `FUNCTION_TARGET` | The name of the exported function to be invoked in response to requests. Default: `function` | -| `--signature-type` | `FUNCTION_SIGNATURE_TYPE` | The signature used when writing your function. Controls unmarshalling rules and determines which arguments are used to invoke your function. Default: `http`; accepted values: `http` or `event` or `cloudevent` | +| `--signature-type` | `FUNCTION_SIGNATURE_TYPE` | The signature used when writing your function. Controls unmarshalling rules and determines which arguments are used to invoke your function. Default: `http`; accepted values: `http` or `event` or `cloudevent` or `openfunction` | | `--source` | `FUNCTION_SOURCE` | The path to the directory of your function. Default: `cwd` (the current working directory) | You can set command-line flags in your `package.json` via the `start` script. @@ -231,8 +231,16 @@ async function tryKnativeAsync(ctx, data) { // Send output in async way via Dapr await ctx.send(data); - // Use `response` method to prepare data as HTTP response - return ctx.response(data); + // Use `ctx.res` object to deal with HTTP response + ctx.res.send(data); +``` + +Remember that you also need set command-line flags `--signature-type=openfunction`, for example in your `package.json` via the `start` script: + +```js + "scripts": { + "start": "functions-framework --signature-type=openfunction --target=tryKnativeAsync" + } ``` ### Google Cloud Functions From a59f3ec234c445b2979c0484abad2b2cf3cb758c Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 18 May 2022 14:58:42 +0800 Subject: [PATCH 11/42] =?UTF-8?q?=F0=9F=91=B7=20ci:=20add=20reviewdog=20ac?= =?UTF-8?q?tion=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/workflows/reviewdog.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/reviewdog.yml diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml new file mode 100644 index 00000000..c1bf7128 --- /dev/null +++ b/.github/workflows/reviewdog.yml @@ -0,0 +1,20 @@ +name: reviewdog +on: [pull_request] +jobs: + tsc: + name: runner / tsc + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: EPMatt/reviewdog-action-tsc@v1 + with: + # Change reviewdog reporter if you need + # [github-pr-check,github-check,github-pr-review]. + # More about reviewdog reporters at + # https://github.com/reviewdog/reviewdog#reporters + reporter: github-pr-review + # Change reporter level if you need + # [info,warning,error]. + # More about reviewdog reporter level at + # https://github.com/reviewdog/reviewdog#reporters + level: warning From 4db797afc81ebc53894b808c08ed0623c64cc5ff Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 18 May 2022 16:18:33 +0800 Subject: [PATCH 12/42] =?UTF-8?q?=F0=9F=91=B7=20ci:=20add=20dependabot=20a?= =?UTF-8?q?nd=20release-drafter=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/dependabot.yml | 18 +++++++++++++++ .github/release-drafter.yml | 44 +++++++++++++++++++++++++++++++++++++ .github/workflows/draft.yml | 14 ++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/draft.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..ff9f20ba --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + - package-ecosystem: docker + directory: '/' + schedule: + interval: daily + open-pull-requests-limit: 10 + - package-ecosystem: npm + directory: '/' + schedule: + interval: daily + open-pull-requests-limit: 10 + labels: + - 'type: dependencies' + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'daily' diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000..15fad986 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,44 @@ +name-template: 'v$RESOLVED_VERSION' +tag-template: 'v$RESOLVED_VERSION' +template: | + # What's Changed + + $CHANGES + + **Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION + +categories: + - title: 'đŸ’Ĩ Breaking' + label: 'type: breaking' + - title: '✨ New' + label: 'type: feature' + - title: '🐛 Bug Fixes' + label: 'type: bug' + - title: 'đŸ—ī¸ Maintenance' + label: 'type: maintenance' + - title: '👷 CI/CD' + label: 'type: cicd' + - title: '📝 Documentation' + label: 'type: docs' + - title: 'Other changes' + - title: 'đŸˇī¸ Dependency Updates' + label: 'type: dependencies' + collapse-after: 5 + +version-resolver: + major: + labels: + - 'type: breaking' + minor: + labels: + - 'type: feature' + patch: + labels: + - 'type: bug' + - 'type: maintenance' + - 'type: docs' + - 'type: dependencies' + - 'type: cicd' + +exclude-labels: + - 'skip-changelog' diff --git a/.github/workflows/draft.yml b/.github/workflows/draft.yml new file mode 100644 index 00000000..cf6d8307 --- /dev/null +++ b/.github/workflows/draft.yml @@ -0,0 +1,14 @@ +name: Release Drafter + +on: + push: + branches: + - master + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + - uses: release-drafter/release-drafter@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From dddcb1a5b79fdaa99927a536183575f5a4c00685 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:26:40 +0000 Subject: [PATCH 13/42] chore(deps): bump actions/checkout from 2 to 3 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docs.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/reviewdog.yml | 2 +- .github/workflows/unit.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 20b27141..c09a5d81 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,7 +8,7 @@ jobs: docs: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v2 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ab550247..9601f85d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,7 +8,7 @@ jobs: lint: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v2 - name: Install dependencies diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index c1bf7128..acdd08e4 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -5,7 +5,7 @@ jobs: name: runner / tsc runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: EPMatt/reviewdog-action-tsc@v1 with: # Change reviewdog reporter if you need diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index e4fbaa74..97fdb31b 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -13,7 +13,7 @@ jobs: runs-on: ${{ matrix.platform }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: From fcd27964fa32005ba72f21ec57e8ceaf9cf17014 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:27:11 +0000 Subject: [PATCH 14/42] chore(deps): bump dapr-client from 2.1.0 to 2.2.1 Bumps [dapr-client](https://github.com/dapr/js-sdk/tree/HEAD) from 2.1.0 to 2.2.1. - [Release notes](https://github.com/dapr/js-sdk/releases) - [Changelog](https://github.com/dapr/js-sdk/blob/master/CHANGELOG.md) - [Commits](https://github.com/dapr/js-sdk/commits/v2.2.1) --- updated-dependencies: - dependency-name: dapr-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..fabee44a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1911,9 +1911,9 @@ } }, "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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dapr-client/-/dapr-client-2.2.1.tgz", + "integrity": "sha512-IVvll7K/LVQmLT2HtRvIfXHPloEIA6wY9AoTn77Iwrr1ypFAjx9NBr17cWWcKVkYKJ5/TxkLmi375UdAOcsL9w==", "dependencies": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", @@ -9055,9 +9055,9 @@ "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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dapr-client/-/dapr-client-2.2.1.tgz", + "integrity": "sha512-IVvll7K/LVQmLT2HtRvIfXHPloEIA6wY9AoTn77Iwrr1ypFAjx9NBr17cWWcKVkYKJ5/TxkLmi375UdAOcsL9w==", "requires": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", From e01e5b84764701b6b35bb0d9805c7246e6bb030c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:27:23 +0000 Subject: [PATCH 15/42] chore(deps-dev): bump concurrently from 7.0.0 to 7.2.0 Bumps [concurrently](https://github.com/open-cli-tools/concurrently) from 7.0.0 to 7.2.0. - [Release notes](https://github.com/open-cli-tools/concurrently/releases) - [Commits](https://github.com/open-cli-tools/concurrently/compare/v7.0.0...v7.2.0) --- updated-dependencies: - dependency-name: concurrently dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 78 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..2fa4b857 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1711,19 +1711,20 @@ } }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.0.tgz", + "integrity": "sha512-4KIVY5HopDRhN3ndAgfFOLsMk1PZUPgghlgTMZ5Pb5aTrqYg86RcZaIZC2Cz+qpZ9DsX36WHGjvWnXPqdnblhw==", "dev": true, "dependencies": { "chalk": "^4.1.0", "date-fns": "^2.16.1", "lodash": "^4.17.21", "rxjs": "^6.6.3", + "shell-quote": "^1.7.3", "spawn-command": "^0.0.2-1", "supports-color": "^8.1.0", "tree-kill": "^1.2.2", - "yargs": "^16.2.0" + "yargs": "^17.3.1" }, "bin": { "concurrently": "dist/bin/concurrently.js" @@ -1808,6 +1809,33 @@ "node": ">=10" } }, + "node_modules/concurrently/node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -6309,6 +6337,12 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz", @@ -8902,19 +8936,20 @@ } }, "concurrently": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.0.0.tgz", - "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.0.tgz", + "integrity": "sha512-4KIVY5HopDRhN3ndAgfFOLsMk1PZUPgghlgTMZ5Pb5aTrqYg86RcZaIZC2Cz+qpZ9DsX36WHGjvWnXPqdnblhw==", "dev": true, "requires": { "chalk": "^4.1.0", "date-fns": "^2.16.1", "lodash": "^4.17.21", "rxjs": "^6.6.3", + "shell-quote": "^1.7.3", "spawn-command": "^0.0.2-1", "supports-color": "^8.1.0", "tree-kill": "^1.2.2", - "yargs": "^16.2.0" + "yargs": "^17.3.1" }, "dependencies": { "ansi-styles": { @@ -8976,6 +9011,27 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true } } }, @@ -12339,6 +12395,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, "shelljs": { "version": "0.8.5", "resolved": "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz", From bd559601f6df65ecb158ecd4665c942d5e3977f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:27:48 +0000 Subject: [PATCH 16/42] chore(deps): bump on-finished from 2.3.0 to 2.4.1 Bumps [on-finished](https://github.com/jshttp/on-finished) from 2.3.0 to 2.4.1. - [Release notes](https://github.com/jshttp/on-finished/releases) - [Changelog](https://github.com/jshttp/on-finished/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-finished/compare/v2.3.0...v2.4.1) --- updated-dependencies: - dependency-name: on-finished dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 88 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..6714ce02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1226,6 +1226,17 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", @@ -2816,6 +2827,17 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -3004,6 +3026,17 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5259,9 +5292,9 @@ } }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -6260,6 +6293,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, + "node_modules/send/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -8509,6 +8553,14 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -9708,6 +9760,14 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -9891,6 +9951,14 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -11550,9 +11618,9 @@ } }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -12296,6 +12364,14 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } } } }, From bdc6424179afb17f4664de3538ee4ba90cc379d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:28:15 +0000 Subject: [PATCH 17/42] chore(deps-dev): bump supertest from 6.1.6 to 6.2.3 Bumps [supertest](https://github.com/visionmedia/supertest) from 6.1.6 to 6.2.3. - [Release notes](https://github.com/visionmedia/supertest/releases) - [Commits](https://github.com/visionmedia/supertest/compare/v6.1.6...v6.2.3) --- updated-dependencies: - dependency-name: supertest dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 199 ++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 139 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..b4a874ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "pre-push": "^0.1.2", "shelljs": "^0.8.5", "sinon": "^12.0.0", - "supertest": "6.1.6", + "supertest": "6.2.3", "typescript": "^4.5.5", "wait-on": "^6.0.1" }, @@ -1112,6 +1112,12 @@ "node": ">=0.10.0" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1124,7 +1130,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "node_modules/available-typed-arrays": { @@ -2063,6 +2069,16 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -3064,9 +3080,9 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -3078,15 +3094,32 @@ } }, "node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", "dev": true, + "dependencies": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/formidable/node_modules/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3589,6 +3622,15 @@ "he": "bin/he" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -6180,9 +6222,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6644,26 +6686,25 @@ } }, "node_modules/superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . Thanks to @shadowgate15, @spence-s, and @niftylettuce. Superagent is sponsored by Forward Email at .", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz", + "integrity": "sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", + "mime": "^2.5.0", + "qs": "^6.10.3", "readable-stream": "^3.6.0", - "semver": "^7.3.2" + "semver": "^7.3.7" }, "engines": { - "node": ">= 7.0.0" + "node": ">=6.4.0 <13 || >=14" } }, "node_modules/superagent/node_modules/mime": { @@ -6679,9 +6720,9 @@ } }, "node_modules/superagent/node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, "dependencies": { "side-channel": "^1.0.4" @@ -6694,13 +6735,13 @@ } }, "node_modules/supertest": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz", - "integrity": "sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz", + "integrity": "sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^6.1.0" + "superagent": "^7.1.3" }, "engines": { "node": ">=6.0.0" @@ -8412,6 +8453,12 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -8421,7 +8468,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "available-typed-arrays": { @@ -9168,6 +9215,16 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -9937,9 +9994,9 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -9948,10 +10005,24 @@ } }, "formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "dev": true, + "requires": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, + "dependencies": { + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true + } + } }, "forwarded": { "version": "0.2.0", @@ -10321,6 +10392,12 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -12228,9 +12305,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -12596,22 +12673,22 @@ "dev": true }, "superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz", + "integrity": "sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==", "dev": true, "requires": { "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", + "mime": "^2.5.0", + "qs": "^6.10.3", "readable-stream": "^3.6.0", - "semver": "^7.3.2" + "semver": "^7.3.7" }, "dependencies": { "mime": { @@ -12621,9 +12698,9 @@ "dev": true }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -12632,13 +12709,13 @@ } }, "supertest": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz", - "integrity": "sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz", + "integrity": "sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^6.1.0" + "superagent": "^7.1.3" } }, "supports-color": { diff --git a/package.json b/package.json index 30af98c0..04f59cac 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "pre-push": "^0.1.2", "shelljs": "^0.8.5", "sinon": "^12.0.0", - "supertest": "6.1.6", + "supertest": "6.2.3", "typescript": "^4.5.5", "wait-on": "^6.0.1" } From 895e098af9af776d496127e055b7f075d25499d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:28:24 +0000 Subject: [PATCH 18/42] chore(deps): bump minimist from 1.2.5 to 1.2.6 Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..20ecdfb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4761,9 +4761,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -11182,9 +11182,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "4.1.0", From 24ccc50f8b4b3ee6db9b30d71ee1565ebb896782 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:29:06 +0000 Subject: [PATCH 19/42] chore(deps-dev): bump mocha from 9.1.2 to 10.0.0 Bumps [mocha](https://github.com/mochajs/mocha) from 9.1.2 to 10.0.0. - [Release notes](https://github.com/mochajs/mocha/releases) - [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md) - [Commits](https://github.com/mochajs/mocha/compare/v9.1.2...v10.0.0) --- updated-dependencies: - dependency-name: mocha dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 200 ++++++++++++++++++---------------------------- package.json | 2 +- 2 files changed, 77 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..c53e55ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "gts": "^3.1.0", - "mocha": "9.1.2", + "mocha": "10.0.0", "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.2", "shelljs": "^0.8.5", @@ -1518,10 +1518,16 @@ "dev": true }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3398,15 +3404,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, "node_modules/gts": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.0.tgz", @@ -4817,42 +4814,40 @@ } }, "node_modules/mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14.0.0" }, "funding": { "type": "opencollective", @@ -4865,29 +4860,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/mocha/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==", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "balanced-match": "^1.0.0" } }, - "node_modules/mocha/node_modules/debug/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/mocha/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4916,26 +4897,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4972,6 +4933,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5068,9 +5041,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -7325,9 +7298,9 @@ } }, "node_modules/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { @@ -8733,9 +8706,9 @@ "dev": true }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -10191,12 +10164,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "gts": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.0.tgz", @@ -11226,32 +11193,30 @@ } }, "mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -11263,21 +11228,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "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==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "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 - } + "balanced-match": "^1.0.0" } }, "escape-string-regexp": { @@ -11296,20 +11253,6 @@ "path-exists": "^4.0.0" } }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11334,6 +11277,15 @@ "p-locate": "^5.0.0" } }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -11408,9 +11360,9 @@ "dev": true }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "natural-compare": { @@ -13122,9 +13074,9 @@ "dev": true }, "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "wrap-ansi": { diff --git a/package.json b/package.json index 30af98c0..0d08c3ec 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "gts": "^3.1.0", - "mocha": "9.1.2", + "mocha": "10.0.0", "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.2", "shelljs": "^0.8.5", From 893f22724845ae3e4b4bae1aab44b116bfa52a0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 08:29:33 +0000 Subject: [PATCH 20/42] chore(deps-dev): bump aedes from 0.46.3 to 0.47.0 Bumps [aedes](https://github.com/moscajs/aedes) from 0.46.3 to 0.47.0. - [Release notes](https://github.com/moscajs/aedes/releases) - [Commits](https://github.com/moscajs/aedes/compare/v0.46.3...v0.47.0) --- updated-dependencies: - dependency-name: aedes dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 215 +++++++++++----------------------------------- package.json | 2 +- 2 files changed, 51 insertions(+), 166 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..c5ca319c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "@types/shelljs": "^0.8.11", "@types/sinon": "^10.0.0", "@types/supertest": "2.0.11", - "aedes": "^0.46.3", + "aedes": "^0.47.0", "concurrently": "^7.0.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", @@ -927,65 +927,60 @@ } }, "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==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.47.0.tgz", + "integrity": "sha512-ERe7jMI87KlZVj+RWDEEQMTGJ10Nr68Jx5QA+/glBPmLpIoyB1sPv5xgY8FJ/zrnyj4RN04Sv9N6HsS8EmNpNg==", "dev": true, "dependencies": { - "aedes-packet": "^2.3.1", - "aedes-persistence": "^8.1.3", - "bulk-write-stream": "^2.0.1", + "aedes-packet": "^3.0.0", + "aedes-persistence": "^9.1.1", "end-of-stream": "^1.4.4", "fastfall": "^1.5.1", "fastparallel": "^2.4.1", "fastseries": "^2.0.0", - "hyperid": "^3.0.0", + "hyperid": "^3.0.1", "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": ">=14" } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aedes-packet/-/aedes-packet-3.0.0.tgz", + "integrity": "sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==", "dev": true, "dependencies": { - "mqtt-packet": "^6.3.0" + "mqtt-packet": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14" } }, - "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==", + "node_modules/aedes-persistence": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-9.1.2.tgz", + "integrity": "sha512-2Wlr5pwIK0eQOkiTwb8ZF6C20s8UPUlnsJ4kXYePZ3JlQl0NbBA176mzM8wY294BJ5wybpNc9P5XEQxqadRNcQ==", "dev": true, "dependencies": { - "bl": "^4.0.2", - "debug": "^4.1.1", - "process-nextick-args": "^2.0.1" + "aedes-packet": "^3.0.0", + "qlobber": "^7.0.0" + }, + "engines": { + "node": ">=14" } }, - "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==", + "node_modules/aedes-persistence/node_modules/qlobber": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-7.0.0.tgz", + "integrity": "sha512-hQbAIJbrCMLWpjr8ozRmYDdMmU2tMu1bumL3LNxdFaF2Duq5EqcLD59+/F6hyO4ykJMccKhd65wkMRgr7UhgHw==", "dev": true, - "dependencies": { - "aedes-packet": "^2.3.1", - "from2": "^2.3.0", - "qlobber": "^5.0.3" - }, "engines": { - "node": ">=10" + "node": ">= 14" } }, "node_modules/ajv": { @@ -1391,16 +1386,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "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", @@ -3103,46 +3088,6 @@ "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", @@ -8266,58 +8211,50 @@ "requires": {} }, "aedes": { - "version": "0.46.3", - "resolved": "https://registry.npmmirror.com/aedes/-/aedes-0.46.3.tgz", - "integrity": "sha512-i3B+H74uNRhlqcs/JdrMp7e3daz4Cwls0x4yLcfjGXz2tIwnxhF6od4m86O6yyNdz/Gg3jfY3q0sc/Cz8qzg6g==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.47.0.tgz", + "integrity": "sha512-ERe7jMI87KlZVj+RWDEEQMTGJ10Nr68Jx5QA+/glBPmLpIoyB1sPv5xgY8FJ/zrnyj4RN04Sv9N6HsS8EmNpNg==", "dev": true, "requires": { - "aedes-packet": "^2.3.1", - "aedes-persistence": "^8.1.3", - "bulk-write-stream": "^2.0.1", + "aedes-packet": "^3.0.0", + "aedes-persistence": "^9.1.1", "end-of-stream": "^1.4.4", "fastfall": "^1.5.1", "fastparallel": "^2.4.1", "fastseries": "^2.0.0", - "hyperid": "^3.0.0", + "hyperid": "^3.0.1", "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aedes-packet/-/aedes-packet-3.0.0.tgz", + "integrity": "sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==", "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" - } - } + "mqtt-packet": "^7.0.0" } }, "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==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-9.1.2.tgz", + "integrity": "sha512-2Wlr5pwIK0eQOkiTwb8ZF6C20s8UPUlnsJ4kXYePZ3JlQl0NbBA176mzM8wY294BJ5wybpNc9P5XEQxqadRNcQ==", "dev": true, "requires": { - "aedes-packet": "^2.3.1", - "from2": "^2.3.0", - "qlobber": "^5.0.3" + "aedes-packet": "^3.0.0", + "qlobber": "^7.0.0" + }, + "dependencies": { + "qlobber": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-7.0.0.tgz", + "integrity": "sha512-hQbAIJbrCMLWpjr8ozRmYDdMmU2tMu1bumL3LNxdFaF2Duq5EqcLD59+/F6hyO4ykJMccKhd65wkMRgr7UhgHw==", + "dev": true + } } }, "ajv": { @@ -8637,16 +8574,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "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", @@ -9963,48 +9890,6 @@ "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", diff --git a/package.json b/package.json index 30af98c0..fcaaf8b0 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@types/shelljs": "^0.8.11", "@types/sinon": "^10.0.0", "@types/supertest": "2.0.11", - "aedes": "^0.46.3", + "aedes": "^0.47.0", "concurrently": "^7.0.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", From 33534bde8ac7ad92950f6bc47ead5f879131ce4e Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 18 May 2022 16:45:19 +0800 Subject: [PATCH 21/42] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20remove=20macos?= =?UTF-8?q?=20for=20unstable=20docker=20setup=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/workflows/unit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index e4fbaa74..5a7d527c 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - platform: [ubuntu-latest, macos-latest] + platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: - name: Checkout From 246285193d7fd717612139aeecf9904f342bfe28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 09:06:41 +0000 Subject: [PATCH 22/42] chore(deps): bump actions/setup-node from 2 to 3 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 2 to 3. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docs.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/unit.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index c09a5d81..d941c706 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: '14' - name: Install dependencies diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9601f85d..a09f2ce5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 - name: Install dependencies run: npm install - name: Build TypeScript project diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index 2fc95f0f..4ef0738e 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -15,7 +15,7 @@ jobs: - name: Checkout uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Install Dapr From 16fb75e3a4942f8fbf11e257f216ba8ed00046e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 09:10:48 +0000 Subject: [PATCH 23/42] chore(deps): bump cloudevents from 5.3.2 to 6.0.1 Bumps [cloudevents](https://github.com/cloudevents/sdk-javascript) from 5.3.2 to 6.0.1. - [Release notes](https://github.com/cloudevents/sdk-javascript/releases) - [Changelog](https://github.com/cloudevents/sdk-javascript/blob/main/CHANGELOG.md) - [Commits](https://github.com/cloudevents/sdk-javascript/compare/v5.3.2...v6.0.1) --- updated-dependencies: - dependency-name: cloudevents dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 140 +++++++++++++++++++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 121 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index f98880d9..a1044aeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "body-parser": "^1.18.3", - "cloudevents": "^5.3.2", + "cloudevents": "^6.0.1", "dapr-client": "^2.1.0", "debug": "^4.3.4", "express": "^4.16.4", @@ -1003,6 +1003,42 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -1603,15 +1639,36 @@ } }, "node_modules/cloudevents": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-5.3.2.tgz", - "integrity": "sha512-ZjEFjx0BJnio8SED1TzD7GHA118zCk04Mz6aDMMii+4/ZvX5LPgn1D4lT5Jj7HodCbdeRS6dX88unH06Qc3mkA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.1.tgz", + "integrity": "sha512-6Y2EOQKsEEciSeIPL8ENob2LcFSt/r0iftTefl3IanSVr2LyvXfbEdD5+pvufVDFdf6OVijvtl7UFx/0voMOsw==", "dependencies": { - "ajv": "~6.12.3", + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", "util": "^0.12.4", - "uuid": "~8.3.0" + "uuid": "^8.3.2" } }, + "node_modules/cloudevents/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/cloudevents/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1911,9 +1968,9 @@ } }, "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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dapr-client/-/dapr-client-2.2.1.tgz", + "integrity": "sha512-IVvll7K/LVQmLT2HtRvIfXHPloEIA6wY9AoTn77Iwrr1ypFAjx9NBr17cWWcKVkYKJ5/TxkLmi375UdAOcsL9w==", "dependencies": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", @@ -6013,7 +6070,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8331,6 +8387,32 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -8801,13 +8883,32 @@ } }, "cloudevents": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-5.3.2.tgz", - "integrity": "sha512-ZjEFjx0BJnio8SED1TzD7GHA118zCk04Mz6aDMMii+4/ZvX5LPgn1D4lT5Jj7HodCbdeRS6dX88unH06Qc3mkA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.1.tgz", + "integrity": "sha512-6Y2EOQKsEEciSeIPL8ENob2LcFSt/r0iftTefl3IanSVr2LyvXfbEdD5+pvufVDFdf6OVijvtl7UFx/0voMOsw==", "requires": { - "ajv": "~6.12.3", + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", "util": "^0.12.4", - "uuid": "~8.3.0" + "uuid": "^8.3.2" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } } }, "color-convert": { @@ -9055,9 +9156,9 @@ "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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dapr-client/-/dapr-client-2.2.1.tgz", + "integrity": "sha512-IVvll7K/LVQmLT2HtRvIfXHPloEIA6wY9AoTn77Iwrr1ypFAjx9NBr17cWWcKVkYKJ5/TxkLmi375UdAOcsL9w==", "requires": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", @@ -12109,8 +12210,7 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "resolve": { "version": "1.20.0", diff --git a/package.json b/package.json index 30af98c0..d1df293a 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "body-parser": "^1.18.3", - "cloudevents": "^5.3.2", + "cloudevents": "^6.0.1", "dapr-client": "^2.1.0", "debug": "^4.3.4", "express": "^4.16.4", From f4f4da74a448d7609a104b972852c8fbc98964d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 09:25:37 +0000 Subject: [PATCH 24/42] chore(deps): bump express from 4.17.1 to 4.18.1 Bumps [express](https://github.com/expressjs/express) from 4.17.1 to 4.18.1. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.17.1...4.18.1) --- updated-dependencies: - dependency-name: express dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 612 +++++++++++++++++++++------------------------- 1 file changed, 284 insertions(+), 328 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e3d5fea..b9eafa7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -894,12 +894,12 @@ } }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -1193,30 +1193,27 @@ "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", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/debug": { @@ -1232,17 +1229,6 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", @@ -1419,9 +1405,9 @@ } }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -1871,16 +1857,35 @@ } }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -1890,9 +1895,9 @@ } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -2096,17 +2101,21 @@ } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/dezalgo": { "version": "1.0.3", @@ -2798,37 +2807,38 @@ } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -2871,16 +2881,24 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/external-editor": { "version": "3.1.0", @@ -3041,16 +3059,16 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -3059,7 +3077,7 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" @@ -3067,19 +3085,8 @@ }, "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/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/find-up": { "version": "4.1.0", @@ -3704,18 +3711,18 @@ "dev": true }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-terminator": { @@ -3848,9 +3855,9 @@ } }, "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", @@ -5198,9 +5205,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -5874,11 +5881,17 @@ } }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/queue-microtask": { @@ -5928,12 +5941,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -6323,23 +6336,23 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -6347,7 +6360,7 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" @@ -6355,24 +6368,13 @@ }, "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==" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { "version": "6.0.0", @@ -6384,23 +6386,23 @@ } }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -6632,11 +6634,11 @@ "dev": true }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/string_decoder": { @@ -6797,21 +6799,6 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/supertest": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz", @@ -6943,9 +6930,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -8363,12 +8350,12 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -8595,31 +8582,25 @@ "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", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -8634,14 +8615,6 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } } } }, @@ -8781,9 +8754,9 @@ } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cacheable-request": { "version": "6.1.0", @@ -9149,11 +9122,18 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "content-type": { @@ -9162,9 +9142,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", @@ -9314,14 +9294,14 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "dezalgo": { "version": "1.0.3", @@ -9825,37 +9805,38 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -9874,13 +9855,10 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -10039,22 +10017,22 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" @@ -10062,16 +10040,8 @@ }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -10534,15 +10504,15 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-terminator": { @@ -10647,9 +10617,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "2.0.0", @@ -11627,9 +11597,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nise": { "version": "5.1.0", @@ -12139,9 +12109,12 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } }, "queue-microtask": { "version": "1.2.3", @@ -12170,12 +12143,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -12459,28 +12432,28 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" @@ -12488,23 +12461,15 @@ "dependencies": { "ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -12518,20 +12483,20 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "2.0.0", @@ -12721,9 +12686,9 @@ "dev": true }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "string_decoder": { "version": "1.3.0", @@ -12834,15 +12799,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } } } }, @@ -12954,9 +12910,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tr46": { "version": "0.0.3", From f93a64339f47ad3955d28418205efa50147fdf99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 09:27:16 +0000 Subject: [PATCH 25/42] chore(deps-dev): bump @types/lodash from 4.14.179 to 4.14.182 Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.14.179 to 4.14.182. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash) --- updated-dependencies: - dependency-name: "@types/lodash" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e3d5fea..7e3d2da1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -592,9 +592,9 @@ "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==", + "version": "4.14.182", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", "dev": true }, "node_modules/@types/long": { @@ -4864,9 +4864,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -8138,9 +8138,9 @@ "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==", + "version": "4.14.182", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", "dev": true }, "@types/long": { @@ -11383,9 +11383,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "4.1.0", From 881843441fb8f464ec03dfd4fe5d2d1d3ce0ab7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 09:27:47 +0000 Subject: [PATCH 26/42] chore(deps-dev): bump sinon from 12.0.1 to 14.0.0 Bumps [sinon](https://github.com/sinonjs/sinon) from 12.0.1 to 14.0.0. - [Release notes](https://github.com/sinonjs/sinon/releases) - [Changelog](https://github.com/sinonjs/sinon/blob/main/docs/changelog.md) - [Commits](https://github.com/sinonjs/sinon/compare/v12.0.1...v14.0.0) --- updated-dependencies: - dependency-name: sinon dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 70 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfc533ac..336299fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.2", "shelljs": "^0.8.5", - "sinon": "^12.0.0", + "sinon": "^14.0.0", "supertest": "6.2.3", "typescript": "^4.5.5", "wait-on": "^6.0.1" @@ -484,9 +484,9 @@ } }, "node_modules/@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.6.0", @@ -5206,13 +5206,13 @@ } }, "node_modules/nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -6466,16 +6466,16 @@ "dev": true }, "node_modules/sinon": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", - "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", + "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^8.1.0", - "@sinonjs/samsam": "^6.0.2", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", "diff": "^5.0.0", - "nise": "^5.1.0", + "nise": "^5.1.1", "supports-color": "^7.2.0" }, "funding": { @@ -6484,9 +6484,9 @@ } }, "node_modules/sinon/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" @@ -8033,9 +8033,9 @@ } }, "@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", @@ -11632,13 +11632,13 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -12582,23 +12582,23 @@ "dev": true }, "sinon": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", - "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", + "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^8.1.0", - "@sinonjs/samsam": "^6.0.2", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", "diff": "^5.0.0", - "nise": "^5.1.0", + "nise": "^5.1.1", "supports-color": "^7.2.0" }, "dependencies": { "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" diff --git a/package.json b/package.json index 04f59cac..58cc4fd1 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.2", "shelljs": "^0.8.5", - "sinon": "^12.0.0", + "sinon": "^14.0.0", "supertest": "6.2.3", "typescript": "^4.5.5", "wait-on": "^6.0.1" From 1982578b90d80f7c09542cd8718824b64c6f9d0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 May 2022 09:32:10 +0000 Subject: [PATCH 27/42] chore(deps-dev): bump typescript from 4.5.5 to 4.6.4 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.5.5 to 4.6.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.5.5...v4.6.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8adaa0e..254dadca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -246,6 +246,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@microsoft/tsdoc": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", @@ -7043,9 +7056,9 @@ } }, "node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7769,6 +7782,12 @@ "requires": { "path-parse": "^1.0.6" } + }, + "typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true } } }, @@ -13002,9 +13021,9 @@ } }, "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true }, "unbox-primitive": { From cab95ca13b29babfe09d5446d361d602329405b5 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 18 May 2022 19:13:57 +0800 Subject: [PATCH 28/42] =?UTF-8?q?=F0=9F=90=9B=20fix(test/conformance):=20s?= =?UTF-8?q?hould=20use=20`ctx.res`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- test/conformance/function.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/conformance/function.js b/test/conformance/function.js index cc3e71cd..08da0f73 100644 --- a/test/conformance/function.js +++ b/test/conformance/function.js @@ -47,7 +47,7 @@ function writeJson(content) { async function tryKnativeAsync(ctx, data) { debug('✅ Function should receive request: %o', data); await ctx.send(data); - return ctx.response(data); + ctx.res.send(data); } function tryAsync(ctx, data) { From b056ba9ab4467e80c292604b0f72e42eddb86f7c Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 18 May 2022 19:35:06 +0800 Subject: [PATCH 29/42] =?UTF-8?q?=F0=9F=93=9D=20doc(api):=20upgrade=20api-?= =?UTF-8?q?extractor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/generated/api.json | 81 ++++++++----- package-lock.json | 254 ++++++++++++++++++---------------------- package.json | 2 +- 3 files changed, 167 insertions(+), 170 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index 3b526f88..cf716392 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,8 +1,8 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.19.4", - "schemaVersion": 1004, + "toolVersion": "7.24.0", + "schemaVersion": 1005, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", @@ -156,7 +156,8 @@ "@betaDocumentation": true, "@internalRemarks": true, "@preapproved": true - } + }, + "reportUnsupportedHtmlElements": false } }, "kind": "Package", @@ -276,7 +277,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 3 - } + }, + "isOptional": false } ] } @@ -369,14 +371,16 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 3 - } + }, + "isOptional": false }, { "parameterName": "callback", "parameterTypeTokenRange": { "startIndex": 4, "endIndex": 5 - } + }, + "isOptional": false } ] } @@ -653,7 +657,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ], "name": "IsAsyncRuntime" @@ -699,7 +704,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ], "name": "IsBindingComponent" @@ -745,7 +751,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ], "name": "IsKnativeRuntime" @@ -791,7 +798,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ], "name": "IsPubSubComponent" @@ -901,14 +909,16 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false }, { "parameterName": "context", "parameterTypeTokenRange": { "startIndex": 3, "endIndex": 4 - } + }, + "isOptional": false } ] } @@ -984,21 +994,24 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false }, { "parameterName": "context", "parameterTypeTokenRange": { "startIndex": 3, "endIndex": 4 - } + }, + "isOptional": false }, { "parameterName": "callback", "parameterTypeTokenRange": { "startIndex": 5, "endIndex": 6 - } + }, + "isOptional": false } ] } @@ -1192,14 +1205,16 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false }, { "parameterName": "res", "parameterTypeTokenRange": { "startIndex": 3, "endIndex": 4 - } + }, + "isOptional": false } ] } @@ -1469,14 +1484,16 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false }, { "parameterName": "data", "parameterTypeTokenRange": { "startIndex": 3, "endIndex": 4 - } + }, + "isOptional": false } ] } @@ -1535,7 +1552,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ] } @@ -1961,7 +1979,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ] }, @@ -2035,7 +2054,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ], "name": "Parse" @@ -2082,7 +2102,8 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false } ], "name": "ProxyContext" @@ -2240,14 +2261,16 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false }, { "parameterName": "output", "parameterTypeTokenRange": { "startIndex": 3, "endIndex": 4 - } + }, + "isOptional": true } ], "name": "send" @@ -2302,14 +2325,16 @@ "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "isOptional": false }, { "parameterName": "res", "parameterTypeTokenRange": { "startIndex": 3, "endIndex": 4 - } + }, + "isOptional": true } ], "name": "setTrigger" @@ -2425,7 +2450,7 @@ "extendsTokenRanges": [ { "startIndex": 1, - "endIndex": 3 + "endIndex": 2 } ] }, diff --git a/package-lock.json b/package-lock.json index 3ff68498..9fcec377 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "functions-framework-nodejs": "build/src/main.js" }, "devDependencies": { - "@microsoft/api-extractor": "^7.18.20", + "@microsoft/api-extractor": "^7.24.0", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", @@ -201,37 +201,37 @@ "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", - "integrity": "sha512-iehC6YA3DGJvxTUaK7HUtQmP6hAQU07+Q/OR8TG4dVR6KpqCi9UPEVk8AgCvQkiK+6FbVEFQTx0qLuYk4EeuHg==", + "version": "7.24.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.24.0.tgz", + "integrity": "sha512-cC5Vcu3N2OJh1G5v136JYtE4QQtQYq6mLiL8YXzFgu8aoq8T88kzq3/TxlihJvqGnrD96pf4PjS2Yg8RNYTQYw==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.15.3", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", + "@microsoft/api-extractor-model": "7.17.3", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rig-package": "0.3.11", + "@rushstack/ts-command-line": "4.11.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.5.2" + "typescript": "~4.6.3" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.3.tgz", - "integrity": "sha512-NkSjolmSI7NGvbdz0Y7kjQfdpD+j9E5CwXTxEyjDqxd10MI7GXV8DnAsQ57GFJcgHKgTjf2aUnYfMJ9w3aMicw==", + "version": "7.17.3", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.17.3.tgz", + "integrity": "sha512-ETslFxVEZTEK6mrOARxM34Ll2W/5H2aTk9Pe9dxsMCnthE8O/CaStV4WZAGsvvZKyjelSWgPVYGowxGVnwOMlQ==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0" + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.45.5" } }, "node_modules/@microsoft/api-extractor/node_modules/resolve": { @@ -246,32 +246,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "version": "0.16.1", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", + "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc": "0.14.1", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" @@ -279,15 +266,12 @@ }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "dependencies": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@nodelib/fs.scandir": { @@ -380,9 +364,9 @@ "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", - "integrity": "sha512-YMuIJl19vQT1+g/OU9mLY6T5ZBT9uDlmeXExDQACpGuxTJW+LHNbk/lRX+eCApQI2eLBlaL4U68r3kZlqwbdmw==", + "version": "3.45.5", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", "dev": true, "dependencies": { "@types/node": "12.20.24", @@ -398,26 +382,23 @@ }, "node_modules/@rushstack/node-core-library/node_modules/@types/node": { "version": "12.20.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-12.20.24.tgz", "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", "dev": true }, "node_modules/@rushstack/node-core-library/node_modules/resolve": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "dependencies": { "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", + "version": "0.3.11", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", "dev": true, "dependencies": { "resolve": "~1.17.0", @@ -426,20 +407,17 @@ }, "node_modules/@rushstack/rig-package/node_modules/resolve": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "dependencies": { "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", + "version": "4.11.0", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.11.0.tgz", + "integrity": "sha512-ptG9L0mjvJ5QtK11GsAFY+jGfsnqHDS6CY6Yw1xT7a9bhjfNYnf6UPwjV+pF6UgiucfNcMDNW9lkDLxvZKKxMg==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -527,7 +505,7 @@ }, "node_modules/@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "resolved": "https://registry.npmmirror.com/@types/argparse/-/argparse-1.0.38.tgz", "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, @@ -1691,7 +1669,7 @@ }, "node_modules/colors": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "resolved": "https://registry.npmmirror.com/colors/-/colors-1.2.5.tgz", "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true, "engines": { @@ -1712,7 +1690,7 @@ }, "node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true @@ -3267,7 +3245,7 @@ }, "node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "dependencies": { @@ -3831,7 +3809,7 @@ }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "resolved": "https://registry.npmmirror.com/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, "engines": { @@ -4372,8 +4350,8 @@ }, "node_modules/jju": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "resolved": "https://registry.npmmirror.com/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "node_modules/joi": { @@ -4446,8 +4424,8 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -4536,8 +4514,8 @@ }, "node_modules/lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, "node_modules/lodash.merge": { @@ -6659,7 +6637,7 @@ }, "node_modules/string-argv": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true, "engines": { @@ -6879,8 +6857,8 @@ }, "node_modules/timsort": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", "dev": true }, "node_modules/tmp": { @@ -7084,7 +7062,7 @@ }, "node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { @@ -7284,7 +7262,7 @@ }, "node_modules/validator": { "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "resolved": "https://registry.npmmirror.com/validator/-/validator-13.7.0.tgz", "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "dev": true, "engines": { @@ -7604,9 +7582,9 @@ } }, "node_modules/z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", "dev": true, "dependencies": { "lodash.get": "^4.4.2", @@ -7620,7 +7598,7 @@ "node": ">=8.0.0" }, "optionalDependencies": { - "commander": "^2.7.1" + "commander": "^2.20.3" } } }, @@ -7743,23 +7721,23 @@ } }, "@microsoft/api-extractor": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.4.tgz", - "integrity": "sha512-iehC6YA3DGJvxTUaK7HUtQmP6hAQU07+Q/OR8TG4dVR6KpqCi9UPEVk8AgCvQkiK+6FbVEFQTx0qLuYk4EeuHg==", + "version": "7.24.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.24.0.tgz", + "integrity": "sha512-cC5Vcu3N2OJh1G5v136JYtE4QQtQYq6mLiL8YXzFgu8aoq8T88kzq3/TxlihJvqGnrD96pf4PjS2Yg8RNYTQYw==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.15.3", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", + "@microsoft/api-extractor-model": "7.17.3", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rig-package": "0.3.11", + "@rushstack/ts-command-line": "4.11.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.5.2" + "typescript": "~4.6.3" }, "dependencies": { "resolve": { @@ -7770,39 +7748,33 @@ "requires": { "path-parse": "^1.0.6" } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.3.tgz", - "integrity": "sha512-NkSjolmSI7NGvbdz0Y7kjQfdpD+j9E5CwXTxEyjDqxd10MI7GXV8DnAsQ57GFJcgHKgTjf2aUnYfMJ9w3aMicw==", + "version": "7.17.3", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.17.3.tgz", + "integrity": "sha512-ETslFxVEZTEK6mrOARxM34Ll2W/5H2aTk9Pe9dxsMCnthE8O/CaStV4WZAGsvvZKyjelSWgPVYGowxGVnwOMlQ==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.45.0" + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.45.5" } }, "@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", "dev": true }, "@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "version": "0.16.1", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", + "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc": "0.14.1", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" @@ -7810,7 +7782,7 @@ "dependencies": { "resolve": { "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { @@ -7901,9 +7873,9 @@ "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", - "integrity": "sha512-YMuIJl19vQT1+g/OU9mLY6T5ZBT9uDlmeXExDQACpGuxTJW+LHNbk/lRX+eCApQI2eLBlaL4U68r3kZlqwbdmw==", + "version": "3.45.5", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", "dev": true, "requires": { "@types/node": "12.20.24", @@ -7919,13 +7891,13 @@ "dependencies": { "@types/node": { "version": "12.20.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-12.20.24.tgz", "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", "dev": true }, "resolve": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { @@ -7935,9 +7907,9 @@ } }, "@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", + "version": "0.3.11", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", "dev": true, "requires": { "resolve": "~1.17.0", @@ -7946,7 +7918,7 @@ "dependencies": { "resolve": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { @@ -7956,9 +7928,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", + "version": "4.11.0", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.11.0.tgz", + "integrity": "sha512-ptG9L0mjvJ5QtK11GsAFY+jGfsnqHDS6CY6Yw1xT7a9bhjfNYnf6UPwjV+pF6UgiucfNcMDNW9lkDLxvZKKxMg==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -8040,7 +8012,7 @@ }, "@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "resolved": "https://registry.npmmirror.com/@types/argparse/-/argparse-1.0.38.tgz", "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, @@ -8951,7 +8923,7 @@ }, "colors": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "resolved": "https://registry.npmmirror.com/colors/-/colors-1.2.5.tgz", "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true }, @@ -8966,7 +8938,7 @@ }, "commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true @@ -10150,7 +10122,7 @@ }, "fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { @@ -10562,7 +10534,7 @@ }, "import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "resolved": "https://registry.npmmirror.com/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true }, @@ -10931,8 +10903,8 @@ }, "jju": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "resolved": "https://registry.npmmirror.com/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "joi": { @@ -10996,8 +10968,8 @@ }, "jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -11074,8 +11046,8 @@ }, "lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, "lodash.merge": { @@ -12665,7 +12637,7 @@ }, "string-argv": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, @@ -12837,8 +12809,8 @@ }, "timsort": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", "dev": true }, "tmp": { @@ -12989,7 +12961,7 @@ }, "universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, @@ -13146,7 +13118,7 @@ }, "validator": { "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "resolved": "https://registry.npmmirror.com/validator/-/validator-13.7.0.tgz", "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "dev": true }, @@ -13385,12 +13357,12 @@ "dev": true }, "z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", "dev": true, "requires": { - "commander": "^2.7.1", + "commander": "^2.20.3", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", "validator": "^13.7.0" diff --git a/package.json b/package.json index 0160ac57..63b3b64c 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "author": "OpenFunction", "license": "Apache-2.0", "devDependencies": { - "@microsoft/api-extractor": "^7.18.20", + "@microsoft/api-extractor": "^7.24.0", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", From 5c6ed6a1a5d49ef86af9b0e54d5f4f59bcfab769 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 May 2022 03:48:07 +0000 Subject: [PATCH 30/42] chore(deps-dev): bump @types/mocha from 9.0.0 to 9.1.1 Bumps [@types/mocha](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mocha) from 9.0.0 to 9.1.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/mocha) --- updated-dependencies: - dependency-name: "@types/mocha" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fcec377..9071e4b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "@types/express": "4.17.13", "@types/lodash": "^4.14.179", "@types/minimist": "1.2.2", - "@types/mocha": "9.0.0", + "@types/mocha": "9.1.1", "@types/node": "14.18.11", "@types/on-finished": "2.3.1", "@types/semver": "^7.3.6", @@ -612,9 +612,9 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, "node_modules/@types/ms": { @@ -8119,9 +8119,9 @@ "dev": true }, "@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, "@types/ms": { diff --git a/package.json b/package.json index 63b3b64c..c6bf9999 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/express": "4.17.13", "@types/lodash": "^4.14.179", "@types/minimist": "1.2.2", - "@types/mocha": "9.0.0", + "@types/mocha": "9.1.1", "@types/node": "14.18.11", "@types/on-finished": "2.3.1", "@types/semver": "^7.3.6", From ba2c0d33f7860dc264391da18be7dbc8efc232aa Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 19 May 2022 17:29:38 +0800 Subject: [PATCH 31/42] =?UTF-8?q?=F0=9F=8E=A8=20refactor:=20add=20ofn=20re?= =?UTF-8?q?gister=20with=20tests=20and=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/generated/api.json | 30 ++++++++++++++++++++++++++++++ docs/generated/api.md | 3 +++ src/function_registry.ts | 20 +++++++++++++++++++- src/index.ts | 2 +- test/function_registry.ts | 8 ++++++++ test/function_wrappers.ts | 28 +++++++++++++++++++++++++++- 6 files changed, 88 insertions(+), 3 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index cf716392..827731fc 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1500,6 +1500,36 @@ ], "extendsTokenRanges": [] }, + { + "kind": "Variable", + "canonicalReference": "@openfunction/functions-framework!openfunction:var", + "docComment": "/**\n * Register a function that responds to OpenFunction.\n *\n * @param functionName - the name of the function\n *\n * @param handler - the function to invoke when handling OpenFunction\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "openfunction: " + }, + { + "kind": "Content", + "text": "(functionName: string, handler: " + }, + { + "kind": "Reference", + "text": "OpenFunction", + "canonicalReference": "@openfunction/functions-framework!OpenFunction:interface" + }, + { + "kind": "Content", + "text": ") => void" + } + ], + "releaseTag": "Public", + "name": "openfunction", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:interface", diff --git a/docs/generated/api.md b/docs/generated/api.md index 6abdb6b4..4d25f565 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -113,6 +113,9 @@ export interface OpenFunction { (ctx: OpenFunctionRuntime, data: {}): any; } +// @public +export const openfunction: (functionName: string, handler: OpenFunction) => void; + // @public export interface OpenFunctionBinding { [key: string]: OpenFunctionComponent; diff --git a/src/function_registry.ts b/src/function_registry.ts index 15b38ce3..aa42360c 100644 --- a/src/function_registry.ts +++ b/src/function_registry.ts @@ -12,7 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {HttpFunction, CloudEventFunction, HandlerFunction} from './functions'; +import { + HttpFunction, + CloudEventFunction, + HandlerFunction, + OpenFunction, +} from './functions'; import {SignatureType} from './types'; interface RegisteredFunction { @@ -94,3 +99,16 @@ export const cloudEvent = ( ): void => { register(functionName, 'cloudevent', handler); }; + +/** + * Register a function that responds to OpenFunction. + * @param functionName - the name of the function + * @param handler - the function to invoke when handling OpenFunction + * @public + */ +export const openfunction = ( + functionName: string, + handler: OpenFunction +): void => { + register(functionName, 'openfunction', handler); +}; diff --git a/src/index.ts b/src/index.ts index 84d159f3..673a5d5e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,7 +20,7 @@ export * from './functions'; /** * @public */ -export {http, cloudEvent} from './function_registry'; +export {http, cloudEvent, openfunction} from './function_registry'; /** * @public diff --git a/test/function_registry.ts b/test/function_registry.ts index fe26d4e3..1928e5c1 100644 --- a/test/function_registry.ts +++ b/test/function_registry.ts @@ -31,6 +31,14 @@ describe('function_registry', () => { assert.deepStrictEqual((userFunction as () => string)(), 'CE_PASS'); }); + it('can register OpenFunction functions', () => { + FunctionRegistry.openfunction('OpenFunction', () => 'OFN_PASS'); + const {userFunction, signatureType} = + FunctionRegistry.getRegisteredFunction('OpenFunction')!; + assert.deepStrictEqual('openfunction', signatureType); + assert.deepStrictEqual((userFunction as () => string)(), 'OFN_PASS'); + }); + it('throws an error if you try to register a function with an invalid URL', () => { // Valid function names const validFunctions = ['httpFunction', 'ceFunction', 'test-func']; diff --git a/test/function_wrappers.ts b/test/function_wrappers.ts index 56dca187..67e3591a 100644 --- a/test/function_wrappers.ts +++ b/test/function_wrappers.ts @@ -1,7 +1,10 @@ import * as assert from 'assert'; import * as sinon from 'sinon'; import {Request, Response} from 'express'; -import {Context, CloudEvent} from '../src/functions'; + +import {OpenFunctionContext} from '../src/openfunction/function_context'; + +import {Context, CloudEvent, OpenFunctionRuntime} from '../src/functions'; import {wrapUserFunction} from '../src/function_wrappers'; describe('wrapUserFunction', () => { @@ -17,6 +20,12 @@ describe('wrapUserFunction', () => { }, }; + const OPENFUNCTION_CONTEXT: OpenFunctionContext = { + name: 'test-context', + version: '1.0.0', + runtime: 'Knative', + }; + const createRequest = (body: object) => ({ body, @@ -105,4 +114,21 @@ describe('wrapUserFunction', () => { ); func(request, response, () => {}); }); + + it('correctly wraps an OpenFunctionn function', done => { + const request = createRequest(CLOUD_EVENT); + const response = createResponse(); + const func = wrapUserFunction( + async (context: OpenFunctionRuntime, data: {}) => { + assert.deepStrictEqual(data, CLOUD_EVENT); + assert.deepStrictEqual(context.req?.body, CLOUD_EVENT); + // await to make sure wrapper handles async code + await new Promise(resolve => setTimeout(resolve, 20)); + done(); + }, + 'openfunction', + OPENFUNCTION_CONTEXT + ); + func(request, Object.assign(response, {end: () => {}}), () => {}); + }); }); From 3f2b65909c8cc09b0ce30a3a7da718daa1e03906 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 21 May 2022 14:38:11 +0800 Subject: [PATCH 32/42] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore(dep):=20use=20?= =?UTF-8?q?`@dapr/dapr`=20instead?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 210 +++++++++++++-------------- package.json | 2 +- src/openfunction/async_server.ts | 2 +- src/openfunction/function_runtime.ts | 2 +- 4 files changed, 108 insertions(+), 108 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fcec377..d4446d87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,9 @@ "version": "0.4.1", "license": "Apache-2.0", "dependencies": { + "@dapr/dapr": "^2.2.1", "body-parser": "^1.18.3", "cloudevents": "^6.0.1", - "dapr-client": "^2.1.0", "debug": "^4.3.4", "express": "^4.16.4", "express-interceptor": "^1.2.0", @@ -89,6 +89,21 @@ "node": ">=6.9.0" } }, + "node_modules/@dapr/dapr": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.2.1.tgz", + "integrity": "sha512-SSA8dtsq0k7UERjwVjopGjZqiHQu+nVcd1v8DXy2KvIGbrx0EKS3Ir63TU/2m2vFl57F6k33bg4kbqNd1RRyAQ==", + "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/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -119,9 +134,9 @@ } }, "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==", + "version": "1.6.7", + "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", + "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", "dependencies": { "@grpc/proto-loader": "^0.6.4", "@types/node": ">=12.12.47" @@ -131,9 +146,9 @@ } }, "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==", + "version": "0.6.12", + "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz", + "integrity": "sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg==", "dependencies": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", @@ -196,9 +211,9 @@ } }, "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==" + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { "version": "7.24.0", @@ -589,9 +604,9 @@ "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==" + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/mime": { "version": "1.3.2", @@ -872,9 +887,9 @@ "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==", + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/0http/-/0http-3.2.0.tgz", + "integrity": "sha512-jRmkqZ1dMTccm5J6UtLL9c4fjXBkK13EU7+Gc0z4rz4K2u3QD8btvtZVjMF+X1yT9iU131WgDHf2sJxJLGpUiA==", "dependencies": { "lru-cache": "^6.0.0", "regexparam": "^2.0.0", @@ -1999,21 +2014,6 @@ "node": ">=8" } }, - "node_modules/dapr-client": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dapr-client/-/dapr-client-2.2.1.tgz", - "integrity": "sha512-IVvll7K/LVQmLT2HtRvIfXHPloEIA6wY9AoTn77Iwrr1ypFAjx9NBr17cWWcKVkYKJ5/TxkLmi375UdAOcsL9w==", - "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", @@ -3423,9 +3423,9 @@ } }, "node_modules/globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dependencies": { "define-properties": "^1.1.3" }, @@ -3454,9 +3454,9 @@ } }, "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==" + "version": "3.20.1", + "resolved": "https://registry.npmmirror.com/google-protobuf/-/google-protobuf-3.20.1.tgz", + "integrity": "sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==" }, "node_modules/got": { "version": "9.6.0", @@ -3716,9 +3716,9 @@ } }, "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==", + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/http-terminator/-/http-terminator-3.2.0.tgz", + "integrity": "sha512-JLjck1EzPaWjsmIf8bziM3p9fgR1Y3JoUKAkyYEbZmFrIvJM6I8vVJfBGWlEtV9IWOvzNnaTtjuwZeBY2kwB4g==", "dependencies": { "delay": "^5.0.0", "p-wait-for": "^3.2.0", @@ -3730,9 +3730,9 @@ } }, "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==", + "version": "2.12.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-2.12.2.tgz", + "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==", "engines": { "node": ">=12.20" } @@ -5765,9 +5765,9 @@ } }, "node_modules/protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "version": "6.11.3", + "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -6130,12 +6130,12 @@ } }, "node_modules/restana": { - "version": "4.9.3", - "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.3.tgz", - "integrity": "sha512-oyGgDPmO+zUSjShjUwEFX/7Tk3x1K3bYBBpIa5uZwHLBdkqdEApmGq32+U9yOk6zP7h4xcWyGKsLDRUJKHtXow==", + "version": "4.9.5", + "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.5.tgz", + "integrity": "sha512-10jKg97AHL9fTbF7gB1ulJyPDl3rh/c5aPimS2wQT9NvBi+Xrmk0yuF4CD8mDqGuENadjwCiBlpzD1rKzuzNDg==", "hasInstallScript": true, "dependencies": { - "0http": "^3.1.2" + "0http": "^3.2.0" }, "engines": { "node": ">=10.x" @@ -6191,9 +6191,9 @@ } }, "node_modules/roarr": { - "version": "7.8.2", - "resolved": "https://registry.npmmirror.com/roarr/-/roarr-7.8.2.tgz", - "integrity": "sha512-55yK+LC9FcsGZOheIEGgXzi+pdRhqN/kjWjEzLUYZBRPt5zzakVHc3sZ74FuQ2zz73YfiA5PjnUOFFXbG7n9cA==", + "version": "7.11.0", + "resolved": "https://registry.npmmirror.com/roarr/-/roarr-7.11.0.tgz", + "integrity": "sha512-DKiMaEYHoOZ0JyD4Ohr5KRnqybQ162s3ZL/WNO9oy6EUszYvpp0eLYJErc/U4NI96HYnHsbROhFaH4LYuJPnDg==", "dependencies": { "boolean": "^3.1.4", "fast-json-stringify": "^2.7.10", @@ -7626,6 +7626,21 @@ "js-tokens": "^4.0.0" } }, + "@dapr/dapr": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.2.1.tgz", + "integrity": "sha512-SSA8dtsq0k7UERjwVjopGjZqiHQu+nVcd1v8DXy2KvIGbrx0EKS3Ir63TU/2m2vFl57F6k33bg4kbqNd1RRyAQ==", + "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" + } + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -7652,18 +7667,18 @@ } }, "@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==", + "version": "1.6.7", + "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", + "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", "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==", + "version": "0.6.12", + "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz", + "integrity": "sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg==", "requires": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", @@ -7714,9 +7729,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -8096,9 +8111,9 @@ "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==" + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "@types/mime": { "version": "1.3.2", @@ -8305,9 +8320,9 @@ "dev": true }, "0http": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/0http/-/0http-3.1.2.tgz", - "integrity": "sha512-Cs/dy31/kvPNZnTxEJCyrWEqwl4LOF5Xv9+/tButVWTLJWiFZiECWzOcZKkctmJFWTCd0k0vL5bwmEOmxDJqfQ==", + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/0http/-/0http-3.2.0.tgz", + "integrity": "sha512-jRmkqZ1dMTccm5J6UtLL9c4fjXBkK13EU7+Gc0z4rz4K2u3QD8btvtZVjMF+X1yT9iU131WgDHf2sJxJLGpUiA==", "requires": { "lru-cache": "^6.0.0", "regexparam": "^2.0.0", @@ -9181,21 +9196,6 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, - "dapr-client": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dapr-client/-/dapr-client-2.2.1.tgz", - "integrity": "sha512-IVvll7K/LVQmLT2HtRvIfXHPloEIA6wY9AoTn77Iwrr1ypFAjx9NBr17cWWcKVkYKJ5/TxkLmi375UdAOcsL9w==", - "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", @@ -10244,9 +10244,9 @@ } }, "globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "requires": { "define-properties": "^1.1.3" } @@ -10266,9 +10266,9 @@ } }, "google-protobuf": { - "version": "3.19.4", - "resolved": "https://registry.npmmirror.com/google-protobuf/-/google-protobuf-3.19.4.tgz", - "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==" + "version": "3.20.1", + "resolved": "https://registry.npmmirror.com/google-protobuf/-/google-protobuf-3.20.1.tgz", + "integrity": "sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==" }, "got": { "version": "9.6.0", @@ -10460,9 +10460,9 @@ } }, "http-terminator": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/http-terminator/-/http-terminator-3.1.0.tgz", - "integrity": "sha512-c57dUVVHs+jLXeJvs3Y+GrEGMnGE5yxS8ngNTSh5HlP3Q12s6cxVlukE4UcI0xfWyfcm8RRPMAoaFVAlylKcYg==", + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/http-terminator/-/http-terminator-3.2.0.tgz", + "integrity": "sha512-JLjck1EzPaWjsmIf8bziM3p9fgR1Y3JoUKAkyYEbZmFrIvJM6I8vVJfBGWlEtV9IWOvzNnaTtjuwZeBY2kwB4g==", "requires": { "delay": "^5.0.0", "p-wait-for": "^3.2.0", @@ -10471,9 +10471,9 @@ }, "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==" + "version": "2.12.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-2.12.2.tgz", + "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==" } } }, @@ -11973,9 +11973,9 @@ "dev": true }, "protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "version": "6.11.3", + "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -12239,11 +12239,11 @@ } }, "restana": { - "version": "4.9.3", - "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.3.tgz", - "integrity": "sha512-oyGgDPmO+zUSjShjUwEFX/7Tk3x1K3bYBBpIa5uZwHLBdkqdEApmGq32+U9yOk6zP7h4xcWyGKsLDRUJKHtXow==", + "version": "4.9.5", + "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.5.tgz", + "integrity": "sha512-10jKg97AHL9fTbF7gB1ulJyPDl3rh/c5aPimS2wQT9NvBi+Xrmk0yuF4CD8mDqGuENadjwCiBlpzD1rKzuzNDg==", "requires": { - "0http": "^3.1.2" + "0http": "^3.2.0" } }, "restore-cursor": { @@ -12283,9 +12283,9 @@ } }, "roarr": { - "version": "7.8.2", - "resolved": "https://registry.npmmirror.com/roarr/-/roarr-7.8.2.tgz", - "integrity": "sha512-55yK+LC9FcsGZOheIEGgXzi+pdRhqN/kjWjEzLUYZBRPt5zzakVHc3sZ74FuQ2zz73YfiA5PjnUOFFXbG7n9cA==", + "version": "7.11.0", + "resolved": "https://registry.npmmirror.com/roarr/-/roarr-7.11.0.tgz", + "integrity": "sha512-DKiMaEYHoOZ0JyD4Ohr5KRnqybQ162s3ZL/WNO9oy6EUszYvpp0eLYJErc/U4NI96HYnHsbROhFaH4LYuJPnDg==", "requires": { "boolean": "^3.1.4", "fast-json-stringify": "^2.7.10", diff --git a/package.json b/package.json index 63b3b64c..b5df2ec0 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ "./testing": "./build/src/testing.js" }, "dependencies": { + "@dapr/dapr": "^2.2.1", "body-parser": "^1.18.3", "cloudevents": "^6.0.1", - "dapr-client": "^2.1.0", "debug": "^4.3.4", "express": "^4.16.4", "express-interceptor": "^1.2.0", diff --git a/src/openfunction/async_server.ts b/src/openfunction/async_server.ts index 4944ce79..358b9ae9 100644 --- a/src/openfunction/async_server.ts +++ b/src/openfunction/async_server.ts @@ -1,5 +1,5 @@ import {forEach} from 'lodash'; -import {DaprServer} from 'dapr-client'; +import {DaprServer} from '@dapr/dapr'; import {OpenFunction} from '../functions'; diff --git a/src/openfunction/function_runtime.ts b/src/openfunction/function_runtime.ts index 9a1ea3c9..ea28a44c 100644 --- a/src/openfunction/function_runtime.ts +++ b/src/openfunction/function_runtime.ts @@ -2,7 +2,7 @@ import {env} from 'process'; import {chain, get, has, extend} from 'lodash'; import {Request, Response} from 'express'; -import {DaprClient, CommunicationProtocolEnum} from 'dapr-client'; +import {DaprClient, CommunicationProtocolEnum} from '@dapr/dapr'; import { OpenFunctionComponent, From cbbac3157941cababa954ea48e500b87badaa02c Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 21 May 2022 15:08:30 +0800 Subject: [PATCH 33/42] =?UTF-8?q?=F0=9F=91=B7=20ci(mergeable):=20remove=20?= =?UTF-8?q?draft=20check=20rule=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/mergeable.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/mergeable.yml b/.github/mergeable.yml index fd73bfbd..b60a8513 100644 --- a/.github/mergeable.yml +++ b/.github/mergeable.yml @@ -34,15 +34,3 @@ mergeable: payload: body: > Thanks for creating a pull request! A maintainer will review your changes shortly. Please don't be discouraged if it takes a while. - - when: pull_request.*, pull_request_review.* - name: 'Draft check' - validate: - - do: payload - pull_request: - draft: - boolean: - match: false - fail: - - do: comment - payload: - body: This PR is STILL a draft! From 2f3451c7007d5c3ad152f1d2e64b01e37b1e79f6 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 21 May 2022 17:29:01 +0800 Subject: [PATCH 34/42] =?UTF-8?q?=F0=9F=93=9D=20doc(README):=20add=20repob?= =?UTF-8?q?eats=20chart=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ee6b1d02..9dd366fc 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,16 @@ [![Node unit CI][ff_node_unit_img]][ff_node_unit_link] [![Node lint CI][ff_node_lint_img]][ff_node_lint_link] -> This is OpenFunction's nodejs functions-framework forked from [GCP functions-framework-nodejs](https://github.com/GoogleCloudPlatform/functions-framework-nodejs) +![Alt](https://repobeats.axiom.co/api/embed/988db7b27f5120583d096d8131fd26626c349fac.svg "Repobeats analytics image") + +--- + +> This is OpenFunction's Node.js 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/) 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: +The Functions Framework lets you write lightweight functions that run in many different environments, including: * [OpenFunction](https://github.com/OpenFunction/OpenFunction) * [Knative](https://github.com/knative/)-based environments @@ -101,8 +104,7 @@ npm install @openfunction/functions-framework npm install @openfunction/functions-framework ``` -1. Add a `start` script to `package.json`, with configuration passed via -command-line arguments: +1. Add a `start` script to `package.json`, with configuration passed via command-line arguments: ```js "scripts": { @@ -160,9 +162,7 @@ command-line arguments: ## Configure the Functions Framework -You can configure the Functions Framework using command-line flags or -environment variables. If you specify both, the environment variable will be -ignored. +You can configure the Functions Framework using command-line flags or environment variables. If you specify both, the environment variable will be ignored. | Command-line flag | Environment variable | Description | | ------------------ | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -281,8 +281,7 @@ More advanced guides and docs can be found in the [`docs/` folder](docs/). ## Contributing -Contributions to this library are welcome and encouraged. See -[CONTRIBUTING](CONTRIBUTING.md) for more information on how to get started. +Contributions to this library are welcome and encouraged. See [CONTRIBUTING](CONTRIBUTING.md) for more information on how to get started. [ff_node_unit_img]: https://github.com/openfunction/functions-framework-nodejs/workflows/Node.js%20Unit%20CI/badge.svg [ff_node_unit_link]: https://github.com/openfunction/functions-framework-nodejs/actions?query=workflow%3A"Node.js+Unit+CI" From d412d497c3539018b4bf68f974cea653708c8af6 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 22 May 2022 19:49:22 +0800 Subject: [PATCH 35/42] =?UTF-8?q?=F0=9F=93=9D=20docs:=20polish=20puml=20an?= =?UTF-8?q?d=20index=20page=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/README.md | 14 +++---- docs/uml/OpenFunction in Async Runtime.png | Bin 0 -> 101501 bytes docs/uml/OpenFunction in Sync Runtime.png | Bin 0 -> 104111 bytes .../{async-server.puml => uml/ofn-async.puml} | 2 +- docs/{http-binding.puml => uml/ofn-sync.puml} | 36 +++++++----------- 5 files changed, 21 insertions(+), 31 deletions(-) create mode 100644 docs/uml/OpenFunction in Async Runtime.png create mode 100644 docs/uml/OpenFunction in Sync Runtime.png rename docs/{async-server.puml => uml/ofn-async.puml} (97%) rename docs/{http-binding.puml => uml/ofn-sync.puml} (55%) diff --git a/docs/README.md b/docs/README.md index 45815a42..73bc746e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,21 +2,19 @@ This directory contains advanced docs around the Functions Framework. -- [Testing events and Pub/Sub](events.md) - [Testing Functions](testing-functions.md) - [Debugging Functions](debugging.md) -- [Running and Deploying Docker Containers](docker.md) -- [Writing a Function in Typescript](typescript.md) +- [Writing a Function in TypeScript](typescript.md) - [ES Modules](esm/README.md) +Also containing sequence diagrams of OpenFunction underlying workflows. + +- [OpenFunction in Sync Runtime](uml/OpenFunction%20in%20Sync%20Runtime.png) +- [OpenFunction in Async Runtime](uml/OpenFunction%20in%20Async%20Runtime.png) + ## Generated Docs The `generated/` directory contains generated API references. - [api.md](generated/api.md) -- [api.d.ts](generated/api.d.ts) - [api.json](generated/api.json) - -## TODO Docs - -- Run Multiple Cloud Functions [#23](https://github.com/GoogleCloudPlatform/functions-framework-nodejs/issues/23) diff --git a/docs/uml/OpenFunction in Async Runtime.png b/docs/uml/OpenFunction in Async Runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..c36b3a1e97e7ccd8a745ad6930241a0258ebc7d6 GIT binary patch literal 101501 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 literal 0 HcmV?d00001 diff --git a/docs/uml/OpenFunction in Sync Runtime.png b/docs/uml/OpenFunction in Sync Runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..c9833a5f08bae6fa97c7a2b1a80e3efa8d7ccb2a GIT binary patch literal 104111 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 z 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

4Z31 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 P$jjB!GS;j_*hc;fMX;zw literal 0 HcmV?d00001 diff --git a/docs/async-server.puml b/docs/uml/ofn-async.puml similarity index 97% rename from docs/async-server.puml rename to docs/uml/ofn-async.puml index f0e7c2e6..7e2ad6dc 100644 --- a/docs/async-server.puml +++ b/docs/uml/ofn-async.puml @@ -1,4 +1,4 @@ -@startuml Async Server +@startuml OpenFunction in Async Runtime box Function Process in Local Environment or Container control ENTRYPOINT diff --git a/docs/http-binding.puml b/docs/uml/ofn-sync.puml similarity index 55% rename from docs/http-binding.puml rename to docs/uml/ofn-sync.puml index e87cd3db..159951db 100644 --- a/docs/http-binding.puml +++ b/docs/uml/ofn-sync.puml @@ -1,4 +1,4 @@ -@startuml HTTP Binding +@startuml OpenFunction in Sync Runtime box Function Process in Local Environment or Container control ENTRYPOINT @@ -9,7 +9,6 @@ participant Express [ ---- ""Express"" ] -participant Interceptor participant "User Function" as UserFunction participant DaprClient end box @@ -22,22 +21,14 @@ 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) {}"" +note left: ""function (ctx, data)"" 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 +Server -> UserFunction ** : wrap user function in ""function (req, res)"" note over Server, UserFunction: Use Node.js ""Domain"" to run function and catch exceptions Server -> Express : bind wrapper to "/*" route @@ -48,27 +39,28 @@ Server -> Express : bind wrapper to "/*" route [-> 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 +alt output to Dapr + UserFunction -> DaprClient ** : new loop each OpenFunction Output - Interceptor -> DaprClient ++ : send "data" + UserFunction -> DaprClient ++ : send "data" asynchronously - DaprClient -> DaprSidecar ++ : invoke binding or publication with "data" + DaprClient -> DaprSidecar ++ : invoke binding \nor pub with "data" DaprSidecar --> DaprClient -- : return result - DaprClient --> Interceptor -- : forward result end - Interceptor -> DaprClient !! - Interceptor --> Express -- : return "data" as response + UserFunction -> DaprClient !! +end + +alt response via Express + UserFunction -> UserFunction : invoke ""ctx.res"" \n(and ""ctx.req"") methods end +UserFunction --> Express -- : wrapper ends response + [<- Express -- : send response ... From 4c321ad0a8b37e005c633b749d87b51215c00201 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 May 2022 03:37:25 +0000 Subject: [PATCH 36/42] chore(deps-dev): bump typescript from 4.6.4 to 4.7.2 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.6.4 to 4.7.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.6.4...v4.7.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d4446d87..724ef9dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -261,6 +261,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@microsoft/tsdoc": { "version": "0.14.1", "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", @@ -7022,9 +7035,9 @@ } }, "node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", + "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7763,6 +7776,12 @@ "requires": { "path-parse": "^1.0.6" } + }, + "typescript": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "dev": true } } }, @@ -12934,9 +12953,9 @@ } }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", + "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", "dev": true }, "unbox-primitive": { From 78eccabc3db148dd736d98d203808470fdbe74ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 May 2022 04:22:32 +0000 Subject: [PATCH 37/42] chore(deps): bump minimist from 1.2.5 to 1.2.6 in /docs/esm Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/esm/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/esm/package-lock.json b/docs/esm/package-lock.json index 11fbeb43..4f8dda58 100644 --- a/docs/esm/package-lock.json +++ b/docs/esm/package-lock.json @@ -895,9 +895,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/ms": { "version": "2.0.0", @@ -2093,9 +2093,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "ms": { "version": "2.0.0", From 61931a05042521f9d54f533340edf6cd10e4ffd3 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 26 May 2022 18:14:00 +0800 Subject: [PATCH 38/42] =?UTF-8?q?=F0=9F=91=B7=20ci(bot/drafter):=20add=20s?= =?UTF-8?q?ecurity=20section=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/release-drafter.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 15fad986..f814607c 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -16,6 +16,8 @@ categories: label: 'type: bug' - title: 'đŸ—ī¸ Maintenance' label: 'type: maintenance' + - title: '🔒 Security' + label: 'type: security' - title: '👷 CI/CD' label: 'type: cicd' - title: '📝 Documentation' From 9937e667678372cbfd477c9792ad4ecbbf70fbe5 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 26 May 2022 18:26:23 +0800 Subject: [PATCH 39/42] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20chore:=20remove=20us?= =?UTF-8?q?eless=20`experimental`=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- experimental/generate_cloud_events/README.md | 11 - .../generate_cloud_events/package-lock.json | 2780 ----------------- .../generate_cloud_events/package.json | 25 - .../generate_cloud_events/src/generate.ts | 258 -- .../generate_cloud_events/src/schema_types.ts | 174 -- .../generate_cloud_events/src/utils.ts | 134 - .../generate_cloud_events/tsconfig.json | 12 - 7 files changed, 3394 deletions(-) delete mode 100644 experimental/generate_cloud_events/README.md delete mode 100644 experimental/generate_cloud_events/package-lock.json delete mode 100644 experimental/generate_cloud_events/package.json delete mode 100644 experimental/generate_cloud_events/src/generate.ts delete mode 100644 experimental/generate_cloud_events/src/schema_types.ts delete mode 100644 experimental/generate_cloud_events/src/utils.ts delete mode 100644 experimental/generate_cloud_events/tsconfig.json diff --git a/experimental/generate_cloud_events/README.md b/experimental/generate_cloud_events/README.md deleted file mode 100644 index 077281f7..00000000 --- a/experimental/generate_cloud_events/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Code Generation Pipeline For CloudEvent Interfaces - -This directory contains an experimental code generation pipeline to generate TS interfaces for the CloudEvent types defined in [Google Events](https://github.com/googleapis/google-cloudevents). - -It can be run via the following command: - -```bash -npm run generate_cloudevents -``` - -This will regenerate all known CloudEvent type interfaces in the `src/cloud_event_types` directory of this repository. \ No newline at end of file diff --git a/experimental/generate_cloud_events/package-lock.json b/experimental/generate_cloud_events/package-lock.json deleted file mode 100644 index a1e783d9..00000000 --- a/experimental/generate_cloud_events/package-lock.json +++ /dev/null @@ -1,2780 +0,0 @@ -{ - "name": "generate_cloudevents", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", - "dev": true, - "requires": { - "@babel/types": "^7.15.6", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.9", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "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 - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "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.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" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/babel__generator": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", - "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@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/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "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 - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "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 - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "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" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "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 - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "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 - } - } - }, - "eslint-config-prettier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "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 - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "gts": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.0.tgz", - "integrity": "sha512-Pbj3ob1VR1IRlEVEBNtKoQ1wHOa8cZz62KEojK8Fn/qeS2ClWI4gLNfhek3lD68aZSmUEg8TFb6AHXIwUMgyqQ==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^4.2.0", - "@typescript-eslint/parser": "^4.2.0", - "chalk": "^4.1.0", - "eslint": "^7.10.0", - "eslint-config-prettier": "^7.0.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.1.4", - "execa": "^5.0.0", - "inquirer": "^7.3.3", - "json5": "^2.1.3", - "meow": "^9.0.0", - "ncp": "^2.0.0", - "prettier": "^2.1.2", - "rimraf": "^3.0.2", - "update-notifier": "^5.0.0", - "write-file-atomic": "^3.0.3" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "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 - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "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 - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "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", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", - "dev": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "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 - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/experimental/generate_cloud_events/package.json b/experimental/generate_cloud_events/package.json deleted file mode 100644 index c420a4fe..00000000 --- a/experimental/generate_cloud_events/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "generate_cloudevents", - "version": "1.0.0", - "description": "Code generation pipeline for generating CloudEvent types.", - "main": "build/src/index.js", - "dependencies": {}, - "scripts": { - "generate_cloudevents": "ts-node ./src/generate.ts && gts fix ../../src/cloud_event_types/**/*.ts" - }, - "files": [ - "build/src/**/*.js", - "build/src/**/*.d.ts" - ], - "author": "Google Inc.", - "license": "Apache-2.0", - "devDependencies": { - "@babel/generator": "^7.15.8", - "@babel/types": "^7.15.6", - "@types/babel__generator": "^7.6.3", - "@types/node": "14.18.11", - "gts": "3.1.0", - "ts-node": "^10.3.1", - "typescript": "^4.4.4" - } -} diff --git a/experimental/generate_cloud_events/src/generate.ts b/experimental/generate_cloud_events/src/generate.ts deleted file mode 100644 index 07223a0b..00000000 --- a/experimental/generate_cloud_events/src/generate.ts +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2021 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import * as t from '@babel/types'; -import generate from '@babel/generator'; -import * as utils from './utils'; -import * as fs from 'fs'; -import * as path from 'path'; -import { - InterfaceDefinitionSchema, - isEnumProp, - isOneOfProp, - isRefProp, - SchemaProperty, - TypeSchema, - EventCatalog, -} from './schema_types'; - -/** - * URL of the type catalog in the googleapis/google-cloudevents repo - */ -const ROOT_TYPE_CATALOG_URL = - 'https://googleapis.github.io/google-cloudevents/jsonschema/catalog.json'; - -/** - * Create an AST node representing a schema property - * @param property the schema property to generate the ast for - * @returns an AST subtree represenging an TS type annotation - */ -const getTypeAnnotation = (property: SchemaProperty): t.TSTypeAnnotation => { - if (isRefProp(property)) { - return t.tsTypeAnnotation( - t.tsTypeReference( - t.identifier(property.$ref.replace('#/definitions/', '')) - ) - ); - } - - if (isEnumProp(property)) { - // TODO can we do better here? - return t.tsTypeAnnotation(t.tsNumberKeyword()); - } - - if (isOneOfProp(property)) { - return t.tsTypeAnnotation( - t.tsUnionType( - property.oneOf.map(p => getTypeAnnotation(p).typeAnnotation) - ) - ); - } - - if (property.type === 'string') { - return t.tsTypeAnnotation(t.tsStringKeyword()); - } - - if (property.type === 'integer' || property.type === 'number') { - return t.tsTypeAnnotation(t.tsNumberKeyword()); - } - - if (property.type === 'boolean') { - return t.tsTypeAnnotation(t.tsBooleanKeyword()); - } - - if (property.type === 'object') { - // TODO can we do better here? - return t.tsTypeAnnotation(t.tsObjectKeyword()); - } - - if (property.type === 'array') { - if (property.items) { - const elemType = getTypeAnnotation(property.items); - return t.tsTypeAnnotation(t.tsArrayType(elemType.typeAnnotation)); - } else { - // TODO can we do better here? - return t.tsTypeAnnotation(t.tsArrayType(t.tsAnyKeyword())); - } - } - throw `encounted unknown property: ${JSON.stringify(property)}`; -}; - -/** - * Generate an AST for the interface body from a collection of schema properties. - * @param properties The Schema properties to include in the interface - * @returns an AST subtree representing a TS interface body - */ -const generateInterfaceBody = (properties: { - [key: string]: SchemaProperty; -}): t.TSInterfaceBody => { - return t.tsInterfaceBody( - Object.keys(properties).map(propName => { - const prop = properties[propName]; - const foo = t.tsPropertySignature( - t.identifier(propName), - getTypeAnnotation(prop), - null - ); - utils.addComment(foo, prop.description); - return foo; - }) - ); -}; - -/** - * Generate the AST for the import declaration that pulls in the base CloudEvent interface. - */ -const generateCloudEventImport = (): t.Statement => { - return t.importDeclaration( - [ - t.importSpecifier( - t.identifier('CloudEventsContext'), - t.identifier('CloudEventsContext') - ), - ], - t.stringLiteral('./cloud_events_context') - ); -}; - -/** - * Generate all interfaces in a given cloudevent schema - * @param schema The cloudevent data payload schema - * @returns a set of Statement AST nodes representing interfaces declarations - */ -const generateInterfaces = (schema: TypeSchema): t.Statement[] => { - const definitions: {[key: string]: InterfaceDefinitionSchema} = - schema.definitions; - - return Object.keys(definitions).map(definition => { - const interfaceStmt = t.tsInterfaceDeclaration( - t.identifier(definition), - null, - null, - generateInterfaceBody(definitions[definition].properties) - ); - const exportStmt = t.exportNamedDeclaration(interfaceStmt); - utils.addComment(exportStmt, definitions[definition].description, true); - return exportStmt; - }); -}; - -/** - * Generate the Cloudevent interface AST for a given cloudevent data payload schema - * @param schema the cloudevent data playload to generate the cloudevent interface for - * @returns an AST node represting a TS interface - */ -const generateCloudEventInterface = (schema: TypeSchema): t.Statement => { - const typeTypes = schema.cloudeventTypes.map(x => - t.tsLiteralType(t.stringLiteral(x)) - ); - const exportStmt = t.exportNamedDeclaration( - t.tsInterfaceDeclaration( - t.identifier(schema.name.replace(/Data$/, 'CloudEvent')), - null, - [t.tsExpressionWithTypeArguments(t.identifier('CloudEventsContext'))], - t.tsInterfaceBody([ - t.tsPropertySignature( - t.identifier('type'), - t.tsTypeAnnotation( - typeTypes.length === 1 ? typeTypes[0] : t.tsUnionType(typeTypes) - ) - ), - t.tsPropertySignature( - t.identifier('data'), - t.tsTypeAnnotation(t.tsTypeReference(t.identifier(schema.name))) - ), - ]) - ) - ); - utils.addComment( - exportStmt, - `The schema of CloudEvents emmitted by ${schema.product}.`, - true - ); - return exportStmt; -}; - -/** - * Kick off the code generation pipeline by downloading the JSON manifest from - * googleapis/google-cloudevents - */ -utils.fetch(ROOT_TYPE_CATALOG_URL).then(catalog => { - const rootImports: { - importPath: string; - ceDataTypeName: string; - ceInterface: t.Statement; - }[] = []; - const promises = (catalog as EventCatalog).schemas.map(async catSchema => { - const schema = (await utils.fetch(catSchema.url)) as TypeSchema; - const interfaces = generateInterfaces(schema); - - const ast = t.file(t.program(interfaces)); - rootImports.push({ - importPath: utils.getCloudEventImportPath(catSchema.url), - ceDataTypeName: schema.name, - ceInterface: generateCloudEventInterface(schema), - }); - utils.addCopyright(ast); - const {code} = generate(ast); - const fileName = utils.getDataFilePath(catSchema.url); - fs.mkdirSync(path.dirname(fileName), {recursive: true}); - fs.writeFileSync(fileName, code); - }); - - Promise.all(promises).then(() => { - const imports: t.Statement[] = rootImports - .sort((a, b) => (a.importPath > b.importPath ? 1 : -1)) - .map(({importPath, ceDataTypeName}) => { - return t.importDeclaration( - [ - t.importSpecifier( - t.identifier(ceDataTypeName), - t.identifier(ceDataTypeName) - ), - ], - t.stringLiteral(importPath) - ); - }); - - imports.push(generateCloudEventImport()); - - imports.push(...rootImports.map(x => x.ceInterface)); - - const googleCloudEventExport = t.exportNamedDeclaration( - t.tsTypeAliasDeclaration( - t.identifier('GoogleCloudEvent'), - null, - t.tsUnionType( - rootImports.map(x => - t.tsTypeReference( - t.identifier(utils.getCloudEventTypeName(x.ceDataTypeName)) - ) - ) - ) - ) - ); - utils.addComment( - googleCloudEventExport, - 'Union of all known CloudEvents emitted by Google Cloud services' - ); - - imports.push(googleCloudEventExport); - const ast = t.file(t.program(imports)); - utils.addCopyright(ast); - - const {code} = generate(ast); - fs.writeFileSync(utils.RELATIVE_SRC_DIR + '/google_cloud_event.ts', code); - }); -}); diff --git a/experimental/generate_cloud_events/src/schema_types.ts b/experimental/generate_cloud_events/src/schema_types.ts deleted file mode 100644 index f3e392a3..00000000 --- a/experimental/generate_cloud_events/src/schema_types.ts +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2021 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// A collection of interfaces that describe the structure of the JSON schema -// files in the googleapis/google-cloudevents repo. - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -/** - * Schema of a string property - */ -export interface StringSchemaProperty { - type: 'string'; - description: string; -} - -/** - * Schema of a number property - */ -export interface NumberSchemaProperty { - type: 'number'; - description: string; -} - -/** - * Schema of a integer property - */ -export interface IntegerSchemaProperty { - type: 'integer'; - description: string; -} - -/** - * Schema of a object property - */ -export interface ObjectSchemaProperty { - type: 'object'; - description: string; - additionalProperties: boolean; -} - -/** - * Schema of a boolean property - */ -export interface BooleanSchemaProperty { - type: 'boolean'; - description: string; -} - -/** - * Schema of a ref property - */ -export interface RefSchemaProperty { - $ref: string; - additionalProperties: boolean; - description: string; -} - -/** - * Schema of a enum property - */ -export interface EnumSchemaProperty { - enum: {[key: string]: number}; - description: string; -} - -/** - * Schema of a array property - */ -export interface ArraySchemaProperty { - type: 'array'; - items: SchemaProperty; - description: string; -} - -/** - * Schema of a oneof property - */ -export interface OneOfSchemaProperty { - oneOf: SchemaProperty[]; - description: string; -} - -/** - * Union of all known schema properties. - */ -export type SchemaProperty = - | StringSchemaProperty - | NumberSchemaProperty - | ObjectSchemaProperty - | RefSchemaProperty - | BooleanSchemaProperty - | EnumSchemaProperty - | ArraySchemaProperty - | IntegerSchemaProperty - | OneOfSchemaProperty; - -/** - * The schema of an interface definition schema. - */ -export interface InterfaceDefinitionSchema { - properties: { - [key: string]: SchemaProperty; - }; - description?: string; -} - -/** - * The top level schema of a cloudevent data payload. - */ -export interface TypeSchema { - $id: string; - name: string; - examples: string[]; - package: string; - datatype: string; - cloudeventTypes: string[]; - product: string; - $schema: string; - $ref: string; - definitions: {[key: string]: InterfaceDefinitionSchema}; -} - -/** - * The catalog of all cloudevent data types included in the googleapis/google-cloudevents repo. - * - */ -export interface EventCatalog { - $schema: string; - version: number; - schemas: { - url: string; - product: string; - name: string; - description: string; - datatype: string; - cloudeventTypes: string[]; - }[]; -} - -/** - * Type guard to check if a given schema property is a RefSchemaProperty - * @param prop the schema property to check the type of - * @returns true if the given property is a RefSchemaProperty - */ -export const isRefProp = (prop: any): prop is RefSchemaProperty => - !!prop['$ref']; - -/** - * Type guard to check if a given schema property is a EnumSchemaProperty - * @param prop the schema property to check the type of - * @returns true if the given property is a EnumSchemaProperty - */ -export const isEnumProp = (prop: any): prop is EnumSchemaProperty => - !!prop['enum']; - -/** - * Type guard to check if a given schema property is a OneOfSchemaProperty - * @param prop the schema property to check the type of - * @returns true if the given property is a OneOfSchemaProperty - */ -export const isOneOfProp = (prop: any): prop is OneOfSchemaProperty => - !!prop['oneOf']; diff --git a/experimental/generate_cloud_events/src/utils.ts b/experimental/generate_cloud_events/src/utils.ts deleted file mode 100644 index 03b241f1..00000000 --- a/experimental/generate_cloud_events/src/utils.ts +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2021 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* eslint-disable @typescript-eslint/no-explicit-any */ -import * as t from '@babel/types'; -import * as https from 'https'; - -/** - * Relative path of src dictory to write the TS files ts. - */ -export const RELATIVE_SRC_DIR = '../../src/cloud_event_types'; - -/** - * Add a JSDoc comment to an AST node - * @param node the AST node to add a comment to - * @param comment the text content of the comment - * @param isPublic whether or not to add an "@public" annotation - * @returns the AST node with attached comment - */ -export const addComment = ( - node: T, - comment?: string, - isPublic = false -): T => { - if (comment) { - const lines = comment.split('\n').map(l => ' * ' + l.trim()); - lines.unshift('*'); - - if (isPublic) { - lines.push(' * '); - lines.push(' * @public'); - } - - t.addComment(node, 'leading', lines.join('\n') + '\n '); - } - return node; -}; - -/** - * Fetch a url as a JSON object - * @param url the URL to fetch - * @returns the response parsed as json - */ -export const fetch = (url: string): Promise<{[key: string]: any}> => { - return new Promise((resolve, reject) => { - https - .get(url, (resp: any) => { - let data = ''; - resp.on('data', (chunk: string) => (data += chunk)); - resp.on('end', () => resolve(JSON.parse(data))); - }) - .on('error', reject); - }); -}; - -/** - * Get the relative file path of an interface file - * @param url the URL of schema in the googleapis/google-cloudevents repo - * @returns the relative file path to write the interface type to - */ -export const getDataFilePath = (url: string): string => { - return ( - RELATIVE_SRC_DIR + - url - .split('jsonschema/google/events')[1] - .replace('.json', '.ts') - .replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`) - .replace('/_', '/') - ); -}; - -/** - * Get the relative import path of the cloudevent type for a given schema url - * @param url the URL of the type schema in the googleapis/google-cloudevents repo - * @returns the relative import path of containing the CloudEvent type - */ -export const getCloudEventImportPath = (url: string): string => { - const dataPath = getDataFilePath(url); - return dataPath.replace('.ts', '').replace(RELATIVE_SRC_DIR, '.'); -}; - -/** - * Get the name of a CloudEvent type that corresponds to the given data payload type. - * @param dataTypeName the name of the data payload type - * @returns the name of the CloudEvent type - */ -export const getCloudEventTypeName = (dataTypeName: string): string => { - return dataTypeName.replace(/Data$/, 'CloudEvent'); -}; - -/** - * Add a copyright header to an AST file - * @param file the file AST node to add the header to - * @returns the updated AST node - */ -export const addCopyright = (file: t.File): t.File => { - t.addComment( - file, - 'leading', - ' eslint-disable @typescript-eslint/no-explicit-any', - false - ); - [ - ' Copyright 2021 Google LLC', - '', - ' Licensed under the Apache License, Version 2.0 (the "License");', - ' you may not use this file except in compliance with the License.', - ' You may obtain a copy of the License at', - '', - ' http://www.apache.org/licenses/LICENSE-2.0', - '', - ' Unless required by applicable law or agreed to in writing, software', - ' distributed under the License is distributed on an "AS IS" BASIS,', - ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.', - ' See the License for the specific language governing permissions and', - ' limitations under the License.', - ] - .reverse() - .forEach(line => { - t.addComment(file, 'leading', line, true); - }); - return file; -}; diff --git a/experimental/generate_cloud_events/tsconfig.json b/experimental/generate_cloud_events/tsconfig.json deleted file mode 100644 index 847a64b9..00000000 --- a/experimental/generate_cloud_events/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "gts/tsconfig-google.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "build", - "declaration": true, - "declarationMap": true - }, - "include": [ - "src/*.ts" - ] -} \ No newline at end of file From acc5c562577a52cc0ee76a5037765e8cf04e457a Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 27 May 2022 17:50:22 +0800 Subject: [PATCH 40/42] =?UTF-8?q?=F0=9F=8E=A8=20refactor:=20polish=20http?= =?UTF-8?q?=20error=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- src/function_wrappers.ts | 2 +- src/types.ts | 2 +- test/integration/cloud_event.ts | 12 +++++++++--- test/integration/http.ts | 21 ++++++++++++++------- test/integration/http_binding.ts | 13 +++++++++++-- test/integration/legacy_event.ts | 12 +++++++++--- 6 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/function_wrappers.ts b/src/function_wrappers.ts index aaf95ff1..33e05c08 100644 --- a/src/function_wrappers.ts +++ b/src/function_wrappers.ts @@ -138,7 +138,7 @@ const wrapOpenFunction = ( Promise.resolve() .then(() => userFunction(ctx, req.body)) - .then(() => res.end()) + .then(result => callback(null, result)) .catch(err => callback(err, undefined)); }; diff --git a/src/types.ts b/src/types.ts index 44865026..84a32ffb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -14,7 +14,7 @@ // HTTP header field that is added to Worker response to signalize problems with // executing the client function. -export const FUNCTION_STATUS_HEADER_FIELD = 'X-Google-Status'; +export const FUNCTION_STATUS_HEADER_FIELD = 'X-OpenFunction-Status'; /** * List of function signature types that are supported by the framework. diff --git a/test/integration/cloud_event.ts b/test/integration/cloud_event.ts index ac239f14..c57fa782 100644 --- a/test/integration/cloud_event.ts +++ b/test/integration/cloud_event.ts @@ -13,10 +13,13 @@ // limitations under the License. import * as assert from 'assert'; -import * as functions from '../../src/index'; + +import * as supertest from 'supertest'; import * as sinon from 'sinon'; + +import * as functions from '../../src/index'; import {getTestServer} from '../../src/testing'; -import * as supertest from 'supertest'; +import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; // A structured CloudEvent const TEST_CLOUD_EVENT = { @@ -316,7 +319,10 @@ describe('CloudEvent Function', () => { .post('/') .send(TEST_CLOUD_EVENT) .expect(res => { - assert.deepStrictEqual(res.headers['x-google-status'], 'error'); + assert.deepStrictEqual( + res.headers[FUNCTION_STATUS_HEADER_FIELD.toLowerCase()], + 'error' + ); assert.deepStrictEqual(res.body, {}); }) .expect(500); diff --git a/test/integration/http.ts b/test/integration/http.ts index f38c1dfb..6334410a 100644 --- a/test/integration/http.ts +++ b/test/integration/http.ts @@ -18,6 +18,7 @@ import * as supertest from 'supertest'; import * as functions from '../../src/index'; import {getTestServer} from '../../src/testing'; +import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; describe('HTTP Function', () => { let callCount = 0; @@ -99,13 +100,19 @@ describe('HTTP Function', () => { testData.forEach(test => { it(test.name, async () => { const st = supertest(getTestServer('testHttpFunction')); - await (test.httpVerb === 'GET' - ? st.get(test.path) - : st.post(test.path).send({text: 'hello'}) - ) - .set('Content-Type', 'application/json') - .expect(test.expectedBody) - .expect(test.expectedStatus); + try { + await (test.httpVerb === 'GET' + ? st.get(test.path) + : st.post(test.path).send({text: 'hello'}) + ) + .set('Content-Type', 'application/json') + .expect(test.expectedBody) + .expect(test.expectedStatus) + .expect(FUNCTION_STATUS_HEADER_FIELD, 'crash'); + } catch (err) { + test.expectedStatus === 500 && assert(err); + } + assert.strictEqual(callCount, test.expectedCallCount); }); }); diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts index ad6f4a46..7c91aa2c 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -9,6 +9,7 @@ import {OpenFunctionContext} from '../../src/openfunction/function_context'; import {OpenFunctionRuntime} from '../../src/functions'; import {getServer} from '../../src/server'; +import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; const TEST_CONTEXT: OpenFunctionContext = { name: 'test-context', @@ -72,6 +73,7 @@ describe('OpenFunction - HTTP Binding', () => { {name: 'Save data', operation: 'create', listable: true}, {name: 'Get data', operation: 'get', listable: true}, {name: 'Delete data', operation: 'delete', listable: false}, + {name: 'Error data', operation: '', listable: false}, ]; testData.forEach(test => { @@ -83,6 +85,8 @@ describe('OpenFunction - HTTP Binding', () => { const server = getServer( async (ctx: OpenFunctionRuntime, data: {}) => { + if (!test.operation) throw new Error('I crashed'); + await ctx.send(data); ctx.res?.send(data); }, @@ -93,9 +97,14 @@ describe('OpenFunction - HTTP Binding', () => { await supertest(server) .post('/') .send(TEST_PAYLOAD) - .expect(200) + .expect(test.operation ? 200 : 500) .expect(res => { - deepStrictEqual(res.body, TEST_PAYLOAD); + !test.operation + ? deepStrictEqual( + res.headers[FUNCTION_STATUS_HEADER_FIELD.toLowerCase()], + 'error' + ) + : deepStrictEqual(res.body, TEST_PAYLOAD); }); forEach(context.outputs, output => { diff --git a/test/integration/legacy_event.ts b/test/integration/legacy_event.ts index 89d3f3d3..f164b4f3 100644 --- a/test/integration/legacy_event.ts +++ b/test/integration/legacy_event.ts @@ -13,10 +13,13 @@ // limitations under the License. import * as assert from 'assert'; -import * as functions from '../../src/functions'; + +import * as supertest from 'supertest'; import * as sinon from 'sinon'; + +import * as functions from '../../src/index'; import {getServer} from '../../src/server'; -import * as supertest from 'supertest'; +import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; const TEST_CLOUD_EVENT = { specversion: '1.0', @@ -214,7 +217,10 @@ describe('Event Function', () => { }) .set({'Content-Type': 'application/json'}) .expect(res => { - assert.deepStrictEqual(res.headers['x-google-status'], 'error'); + assert.deepStrictEqual( + res.headers[FUNCTION_STATUS_HEADER_FIELD.toLowerCase()], + 'error' + ); assert.deepStrictEqual(res.body, {}); }) .expect(500); From c7a537a8414e79a29d35b490be884bfef39bc21a Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 27 May 2022 19:32:36 +0800 Subject: [PATCH 41/42] =?UTF-8?q?=F0=9F=93=9D=20doc(CHANGELOG):=20log=200.?= =?UTF-8?q?5.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c580e3d7..0914ad38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ [1]: https://www.npmjs.com/package/@openfunction/functions-framework?activeTab=versions +## 0.5.0 / 2022-05-27 + +We are having a standalone `openfunction` signature type starting from this release! + +Now you can use `function (ctx, data)` as the function signature along with `openfunction` signature type, this allows you to use sync functions in a far more flexible way - whenever there are functions output requirements, sync functions can also send output to Dapr output binding or pubsub components. + +Check the demo of HTTP request triggering async function: + +- Quickstart: +- Sample: + ## 0.4.1 / 2022-04-17 This feature release offically introduces the support of OpenFunction async function runtime, now your Node.js functions can enjoy the power of Dapr runtime starting from bindings and pubsub. Functions Framework will call [Dapr Node.js SDK](https://github.com/dapr/js-sdk) to bridge the communication with various Dapr input/output bindings or pubsub brokers components. From e9f92efb53d22f3885133a72db49f6607e77eb87 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 27 May 2022 19:33:07 +0800 Subject: [PATCH 42/42] =?UTF-8?q?=F0=9F=94=96=20chore:=20bump=200.5.0=20[n?= =?UTF-8?q?o=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 825ad14b..b8b045e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@openfunction/functions-framework", - "version": "0.4.1", + "version": "0.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@openfunction/functions-framework", - "version": "0.4.1", + "version": "0.5.0", "license": "Apache-2.0", "dependencies": { "@dapr/dapr": "^2.2.1", diff --git a/package.json b/package.json index 8f0a5811..0b40a356 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@openfunction/functions-framework", - "version": "0.4.1", + "version": "0.5.0", "description": "FaaS (Function as a service) framework for writing portable Node.js functions", "engines": { "node": ">=13.0.0"