From 7b2bc9154ae65991a53d264b3ba0c34c01e389e5 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 13 May 2022 16:40:42 +0800 Subject: [PATCH 001/131] =?UTF-8?q?=F0=9F=91=B7=20ci(bot):=20init=20some?= =?UTF-8?q?=20configs=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 002/131] =?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 003/131] =?UTF-8?q?=F0=9F=93=9D=20doc(api):=20update=20fun?= =?UTF-8?q?ction=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 004/131] =?UTF-8?q?=F0=9F=91=B7=20ci:=20add=20pre-push=20h?= =?UTF-8?q?ook?= 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 005/131] =?UTF-8?q?=E2=9C=A8=20feat:=20enable=20HTTP=20tri?= =?UTF-8?q?gger=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 006/131] =?UTF-8?q?=F0=9F=93=9D=20doc:=20update=20README?= =?UTF-8?q?=20and=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 007/131] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20ci:=20fix=20mergea?= =?UTF-8?q?ble=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 008/131] =?UTF-8?q?=F0=9F=91=94=20refactor:=20add=20`openf?= =?UTF-8?q?unction`=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 009/131] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(ofn/runti?= =?UTF-8?q?me):=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 010/131] =?UTF-8?q?=F0=9F=93=9D=20doc:=20update=20REAMDE?= =?UTF-8?q?=20and=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 011/131] =?UTF-8?q?=F0=9F=91=B7=20ci:=20add=20reviewdog=20?= =?UTF-8?q?action=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 012/131] =?UTF-8?q?=F0=9F=91=B7=20ci:=20add=20dependabot?= =?UTF-8?q?=20and=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 013/131] 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 014/131] 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 015/131] 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 016/131] 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 017/131] 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 018/131] 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 019/131] 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 020/131] 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 021/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20remove=20mac?= =?UTF-8?q?os=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 022/131] 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 023/131] 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 024/131] 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 025/131] 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 026/131] 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 027/131] 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 028/131] =?UTF-8?q?=F0=9F=90=9B=20fix(test/conformance):?= =?UTF-8?q?=20should=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 029/131] =?UTF-8?q?=F0=9F=93=9D=20doc(api):=20upgrade=20ap?= =?UTF-8?q?i-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 030/131] 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 031/131] =?UTF-8?q?=F0=9F=8E=A8=20refactor:=20add=20ofn=20?= =?UTF-8?q?register=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 032/131] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore(dep):=20use?= =?UTF-8?q?=20`@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 033/131] =?UTF-8?q?=F0=9F=91=B7=20ci(mergeable):=20remove?= =?UTF-8?q?=20draft=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 034/131] =?UTF-8?q?=F0=9F=93=9D=20doc(README):=20add=20rep?= =?UTF-8?q?obeats=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 035/131] =?UTF-8?q?=F0=9F=93=9D=20docs:=20polish=20puml=20?= =?UTF-8?q?and=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 036/131] 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 037/131] 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 038/131] =?UTF-8?q?=F0=9F=91=B7=20ci(bot/drafter):=20add?= =?UTF-8?q?=20security=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 039/131] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20chore:=20remove=20?= =?UTF-8?q?useless=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 040/131] =?UTF-8?q?=F0=9F=8E=A8=20refactor:=20polish=20htt?= =?UTF-8?q?p=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 041/131] =?UTF-8?q?=F0=9F=93=9D=20doc(CHANGELOG):=20log=20?= =?UTF-8?q?0.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 042/131] =?UTF-8?q?=F0=9F=94=96=20chore:=20bump=200.5.0=20?= =?UTF-8?q?[no=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" From a0fb6dfb3112b40d559c51e62e714cdd640b94f2 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 27 May 2022 21:30:57 +0800 Subject: [PATCH 043/131] =?UTF-8?q?=F0=9F=91=B7=20ci(bot/publish):=20switc?= =?UTF-8?q?h=20to=20manual=20mode=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/publish.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 99666bb1..cfc417df 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,6 +1,4 @@ -on: - release: - types: [created] +on: workflow_dispatch name: Publish to npmjs jobs: publish-to-npm: From 7277002e652bacf3dd2b67d2d9dc41fb428ced81 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 25 Jun 2022 23:00:00 +0800 Subject: [PATCH 044/131] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore:=20upgrade?= =?UTF-8?q?=20deps=20and=20deps-dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 303 +++++++++++++++++++++++++++++++--------------- package.json | 22 ++-- 2 files changed, 215 insertions(+), 110 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8b045e0..b429c5cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "license": "Apache-2.0", "dependencies": { "@dapr/dapr": "^2.2.1", - "body-parser": "^1.18.3", - "cloudevents": "^6.0.1", + "body-parser": "^1.20.0", + "cloudevents": "^6.0.2", "debug": "^4.3.4", - "express": "^4.16.4", + "express": "^4.18.1", "express-interceptor": "^1.2.0", "lodash": "^4.17.21", "minimist": "^1.2.5", @@ -26,21 +26,23 @@ "functions-framework-nodejs": "build/src/main.js" }, "devDependencies": { - "@microsoft/api-extractor": "^7.24.0", + "@microsoft/api-extractor": "^7.26.1", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", - "@types/lodash": "^4.14.179", + "@types/google-protobuf": "^3.15.6", + "@types/lodash": "^4.14.182", "@types/minimist": "1.2.2", "@types/mocha": "9.1.1", "@types/node": "14.18.11", + "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", - "@types/semver": "^7.3.6", + "@types/semver": "^7.3.10", "@types/shelljs": "^0.8.11", - "@types/sinon": "^10.0.0", - "@types/supertest": "2.0.11", + "@types/sinon": "^10.0.11", + "@types/supertest": "2.0.12", "aedes": "^0.47.0", - "concurrently": "^7.0.0", + "concurrently": "^7.2.2", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "gts": "^3.1.0", @@ -50,7 +52,7 @@ "shelljs": "^0.8.5", "sinon": "^14.0.0", "supertest": "6.2.3", - "typescript": "^4.5.5", + "typescript": "^4.7.4", "wait-on": "^6.0.1" }, "engines": { @@ -90,9 +92,9 @@ } }, "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==", + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.0.tgz", + "integrity": "sha512-zNNxoGAZjRulENGvDiLs5/0G+UolyBBkg8dJlMT/NaxE8EfI95KlXLJsR0LiQKSDwfu9gbA9Ew2z2tnIQZJCWw==", "dependencies": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", @@ -216,17 +218,17 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.24.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.24.0.tgz", - "integrity": "sha512-cC5Vcu3N2OJh1G5v136JYtE4QQtQYq6mLiL8YXzFgu8aoq8T88kzq3/TxlihJvqGnrD96pf4PjS2Yg8RNYTQYw==", + "version": "7.26.1", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.26.1.tgz", + "integrity": "sha512-hfBumS2bJbQujXP51E83yuOQim9Df60fA6kAr6pBrH3FX6vhOX+cg/zUx0maEXyQUgOTsST8XTl774Hxyh6kdw==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.17.3", + "@microsoft/api-extractor-model": "7.19.1", "@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", + "@rushstack/node-core-library": "3.46.0", + "@rushstack/rig-package": "0.3.12", + "@rushstack/ts-command-line": "4.12.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -239,14 +241,14 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "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==", + "version": "7.19.1", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.19.1.tgz", + "integrity": "sha512-nF2+4U6DYHne18+8IMJZR7NR/9rwEobzEwLqYYG1+GFefxZ0hEQTKBcqdSKToiHvZySXxcmtdXWZqzo3AbGe/A==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.45.5" + "@rushstack/node-core-library": "3.46.0" } }, "node_modules/@microsoft/api-extractor/node_modules/resolve": { @@ -392,9 +394,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { - "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==", + "version": "3.46.0", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.46.0.tgz", + "integrity": "sha512-5iF21WvppEkXUPkxXkkH7HlfK5jDNFTKPJT0M+t3fG8qteoJM2atQoLtXklS0yNgOXy5zNTVTO+9lSzfVUvrCA==", "dev": true, "dependencies": { "@types/node": "12.20.24", @@ -424,9 +426,9 @@ } }, "node_modules/@rushstack/rig-package": { - "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==", + "version": "0.3.12", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.12.tgz", + "integrity": "sha512-ZzxuBWG0wbOtI+9IHYvOsr3QN52GtxTWpcaHMsQ/PC9us2ve/k0xK0XOMu+CtStyHSnBG2nDdnF9vFv9HMYOZg==", "dev": true, "dependencies": { "resolve": "~1.17.0", @@ -443,9 +445,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "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==", + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.0.tgz", + "integrity": "sha512-+dC3ZwT1PjvsEnybXzM9UUYg4xdDOl6vmE+23eByxbWmAxo/nB8VAD5iFs+jbbUd9MtG/7xqCBWbMWEDA+cBjw==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -604,6 +606,12 @@ "@types/node": "*" } }, + "node_modules/@types/google-protobuf": { + "version": "3.15.6", + "resolved": "https://registry.npmmirror.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -653,9 +661,33 @@ }, "node_modules/@types/node": { "version": "14.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.11.tgz", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-14.18.11.tgz", "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==" }, + "node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", @@ -683,9 +715,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", - "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", + "version": "7.3.10", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.10.tgz", + "integrity": "sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==", "dev": true }, "node_modules/@types/serve-static": { @@ -709,14 +741,20 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", - "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", + "version": "10.0.11", + "resolved": "https://registry.npmmirror.com/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", "dev": true, "dependencies": { - "@sinonjs/fake-timers": "^7.1.0" + "@types/sinonjs__fake-timers": "*" } }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmmirror.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true + }, "node_modules/@types/superagent": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", @@ -728,9 +766,9 @@ } }, "node_modules/@types/supertest": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", - "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", "dev": true, "dependencies": { "@types/superagent": "*" @@ -1652,11 +1690,11 @@ } }, "node_modules/cloudevents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.1.tgz", - "integrity": "sha512-6Y2EOQKsEEciSeIPL8ENob2LcFSt/r0iftTefl3IanSVr2LyvXfbEdD5+pvufVDFdf6OVijvtl7UFx/0voMOsw==", + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/cloudevents/-/cloudevents-6.0.2.tgz", + "integrity": "sha512-mn/4EZnAbhfb/TghubK2jPnxYM15JRjf8LnWJtXidiVKi5ZCkd+p9jyBZbL57w7nRm6oFAzJhjxRLsXd/DNaBQ==", "dependencies": { - "ajv": "^8.6.3", + "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "util": "^0.12.4", "uuid": "^8.3.2" @@ -1781,15 +1819,15 @@ } }, "node_modules/concurrently": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.0.tgz", - "integrity": "sha512-4KIVY5HopDRhN3ndAgfFOLsMk1PZUPgghlgTMZ5Pb5aTrqYg86RcZaIZC2Cz+qpZ9DsX36WHGjvWnXPqdnblhw==", + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.2.2.tgz", + "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==", "dev": true, "dependencies": { "chalk": "^4.1.0", "date-fns": "^2.16.1", "lodash": "^4.17.21", - "rxjs": "^6.6.3", + "rxjs": "^7.0.0", "shell-quote": "^1.7.3", "spawn-command": "^0.0.2-1", "supports-color": "^8.1.0", @@ -1867,6 +1905,15 @@ "node": ">=8" } }, + "node_modules/concurrently/node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/concurrently/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", @@ -1879,6 +1926,12 @@ "node": ">=10" } }, + "node_modules/concurrently/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/concurrently/node_modules/yargs": { "version": "17.5.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", @@ -7035,9 +7088,9 @@ } }, "node_modules/typescript": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", - "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", + "version": "4.7.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7640,9 +7693,9 @@ } }, "@dapr/dapr": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.2.1.tgz", - "integrity": "sha512-SSA8dtsq0k7UERjwVjopGjZqiHQu+nVcd1v8DXy2KvIGbrx0EKS3Ir63TU/2m2vFl57F6k33bg4kbqNd1RRyAQ==", + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.0.tgz", + "integrity": "sha512-zNNxoGAZjRulENGvDiLs5/0G+UolyBBkg8dJlMT/NaxE8EfI95KlXLJsR0LiQKSDwfu9gbA9Ew2z2tnIQZJCWw==", "requires": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", @@ -7749,17 +7802,17 @@ } }, "@microsoft/api-extractor": { - "version": "7.24.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.24.0.tgz", - "integrity": "sha512-cC5Vcu3N2OJh1G5v136JYtE4QQtQYq6mLiL8YXzFgu8aoq8T88kzq3/TxlihJvqGnrD96pf4PjS2Yg8RNYTQYw==", + "version": "7.26.1", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.26.1.tgz", + "integrity": "sha512-hfBumS2bJbQujXP51E83yuOQim9Df60fA6kAr6pBrH3FX6vhOX+cg/zUx0maEXyQUgOTsST8XTl774Hxyh6kdw==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.17.3", + "@microsoft/api-extractor-model": "7.19.1", "@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", + "@rushstack/node-core-library": "3.46.0", + "@rushstack/rig-package": "0.3.12", + "@rushstack/ts-command-line": "4.12.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -7786,14 +7839,14 @@ } }, "@microsoft/api-extractor-model": { - "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==", + "version": "7.19.1", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.19.1.tgz", + "integrity": "sha512-nF2+4U6DYHne18+8IMJZR7NR/9rwEobzEwLqYYG1+GFefxZ0hEQTKBcqdSKToiHvZySXxcmtdXWZqzo3AbGe/A==", "dev": true, "requires": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.45.5" + "@rushstack/node-core-library": "3.46.0" } }, "@microsoft/tsdoc": { @@ -7907,9 +7960,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@rushstack/node-core-library": { - "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==", + "version": "3.46.0", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.46.0.tgz", + "integrity": "sha512-5iF21WvppEkXUPkxXkkH7HlfK5jDNFTKPJT0M+t3fG8qteoJM2atQoLtXklS0yNgOXy5zNTVTO+9lSzfVUvrCA==", "dev": true, "requires": { "@types/node": "12.20.24", @@ -7941,9 +7994,9 @@ } }, "@rushstack/rig-package": { - "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==", + "version": "0.3.12", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.12.tgz", + "integrity": "sha512-ZzxuBWG0wbOtI+9IHYvOsr3QN52GtxTWpcaHMsQ/PC9us2ve/k0xK0XOMu+CtStyHSnBG2nDdnF9vFv9HMYOZg==", "dev": true, "requires": { "resolve": "~1.17.0", @@ -7962,9 +8015,9 @@ } }, "@rushstack/ts-command-line": { - "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==", + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.0.tgz", + "integrity": "sha512-+dC3ZwT1PjvsEnybXzM9UUYg4xdDOl6vmE+23eByxbWmAxo/nB8VAD5iFs+jbbUd9MtG/7xqCBWbMWEDA+cBjw==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -8117,6 +8170,12 @@ "@types/node": "*" } }, + "@types/google-protobuf": { + "version": "3.15.6", + "resolved": "https://registry.npmmirror.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", + "dev": true + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -8166,9 +8225,32 @@ }, "@types/node": { "version": "14.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.11.tgz", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-14.18.11.tgz", "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==" }, + "@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", @@ -8196,9 +8278,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", - "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", + "version": "7.3.10", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.10.tgz", + "integrity": "sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==", "dev": true }, "@types/serve-static": { @@ -8222,14 +8304,20 @@ } }, "@types/sinon": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", - "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", + "version": "10.0.11", + "resolved": "https://registry.npmmirror.com/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", "dev": true, "requires": { - "@sinonjs/fake-timers": "^7.1.0" + "@types/sinonjs__fake-timers": "*" } }, + "@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmmirror.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true + }, "@types/superagent": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", @@ -8241,9 +8329,9 @@ } }, "@types/supertest": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", - "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", "dev": true, "requires": { "@types/superagent": "*" @@ -8914,11 +9002,11 @@ } }, "cloudevents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.1.tgz", - "integrity": "sha512-6Y2EOQKsEEciSeIPL8ENob2LcFSt/r0iftTefl3IanSVr2LyvXfbEdD5+pvufVDFdf6OVijvtl7UFx/0voMOsw==", + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/cloudevents/-/cloudevents-6.0.2.tgz", + "integrity": "sha512-mn/4EZnAbhfb/TghubK2jPnxYM15JRjf8LnWJtXidiVKi5ZCkd+p9jyBZbL57w7nRm6oFAzJhjxRLsXd/DNaBQ==", "requires": { - "ajv": "^8.6.3", + "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "util": "^0.12.4", "uuid": "^8.3.2" @@ -9034,15 +9122,15 @@ } }, "concurrently": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.0.tgz", - "integrity": "sha512-4KIVY5HopDRhN3ndAgfFOLsMk1PZUPgghlgTMZ5Pb5aTrqYg86RcZaIZC2Cz+qpZ9DsX36WHGjvWnXPqdnblhw==", + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.2.2.tgz", + "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==", "dev": true, "requires": { "chalk": "^4.1.0", "date-fns": "^2.16.1", "lodash": "^4.17.21", - "rxjs": "^6.6.3", + "rxjs": "^7.0.0", "shell-quote": "^1.7.3", "spawn-command": "^0.0.2-1", "supports-color": "^8.1.0", @@ -9101,6 +9189,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", @@ -9110,6 +9207,12 @@ "has-flag": "^4.0.0" } }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "yargs": { "version": "17.5.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", @@ -12953,9 +13056,9 @@ } }, "typescript": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", - "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", + "version": "4.7.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "unbox-primitive": { diff --git a/package.json b/package.json index 0b40a356..7350ac7f 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,10 @@ }, "dependencies": { "@dapr/dapr": "^2.2.1", - "body-parser": "^1.18.3", - "cloudevents": "^6.0.1", + "body-parser": "^1.20.0", + "cloudevents": "^6.0.2", "debug": "^4.3.4", - "express": "^4.16.4", + "express": "^4.18.1", "express-interceptor": "^1.2.0", "lodash": "^4.17.21", "minimist": "^1.2.5", @@ -52,21 +52,23 @@ "author": "OpenFunction", "license": "Apache-2.0", "devDependencies": { - "@microsoft/api-extractor": "^7.24.0", + "@microsoft/api-extractor": "^7.26.1", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", - "@types/lodash": "^4.14.179", + "@types/google-protobuf": "^3.15.6", + "@types/lodash": "^4.14.182", "@types/minimist": "1.2.2", "@types/mocha": "9.1.1", "@types/node": "14.18.11", + "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", - "@types/semver": "^7.3.6", + "@types/semver": "^7.3.10", "@types/shelljs": "^0.8.11", - "@types/sinon": "^10.0.0", - "@types/supertest": "2.0.11", + "@types/sinon": "^10.0.11", + "@types/supertest": "2.0.12", "aedes": "^0.47.0", - "concurrently": "^7.0.0", + "concurrently": "^7.2.2", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "gts": "^3.1.0", @@ -76,7 +78,7 @@ "shelljs": "^0.8.5", "sinon": "^14.0.0", "supertest": "6.2.3", - "typescript": "^4.5.5", + "typescript": "^4.7.4", "wait-on": "^6.0.1" } } From ff4f33ac4a31cd30e9d9fd17f332981133dad5c3 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 25 Jun 2022 23:01:23 +0800 Subject: [PATCH 045/131] =?UTF-8?q?=F0=9F=93=9D=20docs:=20update=20autogen?= =?UTF-8?q?=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generated/api.json | 94 ++++++++++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 15 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index 827731fc..bb043087 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,8 +1,8 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.24.0", - "schemaVersion": 1005, + "toolVersion": "7.26.1", + "schemaVersion": 1007, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", @@ -164,11 +164,13 @@ "canonicalReference": "@openfunction/functions-framework!", "docComment": "", "name": "@openfunction/functions-framework", + "preserveMemberOrder": false, "members": [ { "kind": "EntryPoint", "canonicalReference": "@openfunction/functions-framework!", "name": "", + "preserveMemberOrder": false, "members": [ { "kind": "Variable", @@ -193,6 +195,7 @@ "text": ") => void" } ], + "isReadonly": true, "releaseTag": "Public", "name": "cloudEvent", "variableTypeTokenRange": { @@ -233,6 +236,7 @@ } ], "name": "CloudEventFunction", + "preserveMemberOrder": false, "members": [ { "kind": "CallSignature", @@ -318,6 +322,7 @@ } ], "name": "CloudEventFunctionWithCallback", + "preserveMemberOrder": false, "members": [ { "kind": "CallSignature", @@ -399,6 +404,7 @@ ], "releaseTag": "Public", "name": "CloudFunctionsContext", + "preserveMemberOrder": false, "members": [ { "kind": "PropertySignature", @@ -418,6 +424,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "eventId", @@ -444,6 +451,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "eventType", @@ -470,6 +478,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "resource", @@ -496,6 +505,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "timestamp", @@ -519,6 +529,7 @@ ], "releaseTag": "Public", "name": "ComponentType", + "preserveMemberOrder": false, "members": [ { "kind": "EnumMember", @@ -615,6 +626,7 @@ ], "releaseTag": "Public", "name": "ContextUtils", + "preserveMemberOrder": false, "members": [ { "kind": "Method", @@ -643,13 +655,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": true, "returnTypeTokenRange": { "startIndex": 3, "endIndex": 4 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -661,6 +673,7 @@ "isOptional": false } ], + "isOptional": false, "name": "IsAsyncRuntime" }, { @@ -690,13 +703,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": true, "returnTypeTokenRange": { "startIndex": 3, "endIndex": 4 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -708,6 +721,7 @@ "isOptional": false } ], + "isOptional": false, "name": "IsBindingComponent" }, { @@ -737,13 +751,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": true, "returnTypeTokenRange": { "startIndex": 3, "endIndex": 4 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -755,6 +769,7 @@ "isOptional": false } ], + "isOptional": false, "name": "IsKnativeRuntime" }, { @@ -784,13 +799,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": true, "returnTypeTokenRange": { "startIndex": 3, "endIndex": 4 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -802,6 +817,7 @@ "isOptional": false } ], + "isOptional": false, "name": "IsPubSubComponent" } ], @@ -819,6 +835,7 @@ ], "releaseTag": "Public", "name": "Data", + "preserveMemberOrder": false, "members": [ { "kind": "PropertySignature", @@ -838,6 +855,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "data", @@ -861,6 +879,7 @@ ], "releaseTag": "Public", "name": "EventFunction", + "preserveMemberOrder": false, "members": [ { "kind": "CallSignature", @@ -937,6 +956,7 @@ ], "releaseTag": "Public", "name": "EventFunctionWithCallback", + "preserveMemberOrder": false, "members": [ { "kind": "CallSignature", @@ -1137,6 +1157,7 @@ "text": ") => void" } ], + "isReadonly": true, "releaseTag": "Public", "name": "http", "variableTypeTokenRange": { @@ -1156,6 +1177,7 @@ ], "releaseTag": "Public", "name": "HttpFunction", + "preserveMemberOrder": false, "members": [ { "kind": "CallSignature", @@ -1233,6 +1255,7 @@ ], "releaseTag": "Public", "name": "HttpFunctionResponse", + "preserveMemberOrder": false, "members": [ { "kind": "PropertySignature", @@ -1252,6 +1275,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "body", @@ -1278,6 +1302,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "code", @@ -1309,6 +1334,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "headers", @@ -1367,6 +1393,7 @@ ], "releaseTag": "Public", "name": "LegacyEvent", + "preserveMemberOrder": false, "members": [ { "kind": "PropertySignature", @@ -1387,6 +1414,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "context", @@ -1413,6 +1441,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "data", @@ -1436,6 +1465,7 @@ ], "releaseTag": "Public", "name": "OpenFunction", + "preserveMemberOrder": false, "members": [ { "kind": "CallSignature", @@ -1523,6 +1553,7 @@ "text": ") => void" } ], + "isReadonly": true, "releaseTag": "Public", "name": "openfunction", "variableTypeTokenRange": { @@ -1542,6 +1573,7 @@ ], "releaseTag": "Public", "name": "OpenFunctionBinding", + "preserveMemberOrder": false, "members": [ { "kind": "IndexSignature", @@ -1602,6 +1634,7 @@ ], "releaseTag": "Public", "name": "OpenFunctionComponent", + "preserveMemberOrder": false, "members": [ { "kind": "PropertySignature", @@ -1621,6 +1654,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "componentName", @@ -1656,6 +1690,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "componentType", @@ -1687,6 +1722,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "metadata", @@ -1713,6 +1749,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "operation", @@ -1739,6 +1776,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "uri", @@ -1762,6 +1800,7 @@ ], "releaseTag": "Public", "name": "OpenFunctionContext", + "preserveMemberOrder": false, "members": [ { "kind": "PropertySignature", @@ -1782,6 +1821,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "inputs", @@ -1808,6 +1848,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "name", @@ -1835,6 +1876,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "outputs", @@ -1861,6 +1903,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "port", @@ -1932,6 +1975,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "runtime", @@ -1958,6 +2002,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": false, "releaseTag": "Public", "name": "version", @@ -1981,6 +2026,7 @@ ], "releaseTag": "Public", "name": "OpenFunctionRuntime", + "preserveMemberOrder": false, "members": [ { "kind": "Constructor", @@ -2002,6 +2048,7 @@ } ], "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -2033,6 +2080,7 @@ "text": ";" } ], + "isReadonly": true, "isOptional": false, "releaseTag": "Public", "name": "context", @@ -2040,7 +2088,8 @@ "startIndex": 1, "endIndex": 2 }, - "isStatic": false + "isStatic": false, + "isProtected": true }, { "kind": "Method", @@ -2070,13 +2119,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": true, "returnTypeTokenRange": { "startIndex": 3, "endIndex": 4 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -2088,6 +2137,7 @@ "isOptional": false } ], + "isOptional": false, "name": "Parse" }, { @@ -2118,13 +2168,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": true, "returnTypeTokenRange": { "startIndex": 3, "endIndex": 4 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -2136,6 +2186,7 @@ "isOptional": false } ], + "isOptional": false, "name": "ProxyContext" }, { @@ -2188,6 +2239,7 @@ "text": ";" } ], + "isReadonly": true, "isOptional": false, "releaseTag": "Public", "name": "req", @@ -2195,7 +2247,8 @@ "startIndex": 1, "endIndex": 9 }, - "isStatic": false + "isStatic": false, + "isProtected": false }, { "kind": "Property", @@ -2229,6 +2282,7 @@ "text": ";" } ], + "isReadonly": true, "isOptional": false, "releaseTag": "Public", "name": "res", @@ -2236,7 +2290,8 @@ "startIndex": 1, "endIndex": 5 }, - "isStatic": false + "isStatic": false, + "isProtected": false }, { "kind": "Method", @@ -2277,13 +2332,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": false, "returnTypeTokenRange": { "startIndex": 5, "endIndex": 7 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -2303,6 +2358,7 @@ "isOptional": true } ], + "isOptional": false, "name": "send" }, { @@ -2341,13 +2397,13 @@ "text": ";" } ], - "isOptional": false, "isStatic": false, "returnTypeTokenRange": { "startIndex": 5, "endIndex": 6 }, "releaseTag": "Public", + "isProtected": false, "overloadIndex": 1, "parameters": [ { @@ -2367,6 +2423,7 @@ "isOptional": true } ], + "isOptional": false, "name": "setTrigger" }, { @@ -2387,6 +2444,7 @@ "text": ";" } ], + "isReadonly": true, "isOptional": false, "releaseTag": "Public", "name": "sidecarPort", @@ -2394,7 +2452,8 @@ "startIndex": 1, "endIndex": 2 }, - "isStatic": false + "isStatic": false, + "isProtected": false }, { "kind": "Property", @@ -2415,6 +2474,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "trigger", @@ -2422,7 +2482,8 @@ "startIndex": 1, "endIndex": 2 }, - "isStatic": false + "isStatic": false, + "isProtected": true } ], "implementsTokenRanges": [] @@ -2448,6 +2509,7 @@ ], "releaseTag": "Public", "name": "Request_2", + "preserveMemberOrder": false, "members": [ { "kind": "PropertySignature", @@ -2468,6 +2530,7 @@ "text": ";" } ], + "isReadonly": false, "isOptional": true, "releaseTag": "Public", "name": "rawBody", @@ -2496,6 +2559,7 @@ ], "releaseTag": "Public", "name": "RuntimeType", + "preserveMemberOrder": false, "members": [ { "kind": "EnumMember", From 4246534359139af0c8f6255b865ba4ae3f47387b Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 25 Jun 2022 23:13:04 +0800 Subject: [PATCH 046/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20upgrade=20da?= =?UTF-8?q?pr=20to=201.7.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .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 4ef0738e..554ef52d 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -21,7 +21,7 @@ jobs: - name: Install Dapr uses: dapr/setup-dapr@v1 with: - version: '1.5.1' + version: '1.7.3' - name: Install Docker for macOS uses: docker-practice/actions-setup-docker@master if: ${{ matrix.platform == 'macos-latest' }} From bac6e49fdad3b738c782f69bd3f5f1221300a974 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 25 Jun 2022 23:22:39 +0800 Subject: [PATCH 047/131] =?UTF-8?q?=F0=9F=93=8C=20chore(deps):=20pin=20dap?= =?UTF-8?q?r=20to=202.2.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 b429c5cc..8f92b70a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.5.0", "license": "Apache-2.0", "dependencies": { - "@dapr/dapr": "^2.2.1", + "@dapr/dapr": "2.2.1", "body-parser": "^1.20.0", "cloudevents": "^6.0.2", "debug": "^4.3.4", @@ -92,9 +92,9 @@ } }, "node_modules/@dapr/dapr": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.0.tgz", - "integrity": "sha512-zNNxoGAZjRulENGvDiLs5/0G+UolyBBkg8dJlMT/NaxE8EfI95KlXLJsR0LiQKSDwfu9gbA9Ew2z2tnIQZJCWw==", + "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", @@ -7693,9 +7693,9 @@ } }, "@dapr/dapr": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.0.tgz", - "integrity": "sha512-zNNxoGAZjRulENGvDiLs5/0G+UolyBBkg8dJlMT/NaxE8EfI95KlXLJsR0LiQKSDwfu9gbA9Ew2z2tnIQZJCWw==", + "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", diff --git a/package.json b/package.json index 7350ac7f..312d53b5 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "./testing": "./build/src/testing.js" }, "dependencies": { - "@dapr/dapr": "^2.2.1", + "@dapr/dapr": "2.2.1", "body-parser": "^1.20.0", "cloudevents": "^6.0.2", "debug": "^4.3.4", From f54426613a0179adea8ae61cf0981518dc778363 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 25 Jun 2022 23:26:08 +0800 Subject: [PATCH 048/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20use=20dapr?= =?UTF-8?q?=20cli=201.7.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .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 554ef52d..ccb68637 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -21,7 +21,7 @@ jobs: - name: Install Dapr uses: dapr/setup-dapr@v1 with: - version: '1.7.3' + version: '1.7.1' - name: Install Docker for macOS uses: docker-practice/actions-setup-docker@master if: ${{ matrix.platform == 'macos-latest' }} From 894264dff7c262c47cccd09c16cba1d41063bca7 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 26 Jun 2022 12:32:50 +0800 Subject: [PATCH 049/131] =?UTF-8?q?=F0=9F=93=83=20chore:=20initialize=20is?= =?UTF-8?q?sue=20templates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.md | 23 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..e5b6a71e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,23 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] " +labels: 'type: bug' +assignees: '' + +--- + +### Describe the bug + + +### How to reproduce + + +### Expected behavior + + +### Screenshots + + +### Additional context + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..82d15e07 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE] " +labels: 'type: feature' +assignees: '' + +--- + +### Please describe your usage scenario + + +### Describe the solution you'd like + + +### Describe alternatives you've considered + + +### Additional context + From 628e2b3809da15036f86f0144315b757e44a7602 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Mon, 27 Jun 2022 15:18:10 +0800 Subject: [PATCH 050/131] =?UTF-8?q?=F0=9F=93=9D=20docs(CONTRIBUTING):=20ad?= =?UTF-8?q?d=20commit=20msg=20guides?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4c9412c2..026aaa70 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,6 +8,12 @@ Contributions to this project must be accompanied by a Developer Certificate of 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. +## Commit Guidelines + +Commits to this project must follow [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/) specification, especially the commit message structure. + +Besides, we recommend that you could use [gitmoji](https://gitmoji.dev/related-tools) tool in your IDE to add proper emoji prefix to each commit. + ## 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. From 3614f2310005ee83ca3fc68a722f6721e642b9a9 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Mon, 27 Jun 2022 15:27:06 +0800 Subject: [PATCH 051/131] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore(deps-dev):?= =?UTF-8?q?=20upgrade=20api-extractor=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generated/api.json | 28 ++++++++++++------------- package-lock.json | 45 +++++++++++++++++++---------------------- package.json | 2 +- 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index bb043087..3c0972e7 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,8 +1,8 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.26.1", - "schemaVersion": 1007, + "toolVersion": "7.27.0", + "schemaVersion": 1008, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", @@ -545,12 +545,12 @@ "text": "\"bindings\"" } ], - "releaseTag": "Public", - "name": "Binding", "initializerTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "releaseTag": "Public", + "name": "Binding" }, { "kind": "EnumMember", @@ -566,12 +566,12 @@ "text": "\"pubsub\"" } ], - "releaseTag": "Public", - "name": "PubSub", "initializerTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "releaseTag": "Public", + "name": "PubSub" } ] }, @@ -2575,12 +2575,12 @@ "text": "\"async\"" } ], - "releaseTag": "Public", - "name": "Async", "initializerTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "releaseTag": "Public", + "name": "Async" }, { "kind": "EnumMember", @@ -2596,12 +2596,12 @@ "text": "\"knative\"" } ], - "releaseTag": "Public", - "name": "Knative", "initializerTokenRange": { "startIndex": 1, "endIndex": 2 - } + }, + "releaseTag": "Public", + "name": "Knative" } ] } diff --git a/package-lock.json b/package-lock.json index 8f92b70a..adff984c 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.26.1", + "@microsoft/api-extractor": "^7.27.0", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", @@ -218,12 +218,12 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.26.1", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.26.1.tgz", - "integrity": "sha512-hfBumS2bJbQujXP51E83yuOQim9Df60fA6kAr6pBrH3FX6vhOX+cg/zUx0maEXyQUgOTsST8XTl774Hxyh6kdw==", + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.27.0.tgz", + "integrity": "sha512-rzVl2Rf3LQ2b7ykymVJSXZwRcy/QuwqlLmYh7NRi9Ilkk66aOloJTBgkkni/wlg5/RyohQKSdOmFYHcF+IiS3A==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.19.1", + "@microsoft/api-extractor-model": "7.20.0", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.46.0", @@ -241,9 +241,9 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.19.1", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.19.1.tgz", - "integrity": "sha512-nF2+4U6DYHne18+8IMJZR7NR/9rwEobzEwLqYYG1+GFefxZ0hEQTKBcqdSKToiHvZySXxcmtdXWZqzo3AbGe/A==", + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.20.0.tgz", + "integrity": "sha512-6gK6ipnBsSZ9uLrUBHg3q1V7gvzvB1zVb8lbtrpKl3mQJ7vvXJm2sDNl3Vlt1gy0izgQb9s6mmyy7hLRh1qFRg==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.1", @@ -253,19 +253,16 @@ }, "node_modules/@microsoft/api-extractor/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/@microsoft/api-extractor/node_modules/typescript": { "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.6.4.tgz", "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true, "bin": { @@ -6607,7 +6604,7 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { @@ -7802,12 +7799,12 @@ } }, "@microsoft/api-extractor": { - "version": "7.26.1", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.26.1.tgz", - "integrity": "sha512-hfBumS2bJbQujXP51E83yuOQim9Df60fA6kAr6pBrH3FX6vhOX+cg/zUx0maEXyQUgOTsST8XTl774Hxyh6kdw==", + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.27.0.tgz", + "integrity": "sha512-rzVl2Rf3LQ2b7ykymVJSXZwRcy/QuwqlLmYh7NRi9Ilkk66aOloJTBgkkni/wlg5/RyohQKSdOmFYHcF+IiS3A==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.19.1", + "@microsoft/api-extractor-model": "7.20.0", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.46.0", @@ -7823,7 +7820,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": { @@ -7832,16 +7829,16 @@ }, "typescript": { "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.6.4.tgz", "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.19.1", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.19.1.tgz", - "integrity": "sha512-nF2+4U6DYHne18+8IMJZR7NR/9rwEobzEwLqYYG1+GFefxZ0hEQTKBcqdSKToiHvZySXxcmtdXWZqzo3AbGe/A==", + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.20.0.tgz", + "integrity": "sha512-6gK6ipnBsSZ9uLrUBHg3q1V7gvzvB1zVb8lbtrpKl3mQJ7vvXJm2sDNl3Vlt1gy0izgQb9s6mmyy7hLRh1qFRg==", "dev": true, "requires": { "@microsoft/tsdoc": "0.14.1", @@ -12681,7 +12678,7 @@ }, "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, diff --git a/package.json b/package.json index 312d53b5..09be0a5d 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "author": "OpenFunction", "license": "Apache-2.0", "devDependencies": { - "@microsoft/api-extractor": "^7.26.1", + "@microsoft/api-extractor": "^7.27.0", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", From 3b5aebfef0ae62329aca56d2892552185b211496 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Tue, 28 Jun 2022 22:35:38 +0800 Subject: [PATCH 052/131] =?UTF-8?q?=F0=9F=91=B7=20ci(bot):=20copycat=20ass?= =?UTF-8?q?ign-bot=20from=20dapr=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/assign-bot.yml | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/assign-bot.yml diff --git a/.github/workflows/assign-bot.yml b/.github/workflows/assign-bot.yml new file mode 100644 index 00000000..cf672744 --- /dev/null +++ b/.github/workflows/assign-bot.yml @@ -0,0 +1,46 @@ +# ------------------------------------------------------------ +# Copyright 2021 The Dapr Authors +# 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. +# ------------------------------------------------------------ + +name: assign-bot + +on: + issue_comment: + types: [created] + +jobs: + daprbot: + name: bot-processor + runs-on: ubuntu-latest + steps: + - name: Comment analyzer + uses: actions/github-script@v1 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const payload = context.payload; + const issue = context.issue; + const isFromPulls = !!payload.issue.pull_request; + const commentBody = payload.comment.body; + + if (!isFromPulls && commentBody && commentBody.indexOf("/assign") == 0) { + if (!issue.assignees || issue.assignees.length === 0) { + await github.issues.addAssignees({ + owner: issue.owner, + repo: issue.repo, + issue_number: issue.number, + assignees: [context.actor], + }) + } + + return; + } From 6767f90fc125cbbba7c66f245e31dedda38f35f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jun 2022 03:35:21 +0000 Subject: [PATCH 053/131] chore(deps): bump actions/github-script from 1 to 6 Bumps [actions/github-script](https://github.com/actions/github-script) from 1 to 6. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v1...v6) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/assign-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/assign-bot.yml b/.github/workflows/assign-bot.yml index cf672744..e771bcdd 100644 --- a/.github/workflows/assign-bot.yml +++ b/.github/workflows/assign-bot.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Comment analyzer - uses: actions/github-script@v1 + uses: actions/github-script@v6 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | From f1198e674ee51daf6a6fa8f2634db2ce11023817 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Tue, 5 Jul 2022 17:35:51 +0800 Subject: [PATCH 054/131] =?UTF-8?q?=F0=9F=90=9B=20fix(assign-bot):=20shoul?= =?UTF-8?q?d=20use=20`github.rest.*`=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/assign-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/assign-bot.yml b/.github/workflows/assign-bot.yml index e771bcdd..e8baf045 100644 --- a/.github/workflows/assign-bot.yml +++ b/.github/workflows/assign-bot.yml @@ -34,7 +34,7 @@ jobs: if (!isFromPulls && commentBody && commentBody.indexOf("/assign") == 0) { if (!issue.assignees || issue.assignees.length === 0) { - await github.issues.addAssignees({ + await github.rest.issues.addAssignees({ owner: issue.owner, repo: issue.repo, issue_number: issue.number, From 820c4627505227903de467376d8206d87787abac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Jul 2022 03:43:43 +0000 Subject: [PATCH 055/131] chore(deps-dev): bump concurrently from 7.2.2 to 7.3.0 Bumps [concurrently](https://github.com/open-cli-tools/concurrently) from 7.2.2 to 7.3.0. - [Release notes](https://github.com/open-cli-tools/concurrently/releases) - [Commits](https://github.com/open-cli-tools/concurrently/compare/v7.2.2...v7.3.0) --- updated-dependencies: - dependency-name: concurrently dependency-type: direct:development 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 adff984c..c61cfb20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1816,9 +1816,9 @@ } }, "node_modules/concurrently": { - "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.2.2.tgz", - "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz", + "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -9119,9 +9119,9 @@ } }, "concurrently": { - "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.2.2.tgz", - "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz", + "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==", "dev": true, "requires": { "chalk": "^4.1.0", From ad398779f720b2a34512473e997b00bc8c8a5f99 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Tue, 19 Jul 2022 12:10:55 +0800 Subject: [PATCH 056/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20use=20dapr?= =?UTF-8?q?=20cli=201.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .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 ccb68637..d6756228 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -21,7 +21,7 @@ jobs: - name: Install Dapr uses: dapr/setup-dapr@v1 with: - version: '1.7.1' + version: '1.8.0' - name: Install Docker for macOS uses: docker-practice/actions-setup-docker@master if: ${{ matrix.platform == 'macos-latest' }} From b6856da979ca704781dfd22b3969277bbbe0dc56 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Tue, 19 Jul 2022 13:02:50 +0800 Subject: [PATCH 057/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20lock=20dapr?= =?UTF-8?q?=20runtime=20to=201.7.1?= 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 d6756228..cfc3e7bf 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -26,7 +26,7 @@ jobs: uses: docker-practice/actions-setup-docker@master if: ${{ matrix.platform == 'macos-latest' }} - name: Initialize Dapr - run: dapr init + run: dapr init -s --runtime-version 1.7.1 - name: Install dependencies run: npm install - name: Build TypeScript project From 351c63911cd30597dfb4cd83e856c375899b8ccf Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Tue, 19 Jul 2022 14:00:45 +0800 Subject: [PATCH 058/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20try=20to=20e?= =?UTF-8?q?nable=20dapr=20matrix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/workflows/unit.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index cfc3e7bf..613898ca 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,6 +9,7 @@ jobs: strategy: matrix: node-version: [16] + dapr-version: [1.6.3, 1.7.4] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: @@ -26,7 +27,7 @@ jobs: uses: docker-practice/actions-setup-docker@master if: ${{ matrix.platform == 'macos-latest' }} - name: Initialize Dapr - run: dapr init -s --runtime-version 1.7.1 + run: dapr init -s --runtime-version ${{ matrix.dapr-version }} - name: Install dependencies run: npm install - name: Build TypeScript project From 820ac94b887788caa45f652f9a3fdd939a4b7555 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 20 Jul 2022 17:55:54 +0800 Subject: [PATCH 059/131] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore:=20bump=20de?= =?UTF-8?q?ps=20and=20deps-dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 106 +++++++++++++++++++++++----------------------- package.json | 14 +++--- 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index c61cfb20..856f28ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,17 +16,17 @@ "express": "^4.18.1", "express-interceptor": "^1.2.0", "lodash": "^4.17.21", - "minimist": "^1.2.5", - "on-finished": "^2.3.0", + "minimist": "^1.2.6", + "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", - "semver": "^7.3.5" + "semver": "^7.3.7" }, "bin": { "functions-framework": "build/src/main.js", "functions-framework-nodejs": "build/src/main.js" }, "devDependencies": { - "@microsoft/api-extractor": "^7.27.0", + "@microsoft/api-extractor": "^7.28.4", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", @@ -39,16 +39,16 @@ "@types/on-finished": "2.3.1", "@types/semver": "^7.3.10", "@types/shelljs": "^0.8.11", - "@types/sinon": "^10.0.11", + "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", "aedes": "^0.47.0", - "concurrently": "^7.2.2", + "concurrently": "^7.3.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "gts": "^3.1.0", "mocha": "10.0.0", "pack-n-play": "^1.0.0-2", - "pre-push": "^0.1.2", + "pre-push": "^0.1.3", "shelljs": "^0.8.5", "sinon": "^14.0.0", "supertest": "6.2.3", @@ -218,17 +218,17 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.27.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.27.0.tgz", - "integrity": "sha512-rzVl2Rf3LQ2b7ykymVJSXZwRcy/QuwqlLmYh7NRi9Ilkk66aOloJTBgkkni/wlg5/RyohQKSdOmFYHcF+IiS3A==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.28.4.tgz", + "integrity": "sha512-7JeROBGYTUt4/4HPnpMscsQgLzX0OfGTQR2qOQzzh3kdkMyxmiv2mzpuhoMnwbubb1GvPcyFm+NguoqOqkCVaw==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.20.0", + "@microsoft/api-extractor-model": "7.21.0", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.46.0", - "@rushstack/rig-package": "0.3.12", - "@rushstack/ts-command-line": "4.12.0", + "@rushstack/node-core-library": "3.49.0", + "@rushstack/rig-package": "0.3.13", + "@rushstack/ts-command-line": "4.12.1", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -241,14 +241,14 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.20.0.tgz", - "integrity": "sha512-6gK6ipnBsSZ9uLrUBHg3q1V7gvzvB1zVb8lbtrpKl3mQJ7vvXJm2sDNl3Vlt1gy0izgQb9s6mmyy7hLRh1qFRg==", + "version": "7.21.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.21.0.tgz", + "integrity": "sha512-NN4mXzoQWTuzznIcnLWeV6tGyn6Os9frDK6M/mmTXZ73vUYOvSWoKQ5SYzyzP7HF3YtvTmr1Rs+DsBb0HRx7WQ==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.46.0" + "@rushstack/node-core-library": "3.49.0" } }, "node_modules/@microsoft/api-extractor/node_modules/resolve": { @@ -391,9 +391,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { - "version": "3.46.0", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.46.0.tgz", - "integrity": "sha512-5iF21WvppEkXUPkxXkkH7HlfK5jDNFTKPJT0M+t3fG8qteoJM2atQoLtXklS0yNgOXy5zNTVTO+9lSzfVUvrCA==", + "version": "3.49.0", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.49.0.tgz", + "integrity": "sha512-yBJRzGgUNFwulVrwwBARhbGaHsxVMjsZ9JwU1uSBbqPYCdac+t2HYdzi4f4q/Zpgb0eNbwYj2yxgHYpJORNEaw==", "dev": true, "dependencies": { "@types/node": "12.20.24", @@ -423,9 +423,9 @@ } }, "node_modules/@rushstack/rig-package": { - "version": "0.3.12", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.12.tgz", - "integrity": "sha512-ZzxuBWG0wbOtI+9IHYvOsr3QN52GtxTWpcaHMsQ/PC9us2ve/k0xK0XOMu+CtStyHSnBG2nDdnF9vFv9HMYOZg==", + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.13.tgz", + "integrity": "sha512-4/2+yyA/uDl7LQvtYtFs1AkhSWuaIGEKhP9/KK2nNARqOVc5eCXmu1vyOqr5mPvNq7sHoIR+sG84vFbaKYGaDA==", "dev": true, "dependencies": { "resolve": "~1.17.0", @@ -442,9 +442,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.12.0", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.0.tgz", - "integrity": "sha512-+dC3ZwT1PjvsEnybXzM9UUYg4xdDOl6vmE+23eByxbWmAxo/nB8VAD5iFs+jbbUd9MtG/7xqCBWbMWEDA+cBjw==", + "version": "4.12.1", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.1.tgz", + "integrity": "sha512-S1Nev6h/kNnamhHeGdp30WgxZTA+B76SJ/P721ctP7DrnC+rrjAc6h/R80I4V0cA2QuEEcMdVOQCtK2BTjsOiQ==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -5699,9 +5699,9 @@ } }, "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==", + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.3.tgz", + "integrity": "sha512-PXc3tT7jq/H2VrEooQ8F9QCVfQawmd52CzWMemUrPlFnL8avaXY22NTuej3ClISy8EwStaB5myiigPBP4zqSbw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -7799,17 +7799,17 @@ } }, "@microsoft/api-extractor": { - "version": "7.27.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.27.0.tgz", - "integrity": "sha512-rzVl2Rf3LQ2b7ykymVJSXZwRcy/QuwqlLmYh7NRi9Ilkk66aOloJTBgkkni/wlg5/RyohQKSdOmFYHcF+IiS3A==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.28.4.tgz", + "integrity": "sha512-7JeROBGYTUt4/4HPnpMscsQgLzX0OfGTQR2qOQzzh3kdkMyxmiv2mzpuhoMnwbubb1GvPcyFm+NguoqOqkCVaw==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.20.0", + "@microsoft/api-extractor-model": "7.21.0", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.46.0", - "@rushstack/rig-package": "0.3.12", - "@rushstack/ts-command-line": "4.12.0", + "@rushstack/node-core-library": "3.49.0", + "@rushstack/rig-package": "0.3.13", + "@rushstack/ts-command-line": "4.12.1", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -7836,14 +7836,14 @@ } }, "@microsoft/api-extractor-model": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.20.0.tgz", - "integrity": "sha512-6gK6ipnBsSZ9uLrUBHg3q1V7gvzvB1zVb8lbtrpKl3mQJ7vvXJm2sDNl3Vlt1gy0izgQb9s6mmyy7hLRh1qFRg==", + "version": "7.21.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.21.0.tgz", + "integrity": "sha512-NN4mXzoQWTuzznIcnLWeV6tGyn6Os9frDK6M/mmTXZ73vUYOvSWoKQ5SYzyzP7HF3YtvTmr1Rs+DsBb0HRx7WQ==", "dev": true, "requires": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.46.0" + "@rushstack/node-core-library": "3.49.0" } }, "@microsoft/tsdoc": { @@ -7957,9 +7957,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@rushstack/node-core-library": { - "version": "3.46.0", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.46.0.tgz", - "integrity": "sha512-5iF21WvppEkXUPkxXkkH7HlfK5jDNFTKPJT0M+t3fG8qteoJM2atQoLtXklS0yNgOXy5zNTVTO+9lSzfVUvrCA==", + "version": "3.49.0", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.49.0.tgz", + "integrity": "sha512-yBJRzGgUNFwulVrwwBARhbGaHsxVMjsZ9JwU1uSBbqPYCdac+t2HYdzi4f4q/Zpgb0eNbwYj2yxgHYpJORNEaw==", "dev": true, "requires": { "@types/node": "12.20.24", @@ -7991,9 +7991,9 @@ } }, "@rushstack/rig-package": { - "version": "0.3.12", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.12.tgz", - "integrity": "sha512-ZzxuBWG0wbOtI+9IHYvOsr3QN52GtxTWpcaHMsQ/PC9us2ve/k0xK0XOMu+CtStyHSnBG2nDdnF9vFv9HMYOZg==", + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.13.tgz", + "integrity": "sha512-4/2+yyA/uDl7LQvtYtFs1AkhSWuaIGEKhP9/KK2nNARqOVc5eCXmu1vyOqr5mPvNq7sHoIR+sG84vFbaKYGaDA==", "dev": true, "requires": { "resolve": "~1.17.0", @@ -8012,9 +8012,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.12.0", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.0.tgz", - "integrity": "sha512-+dC3ZwT1PjvsEnybXzM9UUYg4xdDOl6vmE+23eByxbWmAxo/nB8VAD5iFs+jbbUd9MtG/7xqCBWbMWEDA+cBjw==", + "version": "4.12.1", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.1.tgz", + "integrity": "sha512-S1Nev6h/kNnamhHeGdp30WgxZTA+B76SJ/P721ctP7DrnC+rrjAc6h/R80I4V0cA2QuEEcMdVOQCtK2BTjsOiQ==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -11989,9 +11989,9 @@ "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==", + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.3.tgz", + "integrity": "sha512-PXc3tT7jq/H2VrEooQ8F9QCVfQawmd52CzWMemUrPlFnL8avaXY22NTuej3ClISy8EwStaB5myiigPBP4zqSbw==", "dev": true, "requires": { "cross-spawn": "^5.0.1", diff --git a/package.json b/package.json index 09be0a5d..33b2d299 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,10 @@ "express": "^4.18.1", "express-interceptor": "^1.2.0", "lodash": "^4.17.21", - "minimist": "^1.2.5", - "on-finished": "^2.3.0", + "minimist": "^1.2.6", + "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", - "semver": "^7.3.5" + "semver": "^7.3.7" }, "scripts": { "test": "cross-env DEBUG=common:*,ofn:* mocha build/test -t 60000 --recursive --exit", @@ -52,7 +52,7 @@ "author": "OpenFunction", "license": "Apache-2.0", "devDependencies": { - "@microsoft/api-extractor": "^7.27.0", + "@microsoft/api-extractor": "^7.28.4", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", @@ -65,16 +65,16 @@ "@types/on-finished": "2.3.1", "@types/semver": "^7.3.10", "@types/shelljs": "^0.8.11", - "@types/sinon": "^10.0.11", + "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", "aedes": "^0.47.0", - "concurrently": "^7.2.2", + "concurrently": "^7.3.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "gts": "^3.1.0", "mocha": "10.0.0", "pack-n-play": "^1.0.0-2", - "pre-push": "^0.1.2", + "pre-push": "^0.1.3", "shelljs": "^0.8.5", "sinon": "^14.0.0", "supertest": "6.2.3", From cab11148c0bd0f60b89ae2d2d4fe642f81d5e450 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 20 Jul 2022 17:58:13 +0800 Subject: [PATCH 060/131] =?UTF-8?q?=F0=9F=93=9D=20docs:=20bump=20api=20doc?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/generated/api.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index 3c0972e7..e37b3605 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,8 +1,8 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.27.0", - "schemaVersion": 1008, + "toolVersion": "7.28.4", + "schemaVersion": 1009, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", @@ -1602,6 +1602,7 @@ "text": ";" } ], + "isReadonly": false, "returnTypeTokenRange": { "startIndex": 3, "endIndex": 4 From 148ad5427507c198569d82a0780617be02076ddf Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 20 Jul 2022 18:01:00 +0800 Subject: [PATCH 061/131] =?UTF-8?q?=E2=9C=85=20fix(test/e2e):=20use=20dire?= =?UTF-8?q?ct=20ce=20msg=20for=20pubsub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- test/integration/async_server.ts | 40 +++++++++++++++++++------------- test/integration/cloud_event.ts | 2 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index 7a155277..23d5a4c2 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -2,7 +2,7 @@ import {deepStrictEqual, ifError, ok} from 'assert'; import {createServer} from 'net'; -import {get} from 'lodash'; +import {get, isEmpty} from 'lodash'; import * as shell from 'shelljs'; import * as MQTT from 'aedes'; @@ -54,7 +54,16 @@ const TEST_CONTEXT: OpenFunctionContext = { }, }, }; + const TEST_PAYLOAD = {data: 'hello world'}; +const TEST_CLOUD_EVENT = { + specversion: '1.0', + id: 'test-1234-1234', + type: 'ce.openfunction', + source: 'https://github.com/OpenFunction/functions-framework-nodejs', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', + data: TEST_PAYLOAD, +}; describe('OpenFunction - Async - Binding', () => { const APPID = 'async.dapr'; @@ -139,15 +148,12 @@ describe('OpenFunction - Async - Binding', () => { it('mqtt sub w/ pub output', done => { const app = getAysncServer((ctx, data) => { + if (isEmpty(data)) return; + // Assert that user function receives correct data from input binding - try { - const recieved = JSON.parse(data as string); - deepStrictEqual(recieved, TEST_PAYLOAD); - } catch (err) { - ifError(err); - } + deepStrictEqual(data, TEST_PAYLOAD); - // Then write recived data to a local file + // Then forward received data to output channel const output = 'mqtt_pub'; broker.subscribe( get(TEST_CONTEXT, `outputs.${output}.uri`), @@ -165,15 +171,17 @@ describe('OpenFunction - Async - Binding', () => { // First, we start the async server app.start().then(() => { - // Then, we publish a message via Dapr CLI - const formatted = JSON.stringify(TEST_PAYLOAD).replace(/"/g, '\\"'); - shell.exec( - `dapr publish -i ${APPID} -p ${ - TEST_CONTEXT.inputs!.mqtt_sub!.componentName - } -t ${TEST_CONTEXT.inputs!.mqtt_sub.uri} -d '"${formatted}"'`, + // Then, we send a cloudevent format message to server + broker.publish( { - silent: true, - } + cmd: 'publish', + topic: TEST_CONTEXT.inputs!.mqtt_sub.uri!, + payload: JSON.stringify(TEST_CLOUD_EVENT), + qos: 0, + retain: false, + dup: false, + }, + err => ifError(err) ); }); }); diff --git a/test/integration/cloud_event.ts b/test/integration/cloud_event.ts index c57fa782..ce21b81d 100644 --- a/test/integration/cloud_event.ts +++ b/test/integration/cloud_event.ts @@ -25,7 +25,7 @@ import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; const TEST_CLOUD_EVENT = { specversion: '1.0', type: 'com.google.cloud.storage', - source: 'https://github.com/GoogleCloudPlatform/functions-framework-nodejs', + source: 'https://github.com/OpenFunction/functions-framework-nodejs', subject: 'test-subject', id: 'test-1234-1234', time: '2020-05-13T01:23:45Z', From d44a6d5287eb72d025ce4aed5c9ebf3b78d45350 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 20 Jul 2022 18:01:29 +0800 Subject: [PATCH 062/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20introduce=20?= =?UTF-8?q?dapr=201.8.0?= 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 613898ca..449346cd 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - dapr-version: [1.6.3, 1.7.4] + dapr-version: [1.6.3, 1.7.4, 1.8.0] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: From a316c7dc95557d2c19f7f6688174b03d76dd6b39 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 20 Jul 2022 20:06:23 +0800 Subject: [PATCH 063/131] =?UTF-8?q?=F0=9F=91=B7=20ci(bot):=20add=20stale?= =?UTF-8?q?=20and=20rename=20assign=20bot=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .../workflows/{assign-bot.yml => assign.yml} | 0 .github/workflows/stale.yml | 54 +++++++++++++++++++ 2 files changed, 54 insertions(+) rename .github/workflows/{assign-bot.yml => assign.yml} (100%) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/assign-bot.yml b/.github/workflows/assign.yml similarity index 100% rename from .github/workflows/assign-bot.yml rename to .github/workflows/assign.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 00000000..8b5e9cc6 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,54 @@ +# +# Copyright 2022 The Dapr Authors +# 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. +# + +name: stale-bot + +on: + schedule: + - cron: '*/10 * * * *' + workflow_dispatch: + +jobs: + prune_stale: + name: Prune Stale + runs-on: ubuntu-latest + steps: + - name: Prune Stale + uses: actions/stale@v5.1.0 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + days-before-issue-stale: 60 + days-before-pr-stale: 30 + days-before-close: 7 + stale-issue-message: > + This issue has been automatically marked as stale because it has not had activity in the last 60 days. + It will be closed in the next 7 days unless it is tagged (pinned, good first issue, help wanted or triaged/resolved) or other activity occurs. + Thank you for your contributions. + close-issue-message: > + This issue has been automatically closed because it has not had activity in the last 67 days. + If this issue is still valid, please ping a maintainer and ask them to label it as pinned, good first issue, help wanted or triaged/resolved. + Thank you for your contributions. + stale-pr-message: > + This pull request has been automatically marked as stale because it has not had activity in the last 30 days. + It will be closed in 7 days if no further activity occurs. Please feel free to give a status update now, ping for review, or re-open when it's ready. + Thank you for your contributions! + close-pr-message: > + This pull request has been automatically closed because it has not had activity in the last 37 days. + Please feel free to give a status update now, ping for review, or re-open when it's ready. + Thank you for your contributions! + stale-issue-label: 'stale' + exempt-issue-labels: 'pinned, good first issue, help wanted, triaged/resolved, triaged/unresolved' + stale-pr-label: 'stale' + exempt-pr-labels: 'pinned' + operations-per-run: 500 + ascending: true From ccc375b5d2af2518c7b5baa37a1c43ed5c85d3df Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 21 Jul 2022 11:06:47 +0800 Subject: [PATCH 064/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20bump=20dapr?= =?UTF-8?q?=201.8.1?= 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 449346cd..6deae38c 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - dapr-version: [1.6.3, 1.7.4, 1.8.0] + dapr-version: [1.6.3, 1.7.4, 1.8.1] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: From 5388e5011a73f15f27a0603d68ec6587e8e95a1c Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Wed, 27 Jul 2022 19:54:55 +0800 Subject: [PATCH 065/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20bump=20dapr?= =?UTF-8?q?=201.8.2?= 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 6deae38c..7f648691 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - dapr-version: [1.6.3, 1.7.4, 1.8.1] + dapr-version: [1.6.3, 1.7.4, 1.8.2] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: From 2934a300710497f1bf0660fa8057de81237d2dbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Jul 2022 04:20:27 +0000 Subject: [PATCH 066/131] chore(deps): bump actions/stale from 5.1.0 to 5.1.1 Bumps [actions/stale](https://github.com/actions/stale) from 5.1.0 to 5.1.1. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/v5.1.1/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v5.1.0...v5.1.1) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 8b5e9cc6..837b2df1 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Prune Stale - uses: actions/stale@v5.1.0 + uses: actions/stale@v5.1.1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-issue-stale: 60 From 32fdb169d29c912e4c4cf9fa5cda2b0bbce844a5 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Fri, 29 Jul 2022 16:56:41 +0800 Subject: [PATCH 067/131] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore(deps):=20bum?= =?UTF-8?q?p=20dapr=20to=202.3.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- 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 856f28ce..12f97f9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.5.0", "license": "Apache-2.0", "dependencies": { - "@dapr/dapr": "2.2.1", + "@dapr/dapr": "2.3.1", "body-parser": "^1.20.0", "cloudevents": "^6.0.2", "debug": "^4.3.4", @@ -92,9 +92,9 @@ } }, "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==", + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.1.tgz", + "integrity": "sha512-qg0GmXNVmzFPEcoMRrGQQT3s8W/HPKBPv97woSCQNX+uPqzJYIxxIctbAXdzUXHUkeFG97kRJ6ghCzC2q48hRQ==", "dependencies": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", @@ -7690,9 +7690,9 @@ } }, "@dapr/dapr": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.2.1.tgz", - "integrity": "sha512-SSA8dtsq0k7UERjwVjopGjZqiHQu+nVcd1v8DXy2KvIGbrx0EKS3Ir63TU/2m2vFl57F6k33bg4kbqNd1RRyAQ==", + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.1.tgz", + "integrity": "sha512-qg0GmXNVmzFPEcoMRrGQQT3s8W/HPKBPv97woSCQNX+uPqzJYIxxIctbAXdzUXHUkeFG97kRJ6ghCzC2q48hRQ==", "requires": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", diff --git a/package.json b/package.json index 33b2d299..e03bf3e1 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "./testing": "./build/src/testing.js" }, "dependencies": { - "@dapr/dapr": "2.2.1", + "@dapr/dapr": "2.3.1", "body-parser": "^1.20.0", "cloudevents": "^6.0.2", "debug": "^4.3.4", From ee335ba00f3a44e0cc49da774c28c82125f420ae Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 30 Jul 2022 16:33:17 +0800 Subject: [PATCH 068/131] =?UTF-8?q?=E2=9C=A8=20feat:=20enable=20graceful?= =?UTF-8?q?=20shutdown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 1 + package.json | 1 + src/main.ts | 42 ++++++++++++++++++++++++++++++----- test/conformance/package.json | 5 +++-- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12f97f9b..f3d638ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "debug": "^4.3.4", "express": "^4.18.1", "express-interceptor": "^1.2.0", + "http-terminator": "^3.2.0", "lodash": "^4.17.21", "minimist": "^1.2.6", "on-finished": "^2.4.1", diff --git a/package.json b/package.json index e03bf3e1..fb193a45 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "debug": "^4.3.4", "express": "^4.18.1", "express-interceptor": "^1.2.0", + "http-terminator": "^3.2.0", "lodash": "^4.17.21", "minimist": "^1.2.6", "on-finished": "^2.4.1", diff --git a/src/main.ts b/src/main.ts index 1622a9c5..bee7a1c1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -16,17 +16,22 @@ // Functions framework entry point that configures and starts Node.js server // that runs user's code on HTTP request. -import {getUserFunction} from './loader'; -import {ErrorHandler} from './invoker'; -import {getServer} from './server'; -import {parseOptions, helpText, OptionsError} from './options'; -import {OpenFunction} from './functions'; +import * as process from 'process'; + +import {createHttpTerminator} from 'http-terminator'; + import getAysncServer from './openfunction/async_server'; import { OpenFunctionContext, ContextUtils, } from './openfunction/function_context'; +import {getUserFunction} from './loader'; +import {ErrorHandler} from './invoker'; +import {getServer} from './server'; +import {parseOptions, helpText, OptionsError} from './options'; +import {OpenFunction} from './functions'; + /** * Main entrypoint for the functions framework that loads the user's function * and starts the HTTP server. @@ -51,6 +56,8 @@ export const main = async () => { } const {userFunction, signatureType} = loadedFunction; + // Try to determine the server runtime + // Considering the async runtime in the first place if (ContextUtils.IsAsyncRuntime(options.context as OpenFunctionContext)) { options.context!.port = options.port; @@ -59,7 +66,12 @@ export const main = async () => { options.context! ); await server.start(); - } else { + + // DaprServer uses httpTerminator in server.stop() + handleShutdown(async () => await server.stop()); + } + // Then taking sync runtime as the fallback + else { const server = getServer(userFunction!, signatureType, options.context); const errorHandler = new ErrorHandler(server); server @@ -73,6 +85,12 @@ export const main = async () => { } }) .setTimeout(0); // Disable automatic timeout on incoming connections. + + // Create and use httpTerminator for Express + const terminator = createHttpTerminator({ + server, + }); + handleShutdown(async () => await terminator.terminate()); } } catch (e) { if (e instanceof OptionsError) { @@ -86,3 +104,15 @@ export const main = async () => { // Call the main method to load the user code and start the http server. main(); + +function handleShutdown(handler: () => Promise): void { + if (!handler) return; + + const shutdown = async (code: string) => { + console.log(`🛑 Terminating OpenFunction server on code ${code}...`); + await handler(); + }; + + process.on('SIGTERM', shutdown); + process.on('SIGINT', shutdown); +} diff --git a/test/conformance/package.json b/test/conformance/package.json index f4eb9778..3145dd38 100644 --- a/test/conformance/package.json +++ b/test/conformance/package.json @@ -8,11 +8,12 @@ }, "scripts": { "start": "functions-framework --target=writeHttp", - "knative:async": "concurrently npm:knative:async:run:* npm:knative:async:test", + "compile": "cd .. && npm run compile", + "knative:async": "npm run compile && 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 --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:*", + "async": "npm run compile && 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" } From a32fa1c43d0c0872263989b21233f01d28764535 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 4 Aug 2022 13:04:12 +0800 Subject: [PATCH 069/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20bump=20dapr?= =?UTF-8?q?=201.8.3?= 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 7f648691..c5cfe874 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - dapr-version: [1.6.3, 1.7.4, 1.8.2] + dapr-version: [1.6.3, 1.7.4, 1.8.3] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} steps: From 5d914176dd864694bce71538770061ee24f3dc4a Mon Sep 17 00:00:00 2001 From: MachaYAD <43526965+YADROOKIE@users.noreply.github.com> Date: Thu, 4 Aug 2022 15:51:21 +0800 Subject: [PATCH 070/131] =?UTF-8?q?=E2=9C=A8=20feat:=20enable=20plugin=20m?= =?UTF-8?q?echanism=20for=20async=20func=20(#70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintignore | 1 + docs/generated/api.json | 310 ++++++++++++++++++++++++ docs/generated/api.md | 14 ++ src/loader.ts | 175 ++++++++++++- src/main.ts | 5 +- src/openfunction/async_server.ts | 19 +- src/openfunction/function_context.ts | 51 ++++ test/data/plugins/errorMissAll.js | 6 + test/data/plugins/errorMissName.js | 22 ++ test/data/plugins/errorMissVersion.js | 22 ++ test/data/plugins/plugindemo.js | 32 +++ test/data/test_data/async_plugin.ts | 111 +++++++++ test/integration/async_server.ts | 66 +---- test/integration/async_server_plugin.ts | 99 ++++++++ test/loader.ts | 200 +++++++++++++++ test/options.ts | 72 ++++++ 16 files changed, 1143 insertions(+), 62 deletions(-) create mode 100644 test/data/plugins/errorMissAll.js create mode 100644 test/data/plugins/errorMissName.js create mode 100644 test/data/plugins/errorMissVersion.js create mode 100644 test/data/plugins/plugindemo.js create mode 100644 test/data/test_data/async_plugin.ts create mode 100644 test/integration/async_server_plugin.ts diff --git a/.eslintignore b/.eslintignore index c73a9699..93d966f5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ **/node_modules build/ test/data/esm_* +test/data/plugins docs/ diff --git a/docs/generated/api.json b/docs/generated/api.json index e37b3605..3180b5a5 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1913,6 +1913,88 @@ "endIndex": 2 } }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#postPlugins:member", + "docComment": "/**\n * Optional post function exec plugins.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "postPlugins?: " + }, + { + "kind": "Reference", + "text": "Array", + "canonicalReference": "!Array:interface" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "postPlugins", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#prePlugins:member", + "docComment": "/**\n * Optional pre function exec plugins.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "prePlugins?: " + }, + { + "kind": "Reference", + "text": "Array", + "canonicalReference": "!Array:interface" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "prePlugins", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#runtime:member", @@ -2489,6 +2571,234 @@ ], "implementsTokenRanges": [] }, + { + "kind": "Class", + "canonicalReference": "@openfunction/functions-framework!Plugin_2:class", + "docComment": "/**\n * The OpenFunction's plugin template.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare class Plugin " + } + ], + "releaseTag": "Public", + "name": "Plugin_2", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!Plugin_2#execPostHook:member(1)", + "docComment": "/**\n * post main function exec.\n *\n * @param ctx - The openfunction runtime .\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "execPostHook(ctx?: " + }, + { + "kind": "Reference", + "text": "OpenFunctionRuntime", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 5 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "ctx", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": true + } + ], + "isOptional": false, + "name": "execPostHook" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!Plugin_2#execPreHook:member(1)", + "docComment": "/**\n * pre main function exec.\n *\n * @param ctx - The openfunction runtime .\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "execPreHook(ctx?: " + }, + { + "kind": "Reference", + "text": "OpenFunctionRuntime", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 5 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "ctx", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": true + } + ], + "isOptional": false, + "name": "execPreHook" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!Plugin_2#get:member(1)", + "docComment": "/**\n * get instance filed value.\n *\n * @param filedName - the instace filedName\n *\n * @returns filed value.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "get(filedName: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "filedName", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "name": "get" + }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!Plugin_2.OFN_PLUGIN_NAME:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "static OFN_PLUGIN_NAME: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "OFN_PLUGIN_NAME", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": true, + "isProtected": false + }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!Plugin_2.OFN_PLUGIN_VERSION:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "static OFN_PLUGIN_VERSION: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "OFN_PLUGIN_VERSION", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": true, + "isProtected": false + } + ], + "implementsTokenRanges": [] + }, { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!Request_2:interface", diff --git a/docs/generated/api.md b/docs/generated/api.md index 4d25f565..e084c92b 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -136,6 +136,8 @@ export interface OpenFunctionContext { name: string; outputs?: OpenFunctionBinding; port?: string; + postPlugins?: Array; + prePlugins?: Array; runtime: `${RuntimeType}` | `${Capitalize}` | `${Uppercase}`; version: string; } @@ -158,6 +160,18 @@ export abstract class OpenFunctionRuntime { protected trigger?: OpenFunctionTrigger; } +// @public +class Plugin_2 { + execPostHook(ctx?: OpenFunctionRuntime): Promise; + execPreHook(ctx?: OpenFunctionRuntime): Promise; + get(filedName: string): string; + // (undocumented) + static OFN_PLUGIN_NAME: string; + // (undocumented) + static OFN_PLUGIN_VERSION: string; +} +export { Plugin_2 as Plugin } + // @public (undocumented) interface Request_2 extends Request_3 { rawBody?: Buffer; diff --git a/src/loader.ts b/src/loader.ts index 99550fe2..5e943c5f 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -21,10 +21,14 @@ import * as path from 'path'; import * as semver from 'semver'; import * as readPkgUp from 'read-pkg-up'; +import * as fs from 'fs'; import {pathToFileURL} from 'url'; -import {HandlerFunction} from './functions'; +import {HandlerFunction, OpenFunctionRuntime} from './functions'; import {SignatureType} from './types'; import {getRegisteredFunction} from './function_registry'; +import {Plugin} from './openfunction/function_context'; +import {FrameworkOptions} from './options'; +import {forEach} from 'lodash'; // Dynamic import function required to load user code packaged as an // ES module is only available on Node.js v13.2.0 and up. @@ -92,6 +96,7 @@ export async function getUserFunction( } | null> { try { const functionModulePath = getFunctionModulePath(codeLocation); + if (functionModulePath === null) { console.error('Provided code is not a loadable module.'); return null; @@ -193,3 +198,171 @@ function getFunctionModulePath(codeLocation: string): string | null { } return path; } + +type PluginClass = Record; +/** + * Returns user's plugin from function file. + * Returns null if plugin can't be retrieved. + * @return User's plugins or null. + */ +export async function getUserPlugins( + options: FrameworkOptions +): Promise { + // Get plugin set + const pluginSet: Set = new Set(); + if (options.context) { + if (options.context.prePlugins) { + forEach(options.context.prePlugins, plugin => { + typeof plugin === 'string' && pluginSet.add(plugin); + }); + } + if (options.context.postPlugins) { + forEach(options.context.postPlugins, plugin => { + typeof plugin === 'string' && pluginSet.add(plugin); + }); + } + + try { + type Instance = Record; + // Load plugin js files + const instances: Instance = {}; + + const pluginFiles = getPluginFiles(options.sourceLocation); + if (pluginFiles === null) { + console.warn('[warn-!!!] user plugins files load failed '); + options.context.prePlugins = []; + options.context.postPlugins = []; + return options; + } + + // Find plugins class + const tempMap: PluginClass = {}; + for (const pluginFile of pluginFiles) { + const jsMoulde = require(pluginFile); + processJsModule(jsMoulde, tempMap); + } + + // Instance plugin dynamic set ofn_plugin_name + const pluginNames = Array.from(pluginSet.values()); + for (const name of pluginNames) { + const module = tempMap[name]; + if (module) { + const instance = new module(); + instance[Plugin.OFN_PLUGIN_NAME] = module.Name; + instance[Plugin.OFN_PLUGIN_VERSION] = module.Version || 'v1'; + + //Set default method of pre post get + if (!instance.execPreHook) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + instance.execPreHook = (ctx: OpenFunctionRuntime) => { + console.log( + `This plugin ${name} method execPreHook is not implemented.` + ); + }; + } + if (!instance.execPostHook) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + instance.execPostHook = (ctx: OpenFunctionRuntime) => { + console.log( + `This plugin ${name} method execPostHook is not implemented.` + ); + }; + } + if (!instance.get) { + instance.get = (filedName: string) => { + for (const key in instance) { + if (key === filedName) { + return instance[key]; + } + } + }; + } + instances[name] = instance as Plugin; + } + } + + const prePlugins: Array = []; + const postPlugins: Array = []; + if (options.context.prePlugins) { + forEach(options.context.prePlugins, plugin => { + if (typeof plugin === 'string') { + const instance = instances[plugin]; + typeof instance === 'object' && prePlugins.push(instance); + } + }); + } + if (options.context.postPlugins) { + forEach(options.context.postPlugins, plugin => { + if (typeof plugin === 'string') { + const instance = instances[plugin]; + typeof instance === 'object' && postPlugins.push(instance); + } + }); + } + + options.context.prePlugins = prePlugins; + options.context.postPlugins = postPlugins; + } catch (error) { + console.error('load plugins error reason: \n'); + console.error(error); + } + } + return options; +} + +/** + * Returns resolved path to the dir containing the user plugins. + * Returns null if the path is not exits + * @param codeLocation Directory with user's code. + * @return Resolved path or null. + */ +function getPluginFiles(codeLocation: string): Array | null { + const pluginFiles: Array = []; + try { + const param = path.resolve(codeLocation + '/plugins'); + const files = fs.readdirSync(param); + + for (const file of files) { + pluginFiles.push(require.resolve(path.join(param, file))); + } + } catch (ex) { + const err: Error = ex; + console.error(err.message); + return null; + } + return pluginFiles; +} +/** + * Returns rdetermine whether it is a class. + * Returns boolean is can be class + * @param obj jsmodule. + * @return boolean of it is a class. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function couldBeClass(obj: any): boolean { + return ( + typeof obj === 'function' && + obj.prototype !== undefined && + obj.prototype.constructor === obj && + obj.toString().slice(0, 5) === 'class' + ); +} + +/** + * Process jsMoulde if it can be a plugin class put it into tempMap. + * @param obj jsmodule. + * @param tempMap PluginClass. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function processJsModule(obj: any, tempMap: PluginClass) { + if (typeof obj === 'object') { + for (const o in obj) { + if (couldBeClass(obj[o]) && obj[o].Name) { + tempMap[obj[o].Name] = obj[o]; + } + } + } + if (couldBeClass(obj) && obj.Name) { + tempMap[obj.Name] = obj; + } +} diff --git a/src/main.ts b/src/main.ts index bee7a1c1..3cc5f864 100644 --- a/src/main.ts +++ b/src/main.ts @@ -26,7 +26,7 @@ import { ContextUtils, } from './openfunction/function_context'; -import {getUserFunction} from './loader'; +import {getUserFunction, getUserPlugins} from './loader'; import {ErrorHandler} from './invoker'; import {getServer} from './server'; import {parseOptions, helpText, OptionsError} from './options'; @@ -69,6 +69,9 @@ export const main = async () => { // DaprServer uses httpTerminator in server.stop() handleShutdown(async () => await server.stop()); + + // Load Plugins + await getUserPlugins(options); } // Then taking sync runtime as the fallback else { diff --git a/src/openfunction/async_server.ts b/src/openfunction/async_server.ts index 358b9ae9..6107f24e 100644 --- a/src/openfunction/async_server.ts +++ b/src/openfunction/async_server.ts @@ -1,4 +1,4 @@ -import {forEach} from 'lodash'; +import {forEach, invoke} from 'lodash'; import {DaprServer} from '@dapr/dapr'; import {OpenFunction} from '../functions'; @@ -23,7 +23,24 @@ export default function ( const ctx = OpenFunctionRuntime.ProxyContext(context); const wrapper = async (data: object) => { + // Exec pre hooks + console.log(context.prePlugins); + if (context.prePlugins) { + await context.prePlugins.reduce(async (_, current) => { + await invoke(current, 'execPreHook', ctx); + return []; + }, Promise.resolve([])); + } + await userFunction(ctx, data); + + // Exec post hooks + if (context.postPlugins) { + await context.postPlugins.reduce(async (_, current) => { + await invoke(current, 'execPostHook', ctx); + return []; + }, Promise.resolve([])); + } }; // Initialize the server with the user's function. diff --git a/src/openfunction/function_context.ts b/src/openfunction/function_context.ts index 450d7c07..fbf4dd23 100644 --- a/src/openfunction/function_context.ts +++ b/src/openfunction/function_context.ts @@ -1,3 +1,5 @@ +import {OpenFunctionRuntime} from './function_runtime'; + /** * The OpenFunction's serving context. * @public @@ -30,6 +32,14 @@ export interface OpenFunctionContext { * Optional output binding object. */ outputs?: OpenFunctionBinding; + /** + * Optional pre function exec plugins. + */ + prePlugins?: Array; + /** + * Optional post function exec plugins. + */ + postPlugins?: Array; } /** @@ -139,3 +149,44 @@ export class ContextUtils { return component?.componentType.split('.')[0] === ComponentType.PubSub; } } + +/** + * The OpenFunction's plugin template. + * @public + */ +export class Plugin { + static OFN_PLUGIN_NAME = 'ofn_plugin_name'; + static OFN_PLUGIN_VERSION = 'ofn_plugin_version'; + /** + * pre main function exec. + * @param ctx - The openfunction runtime . + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public async execPreHook(ctx?: OpenFunctionRuntime) { + console.log( + `This plugin ${this.get( + Plugin.OFN_PLUGIN_NAME + )} method execPreHook is not implemented.` + ); + } + /** + * post main function exec. + * @param ctx - The openfunction runtime . + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public async execPostHook(ctx?: OpenFunctionRuntime) { + console.log( + `This plugin ${this.get( + Plugin.OFN_PLUGIN_NAME + )} method execPostHook is not implemented.` + ); + } + /** + * get instance filed value. + * @param filedName - the instace filedName + * @returns filed value. + */ + public get(filedName: string) { + return filedName; + } +} diff --git a/test/data/plugins/errorMissAll.js b/test/data/plugins/errorMissAll.js new file mode 100644 index 00000000..413b0248 --- /dev/null +++ b/test/data/plugins/errorMissAll.js @@ -0,0 +1,6 @@ +class ErrorPlugin{ + static Version = "v1"; + static Name = "error-miss-all-plugin"; +} + +module.exports = ErrorPlugin; diff --git a/test/data/plugins/errorMissName.js b/test/data/plugins/errorMissName.js new file mode 100644 index 00000000..c1266036 --- /dev/null +++ b/test/data/plugins/errorMissName.js @@ -0,0 +1,22 @@ +class ErrorPlugin{ + static Version = "v1"; + // static Name = "error-plugin" + constructor(){ + console.log(`init error plugins`); + } + async execPreHook(ctx){ + console.log(`-----------error plugin pre hook-----------`); + } + execPostHook(ctx){ + console.log(`-----------error plugin post hook-----------`); + } + get(filedName){ + for(let key in this){ + if(key === filedName){ + return this[key]; + } + } + } +} + +module.exports = {ErrorPlugin}; diff --git a/test/data/plugins/errorMissVersion.js b/test/data/plugins/errorMissVersion.js new file mode 100644 index 00000000..aaf3087c --- /dev/null +++ b/test/data/plugins/errorMissVersion.js @@ -0,0 +1,22 @@ +class ErrorPlugin{ + // static Version = "v1" + static Name = "error-miss-version-plugin" + constructor(){ + console.log(`init error plugins`); + } + async execPreHook(ctx){ + console.log(`-----------error plugin pre hook-----------`); + } + execPostHook(ctx){ + console.log(`-----------error plugin post hook-----------`); + } + get(filedName){ + for(let key in this){ + if(key === filedName){ + return this[key]; + } + } + } +} + +module.exports = {ErrorPlugin}; diff --git a/test/data/plugins/plugindemo.js b/test/data/plugins/plugindemo.js new file mode 100644 index 00000000..6fd4ea12 --- /dev/null +++ b/test/data/plugins/plugindemo.js @@ -0,0 +1,32 @@ +function sleep(){ + return new Promise(resolve => setTimeout(resolve,3000)); +} +class DemoPlugin{ + static Version = "v1"; + static Name = "demo-plugin"; + id = '666'; + constructor(){ + console.log(`init demo plugins`); + } + async execPreHook(ctx){ + console.log(`-----------demo plugin pre hook-----------`); + ctx['pre'] = 'pre-exec'; + await sleep(); + console.log(`-----------pre sleep 3----------`) + } + async execPostHook(ctx){ + console.log(`-----------demo plugin post hook-----------`); + ctx['post'] = 'post-exec'; + console.log(`-----------send post-----------`); + } + get(filedName){ + for(let key in this){ + if(key === filedName){ + return this[key]; + } + } + } +} + +// module.exports = {DemoPlugin}; +exports.DemoPlugin = DemoPlugin; diff --git a/test/data/test_data/async_plugin.ts b/test/data/test_data/async_plugin.ts new file mode 100644 index 00000000..c281a314 --- /dev/null +++ b/test/data/test_data/async_plugin.ts @@ -0,0 +1,111 @@ +import {OpenFunctionContext} from '../../../src/openfunction/function_context'; +import {FrameworkOptions} from '../../../src/options'; + +export const TEST_CONTEXT: OpenFunctionContext = { + name: 'test-context', + version: '1.0.0', + runtime: 'Async', + port: '8080', + inputs: { + cron: { + uri: 'cron_input', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + mqtt_binding: { + uri: 'default', + componentName: 'binding-mqtt', + componentType: 'bindings.mqtt', + }, + mqtt_sub: { + uri: 'webup', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, + outputs: { + cron: { + uri: 'cron_output', + operation: 'delete', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + localfs: { + uri: 'localstorage', + operation: 'create', + componentName: 'binding-localfs', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'output-file.txt', + }, + }, + mqtt_pub: { + uri: 'webup_pub', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, +}; +export const TEST_PLUGIN_OPTIONS: FrameworkOptions = { + port: '', + target: '', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'test-context-plugin', + version: '1.0.0', + runtime: 'Async', + port: '8080', + inputs: { + cron: { + uri: 'cron_input', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + mqtt_binding: { + uri: 'default', + componentName: 'binding-mqtt', + componentType: 'bindings.mqtt', + }, + mqtt_sub: { + uri: 'webup', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, + outputs: { + cron: { + uri: 'cron_output', + operation: 'delete', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + localfs: { + uri: 'localstorage', + operation: 'create', + componentName: 'binding-localfs', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'output-file.txt', + }, + }, + mqtt_pub: { + uri: 'webup_pub', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, + prePlugins: ['demo-plugin'], + postPlugins: ['demo-plugin'], + }, +}; +export const TEST_PAYLOAD = {data: 'hello world'}; +export const TEST_CLOUD_EVENT = { + specversion: '1.0', + id: 'test-1234-1234', + type: 'ce.openfunction', + source: 'https://github.com/OpenFunction/functions-framework-nodejs', + traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', + data: TEST_PAYLOAD, +}; diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index 23d5a4c2..e9cddd53 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -6,72 +6,20 @@ import {get, isEmpty} from 'lodash'; import * as shell from 'shelljs'; import * as MQTT from 'aedes'; -import {OpenFunctionContext} from '../../src/openfunction/function_context'; import getAysncServer from '../../src/openfunction/async_server'; -const TEST_CONTEXT: OpenFunctionContext = { - name: 'test-context', - version: '1.0.0', - runtime: 'Async', - port: '8080', - inputs: { - cron: { - uri: 'cron_input', - componentName: 'binding-cron', - componentType: 'bindings.cron', - }, - mqtt_binding: { - uri: 'default', - componentName: 'binding-mqtt', - componentType: 'bindings.mqtt', - }, - mqtt_sub: { - uri: 'webup', - componentName: 'pubsub-mqtt', - componentType: 'pubsub.mqtt', - }, - }, - outputs: { - cron: { - uri: 'cron_output', - operation: 'delete', - componentName: 'binding-cron', - componentType: 'bindings.cron', - }, - localfs: { - uri: 'localstorage', - operation: 'create', - componentName: 'binding-localfs', - componentType: 'bindings.localstorage', - metadata: { - fileName: 'output-file.txt', - }, - }, - mqtt_pub: { - uri: 'webup_pub', - componentName: 'pubsub-mqtt', - componentType: 'pubsub.mqtt', - }, - }, -}; - -const TEST_PAYLOAD = {data: 'hello world'}; -const TEST_CLOUD_EVENT = { - specversion: '1.0', - id: 'test-1234-1234', - type: 'ce.openfunction', - source: 'https://github.com/OpenFunction/functions-framework-nodejs', - traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', - data: TEST_PAYLOAD, -}; +import { + TEST_CLOUD_EVENT, + TEST_CONTEXT, + TEST_PAYLOAD, +} from '../data/test_data/async_plugin'; describe('OpenFunction - Async - Binding', () => { const APPID = 'async.dapr'; const broker = MQTT.Server(); - + const server = createServer(broker.handle); before(done => { // Start simple plain MQTT server via aedes - const server = createServer(broker.handle); server.listen(1883, () => { // Try to run Dapr sidecar and listen for the async server shell.exec( @@ -90,7 +38,7 @@ describe('OpenFunction - Async - Binding', () => { shell.exec(`dapr stop ${APPID}`, { silent: true, }); - + server.close(); broker.close(done); }); diff --git a/test/integration/async_server_plugin.ts b/test/integration/async_server_plugin.ts new file mode 100644 index 00000000..c7e228ea --- /dev/null +++ b/test/integration/async_server_plugin.ts @@ -0,0 +1,99 @@ +/* eslint-disable no-restricted-properties */ +import {deepStrictEqual, ifError} from 'assert'; +import {createServer} from 'net'; + +import {get, isEmpty} from 'lodash'; +import * as shell from 'shelljs'; +import * as MQTT from 'aedes'; + +import getAysncServer from '../../src/openfunction/async_server'; +import {getUserPlugins} from '../../src/loader'; +import assert = require('assert'); +import { + TEST_CLOUD_EVENT, + TEST_CONTEXT, + TEST_PAYLOAD, + TEST_PLUGIN_OPTIONS, +} from '../data/test_data/async_plugin'; + +describe('OpenFunction - Async - Binding with plugin', () => { + const APPID = 'async.dapr'; + const broker = MQTT.Server(); + const server = createServer(broker.handle); + + before(done => { + // Start simple plain MQTT server via aedes + server.listen(1883, () => { + // Try to run Dapr sidecar and listen for the async server + shell.exec( + `dapr run -H 3500 -G 50001 -p ${TEST_CONTEXT.port} -d ./test/data/components/async -a ${APPID} --log-level debug`, + { + silent: true, + async: true, + } + ); + done(); + }); + }); + + after(done => { + // Stop dapr sidecar process + shell.exec(`dapr stop ${APPID}`, { + silent: true, + }); + server.close(); + broker.close(done); + }); + + it('mqtt sub w/ pub output with demo plugin', done => { + const app = getAysncServer((ctx, data) => { + if (isEmpty(data)) return; + + const context: any = ctx as any; + assert(context['pre'] === 'pre-exec'); + context['pre'] = 'main-exec'; + + // Assert that user function receives correct data from input binding + deepStrictEqual(data, TEST_PAYLOAD); + console.log(data); + // Then forward received data to output channel + const output = 'mqtt_pub'; + broker.subscribe( + get(TEST_PLUGIN_OPTIONS.context!, `outputs.${output}.uri`), + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (packet, _) => { + const payload = JSON.parse(Buffer.from(packet.payload).toString()); + deepStrictEqual(payload.data, TEST_PAYLOAD); + app + .stop() + .then(() => { + assert(context['pre'] === 'main-exec'); + assert(context['post'] === 'post-exec'); + }) + .finally(done); + }, + () => { + ctx.send(TEST_PAYLOAD, output); + } + ); + }, TEST_PLUGIN_OPTIONS.context!); + + // First, we start the async server + app.start().then(async () => { + await getUserPlugins(TEST_PLUGIN_OPTIONS); + console.log(TEST_PLUGIN_OPTIONS); + // Then, we send a cloudevent format message to server + broker.publish( + { + cmd: 'publish', + topic: TEST_PLUGIN_OPTIONS.context!.inputs!.mqtt_sub.uri!, + payload: JSON.stringify(TEST_CLOUD_EVENT), + qos: 0, + retain: false, + dup: false, + }, + err => ifError(err) + ); + }); + }); +}); diff --git a/test/loader.ts b/test/loader.ts index 07b97d1e..35bc528c 100644 --- a/test/loader.ts +++ b/test/loader.ts @@ -18,6 +18,8 @@ import * as semver from 'semver'; import * as functions from '../src/functions'; import * as loader from '../src/loader'; import * as FunctionRegistry from '../src/function_registry'; +import {FrameworkOptions} from '../src/options'; +import {Plugin} from '../src'; describe('loading function', () => { interface TestData { @@ -131,3 +133,201 @@ describe('loading function', () => { assert.strictEqual(loadedFunction?.signatureType, 'cloudevent'); }); }); + +describe('loading plugins', () => { + interface ExceptData { + prePlugins: Array; + postPlugins: Array; + } + + interface TestData { + options: FrameworkOptions; + except: ExceptData; + } + const testData: TestData[] = [ + { + options: { + port: '8080', + target: 'helloWorld', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'demo', + version: '', + runtime: 'ASYNC', + prePlugins: ['demo-plugin'], + postPlugins: ['demo-plugin'], + }, + }, + except: { + prePlugins: ['demo-plugin'], + postPlugins: ['demo-plugin'], + }, + }, + { + options: { + port: '8080', + target: 'helloWorld', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'demo', + version: '', + runtime: 'ASYNC', + prePlugins: ['demo-plugin'], + postPlugins: [], + }, + }, + except: { + prePlugins: ['demo-plugin'], + postPlugins: [], + }, + }, + { + options: { + port: '8080', + target: 'helloWorld', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'demo', + version: '', + runtime: 'ASYNC', + prePlugins: [], + postPlugins: [], + }, + }, + except: { + prePlugins: [], + postPlugins: [], + }, + }, + { + options: { + port: '8080', + target: 'helloWorld', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'error', + version: '', + runtime: 'ASYNC', + prePlugins: ['error-plugin'], + postPlugins: ['error-plugin'], + }, + }, + except: { + prePlugins: [], + postPlugins: [], + }, + }, + { + options: { + port: '8080', + target: 'helloWorld', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'error', + version: '', + runtime: 'ASYNC', + prePlugins: ['error-miss-version-plugin', 'demo-plugin'], + postPlugins: ['error-miss-version-plugin'], + }, + }, + except: { + prePlugins: ['error-miss-version-plugin', 'demo-plugin'], + postPlugins: ['error-miss-version-plugin'], + }, + }, + ]; + + it('load exits plugins', async () => { + for (const test of testData) { + const options = await loader.getUserPlugins(test.options); + const current: ExceptData = { + prePlugins: [], + postPlugins: [], + }; + + options.context!.prePlugins!.forEach(item => { + assert(typeof item === 'object'); + assert(item.get(Plugin.OFN_PLUGIN_VERSION) === 'v1'); + current.prePlugins.push(item.get(Plugin.OFN_PLUGIN_NAME)); + }); + options.context!.postPlugins!.forEach(item => { + assert(typeof item === 'object'); + assert(item.get(Plugin.OFN_PLUGIN_VERSION) === 'v1'); + current.postPlugins.push(item.get(Plugin.OFN_PLUGIN_NAME)); + }); + + assert.deepStrictEqual(current, test.except); + } + }); + + const test: TestData = { + options: { + port: '8080', + target: 'helloWorld', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'error', + version: '', + runtime: 'ASYNC', + prePlugins: [''], + postPlugins: [''], + }, + }, + except: { + prePlugins: [''], + postPlugins: [''], + }, + }; + + function copyAndSet(name: string): TestData { + const data: TestData = JSON.parse(JSON.stringify(test)); + data.options.context!.prePlugins![0] = name; + data.options.context!.postPlugins![0] = name; + data.except.postPlugins[0] = name; + data.except.prePlugins[0] = name; + return data; + } + + it('user plugin miss all', async () => { + const data = copyAndSet('error-miss-all-plugin'); + const options = await loader.getUserPlugins(data.options); + assert(typeof options.context!.prePlugins![0] === 'object'); + assert( + options.context!.prePlugins![0].get(Plugin.OFN_PLUGIN_NAME) === + 'error-miss-all-plugin' + ); + assert(options.context!.prePlugins![0].execPreHook); + assert(options.context!.prePlugins![0].execPostHook); + }); + + it('load multi plugins ', async () => { + const data: FrameworkOptions = { + port: '8080', + target: 'helloWorld', + sourceLocation: process.cwd() + '/test/data', + signatureType: 'event', + printHelp: false, + context: { + name: 'demo', + version: '', + runtime: 'ASYNC', + prePlugins: ['demo-plugin', 'error-miss-all-plugin'], + postPlugins: ['demo-plugin', 'error-miss-all-plugin'], + }, + }; + assert.ok(await loader.getUserPlugins(data)); + console.log(data); + }); +}); diff --git a/test/options.ts b/test/options.ts index f7cf727a..ab7a5b84 100644 --- a/test/options.ts +++ b/test/options.ts @@ -125,6 +125,78 @@ describe('parseOptions', () => { printHelp: false, }, }, + { + name: 'respects all env vars', + cliOpts: ['bin/node', '/index.js'], + envVars: { + PORT: '1234', + FUNCTION_TARGET: 'helloWorld', + FUNCTION_SIGNATURE_TYPE: 'cloudevent', + FUNCTION_SOURCE: '/source', + FUNC_CONTEXT: + '{ "name": "foo", "version": "1.0.0", "runtime": "Knative" }', + }, + expectedOptions: { + port: '1234', + target: 'helloWorld', + sourceLocation: resolve('/source'), + signatureType: 'cloudevent', + context: {name: 'foo', version: '1.0.0', runtime: 'Knative'}, + printHelp: false, + }, + }, + { + name: 'respects all env vars with empty plugins', + cliOpts: ['bin/node', '/index.js'], + envVars: { + PORT: '1234', + FUNCTION_TARGET: 'helloWorld', + FUNCTION_SIGNATURE_TYPE: 'cloudevent', + FUNCTION_SOURCE: '/source', + FUNC_CONTEXT: + '{ "name": "foo", "version": "1.0.0", "runtime": "Knative", "prePlugins": [] , "postPlugins": []}', + }, + expectedOptions: { + port: '1234', + target: 'helloWorld', + sourceLocation: resolve('/source'), + signatureType: 'cloudevent', + context: { + name: 'foo', + version: '1.0.0', + runtime: 'Knative', + prePlugins: [], + postPlugins: [], + }, + printHelp: false, + }, + }, + { + name: 'respects all env vars with plugins', + cliOpts: ['bin/node', '/index.js'], + envVars: { + PORT: '1234', + FUNCTION_TARGET: 'helloWorld', + FUNCTION_SIGNATURE_TYPE: 'cloudevent', + FUNCTION_SOURCE: '/source', + FUNC_CONTEXT: + '{ "name": "foo", "version": "1.0.0", "runtime": "Knative", "prePlugins": ["test-plugin"] , "postPlugins": ["test-plugin"]}', + }, + expectedOptions: { + port: '1234', + target: 'helloWorld', + sourceLocation: resolve('/source'), + signatureType: 'cloudevent', + context: { + name: 'foo', + version: '1.0.0', + runtime: 'Knative', + prePlugins: ['test-plugin'], + postPlugins: ['test-plugin'], + }, + printHelp: false, + }, + }, ]; testData.forEach(testCase => { From 4392ebf5554dbd3be67b21a2772421a0ba534bac Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 4 Aug 2022 07:56:42 +0000 Subject: [PATCH 071/131] docs: update README.md [skip ci] --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 9dd366fc..4d641237 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # Functions Framework for Node.js + +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) + [![npm version](https://img.shields.io/npm/v/@openfunction/functions-framework.svg)](https://www.npmjs.com/package/@openfunction/functions-framework) [![npm downloads](https://img.shields.io/npm/dm/@openfunction/functions-framework.svg)](https://npmcharts.com/compare/@openfunction/functions-framework?minimal=true) @@ -287,3 +290,23 @@ Contributions to this library are welcome and encouraged. See [CONTRIBUTING](CON [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" + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + +

MachaYAD

đŸ’ģ
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file From b9881f79f4c1e840730846da6a894162add74f03 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 4 Aug 2022 07:56:43 +0000 Subject: [PATCH 072/131] docs: create .all-contributorsrc [skip ci] --- .all-contributorsrc | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 00000000..0d0f968d --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,24 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "YADROOKIE", + "name": "MachaYAD", + "avatar_url": "https://avatars.githubusercontent.com/u/43526965?v=4", + "profile": "https://github.com/YADROOKIE", + "contributions": [ + "code" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "functions-framework-nodejs", + "projectOwner": "OpenFunction", + "repoType": "github", + "repoHost": "https://github.com", + "skipCi": true +} From 3849597298098b246e5d24fdeca09ec01915bf4e Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sun, 21 Aug 2022 13:24:10 +0800 Subject: [PATCH 073/131] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20plugin?= =?UTF-8?q?=20system=20revolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/generated/api.json | 383 +++++++++++++++--- docs/generated/api.md | 22 +- package-lock.json | 133 +++--- package.json | 6 +- src/function_wrappers.ts | 18 +- src/functions.ts | 4 +- src/index.ts | 7 +- src/loader.ts | 240 ++++------- src/main.ts | 14 +- src/openfunction/async_server.ts | 32 +- .../{function_context.ts => context.ts} | 51 +-- src/openfunction/dapr_output_middleware.ts | 38 -- src/openfunction/decs.d.ts | 1 - src/openfunction/plugin.ts | 196 +++++++++ .../{function_runtime.ts => runtime.ts} | 63 ++- src/options.ts | 3 +- test/data/mock/context.ts | 69 ++++ test/data/mock/index.ts | 2 + test/data/mock/payload.ts | 19 + test/data/plugins/constants.mjs | 11 + test/data/plugins/counters.mjs | 65 +++ test/data/plugins/errorMissAll.js | 6 - test/data/plugins/errorMissName.js | 22 - test/data/plugins/errorMissVersion.js | 22 - test/data/plugins/noname.mjs | 7 + test/data/plugins/plugindemo.js | 32 -- test/data/test_data/async_plugin.ts | 111 ----- test/function_wrappers.ts | 2 +- test/integration/async_server.ts | 135 ++++-- test/integration/async_server_plugin.ts | 99 ----- test/integration/cloud_event.ts | 15 +- test/integration/http_binding.ts | 56 ++- test/loader.ts | 228 +---------- test/plugin.ts | 57 +++ 34 files changed, 1129 insertions(+), 1040 deletions(-) rename src/openfunction/{function_context.ts => context.ts} (69%) delete mode 100644 src/openfunction/dapr_output_middleware.ts delete mode 100644 src/openfunction/decs.d.ts create mode 100644 src/openfunction/plugin.ts rename src/openfunction/{function_runtime.ts => runtime.ts} (67%) create mode 100644 test/data/mock/context.ts create mode 100644 test/data/mock/index.ts create mode 100644 test/data/mock/payload.ts create mode 100644 test/data/plugins/constants.mjs create mode 100644 test/data/plugins/counters.mjs delete mode 100644 test/data/plugins/errorMissAll.js delete mode 100644 test/data/plugins/errorMissName.js delete mode 100644 test/data/plugins/errorMissVersion.js create mode 100644 test/data/plugins/noname.mjs delete mode 100644 test/data/plugins/plugindemo.js delete mode 100644 test/data/test_data/async_plugin.ts delete mode 100644 test/integration/async_server_plugin.ts create mode 100644 test/plugin.ts diff --git a/docs/generated/api.json b/docs/generated/api.json index 3180b5a5..d1902656 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,7 +1,7 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.28.4", + "toolVersion": "7.29.3", "schemaVersion": 1009, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { @@ -1487,7 +1487,7 @@ }, { "kind": "Content", - "text": "{}" + "text": "object" }, { "kind": "Content", @@ -1916,29 +1916,15 @@ { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#postPlugins:member", - "docComment": "/**\n * Optional post function exec plugins.\n */\n", + "docComment": "/**\n * Optional plugins to be executed after user function.\n */\n", "excerptTokens": [ { "kind": "Content", "text": "postPlugins?: " }, - { - "kind": "Reference", - "text": "Array", - "canonicalReference": "!Array:interface" - }, { "kind": "Content", - "text": "" + "text": "string[]" }, { "kind": "Content", @@ -1951,35 +1937,21 @@ "name": "postPlugins", "propertyTypeTokenRange": { "startIndex": 1, - "endIndex": 5 + "endIndex": 2 } }, { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#prePlugins:member", - "docComment": "/**\n * Optional pre function exec plugins.\n */\n", + "docComment": "/**\n * Optional plugins to be executed before user function.\n */\n", "excerptTokens": [ { "kind": "Content", "text": "prePlugins?: " }, - { - "kind": "Reference", - "text": "Array", - "canonicalReference": "!Array:interface" - }, - { - "kind": "Content", - "text": "" + "text": "string[]" }, { "kind": "Content", @@ -1992,7 +1964,7 @@ "name": "prePlugins", "propertyTypeTokenRange": { "startIndex": 1, - "endIndex": 5 + "endIndex": 2 } }, { @@ -2174,6 +2146,88 @@ "isStatic": false, "isProtected": true }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#getPlugin:member(1)", + "docComment": "/**\n * Get a plugin from the plugin store, or if it doesn't exist, get it from the built-in plugin store.\n *\n * @param name - The name of the plugin to get.\n *\n * @returns A plugin object\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "getPlugin(name: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "Plugin", + "canonicalReference": "@openfunction/functions-framework!Plugin:class" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "name": "getPlugin" + }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#locals:member", + "docComment": "/**\n * An object to hold local data. TODO: Clarify the usage of this property\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "readonly locals: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": true, + "isOptional": false, + "releaseTag": "Public", + "name": "locals", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "isStatic": false, + "isProtected": false + }, { "kind": "Method", "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime.Parse:member(1)", @@ -2567,6 +2621,89 @@ }, "isStatic": false, "isProtected": true + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime.WrapUserFunction:member(1)", + "docComment": "/**\n * It takes a user function and a context object, and returns a function that executes the user function with the context object, and executes all the pre and post hooks before and after the user function.\n *\n * @param userFunction - The function that you want to wrap.\n *\n * @param context - This is the context object that is passed to the user function.\n *\n * @returns A function that takes in data and returns a promise.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static WrapUserFunction(userFunction: " + }, + { + "kind": "Reference", + "text": "OpenFunction", + "canonicalReference": "@openfunction/functions-framework!OpenFunction:interface" + }, + { + "kind": "Content", + "text": ", 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": "): " + }, + { + "kind": "Content", + "text": "(data: any) => " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": true, + "returnTypeTokenRange": { + "startIndex": 7, + "endIndex": 10 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "userFunction", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "context", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 6 + }, + "isOptional": false + } + ], + "isOptional": false, + "name": "WrapUserFunction" } ], "implementsTokenRanges": [] @@ -2574,7 +2711,7 @@ { "kind": "Class", "canonicalReference": "@openfunction/functions-framework!Plugin_2:class", - "docComment": "/**\n * The OpenFunction's plugin template.\n *\n * @public\n */\n", + "docComment": "/**\n * Defining an abstract class to represent Plugin.\n *\n * @public\n */\n", "excerptTokens": [ { "kind": "Content", @@ -2585,20 +2722,94 @@ "name": "Plugin_2", "preserveMemberOrder": false, "members": [ + { + "kind": "Constructor", + "canonicalReference": "@openfunction/functions-framework!Plugin_2:constructor(1)", + "docComment": "/**\n * Constructor of the OpenFunction plugin.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(name: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ", version?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "version", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": true + } + ] + }, { "kind": "Method", "canonicalReference": "@openfunction/functions-framework!Plugin_2#execPostHook:member(1)", - "docComment": "/**\n * post main function exec.\n *\n * @param ctx - The openfunction runtime .\n */\n", + "docComment": "/**\n * This function is called after the user function is executed.\n *\n * @param ctx - Object that contains information about the function that is being executed.\n *\n * @param plugins - The collection of loaded pre and post hook plugins.\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "execPostHook(ctx?: " + "text": "execPostHook(ctx: " }, { "kind": "Reference", "text": "OpenFunctionRuntime", "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class" }, + { + "kind": "Content", + "text": " | null" + }, + { + "kind": "Content", + "text": ", plugins: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, { "kind": "Content", "text": "): " @@ -2619,8 +2830,8 @@ ], "isStatic": false, "returnTypeTokenRange": { - "startIndex": 3, - "endIndex": 5 + "startIndex": 9, + "endIndex": 11 }, "releaseTag": "Public", "isProtected": false, @@ -2630,9 +2841,17 @@ "parameterName": "ctx", "parameterTypeTokenRange": { "startIndex": 1, - "endIndex": 2 + "endIndex": 3 }, - "isOptional": true + "isOptional": false + }, + { + "parameterName": "plugins", + "parameterTypeTokenRange": { + "startIndex": 4, + "endIndex": 8 + }, + "isOptional": false } ], "isOptional": false, @@ -2641,17 +2860,43 @@ { "kind": "Method", "canonicalReference": "@openfunction/functions-framework!Plugin_2#execPreHook:member(1)", - "docComment": "/**\n * pre main function exec.\n *\n * @param ctx - The openfunction runtime .\n */\n", + "docComment": "/**\n * This function is called before the user function is executed.\n *\n * @param ctx - Object that contains information about the function that is being executed.\n *\n * @param plugins - The collection of loaded pre and post hook plugins.\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "execPreHook(ctx?: " + "text": "execPreHook(ctx: " }, { "kind": "Reference", "text": "OpenFunctionRuntime", "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime:class" }, + { + "kind": "Content", + "text": " | null" + }, + { + "kind": "Content", + "text": ", plugins: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, { "kind": "Content", "text": "): " @@ -2672,8 +2917,8 @@ ], "isStatic": false, "returnTypeTokenRange": { - "startIndex": 3, - "endIndex": 5 + "startIndex": 9, + "endIndex": 11 }, "releaseTag": "Public", "isProtected": false, @@ -2683,9 +2928,17 @@ "parameterName": "ctx", "parameterTypeTokenRange": { "startIndex": 1, - "endIndex": 2 + "endIndex": 3 }, - "isOptional": true + "isOptional": false + }, + { + "parameterName": "plugins", + "parameterTypeTokenRange": { + "startIndex": 4, + "endIndex": 8 + }, + "isOptional": false } ], "isOptional": false, @@ -2694,11 +2947,11 @@ { "kind": "Method", "canonicalReference": "@openfunction/functions-framework!Plugin_2#get:member(1)", - "docComment": "/**\n * get instance filed value.\n *\n * @param filedName - the instace filedName\n *\n * @returns filed value.\n */\n", + "docComment": "/**\n * Get the value of a property on the plugin.\n *\n * @param prop - The property to get.\n *\n * @returns The value of the property.\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "get(filedName: " + "text": "get(prop: " }, { "kind": "Content", @@ -2710,7 +2963,7 @@ }, { "kind": "Content", - "text": "string" + "text": "any" }, { "kind": "Content", @@ -2727,7 +2980,7 @@ "overloadIndex": 1, "parameters": [ { - "parameterName": "filedName", + "parameterName": "prop", "parameterTypeTokenRange": { "startIndex": 1, "endIndex": 2 @@ -2740,12 +2993,12 @@ }, { "kind": "Property", - "canonicalReference": "@openfunction/functions-framework!Plugin_2.OFN_PLUGIN_NAME:member", - "docComment": "", + "canonicalReference": "@openfunction/functions-framework!Plugin_2#name:member", + "docComment": "/**\n * Name of the plugin.\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "static OFN_PLUGIN_NAME: " + "text": "readonly name: " }, { "kind": "Content", @@ -2756,25 +3009,25 @@ "text": ";" } ], - "isReadonly": false, + "isReadonly": true, "isOptional": false, "releaseTag": "Public", - "name": "OFN_PLUGIN_NAME", + "name": "name", "propertyTypeTokenRange": { "startIndex": 1, "endIndex": 2 }, - "isStatic": true, + "isStatic": false, "isProtected": false }, { "kind": "Property", - "canonicalReference": "@openfunction/functions-framework!Plugin_2.OFN_PLUGIN_VERSION:member", - "docComment": "", + "canonicalReference": "@openfunction/functions-framework!Plugin_2#version:member", + "docComment": "/**\n * Version of the plugin.\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "static OFN_PLUGIN_VERSION: " + "text": "readonly version: " }, { "kind": "Content", @@ -2785,15 +3038,15 @@ "text": ";" } ], - "isReadonly": false, + "isReadonly": true, "isOptional": false, "releaseTag": "Public", - "name": "OFN_PLUGIN_VERSION", + "name": "version", "propertyTypeTokenRange": { "startIndex": 1, "endIndex": 2 }, - "isStatic": true, + "isStatic": false, "isProtected": false } ], diff --git a/docs/generated/api.md b/docs/generated/api.md index e084c92b..864c4d34 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -110,7 +110,7 @@ export interface LegacyEvent { // @public export interface OpenFunction { // (undocumented) - (ctx: OpenFunctionRuntime, data: {}): any; + (ctx: OpenFunctionRuntime, data: object): any; } // @public @@ -136,8 +136,8 @@ export interface OpenFunctionContext { name: string; outputs?: OpenFunctionBinding; port?: string; - postPlugins?: Array; - prePlugins?: Array; + postPlugins?: string[]; + prePlugins?: string[]; runtime: `${RuntimeType}` | `${Capitalize}` | `${Uppercase}`; version: string; } @@ -146,6 +146,8 @@ export interface OpenFunctionContext { export abstract class OpenFunctionRuntime { constructor(context: OpenFunctionContext); protected readonly context: OpenFunctionContext; + getPlugin(name: string): Plugin_2; + readonly locals: Record; static Parse(context: OpenFunctionContext): OpenFunctionRuntime; static ProxyContext(context: OpenFunctionContext): OpenFunctionRuntime; get req(): Request_3> | undefined; @@ -158,17 +160,17 @@ export abstract class OpenFunctionRuntime { }; // Warning: (ae-forgotten-export) The symbol "OpenFunctionTrigger" needs to be exported by the entry point index.d.ts protected trigger?: OpenFunctionTrigger; + static WrapUserFunction(userFunction: OpenFunction, context: OpenFunctionContext | OpenFunctionRuntime): (data: any) => Promise; } // @public class Plugin_2 { - execPostHook(ctx?: OpenFunctionRuntime): Promise; - execPreHook(ctx?: OpenFunctionRuntime): Promise; - get(filedName: string): string; - // (undocumented) - static OFN_PLUGIN_NAME: string; - // (undocumented) - static OFN_PLUGIN_VERSION: string; + constructor(name: string, version?: string); + execPostHook(ctx: OpenFunctionRuntime | null, plugins: Record): Promise; + execPreHook(ctx: OpenFunctionRuntime | null, plugins: Record): Promise; + get(prop: string): any; + readonly name: string; + readonly version: string; } export { Plugin_2 as Plugin } diff --git a/package-lock.json b/package-lock.json index f3d638ce..81916e75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,18 +27,18 @@ "functions-framework-nodejs": "build/src/main.js" }, "devDependencies": { - "@microsoft/api-extractor": "^7.28.4", + "@microsoft/api-extractor": "^7.29.3", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", "@types/google-protobuf": "^3.15.6", - "@types/lodash": "^4.14.182", + "@types/lodash": "^4.14.184", "@types/minimist": "1.2.2", "@types/mocha": "9.1.1", "@types/node": "14.18.11", "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", - "@types/semver": "^7.3.10", + "@types/semver": "^7.3.12", "@types/shelljs": "^0.8.11", "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", @@ -219,37 +219,37 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.28.4", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.28.4.tgz", - "integrity": "sha512-7JeROBGYTUt4/4HPnpMscsQgLzX0OfGTQR2qOQzzh3kdkMyxmiv2mzpuhoMnwbubb1GvPcyFm+NguoqOqkCVaw==", + "version": "7.29.3", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.29.3.tgz", + "integrity": "sha512-PHq+Oo8yiXhwi11VQ1Nz36s+aZwgFqjtkd41udWHtSpyMv2slJ74m1cHdpWbs2ovGUCfldayzdpGwnexZLd2bA==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.21.0", + "@microsoft/api-extractor-model": "7.23.1", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.49.0", - "@rushstack/rig-package": "0.3.13", - "@rushstack/ts-command-line": "4.12.1", + "@rushstack/node-core-library": "3.50.2", + "@rushstack/rig-package": "0.3.14", + "@rushstack/ts-command-line": "4.12.2", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.6.3" + "typescript": "~4.7.4" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.21.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.21.0.tgz", - "integrity": "sha512-NN4mXzoQWTuzznIcnLWeV6tGyn6Os9frDK6M/mmTXZ73vUYOvSWoKQ5SYzyzP7HF3YtvTmr1Rs+DsBb0HRx7WQ==", + "version": "7.23.1", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.23.1.tgz", + "integrity": "sha512-axlZ33H2LfYX7goAaWpzABWZl3JtX/EUkfVBsI4SuMn3AZYBJsP5MVpMCq7jt0PCefWGwwO+Rv+lCmmJIjFhlQ==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.49.0" + "@rushstack/node-core-library": "3.50.2" } }, "node_modules/@microsoft/api-extractor/node_modules/resolve": { @@ -261,19 +261,6 @@ "path-parse": "^1.0.6" } }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmmirror.com/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", @@ -392,9 +379,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { - "version": "3.49.0", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.49.0.tgz", - "integrity": "sha512-yBJRzGgUNFwulVrwwBARhbGaHsxVMjsZ9JwU1uSBbqPYCdac+t2HYdzi4f4q/Zpgb0eNbwYj2yxgHYpJORNEaw==", + "version": "3.50.2", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.50.2.tgz", + "integrity": "sha512-+zpZBcaX5s+wA0avF0Lk3sd5jbGRo5SmsEJpElJbqQd3KGFvc/hcyeNSMqV5+esJ1JuTfnE1QyRt8nvxFNTaQg==", "dev": true, "dependencies": { "@types/node": "12.20.24", @@ -424,9 +411,9 @@ } }, "node_modules/@rushstack/rig-package": { - "version": "0.3.13", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.13.tgz", - "integrity": "sha512-4/2+yyA/uDl7LQvtYtFs1AkhSWuaIGEKhP9/KK2nNARqOVc5eCXmu1vyOqr5mPvNq7sHoIR+sG84vFbaKYGaDA==", + "version": "0.3.14", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.14.tgz", + "integrity": "sha512-Ic9EN3kWJCK6iOxEDtwED9nrM146zCDrQaUxbeGOF+q/VLZ/HNHPw+aLqrqmTl0ZT66Sf75Qk6OG+rySjTorvQ==", "dev": true, "dependencies": { "resolve": "~1.17.0", @@ -443,9 +430,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.12.1", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.1.tgz", - "integrity": "sha512-S1Nev6h/kNnamhHeGdp30WgxZTA+B76SJ/P721ctP7DrnC+rrjAc6h/R80I4V0cA2QuEEcMdVOQCtK2BTjsOiQ==", + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.2.tgz", + "integrity": "sha512-poBtnumLuWmwmhCEkVAgynWgtnF9Kygekxyp4qtQUSbBrkuyPQTL85c8Cva1YfoUpOdOXxezMAkUt0n5SNKGqw==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -617,9 +604,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.182", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", + "version": "4.14.184", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", "dev": true }, "node_modules/@types/long": { @@ -713,9 +700,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.10", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.10.tgz", - "integrity": "sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==", + "version": "7.3.12", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.12.tgz", + "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", "dev": true }, "node_modules/@types/serve-static": { @@ -7800,23 +7787,23 @@ } }, "@microsoft/api-extractor": { - "version": "7.28.4", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.28.4.tgz", - "integrity": "sha512-7JeROBGYTUt4/4HPnpMscsQgLzX0OfGTQR2qOQzzh3kdkMyxmiv2mzpuhoMnwbubb1GvPcyFm+NguoqOqkCVaw==", + "version": "7.29.3", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.29.3.tgz", + "integrity": "sha512-PHq+Oo8yiXhwi11VQ1Nz36s+aZwgFqjtkd41udWHtSpyMv2slJ74m1cHdpWbs2ovGUCfldayzdpGwnexZLd2bA==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.21.0", + "@microsoft/api-extractor-model": "7.23.1", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.49.0", - "@rushstack/rig-package": "0.3.13", - "@rushstack/ts-command-line": "4.12.1", + "@rushstack/node-core-library": "3.50.2", + "@rushstack/rig-package": "0.3.14", + "@rushstack/ts-command-line": "4.12.2", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.6.3" + "typescript": "~4.7.4" }, "dependencies": { "resolve": { @@ -7827,24 +7814,18 @@ "requires": { "path-parse": "^1.0.6" } - }, - "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", - "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.21.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.21.0.tgz", - "integrity": "sha512-NN4mXzoQWTuzznIcnLWeV6tGyn6Os9frDK6M/mmTXZ73vUYOvSWoKQ5SYzyzP7HF3YtvTmr1Rs+DsBb0HRx7WQ==", + "version": "7.23.1", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.23.1.tgz", + "integrity": "sha512-axlZ33H2LfYX7goAaWpzABWZl3JtX/EUkfVBsI4SuMn3AZYBJsP5MVpMCq7jt0PCefWGwwO+Rv+lCmmJIjFhlQ==", "dev": true, "requires": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.49.0" + "@rushstack/node-core-library": "3.50.2" } }, "@microsoft/tsdoc": { @@ -7958,9 +7939,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@rushstack/node-core-library": { - "version": "3.49.0", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.49.0.tgz", - "integrity": "sha512-yBJRzGgUNFwulVrwwBARhbGaHsxVMjsZ9JwU1uSBbqPYCdac+t2HYdzi4f4q/Zpgb0eNbwYj2yxgHYpJORNEaw==", + "version": "3.50.2", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.50.2.tgz", + "integrity": "sha512-+zpZBcaX5s+wA0avF0Lk3sd5jbGRo5SmsEJpElJbqQd3KGFvc/hcyeNSMqV5+esJ1JuTfnE1QyRt8nvxFNTaQg==", "dev": true, "requires": { "@types/node": "12.20.24", @@ -7992,9 +7973,9 @@ } }, "@rushstack/rig-package": { - "version": "0.3.13", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.13.tgz", - "integrity": "sha512-4/2+yyA/uDl7LQvtYtFs1AkhSWuaIGEKhP9/KK2nNARqOVc5eCXmu1vyOqr5mPvNq7sHoIR+sG84vFbaKYGaDA==", + "version": "0.3.14", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.14.tgz", + "integrity": "sha512-Ic9EN3kWJCK6iOxEDtwED9nrM146zCDrQaUxbeGOF+q/VLZ/HNHPw+aLqrqmTl0ZT66Sf75Qk6OG+rySjTorvQ==", "dev": true, "requires": { "resolve": "~1.17.0", @@ -8013,9 +7994,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.12.1", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.1.tgz", - "integrity": "sha512-S1Nev6h/kNnamhHeGdp30WgxZTA+B76SJ/P721ctP7DrnC+rrjAc6h/R80I4V0cA2QuEEcMdVOQCtK2BTjsOiQ==", + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.2.tgz", + "integrity": "sha512-poBtnumLuWmwmhCEkVAgynWgtnF9Kygekxyp4qtQUSbBrkuyPQTL85c8Cva1YfoUpOdOXxezMAkUt0n5SNKGqw==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -8181,9 +8162,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.182", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", + "version": "4.14.184", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", "dev": true }, "@types/long": { @@ -8276,9 +8257,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.10", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.10.tgz", - "integrity": "sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==", + "version": "7.3.12", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.12.tgz", + "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", "dev": true }, "@types/serve-static": { diff --git a/package.json b/package.json index fb193a45..26e61e43 100644 --- a/package.json +++ b/package.json @@ -53,18 +53,18 @@ "author": "OpenFunction", "license": "Apache-2.0", "devDependencies": { - "@microsoft/api-extractor": "^7.28.4", + "@microsoft/api-extractor": "^7.29.3", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.13", "@types/google-protobuf": "^3.15.6", - "@types/lodash": "^4.14.182", + "@types/lodash": "^4.14.184", "@types/minimist": "1.2.2", "@types/mocha": "9.1.1", "@types/node": "14.18.11", "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", - "@types/semver": "^7.3.10", + "@types/semver": "^7.3.12", "@types/shelljs": "^0.8.11", "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", diff --git a/src/function_wrappers.ts b/src/function_wrappers.ts index 33e05c08..b2772d34 100644 --- a/src/function_wrappers.ts +++ b/src/function_wrappers.ts @@ -16,6 +16,10 @@ import * as domain from 'domain'; import {Request, Response, RequestHandler} from 'express'; + +import {OpenFunctionContext} from './openfunction/context'; +import {OpenFunctionRuntime} from './openfunction/runtime'; + import {sendCrashResponse} from './logger'; import {sendResponse} from './invoker'; import {isBinaryCloudEvent, getBinaryCloudEventContext} from './cloud_events'; @@ -31,9 +35,6 @@ import { import {CloudEvent, OpenFunction} from './functions'; import {SignatureType} from './types'; -import {OpenFunctionContext} from './openfunction/function_context'; -import {OpenFunctionRuntime} from './openfunction/function_runtime'; - /** * The handler function used to signal completion of event functions. */ @@ -126,18 +127,25 @@ const wrapHttpFunction = (execute: HttpFunction): RequestHandler => { }; }; +/** + * It takes a user-defined function and a context object, and returns a function that can be used as an HTTP handler. + * @param userFunction - The function that you wrote in your index.js file. + * @param context - OpenFunctionContext object which hold all context data. + * @returns A function that takes a request and a response and returns a promise. + */ const wrapOpenFunction = ( userFunction: OpenFunction, context: OpenFunctionContext ): RequestHandler => { const ctx = OpenFunctionRuntime.ProxyContext(context); + const wrapper = OpenFunctionRuntime.WrapUserFunction(userFunction, ctx); const httpHandler = (req: Request, res: Response) => { const callback = getOnDoneCallback(res); ctx.setTrigger(req, res); - Promise.resolve() - .then(() => userFunction(ctx, req.body)) + Promise.resolve(req.body) + .then(wrapper) .then(result => callback(null, result)) .catch(err => callback(err, undefined)); }; diff --git a/src/functions.ts b/src/functions.ts index cc3cba1f..eb1cb049 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -19,7 +19,7 @@ import {Request as ExpressRequest, Response} from 'express'; import {CloudEventV1 as CloudEvent} from 'cloudevents'; -import {OpenFunctionRuntime} from './openfunction/function_runtime'; +import {OpenFunctionRuntime} from './openfunction/runtime'; /** * @public @@ -82,7 +82,7 @@ export interface CloudEventFunctionWithCallback { * @public */ export interface OpenFunction { - (ctx: OpenFunctionRuntime, data: {}): any; + (ctx: OpenFunctionRuntime, data: object): any; } /** diff --git a/src/index.ts b/src/index.ts index 673a5d5e..88198b8e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,4 +25,9 @@ export {http, cloudEvent, openfunction} from './function_registry'; /** * @public */ -export * from './openfunction/function_context'; +export * from './openfunction/context'; + +/** + * @public + */ +export {Plugin} from './openfunction/plugin'; diff --git a/src/loader.ts b/src/loader.ts index 5e943c5f..c77f687d 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -18,18 +18,20 @@ * @packageDocumentation */ +import * as fs from 'fs'; import * as path from 'path'; +import {pathToFileURL} from 'url'; + import * as semver from 'semver'; import * as readPkgUp from 'read-pkg-up'; -import * as fs from 'fs'; -import {pathToFileURL} from 'url'; -import {HandlerFunction, OpenFunctionRuntime} from './functions'; -import {SignatureType} from './types'; -import {getRegisteredFunction} from './function_registry'; -import {Plugin} from './openfunction/function_context'; -import {FrameworkOptions} from './options'; import {forEach} from 'lodash'; +import {Plugin, PluginStore, PluginMap} from './openfunction/plugin'; + +import {HandlerFunction} from './functions'; +import {getRegisteredFunction} from './function_registry'; +import {SignatureType} from './types'; + // Dynamic import function required to load user code packaged as an // ES module is only available on Node.js v13.2.0 and up. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#browser_compatibility @@ -81,6 +83,28 @@ const dynamicImport = new Function( // eslint-disable-next-line @typescript-eslint/no-explicit-any ) as (modulePath: string) => Promise; +async function loadModule(modulePath: string) { + let module; + + const esModule = await isEsModule(modulePath); + if (esModule) { + if (semver.lt(process.version, MIN_NODE_VERSION_ESMODULES)) { + console.error( + `Cannot load ES Module on Node.js ${process.version}. ` + + `Please upgrade to Node.js v${MIN_NODE_VERSION_ESMODULES} and up.` + ); + return null; + } + // Resolve module path to file:// URL. Required for windows support. + const fpath = pathToFileURL(modulePath); + module = await dynamicImport(fpath.href); + } else { + module = require(modulePath); + } + + return module; +} + /** * Returns user's function from function file. * Returns null if function can't be retrieved. @@ -102,25 +126,10 @@ export async function getUserFunction( return null; } - let functionModule; - const esModule = await isEsModule(functionModulePath); - if (esModule) { - if (semver.lt(process.version, MIN_NODE_VERSION_ESMODULES)) { - console.error( - `Cannot load ES Module on Node.js ${process.version}. ` + - `Please upgrade to Node.js v${MIN_NODE_VERSION_ESMODULES} and up.` - ); - return null; - } - // Resolve module path to file:// URL. Required for windows support. - const fpath = pathToFileURL(functionModulePath); - functionModule = await dynamicImport(fpath.href); - } else { - functionModule = require(functionModulePath); - } + // Firstly, we try to load function + const functionModule = await loadModule(functionModulePath); - // If the customer declaratively registered a function matching the target - // return that. + // If the customer declaratively registered a function matching the target return that const registeredFunction = getRegisteredFunction(functionTarget); if (registeredFunction) { return registeredFunction; @@ -199,170 +208,67 @@ function getFunctionModulePath(codeLocation: string): string | null { return path; } -type PluginClass = Record; /** - * Returns user's plugin from function file. - * Returns null if plugin can't be retrieved. - * @return User's plugins or null. + * It loads all the plugins from the provided code location. + * @param codeLocation - The path to the plugin source codes. + * @return A named plugin map object or null. */ -export async function getUserPlugins( - options: FrameworkOptions -): Promise { - // Get plugin set - const pluginSet: Set = new Set(); - if (options.context) { - if (options.context.prePlugins) { - forEach(options.context.prePlugins, plugin => { - typeof plugin === 'string' && pluginSet.add(plugin); - }); - } - if (options.context.postPlugins) { - forEach(options.context.postPlugins, plugin => { - typeof plugin === 'string' && pluginSet.add(plugin); - }); - } - - try { - type Instance = Record; - // Load plugin js files - const instances: Instance = {}; +export async function getFunctionPlugins( + codeLocation: string +): Promise { + const files = getPluginsModulePath(codeLocation); + if (!files) return null; - const pluginFiles = getPluginFiles(options.sourceLocation); - if (pluginFiles === null) { - console.warn('[warn-!!!] user plugins files load failed '); - options.context.prePlugins = []; - options.context.postPlugins = []; - return options; - } + // Try to load all plugin module files - // Find plugins class - const tempMap: PluginClass = {}; - for (const pluginFile of pluginFiles) { - const jsMoulde = require(pluginFile); - processJsModule(jsMoulde, tempMap); - } + const store = PluginStore.Instance(); + const plugins: PluginMap = {}; - // Instance plugin dynamic set ofn_plugin_name - const pluginNames = Array.from(pluginSet.values()); - for (const name of pluginNames) { - const module = tempMap[name]; - if (module) { - const instance = new module(); - instance[Plugin.OFN_PLUGIN_NAME] = module.Name; - instance[Plugin.OFN_PLUGIN_VERSION] = module.Version || 'v1'; + for (const file of files) { + try { + const modules = await loadModule(file); - //Set default method of pre post get - if (!instance.execPreHook) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - instance.execPreHook = (ctx: OpenFunctionRuntime) => { - console.log( - `This plugin ${name} method execPreHook is not implemented.` - ); - }; - } - if (!instance.execPostHook) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - instance.execPostHook = (ctx: OpenFunctionRuntime) => { - console.log( - `This plugin ${name} method execPostHook is not implemented.` - ); - }; - } - if (!instance.get) { - instance.get = (filedName: string) => { - for (const key in instance) { - if (key === filedName) { - return instance[key]; - } - } - }; - } - instances[name] = instance as Plugin; + forEach(modules, module => { + // All plugin modules should extend from Plugin abstract class + if (module.prototype instanceof Plugin) { + // Try to create plugin instance + const plugin = new module(); + // Register plugin instance to plugin store + store.register(plugin); + // Also save to return records + plugins[plugin.name] = plugin; } - } - - const prePlugins: Array = []; - const postPlugins: Array = []; - if (options.context.prePlugins) { - forEach(options.context.prePlugins, plugin => { - if (typeof plugin === 'string') { - const instance = instances[plugin]; - typeof instance === 'object' && prePlugins.push(instance); - } - }); - } - if (options.context.postPlugins) { - forEach(options.context.postPlugins, plugin => { - if (typeof plugin === 'string') { - const instance = instances[plugin]; - typeof instance === 'object' && postPlugins.push(instance); - } - }); - } - - options.context.prePlugins = prePlugins; - options.context.postPlugins = postPlugins; - } catch (error) { - console.error('load plugins error reason: \n'); - console.error(error); + }); + } catch (ex) { + const err = ex; + console.error( + "Provided module can't be loaded. Plesae make sure your module extend Plugin class properly." + + `\nDetailed stack trace: ${err.stack}` + ); } } - return options; + + return plugins; } /** - * Returns resolved path to the dir containing the user plugins. - * Returns null if the path is not exits + * Returns resolved path of the folder containing the user plugins. + * Returns null if the plugin folder does not exist. * @param codeLocation Directory with user's code. - * @return Resolved path or null. + * @return Resolved path of plugins or null. */ -function getPluginFiles(codeLocation: string): Array | null { - const pluginFiles: Array = []; +function getPluginsModulePath(codeLocation: string): string[] | null { try { const param = path.resolve(codeLocation + '/plugins'); const files = fs.readdirSync(param); + const pluginFiles: string[] = []; for (const file of files) { pluginFiles.push(require.resolve(path.join(param, file))); } + return pluginFiles; } catch (ex) { - const err: Error = ex; - console.error(err.message); + console.error('Fail to load plugins: %s', ex); return null; } - return pluginFiles; -} -/** - * Returns rdetermine whether it is a class. - * Returns boolean is can be class - * @param obj jsmodule. - * @return boolean of it is a class. - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function couldBeClass(obj: any): boolean { - return ( - typeof obj === 'function' && - obj.prototype !== undefined && - obj.prototype.constructor === obj && - obj.toString().slice(0, 5) === 'class' - ); -} - -/** - * Process jsMoulde if it can be a plugin class put it into tempMap. - * @param obj jsmodule. - * @param tempMap PluginClass. - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function processJsModule(obj: any, tempMap: PluginClass) { - if (typeof obj === 'object') { - for (const o in obj) { - if (couldBeClass(obj[o]) && obj[o].Name) { - tempMap[obj[o].Name] = obj[o]; - } - } - } - if (couldBeClass(obj) && obj.Name) { - tempMap[obj.Name] = obj; - } } diff --git a/src/main.ts b/src/main.ts index 3cc5f864..0833bdf9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -21,12 +21,9 @@ import * as process from 'process'; import {createHttpTerminator} from 'http-terminator'; import getAysncServer from './openfunction/async_server'; -import { - OpenFunctionContext, - ContextUtils, -} from './openfunction/function_context'; +import {OpenFunctionContext, ContextUtils} from './openfunction/context'; -import {getUserFunction, getUserPlugins} from './loader'; +import {getUserFunction, getFunctionPlugins} from './loader'; import {ErrorHandler} from './invoker'; import {getServer} from './server'; import {parseOptions, helpText, OptionsError} from './options'; @@ -44,6 +41,7 @@ export const main = async () => { console.error(helpText); return; } + const loadedFunction = await getUserFunction( options.sourceLocation, options.target, @@ -56,6 +54,9 @@ export const main = async () => { } const {userFunction, signatureType} = loadedFunction; + // Load function plugins before starting server + await getFunctionPlugins(options.sourceLocation); + // Try to determine the server runtime // Considering the async runtime in the first place if (ContextUtils.IsAsyncRuntime(options.context as OpenFunctionContext)) { @@ -69,9 +70,6 @@ export const main = async () => { // DaprServer uses httpTerminator in server.stop() handleShutdown(async () => await server.stop()); - - // Load Plugins - await getUserPlugins(options); } // Then taking sync runtime as the fallback else { diff --git a/src/openfunction/async_server.ts b/src/openfunction/async_server.ts index 6107f24e..2241010e 100644 --- a/src/openfunction/async_server.ts +++ b/src/openfunction/async_server.ts @@ -1,10 +1,10 @@ -import {forEach, invoke} from 'lodash'; +import {forEach} from 'lodash'; import {DaprServer} from '@dapr/dapr'; import {OpenFunction} from '../functions'; -import {OpenFunctionContext, ContextUtils} from './function_context'; -import {OpenFunctionRuntime} from './function_runtime'; +import {OpenFunctionContext, ContextUtils} from './context'; +import {OpenFunctionRuntime} from './runtime'; export type AsyncFunctionServer = DaprServer; @@ -12,36 +12,18 @@ export type AsyncFunctionServer = DaprServer; * Creates and configures an Dapr server and returns an HTTP server * which will run it. * @param userFunction User's function. - * @param functionSignatureType Type of user's function signature. + * @param context Context of user's function. * @return HTTP server. */ export default function ( userFunction: OpenFunction, context: OpenFunctionContext ): AsyncFunctionServer { + // Initailize Dapr server const app = new DaprServer('localhost', context.port); - const ctx = OpenFunctionRuntime.ProxyContext(context); - - const wrapper = async (data: object) => { - // Exec pre hooks - console.log(context.prePlugins); - if (context.prePlugins) { - await context.prePlugins.reduce(async (_, current) => { - await invoke(current, 'execPreHook', ctx); - return []; - }, Promise.resolve([])); - } - - await userFunction(ctx, data); - // Exec post hooks - if (context.postPlugins) { - await context.postPlugins.reduce(async (_, current) => { - await invoke(current, 'execPostHook', ctx); - return []; - }, Promise.resolve([])); - } - }; + // Create wrapper for user function + const wrapper = OpenFunctionRuntime.WrapUserFunction(userFunction, context); // Initialize the server with the user's function. // For server interfaces, refer to https://github.com/dapr/js-sdk/blob/master/src/interfaces/Server/ diff --git a/src/openfunction/function_context.ts b/src/openfunction/context.ts similarity index 69% rename from src/openfunction/function_context.ts rename to src/openfunction/context.ts index fbf4dd23..f2ac10ba 100644 --- a/src/openfunction/function_context.ts +++ b/src/openfunction/context.ts @@ -1,5 +1,3 @@ -import {OpenFunctionRuntime} from './function_runtime'; - /** * The OpenFunction's serving context. * @public @@ -33,13 +31,13 @@ export interface OpenFunctionContext { */ outputs?: OpenFunctionBinding; /** - * Optional pre function exec plugins. + * Optional plugins to be executed before user function. */ - prePlugins?: Array; + prePlugins?: string[]; /** - * Optional post function exec plugins. + * Optional plugins to be executed after user function. */ - postPlugins?: Array; + postPlugins?: string[]; } /** @@ -149,44 +147,3 @@ export class ContextUtils { return component?.componentType.split('.')[0] === ComponentType.PubSub; } } - -/** - * The OpenFunction's plugin template. - * @public - */ -export class Plugin { - static OFN_PLUGIN_NAME = 'ofn_plugin_name'; - static OFN_PLUGIN_VERSION = 'ofn_plugin_version'; - /** - * pre main function exec. - * @param ctx - The openfunction runtime . - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public async execPreHook(ctx?: OpenFunctionRuntime) { - console.log( - `This plugin ${this.get( - Plugin.OFN_PLUGIN_NAME - )} method execPreHook is not implemented.` - ); - } - /** - * post main function exec. - * @param ctx - The openfunction runtime . - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public async execPostHook(ctx?: OpenFunctionRuntime) { - console.log( - `This plugin ${this.get( - Plugin.OFN_PLUGIN_NAME - )} method execPostHook is not implemented.` - ); - } - /** - * get instance filed value. - * @param filedName - the instace filedName - * @returns filed value. - */ - public get(filedName: string) { - return filedName; - } -} diff --git a/src/openfunction/dapr_output_middleware.ts b/src/openfunction/dapr_output_middleware.ts deleted file mode 100644 index 478d6392..00000000 --- a/src/openfunction/dapr_output_middleware.ts +++ /dev/null @@ -1,38 +0,0 @@ -import {Request, Response} from 'express'; -import * as interceptor from 'express-interceptor'; - -import * as Debug from 'debug'; -import {isEmpty} from 'lodash'; - -import {OpenFunctionContext, ContextUtils} from './function_context'; -import {OpenFunctionRuntime} from './function_runtime'; - -const debug = Debug('ofn:middleware:dapr:binding'); - -/** - * The handler to invoke Dapr output binding before sending the response. - * @param req express request object - * @param res express response object - */ -const daprOutputHandler = (req: Request, res: Response) => { - return { - isInterceptable: () => { - return ( - !isEmpty(res.locals.context?.outputs) && - ContextUtils.IsKnativeRuntime(res.locals.context as OpenFunctionContext) - ); - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - intercept: (body: any, send: Function) => { - const context = res.locals.context; - const runtime = OpenFunctionRuntime.Parse(context); - - runtime.send(body).then(data => { - debug('🎩 Dapr results: %j', data); - send(body); - }); - }, - }; -}; - -export default interceptor(daprOutputHandler); diff --git a/src/openfunction/decs.d.ts b/src/openfunction/decs.d.ts deleted file mode 100644 index 2b551564..00000000 --- a/src/openfunction/decs.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'express-interceptor'; diff --git a/src/openfunction/plugin.ts b/src/openfunction/plugin.ts new file mode 100644 index 00000000..946796f4 --- /dev/null +++ b/src/openfunction/plugin.ts @@ -0,0 +1,196 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import {get, invoke, omit, transform, trim} from 'lodash'; + +import {OpenFunctionRuntime} from './runtime'; + +/** + * Defining an abstract class to represent Plugin. + * @public + **/ +export class Plugin { + /** + * Name of the plugin. + */ + readonly name: string; + + /** + * Version of the plugin. + */ + readonly version: string; + + /** + * Constructor of the OpenFunction plugin. + */ + constructor(name: string, version = 'unknown') { + if (!trim(name)) { + throw new Error('Plugin name must be specified.'); + } + + this.name = name; + this.version = version; + } + + /** + * Get the value of a property on the plugin. + * @param prop - The property to get. + * @returns The value of the property. + */ + get(prop: string) { + return get(this, prop); + } + + /** + * This function is called before the user function is executed. + * @param ctx - Object that contains information about the function that is being executed. + * @param plugins - The collection of loaded pre and post hook plugins. + */ + async execPreHook( + ctx: OpenFunctionRuntime | null, + plugins: Record + ) { + console.warn( + `Plugin "${this.name}" has not implemented pre hook function.` + ); + } + + /** + * This function is called after the user function is executed. + * @param ctx - Object that contains information about the function that is being executed. + * @param plugins - The collection of loaded pre and post hook plugins. + */ + async execPostHook( + ctx: OpenFunctionRuntime | null, + plugins: Record + ) { + console.warn( + `Plugin "${this.name}" has not implemented post hook function.` + ); + } +} + +/** + * PluginMap type definition. + */ +export type PluginMap = Record & {_seq?: string[]}; + +enum PluginStoreType { + BUILTIN = 1, + CUSTOM, +} + +/** + * Initializes a store object for PluginStore singleton class + * with the keys of the PluginStoreType enum and the values of an empty object. + **/ +const stores = transform( + PluginStoreType, + (r, k, v) => { + r[v] = {_seq: []} as {} as PluginMap; + }, + >{} +); + +/** + * PluginStore is a class that manages a collection of plugins. + **/ +export class PluginStore { + /** + * Type of the plugin store. + */ + static Type = PluginStoreType; + + /** + * Singleton helper method to create PluginStore instance. + * @param type - PluginStoreType - The type of plugin store you want to create. + * @returns A new instance of the PluginStore class. + */ + static Instance(type = PluginStore.Type.CUSTOM): PluginStore { + return new PluginStore(type); + } + + /** + * Internal store object. + */ + #store: PluginMap | null = null; + + /** + * Private constructor of PluginStore. + * @param type - PluginStoreType - The type of store you want to use. + */ + private constructor(type: PluginStoreType) { + if (!this.#store) this.#store = stores[type]; + } + + /** + * Adds a plugin to the store. + * @param plugin - Plugin - The plugin to register. + */ + register(plugin: Plugin) { + this.#store![plugin.name] = plugin; + this.#store!._seq?.push(plugin.name); + } + + /** + * Removes a plugin from the store. + * @param plugin - Plugin - The plugin to register. + */ + unregister(plugin: Plugin) { + delete this.#store![plugin.name]; + omit(this.#store!._seq, plugin.name); + } + + /** + * Return the plugin with the given name from the store. + * @param name - The name of the plugin. + * @returns The plugin object. + */ + get(name: string): Plugin { + return this.#store![name]; + } + + /** + * It invokes the `execPreHook` function of each plugin in the order specified by the `seq` array + * @param ctx - The context object that is passed to the plugin. + * @param [seq] - The sequence of plugins to be executed. If not specified, all plugins will be executed. + */ + async execPreHooks(ctx: OpenFunctionRuntime | null, seq?: string[]) { + await this.#invokePluginBySeq( + ctx, + 'execPreHook', + seq || get(ctx, 'prePlugins', null) + ); + } + + /** + * It invokes the `execPostHook` function of each plugin in the order specified by the `seq` array + * @param ctx - The context object that is passed to the plugin. + * @param [seq] - The sequence of plugins to be executed. If not specified, all plugins will be executed. + */ + async execPostHooks(ctx: OpenFunctionRuntime | null, seq?: string[]) { + await this.#invokePluginBySeq( + ctx, + 'execPostHook', + seq || get(ctx, 'postPlugins', null) + ); + } + + /** + * It invokes a method on each plugin in the sequence. + * @param ctx - OpenFunctionRuntime context object. + * @param method - The method to invoke on the plugin. + * @param [seq] - The sequence of plugins to invoke. If not provided, the default sequence will be used. + */ + async #invokePluginBySeq( + ctx: OpenFunctionRuntime | null, + method: keyof Plugin, + seq: string[] + ) { + const pluginNames = seq ?? this.#store!._seq; + const plugins = this.#store!; + + for (const pluginName of pluginNames) { + const plugin = plugins[pluginName]; + await invoke(plugin, method, ctx, plugins); + } + } +} diff --git a/src/openfunction/function_runtime.ts b/src/openfunction/runtime.ts similarity index 67% rename from src/openfunction/function_runtime.ts rename to src/openfunction/runtime.ts index ea28a44c..ab758e4d 100644 --- a/src/openfunction/function_runtime.ts +++ b/src/openfunction/runtime.ts @@ -1,14 +1,18 @@ import {env} from 'process'; -import {chain, get, has, extend} from 'lodash'; +import {chain, get, has, extend, isPlainObject} from 'lodash'; import {Request, Response} from 'express'; import {DaprClient, CommunicationProtocolEnum} from '@dapr/dapr'; +import {OpenFunction} from '../functions'; + import { OpenFunctionComponent, OpenFunctionContext, ContextUtils, -} from './function_context'; +} from './context'; + +import {Plugin, PluginStore} from './plugin'; /** * Defining the interface of the HttpTarget. @@ -40,11 +44,19 @@ export abstract class OpenFunctionRuntime { */ protected trigger?: OpenFunctionTrigger; + /** + * An object to hold local data. + * TODO: Clarify the usage of this property + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly locals: Record; + /** * Constructor of the OpenFunctionRuntime. */ constructor(context: OpenFunctionContext) { this.context = context; + this.locals = {}; } /** @@ -74,6 +86,40 @@ export abstract class OpenFunctionRuntime { }); } + /** + * It takes a user function and a context object, and returns a function that executes the user + * function with the context object, and executes all the pre and post hooks before and after the user function. + * @param userFunction - The function that you want to wrap. + * @param context - This is the context object that is passed to the user function. + * @returns A function that takes in data and returns a promise. + */ + static WrapUserFunction( + userFunction: OpenFunction, + context: OpenFunctionContext | OpenFunctionRuntime + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): (data: any) => Promise { + const ctx: OpenFunctionRuntime = !isPlainObject(context) + ? (context as OpenFunctionRuntime) + : OpenFunctionRuntime.ProxyContext(context as OpenFunctionContext); + + // Load plugin stores + const userPlugins = PluginStore.Instance(); + const sysPlugins = PluginStore.Instance(PluginStore.Type.BUILTIN); + + return async data => { + // Execute pre hooks, system plugins go first + await sysPlugins.execPreHooks(ctx); + await userPlugins.execPreHooks(ctx); + + // Execute user function + await userFunction(ctx, data); + + // Execute pre hooks, system plugins go last + await userPlugins.execPostHooks(ctx); + await sysPlugins.execPostHooks(ctx); + }; + } + /** * Getter for the port of Dapr sidecar */ @@ -109,6 +155,19 @@ export abstract class OpenFunctionRuntime { this.trigger = extend(this.trigger, {req, res}); } + /** + * Get a plugin from the plugin store, or if it doesn't exist, get it from the built-in plugin store. + * + * @param name - The name of the plugin to get. + * @returns A plugin object + */ + getPlugin(name: string): Plugin { + return ( + PluginStore.Instance().get(name) || + PluginStore.Instance(PluginStore.Type.BUILTIN).get(name) + ); + } + /** * The promise that send data to certain ouput. */ diff --git a/src/options.ts b/src/options.ts index c3611304..cb78aea8 100644 --- a/src/options.ts +++ b/src/options.ts @@ -17,8 +17,9 @@ import {resolve} from 'path'; import * as Debug from 'debug'; import * as minimist from 'minimist'; +import {OpenFunctionContext} from './openfunction/context'; + import {SignatureType, isValidSignatureType} from './types'; -import {OpenFunctionContext} from './openfunction/function_context'; const debug = Debug('common:options'); diff --git a/test/data/mock/context.ts b/test/data/mock/context.ts new file mode 100644 index 00000000..d1f43650 --- /dev/null +++ b/test/data/mock/context.ts @@ -0,0 +1,69 @@ +import {OpenFunctionContext} from '../../../src'; + +export const KnativeBase: OpenFunctionContext = { + name: 'test-context', + version: '1.0.0', + runtime: 'Knative', + outputs: { + file1: { + componentName: 'local', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'my-file1.txt', + }, + }, + file2: { + componentName: 'local', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'my-file2.txt', + }, + }, + }, +}; + +export const AsyncBase: OpenFunctionContext = { + name: 'test-context', + version: '1.0.0', + runtime: 'Async', + port: '8080', + inputs: { + cron: { + uri: 'cron_input', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + mqtt_binding: { + uri: 'default', + componentName: 'binding-mqtt', + componentType: 'bindings.mqtt', + }, + mqtt_sub: { + uri: 'webup', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, + outputs: { + cron: { + uri: 'cron_output', + operation: 'delete', + componentName: 'binding-cron', + componentType: 'bindings.cron', + }, + localfs: { + uri: 'localstorage', + operation: 'create', + componentName: 'binding-localfs', + componentType: 'bindings.localstorage', + metadata: { + fileName: 'output-file.txt', + }, + }, + mqtt_pub: { + uri: 'webup_pub', + componentName: 'pubsub-mqtt', + componentType: 'pubsub.mqtt', + }, + }, +}; diff --git a/test/data/mock/index.ts b/test/data/mock/index.ts new file mode 100644 index 00000000..eba4e29c --- /dev/null +++ b/test/data/mock/index.ts @@ -0,0 +1,2 @@ +export * as Context from './context'; +export * as Payload from './payload'; diff --git a/test/data/mock/payload.ts b/test/data/mock/payload.ts new file mode 100644 index 00000000..57bca547 --- /dev/null +++ b/test/data/mock/payload.ts @@ -0,0 +1,19 @@ +import {CloudEvent} from '../../../src'; + +export interface IPayload { + RAW: object; + CE?: CloudEvent; +} + +export const Plain: IPayload = {RAW: {some: 'payload'}}; + +Plain.CE = { + specversion: '1.0', + id: 'test-1234-1234', + type: 'ce.openfunction', + time: '2020-05-13T01:23:45Z', + subject: 'test-subject', + source: 'https://github.com/OpenFunction/functions-framework-nodejs', + datacontenttype: 'application/json', + data: Plain.RAW, +}; diff --git a/test/data/plugins/constants.mjs b/test/data/plugins/constants.mjs new file mode 100644 index 00000000..179502bc --- /dev/null +++ b/test/data/plugins/constants.mjs @@ -0,0 +1,11 @@ +import {Plugin} from '../../../build/src/index.js'; + +export class Numbers extends Plugin { + bin = 2; + oct = 8; + hex = 16; + + constructor() { + super('numbers', 'v1'); + } +} diff --git a/test/data/plugins/counters.mjs b/test/data/plugins/counters.mjs new file mode 100644 index 00000000..5ba83214 --- /dev/null +++ b/test/data/plugins/counters.mjs @@ -0,0 +1,65 @@ +import {Plugin} from '../../../build/src/index.js'; + +const sleep = ms => new Promise(r => setTimeout(r, ms)); + +export class TickTock extends Plugin { + value = 0; + + constructor() { + super('ticktock', 'v1'); + } + + async execPreHook(ctx, plugins) { + this.value++; + } + + async execPostHook(ctx, plugins) { + this.value--; + } +} + +export class Countdown extends Plugin { + // start: number; + // end: number; + // step: number; + // current: number; + + constructor() { + super('countdown', 'v1'); + } + + async execPreHook(ctx, plugins) { + // Initialize step value from another plugin + this.step = plugins['numbers'].bin; + } + + async execPostHook(ctx, plugins) { + // Load start value from context local data + if (!this.start) { + this.start = ctx.locals.start ?? 0; + this.end = ctx.locals.end ?? 0; + this.current = this.start; + } + if (this.current === this.end) return; + + // Sleep "10 milliseconds" x "current value" + await sleep(10 * this.current); + + // Execute main countdown logic + this.countdown(ctx, plugins); + + // Try to end the test if necessary + if (this.current === this.end) ctx.locals.done?.(); + } + + countdown(ctx, plugins) { + // Load self plugin instance + const self = plugins[this.name]; + + // Count down by step value, and save current stop + self.current -= self.step; + + // Calibrate current value if it goes below the end value + if (self.current < self.end) self.current = self.end; + } +} diff --git a/test/data/plugins/errorMissAll.js b/test/data/plugins/errorMissAll.js deleted file mode 100644 index 413b0248..00000000 --- a/test/data/plugins/errorMissAll.js +++ /dev/null @@ -1,6 +0,0 @@ -class ErrorPlugin{ - static Version = "v1"; - static Name = "error-miss-all-plugin"; -} - -module.exports = ErrorPlugin; diff --git a/test/data/plugins/errorMissName.js b/test/data/plugins/errorMissName.js deleted file mode 100644 index c1266036..00000000 --- a/test/data/plugins/errorMissName.js +++ /dev/null @@ -1,22 +0,0 @@ -class ErrorPlugin{ - static Version = "v1"; - // static Name = "error-plugin" - constructor(){ - console.log(`init error plugins`); - } - async execPreHook(ctx){ - console.log(`-----------error plugin pre hook-----------`); - } - execPostHook(ctx){ - console.log(`-----------error plugin post hook-----------`); - } - get(filedName){ - for(let key in this){ - if(key === filedName){ - return this[key]; - } - } - } -} - -module.exports = {ErrorPlugin}; diff --git a/test/data/plugins/errorMissVersion.js b/test/data/plugins/errorMissVersion.js deleted file mode 100644 index aaf3087c..00000000 --- a/test/data/plugins/errorMissVersion.js +++ /dev/null @@ -1,22 +0,0 @@ -class ErrorPlugin{ - // static Version = "v1" - static Name = "error-miss-version-plugin" - constructor(){ - console.log(`init error plugins`); - } - async execPreHook(ctx){ - console.log(`-----------error plugin pre hook-----------`); - } - execPostHook(ctx){ - console.log(`-----------error plugin post hook-----------`); - } - get(filedName){ - for(let key in this){ - if(key === filedName){ - return this[key]; - } - } - } -} - -module.exports = {ErrorPlugin}; diff --git a/test/data/plugins/noname.mjs b/test/data/plugins/noname.mjs new file mode 100644 index 00000000..be122097 --- /dev/null +++ b/test/data/plugins/noname.mjs @@ -0,0 +1,7 @@ +import {Plugin} from '../../../build/src/index.js'; + +export class Noname extends Plugin { + constructor() { + super(' ', 'v0'); + } +} diff --git a/test/data/plugins/plugindemo.js b/test/data/plugins/plugindemo.js deleted file mode 100644 index 6fd4ea12..00000000 --- a/test/data/plugins/plugindemo.js +++ /dev/null @@ -1,32 +0,0 @@ -function sleep(){ - return new Promise(resolve => setTimeout(resolve,3000)); -} -class DemoPlugin{ - static Version = "v1"; - static Name = "demo-plugin"; - id = '666'; - constructor(){ - console.log(`init demo plugins`); - } - async execPreHook(ctx){ - console.log(`-----------demo plugin pre hook-----------`); - ctx['pre'] = 'pre-exec'; - await sleep(); - console.log(`-----------pre sleep 3----------`) - } - async execPostHook(ctx){ - console.log(`-----------demo plugin post hook-----------`); - ctx['post'] = 'post-exec'; - console.log(`-----------send post-----------`); - } - get(filedName){ - for(let key in this){ - if(key === filedName){ - return this[key]; - } - } - } -} - -// module.exports = {DemoPlugin}; -exports.DemoPlugin = DemoPlugin; diff --git a/test/data/test_data/async_plugin.ts b/test/data/test_data/async_plugin.ts deleted file mode 100644 index c281a314..00000000 --- a/test/data/test_data/async_plugin.ts +++ /dev/null @@ -1,111 +0,0 @@ -import {OpenFunctionContext} from '../../../src/openfunction/function_context'; -import {FrameworkOptions} from '../../../src/options'; - -export const TEST_CONTEXT: OpenFunctionContext = { - name: 'test-context', - version: '1.0.0', - runtime: 'Async', - port: '8080', - inputs: { - cron: { - uri: 'cron_input', - componentName: 'binding-cron', - componentType: 'bindings.cron', - }, - mqtt_binding: { - uri: 'default', - componentName: 'binding-mqtt', - componentType: 'bindings.mqtt', - }, - mqtt_sub: { - uri: 'webup', - componentName: 'pubsub-mqtt', - componentType: 'pubsub.mqtt', - }, - }, - outputs: { - cron: { - uri: 'cron_output', - operation: 'delete', - componentName: 'binding-cron', - componentType: 'bindings.cron', - }, - localfs: { - uri: 'localstorage', - operation: 'create', - componentName: 'binding-localfs', - componentType: 'bindings.localstorage', - metadata: { - fileName: 'output-file.txt', - }, - }, - mqtt_pub: { - uri: 'webup_pub', - componentName: 'pubsub-mqtt', - componentType: 'pubsub.mqtt', - }, - }, -}; -export const TEST_PLUGIN_OPTIONS: FrameworkOptions = { - port: '', - target: '', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'test-context-plugin', - version: '1.0.0', - runtime: 'Async', - port: '8080', - inputs: { - cron: { - uri: 'cron_input', - componentName: 'binding-cron', - componentType: 'bindings.cron', - }, - mqtt_binding: { - uri: 'default', - componentName: 'binding-mqtt', - componentType: 'bindings.mqtt', - }, - mqtt_sub: { - uri: 'webup', - componentName: 'pubsub-mqtt', - componentType: 'pubsub.mqtt', - }, - }, - outputs: { - cron: { - uri: 'cron_output', - operation: 'delete', - componentName: 'binding-cron', - componentType: 'bindings.cron', - }, - localfs: { - uri: 'localstorage', - operation: 'create', - componentName: 'binding-localfs', - componentType: 'bindings.localstorage', - metadata: { - fileName: 'output-file.txt', - }, - }, - mqtt_pub: { - uri: 'webup_pub', - componentName: 'pubsub-mqtt', - componentType: 'pubsub.mqtt', - }, - }, - prePlugins: ['demo-plugin'], - postPlugins: ['demo-plugin'], - }, -}; -export const TEST_PAYLOAD = {data: 'hello world'}; -export const TEST_CLOUD_EVENT = { - specversion: '1.0', - id: 'test-1234-1234', - type: 'ce.openfunction', - source: 'https://github.com/OpenFunction/functions-framework-nodejs', - traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', - data: TEST_PAYLOAD, -}; diff --git a/test/function_wrappers.ts b/test/function_wrappers.ts index 67e3591a..48ef82f2 100644 --- a/test/function_wrappers.ts +++ b/test/function_wrappers.ts @@ -2,7 +2,7 @@ import * as assert from 'assert'; import * as sinon from 'sinon'; import {Request, Response} from 'express'; -import {OpenFunctionContext} from '../src/openfunction/function_context'; +import {OpenFunctionContext} from '../src/openfunction/context'; import {Context, CloudEvent, OpenFunctionRuntime} from '../src/functions'; import {wrapUserFunction} from '../src/function_wrappers'; diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index e9cddd53..8009a44e 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -1,20 +1,20 @@ -/* eslint-disable no-restricted-properties */ import {deepStrictEqual, ifError, ok} from 'assert'; import {createServer} from 'net'; -import {get, isEmpty} from 'lodash'; +import {fill, get, isEmpty} from 'lodash'; import * as shell from 'shelljs'; import * as MQTT from 'aedes'; import getAysncServer from '../../src/openfunction/async_server'; +import {getFunctionPlugins} from '../../src/loader'; -import { - TEST_CLOUD_EVENT, - TEST_CONTEXT, - TEST_PAYLOAD, -} from '../data/test_data/async_plugin'; +import {Context, Payload} from '../data/mock'; -describe('OpenFunction - Async - Binding', () => { +const TEST_CONTEXT = Context.AsyncBase; +const TEST_PAYLOAD = Payload.Plain.RAW; +const TEST_PAYLOAD_CE = Payload.Plain.CE; + +describe('OpenFunction - Async', () => { const APPID = 'async.dapr'; const broker = MQTT.Server(); const server = createServer(broker.handle); @@ -43,20 +43,24 @@ describe('OpenFunction - Async - Binding', () => { }); it('stop cron after first trigger recived', done => { - const app = getAysncServer((ctx, data) => { - // Assert that user function receives data from input binding - ok(data); - - // Assert that context data was passed through - deepStrictEqual(get(ctx, 'runtime'), TEST_CONTEXT.runtime); - deepStrictEqual( - get(ctx, 'inputs.cron.uri'), - TEST_CONTEXT.inputs!.cron.uri - ); + const app = getAysncServer( + (ctx, data) => { + // Assert that user function receives data from input binding + ok(data); - // Then stop the cron scheduler - ctx.send({}, 'cron').then(() => app.stop().finally(done)); - }, TEST_CONTEXT); + // Assert that context data was passed through + deepStrictEqual(get(ctx, 'runtime'), TEST_CONTEXT.runtime); + deepStrictEqual( + get(ctx, 'inputs.cron.uri'), + TEST_CONTEXT.inputs!.cron.uri + ); + + // Then stop the cron scheduler + ctx.send({}, 'cron').then(() => app.stop().finally(done)); + }, + + TEST_CONTEXT + ); app.start(); }); @@ -95,27 +99,31 @@ describe('OpenFunction - Async - Binding', () => { }); it('mqtt sub w/ pub output', done => { - const app = getAysncServer((ctx, data) => { - if (isEmpty(data)) return; - - // Assert that user function receives correct data from input binding - deepStrictEqual(data, TEST_PAYLOAD); - - // Then forward received data to output channel - const output = 'mqtt_pub'; - broker.subscribe( - get(TEST_CONTEXT, `outputs.${output}.uri`), - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (packet, _) => { - const payload = JSON.parse(Buffer.from(packet.payload).toString()); - deepStrictEqual(payload.data, TEST_PAYLOAD); - app.stop().finally(done); - }, - () => { - ctx.send(TEST_PAYLOAD, output); - } - ); - }, TEST_CONTEXT); + const app = getAysncServer( + (ctx, data) => { + if (isEmpty(data)) return; + + // Assert that user function receives correct data from input binding + deepStrictEqual(data, TEST_PAYLOAD); + + // Then forward received data to output channel + const output = 'mqtt_pub'; + broker.subscribe( + get(TEST_CONTEXT, `outputs.${output}.uri`), + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (packet, _) => { + const payload = JSON.parse(Buffer.from(packet.payload).toString()); + deepStrictEqual(payload.data, TEST_PAYLOAD); + app.stop().finally(done); + }, + () => { + ctx.send(TEST_PAYLOAD, output); + } + ); + }, + + TEST_CONTEXT + ); // First, we start the async server app.start().then(() => { @@ -124,7 +132,7 @@ describe('OpenFunction - Async - Binding', () => { { cmd: 'publish', topic: TEST_CONTEXT.inputs!.mqtt_sub.uri!, - payload: JSON.stringify(TEST_CLOUD_EVENT), + payload: JSON.stringify(TEST_PAYLOAD_CE), qos: 0, retain: false, dup: false, @@ -133,4 +141,45 @@ describe('OpenFunction - Async - Binding', () => { ); }); }); + + it('mqtt binding w/ custom plugins', done => { + getFunctionPlugins(process.cwd() + '/test/data').then(plugins => { + const start = get(plugins!.numbers, 'oct'); + + const app = getAysncServer( + (ctx, data) => { + // Assert that user function receives correct data from input binding + deepStrictEqual(get(data, 'start'), start); + + // Set local data for post hook plugin + ctx.locals.start = start; + ctx.locals.end = -start; + + // Passthrough test done handler + ctx.locals.done = done; + }, + { + ...TEST_CONTEXT, + prePlugins: ['countdown'], + postPlugins: fill(Array(start), 'countdown'), + } + ); + + // First, we start the async server + app.start().then(() => { + // Then, we send a number as start value to user function + broker.publish( + { + cmd: 'publish', + topic: 'default', + payload: JSON.stringify({start}), + qos: 0, + retain: false, + dup: false, + }, + err => ifError(err) + ); + }); + }); + }); }); diff --git a/test/integration/async_server_plugin.ts b/test/integration/async_server_plugin.ts deleted file mode 100644 index c7e228ea..00000000 --- a/test/integration/async_server_plugin.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* eslint-disable no-restricted-properties */ -import {deepStrictEqual, ifError} from 'assert'; -import {createServer} from 'net'; - -import {get, isEmpty} from 'lodash'; -import * as shell from 'shelljs'; -import * as MQTT from 'aedes'; - -import getAysncServer from '../../src/openfunction/async_server'; -import {getUserPlugins} from '../../src/loader'; -import assert = require('assert'); -import { - TEST_CLOUD_EVENT, - TEST_CONTEXT, - TEST_PAYLOAD, - TEST_PLUGIN_OPTIONS, -} from '../data/test_data/async_plugin'; - -describe('OpenFunction - Async - Binding with plugin', () => { - const APPID = 'async.dapr'; - const broker = MQTT.Server(); - const server = createServer(broker.handle); - - before(done => { - // Start simple plain MQTT server via aedes - server.listen(1883, () => { - // Try to run Dapr sidecar and listen for the async server - shell.exec( - `dapr run -H 3500 -G 50001 -p ${TEST_CONTEXT.port} -d ./test/data/components/async -a ${APPID} --log-level debug`, - { - silent: true, - async: true, - } - ); - done(); - }); - }); - - after(done => { - // Stop dapr sidecar process - shell.exec(`dapr stop ${APPID}`, { - silent: true, - }); - server.close(); - broker.close(done); - }); - - it('mqtt sub w/ pub output with demo plugin', done => { - const app = getAysncServer((ctx, data) => { - if (isEmpty(data)) return; - - const context: any = ctx as any; - assert(context['pre'] === 'pre-exec'); - context['pre'] = 'main-exec'; - - // Assert that user function receives correct data from input binding - deepStrictEqual(data, TEST_PAYLOAD); - console.log(data); - // Then forward received data to output channel - const output = 'mqtt_pub'; - broker.subscribe( - get(TEST_PLUGIN_OPTIONS.context!, `outputs.${output}.uri`), - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (packet, _) => { - const payload = JSON.parse(Buffer.from(packet.payload).toString()); - deepStrictEqual(payload.data, TEST_PAYLOAD); - app - .stop() - .then(() => { - assert(context['pre'] === 'main-exec'); - assert(context['post'] === 'post-exec'); - }) - .finally(done); - }, - () => { - ctx.send(TEST_PAYLOAD, output); - } - ); - }, TEST_PLUGIN_OPTIONS.context!); - - // First, we start the async server - app.start().then(async () => { - await getUserPlugins(TEST_PLUGIN_OPTIONS); - console.log(TEST_PLUGIN_OPTIONS); - // Then, we send a cloudevent format message to server - broker.publish( - { - cmd: 'publish', - topic: TEST_PLUGIN_OPTIONS.context!.inputs!.mqtt_sub.uri!, - payload: JSON.stringify(TEST_CLOUD_EVENT), - qos: 0, - retain: false, - dup: false, - }, - err => ifError(err) - ); - }); - }); -}); diff --git a/test/integration/cloud_event.ts b/test/integration/cloud_event.ts index ce21b81d..223af5e8 100644 --- a/test/integration/cloud_event.ts +++ b/test/integration/cloud_event.ts @@ -21,19 +21,10 @@ import * as functions from '../../src/index'; import {getTestServer} from '../../src/testing'; import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; +import {Plain} from '../data/mock/payload'; + // A structured CloudEvent -const TEST_CLOUD_EVENT = { - specversion: '1.0', - type: 'com.google.cloud.storage', - source: 'https://github.com/OpenFunction/functions-framework-nodejs', - subject: 'test-subject', - id: 'test-1234-1234', - time: '2020-05-13T01:23:45Z', - datacontenttype: 'application/json', - data: { - some: 'payload', - }, -}; +const TEST_CLOUD_EVENT = Plain.CE!; const TEST_EXTENSIONS = { traceparent: '00-65088630f09e0a5359677a7429456db7-97f23477fb2bf5ec-01', diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts index 7c91aa2c..9517cb88 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -3,36 +3,18 @@ import {deepStrictEqual} from 'assert'; import * as sinon from 'sinon'; import * as supertest from 'supertest'; import * as shell from 'shelljs'; -import {cloneDeep, forEach, set} from 'lodash'; - -import {OpenFunctionContext} from '../../src/openfunction/function_context'; +import {cloneDeep, forEach, get, set} from 'lodash'; +import {PluginStore} from '../../src/openfunction/plugin'; import {OpenFunctionRuntime} from '../../src/functions'; import {getServer} from '../../src/server'; +import {getFunctionPlugins} from '../../src/loader'; import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; -const TEST_CONTEXT: OpenFunctionContext = { - name: 'test-context', - version: '1.0.0', - runtime: 'Knative', - outputs: { - file1: { - componentName: 'local', - componentType: 'bindings.localstorage', - metadata: { - fileName: 'my-file1.txt', - }, - }, - file2: { - componentName: 'local', - componentType: 'bindings.localstorage', - metadata: { - fileName: 'my-file2.txt', - }, - }, - }, -}; -const TEST_PAYLOAD = {echo: 'hello world'}; +import {Context, Payload} from '../data/mock'; + +const TEST_CONTEXT = Context.KnativeBase; +const TEST_PAYLOAD = Payload.Plain.RAW; describe('OpenFunction - HTTP Binding', () => { const APPID = 'http.dapr'; @@ -50,8 +32,10 @@ describe('OpenFunction - HTTP Binding', () => { } ); - // Wait 5 seconds for dapr sidecar to start - setTimeout(done, 5000); + getFunctionPlugins(process.cwd() + '/test/data').then(() => { + // Wait 5 seconds for dapr sidecar to start + setTimeout(done, 5000); + }); }); after(() => { @@ -79,6 +63,7 @@ describe('OpenFunction - HTTP Binding', () => { testData.forEach(test => { it(test.name, async () => { const context = cloneDeep(TEST_CONTEXT); + context.prePlugins = context.postPlugins = ['ticktock']; forEach(context.outputs, output => set(output, 'operation', test.operation) ); @@ -99,12 +84,17 @@ describe('OpenFunction - HTTP Binding', () => { .send(TEST_PAYLOAD) .expect(test.operation ? 200 : 500) .expect(res => { - !test.operation - ? deepStrictEqual( - res.headers[FUNCTION_STATUS_HEADER_FIELD.toLowerCase()], - 'error' - ) - : deepStrictEqual(res.body, TEST_PAYLOAD); + const tick = get(PluginStore.Instance().get('ticktock'), 'value'); + if (!test.operation) { + deepStrictEqual( + res.headers[FUNCTION_STATUS_HEADER_FIELD.toLowerCase()], + 'error' + ); + deepStrictEqual(tick, 1); + } else { + deepStrictEqual(res.body, TEST_PAYLOAD); + deepStrictEqual(tick, 0); + } }); forEach(context.outputs, output => { diff --git a/test/loader.ts b/test/loader.ts index 35bc528c..52a7589c 100644 --- a/test/loader.ts +++ b/test/loader.ts @@ -13,15 +13,14 @@ // limitations under the License. import * as assert from 'assert'; + import * as express from 'express'; import * as semver from 'semver'; -import * as functions from '../src/functions'; + +import {http, cloudEvent, HttpFunction} from '../src'; import * as loader from '../src/loader'; -import * as FunctionRegistry from '../src/function_registry'; -import {FrameworkOptions} from '../src/options'; -import {Plugin} from '../src'; -describe('loading function', () => { +describe('Load function and plugins', () => { interface TestData { name: string; codeLocation: string; @@ -48,8 +47,7 @@ describe('loading function', () => { test.target, 'http' ); - const userFunction = - loadedFunction?.userFunction as functions.HttpFunction; + const userFunction = loadedFunction?.userFunction as HttpFunction; const returned = userFunction(express.request, express.response); assert.strictEqual(returned, 'PASS'); }); @@ -74,13 +72,13 @@ describe('loading function', () => { ]; for (const test of esmTestData) { - const loadFn: () => Promise = async () => { + const loadFn: () => Promise = async () => { const loadedFunction = await loader.getUserFunction( process.cwd() + test.codeLocation, test.target, 'http' ); - return loadedFunction?.userFunction as functions.HttpFunction; + return loadedFunction?.userFunction as HttpFunction; }; if (semver.lt(process.version, loader.MIN_NODE_VERSION_ESMODULES)) { it(`should fail to load function in an ES module ${test.name}`, async () => { @@ -96,7 +94,7 @@ describe('loading function', () => { } it('loads a declaratively registered function', async () => { - FunctionRegistry.http('registeredFunction', () => { + http('registeredFunction', () => { return 'PASS'; }); const loadedFunction = await loader.getUserFunction( @@ -104,13 +102,13 @@ describe('loading function', () => { 'registeredFunction', 'http' ); - const userFunction = loadedFunction?.userFunction as functions.HttpFunction; + const userFunction = loadedFunction?.userFunction as HttpFunction; const returned = userFunction(express.request, express.response); assert.strictEqual(returned, 'PASS'); }); it('allows a mix of registered and non registered functions', async () => { - FunctionRegistry.http('registeredFunction', () => { + http('registeredFunction', () => { return 'FAIL'; }); const loadedFunction = await loader.getUserFunction( @@ -118,13 +116,13 @@ describe('loading function', () => { 'testFunction', 'http' ); - const userFunction = loadedFunction?.userFunction as functions.HttpFunction; + const userFunction = loadedFunction?.userFunction as HttpFunction; const returned = userFunction(express.request, express.response); assert.strictEqual(returned, 'PASS'); }); it('respects the registered signature type', async () => { - FunctionRegistry.cloudEvent('registeredFunction', () => {}); + cloudEvent('registeredFunction', () => {}); const loadedFunction = await loader.getUserFunction( process.cwd() + '/test/data/with_main', 'registeredFunction', @@ -132,202 +130,16 @@ describe('loading function', () => { ); assert.strictEqual(loadedFunction?.signatureType, 'cloudevent'); }); -}); - -describe('loading plugins', () => { - interface ExceptData { - prePlugins: Array; - postPlugins: Array; - } - interface TestData { - options: FrameworkOptions; - except: ExceptData; - } - const testData: TestData[] = [ - { - options: { - port: '8080', - target: 'helloWorld', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'demo', - version: '', - runtime: 'ASYNC', - prePlugins: ['demo-plugin'], - postPlugins: ['demo-plugin'], - }, - }, - except: { - prePlugins: ['demo-plugin'], - postPlugins: ['demo-plugin'], - }, - }, - { - options: { - port: '8080', - target: 'helloWorld', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'demo', - version: '', - runtime: 'ASYNC', - prePlugins: ['demo-plugin'], - postPlugins: [], - }, - }, - except: { - prePlugins: ['demo-plugin'], - postPlugins: [], - }, - }, - { - options: { - port: '8080', - target: 'helloWorld', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'demo', - version: '', - runtime: 'ASYNC', - prePlugins: [], - postPlugins: [], - }, - }, - except: { - prePlugins: [], - postPlugins: [], - }, - }, - { - options: { - port: '8080', - target: 'helloWorld', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'error', - version: '', - runtime: 'ASYNC', - prePlugins: ['error-plugin'], - postPlugins: ['error-plugin'], - }, - }, - except: { - prePlugins: [], - postPlugins: [], - }, - }, - { - options: { - port: '8080', - target: 'helloWorld', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'error', - version: '', - runtime: 'ASYNC', - prePlugins: ['error-miss-version-plugin', 'demo-plugin'], - postPlugins: ['error-miss-version-plugin'], - }, - }, - except: { - prePlugins: ['error-miss-version-plugin', 'demo-plugin'], - postPlugins: ['error-miss-version-plugin'], - }, - }, - ]; - - it('load exits plugins', async () => { - for (const test of testData) { - const options = await loader.getUserPlugins(test.options); - const current: ExceptData = { - prePlugins: [], - postPlugins: [], - }; - - options.context!.prePlugins!.forEach(item => { - assert(typeof item === 'object'); - assert(item.get(Plugin.OFN_PLUGIN_VERSION) === 'v1'); - current.prePlugins.push(item.get(Plugin.OFN_PLUGIN_NAME)); - }); - options.context!.postPlugins!.forEach(item => { - assert(typeof item === 'object'); - assert(item.get(Plugin.OFN_PLUGIN_VERSION) === 'v1'); - current.postPlugins.push(item.get(Plugin.OFN_PLUGIN_NAME)); - }); - - assert.deepStrictEqual(current, test.except); - } - }); - - const test: TestData = { - options: { - port: '8080', - target: 'helloWorld', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'error', - version: '', - runtime: 'ASYNC', - prePlugins: [''], - postPlugins: [''], - }, - }, - except: { - prePlugins: [''], - postPlugins: [''], - }, - }; - - function copyAndSet(name: string): TestData { - const data: TestData = JSON.parse(JSON.stringify(test)); - data.options.context!.prePlugins![0] = name; - data.options.context!.postPlugins![0] = name; - data.except.postPlugins[0] = name; - data.except.prePlugins[0] = name; - return data; - } - - it('user plugin miss all', async () => { - const data = copyAndSet('error-miss-all-plugin'); - const options = await loader.getUserPlugins(data.options); - assert(typeof options.context!.prePlugins![0] === 'object'); - assert( - options.context!.prePlugins![0].get(Plugin.OFN_PLUGIN_NAME) === - 'error-miss-all-plugin' + it('should only load valid plugin class and ignore other', async () => { + const loadedPlugins = await loader.getFunctionPlugins( + process.cwd() + '/test/data' ); - assert(options.context!.prePlugins![0].execPreHook); - assert(options.context!.prePlugins![0].execPostHook); - }); + assert.ok(loadedPlugins); - it('load multi plugins ', async () => { - const data: FrameworkOptions = { - port: '8080', - target: 'helloWorld', - sourceLocation: process.cwd() + '/test/data', - signatureType: 'event', - printHelp: false, - context: { - name: 'demo', - version: '', - runtime: 'ASYNC', - prePlugins: ['demo-plugin', 'error-miss-all-plugin'], - postPlugins: ['demo-plugin', 'error-miss-all-plugin'], - }, - }; - assert.ok(await loader.getUserPlugins(data)); - console.log(data); + ['noname'].forEach(v => assert.ok(!loadedPlugins[v])); + ['numbers', 'ticktock', 'countdown'].forEach(v => + assert.strictEqual(loadedPlugins[v]?.name, v) + ); }); }); diff --git a/test/plugin.ts b/test/plugin.ts new file mode 100644 index 00000000..000bd46c --- /dev/null +++ b/test/plugin.ts @@ -0,0 +1,57 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import * as assert from 'assert'; + +import {fill, get, random, range} from 'lodash'; + +import {PluginStore, Plugin} from '../src/openfunction/plugin'; +import {getFunctionPlugins} from '../src/loader'; + +class Concater extends Plugin { + index = 0; + value = ''; + + constructor() { + super('concater', 'v1'); + } + + async execPreHook(): Promise { + await new Promise(r => setTimeout(r, random(0, 10) * 10)); + this.value += this.index++; + } +} + +describe('Store for custom and builtin plugins', () => { + before(async () => await getFunctionPlugins(process.cwd() + '/test/data')); + + const customs = PluginStore.Instance(); + + it('can retrieve plugin by name', () => { + ['numbers', 'ticktock', 'countdown'].forEach(v => + assert.strictEqual(customs.get(v)?.name, v) + ); + }); + + it('can execute custom plugins by sequence', async () => { + const size = random(3, 5); + const ticktock = customs.get('ticktock'); + const seq = fill(Array(size), ticktock.name); + + await customs.execPreHooks(null, seq); + assert.strictEqual(get(ticktock, 'value'), size); + + await customs.execPostHooks(null, seq); + assert.strictEqual(get(ticktock, 'value'), 0); + }); + + it('ensures the sequence of long running async plugins', async () => { + customs.register(new Concater()); + + const size = random(0, 9); + const concater = customs.get('concater'); + const seq = fill(Array(size), concater.name); + + await customs.execPreHooks(null, seq); + assert.strictEqual(get(concater, 'index'), size); + assert.strictEqual(get(concater, 'value'), range(size).join('')); + }); +}); From d21201dc6e8fd8bb39e2568771a0e79bf6ac760b Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 25 Aug 2022 12:41:25 +0800 Subject: [PATCH 074/131] =?UTF-8?q?=F0=9F=93=9D=20docs(CONTRIBUTING):=20in?= =?UTF-8?q?troduce=20how=20to=20debug=20in=20vscode=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- CONTRIBUTING.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 026aaa70..a8ad568d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,6 +20,16 @@ All submissions, including submissions by project members, require review. We us ## Testing +### Debugging in VS Code + +VS Code provides awesome Node.js debugging features, including the ability to automatically attach debugging to certain Node.js processes that have been launched from VS Code's Integrated Terminal. + +Please refer this [guide](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_auto-attach) to toggle "Auto Attach" feature, and the default `smart` mode is already good enough for debugging our framework. + +Once set up Auto Attach, you can create some breakpoints in your codes and run `npm t` in VS Code's Integrated Terminal to check whether the breakpoints work as expected. + +> After enabling Auto Attach, you'll need to restart your terminal. This can be done by clicking the ⚠ icon in the top right of the terminal, or just creating a new one. + ### Unit Tests All pull requests should have an associated test to ensure foward compatibility. From 92d5533358d1bd70319ce6ba5c9ebc885a83c3e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Aug 2022 03:36:45 +0000 Subject: [PATCH 075/131] chore(deps-dev): bump typescript from 4.7.4 to 4.8.2 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.7.4 to 4.8.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.7.4...v4.8.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 81916e75..e2bc777b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -261,6 +261,19 @@ "path-parse": "^1.0.6" } }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "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", @@ -7073,9 +7086,9 @@ } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", + "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7814,6 +7827,12 @@ "requires": { "path-parse": "^1.0.6" } + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true } } }, @@ -13035,9 +13054,9 @@ } }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", + "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", "dev": true }, "unbox-primitive": { From 7e7c91d91df91904cb1a0f12253fa20bcf244ecb Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 3 Sep 2022 22:21:36 +0800 Subject: [PATCH 076/131] =?UTF-8?q?=F0=9F=91=B7=20ci:=20add=20prepack=20li?= =?UTF-8?q?nt=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 18 +++++++++++++++++- package.json | 6 ++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2bc777b..189f73a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,7 @@ "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", "aedes": "^0.47.0", + "clean-pkg-json": "^1.2.0", "concurrently": "^7.3.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", @@ -53,7 +54,7 @@ "shelljs": "^0.8.5", "sinon": "^14.0.0", "supertest": "6.2.3", - "typescript": "^4.7.4", + "typescript": "^4.8.2", "wait-on": "^6.0.1" }, "engines": { @@ -1635,6 +1636,15 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "node_modules/clean-pkg-json": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/clean-pkg-json/-/clean-pkg-json-1.2.0.tgz", + "integrity": "sha512-QHBWWOtpSCv5nfMFKwyxn4WMvkYE0msxj5xiqejYGqYepWVrK7O/om1Vn6nSl/WPtYn8ge9YmSCbTi1Hp8k+Hg==", + "dev": true, + "bin": { + "clean-pkg-json": "dist/index.js" + } + }, "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -8959,6 +8969,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "clean-pkg-json": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/clean-pkg-json/-/clean-pkg-json-1.2.0.tgz", + "integrity": "sha512-QHBWWOtpSCv5nfMFKwyxn4WMvkYE0msxj5xiqejYGqYepWVrK7O/om1Vn6nSl/WPtYn8ge9YmSCbTi1Hp8k+Hg==", + "dev": true + }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", diff --git a/package.json b/package.json index 26e61e43..92dd34a0 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ "docs": "npm run compile && api-extractor run --local --verbose", "watch": "npm run compile -- --watch", "prepare": "npm run build", - "pretest": "npm run compile" + "pretest": "npm run compile", + "prepack": "clean-pkg-json" }, "prepush": [ "build", @@ -69,6 +70,7 @@ "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", "aedes": "^0.47.0", + "clean-pkg-json": "^1.2.0", "concurrently": "^7.3.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", @@ -79,7 +81,7 @@ "shelljs": "^0.8.5", "sinon": "^14.0.0", "supertest": "6.2.3", - "typescript": "^4.7.4", + "typescript": "^4.8.2", "wait-on": "^6.0.1" } } From 32672faa79971260bd2384d30382e3daa40afda1 Mon Sep 17 00:00:00 2001 From: MachaYAD <43526965+YADROOKIE@users.noreply.github.com> Date: Sun, 4 Sep 2022 15:21:57 +0800 Subject: [PATCH 077/131] feat: enable skywalking plugin for tracing (#86) --- .github/workflows/unit.yml | 10 + docs/generated/api.json | 235 +++++++++ docs/generated/api.md | 15 + output-file.txt | 1 + package-lock.json | 475 ++++++++++++++++-- package.json | 4 +- src/loader.ts | 50 ++ src/main.ts | 4 +- src/openfunction/context.ts | 44 ++ .../plugin/skywalking/skywalking.ts | 114 +++++ src/openfunction/runtime.ts | 2 +- test/data/plugins/counters.mjs | 5 +- test/data/plugins/skywalking_assist.mjs | 35 ++ test/integration/async_server.ts | 1 + test/integration/build_in_plugin.ts | 232 +++++++++ 15 files changed, 1176 insertions(+), 51 deletions(-) create mode 100644 output-file.txt create mode 100644 src/openfunction/plugin/skywalking/skywalking.ts create mode 100644 test/data/plugins/skywalking_assist.mjs create mode 100644 test/integration/build_in_plugin.ts diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index c5cfe874..e54221f2 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -26,6 +26,16 @@ jobs: - name: Install Docker for macOS uses: docker-practice/actions-setup-docker@master if: ${{ matrix.platform == 'macos-latest' }} + - name: Install Docker for ubuntu + uses: docker-practice/actions-setup-docker@master + if: ${{ matrix.platform == 'ubuntu-latest' }} + - name: Install skywalking and wait for it start + run: | + docker version + docker pull apache/skywalking-oap-server:8.4.0-es6 + docker run -d --name oap -p 12800:12800 -p 11800:11800 apache/skywalking-oap-server:8.4.0-es6 + docker ps + sleep 20s - name: Initialize Dapr run: dapr init -s --runtime-version ${{ matrix.dapr-version }} - name: Install dependencies diff --git a/docs/generated/api.json b/docs/generated/api.json index d1902656..b83f66fd 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -2039,6 +2039,34 @@ "endIndex": 12 } }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#tracing:member", + "docComment": "/**\n * Optional trace config\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "tracing?: " + }, + { + "kind": "Reference", + "text": "TraceConfig", + "canonicalReference": "@openfunction/functions-framework!TraceConfig:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "tracing", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#version:member", @@ -3168,6 +3196,213 @@ "name": "Knative" } ] + }, + { + "kind": "Interface", + "canonicalReference": "@openfunction/functions-framework!TraceConfig:interface", + "docComment": "/**\n * The config of the trace.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export interface TraceConfig " + } + ], + "releaseTag": "Public", + "name": "TraceConfig", + "preserveMemberOrder": false, + "members": [ + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!TraceConfig#baggage:member", + "docComment": "/**\n * Trace baggage\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "baggage?: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "baggage", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 3 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!TraceConfig#enabled:member", + "docComment": "/**\n * This is trace switch\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "enabled: " + }, + { + "kind": "Content", + "text": "boolean" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "enabled", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!TraceConfig#provider:member", + "docComment": "/**\n * Trace Provider\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "provider?: " + }, + { + "kind": "Reference", + "text": "TraceProvider", + "canonicalReference": "@openfunction/functions-framework!TraceProvider:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "provider", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!TraceConfig#tags:member", + "docComment": "/**\n * Trace tags\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "tags?: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "tags", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 3 + } + } + ], + "extendsTokenRanges": [] + }, + { + "kind": "Interface", + "canonicalReference": "@openfunction/functions-framework!TraceProvider:interface", + "docComment": "/**\n * The trace provider info.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export interface TraceProvider " + } + ], + "releaseTag": "Public", + "name": "TraceProvider", + "preserveMemberOrder": false, + "members": [ + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!TraceProvider#name:member", + "docComment": "/**\n * Provider name Now is just support skywalking\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "name: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "name", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!TraceProvider#oapServer:member", + "docComment": "/**\n * OapServer address example [skywalking-oap:11800]\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "oapServer: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "oapServer", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ], + "extendsTokenRanges": [] } ] } diff --git a/docs/generated/api.md b/docs/generated/api.md index 864c4d34..388c83ef 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -139,6 +139,7 @@ export interface OpenFunctionContext { postPlugins?: string[]; prePlugins?: string[]; runtime: `${RuntimeType}` | `${Capitalize}` | `${Uppercase}`; + tracing?: TraceConfig; version: string; } @@ -188,6 +189,20 @@ export enum RuntimeType { Knative = "knative" } +// @public +export interface TraceConfig { + baggage?: Record; + enabled: boolean; + provider?: TraceProvider; + tags?: Record; +} + +// @public +export interface TraceProvider { + name: string; + oapServer: string; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/output-file.txt b/output-file.txt new file mode 100644 index 00000000..cda8cde4 --- /dev/null +++ b/output-file.txt @@ -0,0 +1 @@ +{"some":"payload"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 189f73a2..dfecfbba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,9 +18,11 @@ "http-terminator": "^3.2.0", "lodash": "^4.17.21", "minimist": "^1.2.6", + "node-fetch": "2.6.5", "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", - "semver": "^7.3.7" + "semver": "^7.3.7", + "skywalking-backend-js": "^0.5.1" }, "bin": { "functions-framework": "build/src/main.js", @@ -93,6 +95,24 @@ "node": ">=6.9.0" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@dapr/dapr": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.1.tgz", @@ -108,6 +128,25 @@ "uuid": "^8.3.2" } }, + "node_modules/@dapr/dapr/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -1214,6 +1253,11 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1231,15 +1275,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.7" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1728,6 +1763,15 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1741,6 +1785,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colors": { "version": "1.2.5", "resolved": "https://registry.npmmirror.com/colors/-/colors-1.2.5.tgz", @@ -1750,6 +1803,15 @@ "node": ">=0.1.90" } }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2301,6 +2363,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -3132,6 +3199,11 @@ "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==", "dev": true }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -3241,6 +3313,11 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.9.tgz", @@ -3820,6 +3897,17 @@ "node": ">=10.17.0" } }, + "node_modules/husky": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/hyperid": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/hyperid/-/hyperid-3.0.1.tgz", @@ -4321,7 +4409,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -4529,6 +4616,11 @@ "node": ">=0.10.0" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "node_modules/latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -4690,6 +4782,18 @@ "node": ">=8" } }, + "node_modules/logform": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/logform/-/logform-2.4.2.tgz", + "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", + "dependencies": { + "@colors/colors": "1.5.0", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", @@ -5275,22 +5379,14 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } } }, "node_modules/normalize-package-data": { @@ -5428,6 +5524,14 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -6066,7 +6170,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6329,6 +6432,14 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -6506,6 +6617,19 @@ "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", "dev": true }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/sinon": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", @@ -6554,6 +6678,26 @@ "node": ">=8" } }, + "node_modules/skywalking-backend-js": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/skywalking-backend-js/-/skywalking-backend-js-0.5.1.tgz", + "integrity": "sha512-gu56s9n+581pt1Aw/N3zf6pe/ulLq6FVXfRzqSRiAc6W8w0kaKZBl72S/Epz6cgD1/LmMS151Za09sfVzBBjsA==", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.6.7", + "google-protobuf": "^3.14.0", + "husky": "^7.0.4", + "semver": "^7.3.2", + "tslib": "^2.0.3", + "uuid": "^8.1.0", + "winston": "^3.2.1" + } + }, + "node_modules/skywalking-backend-js/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6672,6 +6816,14 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -6684,7 +6836,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -6693,7 +6844,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -6917,6 +7067,11 @@ "node": ">= 8" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6999,6 +7154,11 @@ "node": ">=8" } }, + "node_modules/triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "node_modules/trouter": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/trouter/-/trouter-3.2.0.tgz", @@ -7294,8 +7454,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -7370,6 +7529,15 @@ "node": ">=10.0.0" } }, + "node_modules/wait-on/node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, "node_modules/wait-on/node_modules/rxjs": { "version": "7.5.5", "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", @@ -7460,6 +7628,39 @@ "node": ">=8" } }, + "node_modules/winston": { + "version": "3.8.1", + "resolved": "https://registry.npmmirror.com/winston/-/winston-3.8.1.tgz", + "integrity": "sha512-r+6YAiCR4uI3N8eQNOg8k3P3PqwAm20cLKlzVD9E66Ch39+LZC+VH1UKf9JemQj2B3QoUHfKD7Poewn0Pr3Y1w==", + "dependencies": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7700,6 +7901,21 @@ "js-tokens": "^4.0.0" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "@dapr/dapr": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.1.tgz", @@ -7713,6 +7929,16 @@ "node-fetch": "^2.6.1", "restana": "^4.9.1", "uuid": "^8.3.2" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + } } }, "@eslint/eslintrc": { @@ -8643,6 +8869,11 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -8654,15 +8885,6 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, - "axios": { - "version": "0.25.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.7" - } - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -9044,6 +9266,15 @@ } } }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -9057,12 +9288,30 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "colors": { "version": "1.2.5", "resolved": "https://registry.npmmirror.com/colors/-/colors-1.2.5.tgz", "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true }, + "colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -9490,6 +9739,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -10117,6 +10371,11 @@ "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==", "dev": true }, + "fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -10204,6 +10463,11 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.9.tgz", @@ -10619,6 +10883,11 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "husky": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==" + }, "hyperid": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/hyperid/-/hyperid-3.0.1.tgz", @@ -10968,8 +11237,7 @@ "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 + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { "version": "1.0.7", @@ -11132,6 +11400,11 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -11259,6 +11532,18 @@ } } }, + "logform": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/logform/-/logform-2.4.2.tgz", + "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", + "requires": { + "@colors/colors": "1.5.0", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", @@ -11691,9 +11976,9 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", "requires": { "whatwg-url": "^5.0.0" } @@ -11802,6 +12087,14 @@ "wrappy": "1" } }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -12276,7 +12569,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12460,6 +12752,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12610,6 +12907,21 @@ "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", "dev": true }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, "sinon": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", @@ -12650,6 +12962,27 @@ } } }, + "skywalking-backend-js": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/skywalking-backend-js/-/skywalking-backend-js-0.5.1.tgz", + "integrity": "sha512-gu56s9n+581pt1Aw/N3zf6pe/ulLq6FVXfRzqSRiAc6W8w0kaKZBl72S/Epz6cgD1/LmMS151Za09sfVzBBjsA==", + "requires": { + "@grpc/grpc-js": "^1.6.7", + "google-protobuf": "^3.14.0", + "husky": "^7.0.4", + "semver": "^7.3.2", + "tslib": "^2.0.3", + "uuid": "^8.1.0", + "winston": "^3.2.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -12749,6 +13082,11 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -12758,7 +13096,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" }, @@ -12766,8 +13103,7 @@ "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==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -12931,6 +13267,11 @@ "yallist": "^4.0.0" } }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -12995,6 +13336,11 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "trouter": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/trouter/-/trouter-3.2.0.tgz", @@ -13218,8 +13564,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -13276,6 +13621,15 @@ "rxjs": "^7.5.4" }, "dependencies": { + "axios": { + "version": "0.25.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.7" + } + }, "rxjs": { "version": "7.5.5", "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", @@ -13350,6 +13704,33 @@ "string-width": "^4.0.0" } }, + "winston": { + "version": "3.8.1", + "resolved": "https://registry.npmmirror.com/winston/-/winston-3.8.1.tgz", + "integrity": "sha512-r+6YAiCR4uI3N8eQNOg8k3P3PqwAm20cLKlzVD9E66Ch39+LZC+VH1UKf9JemQj2B3QoUHfKD7Poewn0Pr3Y1w==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + } + }, + "winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "requires": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index 92dd34a0..aac9c8c7 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,11 @@ "http-terminator": "^3.2.0", "lodash": "^4.17.21", "minimist": "^1.2.6", + "node-fetch": "2.6.5", "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", - "semver": "^7.3.7" + "semver": "^7.3.7", + "skywalking-backend-js": "^0.5.1" }, "scripts": { "test": "cross-env DEBUG=common:*,ofn:* mocha build/test -t 60000 --recursive --exit", diff --git a/src/loader.ts b/src/loader.ts index c77f687d..56a74766 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -31,6 +31,12 @@ import {Plugin, PluginStore, PluginMap} from './openfunction/plugin'; import {HandlerFunction} from './functions'; import {getRegisteredFunction} from './function_registry'; import {SignatureType} from './types'; +import {FrameworkOptions} from './options'; +import {OpenFunctionContext} from './openfunction/context'; +import { + SKYWALKINGNAME, + SkyWalkingPlugin, +} from './openfunction/plugin/skywalking/skywalking'; // Dynamic import function required to load user code packaged as an // ES module is only available on Node.js v13.2.0 and up. @@ -272,3 +278,47 @@ function getPluginsModulePath(codeLocation: string): string[] | null { return null; } } + +/** + * It loads BUIDIN type plugins from the /openfunction/plugin. + * @param context - The context of OpenFunction. + */ +export async function loadBuidInPlugins(options: FrameworkOptions) { + if (!options.context) { + console.warn("The context is undefined can't load BUIDIN type plugins"); + return; + } + const store = PluginStore.Instance(PluginStore.Type.BUILTIN); + //Provide system info for BUILDIN type plugins + + if (checkTraceConfig(options.context)) { + const skywalking = new SkyWalkingPlugin(options); + store.register(skywalking); + options.context.prePlugins?.push(SKYWALKINGNAME); + options.context.postPlugins?.push(SKYWALKINGNAME); + } +} + +/** + * It check trace config ,it will set default value if it is enbaled. + * @param tracing - The config of TraceConfig. + */ +function checkTraceConfig(context: OpenFunctionContext): boolean { + if (!context.tracing) { + console.warn('TraceConfig is invalid'); + return false; + } + if (!context.tracing.enabled) { + return false; + } + if (!context.tracing.tags) { + context.tracing.tags = {}; + } + //Set default trace provider config + context.tracing.provider = { + name: context.tracing.provider?.name || SKYWALKINGNAME, + oapServer: context.tracing.provider?.oapServer || '127.0.0.1:11800', + }; + + return true; +} diff --git a/src/main.ts b/src/main.ts index 0833bdf9..391848da 100644 --- a/src/main.ts +++ b/src/main.ts @@ -23,7 +23,7 @@ import {createHttpTerminator} from 'http-terminator'; import getAysncServer from './openfunction/async_server'; import {OpenFunctionContext, ContextUtils} from './openfunction/context'; -import {getUserFunction, getFunctionPlugins} from './loader'; +import {getUserFunction, getFunctionPlugins, loadBuidInPlugins} from './loader'; import {ErrorHandler} from './invoker'; import {getServer} from './server'; import {parseOptions, helpText, OptionsError} from './options'; @@ -54,6 +54,8 @@ export const main = async () => { } const {userFunction, signatureType} = loadedFunction; + // First load BUIDIN type plugin + await loadBuidInPlugins(options); // Load function plugins before starting server await getFunctionPlugins(options.sourceLocation); diff --git a/src/openfunction/context.ts b/src/openfunction/context.ts index f2ac10ba..a0689c40 100644 --- a/src/openfunction/context.ts +++ b/src/openfunction/context.ts @@ -38,6 +38,10 @@ export interface OpenFunctionContext { * Optional plugins to be executed after user function. */ postPlugins?: string[]; + /** + * Optional trace config + */ + tracing?: TraceConfig; } /** @@ -147,3 +151,43 @@ export class ContextUtils { return component?.componentType.split('.')[0] === ComponentType.PubSub; } } + +/** + * The config of the trace. + * @public + */ +export interface TraceConfig { + /** + * This is trace switch + */ + enabled: boolean; + /** + * Trace Provider + */ + provider?: TraceProvider; + /** + * Trace tags + */ + tags?: Record; + /** + * Trace baggage + */ + baggage?: Record; +} + +/** + * The trace provider info. + * @public + */ +export interface TraceProvider { + /** + * Provider name + * Now is just support skywalking + */ + name: string; + /** + * OapServer address + * example [skywalking-oap:11800] + */ + oapServer: string; +} diff --git a/src/openfunction/plugin/skywalking/skywalking.ts b/src/openfunction/plugin/skywalking/skywalking.ts new file mode 100644 index 00000000..33bed7ce --- /dev/null +++ b/src/openfunction/plugin/skywalking/skywalking.ts @@ -0,0 +1,114 @@ +import {forEach} from 'lodash'; +import agent, {ContextManager} from 'skywalking-backend-js'; +import SpanContext from 'skywalking-backend-js/lib/trace/context/SpanContext'; +import {SpanLayer} from 'skywalking-backend-js/lib/proto/language-agent/Tracing_pb'; +import {Component} from 'skywalking-backend-js/lib/trace/Component'; +import {Tag} from 'skywalking-backend-js/lib/Tag'; +import Span from 'skywalking-backend-js/lib/trace/span/Span'; +import Context from 'skywalking-backend-js/lib/trace/context/Context'; + +import {Plugin} from '../../plugin'; +import {OpenFunctionRuntime} from '../../runtime'; +import {TraceConfig} from '../../context'; +import {FrameworkOptions} from '../../../options'; + +// https://github.com/apache/skywalking/blob/master/oap-server/server-starter/src/main/resources/component-libraries.yml#L515 +const componentIDOpenFunction = new Component(5013); + +export const SKYWALKINGNAME = 'skywalking'; + +class Trace { + private span: Span; + private spanContext: Context; + + constructor(functionName: string) { + this.spanContext = ContextManager.hasContext + ? ContextManager.current + : new SpanContext(); + + this.span = this.spanContext.newEntrySpan(`/${functionName}`, undefined); + } + + async start(tags: Array): Promise { + forEach(tags, tag => { + this.span.tag(tag); + }); + this.span.layer = SpanLayer.FAAS; + this.span.component = componentIDOpenFunction; + this.span.start(); + this.span.async(); + return this.spanContext.traceId(); + } + + async stop() { + this.span.stop(); + this.spanContext.stop(this.span); + await agent.flush(); + } +} + +/** + * Defining an class to provide trace ability alugin by skywalking . + * @public + **/ +export class SkyWalkingPlugin extends Plugin { + private trace: Trace | undefined; + private tags: Array = []; + private functionName = 'function'; + + constructor(options: FrameworkOptions) { + super(SKYWALKINGNAME, 'v1'); + + this.functionName = options.target; + + // Start skywalking agent + agent.start({ + serviceName: this.functionName, + serviceInstance: 'openfunctionInstance', + collectorAddress: options.context!.tracing!.provider!.oapServer, + }); + + if (!options.context!.tracing!.tags) { + options.context!.tracing!.tags = {}; + } + options.context!.tracing!.tags!['RuntimeType'] = + options.context?.runtime || 'Knative'; + this.iniAttribute(options.context!.tracing!); + } + + iniAttribute(traceConfig: TraceConfig) { + for (const key in traceConfig.tags) { + this.tags.push({ + key, + val: traceConfig.tags[key], + overridable: false, + }); + } + } + + async execPreHook( + ctx: OpenFunctionRuntime | null, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + plugins: Record + ) { + if (ctx === null) { + console.warn('OpenFunctionRuntime [ctx] is null'); + return; + } + this.trace = new Trace(this.functionName); + const traceId = await this.trace.start(this.tags); + ctx.locals.traceId = traceId; + } + + async execPostHook( + ctx: OpenFunctionRuntime | null, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + plugins: Record + ) { + if (ctx === null) { + console.warn('OpenFunctionRuntime [ctx] is null'); + return; + } + await this.trace?.stop(); + } +} diff --git a/src/openfunction/runtime.ts b/src/openfunction/runtime.ts index ab758e4d..85b3f887 100644 --- a/src/openfunction/runtime.ts +++ b/src/openfunction/runtime.ts @@ -115,8 +115,8 @@ export abstract class OpenFunctionRuntime { await userFunction(ctx, data); // Execute pre hooks, system plugins go last - await userPlugins.execPostHooks(ctx); await sysPlugins.execPostHooks(ctx); + await userPlugins.execPostHooks(ctx); }; } diff --git a/test/data/plugins/counters.mjs b/test/data/plugins/counters.mjs index 5ba83214..1bb8b445 100644 --- a/test/data/plugins/counters.mjs +++ b/test/data/plugins/counters.mjs @@ -49,7 +49,10 @@ export class Countdown extends Plugin { this.countdown(ctx, plugins); // Try to end the test if necessary - if (this.current === this.end) ctx.locals.done?.(); + if (this.current === this.end) { + ctx.locals.app.stop(); + ctx.locals.done?.(); + } } countdown(ctx, plugins) { diff --git a/test/data/plugins/skywalking_assist.mjs b/test/data/plugins/skywalking_assist.mjs new file mode 100644 index 00000000..15924f9e --- /dev/null +++ b/test/data/plugins/skywalking_assist.mjs @@ -0,0 +1,35 @@ +import assert from 'assert'; +import {Plugin} from '../../../build/src/index.js'; +import {query,OapServer,sleep} from '../../../build/test/integration/build_in_plugin.js' +//Help to verify skywalking plugin +export class Assist extends Plugin { + constructor() { + super('assist', 'v1'); + } + + async execPreHook(ctx, plugins) { + } + + async execPostHook(ctx, plugins) { + const traceId = ctx.locals.traceId; + const options = ctx.locals.options; + sleep(3000).then(()=>{ + query(traceId,OapServer).then(res=>{ + res.json().then(res=>{ + if(res.data.trace.spans.length >=0){ + let target = null; + for (const item of res.data.trace.spans) { + if (item.endpointName === `/${options.target}`) { + target = item; + } + } + assert(target !== null); + assert(target.endpointName === `/${options.target}`); + + ctx.locals.done?.(); + } + }) + }) + }) + } + } \ No newline at end of file diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index 8009a44e..c70491d7 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -157,6 +157,7 @@ describe('OpenFunction - Async', () => { // Passthrough test done handler ctx.locals.done = done; + ctx.locals.app = app; }, { ...TEST_CONTEXT, diff --git a/test/integration/build_in_plugin.ts b/test/integration/build_in_plugin.ts new file mode 100644 index 00000000..42a1dfb7 --- /dev/null +++ b/test/integration/build_in_plugin.ts @@ -0,0 +1,232 @@ +import {ifError, notStrictEqual, deepStrictEqual, ok} from 'assert'; +import {createServer} from 'net'; +import {execSync} from 'child_process'; + +import {get} from 'lodash'; +import * as shell from 'shelljs'; +import * as MQTT from 'aedes'; +import fetch from 'node-fetch'; + +import {FrameworkOptions} from '../../src/options'; +import {SKYWALKINGNAME} from '../../src/openfunction/plugin/skywalking/skywalking'; +import {PluginStore} from '../../src/openfunction/plugin'; +import {OpenFunctionRuntime} from '../../src/openfunction/runtime'; +import {OpenFunctionContext} from '../../src/openfunction/context'; +import getAysncServer from '../../src/openfunction/async_server'; +import {getFunctionPlugins, loadBuidInPlugins} from '../../src/loader'; + +import {Context} from '../data/mock'; + +const TEST_CONTEXT = Context.AsyncBase; + +export const OapServer = '127.0.0.1:12800'; + +export const sleep = (val: number) => { + return new Promise(resolve => setTimeout(resolve, val)); +}; + +export const query = async (traceId: string, url: string) => { + const body = { + query: `query queryTrace($traceId: ID!) { + trace: queryTrace(traceId: $traceId) { + spans { + traceId + segmentId + spanId + parentSpanId + refs { + traceId + parentSegmentId + parentSpanId + type + } + serviceCode + startTime + endTime + endpointName + type + peer + component + isError + layer + tags { + key + value + } + logs { + time + data { + key + value + } + } + } + } + }`, + variables: { + traceId, + }, + }; + return await fetch(`http://${url}/graphql`, { + method: 'POST', + body: JSON.stringify(body), + }); +}; + +//Verify skywalking proccess , start it if not exist +export const checkSkyWalkingProcess = async ( + reCheck: boolean +): Promise => { + try { + const buffer = execSync('docker ps -a').toString(); + + let flag = false; + for (const line of buffer.split('\n')) { + if (line.indexOf('apache/skywalking-oap-server:8.4.0-es6') !== -1) { + if (line.indexOf('Up') !== -1) { + console.log('skywalking oap server is start'); + flag = true; + } else if (line.indexOf('Exited') !== -1) { + console.log('skywalking oap server is stop , now start it '); + console.log( + execSync('docker start ' + line.substring(0, 13)).toString() + ); + flag = true; + } + break; + } + } + if (!flag) { + const startCmd = + 'docker run -d --name oap -p 12800:12800 -p 11800:11800 apache/skywalking-oap-server:8.4.0-es6'; + execSync(startCmd); + console.log(startCmd); + return reCheck ? false : checkSkyWalkingProcess(true); + } + } catch (error) { + console.log('start fail'); + return false; + } + return true; +}; +describe('Build in plugin', () => { + const APPID = 'async.dapr'; + const broker = MQTT.Server(); + const server = createServer(broker.handle); + before(done => { + // Start simple plain MQTT server via aedes + server.listen(1883, () => { + // Try to run Dapr sidecar and listen for the async server + shell.exec( + `dapr run -H 3500 -G 50001 -p ${TEST_CONTEXT.port} -d ./test/data/components/async -a ${APPID} --log-level debug`, + { + silent: true, + async: true, + } + ); + done(); + }); + }); + + after(done => { + // Stop dapr sidecar process + shell.exec(`dapr stop ${APPID}`, { + silent: true, + }); + server.close(); + broker.close(done); + }); + + it('mqtt binding w/ skywalking plugin', done => { + const options: FrameworkOptions = { + target: 'test', + port: '', + sourceLocation: '', + signatureType: 'http', + printHelp: false, + context: { + ...TEST_CONTEXT, + tracing: { + enabled: true, + }, + prePlugins: ['assist'], + postPlugins: ['assist'], + }, + }; + getFunctionPlugins(process.cwd() + '/test/data').then(plugins => { + loadBuidInPlugins(options).then(() => { + const start = get(plugins!.numbers, 'oct'); + + const app = getAysncServer((ctx, data) => { + notStrictEqual(ctx.locals.traceId, null || undefined); + // Passthrough test done handler + ctx.locals.done = done; + ctx.locals.app = app; + ctx.locals.options = options; + ctx.send({some: 'payload'}); + }, options.context!); + + // First, we start the async server + app.start().then(() => { + // Then, we send a number as start value to user function + broker.publish( + { + cmd: 'publish', + topic: 'default', + payload: JSON.stringify({start}), + qos: 0, + retain: false, + dup: false, + }, + err => ifError(err) + ); + }); + }); + }); + }); + + it('skywalking plugin', async () => { + const options = { + target: 'test', + context: { + ...TEST_CONTEXT, + tracing: { + enabled: true, + }, + }, + }; + ok((await checkSkyWalkingProcess(false)) === true); + await loadBuidInPlugins(options as FrameworkOptions); + const skywalking = PluginStore.Instance(1).get(SKYWALKINGNAME); + ok(skywalking.name === SKYWALKINGNAME); + + const runtime = OpenFunctionRuntime.ProxyContext( + options.context as OpenFunctionContext + ); + await skywalking.execPreHook(runtime, {}); + const traceId = runtime.locals.traceId; + await sleep(2000); + await skywalking.execPostHook(runtime, {}); + console.log(traceId); + const response = query(traceId, OapServer); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const data = (await (await response).json()) as any; + console.log(data); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let target: unknown | any = null; + for (const item of data.data.trace.spans) { + console.log(item.serviceCode); + if (item.endpointName === `/${options.target}`) { + target = item; + } + } + notStrictEqual(target, null); + deepStrictEqual(target.endpointName, `/${options.target}`); + + for (const tag in target.tags) { + if (tag === 'RuntimeType') { + ok(target.tags[tag] === options.context.runtime); + } + } + }); +}); From f43cfa3a0952fb38b381417cf56afa5718665098 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 03:33:55 +0000 Subject: [PATCH 078/131] chore(deps): bump actions/stale from 5.1.1 to 5.2.0 Bumps [actions/stale](https://github.com/actions/stale) from 5.1.1 to 5.2.0. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v5.1.1...v5.2.0) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 837b2df1..f9004967 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Prune Stale - uses: actions/stale@v5.1.1 + uses: actions/stale@v5.2.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-issue-stale: 60 From 875236743d24394445fce77e31fc735a5769e0ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Sep 2022 04:02:26 +0000 Subject: [PATCH 079/131] chore(deps): bump actions/stale from 5.2.0 to 6.0.0 Bumps [actions/stale](https://github.com/actions/stale) from 5.2.0 to 6.0.0. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v5.2.0...v6.0.0) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index f9004967..71665d55 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Prune Stale - uses: actions/stale@v5.2.0 + uses: actions/stale@v6.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-issue-stale: 60 From d525d2f09729ade2c079f4909fa348b5f66a0800 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 8 Oct 2022 17:11:54 +0800 Subject: [PATCH 080/131] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(plugin/tr?= =?UTF-8?q?acing):=20reconstruct=20skywalking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/generated/api.json | 339 ++- docs/generated/api.md | 26 +- output-file.txt | 1 - package-lock.json | 2221 ++++------------- package.json | 28 +- src/loader.ts | 76 +- src/main.ts | 11 +- src/openfunction/context.ts | 61 +- src/openfunction/plugin.ts | 44 +- .../plugin/skywalking/skywalking.ts | 114 - src/openfunction/plugins/index.ts | 3 + src/openfunction/plugins/tracing/index.ts | 77 + .../plugins/tracing/skywalking.ts | 114 + src/openfunction/runtime.ts | 22 +- test/data/mock/context.ts | 21 +- test/data/plugins/skywalking.mjs | 56 + test/data/plugins/skywalking_assist.mjs | 35 - test/integration/build_in_plugin.ts | 232 -- test/integration/http_binding.ts | 69 +- 19 files changed, 1157 insertions(+), 2393 deletions(-) delete mode 100644 output-file.txt delete mode 100644 src/openfunction/plugin/skywalking/skywalking.ts create mode 100644 src/openfunction/plugins/index.ts create mode 100644 src/openfunction/plugins/tracing/index.ts create mode 100644 src/openfunction/plugins/tracing/skywalking.ts create mode 100644 test/data/plugins/skywalking.mjs delete mode 100644 test/data/plugins/skywalking_assist.mjs delete mode 100644 test/integration/build_in_plugin.ts diff --git a/docs/generated/api.json b/docs/generated/api.json index b83f66fd..9b12d3f4 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,7 +1,7 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.29.3", + "toolVersion": "7.32.0", "schemaVersion": 1009, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { @@ -1191,7 +1191,7 @@ { "kind": "Reference", "text": "Request", - "canonicalReference": "@openfunction/functions-framework!Request:interface" + "canonicalReference": "@openfunction/functions-framework!Request_2:interface" }, { "kind": "Content", @@ -1200,7 +1200,7 @@ { "kind": "Reference", "text": "Response", - "canonicalReference": "@types/express!~e.Response:interface" + "canonicalReference": "@types/express!e.Response:interface" }, { "kind": "Content", @@ -1561,68 +1561,6 @@ "endIndex": 4 } }, - { - "kind": "Interface", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:interface", - "docComment": "/**\n * The binding interface of the context.\n *\n * @public\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "export interface OpenFunctionBinding " - } - ], - "releaseTag": "Public", - "name": "OpenFunctionBinding", - "preserveMemberOrder": false, - "members": [ - { - "kind": "IndexSignature", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:index(1)", - "docComment": "/**\n * The hash map of the binding.\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "[key: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": "]: " - }, - { - "kind": "Reference", - "text": "OpenFunctionComponent", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "returnTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "key", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - } - ] - } - ], - "extendsTokenRanges": [] - }, { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent:interface", @@ -1814,8 +1752,21 @@ }, { "kind": "Reference", - "text": "OpenFunctionBinding", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:interface" + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" }, { "kind": "Content", @@ -1828,7 +1779,7 @@ "name": "inputs", "propertyTypeTokenRange": { "startIndex": 1, - "endIndex": 2 + "endIndex": 5 } }, { @@ -1869,8 +1820,21 @@ }, { "kind": "Reference", - "text": "OpenFunctionBinding", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionBinding:interface" + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" }, { "kind": "Content", @@ -1881,6 +1845,34 @@ "isOptional": true, "releaseTag": "Public", "name": "outputs", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#pluginsTracing:member", + "docComment": "/**\n * Optional trace plugin config.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "pluginsTracing?: " + }, + { + "kind": "Reference", + "text": "TraceConfig", + "canonicalReference": "@openfunction/functions-framework!TraceConfig:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "pluginsTracing", "propertyTypeTokenRange": { "startIndex": 1, "endIndex": 2 @@ -2039,34 +2031,6 @@ "endIndex": 12 } }, - { - "kind": "PropertySignature", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#tracing:member", - "docComment": "/**\n * Optional trace config\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "tracing?: " - }, - { - "kind": "Reference", - "text": "TraceConfig", - "canonicalReference": "@openfunction/functions-framework!TraceConfig:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": true, - "releaseTag": "Public", - "name": "tracing", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#version:member", @@ -2174,6 +2138,36 @@ "isStatic": false, "isProtected": true }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#error:member", + "docComment": "/**\n * The optional error object to hold exception data.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "error?: " + }, + { + "kind": "Reference", + "text": "Error", + "canonicalReference": "!Error:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "error", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false + }, { "kind": "Method", "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#getPlugin:member(1)", @@ -2194,7 +2188,7 @@ { "kind": "Reference", "text": "Plugin", - "canonicalReference": "@openfunction/functions-framework!Plugin:class" + "canonicalReference": "@openfunction/functions-framework!Plugin_2:class" }, { "kind": "Content", @@ -2366,7 +2360,7 @@ { "kind": "Reference", "text": "Request", - "canonicalReference": "@types/express!~e.Request:interface" + "canonicalReference": "@types/express!e.Request:interface" }, { "kind": "Content", @@ -2384,7 +2378,7 @@ { "kind": "Reference", "text": "ParsedQs", - "canonicalReference": "@types/qs!~QueryString.ParsedQs:interface" + "canonicalReference": "@types/qs!QueryString.ParsedQs:interface" }, { "kind": "Content", @@ -2427,7 +2421,7 @@ { "kind": "Reference", "text": "Response", - "canonicalReference": "@types/express!~e.Response:interface" + "canonicalReference": "@types/express!e.Response:interface" }, { "kind": "Content", @@ -2538,7 +2532,7 @@ { "kind": "Reference", "text": "Request", - "canonicalReference": "@types/express!~e.Request:interface" + "canonicalReference": "@types/express!e.Request:interface" }, { "kind": "Content", @@ -2547,7 +2541,7 @@ { "kind": "Reference", "text": "Response", - "canonicalReference": "@types/express!~e.Response:interface" + "canonicalReference": "@types/express!e.Response:interface" }, { "kind": "Content", @@ -2632,7 +2626,7 @@ { "kind": "Reference", "text": "OpenFunctionTrigger", - "canonicalReference": "@openfunction/functions-framework!OpenFunctionTrigger:type" + "canonicalReference": "@openfunction/functions-framework!~OpenFunctionTrigger:type" }, { "kind": "Content", @@ -2832,7 +2826,7 @@ { "kind": "Reference", "text": "Plugin", - "canonicalReference": "@openfunction/functions-framework!Plugin:class" + "canonicalReference": "@openfunction/functions-framework!Plugin_2:class" }, { "kind": "Content", @@ -2919,7 +2913,7 @@ { "kind": "Reference", "text": "Plugin", - "canonicalReference": "@openfunction/functions-framework!Plugin:class" + "canonicalReference": "@openfunction/functions-framework!Plugin_2:class" }, { "kind": "Content", @@ -3092,7 +3086,7 @@ { "kind": "Reference", "text": "ExpressRequest", - "canonicalReference": "@types/express!~e.Request:interface" + "canonicalReference": "@types/express!e.Request:interface" }, { "kind": "Content", @@ -3200,7 +3194,7 @@ { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!TraceConfig:interface", - "docComment": "/**\n * The config of the trace.\n *\n * @public\n */\n", + "docComment": "/**\n * The config of the trace plugin.\n *\n * @public\n */\n", "excerptTokens": [ { "kind": "Content", @@ -3214,7 +3208,7 @@ { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!TraceConfig#baggage:member", - "docComment": "/**\n * Trace baggage\n */\n", + "docComment": "/**\n * Optional baggage of the tracer\n */\n", "excerptTokens": [ { "kind": "Content", @@ -3246,7 +3240,7 @@ { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!TraceConfig#enabled:member", - "docComment": "/**\n * This is trace switch\n */\n", + "docComment": "/**\n * Switch of the tracer\n */\n", "excerptTokens": [ { "kind": "Content", @@ -3273,11 +3267,11 @@ { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!TraceConfig#provider:member", - "docComment": "/**\n * Trace Provider\n */\n", + "docComment": "/**\n * Provider of the tracer\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "provider?: " + "text": "provider: " }, { "kind": "Reference", @@ -3290,7 +3284,7 @@ } ], "isReadonly": false, - "isOptional": true, + "isOptional": false, "releaseTag": "Public", "name": "provider", "propertyTypeTokenRange": { @@ -3301,7 +3295,7 @@ { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!TraceConfig#tags:member", - "docComment": "/**\n * Trace tags\n */\n", + "docComment": "/**\n * Optional tags of the tracer\n */\n", "excerptTokens": [ { "kind": "Content", @@ -3314,7 +3308,7 @@ }, { "kind": "Content", - "text": "" + "text": " & {\n func?: string;\n }" }, { "kind": "Content", @@ -3336,7 +3330,7 @@ { "kind": "Interface", "canonicalReference": "@openfunction/functions-framework!TraceProvider:interface", - "docComment": "/**\n * The trace provider info.\n *\n * @public\n */\n", + "docComment": "/**\n * The trace provider object.\n *\n * @public\n */\n", "excerptTokens": [ { "kind": "Content", @@ -3350,7 +3344,7 @@ { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!TraceProvider#name:member", - "docComment": "/**\n * Provider name Now is just support skywalking\n */\n", + "docComment": "/**\n * The name of the provider.\n */\n", "excerptTokens": [ { "kind": "Content", @@ -3358,7 +3352,52 @@ }, { "kind": "Content", - "text": "string" + "text": "`${" + }, + { + "kind": "Reference", + "text": "TraceProviderType", + "canonicalReference": "@openfunction/functions-framework!TraceProviderType:enum" + }, + { + "kind": "Content", + "text": "}` | `${" + }, + { + "kind": "Reference", + "text": "Capitalize", + "canonicalReference": "!Capitalize:type" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "TraceProviderType", + "canonicalReference": "@openfunction/functions-framework!TraceProviderType:enum" + }, + { + "kind": "Content", + "text": ">}` | `${" + }, + { + "kind": "Reference", + "text": "Uppercase", + "canonicalReference": "!Uppercase:type" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "TraceProviderType", + "canonicalReference": "@openfunction/functions-framework!TraceProviderType:enum" + }, + { + "kind": "Content", + "text": ">}`" }, { "kind": "Content", @@ -3371,13 +3410,13 @@ "name": "name", "propertyTypeTokenRange": { "startIndex": 1, - "endIndex": 2 + "endIndex": 12 } }, { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!TraceProvider#oapServer:member", - "docComment": "/**\n * OapServer address example [skywalking-oap:11800]\n */\n", + "docComment": "/**\n * The address of the OAP server.\n */\n", "excerptTokens": [ { "kind": "Content", @@ -3403,6 +3442,64 @@ } ], "extendsTokenRanges": [] + }, + { + "kind": "Enum", + "canonicalReference": "@openfunction/functions-framework!TraceProviderType:enum", + "docComment": "/**\n * Defining trace provider type enumeration.\n *\n * @public\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare enum TraceProviderType " + } + ], + "releaseTag": "Public", + "name": "TraceProviderType", + "preserveMemberOrder": false, + "members": [ + { + "kind": "EnumMember", + "canonicalReference": "@openfunction/functions-framework!TraceProviderType.OpenTelemetry:member", + "docComment": "/**\n * The OpenTelemetry type.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "OpenTelemetry = " + }, + { + "kind": "Content", + "text": "\"opentelemetry\"" + } + ], + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "name": "OpenTelemetry" + }, + { + "kind": "EnumMember", + "canonicalReference": "@openfunction/functions-framework!TraceProviderType.SkyWalking:member", + "docComment": "/**\n * The SkyWalking type.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "SkyWalking = " + }, + { + "kind": "Content", + "text": "\"skywalking\"" + } + ], + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "name": "SkyWalking" + } + ] } ] } diff --git a/docs/generated/api.md b/docs/generated/api.md index 388c83ef..e99f057e 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -116,11 +116,6 @@ export interface OpenFunction { // @public export const openfunction: (functionName: string, handler: OpenFunction) => void; -// @public -export interface OpenFunctionBinding { - [key: string]: OpenFunctionComponent; -} - // @public export interface OpenFunctionComponent { componentName: string; @@ -132,14 +127,14 @@ export interface OpenFunctionComponent { // @public export interface OpenFunctionContext { - inputs?: OpenFunctionBinding; + inputs?: Record; name: string; - outputs?: OpenFunctionBinding; + outputs?: Record; + pluginsTracing?: TraceConfig; port?: string; postPlugins?: string[]; prePlugins?: string[]; runtime: `${RuntimeType}` | `${Capitalize}` | `${Uppercase}`; - tracing?: TraceConfig; version: string; } @@ -147,6 +142,7 @@ export interface OpenFunctionContext { export abstract class OpenFunctionRuntime { constructor(context: OpenFunctionContext); protected readonly context: OpenFunctionContext; + error?: Error; getPlugin(name: string): Plugin_2; readonly locals: Record; static Parse(context: OpenFunctionContext): OpenFunctionRuntime; @@ -193,16 +189,24 @@ export enum RuntimeType { export interface TraceConfig { baggage?: Record; enabled: boolean; - provider?: TraceProvider; - tags?: Record; + provider: TraceProvider; + tags?: Record & { + func?: string; + }; } // @public export interface TraceProvider { - name: string; + name: `${TraceProviderType}` | `${Capitalize}` | `${Uppercase}`; oapServer: string; } +// @public +export enum TraceProviderType { + OpenTelemetry = "opentelemetry", + SkyWalking = "skywalking" +} + // (No @packageDocumentation comment for this package) ``` diff --git a/output-file.txt b/output-file.txt deleted file mode 100644 index cda8cde4..00000000 --- a/output-file.txt +++ /dev/null @@ -1 +0,0 @@ -{"some":"payload"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dfecfbba..a90e9dc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@dapr/dapr": "2.3.1", - "body-parser": "^1.20.0", + "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", "express": "^4.18.1", @@ -18,10 +18,9 @@ "http-terminator": "^3.2.0", "lodash": "^4.17.21", "minimist": "^1.2.6", - "node-fetch": "2.6.5", "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", + "semver": "^7.3.8", "skywalking-backend-js": "^0.5.1" }, "bin": { @@ -29,14 +28,14 @@ "functions-framework-nodejs": "build/src/main.js" }, "devDependencies": { - "@microsoft/api-extractor": "^7.29.3", + "@microsoft/api-extractor": "^7.32.0", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", - "@types/express": "4.17.13", + "@types/express": "4.17.14", "@types/google-protobuf": "^3.15.6", - "@types/lodash": "^4.14.184", + "@types/lodash": "^4.14.186", "@types/minimist": "1.2.2", - "@types/mocha": "9.1.1", + "@types/mocha": "10.0.0", "@types/node": "14.18.11", "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", @@ -44,19 +43,20 @@ "@types/shelljs": "^0.8.11", "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", - "aedes": "^0.47.0", + "aedes": "0.47.0", "clean-pkg-json": "^1.2.0", - "concurrently": "^7.3.0", + "concurrently": "^7.4.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", - "gts": "^3.1.0", + "graphql-request": "^5.0.0", + "gts": "^3.1.1", "mocha": "10.0.0", "pack-n-play": "^1.0.0-2", - "pre-push": "^0.1.3", + "pre-push": "^0.1.4", "shelljs": "^0.8.5", - "sinon": "^14.0.0", - "supertest": "6.2.3", - "typescript": "^4.8.2", + "sinon": "^14.0.1", + "supertest": "6.3.0", + "typescript": "^4.8.4", "wait-on": "^6.0.1" }, "engines": { @@ -128,25 +128,6 @@ "uuid": "^8.3.2" } }, - "node_modules/@dapr/dapr/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -176,6 +157,15 @@ "node": ">= 4" } }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz", + "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "dev": true, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.6.7", "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", @@ -259,37 +249,37 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.29.3", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.29.3.tgz", - "integrity": "sha512-PHq+Oo8yiXhwi11VQ1Nz36s+aZwgFqjtkd41udWHtSpyMv2slJ74m1cHdpWbs2ovGUCfldayzdpGwnexZLd2bA==", + "version": "7.32.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.32.0.tgz", + "integrity": "sha512-BfvPpeVzWLFTdairVItzWQGsZr82fR4RH+8Q4I7t0f9xq66v4Qz9K+u25jbL5R42X01b/vvJMuRhX5KhU8J1Ug==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.23.1", + "@microsoft/api-extractor-model": "7.24.3", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.50.2", - "@rushstack/rig-package": "0.3.14", - "@rushstack/ts-command-line": "4.12.2", + "@rushstack/node-core-library": "3.53.0", + "@rushstack/rig-package": "0.3.16", + "@rushstack/ts-command-line": "4.12.4", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.7.4" + "typescript": "~4.8.4" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.23.1", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.23.1.tgz", - "integrity": "sha512-axlZ33H2LfYX7goAaWpzABWZl3JtX/EUkfVBsI4SuMn3AZYBJsP5MVpMCq7jt0PCefWGwwO+Rv+lCmmJIjFhlQ==", + "version": "7.24.3", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.24.3.tgz", + "integrity": "sha512-JElpLULqYDXQb0YIKKQhOJaNWBXsYeYu5J51Z4O6RGbOq7Tby9ViVfpDuXVXa87AMOSR5WKuaxG/5SnQVVNxiw==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.50.2" + "@rushstack/node-core-library": "3.53.0" } }, "node_modules/@microsoft/api-extractor/node_modules/resolve": { @@ -301,19 +291,6 @@ "path-parse": "^1.0.6" } }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "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", @@ -321,17 +298,23 @@ "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "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==", + "version": "0.16.2", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" } }, + "node_modules/@microsoft/tsdoc-config/node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", @@ -432,9 +415,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { - "version": "3.50.2", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.50.2.tgz", - "integrity": "sha512-+zpZBcaX5s+wA0avF0Lk3sd5jbGRo5SmsEJpElJbqQd3KGFvc/hcyeNSMqV5+esJ1JuTfnE1QyRt8nvxFNTaQg==", + "version": "3.53.0", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.0.tgz", + "integrity": "sha512-FXk3eDtTHKnaUq+fLyNY867ioRhMa6CJDJO5hZ3wuGlxm184nckAFiU+hx027AodjpnqjX6pYF0zZGq7k7P/vg==", "dev": true, "dependencies": { "@types/node": "12.20.24", @@ -444,7 +427,6 @@ "jju": "~1.4.0", "resolve": "~1.17.0", "semver": "~7.3.0", - "timsort": "~0.3.0", "z-schema": "~5.0.2" } }, @@ -464,9 +446,9 @@ } }, "node_modules/@rushstack/rig-package": { - "version": "0.3.14", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.14.tgz", - "integrity": "sha512-Ic9EN3kWJCK6iOxEDtwED9nrM146zCDrQaUxbeGOF+q/VLZ/HNHPw+aLqrqmTl0ZT66Sf75Qk6OG+rySjTorvQ==", + "version": "0.3.16", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.16.tgz", + "integrity": "sha512-FoSQng2RtapEUe+CBPKxbpZUhUht5s2+mMiztRH95qqp81dsUpfEWojtV6XrUVyWIRk2/cY1CDZUKJWxMrT26Q==", "dev": true, "dependencies": { "resolve": "~1.17.0", @@ -483,9 +465,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.12.2", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.2.tgz", - "integrity": "sha512-poBtnumLuWmwmhCEkVAgynWgtnF9Kygekxyp4qtQUSbBrkuyPQTL85c8Cva1YfoUpOdOXxezMAkUt0n5SNKGqw==", + "version": "4.12.4", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.4.tgz", + "integrity": "sha512-ckZHEfPiJCmBdWd/syve5zu2TNsPIqbFie3jWzM/izZa6ZOkDwex/K1ww+kJ12hFBnN44lMD7voJvKXajUCEDA==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -515,15 +497,6 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -559,18 +532,6 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmmirror.com/@types/argparse/-/argparse-1.0.38.tgz", @@ -612,9 +573,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -657,9 +618,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.184", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.184.tgz", - "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", + "version": "4.14.186", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", "dev": true }, "node_modules/@types/long": { @@ -686,9 +647,9 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", "dev": true }, "node_modules/@types/ms": { @@ -1023,7 +984,7 @@ }, "node_modules/aedes": { "version": "0.47.0", - "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.47.0.tgz", + "resolved": "https://registry.npmmirror.com/aedes/-/aedes-0.47.0.tgz", "integrity": "sha512-ERe7jMI87KlZVj+RWDEEQMTGJ10Nr68Jx5QA+/glBPmLpIoyB1sPv5xgY8FJ/zrnyj4RN04Sv9N6HsS8EmNpNg==", "dev": true, "dependencies": { @@ -1069,15 +1030,6 @@ "node": ">=14" } }, - "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, - "engines": { - "node": ">= 14" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1129,15 +1081,6 @@ "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", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1240,7 +1183,7 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, @@ -1316,9 +1259,9 @@ } }, "node_modules/body-parser": { - "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==", + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -1328,7 +1271,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -1351,126 +1294,21 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/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, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/boxen/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/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, - "dependencies": { - "has-flag": "^4.0.0" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -1524,48 +1362,6 @@ "node": ">= 0.8" } }, - "node_modules/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, - "dependencies": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/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, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1665,12 +1461,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "node_modules/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 - }, "node_modules/clean-pkg-json": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/clean-pkg-json/-/clean-pkg-json-1.2.0.tgz", @@ -1680,18 +1470,6 @@ "clean-pkg-json": "dist/index.js" } }, - "node_modules/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, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1723,15 +1501,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/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, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/cloudevents": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/cloudevents/-/cloudevents-6.0.2.tgz", @@ -1833,7 +1602,7 @@ }, "node_modules/component-emitter": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, @@ -1889,13 +1658,13 @@ } }, "node_modules/concurrently": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz", - "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==", + "version": "7.4.0", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.4.0.tgz", + "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "date-fns": "^2.16.1", + "date-fns": "^2.29.1", "lodash": "^4.17.21", "rxjs": "^7.0.0", "shell-quote": "^1.7.3", @@ -1905,6 +1674,7 @@ "yargs": "^17.3.1" }, "bin": { + "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" }, "engines": { @@ -2029,23 +1799,6 @@ "node": ">=12" } }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -2099,7 +1852,7 @@ }, "node_modules/cookiejar": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "resolved": "https://registry.npmmirror.com/cookiejar/-/cookiejar-2.1.3.tgz", "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, @@ -2127,6 +1880,15 @@ "yarn": ">=1" } }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.7" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2141,19 +1903,10 @@ "node": ">= 8" } }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "version": "2.29.2", + "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.29.2.tgz", + "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==", "dev": true, "engines": { "node": ">=0.11" @@ -2206,27 +1959,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2241,12 +1973,6 @@ "node": ">=0.10.0" } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2294,8 +2020,8 @@ }, "node_modules/dezalgo": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "resolved": "https://registry.npmmirror.com/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", "dev": true, "dependencies": { "asap": "^2.0.0", @@ -2335,24 +2061,6 @@ "node": ">=6.0.0" } }, - "node_modules/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, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2487,15 +2195,6 @@ "node": ">=6" } }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3048,6 +2747,29 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "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", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", @@ -3094,6 +2816,15 @@ "node": ">=4" } }, + "node_modules/extract-files": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/extract-files/-/extract-files-9.0.0.tgz", + "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", + "dev": true, + "engines": { + "node": "^10.17.0 || ^12.0.0 || >= 13.7.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3339,7 +3070,7 @@ }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { @@ -3353,7 +3084,7 @@ }, "node_modules/formidable": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "resolved": "https://registry.npmmirror.com/formidable/-/formidable-2.0.1.tgz", "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", "dev": true, "dependencies": { @@ -3361,21 +3092,15 @@ "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", + "resolved": "https://registry.npmmirror.com/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": { @@ -3531,21 +3256,6 @@ "node": ">= 6" } }, - "node_modules/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, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", @@ -3609,50 +3319,55 @@ "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", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/graphql": { + "version": "16.6.0", + "resolved": "https://registry.npmmirror.com/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-request": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/graphql-request/-/graphql-request-5.0.0.tgz", + "integrity": "sha512-SpVEnIo2J5k2+Zf76cUkdvIRaq5FMZvGQYnA4lUWYbc99m+fHh4CZYRRO/Ff4tCLQ613fzCm3SiDT64ubW5Gyw==", "dev": true, "dependencies": { - "@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" + "@graphql-typed-document-node/core": "^3.1.1", + "cross-fetch": "^3.1.5", + "extract-files": "^9.0.0", + "form-data": "^3.0.0" }, - "engines": { - "node": ">=8.6" + "peerDependencies": { + "graphql": "14 - 16" } }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/graphql-request/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/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 - }, "node_modules/gts": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.0.tgz", - "integrity": "sha512-Pbj3ob1VR1IRlEVEBNtKoQ1wHOa8cZz62KEojK8Fn/qeS2ClWI4gLNfhek3lD68aZSmUEg8TFb6AHXIwUMgyqQ==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/gts/-/gts-3.1.1.tgz", + "integrity": "sha512-Jw44aBbzMnd1vtZs7tZt3LMstKQukCBg7N4CKVGzviIQ45Cz5b9lxDJGXVKj/9ySuGv6TYEeijZJGbiiVcM27w==", "dev": true, "dependencies": { "@typescript-eslint/eslint-plugin": "^4.2.0", @@ -3669,7 +3384,6 @@ "ncp": "^2.0.0", "prettier": "^2.1.2", "rimraf": "^3.0.2", - "update-notifier": "^5.0.0", "write-file-atomic": "^3.0.3" }, "bin": { @@ -3813,15 +3527,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -3833,7 +3538,7 @@ }, "node_modules/hexoid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "resolved": "https://registry.npmmirror.com/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true, "engines": { @@ -3845,12 +3550,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, - "node_modules/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 - }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -4011,15 +3710,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -4213,18 +3903,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -4293,22 +3971,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -4320,18 +3982,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4355,24 +4005,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -4464,8 +4096,8 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "node_modules/is-unicode-supported": { @@ -4491,12 +4123,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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 - }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -4546,12 +4172,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/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 - }, "node_modules/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", @@ -4598,15 +4218,6 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "node_modules/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, - "dependencies": { - "json-buffer": "3.0.0" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4621,18 +4232,6 @@ "resolved": "https://registry.npmmirror.com/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, - "node_modules/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, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4799,48 +4398,15 @@ "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/map-obj": { @@ -5008,15 +4574,6 @@ "node": ">=6" } }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -5299,6 +4856,15 @@ "node": ">=10" } }, + "node_modules/mqemitter/node_modules/qlobber": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-5.0.3.tgz", + "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/mqtt-packet": { "version": "7.1.2", "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-7.1.2.tgz", @@ -5379,14 +4945,22 @@ } }, "node_modules/node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/normalize-package-data": { @@ -5417,15 +4991,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/npm-bundled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", @@ -5582,15 +5147,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", @@ -5695,30 +5251,6 @@ "rimraf": "bin.js" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5814,9 +5346,9 @@ } }, "node_modules/pre-push": { - "version": "0.1.3", - "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.3.tgz", - "integrity": "sha512-PXc3tT7jq/H2VrEooQ8F9QCVfQawmd52CzWMemUrPlFnL8avaXY22NTuej3ClISy8EwStaB5myiigPBP4zqSbw==", + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.4.tgz", + "integrity": "sha512-bIdVuDQR3r5AWV7bM6OMHD3mCXA53Ql0LXmW5UfcSmJZq+J+TytqZ5YJcTmMLcojJysN65vcFIeCqRn6YidA+Q==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5894,15 +5426,6 @@ "node": ">= 0.8.0" } }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", @@ -5985,16 +5508,6 @@ "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", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -6003,25 +5516,13 @@ "node": ">=6" } }, - "node_modules/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, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/qlobber": { - "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-5.0.3.tgz", - "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==", + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-7.0.1.tgz", + "integrity": "sha512-FsFg9lMuMEFNKmTO9nV7tlyPhx8BmskPPjH2akWycuYVTtWaVwhW5yCHLJQ6Q+3mvw5cFX2vMfW2l9z2SiYAbg==", "dev": true, "engines": { - "node": ">= 8" + "node": ">= 14" } }, "node_modules/qs": { @@ -6098,36 +5599,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -6236,30 +5707,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/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, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/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, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6297,15 +5744,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, "node_modules/restana": { "version": "4.9.5", "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.5.tgz", @@ -6446,9 +5884,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6464,27 +5902,6 @@ "resolved": "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -6631,9 +6048,9 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", - "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==", + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/sinon/-/sinon-14.0.1.tgz", + "integrity": "sha512-JhJ0jCiyBWVAHDS+YSjgEbDn7Wgz9iIjA1/RK+eseJN0vAAWIWiXBdrnb92ELPyjsfreCYntD1ORtLSfIrlvSQ==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.8.3", @@ -6642,10 +6059,6 @@ "diff": "^5.0.0", "nise": "^5.1.1", "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" } }, "node_modules/sinon/node_modules/@sinonjs/fake-timers": { @@ -6955,9 +6368,10 @@ } }, "node_modules/superagent": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz", - "integrity": "sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==", + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/superagent/-/superagent-8.0.2.tgz", + "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", + "deprecated": "Please use v8.0.0 until https://github.com/visionmedia/superagent/issues/1743 is resolved", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -6967,9 +6381,8 @@ "form-data": "^4.0.0", "formidable": "^2.0.1", "methods": "^1.1.2", - "mime": "^2.5.0", - "qs": "^6.10.3", - "readable-stream": "^3.6.0", + "mime": "2.6.0", + "qs": "^6.11.0", "semver": "^7.3.7" }, "engines": { @@ -6978,7 +6391,7 @@ }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "bin": { @@ -6988,17 +6401,29 @@ "node": ">=4.0.0" } }, + "node_modules/superagent/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, "node_modules/supertest": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz", - "integrity": "sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==", + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/supertest/-/supertest-6.3.0.tgz", + "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^7.1.3" + "superagent": "^8.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.4.0" } }, "node_modules/supports-color": { @@ -7084,12 +6509,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -7102,15 +6521,6 @@ "node": ">=0.6.0" } }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7248,7 +6658,7 @@ }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "dependencies": { @@ -7256,166 +6666,47 @@ } }, "node_modules/typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/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==", + "version": "4.8.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=7.0.0" + "node": ">=4.2.0" } }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/update-notifier/node_modules/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, - "engines": { - "node": ">=8" + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/update-notifier/node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 4.0.0" } }, - "node_modules/update-notifier/node_modules/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, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, "node_modules/uri-js": { @@ -7426,18 +6717,6 @@ "punycode": "^2.1.0" } }, - "node_modules/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, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -7616,18 +6895,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/winston": { "version": "3.8.1", "resolved": "https://registry.npmmirror.com/winston/-/winston-3.8.1.tgz", @@ -7730,7 +6997,7 @@ }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "dependencies": { @@ -7740,15 +7007,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", @@ -7857,9 +7115,9 @@ } }, "node_modules/z-schema": { - "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.3.tgz", - "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", "dev": true, "dependencies": { "lodash.get": "^4.4.2", @@ -7929,16 +7187,6 @@ "node-fetch": "^2.6.1", "restana": "^4.9.1", "uuid": "^8.3.2" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - } } }, "@eslint/eslintrc": { @@ -7966,6 +7214,13 @@ } } }, + "@graphql-typed-document-node/core": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz", + "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "dev": true, + "requires": {} + }, "@grpc/grpc-js": { "version": "1.6.7", "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", @@ -8036,23 +7291,23 @@ } }, "@microsoft/api-extractor": { - "version": "7.29.3", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.29.3.tgz", - "integrity": "sha512-PHq+Oo8yiXhwi11VQ1Nz36s+aZwgFqjtkd41udWHtSpyMv2slJ74m1cHdpWbs2ovGUCfldayzdpGwnexZLd2bA==", + "version": "7.32.0", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.32.0.tgz", + "integrity": "sha512-BfvPpeVzWLFTdairVItzWQGsZr82fR4RH+8Q4I7t0f9xq66v4Qz9K+u25jbL5R42X01b/vvJMuRhX5KhU8J1Ug==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.23.1", + "@microsoft/api-extractor-model": "7.24.3", "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.50.2", - "@rushstack/rig-package": "0.3.14", - "@rushstack/ts-command-line": "4.12.2", + "@rushstack/node-core-library": "3.53.0", + "@rushstack/rig-package": "0.3.16", + "@rushstack/ts-command-line": "4.12.4", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~4.7.4" + "typescript": "~4.8.4" }, "dependencies": { "resolve": { @@ -8063,24 +7318,18 @@ "requires": { "path-parse": "^1.0.6" } - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.23.1", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.23.1.tgz", - "integrity": "sha512-axlZ33H2LfYX7goAaWpzABWZl3JtX/EUkfVBsI4SuMn3AZYBJsP5MVpMCq7jt0PCefWGwwO+Rv+lCmmJIjFhlQ==", + "version": "7.24.3", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.24.3.tgz", + "integrity": "sha512-JElpLULqYDXQb0YIKKQhOJaNWBXsYeYu5J51Z4O6RGbOq7Tby9ViVfpDuXVXa87AMOSR5WKuaxG/5SnQVVNxiw==", "dev": true, "requires": { "@microsoft/tsdoc": "0.14.1", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.50.2" + "@rushstack/node-core-library": "3.53.0" } }, "@microsoft/tsdoc": { @@ -8090,17 +7339,23 @@ "dev": true }, "@microsoft/tsdoc-config": { - "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==", + "version": "0.16.2", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" }, "dependencies": { + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", @@ -8194,9 +7449,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@rushstack/node-core-library": { - "version": "3.50.2", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.50.2.tgz", - "integrity": "sha512-+zpZBcaX5s+wA0avF0Lk3sd5jbGRo5SmsEJpElJbqQd3KGFvc/hcyeNSMqV5+esJ1JuTfnE1QyRt8nvxFNTaQg==", + "version": "3.53.0", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.0.tgz", + "integrity": "sha512-FXk3eDtTHKnaUq+fLyNY867ioRhMa6CJDJO5hZ3wuGlxm184nckAFiU+hx027AodjpnqjX6pYF0zZGq7k7P/vg==", "dev": true, "requires": { "@types/node": "12.20.24", @@ -8206,7 +7461,6 @@ "jju": "~1.4.0", "resolve": "~1.17.0", "semver": "~7.3.0", - "timsort": "~0.3.0", "z-schema": "~5.0.2" }, "dependencies": { @@ -8228,9 +7482,9 @@ } }, "@rushstack/rig-package": { - "version": "0.3.14", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.14.tgz", - "integrity": "sha512-Ic9EN3kWJCK6iOxEDtwED9nrM146zCDrQaUxbeGOF+q/VLZ/HNHPw+aLqrqmTl0ZT66Sf75Qk6OG+rySjTorvQ==", + "version": "0.3.16", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.16.tgz", + "integrity": "sha512-FoSQng2RtapEUe+CBPKxbpZUhUht5s2+mMiztRH95qqp81dsUpfEWojtV6XrUVyWIRk2/cY1CDZUKJWxMrT26Q==", "dev": true, "requires": { "resolve": "~1.17.0", @@ -8249,9 +7503,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.12.2", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.2.tgz", - "integrity": "sha512-poBtnumLuWmwmhCEkVAgynWgtnF9Kygekxyp4qtQUSbBrkuyPQTL85c8Cva1YfoUpOdOXxezMAkUt0n5SNKGqw==", + "version": "4.12.4", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.4.tgz", + "integrity": "sha512-ckZHEfPiJCmBdWd/syve5zu2TNsPIqbFie3jWzM/izZa6ZOkDwex/K1ww+kJ12hFBnN44lMD7voJvKXajUCEDA==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -8281,12 +7535,6 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -8322,15 +7570,6 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "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" - } - }, "@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmmirror.com/@types/argparse/-/argparse-1.0.38.tgz", @@ -8372,9 +7611,9 @@ } }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "requires": { "@types/body-parser": "*", @@ -8417,9 +7656,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.184", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.184.tgz", - "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", + "version": "4.14.186", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", "dev": true }, "@types/long": { @@ -8446,9 +7685,9 @@ "dev": true }, "@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", "dev": true }, "@types/ms": { @@ -8694,7 +7933,7 @@ }, "aedes": { "version": "0.47.0", - "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.47.0.tgz", + "resolved": "https://registry.npmmirror.com/aedes/-/aedes-0.47.0.tgz", "integrity": "sha512-ERe7jMI87KlZVj+RWDEEQMTGJ10Nr68Jx5QA+/glBPmLpIoyB1sPv5xgY8FJ/zrnyj4RN04Sv9N6HsS8EmNpNg==", "dev": true, "requires": { @@ -8729,14 +7968,6 @@ "requires": { "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": { @@ -8776,15 +8007,6 @@ } } }, - "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", @@ -8859,7 +8081,7 @@ }, "asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, @@ -8920,9 +8142,9 @@ } }, "body-parser": { - "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==", + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -8932,7 +8154,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -8950,6 +8172,14 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -8958,85 +8188,6 @@ "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "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": { - "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" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -9083,38 +8234,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "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 - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -9185,24 +8304,12 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "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 - }, "clean-pkg-json": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/clean-pkg-json/-/clean-pkg-json-1.2.0.tgz", "integrity": "sha512-QHBWWOtpSCv5nfMFKwyxn4WMvkYE0msxj5xiqejYGqYepWVrK7O/om1Vn6nSl/WPtYn8ge9YmSCbTi1Hp8k+Hg==", "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", @@ -9228,15 +8335,6 @@ "wrap-ansi": "^7.0.0" } }, - "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" - } - }, "cloudevents": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/cloudevents/-/cloudevents-6.0.2.tgz", @@ -9330,7 +8428,7 @@ }, "component-emitter": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, @@ -9385,13 +8483,13 @@ } }, "concurrently": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz", - "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==", + "version": "7.4.0", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.4.0.tgz", + "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", "dev": true, "requires": { "chalk": "^4.1.0", - "date-fns": "^2.16.1", + "date-fns": "^2.29.1", "lodash": "^4.17.21", "rxjs": "^7.0.0", "shell-quote": "^1.7.3", @@ -9499,20 +8597,6 @@ } } }, - "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" - } - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -9545,7 +8629,7 @@ }, "cookiejar": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "resolved": "https://registry.npmmirror.com/cookiejar/-/cookiejar-2.1.3.tgz", "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, @@ -9564,6 +8648,15 @@ "cross-spawn": "^7.0.1" } }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "requires": { + "node-fetch": "2.6.7" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -9575,16 +8668,10 @@ "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 - }, "date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "version": "2.29.2", + "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.29.2.tgz", + "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==", "dev": true }, "debug": { @@ -9619,21 +8706,6 @@ } } }, - "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", @@ -9645,12 +8717,6 @@ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -9682,8 +8748,8 @@ }, "dezalgo": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "resolved": "https://registry.npmmirror.com/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", "dev": true, "requires": { "asap": "^2.0.0", @@ -9714,21 +8780,6 @@ "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 - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -9835,12 +8886,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "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-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -10224,6 +9269,25 @@ "vary": "~1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", @@ -10278,6 +9342,12 @@ "tmp": "^0.0.33" } }, + "extract-files": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/extract-files/-/extract-files-9.0.0.tgz", + "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10481,7 +9551,7 @@ }, "form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { @@ -10492,7 +9562,7 @@ }, "formidable": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "resolved": "https://registry.npmmirror.com/formidable/-/formidable-2.0.1.tgz", "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", "dev": true, "requires": { @@ -10504,7 +9574,7 @@ "dependencies": { "qs": { "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.9.3.tgz", "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", "dev": true } @@ -10617,15 +9687,6 @@ "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", @@ -10670,46 +9731,48 @@ "resolved": "https://registry.npmmirror.com/google-protobuf/-/google-protobuf-3.20.1.tgz", "integrity": "sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==" }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "graphql": { + "version": "16.6.0", + "resolved": "https://registry.npmmirror.com/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "dev": true, + "peer": true + }, + "graphql-request": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/graphql-request/-/graphql-request-5.0.0.tgz", + "integrity": "sha512-SpVEnIo2J5k2+Zf76cUkdvIRaq5FMZvGQYnA4lUWYbc99m+fHh4CZYRRO/Ff4tCLQ613fzCm3SiDT64ubW5Gyw==", "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" + "@graphql-typed-document-node/core": "^3.1.1", + "cross-fetch": "^3.1.5", + "extract-files": "^9.0.0", + "form-data": "^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==", + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { - "pump": "^3.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" } } } }, - "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==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/gts/-/gts-3.1.1.tgz", + "integrity": "sha512-Jw44aBbzMnd1vtZs7tZt3LMstKQukCBg7N4CKVGzviIQ45Cz5b9lxDJGXVKj/9ySuGv6TYEeijZJGbiiVcM27w==", "dev": true, "requires": { "@typescript-eslint/eslint-plugin": "^4.2.0", @@ -10726,7 +9789,6 @@ "ncp": "^2.0.0", "prettier": "^2.1.2", "rimraf": "^3.0.2", - "update-notifier": "^5.0.0", "write-file-atomic": "^3.0.3" }, "dependencies": { @@ -10818,12 +9880,6 @@ "has-symbols": "^1.0.2" } }, - "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 - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -10832,7 +9888,7 @@ }, "hexoid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "resolved": "https://registry.npmmirror.com/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, @@ -10841,12 +9897,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, - "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 - }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -10970,12 +10020,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "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", @@ -11114,15 +10158,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" }, - "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", @@ -11167,27 +10202,11 @@ "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-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, - "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", @@ -11202,18 +10221,6 @@ "has-tostringtag": "^1.0.0" } }, - "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", @@ -11269,8 +10276,8 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { @@ -11287,12 +10294,6 @@ "call-bind": "^1.0.2" } }, - "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 - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -11339,12 +10340,6 @@ "esprima": "^4.0.0" } }, - "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", @@ -11385,15 +10380,6 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "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", @@ -11405,15 +10391,6 @@ "resolved": "https://registry.npmmirror.com/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, - "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", @@ -11549,12 +10526,6 @@ "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "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", @@ -11563,23 +10534,6 @@ "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 - } - } - }, "map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -11696,12 +10650,6 @@ "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", @@ -11904,6 +10852,14 @@ "requires": { "fastparallel": "^2.3.0", "qlobber": "^5.0.0" + }, + "dependencies": { + "qlobber": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-5.0.3.tgz", + "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==", + "dev": true + } } }, "mqtt-packet": { @@ -11976,9 +10932,9 @@ } }, "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } @@ -12007,12 +10963,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "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-bundled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", @@ -12130,12 +11080,6 @@ "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-finally": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", @@ -12214,26 +11158,6 @@ } } }, - "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", @@ -12299,9 +11223,9 @@ "dev": true }, "pre-push": { - "version": "0.1.3", - "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.3.tgz", - "integrity": "sha512-PXc3tT7jq/H2VrEooQ8F9QCVfQawmd52CzWMemUrPlFnL8avaXY22NTuej3ClISy8EwStaB5myiigPBP4zqSbw==", + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.4.tgz", + "integrity": "sha512-bIdVuDQR3r5AWV7bM6OMHD3mCXA53Ql0LXmW5UfcSmJZq+J+TytqZ5YJcTmMLcojJysN65vcFIeCqRn6YidA+Q==", "dev": true, "requires": { "cross-spawn": "^5.0.1", @@ -12368,12 +11292,6 @@ "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", @@ -12436,34 +11354,15 @@ "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", - "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==" }, - "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" - } - }, "qlobber": { - "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-5.0.3.tgz", - "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==", + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/qlobber/-/qlobber-7.0.1.tgz", + "integrity": "sha512-FsFg9lMuMEFNKmTO9nV7tlyPhx8BmskPPjH2akWycuYVTtWaVwhW5yCHLJQ6Q+3mvw5cFX2vMfW2l9z2SiYAbg==", "dev": true }, "qs": { @@ -12511,32 +11410,6 @@ "unpipe": "1.0.0" } }, - "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", @@ -12614,24 +11487,6 @@ "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-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12657,15 +11512,6 @@ "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" - } - }, "restana": { "version": "4.9.5", "resolved": "https://registry.npmmirror.com/restana/-/restana-4.9.5.tgz", @@ -12763,9 +11609,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } @@ -12775,23 +11621,6 @@ "resolved": "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "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 - } - } - }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -12923,9 +11752,9 @@ } }, "sinon": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", - "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==", + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/sinon/-/sinon-14.0.1.tgz", + "integrity": "sha512-JhJ0jCiyBWVAHDS+YSjgEbDn7Wgz9iIjA1/RK+eseJN0vAAWIWiXBdrnb92ELPyjsfreCYntD1ORtLSfIrlvSQ==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", @@ -13176,9 +12005,9 @@ "dev": true }, "superagent": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz", - "integrity": "sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==", + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/superagent/-/superagent-8.0.2.tgz", + "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", "dev": true, "requires": { "component-emitter": "^1.3.0", @@ -13188,28 +12017,36 @@ "form-data": "^4.0.0", "formidable": "^2.0.1", "methods": "^1.1.2", - "mime": "^2.5.0", - "qs": "^6.10.3", - "readable-stream": "^3.6.0", + "mime": "2.6.0", + "qs": "^6.11.0", "semver": "^7.3.7" }, "dependencies": { "mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, "supertest": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz", - "integrity": "sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==", + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/supertest/-/supertest-6.3.0.tgz", + "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^7.1.3" + "superagent": "^8.0.0" } }, "supports-color": { @@ -13284,12 +12121,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13299,12 +12130,6 @@ "os-tmpdir": "~1.0.2" } }, - "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", @@ -13408,7 +12233,7 @@ }, "typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { @@ -13416,9 +12241,9 @@ } }, "typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", + "version": "4.8.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, "unbox-primitive": { @@ -13432,15 +12257,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "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" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", @@ -13452,85 +12268,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "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" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -13539,15 +12276,6 @@ "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" - } - }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -13695,15 +12423,6 @@ "is-typed-array": "^1.1.7" } }, - "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" - } - }, "winston": { "version": "3.8.1", "resolved": "https://registry.npmmirror.com/winston/-/winston-3.8.1.tgz", @@ -13784,7 +12503,7 @@ }, "write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { @@ -13794,12 +12513,6 @@ "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 - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", @@ -13874,9 +12587,9 @@ "dev": true }, "z-schema": { - "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.3.tgz", - "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", "dev": true, "requires": { "commander": "^2.20.3", diff --git a/package.json b/package.json index aac9c8c7..ac42fefa 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@dapr/dapr": "2.3.1", - "body-parser": "^1.20.0", + "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", "express": "^4.18.1", @@ -22,10 +22,9 @@ "http-terminator": "^3.2.0", "lodash": "^4.17.21", "minimist": "^1.2.6", - "node-fetch": "2.6.5", "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", + "semver": "^7.3.8", "skywalking-backend-js": "^0.5.1" }, "scripts": { @@ -56,14 +55,14 @@ "author": "OpenFunction", "license": "Apache-2.0", "devDependencies": { - "@microsoft/api-extractor": "^7.29.3", + "@microsoft/api-extractor": "^7.32.0", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", - "@types/express": "4.17.13", + "@types/express": "4.17.14", "@types/google-protobuf": "^3.15.6", - "@types/lodash": "^4.14.184", + "@types/lodash": "^4.14.186", "@types/minimist": "1.2.2", - "@types/mocha": "9.1.1", + "@types/mocha": "10.0.0", "@types/node": "14.18.11", "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", @@ -71,19 +70,20 @@ "@types/shelljs": "^0.8.11", "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", - "aedes": "^0.47.0", + "aedes": "0.47.0", "clean-pkg-json": "^1.2.0", - "concurrently": "^7.3.0", + "concurrently": "^7.4.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", - "gts": "^3.1.0", + "graphql-request": "^5.0.0", + "gts": "^3.1.1", "mocha": "10.0.0", "pack-n-play": "^1.0.0-2", - "pre-push": "^0.1.3", + "pre-push": "^0.1.4", "shelljs": "^0.8.5", - "sinon": "^14.0.0", - "supertest": "6.2.3", - "typescript": "^4.8.2", + "sinon": "^14.0.1", + "supertest": "6.3.0", + "typescript": "^4.8.4", "wait-on": "^6.0.1" } } diff --git a/src/loader.ts b/src/loader.ts index 56a74766..cf1098bf 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -22,21 +22,20 @@ import * as fs from 'fs'; import * as path from 'path'; import {pathToFileURL} from 'url'; +import Debug from 'debug'; import * as semver from 'semver'; import * as readPkgUp from 'read-pkg-up'; -import {forEach} from 'lodash'; +import {forEach, set} from 'lodash'; +import {TracingPlugin} from './openfunction/plugins'; import {Plugin, PluginStore, PluginMap} from './openfunction/plugin'; +import {OpenFunctionContext} from './openfunction/context'; import {HandlerFunction} from './functions'; import {getRegisteredFunction} from './function_registry'; import {SignatureType} from './types'; -import {FrameworkOptions} from './options'; -import {OpenFunctionContext} from './openfunction/context'; -import { - SKYWALKINGNAME, - SkyWalkingPlugin, -} from './openfunction/plugin/skywalking/skywalking'; + +const debug = Debug('common:loader'); // Dynamic import function required to load user code packaged as an // ES module is only available on Node.js v13.2.0 and up. @@ -248,12 +247,13 @@ export async function getFunctionPlugins( } catch (ex) { const err = ex; console.error( - "Provided module can't be loaded. Plesae make sure your module extend Plugin class properly." + + 'Provided module cannot be loaded. Plesae make sure your module extend Plugin class properly.' + `\nDetailed stack trace: ${err.stack}` ); } } + debug('Custom plugins loaded: %o', Object.keys(plugins)); return plugins; } @@ -279,46 +279,32 @@ function getPluginsModulePath(codeLocation: string): string[] | null { } } -/** - * It loads BUIDIN type plugins from the /openfunction/plugin. - * @param context - The context of OpenFunction. - */ -export async function loadBuidInPlugins(options: FrameworkOptions) { - if (!options.context) { - console.warn("The context is undefined can't load BUIDIN type plugins"); - return; - } +export async function getBuiltinPlugins( + context: OpenFunctionContext +): Promise { + if (!context) return null; + + // Setup store for builtin plugins const store = PluginStore.Instance(PluginStore.Type.BUILTIN); - //Provide system info for BUILDIN type plugins + const plugins: PluginMap = {}; - if (checkTraceConfig(options.context)) { - const skywalking = new SkyWalkingPlugin(options); - store.register(skywalking); - options.context.prePlugins?.push(SKYWALKINGNAME); - options.context.postPlugins?.push(SKYWALKINGNAME); - } -} + // Try to create and add tracing plugin + try { + // Save function name into configuration and create the plugin + set(context, 'pluginsTracing.tags.func', context.name); + const tracing = TracingPlugin.Create(context.pluginsTracing); -/** - * It check trace config ,it will set default value if it is enbaled. - * @param tracing - The config of TraceConfig. - */ -function checkTraceConfig(context: OpenFunctionContext): boolean { - if (!context.tracing) { - console.warn('TraceConfig is invalid'); - return false; - } - if (!context.tracing.enabled) { - return false; - } - if (!context.tracing.tags) { - context.tracing.tags = {}; + if (tracing) { + store.register(tracing); + plugins[tracing.name] = tracing; + } + } catch (ex) { + const err = ex; + console.error( + `Tracing plugin cannot be initialized.\nDetailed stack trace: ${err.stack}` + ); } - //Set default trace provider config - context.tracing.provider = { - name: context.tracing.provider?.name || SKYWALKINGNAME, - oapServer: context.tracing.provider?.oapServer || '127.0.0.1:11800', - }; - return true; + debug('Builtin plugins loaded: %o', Object.keys(plugins)); + return plugins; } diff --git a/src/main.ts b/src/main.ts index 391848da..1bf9c641 100644 --- a/src/main.ts +++ b/src/main.ts @@ -21,9 +21,9 @@ import * as process from 'process'; import {createHttpTerminator} from 'http-terminator'; import getAysncServer from './openfunction/async_server'; -import {OpenFunctionContext, ContextUtils} from './openfunction/context'; +import {ContextUtils} from './openfunction/context'; -import {getUserFunction, getFunctionPlugins, loadBuidInPlugins} from './loader'; +import {getUserFunction, getFunctionPlugins, getBuiltinPlugins} from './loader'; import {ErrorHandler} from './invoker'; import {getServer} from './server'; import {parseOptions, helpText, OptionsError} from './options'; @@ -54,14 +54,15 @@ export const main = async () => { } const {userFunction, signatureType} = loadedFunction; - // First load BUIDIN type plugin - await loadBuidInPlugins(options); // Load function plugins before starting server + // First, we load system built-in function plugins + await getBuiltinPlugins(options.context!); + // Then, we load user-defined function plugins await getFunctionPlugins(options.sourceLocation); // Try to determine the server runtime // Considering the async runtime in the first place - if (ContextUtils.IsAsyncRuntime(options.context as OpenFunctionContext)) { + if (ContextUtils.IsAsyncRuntime(options.context!)) { options.context!.port = options.port; const server = getAysncServer( diff --git a/src/openfunction/context.ts b/src/openfunction/context.ts index a0689c40..15c66549 100644 --- a/src/openfunction/context.ts +++ b/src/openfunction/context.ts @@ -25,11 +25,11 @@ export interface OpenFunctionContext { /** * Optional input binding object. */ - inputs?: OpenFunctionBinding; + inputs?: Record; /** * Optional output binding object. */ - outputs?: OpenFunctionBinding; + outputs?: Record; /** * Optional plugins to be executed before user function. */ @@ -39,20 +39,9 @@ export interface OpenFunctionContext { */ postPlugins?: string[]; /** - * Optional trace config + * Optional trace plugin config. */ - tracing?: TraceConfig; -} - -/** - * The binding interface of the context. - * @public - */ -export interface OpenFunctionBinding { - /** - * The hash map of the binding. - */ - [key: string]: OpenFunctionComponent; + pluginsTracing?: TraceConfig; } /** @@ -153,41 +142,57 @@ export class ContextUtils { } /** - * The config of the trace. + * The config of the trace plugin. * @public */ export interface TraceConfig { /** - * This is trace switch + * Switch of the tracer */ enabled: boolean; /** - * Trace Provider + * Provider of the tracer */ - provider?: TraceProvider; + provider: TraceProvider; /** - * Trace tags + * Optional tags of the tracer */ - tags?: Record; + tags?: Record & {func?: string}; /** - * Trace baggage + * Optional baggage of the tracer */ baggage?: Record; } /** - * The trace provider info. + * The trace provider object. * @public */ export interface TraceProvider { /** - * Provider name - * Now is just support skywalking + * The name of the provider. */ - name: string; + name: + | `${TraceProviderType}` + | `${Capitalize}` + | `${Uppercase}`; /** - * OapServer address - * example [skywalking-oap:11800] + * The address of the OAP server. */ oapServer: string; } + +/** + * Defining trace provider type enumeration. + * @public + */ +export enum TraceProviderType { + /** + * The SkyWalking type. + */ + SkyWalking = 'skywalking', + /** + * The OpenTelemetry type. + */ + OpenTelemetry = 'opentelemetry', +} diff --git a/src/openfunction/plugin.ts b/src/openfunction/plugin.ts index 946796f4..7637b875 100644 --- a/src/openfunction/plugin.ts +++ b/src/openfunction/plugin.ts @@ -1,8 +1,11 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import {get, invoke, omit, transform, trim} from 'lodash'; +import * as Debug from 'debug'; +import {get, invoke, isEmpty, omit, transform, trim} from 'lodash'; import {OpenFunctionRuntime} from './runtime'; +const debug = Debug('ofn:plugin'); + /** * Defining an abstract class to represent Plugin. * @public @@ -108,17 +111,25 @@ export class PluginStore { return new PluginStore(type); } + /** + * Internal store type. + */ + #type = PluginStoreType.CUSTOM; + /** * Internal store object. */ - #store: PluginMap | null = null; + readonly #store: PluginMap | null = null; /** * Private constructor of PluginStore. * @param type - PluginStoreType - The type of store you want to use. */ private constructor(type: PluginStoreType) { - if (!this.#store) this.#store = stores[type]; + if (!this.#store) { + this.#type = type; + this.#store = stores[type]; + } } /** @@ -148,6 +159,14 @@ export class PluginStore { return this.#store![name]; } + /** + * Getter that tells whether the store is custom type. + * @returns `true` if the `#type` is `PluginStoreType.CUSTOM`. + */ + get #isCustomStore(): boolean { + return this.#type === PluginStoreType.CUSTOM; + } + /** * It invokes the `execPreHook` function of each plugin in the order specified by the `seq` array * @param ctx - The context object that is passed to the plugin. @@ -157,7 +176,7 @@ export class PluginStore { await this.#invokePluginBySeq( ctx, 'execPreHook', - seq || get(ctx, 'prePlugins', null) + seq || (this.#isCustomStore && get(ctx, 'prePlugins')) ); } @@ -170,7 +189,7 @@ export class PluginStore { await this.#invokePluginBySeq( ctx, 'execPostHook', - seq || get(ctx, 'postPlugins', null) + seq || (this.#isCustomStore && get(ctx, 'postPlugins')) ); } @@ -185,12 +204,23 @@ export class PluginStore { method: keyof Plugin, seq: string[] ) { - const pluginNames = seq ?? this.#store!._seq; + const pluginNames = !isEmpty(seq) ? seq : this.#store!._seq ?? []; const plugins = this.#store!; for (const pluginName of pluginNames) { const plugin = plugins[pluginName]; - await invoke(plugin, method, ctx, plugins); + debug('Executing "%s" of plugin "%s"', method, pluginName); + + // Try to invoke the plugin method and catch exceptions + try { + await invoke(plugin, method, ctx, plugins); + } catch (ex) { + const err = ex; + console.error( + `Failed to invoke "${method}" of plugin "${pluginName}"` + + `\nDetailed stack trace: ${err.stack}` + ); + } } } } diff --git a/src/openfunction/plugin/skywalking/skywalking.ts b/src/openfunction/plugin/skywalking/skywalking.ts deleted file mode 100644 index 33bed7ce..00000000 --- a/src/openfunction/plugin/skywalking/skywalking.ts +++ /dev/null @@ -1,114 +0,0 @@ -import {forEach} from 'lodash'; -import agent, {ContextManager} from 'skywalking-backend-js'; -import SpanContext from 'skywalking-backend-js/lib/trace/context/SpanContext'; -import {SpanLayer} from 'skywalking-backend-js/lib/proto/language-agent/Tracing_pb'; -import {Component} from 'skywalking-backend-js/lib/trace/Component'; -import {Tag} from 'skywalking-backend-js/lib/Tag'; -import Span from 'skywalking-backend-js/lib/trace/span/Span'; -import Context from 'skywalking-backend-js/lib/trace/context/Context'; - -import {Plugin} from '../../plugin'; -import {OpenFunctionRuntime} from '../../runtime'; -import {TraceConfig} from '../../context'; -import {FrameworkOptions} from '../../../options'; - -// https://github.com/apache/skywalking/blob/master/oap-server/server-starter/src/main/resources/component-libraries.yml#L515 -const componentIDOpenFunction = new Component(5013); - -export const SKYWALKINGNAME = 'skywalking'; - -class Trace { - private span: Span; - private spanContext: Context; - - constructor(functionName: string) { - this.spanContext = ContextManager.hasContext - ? ContextManager.current - : new SpanContext(); - - this.span = this.spanContext.newEntrySpan(`/${functionName}`, undefined); - } - - async start(tags: Array): Promise { - forEach(tags, tag => { - this.span.tag(tag); - }); - this.span.layer = SpanLayer.FAAS; - this.span.component = componentIDOpenFunction; - this.span.start(); - this.span.async(); - return this.spanContext.traceId(); - } - - async stop() { - this.span.stop(); - this.spanContext.stop(this.span); - await agent.flush(); - } -} - -/** - * Defining an class to provide trace ability alugin by skywalking . - * @public - **/ -export class SkyWalkingPlugin extends Plugin { - private trace: Trace | undefined; - private tags: Array = []; - private functionName = 'function'; - - constructor(options: FrameworkOptions) { - super(SKYWALKINGNAME, 'v1'); - - this.functionName = options.target; - - // Start skywalking agent - agent.start({ - serviceName: this.functionName, - serviceInstance: 'openfunctionInstance', - collectorAddress: options.context!.tracing!.provider!.oapServer, - }); - - if (!options.context!.tracing!.tags) { - options.context!.tracing!.tags = {}; - } - options.context!.tracing!.tags!['RuntimeType'] = - options.context?.runtime || 'Knative'; - this.iniAttribute(options.context!.tracing!); - } - - iniAttribute(traceConfig: TraceConfig) { - for (const key in traceConfig.tags) { - this.tags.push({ - key, - val: traceConfig.tags[key], - overridable: false, - }); - } - } - - async execPreHook( - ctx: OpenFunctionRuntime | null, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - plugins: Record - ) { - if (ctx === null) { - console.warn('OpenFunctionRuntime [ctx] is null'); - return; - } - this.trace = new Trace(this.functionName); - const traceId = await this.trace.start(this.tags); - ctx.locals.traceId = traceId; - } - - async execPostHook( - ctx: OpenFunctionRuntime | null, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - plugins: Record - ) { - if (ctx === null) { - console.warn('OpenFunctionRuntime [ctx] is null'); - return; - } - await this.trace?.stop(); - } -} diff --git a/src/openfunction/plugins/index.ts b/src/openfunction/plugins/index.ts new file mode 100644 index 00000000..3271dfd3 --- /dev/null +++ b/src/openfunction/plugins/index.ts @@ -0,0 +1,3 @@ +import TracingPlugin from './tracing'; + +export {TracingPlugin}; diff --git a/src/openfunction/plugins/tracing/index.ts b/src/openfunction/plugins/tracing/index.ts new file mode 100644 index 00000000..98db672a --- /dev/null +++ b/src/openfunction/plugins/tracing/index.ts @@ -0,0 +1,77 @@ +import {TraceConfig, TraceProviderType} from '../../context'; +import {Plugin} from '../../plugin'; + +export default abstract class Tracing extends Plugin { + /** + * Property to hold the trace configurations. + */ + protected readonly config: TraceConfig; + + /** + * The constructor function is called when a new instance of the class is created + * @param config - TraceConfig - Configuration object that you can use to configure the agent. + */ + constructor(config: TraceConfig) { + super('tracing', 'v1'); + + this.config = config; + this.startAgent(); + } + + /** + * If the config is enabled, return a new instance of the supported tracing plugin. + * @param [config] - TraceConfig - The configuration of the plugin. + * @returns A Plugin object or null. + */ + static Create(config?: TraceConfig): Plugin | null { + if (!config?.enabled) return null; + + // So far, we only support SkyWalking + if (config?.provider?.name === TraceProviderType.SkyWalking) + return new SkyWalking(config); + + return null; + } + + /** + * Getter returns whether thie plugin is enabled. + * @returns A boolean value of the enabled property of the config object. + */ + get enabled(): boolean { + return !!this.config.enabled; + } + + /** + * Pre hook starts a tracing span. + * @param ctx - The context object that is passed to the hook. + */ + async execPreHook(ctx: unknown) { + await this.startSpan(ctx); + } + + /** + * Post hook ends a tracing span. + * @param ctx - The context object that is passed to the hook. + */ + async execPostHook(ctx: unknown) { + await this.stopSpan(ctx); + } + + /** + * Abstract method to start the tracer agent. + */ + protected abstract startAgent(): void; + /** + * Abstract method to start the context span. + * @param ctx OpenFunction runtime context. + */ + protected abstract startSpan(ctx: unknown): Promise; + /** + * Abstract method to stop the context span. + * @param ctx OpenFunction runtime context. + */ + protected abstract stopSpan(ctx: unknown): Promise; +} + +// HACK: Break circular reference +import SkyWalking from './skywalking'; diff --git a/src/openfunction/plugins/tracing/skywalking.ts b/src/openfunction/plugins/tracing/skywalking.ts new file mode 100644 index 00000000..32a1baaa --- /dev/null +++ b/src/openfunction/plugins/tracing/skywalking.ts @@ -0,0 +1,114 @@ +import * as Debug from 'debug'; +import {forEach, get} from 'lodash'; + +import agent, {ContextManager} from 'skywalking-backend-js'; +import Tag from 'skywalking-backend-js/lib/Tag'; +import {Component} from 'skywalking-backend-js/lib/trace/Component'; +import {ContextCarrier} from 'skywalking-backend-js/lib/trace/context/ContextCarrier'; +import {SpanLayer} from 'skywalking-backend-js/lib/proto/language-agent/Tracing_pb'; + +import {OpenFunctionRuntime} from '../../runtime'; + +import Tracing from '.'; + +const debug = Debug('ofn:plugin:tracing'); + +/** + * SkyWalking specific implementation of tracer plugin. + * See also: https://github.com/apache/skywalking-data-collect-protocol/blob/master/language-agent/Tracing.proto + */ +export default class SkyWalking extends Tracing { + /** + * It starts the SkyWalking tracer agent. + */ + protected async startAgent() { + // AgentConfig: https://github.com/apache/skywalking-nodejs/blob/master/src/config/AgentConfig.ts + agent.start({ + serviceName: this.config.tags?.func, + collectorAddress: this.config.provider?.oapServer || '127.0.0.1:11800', + // FIXME: NO span could be recorded with "http" plugin enabled + // FIXME: "express" plugin will block error span record + disablePlugins: 'http,express', + }); + } + + /** + * It creates a new entry span, sets the span layer to FAAS, and sets the span tags. + * @param ctx - OpenFunctionRuntime - The context object that is passed to the function. + */ + protected async startSpan(ctx: OpenFunctionRuntime) { + const context = ContextManager.current; + const span = + ContextManager.currentSpan ?? + context.newEntrySpan('/', this.#getCarrier(ctx)); + + span.operation = get(ctx, 'name'); + span.component = this.#component; + span.layer = SpanLayer.FAAS; + + // Pass through some typical tags per the context + span.tag({ + key: 'runtime', + val: get(ctx, 'runtime'), + overridable: false, + }); + + if (ctx.req) { + span.tag(Tag.httpMethod(ctx.req?.method)); + span.tag(Tag.httpURL(ctx.req?.originalUrl)); + } + + // Pass through user defined "tags" data + forEach(this.config.tags, (val, key) => { + span.tag({ + key, + val, + overridable: false, + }); + }); + + // Start the span once all set + // span.async(); + span.start(); + + // FIXME: SkyWalking Node.js SDK has not implemented "sw-correlation" injection, + // so we cannot deal with "baggage" data passed through tracer plugin options + + // Save back trace id for potential future use + ctx.locals.traceId = context.traceId(); + debug('Span trace id: %s', ctx.locals.traceId); + } + + /** + * It stops the current span, and if there was an error, it marks the span as an error. + * @param ctx - OpenFunctionRuntime - The context object that is passed to the function. + */ + protected async stopSpan(ctx: OpenFunctionRuntime) { + const span = ContextManager.currentSpan; + + ctx.error && span.error(ctx.error); + span.stop(); + + // NOTE: `flush` may take some time + await agent.flush(); + } + + /** + * Private getter for OpenFunction tracer component. + * See also: https://github.com/apache/skywalking/blob/master/oap-server/server-starter/src/main/resources/component-libraries.yml#L548 + */ + get #component(): Component { + return new Component(5013); + } + + /** + * If the request has headers, return a ContextCarrier from those headers. + * See also: https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v3.html + * + * @param ctx - OpenFunctionRuntime - The context object that is passed to the function. + * @returns The ContextCarrier is being returned. + */ + #getCarrier(ctx: OpenFunctionRuntime): ContextCarrier | undefined { + return ContextCarrier.from(ctx.req?.headers as Record); + } +} diff --git a/src/openfunction/runtime.ts b/src/openfunction/runtime.ts index 85b3f887..22a8ab4d 100644 --- a/src/openfunction/runtime.ts +++ b/src/openfunction/runtime.ts @@ -51,6 +51,11 @@ export abstract class OpenFunctionRuntime { // eslint-disable-next-line @typescript-eslint/no-explicit-any readonly locals: Record; + /** + * The optional error object to hold exception data. + */ + error?: Error; + /** * Constructor of the OpenFunctionRuntime. */ @@ -107,16 +112,23 @@ export abstract class OpenFunctionRuntime { const sysPlugins = PluginStore.Instance(PluginStore.Type.BUILTIN); return async data => { - // Execute pre hooks, system plugins go first - await sysPlugins.execPreHooks(ctx); + // Execute pre hooks, user plugins go first await userPlugins.execPreHooks(ctx); + await sysPlugins.execPreHooks(ctx); - // Execute user function - await userFunction(ctx, data); + // Execute user function and save error for lazy reporting + try { + await userFunction(ctx, data); + } catch (ex) { + ctx.error = ex; + } - // Execute pre hooks, system plugins go last + // Execute pre hooks, user plugins go last await sysPlugins.execPostHooks(ctx); await userPlugins.execPostHooks(ctx); + + // Report error if exists at the very last + if (ctx.error) throw ctx.error; }; } diff --git a/test/data/mock/context.ts b/test/data/mock/context.ts index d1f43650..1f934a57 100644 --- a/test/data/mock/context.ts +++ b/test/data/mock/context.ts @@ -1,4 +1,7 @@ -import {OpenFunctionContext} from '../../../src'; +import { + OpenFunctionContext, + TraceConfig, +} from '../../../src/openfunction/context'; export const KnativeBase: OpenFunctionContext = { name: 'test-context', @@ -67,3 +70,19 @@ export const AsyncBase: OpenFunctionContext = { }, }, }; + +export const TracerPluginBase: TraceConfig = { + enabled: true, + provider: { + name: 'skywalking', + oapServer: 'localhost:11800', + }, + tags: { + tag1: 'value1', + tag2: 'value2', + }, + baggage: { + key: 'key1', + value: 'value1', + }, +}; diff --git a/test/data/plugins/skywalking.mjs b/test/data/plugins/skywalking.mjs new file mode 100644 index 00000000..8c55a2f1 --- /dev/null +++ b/test/data/plugins/skywalking.mjs @@ -0,0 +1,56 @@ +import * as assert from 'assert'; + +import {GraphQLClient, gql} from 'graphql-request'; + +import {Plugin} from '../../../build/src/index.js'; + +export class SkyPathfinder extends Plugin { + span = {}; + + constructor() { + super('sky-pathfinder', 'v1'); + } + + async execPostHook(ctx) { + // Wait a while for trace logging + await new Promise(r => setTimeout(r, 1000)); + + const traceId = ctx.locals.traceId; + const {trace} = await this.queryGraph(traceId); + + this.span = trace.spans[0]; + console.log('[ span ] >', ctx.locals.traceId, span); + } + + async queryGraph(traceId, endpoint = 'http://localhost:12800/graphql') { + const client = new GraphQLClient(endpoint, { + headers: { + // Why need this header? https://github.com/prisma-labs/graphql-request/issues/140 + accept: 'application/json', + }, + }); + + // Spec: https://github.com/apache/skywalking-query-protocol/blob/master/trace.graphqls + const query = gql` + query ($traceId: ID!) { + trace: queryTrace(traceId: $traceId) { + spans { + traceId + endpointName + type + component + layer + isError + tags { + key + value + } + } + } + } + `; + + const data = await client.request(query, {traceId}); + return data; + } +} diff --git a/test/data/plugins/skywalking_assist.mjs b/test/data/plugins/skywalking_assist.mjs deleted file mode 100644 index 15924f9e..00000000 --- a/test/data/plugins/skywalking_assist.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import assert from 'assert'; -import {Plugin} from '../../../build/src/index.js'; -import {query,OapServer,sleep} from '../../../build/test/integration/build_in_plugin.js' -//Help to verify skywalking plugin -export class Assist extends Plugin { - constructor() { - super('assist', 'v1'); - } - - async execPreHook(ctx, plugins) { - } - - async execPostHook(ctx, plugins) { - const traceId = ctx.locals.traceId; - const options = ctx.locals.options; - sleep(3000).then(()=>{ - query(traceId,OapServer).then(res=>{ - res.json().then(res=>{ - if(res.data.trace.spans.length >=0){ - let target = null; - for (const item of res.data.trace.spans) { - if (item.endpointName === `/${options.target}`) { - target = item; - } - } - assert(target !== null); - assert(target.endpointName === `/${options.target}`); - - ctx.locals.done?.(); - } - }) - }) - }) - } - } \ No newline at end of file diff --git a/test/integration/build_in_plugin.ts b/test/integration/build_in_plugin.ts deleted file mode 100644 index 42a1dfb7..00000000 --- a/test/integration/build_in_plugin.ts +++ /dev/null @@ -1,232 +0,0 @@ -import {ifError, notStrictEqual, deepStrictEqual, ok} from 'assert'; -import {createServer} from 'net'; -import {execSync} from 'child_process'; - -import {get} from 'lodash'; -import * as shell from 'shelljs'; -import * as MQTT from 'aedes'; -import fetch from 'node-fetch'; - -import {FrameworkOptions} from '../../src/options'; -import {SKYWALKINGNAME} from '../../src/openfunction/plugin/skywalking/skywalking'; -import {PluginStore} from '../../src/openfunction/plugin'; -import {OpenFunctionRuntime} from '../../src/openfunction/runtime'; -import {OpenFunctionContext} from '../../src/openfunction/context'; -import getAysncServer from '../../src/openfunction/async_server'; -import {getFunctionPlugins, loadBuidInPlugins} from '../../src/loader'; - -import {Context} from '../data/mock'; - -const TEST_CONTEXT = Context.AsyncBase; - -export const OapServer = '127.0.0.1:12800'; - -export const sleep = (val: number) => { - return new Promise(resolve => setTimeout(resolve, val)); -}; - -export const query = async (traceId: string, url: string) => { - const body = { - query: `query queryTrace($traceId: ID!) { - trace: queryTrace(traceId: $traceId) { - spans { - traceId - segmentId - spanId - parentSpanId - refs { - traceId - parentSegmentId - parentSpanId - type - } - serviceCode - startTime - endTime - endpointName - type - peer - component - isError - layer - tags { - key - value - } - logs { - time - data { - key - value - } - } - } - } - }`, - variables: { - traceId, - }, - }; - return await fetch(`http://${url}/graphql`, { - method: 'POST', - body: JSON.stringify(body), - }); -}; - -//Verify skywalking proccess , start it if not exist -export const checkSkyWalkingProcess = async ( - reCheck: boolean -): Promise => { - try { - const buffer = execSync('docker ps -a').toString(); - - let flag = false; - for (const line of buffer.split('\n')) { - if (line.indexOf('apache/skywalking-oap-server:8.4.0-es6') !== -1) { - if (line.indexOf('Up') !== -1) { - console.log('skywalking oap server is start'); - flag = true; - } else if (line.indexOf('Exited') !== -1) { - console.log('skywalking oap server is stop , now start it '); - console.log( - execSync('docker start ' + line.substring(0, 13)).toString() - ); - flag = true; - } - break; - } - } - if (!flag) { - const startCmd = - 'docker run -d --name oap -p 12800:12800 -p 11800:11800 apache/skywalking-oap-server:8.4.0-es6'; - execSync(startCmd); - console.log(startCmd); - return reCheck ? false : checkSkyWalkingProcess(true); - } - } catch (error) { - console.log('start fail'); - return false; - } - return true; -}; -describe('Build in plugin', () => { - const APPID = 'async.dapr'; - const broker = MQTT.Server(); - const server = createServer(broker.handle); - before(done => { - // Start simple plain MQTT server via aedes - server.listen(1883, () => { - // Try to run Dapr sidecar and listen for the async server - shell.exec( - `dapr run -H 3500 -G 50001 -p ${TEST_CONTEXT.port} -d ./test/data/components/async -a ${APPID} --log-level debug`, - { - silent: true, - async: true, - } - ); - done(); - }); - }); - - after(done => { - // Stop dapr sidecar process - shell.exec(`dapr stop ${APPID}`, { - silent: true, - }); - server.close(); - broker.close(done); - }); - - it('mqtt binding w/ skywalking plugin', done => { - const options: FrameworkOptions = { - target: 'test', - port: '', - sourceLocation: '', - signatureType: 'http', - printHelp: false, - context: { - ...TEST_CONTEXT, - tracing: { - enabled: true, - }, - prePlugins: ['assist'], - postPlugins: ['assist'], - }, - }; - getFunctionPlugins(process.cwd() + '/test/data').then(plugins => { - loadBuidInPlugins(options).then(() => { - const start = get(plugins!.numbers, 'oct'); - - const app = getAysncServer((ctx, data) => { - notStrictEqual(ctx.locals.traceId, null || undefined); - // Passthrough test done handler - ctx.locals.done = done; - ctx.locals.app = app; - ctx.locals.options = options; - ctx.send({some: 'payload'}); - }, options.context!); - - // First, we start the async server - app.start().then(() => { - // Then, we send a number as start value to user function - broker.publish( - { - cmd: 'publish', - topic: 'default', - payload: JSON.stringify({start}), - qos: 0, - retain: false, - dup: false, - }, - err => ifError(err) - ); - }); - }); - }); - }); - - it('skywalking plugin', async () => { - const options = { - target: 'test', - context: { - ...TEST_CONTEXT, - tracing: { - enabled: true, - }, - }, - }; - ok((await checkSkyWalkingProcess(false)) === true); - await loadBuidInPlugins(options as FrameworkOptions); - const skywalking = PluginStore.Instance(1).get(SKYWALKINGNAME); - ok(skywalking.name === SKYWALKINGNAME); - - const runtime = OpenFunctionRuntime.ProxyContext( - options.context as OpenFunctionContext - ); - await skywalking.execPreHook(runtime, {}); - const traceId = runtime.locals.traceId; - await sleep(2000); - await skywalking.execPostHook(runtime, {}); - console.log(traceId); - const response = query(traceId, OapServer); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const data = (await (await response).json()) as any; - console.log(data); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let target: unknown | any = null; - for (const item of data.data.trace.spans) { - console.log(item.serviceCode); - if (item.endpointName === `/${options.target}`) { - target = item; - } - } - notStrictEqual(target, null); - deepStrictEqual(target.endpointName, `/${options.target}`); - - for (const tag in target.tags) { - if (tag === 'RuntimeType') { - ok(target.tags[tag] === options.context.runtime); - } - } - }); -}); diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts index 9517cb88..bb7b864e 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -8,12 +8,15 @@ import {cloneDeep, forEach, get, set} from 'lodash'; import {PluginStore} from '../../src/openfunction/plugin'; import {OpenFunctionRuntime} from '../../src/functions'; import {getServer} from '../../src/server'; -import {getFunctionPlugins} from '../../src/loader'; +import {getFunctionPlugins, getBuiltinPlugins} from '../../src/loader'; import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; import {Context, Payload} from '../data/mock'; -const TEST_CONTEXT = Context.KnativeBase; +const TEST_CONTEXT = { + ...Context.KnativeBase, + pluginsTracing: Context.TracerPluginBase, +}; const TEST_PAYLOAD = Payload.Plain.RAW; describe('OpenFunction - HTTP Binding', () => { @@ -23,26 +26,35 @@ describe('OpenFunction - HTTP Binding', () => { if (shell.exec('dapr', {silent: true}).code !== 0) throw new Error('Please ensure "dapr" is installed'); + if (shell.exec('docker', {silent: true}).code !== 0) + throw new Error('Please ensure "docker" is installed'); + + // Try to start up skywalking oap server docker container + shell.exec( + 'docker run --name oap --rm -d -p 11800:11800 -p 12800:12800 apache/skywalking-oap-server:9.2.0', + {silent: true} + ); + // Try to run Dapr sidecar on port 3500 with components for testing shell.exec( `dapr run -H 3500 -G 50001 -d ./test/data/components/http -a ${APPID}`, - { - silent: true, - async: true, - } + {silent: true, async: true} ); - getFunctionPlugins(process.cwd() + '/test/data').then(() => { - // Wait 5 seconds for dapr sidecar to start - setTimeout(done, 5000); - }); + getFunctionPlugins(process.cwd() + '/test/data') + .then(() => getBuiltinPlugins(TEST_CONTEXT)) + .then(() => { + // FIXME: NEED wait quite a lot of time for oap server and dapr sidecar to bootup + setTimeout(done, 30 * 1000); + }); }); after(() => { + // Stop skywalking oap server container + shell.exec('docker stop oap', {silent: true}); + // Stop dapr sidecar process - shell.exec(`dapr stop ${APPID}`, { - silent: true, - }); + shell.exec(`dapr stop ${APPID}`, {silent: true}); }); beforeEach(() => { @@ -54,16 +66,18 @@ describe('OpenFunction - HTTP Binding', () => { }); const testData = [ + {name: 'Error data', operation: '', listable: false}, {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 => { + for (const test of testData) { it(test.name, async () => { const context = cloneDeep(TEST_CONTEXT); context.prePlugins = context.postPlugins = ['ticktock']; + context.postPlugins.push('sky-pathfinder'); + forEach(context.outputs, output => set(output, 'operation', test.operation) ); @@ -73,6 +87,8 @@ describe('OpenFunction - HTTP Binding', () => { if (!test.operation) throw new Error('I crashed'); await ctx.send(data); + + // FIXME: This makes server respond right away, even before post hooks ctx.res?.send(data); }, 'openfunction', @@ -83,18 +99,31 @@ describe('OpenFunction - HTTP Binding', () => { .post('/') .send(TEST_PAYLOAD) .expect(test.operation ? 200 : 500) - .expect(res => { - const tick = get(PluginStore.Instance().get('ticktock'), 'value'); + // Assert HTTP response first + .then(res => { if (!test.operation) { deepStrictEqual( res.headers[FUNCTION_STATUS_HEADER_FIELD.toLowerCase()], 'error' ); - deepStrictEqual(tick, 1); } else { deepStrictEqual(res.body, TEST_PAYLOAD); - deepStrictEqual(tick, 0); } + }) + // Wait a few seconds for post hooks execution to complete + .then(() => new Promise(r => setTimeout(r, 2000))) + // Then assert user defined hooks are executed + .then(() => { + const tick = get(PluginStore.Instance().get('ticktock'), 'value'); + deepStrictEqual(tick, 0); + }) + .then(() => { + const sky = PluginStore.Instance().get('sky-pathfinder'); + const span = get(sky, 'span'); + + deepStrictEqual(get(span, 'component'), 'OpenFunction'); + deepStrictEqual(get(span, 'layer'), 'FAAS'); + deepStrictEqual(get(span, 'isError'), !test.operation); }); forEach(context.outputs, output => { @@ -102,5 +131,5 @@ describe('OpenFunction - HTTP Binding', () => { deepStrictEqual(listable, test.listable); }); }); - }); + } }); From f612cbe2439267c7cf9f8b3e9c96ab0e7650255c Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 8 Oct 2022 17:35:11 +0800 Subject: [PATCH 081/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20refactor=20s?= =?UTF-8?q?kywalking=20related=20steps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/workflows/unit.yml | 44 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index e54221f2..8169a5d9 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -12,35 +12,35 @@ jobs: dapr-version: [1.6.3, 1.7.4, 1.8.3] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} + steps: - name: Checkout uses: actions/checkout@v3 + + - name: Install Docker + uses: docker-practice/actions-setup-docker@master + + - name: Install SkyWalking + run: docker pull apache/skywalking-oap-server:9.2.0 + + - name: Install Dapr CLI + uses: dapr/setup-dapr@v1 + with: + version: '1.8.1' + + - name: Initialize Dapr Runtime + run: dapr init -s --runtime-version ${{ matrix.dapr-version }} + - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - name: Install Dapr - uses: dapr/setup-dapr@v1 - with: - version: '1.8.0' - - name: Install Docker for macOS - uses: docker-practice/actions-setup-docker@master - if: ${{ matrix.platform == 'macos-latest' }} - - name: Install Docker for ubuntu - uses: docker-practice/actions-setup-docker@master - if: ${{ matrix.platform == 'ubuntu-latest' }} - - name: Install skywalking and wait for it start - run: | - docker version - docker pull apache/skywalking-oap-server:8.4.0-es6 - docker run -d --name oap -p 12800:12800 -p 11800:11800 apache/skywalking-oap-server:8.4.0-es6 - docker ps - sleep 20s - - name: Initialize Dapr - run: dapr init -s --runtime-version ${{ matrix.dapr-version }} - - name: Install dependencies + + - name: Install Project Dependencies run: npm install - - name: Build TypeScript project + + - name: Build TypeScript Project run: npm run build --if-present - - name: Test + + - name: Run Tests run: npm test From b12d72baf42e15e4e3f2d757adf18672c10ea910 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 8 Oct 2022 18:02:59 +0800 Subject: [PATCH 082/131] =?UTF-8?q?=E2=AC=87=EF=B8=8F=20chore(deps):=20bum?= =?UTF-8?q?p=20dapr-js=202.4.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 40 ++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index a90e9dc4..882d8e20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.5.0", "license": "Apache-2.0", "dependencies": { - "@dapr/dapr": "2.3.1", + "@dapr/dapr": "2.4.2", "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", @@ -114,12 +114,14 @@ } }, "node_modules/@dapr/dapr": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.1.tgz", - "integrity": "sha512-qg0GmXNVmzFPEcoMRrGQQT3s8W/HPKBPv97woSCQNX+uPqzJYIxxIctbAXdzUXHUkeFG97kRJ6ghCzC2q48hRQ==", + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.4.2.tgz", + "integrity": "sha512-endzTSAOHkiPTPj3sb7l9QeZp6Wd6pZGb1qzJMDgD2o9r8zzUX1LqCsKTo+97bM6+Gda90ZXzcUZEWLWvH8QVw==", "dependencies": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", + "@types/google-protobuf": "^3.15.5", + "@types/node-fetch": "^2.5.8", "body-parser": "^1.19.0", "google-protobuf": "^3.18.0", "http-terminator": "^3.0.4", @@ -608,8 +610,7 @@ "node_modules/@types/google-protobuf": { "version": "3.15.6", "resolved": "https://registry.npmmirror.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", - "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", - "dev": true + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==" }, "node_modules/@types/json-schema": { "version": "7.0.9", @@ -667,7 +668,6 @@ "version": "2.6.2", "resolved": "https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.2.tgz", "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -677,7 +677,6 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1204,8 +1203,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.5", @@ -1585,7 +1583,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1996,7 +1993,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -7175,12 +7171,14 @@ } }, "@dapr/dapr": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.3.1.tgz", - "integrity": "sha512-qg0GmXNVmzFPEcoMRrGQQT3s8W/HPKBPv97woSCQNX+uPqzJYIxxIctbAXdzUXHUkeFG97kRJ6ghCzC2q48hRQ==", + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.4.2.tgz", + "integrity": "sha512-endzTSAOHkiPTPj3sb7l9QeZp6Wd6pZGb1qzJMDgD2o9r8zzUX1LqCsKTo+97bM6+Gda90ZXzcUZEWLWvH8QVw==", "requires": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", + "@types/google-protobuf": "^3.15.5", + "@types/node-fetch": "^2.5.8", "body-parser": "^1.19.0", "google-protobuf": "^3.18.0", "http-terminator": "^3.0.4", @@ -7646,8 +7644,7 @@ "@types/google-protobuf": { "version": "3.15.6", "resolved": "https://registry.npmmirror.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", - "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", - "dev": true + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==" }, "@types/json-schema": { "version": "7.0.9", @@ -7705,7 +7702,6 @@ "version": "2.6.2", "resolved": "https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.2.tgz", "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, "requires": { "@types/node": "*", "form-data": "^3.0.0" @@ -7715,7 +7711,6 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8099,8 +8094,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "available-typed-arrays": { "version": "1.0.5", @@ -8414,7 +8408,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -8733,8 +8726,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "2.0.0", diff --git a/package.json b/package.json index ac42fefa..4209c1a0 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "./testing": "./build/src/testing.js" }, "dependencies": { - "@dapr/dapr": "2.3.1", + "@dapr/dapr": "2.4.2", "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", From 9665460ac7f8adba118b9df260f4cad5c07918a1 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 8 Oct 2022 21:24:02 +0800 Subject: [PATCH 083/131] =?UTF-8?q?=F0=9F=93=9D=20docs(CHANGELOG):=20log?= =?UTF-8?q?=200.6.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- CHANGELOG.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0914ad38..cb1efcdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,22 +4,39 @@ [1]: https://www.npmjs.com/package/@openfunction/functions-framework?activeTab=versions +## 0.6.0 / 2022-10-08 + +We are pleased to bring up two amazing features in this release: a plugin system and a built-in SkyWalking tracing plugin. + +The plugin system was introduced along with OpenFunction Framework 0.6.0 (see this [proposal](https://github.com/OpenFunction/OpenFunction/blob/main/docs/proposals/202112-functions-framework-refactoring.md) for reference) and supported by Go Functions Framework starting from 0.3.0. Node.js Functions Framework similarly supports the plugin mechanism and provides an easier way to bootstrap the plugin. + +- Node.js Plugin Sample: To be drafted + - Plugins for testing: +- Go Plugin Sample: + +OpenFunction Framework 0.6.0 also [proposed](https://github.com/OpenFunction/OpenFunction/blob/main/docs/proposals/202112-support-function-tracing.md) tracing capacity to make function calls observable. By leveraging the plugin system, we implemented the SkyWalking plugin within the functions framework to provide samples for both tracing and plugin systems. + +- Tutorial: [How to enable the SkyWalking plugin in OpenFunction](https://openfunction.dev/docs/best-practices/skywalking-solution-for-openfunction/) +- SkyWalking Plugin: + +Lastly, we also enabled gracefully shutdown of function on `SIGINT` & `SIGTERM` signals, which helps to avoid losing the request or event when the function rolls out or scales down. + ## 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: +Check the demo of the HTTP request triggering the 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. +This feature release officially 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. -- Aysnc Function Quickstart: +- Async Function Quickstart: - Async Function Samples: ## 0.3.6 / 2022-03-07 From 5bdf64a027613786b2110cffdf9e1b93e31fd2d8 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Sat, 8 Oct 2022 21:29:30 +0800 Subject: [PATCH 084/131] =?UTF-8?q?=F0=9F=94=96=20chore:=20bump=200.6.0=20?= =?UTF-8?q?[no=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 882d8e20..4b224bde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@openfunction/functions-framework", - "version": "0.5.0", + "version": "0.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@openfunction/functions-framework", - "version": "0.5.0", + "version": "0.6.0", "license": "Apache-2.0", "dependencies": { "@dapr/dapr": "2.4.2", diff --git a/package.json b/package.json index 4209c1a0..ce5bff57 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@openfunction/functions-framework", - "version": "0.5.0", + "version": "0.6.0", "description": "FaaS (Function as a service) framework for writing portable Node.js functions", "engines": { "node": ">=13.0.0" From aafb49cebac2f43ac04226b8bfda62a6323df21b Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 13 Oct 2022 15:54:33 +0800 Subject: [PATCH 085/131] =?UTF-8?q?=E2=9C=A8=20feat(dapr):=20choose=20side?= =?UTF-8?q?car=20by=20`DAPR=5FHOST`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- src/openfunction/async_server.ts | 2 +- src/openfunction/runtime.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openfunction/async_server.ts b/src/openfunction/async_server.ts index 2241010e..9e80664a 100644 --- a/src/openfunction/async_server.ts +++ b/src/openfunction/async_server.ts @@ -20,7 +20,7 @@ export default function ( context: OpenFunctionContext ): AsyncFunctionServer { // Initailize Dapr server - const app = new DaprServer('localhost', context.port); + const app = new DaprServer('127.0.0.1', context.port, process.env.DAPR_HOST); // Create wrapper for user function const wrapper = OpenFunctionRuntime.WrapUserFunction(userFunction, context); diff --git a/src/openfunction/runtime.ts b/src/openfunction/runtime.ts index 22a8ab4d..3b467ed6 100644 --- a/src/openfunction/runtime.ts +++ b/src/openfunction/runtime.ts @@ -206,7 +206,7 @@ class DaprRuntime extends OpenFunctionRuntime { * TODO: Should determine whether to use GRPC channel */ this.daprClient = new DaprClient( - undefined, + process.env.DAPR_HOST, this.sidecarPort.HTTP, CommunicationProtocolEnum.HTTP ); From 8a1c91404cc1758224644c1e32b8d5f304676530 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Mon, 17 Oct 2022 17:16:42 +0800 Subject: [PATCH 086/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20bump=20dapr?= =?UTF-8?q?=201.9.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/workflows/unit.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index 8169a5d9..bfac4a67 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - dapr-version: [1.6.3, 1.7.4, 1.8.3] + dapr-version: [1.6.3, 1.7.4, 1.8.3, 1.9.0] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} @@ -26,7 +26,7 @@ jobs: - name: Install Dapr CLI uses: dapr/setup-dapr@v1 with: - version: '1.8.1' + version: '1.9.1' - name: Initialize Dapr Runtime run: dapr init -s --runtime-version ${{ matrix.dapr-version }} From 7849862b2f4784949c097db3d9cd6278c5ec9e65 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Mon, 17 Oct 2022 17:41:48 +0800 Subject: [PATCH 087/131] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20test(async):=20ski?= =?UTF-8?q?p=20unstable=20cron=20case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- test/integration/async_server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index c70491d7..1c568cf4 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -42,7 +42,7 @@ describe('OpenFunction - Async', () => { broker.close(done); }); - it('stop cron after first trigger recived', done => { + it.skip('stop cron after first trigger recived', done => { const app = getAysncServer( (ctx, data) => { // Assert that user function receives data from input binding From 0bc87c15a69597f4c544a30c5098ffd11d6691cd Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 3 Nov 2022 19:08:13 +0800 Subject: [PATCH 088/131] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore(deps):=20bum?= =?UTF-8?q?p=20dapr-js=202.5.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b224bde..dfc1ed36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.6.0", "license": "Apache-2.0", "dependencies": { - "@dapr/dapr": "2.4.2", + "@dapr/dapr": "2.5.0", "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", @@ -114,18 +114,18 @@ } }, "node_modules/@dapr/dapr": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.4.2.tgz", - "integrity": "sha512-endzTSAOHkiPTPj3sb7l9QeZp6Wd6pZGb1qzJMDgD2o9r8zzUX1LqCsKTo+97bM6+Gda90ZXzcUZEWLWvH8QVw==", + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.5.0.tgz", + "integrity": "sha512-MchplTQiCQaiPD8b4NXFZleXGS77LfvvyeGDnJvnfdLvkE7BqFMDY04GLgO+RMcP4ufm5zg7LPQDNMJWInzXmQ==", "dependencies": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", "@types/google-protobuf": "^3.15.5", - "@types/node-fetch": "^2.5.8", + "@types/node-fetch": "^2.6.2", "body-parser": "^1.19.0", "google-protobuf": "^3.18.0", "http-terminator": "^3.0.4", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "restana": "^4.9.1", "uuid": "^8.3.2" } @@ -7171,18 +7171,18 @@ } }, "@dapr/dapr": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.4.2.tgz", - "integrity": "sha512-endzTSAOHkiPTPj3sb7l9QeZp6Wd6pZGb1qzJMDgD2o9r8zzUX1LqCsKTo+97bM6+Gda90ZXzcUZEWLWvH8QVw==", + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@dapr/dapr/-/dapr-2.5.0.tgz", + "integrity": "sha512-MchplTQiCQaiPD8b4NXFZleXGS77LfvvyeGDnJvnfdLvkE7BqFMDY04GLgO+RMcP4ufm5zg7LPQDNMJWInzXmQ==", "requires": { "@grpc/grpc-js": "^1.3.7", "@js-temporal/polyfill": "^0.3.0", "@types/google-protobuf": "^3.15.5", - "@types/node-fetch": "^2.5.8", + "@types/node-fetch": "^2.6.2", "body-parser": "^1.19.0", "google-protobuf": "^3.18.0", "http-terminator": "^3.0.4", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "restana": "^4.9.1", "uuid": "^8.3.2" } diff --git a/package.json b/package.json index ce5bff57..30d89a6d 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "./testing": "./build/src/testing.js" }, "dependencies": { - "@dapr/dapr": "2.4.2", + "@dapr/dapr": "2.5.0", "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", From 9b1f9065c0f9abf1a845807d5bbe5e0723dac0ef Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 3 Nov 2022 22:46:14 +0800 Subject: [PATCH 089/131] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore:=20update=20?= =?UTF-8?q?deps=20and=20deps-dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- package-lock.json | 242 +++++------------- package.json | 14 +- src/openfunction/plugin.ts | 4 +- .../plugins/tracing/skywalking.ts | 4 +- test/integration/async_server.ts | 4 +- test/plugin.ts | 2 +- 6 files changed, 83 insertions(+), 187 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfc1ed36..3a683a67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,11 @@ "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", - "express": "^4.18.1", + "express": "^4.18.2", "express-interceptor": "^1.2.0", "http-terminator": "^3.2.0", "lodash": "^4.17.21", - "minimist": "^1.2.6", + "minimist": "^1.2.7", "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", @@ -33,29 +33,29 @@ "@types/debug": "^4.1.7", "@types/express": "4.17.14", "@types/google-protobuf": "^3.15.6", - "@types/lodash": "^4.14.186", + "@types/lodash": "^4.14.187", "@types/minimist": "1.2.2", "@types/mocha": "10.0.0", "@types/node": "14.18.11", "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", - "@types/semver": "^7.3.12", + "@types/semver": "^7.3.13", "@types/shelljs": "^0.8.11", "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", "aedes": "0.47.0", "clean-pkg-json": "^1.2.0", - "concurrently": "^7.4.0", + "concurrently": "^7.5.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "graphql-request": "^5.0.0", "gts": "^3.1.1", - "mocha": "10.0.0", + "mocha": "10.1.0", "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.4", "shelljs": "^0.8.5", "sinon": "^14.0.1", - "supertest": "6.3.0", + "supertest": "6.3.1", "typescript": "^4.8.4", "wait-on": "^6.0.1" }, @@ -619,9 +619,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.186", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.186.tgz", - "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", + "version": "4.14.187", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.187.tgz", + "integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==", "dev": true }, "node_modules/@types/long": { @@ -713,9 +713,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "version": "7.3.13", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "node_modules/@types/serve-static": { @@ -929,12 +929,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "node_modules/0http": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/0http/-/0http-3.2.0.tgz", @@ -1292,17 +1286,6 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - } - }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", @@ -1655,9 +1638,9 @@ } }, "node_modules/concurrently": { - "version": "7.4.0", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.4.0.tgz", - "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", + "version": "7.5.0", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.5.0.tgz", + "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -2682,13 +2665,13 @@ } }, "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -2707,7 +2690,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -2743,29 +2726,6 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "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", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", @@ -4592,9 +4552,9 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -4648,12 +4608,11 @@ } }, "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -4682,10 +4641,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/argparse": { @@ -5522,17 +5477,14 @@ } }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/queue-microtask": { @@ -6364,10 +6316,9 @@ } }, "node_modules/superagent": { - "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/superagent/-/superagent-8.0.2.tgz", - "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", - "deprecated": "Please use v8.0.0 until https://github.com/visionmedia/superagent/issues/1743 is resolved", + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/superagent/-/superagent-8.0.3.tgz", + "integrity": "sha512-oBC+aNsCjzzjmO5AOPBPFS+Z7HPzlx+DQr/aHwM08kI+R24gsDmAS1LMfza1fK+P+SKlTAoNZpOvooE/pRO1HA==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -6379,7 +6330,7 @@ "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", - "semver": "^7.3.7" + "semver": "^7.3.8" }, "engines": { "node": ">=6.4.0 <13 || >=14" @@ -6397,26 +6348,14 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - } - }, "node_modules/supertest": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/supertest/-/supertest-6.3.0.tgz", - "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/supertest/-/supertest-6.3.1.tgz", + "integrity": "sha512-hRohNeIfk/cA48Cxpa/w48hktP6ZaRqXb0QV5rLvW0C7paRsBU3Q5zydzYrslOJtj/gd48qx540jKtcs6vG1fQ==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^8.0.0" + "superagent": "^8.0.3" }, "engines": { "node": ">=6.4.0" @@ -7653,9 +7592,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.186", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.186.tgz", - "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", + "version": "4.14.187", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.187.tgz", + "integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==", "dev": true }, "@types/long": { @@ -7746,9 +7685,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "version": "7.3.13", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "@types/serve-static": { @@ -7888,12 +7827,6 @@ "eslint-visitor-keys": "^2.0.0" } }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "0http": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/0http/-/0http-3.2.0.tgz", @@ -8166,14 +8099,6 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } } } }, @@ -8476,9 +8401,9 @@ } }, "concurrently": { - "version": "7.4.0", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.4.0.tgz", - "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", + "version": "7.5.0", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.5.0.tgz", + "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -9224,13 +9149,13 @@ } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -9249,7 +9174,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -9261,25 +9186,6 @@ "vary": "~1.1.2" }, "dependencies": { - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", @@ -10658,9 +10564,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "minimist-options": { "version": "4.1.0", @@ -10702,12 +10608,11 @@ } }, "mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -11358,9 +11263,9 @@ "dev": true }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } @@ -11997,9 +11902,9 @@ "dev": true }, "superagent": { - "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/superagent/-/superagent-8.0.2.tgz", - "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/superagent/-/superagent-8.0.3.tgz", + "integrity": "sha512-oBC+aNsCjzzjmO5AOPBPFS+Z7HPzlx+DQr/aHwM08kI+R24gsDmAS1LMfza1fK+P+SKlTAoNZpOvooE/pRO1HA==", "dev": true, "requires": { "component-emitter": "^1.3.0", @@ -12011,7 +11916,7 @@ "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", - "semver": "^7.3.7" + "semver": "^7.3.8" }, "dependencies": { "mime": { @@ -12019,26 +11924,17 @@ "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } } } }, "supertest": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/supertest/-/supertest-6.3.0.tgz", - "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/supertest/-/supertest-6.3.1.tgz", + "integrity": "sha512-hRohNeIfk/cA48Cxpa/w48hktP6ZaRqXb0QV5rLvW0C7paRsBU3Q5zydzYrslOJtj/gd48qx540jKtcs6vG1fQ==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^8.0.0" + "superagent": "^8.0.3" } }, "supports-color": { diff --git a/package.json b/package.json index 30d89a6d..b13e63a5 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ "body-parser": "^1.20.1", "cloudevents": "^6.0.2", "debug": "^4.3.4", - "express": "^4.18.1", + "express": "^4.18.2", "express-interceptor": "^1.2.0", "http-terminator": "^3.2.0", "lodash": "^4.17.21", - "minimist": "^1.2.6", + "minimist": "^1.2.7", "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", @@ -60,29 +60,29 @@ "@types/debug": "^4.1.7", "@types/express": "4.17.14", "@types/google-protobuf": "^3.15.6", - "@types/lodash": "^4.14.186", + "@types/lodash": "^4.14.187", "@types/minimist": "1.2.2", "@types/mocha": "10.0.0", "@types/node": "14.18.11", "@types/node-fetch": "^2.6.2", "@types/on-finished": "2.3.1", - "@types/semver": "^7.3.12", + "@types/semver": "^7.3.13", "@types/shelljs": "^0.8.11", "@types/sinon": "10.0.11", "@types/supertest": "2.0.12", "aedes": "0.47.0", "clean-pkg-json": "^1.2.0", - "concurrently": "^7.4.0", + "concurrently": "^7.5.0", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "graphql-request": "^5.0.0", "gts": "^3.1.1", - "mocha": "10.0.0", + "mocha": "10.1.0", "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.4", "shelljs": "^0.8.5", "sinon": "^14.0.1", - "supertest": "6.3.0", + "supertest": "6.3.1", "typescript": "^4.8.4", "wait-on": "^6.0.1" } diff --git a/src/openfunction/plugin.ts b/src/openfunction/plugin.ts index 7637b875..25d4096e 100644 --- a/src/openfunction/plugin.ts +++ b/src/openfunction/plugin.ts @@ -176,7 +176,7 @@ export class PluginStore { await this.#invokePluginBySeq( ctx, 'execPreHook', - seq || (this.#isCustomStore && get(ctx, 'prePlugins')) + seq || (this.#isCustomStore && get(ctx, 'prePlugins')) || [] ); } @@ -189,7 +189,7 @@ export class PluginStore { await this.#invokePluginBySeq( ctx, 'execPostHook', - seq || (this.#isCustomStore && get(ctx, 'postPlugins')) + seq || (this.#isCustomStore && get(ctx, 'postPlugins')) || [] ); } diff --git a/src/openfunction/plugins/tracing/skywalking.ts b/src/openfunction/plugins/tracing/skywalking.ts index 32a1baaa..f5d1b872 100644 --- a/src/openfunction/plugins/tracing/skywalking.ts +++ b/src/openfunction/plugins/tracing/skywalking.ts @@ -42,14 +42,14 @@ export default class SkyWalking extends Tracing { ContextManager.currentSpan ?? context.newEntrySpan('/', this.#getCarrier(ctx)); - span.operation = get(ctx, 'name'); + span.operation = get(ctx, 'name')!; span.component = this.#component; span.layer = SpanLayer.FAAS; // Pass through some typical tags per the context span.tag({ key: 'runtime', - val: get(ctx, 'runtime'), + val: get(ctx, 'runtime')!, overridable: false, }); diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index 1c568cf4..74534563 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -109,7 +109,7 @@ describe('OpenFunction - Async', () => { // Then forward received data to output channel const output = 'mqtt_pub'; broker.subscribe( - get(TEST_CONTEXT, `outputs.${output}.uri`), + get(TEST_CONTEXT, `outputs.${output}.uri`)!, // eslint-disable-next-line @typescript-eslint/no-unused-vars (packet, _) => { const payload = JSON.parse(Buffer.from(packet.payload).toString()); @@ -153,7 +153,7 @@ describe('OpenFunction - Async', () => { // Set local data for post hook plugin ctx.locals.start = start; - ctx.locals.end = -start; + ctx.locals.end = -start!; // Passthrough test done handler ctx.locals.done = done; diff --git a/test/plugin.ts b/test/plugin.ts index 000bd46c..78fdb117 100644 --- a/test/plugin.ts +++ b/test/plugin.ts @@ -46,7 +46,7 @@ describe('Store for custom and builtin plugins', () => { it('ensures the sequence of long running async plugins', async () => { customs.register(new Concater()); - const size = random(0, 9); + const size = random(1, 9); const concater = customs.get('concater'); const seq = fill(Array(size), concater.name); From 3403d76b50b49c0ca02a59b09b4c7b32b48590c0 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 3 Nov 2022 22:48:35 +0800 Subject: [PATCH 090/131] =?UTF-8?q?=F0=9F=93=9D=20docs(api):bump=20api-ext?= =?UTF-8?q?ractor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- docs/generated/api.json | 44 ++++++++++++++-- docs/generated/api.md | 3 +- package-lock.json | 114 ++++++++++++++++++---------------------- package.json | 2 +- 4 files changed, 94 insertions(+), 69 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index 9b12d3f4..f5e091fb 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,8 +1,8 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.32.0", - "schemaVersion": 1009, + "toolVersion": "7.33.5", + "schemaVersion": 1010, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", @@ -195,6 +195,7 @@ "text": ") => void" } ], + "fileUrlPath": "src/function_registry.ts", "isReadonly": true, "releaseTag": "Public", "name": "cloudEvent", @@ -221,6 +222,7 @@ "text": "> " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "typeParameters": [ { @@ -307,6 +309,7 @@ "text": "> " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "typeParameters": [ { @@ -402,6 +405,7 @@ "text": "export interface CloudFunctionsContext " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "CloudFunctionsContext", "preserveMemberOrder": false, @@ -527,6 +531,7 @@ "text": "export declare enum ComponentType " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "ComponentType", "preserveMemberOrder": false, @@ -607,6 +612,7 @@ "text": ";" } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "Context", "typeTokenRange": { @@ -624,6 +630,7 @@ "text": "export declare class ContextUtils " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "ContextUtils", "preserveMemberOrder": false, @@ -833,6 +840,7 @@ "text": "export interface Data " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "Data", "preserveMemberOrder": false, @@ -877,6 +885,7 @@ "text": "export interface EventFunction " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "EventFunction", "preserveMemberOrder": false, @@ -954,6 +963,7 @@ "text": "export interface EventFunctionWithCallback " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "EventFunctionWithCallback", "preserveMemberOrder": false, @@ -1114,6 +1124,7 @@ "text": ";" } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "HandlerFunction", "typeParameters": [ @@ -1157,6 +1168,7 @@ "text": ") => void" } ], + "fileUrlPath": "src/function_registry.ts", "isReadonly": true, "releaseTag": "Public", "name": "http", @@ -1175,6 +1187,7 @@ "text": "export interface HttpFunction " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "HttpFunction", "preserveMemberOrder": false, @@ -1253,6 +1266,7 @@ "text": "export interface HttpFunctionResponse " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "HttpFunctionResponse", "preserveMemberOrder": false, @@ -1374,6 +1388,7 @@ "text": ";" } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "LegacyCloudFunctionsContext", "typeTokenRange": { @@ -1391,6 +1406,7 @@ "text": "export interface LegacyEvent " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "LegacyEvent", "preserveMemberOrder": false, @@ -1463,6 +1479,7 @@ "text": "export interface OpenFunction " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "OpenFunction", "preserveMemberOrder": false, @@ -1553,6 +1570,7 @@ "text": ") => void" } ], + "fileUrlPath": "src/function_registry.ts", "isReadonly": true, "releaseTag": "Public", "name": "openfunction", @@ -1571,6 +1589,7 @@ "text": "export interface OpenFunctionComponent " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "OpenFunctionComponent", "preserveMemberOrder": false, @@ -1737,6 +1756,7 @@ "text": "export interface OpenFunctionContext " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "OpenFunctionContext", "preserveMemberOrder": false, @@ -2071,6 +2091,7 @@ "text": "export declare abstract class OpenFunctionRuntime " } ], + "fileUrlPath": "src/openfunction/runtime.ts", "releaseTag": "Public", "name": "OpenFunctionRuntime", "preserveMemberOrder": false, @@ -2740,6 +2761,7 @@ "text": "export declare class Plugin " } ], + "fileUrlPath": "src/openfunction/plugin.ts", "releaseTag": "Public", "name": "Plugin_2", "preserveMemberOrder": false, @@ -2985,7 +3007,16 @@ }, { "kind": "Content", - "text": "any" + "text": "string extends infer T ? T extends string ? T extends keyof this ? this[T] : T extends `${infer FieldKey}[${infer IndexKey}]` ? FieldKey extends keyof this ? import(\"lodash\")." + }, + { + "kind": "Reference", + "text": "IndexedFieldWithPossiblyUndefined", + "canonicalReference": "@types/lodash!\"\\\"../index\\\"\".IndexedFieldWithPossiblyUndefined:type" + }, + { + "kind": "Content", + "text": " : undefined : undefined : never : never" }, { "kind": "Content", @@ -2995,7 +3026,7 @@ "isStatic": false, "returnTypeTokenRange": { "startIndex": 3, - "endIndex": 4 + "endIndex": 6 }, "releaseTag": "Public", "isProtected": false, @@ -3093,6 +3124,7 @@ "text": " " } ], + "fileUrlPath": "src/functions.ts", "releaseTag": "Public", "name": "Request_2", "preserveMemberOrder": false, @@ -3143,6 +3175,7 @@ "text": "export declare enum RuntimeType " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "RuntimeType", "preserveMemberOrder": false, @@ -3201,6 +3234,7 @@ "text": "export interface TraceConfig " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "TraceConfig", "preserveMemberOrder": false, @@ -3337,6 +3371,7 @@ "text": "export interface TraceProvider " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "TraceProvider", "preserveMemberOrder": false, @@ -3453,6 +3488,7 @@ "text": "export declare enum TraceProviderType " } ], + "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", "name": "TraceProviderType", "preserveMemberOrder": false, diff --git a/docs/generated/api.md b/docs/generated/api.md index e99f057e..496a8337 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -8,6 +8,7 @@ /// import { CloudEventV1 as CloudEvent } from 'cloudevents'; +import { IndexedFieldWithPossiblyUndefined } from 'lodash'; import { ParamsDictionary } from 'express-serve-static-core'; import { ParsedQs } from 'qs'; import { Request as Request_3 } from 'express'; @@ -165,7 +166,7 @@ class Plugin_2 { constructor(name: string, version?: string); execPostHook(ctx: OpenFunctionRuntime | null, plugins: Record): Promise; execPreHook(ctx: OpenFunctionRuntime | null, plugins: Record): Promise; - get(prop: string): any; + get(prop: string): string extends infer T ? T extends string ? T extends keyof this ? this[T] : T extends `${infer FieldKey}[${infer IndexKey}]` ? FieldKey extends keyof this ? IndexedFieldWithPossiblyUndefined : undefined : undefined : never : never; readonly name: string; readonly version: string; } diff --git a/package-lock.json b/package-lock.json index 3a683a67..49fcca47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "functions-framework-nodejs": "build/src/main.js" }, "devDependencies": { - "@microsoft/api-extractor": "^7.32.0", + "@microsoft/api-extractor": "^7.33.5", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.14", @@ -251,17 +251,17 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.32.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.32.0.tgz", - "integrity": "sha512-BfvPpeVzWLFTdairVItzWQGsZr82fR4RH+8Q4I7t0f9xq66v4Qz9K+u25jbL5R42X01b/vvJMuRhX5KhU8J1Ug==", + "version": "7.33.5", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.33.5.tgz", + "integrity": "sha512-ENoWpTWarKNuodpRFDQr3jyBigHuv98KuJ8H5qXc1LZ1aP5Mk77lCo88HbPisTmSnGevJJHTScfd/DPznOb4CQ==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.24.3", - "@microsoft/tsdoc": "0.14.1", + "@microsoft/api-extractor-model": "7.25.2", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.0", - "@rushstack/rig-package": "0.3.16", - "@rushstack/ts-command-line": "4.12.4", + "@rushstack/node-core-library": "3.53.2", + "@rushstack/rig-package": "0.3.17", + "@rushstack/ts-command-line": "4.13.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -274,14 +274,14 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.24.3", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.24.3.tgz", - "integrity": "sha512-JElpLULqYDXQb0YIKKQhOJaNWBXsYeYu5J51Z4O6RGbOq7Tby9ViVfpDuXVXa87AMOSR5WKuaxG/5SnQVVNxiw==", + "version": "7.25.2", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", + "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.0" + "@rushstack/node-core-library": "3.53.2" } }, "node_modules/@microsoft/api-extractor/node_modules/resolve": { @@ -294,9 +294,9 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.14.1", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", - "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "version": "0.14.2", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { @@ -311,12 +311,6 @@ "resolve": "~1.19.0" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", @@ -417,9 +411,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { - "version": "3.53.0", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.0.tgz", - "integrity": "sha512-FXk3eDtTHKnaUq+fLyNY867ioRhMa6CJDJO5hZ3wuGlxm184nckAFiU+hx027AodjpnqjX6pYF0zZGq7k7P/vg==", + "version": "3.53.2", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.2.tgz", + "integrity": "sha512-FggLe5DQs0X9MNFeJN3/EXwb+8hyZUTEp2i+V1e8r4Va4JgkjBNY0BuEaQI+3DW6S4apV3UtXU3im17MSY00DA==", "dev": true, "dependencies": { "@types/node": "12.20.24", @@ -448,9 +442,9 @@ } }, "node_modules/@rushstack/rig-package": { - "version": "0.3.16", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.16.tgz", - "integrity": "sha512-FoSQng2RtapEUe+CBPKxbpZUhUht5s2+mMiztRH95qqp81dsUpfEWojtV6XrUVyWIRk2/cY1CDZUKJWxMrT26Q==", + "version": "0.3.17", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.17.tgz", + "integrity": "sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==", "dev": true, "dependencies": { "resolve": "~1.17.0", @@ -467,9 +461,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.12.4", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.4.tgz", - "integrity": "sha512-ckZHEfPiJCmBdWd/syve5zu2TNsPIqbFie3jWzM/izZa6ZOkDwex/K1ww+kJ12hFBnN44lMD7voJvKXajUCEDA==", + "version": "4.13.0", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", + "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -7228,17 +7222,17 @@ } }, "@microsoft/api-extractor": { - "version": "7.32.0", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.32.0.tgz", - "integrity": "sha512-BfvPpeVzWLFTdairVItzWQGsZr82fR4RH+8Q4I7t0f9xq66v4Qz9K+u25jbL5R42X01b/vvJMuRhX5KhU8J1Ug==", + "version": "7.33.5", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.33.5.tgz", + "integrity": "sha512-ENoWpTWarKNuodpRFDQr3jyBigHuv98KuJ8H5qXc1LZ1aP5Mk77lCo88HbPisTmSnGevJJHTScfd/DPznOb4CQ==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.24.3", - "@microsoft/tsdoc": "0.14.1", + "@microsoft/api-extractor-model": "7.25.2", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.0", - "@rushstack/rig-package": "0.3.16", - "@rushstack/ts-command-line": "4.12.4", + "@rushstack/node-core-library": "3.53.2", + "@rushstack/rig-package": "0.3.17", + "@rushstack/ts-command-line": "4.13.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -7259,20 +7253,20 @@ } }, "@microsoft/api-extractor-model": { - "version": "7.24.3", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.24.3.tgz", - "integrity": "sha512-JElpLULqYDXQb0YIKKQhOJaNWBXsYeYu5J51Z4O6RGbOq7Tby9ViVfpDuXVXa87AMOSR5WKuaxG/5SnQVVNxiw==", + "version": "7.25.2", + "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", + "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.0" + "@rushstack/node-core-library": "3.53.2" } }, "@microsoft/tsdoc": { - "version": "0.14.1", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", - "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "version": "0.14.2", + "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "@microsoft/tsdoc-config": { @@ -7287,12 +7281,6 @@ "resolve": "~1.19.0" }, "dependencies": { - "@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", @@ -7386,9 +7374,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@rushstack/node-core-library": { - "version": "3.53.0", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.0.tgz", - "integrity": "sha512-FXk3eDtTHKnaUq+fLyNY867ioRhMa6CJDJO5hZ3wuGlxm184nckAFiU+hx027AodjpnqjX6pYF0zZGq7k7P/vg==", + "version": "3.53.2", + "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.2.tgz", + "integrity": "sha512-FggLe5DQs0X9MNFeJN3/EXwb+8hyZUTEp2i+V1e8r4Va4JgkjBNY0BuEaQI+3DW6S4apV3UtXU3im17MSY00DA==", "dev": true, "requires": { "@types/node": "12.20.24", @@ -7419,9 +7407,9 @@ } }, "@rushstack/rig-package": { - "version": "0.3.16", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.16.tgz", - "integrity": "sha512-FoSQng2RtapEUe+CBPKxbpZUhUht5s2+mMiztRH95qqp81dsUpfEWojtV6XrUVyWIRk2/cY1CDZUKJWxMrT26Q==", + "version": "0.3.17", + "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.17.tgz", + "integrity": "sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==", "dev": true, "requires": { "resolve": "~1.17.0", @@ -7440,9 +7428,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.12.4", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.12.4.tgz", - "integrity": "sha512-ckZHEfPiJCmBdWd/syve5zu2TNsPIqbFie3jWzM/izZa6ZOkDwex/K1ww+kJ12hFBnN44lMD7voJvKXajUCEDA==", + "version": "4.13.0", + "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", + "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", "dev": true, "requires": { "@types/argparse": "1.0.38", diff --git a/package.json b/package.json index b13e63a5..28842b52 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "author": "OpenFunction", "license": "Apache-2.0", "devDependencies": { - "@microsoft/api-extractor": "^7.32.0", + "@microsoft/api-extractor": "^7.33.5", "@types/body-parser": "1.19.2", "@types/debug": "^4.1.7", "@types/express": "4.17.14", From 16bdd517fcf6dc8ce76f2026f702b26fe9d7d7e7 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 3 Nov 2022 22:49:05 +0800 Subject: [PATCH 091/131] =?UTF-8?q?=F0=9F=91=B7=20ci(unit):=20bump=20dapr?= =?UTF-8?q?=201.9.2?= 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 bfac4a67..8129cfef 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - dapr-version: [1.6.3, 1.7.4, 1.8.3, 1.9.0] + dapr-version: [1.6.3, 1.7.4, 1.8.3, 1.9.2] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} From b3367c680b9f96898391bf80d90f9556f15792f1 Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 3 Nov 2022 23:11:15 +0800 Subject: [PATCH 092/131] =?UTF-8?q?=F0=9F=94=96=20chore:=20bump=200.6.1=20?= =?UTF-8?q?[no=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 49fcca47..494806cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@openfunction/functions-framework", - "version": "0.6.0", + "version": "0.6.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@openfunction/functions-framework", - "version": "0.6.0", + "version": "0.6.1", "license": "Apache-2.0", "dependencies": { "@dapr/dapr": "2.5.0", diff --git a/package.json b/package.json index 28842b52..97e76c97 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@openfunction/functions-framework", - "version": "0.6.0", + "version": "0.6.1", "description": "FaaS (Function as a service) framework for writing portable Node.js functions", "engines": { "node": ">=13.0.0" From 66418705912fd2bb32eb801c3445a18e14778b5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 03:37:42 +0000 Subject: [PATCH 093/131] chore(deps-dev): bump concurrently from 7.5.0 to 7.6.0 Bumps [concurrently](https://github.com/open-cli-tools/concurrently) from 7.5.0 to 7.6.0. - [Release notes](https://github.com/open-cli-tools/concurrently/releases) - [Commits](https://github.com/open-cli-tools/concurrently/compare/v7.5.0...v7.6.0) --- updated-dependencies: - dependency-name: concurrently dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 494806cb..283e0991 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1632,9 +1632,9 @@ } }, "node_modules/concurrently": { - "version": "7.5.0", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.5.0.tgz", - "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -1653,6 +1653,9 @@ }, "engines": { "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, "node_modules/concurrently/node_modules/ansi-styles": { @@ -8389,9 +8392,9 @@ } }, "concurrently": { - "version": "7.5.0", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-7.5.0.tgz", - "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", "dev": true, "requires": { "chalk": "^4.1.0", From 852953c339d32212a6985e29c941fa1376f11163 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Nov 2022 03:09:40 +0000 Subject: [PATCH 094/131] chore(deps-dev): bump sinon from 14.0.1 to 15.0.0 Bumps [sinon](https://github.com/sinonjs/sinon) from 14.0.1 to 15.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/v14.0.1...v15.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 | 134 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 90 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 494806cb..a9a7a2c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.4", "shelljs": "^0.8.5", - "sinon": "^14.0.1", + "sinon": "^15.0.0", "supertest": "6.3.1", "typescript": "^4.8.4", "wait-on": "^6.0.1" @@ -494,9 +494,9 @@ "dev": true }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "dependencies": { "type-detect": "4.0.8" @@ -511,21 +511,30 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.6.0", + "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, "node_modules/@types/argparse": { @@ -4076,7 +4085,7 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "node_modules/isexe": { @@ -4868,13 +4877,13 @@ } }, "node_modules/nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", + "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^7.0.4", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -5990,17 +5999,21 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { - "version": "14.0.1", - "resolved": "https://registry.npmmirror.com/sinon/-/sinon-14.0.1.tgz", - "integrity": "sha512-JhJ0jCiyBWVAHDS+YSjgEbDn7Wgz9iIjA1/RK+eseJN0vAAWIWiXBdrnb92ELPyjsfreCYntD1ORtLSfIrlvSQ==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.0.tgz", + "integrity": "sha512-pV97G1GbslaSJoSdy2F2z8uh5F+uPGp3ddOzA4JsBOUBLEQRz2OAqlKGRFTSh2KiqUCmHkzyAeu7R4x1Hx0wwg==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.8.3", + "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", + "@sinonjs/samsam": "^7.0.1", "diff": "^5.0.0", - "nise": "^5.1.1", + "nise": "^5.1.2", "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, "node_modules/sinon/node_modules/@sinonjs/fake-timers": { @@ -6012,6 +6025,15 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/sinon/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7461,9 +7483,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -7476,23 +7498,34 @@ "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } } }, "@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.6.0", + "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, "@types/argparse": { @@ -10183,7 +10216,7 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "isexe": { @@ -10793,13 +10826,13 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", + "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^7.0.4", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -11637,16 +11670,16 @@ } }, "sinon": { - "version": "14.0.1", - "resolved": "https://registry.npmmirror.com/sinon/-/sinon-14.0.1.tgz", - "integrity": "sha512-JhJ0jCiyBWVAHDS+YSjgEbDn7Wgz9iIjA1/RK+eseJN0vAAWIWiXBdrnb92ELPyjsfreCYntD1ORtLSfIrlvSQ==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.0.tgz", + "integrity": "sha512-pV97G1GbslaSJoSdy2F2z8uh5F+uPGp3ddOzA4JsBOUBLEQRz2OAqlKGRFTSh2KiqUCmHkzyAeu7R4x1Hx0wwg==", "dev": true, "requires": { - "@sinonjs/commons": "^1.8.3", + "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", + "@sinonjs/samsam": "^7.0.1", "diff": "^5.0.0", - "nise": "^5.1.1", + "nise": "^5.1.2", "supports-color": "^7.2.0" }, "dependencies": { @@ -11657,6 +11690,17 @@ "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } } }, "has-flag": { diff --git a/package.json b/package.json index 97e76c97..01def85c 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.4", "shelljs": "^0.8.5", - "sinon": "^14.0.1", + "sinon": "^15.0.0", "supertest": "6.3.1", "typescript": "^4.8.4", "wait-on": "^6.0.1" From 17158c842281211cdbc58030f169418b9c2da54e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 09:46:21 +0000 Subject: [PATCH 095/131] chore(deps): bump minimatch from 3.0.4 to 3.1.2 Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... 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 283e0991..83498b22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4537,9 +4537,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -10546,9 +10546,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" From 26479e57ad99d35dfa22fbc8a88d7016b453663d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 19:41:51 +0000 Subject: [PATCH 096/131] chore(deps): bump qs and formidable Bumps [qs](https://github.com/ljharb/qs) and [formidable](https://github.com/node-formidable/formidable). These dependencies needed to be updated together. Updates `qs` from 6.9.3 to 6.11.0 - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.9.3...v6.11.0) Updates `formidable` from 2.0.1 to 2.1.1 - [Release notes](https://github.com/node-formidable/formidable/releases) - [Changelog](https://github.com/node-formidable/formidable/blob/master/CHANGELOG.md) - [Commits](https://github.com/node-formidable/formidable/commits) --- updated-dependencies: - dependency-name: qs dependency-type: indirect - dependency-name: formidable dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 64 ++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68b21f1d..16f88477 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1179,7 +1179,7 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, @@ -2004,9 +2004,9 @@ } }, "node_modules/dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "dependencies": { "asap": "^2.0.0", @@ -3045,24 +3045,18 @@ } }, "node_modules/formidable": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/formidable/-/formidable-2.0.1.tgz", - "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", "dev": true, "dependencies": { - "dezalgo": "1.0.3", - "hexoid": "1.0.0", - "once": "1.4.0", - "qs": "6.9.3" - } - }, - "node_modules/formidable/node_modules/qs": { - "version": "6.9.3", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", - "dev": true, - "engines": { - "node": ">=0.6" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, "node_modules/forwarded": { @@ -8033,7 +8027,7 @@ }, "asap": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, @@ -8688,9 +8682,9 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "requires": { "asap": "^2.0.0", @@ -9483,23 +9477,15 @@ } }, "formidable": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/formidable/-/formidable-2.0.1.tgz", - "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", "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.npmmirror.com/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", - "dev": true - } + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" } }, "forwarded": { From 2defb2fa40d871f8998ea4d2af3e0564ec7cd236 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Dec 2022 03:24:29 +0000 Subject: [PATCH 097/131] chore(deps): bump express from 4.17.1 to 4.18.2 in /docs/esm Bumps [express](https://github.com/expressjs/express) from 4.17.1 to 4.18.2. - [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.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/esm/package-lock.json | 514 ++++++++++++++++++++----------------- 1 file changed, 274 insertions(+), 240 deletions(-) diff --git a/docs/esm/package-lock.json b/docs/esm/package-lock.json index 4f8dda58..b37fc5ce 100644 --- a/docs/esm/package-lock.json +++ b/docs/esm/package-lock.json @@ -74,12 +74,12 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, "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" @@ -128,29 +128,32 @@ } }, "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.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "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.11.0", + "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/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" } @@ -204,11 +207,11 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "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" @@ -223,9 +226,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" } @@ -255,17 +258,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/ee-first": { "version": "1.1.1", @@ -275,7 +282,7 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -340,7 +347,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -353,43 +360,44 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, "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.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "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.1", + "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.11.0", "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" @@ -409,16 +417,16 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "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": { @@ -453,7 +461,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -549,18 +557,18 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "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/iconv-lite": { @@ -575,9 +583,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/internal-slot": { "version": "1.0.3", @@ -876,19 +884,19 @@ } }, "node_modules/mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -905,9 +913,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "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" } @@ -965,9 +973,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" }, @@ -1072,11 +1080,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.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/range-parser": { @@ -1088,12 +1102,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" }, @@ -1152,9 +1166,23 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -1176,51 +1204,51 @@ } }, "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" } }, "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "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/side-channel": { "version": "1.0.4", @@ -1264,11 +1292,11 @@ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" }, "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.prototype.trimend": { @@ -1307,9 +1335,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" } @@ -1351,7 +1379,7 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } @@ -1495,12 +1523,12 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, "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" } }, "ajv": { @@ -1533,26 +1561,28 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "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.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "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.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, "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==" }, "call-bind": { "version": "1.0.2", @@ -1597,11 +1627,11 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "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" } }, "content-type": { @@ -1610,9 +1640,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", @@ -1636,14 +1666,14 @@ } }, "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==" }, "ee-first": { "version": "1.1.1", @@ -1653,7 +1683,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "error-ex": { "version": "1.3.2", @@ -1703,7 +1733,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", @@ -1713,40 +1743,41 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "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.1", + "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.11.0", "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" @@ -1763,16 +1794,16 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "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" } }, @@ -1798,7 +1829,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "function-bind": { "version": "1.1.1", @@ -1861,15 +1892,15 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "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" } }, "iconv-lite": { @@ -1881,9 +1912,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==" }, "internal-slot": { "version": "1.0.3", @@ -2080,16 +2111,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" } }, "minimist": { @@ -2103,9 +2134,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "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==" }, "normalize-package-data": { "version": "2.5.0", @@ -2147,9 +2178,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" } @@ -2221,9 +2252,12 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } }, "range-parser": { "version": "1.2.1", @@ -2231,12 +2265,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" } @@ -2279,9 +2313,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -2297,47 +2331,47 @@ } }, "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": { "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "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==" }, "side-channel": { "version": "1.0.4", @@ -2378,9 +2412,9 @@ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" }, "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.prototype.trimend": { "version": "1.0.4", @@ -2409,9 +2443,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==" }, "type-fest": { "version": "0.8.1", @@ -2441,7 +2475,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "uri-js": { "version": "4.4.1", From b89637ca0e2dd4266d8abbe09cea0c3ae12ee8da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 03:06:53 +0000 Subject: [PATCH 098/131] chore(deps): bump skywalking-backend-js from 0.5.1 to 0.6.0 Bumps [skywalking-backend-js](https://github.com/apache/skywalking-nodejs) from 0.5.1 to 0.6.0. - [Release notes](https://github.com/apache/skywalking-nodejs/releases) - [Changelog](https://github.com/apache/skywalking-nodejs/blob/master/CHANGELOG.md) - [Commits](https://github.com/apache/skywalking-nodejs/compare/v0.5.1...v0.6.0) --- updated-dependencies: - dependency-name: skywalking-backend-js dependency-type: direct:production 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 16f88477..9cc09aaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", - "skywalking-backend-js": "^0.5.1" + "skywalking-backend-js": "^0.6.0" }, "bin": { "functions-framework": "build/src/main.js", @@ -6053,9 +6053,9 @@ } }, "node_modules/skywalking-backend-js": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/skywalking-backend-js/-/skywalking-backend-js-0.5.1.tgz", - "integrity": "sha512-gu56s9n+581pt1Aw/N3zf6pe/ulLq6FVXfRzqSRiAc6W8w0kaKZBl72S/Epz6cgD1/LmMS151Za09sfVzBBjsA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/skywalking-backend-js/-/skywalking-backend-js-0.6.0.tgz", + "integrity": "sha512-C0VMSUxTsqfjQwdB705VAo29cIYKxMAfHoFL9aIDv2G3mfxnNdUYPr91hm84fk/BdSV5HKt8Bxt9ulBKfCV6/g==", "hasInstallScript": true, "dependencies": { "@grpc/grpc-js": "^1.6.7", @@ -11710,9 +11710,9 @@ } }, "skywalking-backend-js": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/skywalking-backend-js/-/skywalking-backend-js-0.5.1.tgz", - "integrity": "sha512-gu56s9n+581pt1Aw/N3zf6pe/ulLq6FVXfRzqSRiAc6W8w0kaKZBl72S/Epz6cgD1/LmMS151Za09sfVzBBjsA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/skywalking-backend-js/-/skywalking-backend-js-0.6.0.tgz", + "integrity": "sha512-C0VMSUxTsqfjQwdB705VAo29cIYKxMAfHoFL9aIDv2G3mfxnNdUYPr91hm84fk/BdSV5HKt8Bxt9ulBKfCV6/g==", "requires": { "@grpc/grpc-js": "^1.6.7", "google-protobuf": "^3.14.0", diff --git a/package.json b/package.json index 01def85c..8602c0a1 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", - "skywalking-backend-js": "^0.5.1" + "skywalking-backend-js": "^0.6.0" }, "scripts": { "test": "cross-env DEBUG=common:*,ofn:* mocha build/test -t 60000 --recursive --exit", From 050d0ffc615eaccfa8742742fdbc4364100fc91a Mon Sep 17 00:00:00 2001 From: James Date: Mon, 12 Dec 2022 10:04:57 +0800 Subject: [PATCH 099/131] Fix typo Signed-off-by: James --- docs/generated/api.json | 2 +- docs/generated/api.md | 2 +- src/openfunction/runtime.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/generated/api.json b/docs/generated/api.json index f5e091fb..0bf0410a 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -2617,7 +2617,7 @@ }, { "kind": "Content", - "text": "{\n HTTP: string;\n GRRC: string;\n }" + "text": "{\n HTTP: string;\n GRPC: string;\n }" }, { "kind": "Content", diff --git a/docs/generated/api.md b/docs/generated/api.md index 496a8337..2fe1b49c 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -154,7 +154,7 @@ export abstract class OpenFunctionRuntime { setTrigger(req: Request_3, res?: Response_2): void; get sidecarPort(): { HTTP: string; - GRRC: string; + GRPC: string; }; // Warning: (ae-forgotten-export) The symbol "OpenFunctionTrigger" needs to be exported by the entry point index.d.ts protected trigger?: OpenFunctionTrigger; diff --git a/src/openfunction/runtime.ts b/src/openfunction/runtime.ts index 3b467ed6..b990c2ec 100644 --- a/src/openfunction/runtime.ts +++ b/src/openfunction/runtime.ts @@ -138,7 +138,7 @@ export abstract class OpenFunctionRuntime { get sidecarPort() { return { HTTP: env.DAPR_HTTP_PORT || '3500', - GRRC: env.DAPR_GRPC_PORT || '50001', + GRPC: env.DAPR_GRPC_PORT || '50001', }; } From 3a13eb6d067f2392c6ac2e1ecf9b49bf2e88dcca Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 03:47:05 +0000 Subject: [PATCH 100/131] docs: update README.md [skip ci] --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4d641237..32666401 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Functions Framework for Node.js -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) [![npm version](https://img.shields.io/npm/v/@openfunction/functions-framework.svg)](https://www.npmjs.com/package/@openfunction/functions-framework) [![npm downloads](https://img.shields.io/npm/dm/@openfunction/functions-framework.svg)](https://npmcharts.com/compare/@openfunction/functions-framework?minimal=true) @@ -299,9 +299,12 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - - - + + + + + +

MachaYAD

đŸ’ģ
MachaYAD
MachaYAD

đŸ’ģ
James.Ji
James.Ji

🐛
From 05156c390ebdf40e504288a30685c47d42e8517b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 03:47:06 +0000 Subject: [PATCH 101/131] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0d0f968d..435171ef 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13,6 +13,15 @@ "contributions": [ "code" ] + }, + { + "login": "James-JLC", + "name": "James.Ji", + "avatar_url": "https://avatars.githubusercontent.com/u/3123790?v=4", + "profile": "https://github.com/James-JLC", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, @@ -20,5 +29,6 @@ "projectOwner": "OpenFunction", "repoType": "github", "repoHost": "https://github.com", - "skipCi": true + "skipCi": true, + "commitConvention": "angular" } From 903e24f662a1ea0182edcdbb21075d921cb1cfd6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Dec 2022 03:13:08 +0000 Subject: [PATCH 102/131] chore(deps-dev): bump graphql-request from 5.0.0 to 5.1.0 Bumps [graphql-request](https://github.com/prisma/graphql-request) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/prisma/graphql-request/releases) - [Commits](https://github.com/prisma/graphql-request/compare/5.0.0...5.1.0) --- updated-dependencies: - dependency-name: graphql-request dependency-type: direct:development 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 bb757262..9fa15a03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3292,9 +3292,9 @@ } }, "node_modules/graphql-request": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/graphql-request/-/graphql-request-5.0.0.tgz", - "integrity": "sha512-SpVEnIo2J5k2+Zf76cUkdvIRaq5FMZvGQYnA4lUWYbc99m+fHh4CZYRRO/Ff4tCLQ613fzCm3SiDT64ubW5Gyw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.1.0.tgz", + "integrity": "sha512-0OeRVYigVwIiXhNmqnPDt+JhMzsjinxHE7TVy3Lm6jUzav0guVcL0lfSbi6jVTRAxcbwgyr6yrZioSHxf9gHzw==", "dev": true, "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", @@ -9653,9 +9653,9 @@ "peer": true }, "graphql-request": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/graphql-request/-/graphql-request-5.0.0.tgz", - "integrity": "sha512-SpVEnIo2J5k2+Zf76cUkdvIRaq5FMZvGQYnA4lUWYbc99m+fHh4CZYRRO/Ff4tCLQ613fzCm3SiDT64ubW5Gyw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.1.0.tgz", + "integrity": "sha512-0OeRVYigVwIiXhNmqnPDt+JhMzsjinxHE7TVy3Lm6jUzav0guVcL0lfSbi6jVTRAxcbwgyr6yrZioSHxf9gHzw==", "dev": true, "requires": { "@graphql-typed-document-node/core": "^3.1.1", From e0056ee53d176dd70fb9ee2a1dbb8734fdac03a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Dec 2022 03:13:43 +0000 Subject: [PATCH 103/131] chore(deps-dev): bump wait-on from 6.0.1 to 7.0.1 Bumps [wait-on](https://github.com/jeffbski/wait-on) from 6.0.1 to 7.0.1. - [Release notes](https://github.com/jeffbski/wait-on/releases) - [Commits](https://github.com/jeffbski/wait-on/compare/v6.0.1...v7.0.1) --- updated-dependencies: - dependency-name: wait-on dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 160 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 85 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb757262..cf490b2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "sinon": "^15.0.0", "supertest": "6.3.1", "typescript": "^4.8.4", - "wait-on": "^6.0.1" + "wait-on": "^7.0.1" }, "engines": { "node": ">=13.0.0" @@ -199,14 +199,14 @@ } }, "node_modules/@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", "dev": true }, "node_modules/@hapi/topo": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, "dependencies": { @@ -474,7 +474,7 @@ }, "node_modules/@sideway/address": { "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", "dev": true, "dependencies": { @@ -482,14 +482,14 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "dev": true }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, @@ -1213,6 +1213,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3012,10 +3022,16 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { "node": ">=4.0" }, @@ -4098,9 +4114,9 @@ "dev": true }, "node_modules/joi": { - "version": "17.6.0", - "resolved": "https://registry.npmmirror.com/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", + "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0", @@ -6738,46 +6754,37 @@ } }, "node_modules/wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", + "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", "dev": true, "dependencies": { - "axios": "^0.25.0", - "joi": "^17.6.0", + "axios": "^0.27.2", + "joi": "^17.7.0", "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" + "minimist": "^1.2.7", + "rxjs": "^7.8.0" }, "bin": { "wait-on": "bin/wait-on" }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/wait-on/node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.7" + "node": ">=12.0.0" } }, "node_modules/wait-on/node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "dependencies": { "tslib": "^2.1.0" } }, "node_modules/wait-on/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/webidl-conversions": { @@ -7193,14 +7200,14 @@ } }, "@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", "dev": true }, "@hapi/topo": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, "requires": { @@ -7460,7 +7467,7 @@ }, "@sideway/address": { "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", "dev": true, "requires": { @@ -7468,14 +7475,14 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "dev": true }, "@sideway/pinpoint": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, @@ -8052,6 +8059,16 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -9455,9 +9472,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "foreach": { @@ -10221,9 +10238,9 @@ "dev": true }, "joi": { - "version": "17.6.0", - "resolved": "https://registry.npmmirror.com/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", + "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0", @@ -12246,40 +12263,31 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", + "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", "dev": true, "requires": { - "axios": "^0.25.0", - "joi": "^17.6.0", + "axios": "^0.27.2", + "joi": "^17.7.0", "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" + "minimist": "^1.2.7", + "rxjs": "^7.8.0" }, "dependencies": { - "axios": { - "version": "0.25.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.7" - } - }, "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "requires": { "tslib": "^2.1.0" } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } diff --git a/package.json b/package.json index 8602c0a1..b4568bc1 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,6 @@ "sinon": "^15.0.0", "supertest": "6.3.1", "typescript": "^4.8.4", - "wait-on": "^6.0.1" + "wait-on": "^7.0.1" } } From b4e76030e05f44b9f392695de9fa46cda8e493e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Dec 2022 03:13:14 +0000 Subject: [PATCH 104/131] chore(deps): bump actions/stale from 6.0.0 to 7.0.0 Bumps [actions/stale](https://github.com/actions/stale) from 6.0.0 to 7.0.0. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v6.0.0...v7.0.0) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 71665d55..d671d2a6 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Prune Stale - uses: actions/stale@v6.0.0 + uses: actions/stale@v7.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-issue-stale: 60 From 6c83a7aa59ade16e7a4ec397579c334aa57ac52f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 06:06:18 +0000 Subject: [PATCH 105/131] chore(deps): bump json5 from 2.2.0 to 2.2.3 Bumps [json5](https://github.com/json5/json5) from 2.2.0 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.0...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fa15a03..cd44667f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4145,13 +4145,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -10265,13 +10262,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "jsonfile": { "version": "4.0.0", From f2f64bc996dc51f36238343bd55c49f2c474392b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 11:41:04 +0000 Subject: [PATCH 106/131] chore(deps): bump cookiejar from 2.1.3 to 2.1.4 Bumps [cookiejar](https://github.com/bmeck/node-cookiejar) from 2.1.3 to 2.1.4. - [Release notes](https://github.com/bmeck/node-cookiejar/releases) - [Commits](https://github.com/bmeck/node-cookiejar/commits) --- updated-dependencies: - dependency-name: cookiejar dependency-type: indirect ... 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 06bd8b0a..8140b237 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1847,9 +1847,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, "node_modules/core-util-is": { @@ -8578,9 +8578,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, "core-util-is": { From c5d4778b4b9f2182a133c732747a6c8d7f90ee15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 04:01:28 +0000 Subject: [PATCH 107/131] chore(deps): bump actions/stale from 7.0.0 to 8.0.0 Bumps [actions/stale](https://github.com/actions/stale) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v7.0.0...v8.0.0) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index d671d2a6..f23c341b 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Prune Stale - uses: actions/stale@v7.0.0 + uses: actions/stale@v8.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-issue-stale: 60 From f9e5e31f562330b82284885196323ac5773fd299 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 04:01:28 +0000 Subject: [PATCH 108/131] chore(deps-dev): bump concurrently from 7.6.0 to 8.0.1 Bumps [concurrently](https://github.com/open-cli-tools/concurrently) from 7.6.0 to 8.0.1. - [Release notes](https://github.com/open-cli-tools/concurrently/releases) - [Commits](https://github.com/open-cli-tools/concurrently/compare/v7.6.0...v8.0.1) --- updated-dependencies: - dependency-name: concurrently dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 158 ++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 96 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8140b237..1eed55bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@types/supertest": "2.0.12", "aedes": "0.47.0", "clean-pkg-json": "^1.2.0", - "concurrently": "^7.5.0", + "concurrently": "^8.0.1", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "graphql-request": "^5.0.0", @@ -1651,27 +1651,27 @@ } }, "node_modules/concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz", + "integrity": "sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", + "chalk": "^4.1.2", + "date-fns": "^2.29.3", "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", + "rxjs": "^7.8.0", + "shell-quote": "^1.8.0", + "spawn-command": "0.0.2-1", + "supports-color": "^8.1.1", "tree-kill": "^1.2.2", - "yargs": "^17.3.1" + "yargs": "^17.7.1" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + "node": "^14.13.0 || >=16.0.0" }, "funding": { "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" @@ -1714,6 +1714,20 @@ "node": ">=8" } }, + "node_modules/concurrently/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/concurrently/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", @@ -1742,9 +1756,9 @@ } }, "node_modules/concurrently/node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "dependencies": { "tslib": "^2.1.0" @@ -1763,33 +1777,33 @@ } }, "node_modules/concurrently/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "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==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "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==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" @@ -1900,12 +1914,16 @@ } }, "node_modules/date-fns": { - "version": "2.29.2", - "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.29.2.tgz", - "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "dev": true, "engines": { "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, "node_modules/debug": { @@ -5954,10 +5972,13 @@ } }, "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 + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/shelljs": { "version": "0.8.5", @@ -8433,20 +8454,20 @@ } }, "concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz", + "integrity": "sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==", "dev": true, "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", + "chalk": "^4.1.2", + "date-fns": "^2.29.3", "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", + "rxjs": "^7.8.0", + "shell-quote": "^1.8.0", + "spawn-command": "0.0.2-1", + "supports-color": "^8.1.1", "tree-kill": "^1.2.2", - "yargs": "^17.3.1" + "yargs": "^17.7.1" }, "dependencies": { "ansi-styles": { @@ -8479,6 +8500,17 @@ } } }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", @@ -8501,9 +8533,9 @@ "dev": true }, "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "requires": { "tslib": "^2.1.0" @@ -8519,30 +8551,30 @@ } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "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==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } @@ -8619,9 +8651,9 @@ } }, "date-fns": { - "version": "2.29.2", - "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.29.2.tgz", - "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "dev": true }, "debug": { @@ -11622,9 +11654,9 @@ "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==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", "dev": true }, "shelljs": { diff --git a/package.json b/package.json index b4568bc1..69814b77 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@types/supertest": "2.0.12", "aedes": "0.47.0", "clean-pkg-json": "^1.2.0", - "concurrently": "^7.5.0", + "concurrently": "^8.0.1", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", "graphql-request": "^5.0.0", From 4102817ee8c261e025f4393cefa9681bdfbf6aab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 04:02:44 +0000 Subject: [PATCH 109/131] chore(deps): bump semver from 7.3.8 to 7.5.1 Bumps [semver](https://github.com/npm/node-semver) from 7.3.8 to 7.5.1. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v7.3.8...v7.5.1) --- updated-dependencies: - dependency-name: semver dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 72 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1eed55bc..fc4cb0d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -293,6 +293,21 @@ "path-parse": "^1.0.6" } }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@microsoft/tsdoc": { "version": "0.14.2", "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", @@ -441,6 +456,21 @@ "path-parse": "^1.0.6" } }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@rushstack/rig-package": { "version": "0.3.17", "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.17.tgz", @@ -716,9 +746,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/serve-static": { @@ -5863,9 +5893,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7293,6 +7323,15 @@ "requires": { "path-parse": "^1.0.6" } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -7447,6 +7486,15 @@ "requires": { "path-parse": "^1.0.6" } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -7728,9 +7776,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/serve-static": { @@ -11559,9 +11607,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "requires": { "lru-cache": "^6.0.0" } From 3fcd2d842ddebe9d81e78982bcf1147c460c78e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 04:00:05 +0000 Subject: [PATCH 110/131] chore(deps-dev): bump graphql-request from 5.1.0 to 6.1.0 Bumps [graphql-request](https://github.com/jasonkuhrt/graphql-request) from 5.1.0 to 6.1.0. - [Release notes](https://github.com/jasonkuhrt/graphql-request/releases) - [Commits](https://github.com/jasonkuhrt/graphql-request/compare/5.1.0...6.1.0) --- updated-dependencies: - dependency-name: graphql-request dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 86 +++++++++++------------------------------------ package.json | 2 +- 2 files changed, 21 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc4cb0d4..583362d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "concurrently": "^8.0.1", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", - "graphql-request": "^5.0.0", + "graphql-request": "^6.1.0", "gts": "^3.1.1", "mocha": "10.1.0", "pack-n-play": "^1.0.0-2", @@ -160,12 +160,12 @@ } }, "node_modules/@graphql-typed-document-node/core": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz", - "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", "dev": true, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@grpc/grpc-js": { @@ -2836,15 +2836,6 @@ "node": ">=4" } }, - "node_modules/extract-files": { - "version": "9.0.0", - "resolved": "https://registry.npmmirror.com/extract-files/-/extract-files-9.0.0.tgz", - "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", - "dev": true, - "engines": { - "node": "^10.17.0 || ^12.0.0 || >= 13.7.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3347,7 +3338,7 @@ }, "node_modules/graphql": { "version": "16.6.0", - "resolved": "https://registry.npmmirror.com/graphql/-/graphql-16.6.0.tgz", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", "dev": true, "peer": true, @@ -3356,34 +3347,18 @@ } }, "node_modules/graphql-request": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.1.0.tgz", - "integrity": "sha512-0OeRVYigVwIiXhNmqnPDt+JhMzsjinxHE7TVy3Lm6jUzav0guVcL0lfSbi6jVTRAxcbwgyr6yrZioSHxf9gHzw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", + "integrity": "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==", "dev": true, "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-fetch": "^3.1.5", - "extract-files": "^9.0.0", - "form-data": "^3.0.0" + "@graphql-typed-document-node/core": "^3.2.0", + "cross-fetch": "^3.1.5" }, "peerDependencies": { "graphql": "14 - 16" } }, - "node_modules/graphql-request/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/gts": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/gts/-/gts-3.1.1.tgz", @@ -7220,9 +7195,9 @@ } }, "@graphql-typed-document-node/core": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz", - "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", "dev": true, "requires": {} }, @@ -9352,12 +9327,6 @@ "tmp": "^0.0.33" } }, - "extract-files": { - "version": "9.0.0", - "resolved": "https://registry.npmmirror.com/extract-files/-/extract-files-9.0.0.tgz", - "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -9741,34 +9710,19 @@ }, "graphql": { "version": "16.6.0", - "resolved": "https://registry.npmmirror.com/graphql/-/graphql-16.6.0.tgz", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", "dev": true, "peer": true }, "graphql-request": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.1.0.tgz", - "integrity": "sha512-0OeRVYigVwIiXhNmqnPDt+JhMzsjinxHE7TVy3Lm6jUzav0guVcL0lfSbi6jVTRAxcbwgyr6yrZioSHxf9gHzw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", + "integrity": "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==", "dev": true, "requires": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-fetch": "^3.1.5", - "extract-files": "^9.0.0", - "form-data": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } + "@graphql-typed-document-node/core": "^3.2.0", + "cross-fetch": "^3.1.5" } }, "gts": { diff --git a/package.json b/package.json index 69814b77..6e5d42c5 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "concurrently": "^8.0.1", "cross-env": "^7.0.3", "env-cmd": "^10.1.0", - "graphql-request": "^5.0.0", + "graphql-request": "^6.1.0", "gts": "^3.1.1", "mocha": "10.1.0", "pack-n-play": "^1.0.0-2", From 1ae0151e24fcab866900135ba03dabf6ff9576e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 04:00:59 +0000 Subject: [PATCH 111/131] chore(deps): bump cloudevents from 6.0.2 to 7.0.1 Bumps [cloudevents](https://github.com/cloudevents/sdk-javascript) from 6.0.2 to 7.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/v6.0.2...v7.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 | 63 +++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc4cb0d4..220c6d23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@dapr/dapr": "2.5.0", "body-parser": "^1.20.1", - "cloudevents": "^6.0.2", + "cloudevents": "^7.0.1", "debug": "^4.3.4", "express": "^4.18.2", "express-interceptor": "^1.2.0", @@ -1273,6 +1273,14 @@ "node": ">=0.6" } }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1526,14 +1534,19 @@ } }, "node_modules/cloudevents": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/cloudevents/-/cloudevents-6.0.2.tgz", - "integrity": "sha512-mn/4EZnAbhfb/TghubK2jPnxYM15JRjf8LnWJtXidiVKi5ZCkd+p9jyBZbL57w7nRm6oFAzJhjxRLsXd/DNaBQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.1.tgz", + "integrity": "sha512-/i7HRvIUG2RAiB9AD6TqUd07H2ZkJtwCrNpGa4vJftwz5uJdD/bO+u3kYs/r+kQCtZ6uhZs0I9vfIhuhorKUHw==", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", + "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" + }, + "engines": { + "node": ">=16 <=20" } }, "node_modules/cloudevents/node_modules/ajv": { @@ -4192,6 +4205,14 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-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", @@ -5462,6 +5483,14 @@ "node": ">=6.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -8152,6 +8181,11 @@ "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz", "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -8356,12 +8390,14 @@ } }, "cloudevents": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/cloudevents/-/cloudevents-6.0.2.tgz", - "integrity": "sha512-mn/4EZnAbhfb/TghubK2jPnxYM15JRjf8LnWJtXidiVKi5ZCkd+p9jyBZbL57w7nRm6oFAzJhjxRLsXd/DNaBQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.1.tgz", + "integrity": "sha512-/i7HRvIUG2RAiB9AD6TqUd07H2ZkJtwCrNpGa4vJftwz5uJdD/bO+u3kYs/r+kQCtZ6uhZs0I9vfIhuhorKUHw==", "requires": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", + "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" }, @@ -10342,6 +10378,14 @@ "esprima": "^4.0.0" } }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-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", @@ -11305,6 +11349,11 @@ "fast-diff": "^1.1.2" } }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", diff --git a/package.json b/package.json index 69814b77..ce60e274 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "dependencies": { "@dapr/dapr": "2.5.0", "body-parser": "^1.20.1", - "cloudevents": "^6.0.2", + "cloudevents": "^7.0.1", "debug": "^4.3.4", "express": "^4.18.2", "express-interceptor": "^1.2.0", From 3c7e90c3c9e8a5ee2b2cdf15c4be173723c8d79b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 04:00:33 +0000 Subject: [PATCH 112/131] chore(deps-dev): bump sinon from 15.0.0 to 15.1.2 Bumps [sinon](https://github.com/sinonjs/sinon) from 15.0.0 to 15.1.2. - [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/v15.0.0...v15.1.2) --- updated-dependencies: - dependency-name: sinon dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 191 ++++++++++++++++++++++------------------------ 1 file changed, 93 insertions(+), 98 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc4cb0d4..3dbbb261 100644 --- a/package-lock.json +++ b/package-lock.json @@ -524,36 +524,27 @@ "dev": true }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", + "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -561,6 +552,15 @@ "type-detect": "^4.0.8" } }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", @@ -4935,18 +4935,27 @@ } }, "node_modules/nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" } }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/nise/node_modules/path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -6060,16 +6069,16 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.0.tgz", - "integrity": "sha512-pV97G1GbslaSJoSdy2F2z8uh5F+uPGp3ddOzA4JsBOUBLEQRz2OAqlKGRFTSh2KiqUCmHkzyAeu7R4x1Hx0wwg==", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.2.tgz", + "integrity": "sha512-uG1pU54Fis4EfYOPoEi13fmRHgZNg/u+3aReSEzHsN52Bpf+bMVfsBQS5MjouI+rTuG6UBIINlpuuO2Epr7SiA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.1.0", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", "supports-color": "^7.2.0" }, "funding": { @@ -6077,22 +6086,13 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/@sinonjs/fake-timers": { - "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" - } - }, - "node_modules/sinon/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "node_modules/sinon/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "engines": { + "node": ">=0.3.1" } }, "node_modules/sinon/node_modules/has-flag": { @@ -7553,43 +7553,43 @@ "dev": true }, "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", + "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } + "@sinonjs/commons": "^3.0.0" } }, "@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } } }, "@sinonjs/text-encoding": { @@ -10906,18 +10906,27 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" }, "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, "path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -11750,38 +11759,24 @@ } }, "sinon": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.0.tgz", - "integrity": "sha512-pV97G1GbslaSJoSdy2F2z8uh5F+uPGp3ddOzA4JsBOUBLEQRz2OAqlKGRFTSh2KiqUCmHkzyAeu7R4x1Hx0wwg==", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.2.tgz", + "integrity": "sha512-uG1pU54Fis4EfYOPoEi13fmRHgZNg/u+3aReSEzHsN52Bpf+bMVfsBQS5MjouI+rTuG6UBIINlpuuO2Epr7SiA==", "dev": true, "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.1.0", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", "supports-color": "^7.2.0" }, "dependencies": { - "@sinonjs/fake-timers": { - "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" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } - } + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true }, "has-flag": { "version": "4.0.0", From a582b11a76c350f10167865fb13337fcb4cbba66 Mon Sep 17 00:00:00 2001 From: yi-ge-dian <1085266008@qq.com> Date: Wed, 14 Jun 2023 21:06:22 +0800 Subject: [PATCH 113/131] ci(unit): bump dapr 1.11.0 Signed-off-by: yi-ge-dian <1085266008@qq.com> --- .github/workflows/unit.yml | 2 +- test/integration/async_server.ts | 2 +- test/integration/http_binding.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index 8129cfef..f48e6353 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: node-version: [16] - dapr-version: [1.6.3, 1.7.4, 1.8.3, 1.9.2] + dapr-version: [1.6.3, 1.7.4, 1.8.3, 1.9.2, 1.10.7, 1.11.0] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index 74534563..c9254adc 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -15,7 +15,7 @@ const TEST_PAYLOAD = Payload.Plain.RAW; const TEST_PAYLOAD_CE = Payload.Plain.CE; describe('OpenFunction - Async', () => { - const APPID = 'async.dapr'; + const APPID = 'async_dapr'; const broker = MQTT.Server(); const server = createServer(broker.handle); before(done => { diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts index bb7b864e..8d777802 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -20,7 +20,7 @@ const TEST_CONTEXT = { const TEST_PAYLOAD = Payload.Plain.RAW; describe('OpenFunction - HTTP Binding', () => { - const APPID = 'http.dapr'; + const APPID = 'http_dapr'; before(done => { if (shell.exec('dapr', {silent: true}).code !== 0) From f329ea41e66b29562c13d19fc86221da867151b1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:21:11 +0000 Subject: [PATCH 114/131] docs: update README.md [skip ci] --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 32666401..3b830400 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Functions Framework for Node.js -[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) [![npm version](https://img.shields.io/npm/v/@openfunction/functions-framework.svg)](https://www.npmjs.com/package/@openfunction/functions-framework) [![npm downloads](https://img.shields.io/npm/dm/@openfunction/functions-framework.svg)](https://npmcharts.com/compare/@openfunction/functions-framework?minimal=true) @@ -301,8 +301,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - - + + +
MachaYAD
MachaYAD

đŸ’ģ
James.Ji
James.Ji

🐛
MachaYAD
MachaYAD

đŸ’ģ
James.Ji
James.Ji

🐛
yi-ge-dian
yi-ge-dian

🚧
From 4c6b72671b114a4f38fdcae0a6b23be5f1edae82 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:21:12 +0000 Subject: [PATCH 115/131] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 435171ef..13ba6708 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -22,6 +22,15 @@ "contributions": [ "bug" ] + }, + { + "login": "yi-ge-dian", + "name": "yi-ge-dian", + "avatar_url": "https://avatars.githubusercontent.com/u/68337798?v=4", + "profile": "https://onepoint.link", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, @@ -30,5 +39,6 @@ "repoType": "github", "repoHost": "https://github.com", "skipCi": true, - "commitConvention": "angular" + "commitConvention": "angular", + "commitType": "docs" } From 4fef87c967b00bef8620b28306efa18eef7b9bfb Mon Sep 17 00:00:00 2001 From: Haili Zhang Date: Thu, 15 Jun 2023 14:18:42 +0000 Subject: [PATCH 116/131] =?UTF-8?q?=F0=9F=91=B7=20ci:=20upgrade=20docs=20a?= =?UTF-8?q?nd=20lint=20`runs-on`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Haili Zhang --- .github/workflows/docs.yml | 4 +--- .github/workflows/lint.yml | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d941c706..468584b9 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -6,13 +6,11 @@ on: pull_request: jobs: docs: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 - with: - node-version: '14' - name: Install dependencies run: npm ci - name: Build docs diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a09f2ce5..7c9da6d2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,7 +6,7 @@ on: pull_request: jobs: lint: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js From a6ec8b79f7b6b824415dccfca3eba626bd722d1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Jun 2023 14:31:13 +0000 Subject: [PATCH 117/131] chore(deps-dev): bump concurrently from 8.0.1 to 8.2.0 Bumps [concurrently](https://github.com/open-cli-tools/concurrently) from 8.0.1 to 8.2.0. - [Release notes](https://github.com/open-cli-tools/concurrently/releases) - [Commits](https://github.com/open-cli-tools/concurrently/compare/v8.0.1...v8.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 | 145 +++++++++++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index 583362d7..1175ab6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,6 +95,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz", @@ -1681,20 +1693,20 @@ } }, "node_modules/concurrently": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz", - "integrity": "sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", + "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", "dev": true, "dependencies": { "chalk": "^4.1.2", - "date-fns": "^2.29.3", + "date-fns": "^2.30.0", "lodash": "^4.17.21", - "rxjs": "^7.8.0", - "shell-quote": "^1.8.0", - "spawn-command": "0.0.2-1", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", - "yargs": "^17.7.1" + "yargs": "^17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", @@ -1786,9 +1798,9 @@ } }, "node_modules/concurrently/node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { "tslib": "^2.1.0" @@ -1807,15 +1819,15 @@ } }, "node_modules/concurrently/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "dev": true }, "node_modules/concurrently/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -1944,10 +1956,13 @@ } }, "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { "node": ">=0.11" }, @@ -5671,6 +5686,12 @@ "node": ">=8" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, "node_modules/regexparam": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/regexparam/-/regexparam-2.0.0.tgz", @@ -5977,9 +5998,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6180,9 +6201,9 @@ } }, "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, "node_modules/spawn-sync": { @@ -7137,6 +7158,15 @@ "js-tokens": "^4.0.0" } }, + "@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz", @@ -8477,20 +8507,20 @@ } }, "concurrently": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz", - "integrity": "sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", + "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", "dev": true, "requires": { "chalk": "^4.1.2", - "date-fns": "^2.29.3", + "date-fns": "^2.30.0", "lodash": "^4.17.21", - "rxjs": "^7.8.0", - "shell-quote": "^1.8.0", - "spawn-command": "0.0.2-1", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", - "yargs": "^17.7.1" + "yargs": "^17.7.2" }, "dependencies": { "ansi-styles": { @@ -8556,9 +8586,9 @@ "dev": true }, "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "requires": { "tslib": "^2.1.0" @@ -8574,15 +8604,15 @@ } }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "dev": true }, "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", @@ -8674,10 +8704,13 @@ } }, "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.21.0" + } }, "debug": { "version": "4.3.4", @@ -11428,6 +11461,12 @@ "strip-indent": "^3.0.0" } }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, "regexparam": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/regexparam/-/regexparam-2.0.0.tgz", @@ -11656,9 +11695,9 @@ "dev": true }, "shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true }, "shelljs": { @@ -11825,9 +11864,9 @@ "dev": true }, "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, "spawn-sync": { From e11d7e29e18386a363d0f1dbe3ad3d9bde5e56f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 03:59:47 +0000 Subject: [PATCH 118/131] chore(deps-dev): bump sinon from 15.1.2 to 15.2.0 Bumps [sinon](https://github.com/sinonjs/sinon) from 15.1.2 to 15.2.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/v15.1.2...v15.2.0) --- updated-dependencies: - dependency-name: sinon dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca09516f..7505d5e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -545,9 +545,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", - "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" @@ -6094,13 +6094,13 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.2.tgz", - "integrity": "sha512-uG1pU54Fis4EfYOPoEi13fmRHgZNg/u+3aReSEzHsN52Bpf+bMVfsBQS5MjouI+rTuG6UBIINlpuuO2Epr7SiA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.1.0", + "@sinonjs/fake-timers": "^10.3.0", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", "nise": "^5.1.4", @@ -7596,9 +7596,9 @@ } }, "@sinonjs/fake-timers": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", - "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0" @@ -11801,13 +11801,13 @@ } }, "sinon": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.2.tgz", - "integrity": "sha512-uG1pU54Fis4EfYOPoEi13fmRHgZNg/u+3aReSEzHsN52Bpf+bMVfsBQS5MjouI+rTuG6UBIINlpuuO2Epr7SiA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.1.0", + "@sinonjs/fake-timers": "^10.3.0", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", "nise": "^5.1.4", From bd19fb913b8d09cdb839d3948e08bb544d2f8a97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jul 2023 22:24:22 +0000 Subject: [PATCH 119/131] chore(deps): bump protobufjs and @grpc/grpc-js Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) and [@grpc/grpc-js](https://github.com/grpc/grpc-node). These dependencies needed to be updated together. Updates `protobufjs` from 6.11.3 to 7.2.4 - [Release notes](https://github.com/protobufjs/protobuf.js/releases) - [Changelog](https://github.com/protobufjs/protobuf.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/protobufjs/protobuf.js/compare/v6.11.3...protobufjs-v7.2.4) Updates `@grpc/grpc-js` from 1.6.7 to 1.8.17 - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.6.7...@grpc/grpc-js@1.8.17) --- updated-dependencies: - dependency-name: protobufjs dependency-type: indirect - dependency-name: "@grpc/grpc-js" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 200 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 142 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7505d5e7..1f71c699 100644 --- a/package-lock.json +++ b/package-lock.json @@ -181,11 +181,11 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.6.7", - "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", - "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", + "version": "1.8.17", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.17.tgz", + "integrity": "sha512-DGuSbtMFbaRsyffMf+VEkVu8HkSXEUfO3UyGJNtqxW9ABdtTIA+2UXAJpwbJS+xfQxuwqLUeELmL6FuZkOqPxw==", "dependencies": { - "@grpc/proto-loader": "^0.6.4", + "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" }, "engines": { @@ -193,15 +193,15 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.6.12", - "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz", - "integrity": "sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg==", + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", + "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", "dependencies": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.2.0" + "protobufjs": "^7.0.0", + "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" @@ -210,6 +210,44 @@ "node": ">=6" } }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -385,27 +423,27 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/base64/-/base64-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dependencies": { "@protobufjs/aspromise": "^1.1.1", @@ -414,27 +452,27 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/float/-/float-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/path/-/path-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/pool/-/pool-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { @@ -671,7 +709,7 @@ }, "node_modules/@types/long": { "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/mime": { @@ -1539,6 +1577,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -4296,7 +4335,7 @@ }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/lodash.get": { @@ -4423,7 +4462,7 @@ }, "node_modules/long": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/lru-cache": { @@ -5506,9 +5545,9 @@ } }, "node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -5521,15 +5560,18 @@ "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", "@types/node": ">=13.7.0", - "long": "^4.0.0" + "long": "^5.0.0" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "engines": { + "node": ">=12.0.0" } }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7061,6 +7103,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -7078,6 +7121,7 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, "engines": { "node": ">=10" } @@ -7261,24 +7305,55 @@ "requires": {} }, "@grpc/grpc-js": { - "version": "1.6.7", - "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", - "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", + "version": "1.8.17", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.17.tgz", + "integrity": "sha512-DGuSbtMFbaRsyffMf+VEkVu8HkSXEUfO3UyGJNtqxW9ABdtTIA+2UXAJpwbJS+xfQxuwqLUeELmL6FuZkOqPxw==", "requires": { - "@grpc/proto-loader": "^0.6.4", + "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" } }, "@grpc/proto-loader": { - "version": "0.6.12", - "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz", - "integrity": "sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg==", + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", + "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", "requires": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.2.0" + "protobufjs": "^7.0.0", + "yargs": "^17.7.2" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } } }, "@hapi/hoek": { @@ -7438,27 +7513,27 @@ }, "@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, "@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/base64/-/base64-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, "@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "requires": { "@protobufjs/aspromise": "^1.1.1", @@ -7467,27 +7542,27 @@ }, "@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/float/-/float-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, "@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, "@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/path/-/path-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" }, "@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/pool/-/pool-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, "@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@rushstack/node-core-library": { @@ -7724,7 +7799,7 @@ }, "@types/long": { "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "@types/mime": { @@ -8388,6 +8463,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -10451,7 +10527,7 @@ }, "lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "lodash.get": { @@ -10553,7 +10629,7 @@ }, "long": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "lru-cache": { @@ -11363,9 +11439,9 @@ "dev": true }, "protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -11377,9 +11453,15 @@ "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", "@types/node": ">=13.7.0", - "long": "^4.0.0" + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + } } }, "proxy-addr": { @@ -12561,6 +12643,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -12574,7 +12657,8 @@ "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==" + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true }, "yargs-unparser": { "version": "2.0.0", From 45fe0d4aaf211e4e74d60dad6adf7dbdd8aa9621 Mon Sep 17 00:00:00 2001 From: yi-ge-dian <1085266008@qq.com> Date: Wed, 12 Jul 2023 17:02:38 +0800 Subject: [PATCH 120/131] =?UTF-8?q?=E2=9C=A8=20feat:=20support=20state=20s?= =?UTF-8?q?tore=20(#189)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🌈 style: update import style Signed-off-by: yi-ge-dian * ✨ feat: support the state store Signed-off-by: yi-ge-dian * Revert "🌈 style: update import style" This reverts commit edfa1f92672533906e5c1fcd416e2e985d2baa24. Signed-off-by: yi-ge-dian * đŸĻ„ refactor: refactor the code for state store Signed-off-by: yi-ge-dian * 📃 docs: generate docs Signed-off-by: yi-ge-dian * đŸĻ„ refactor: use lodash to make code more elegant Signed-off-by: yi-ge-dian * 🌈 cosm: remove console.log Signed-off-by: yi-ge-dian --------- Signed-off-by: yi-ge-dian --- docs/generated/api.json | 140 ++++++++++++++++++++ docs/generated/api.md | 9 +- src/openfunction/context.ts | 16 +++ src/openfunction/runtime.ts | 174 +++++++++++++++++++++++- test/conformance/.env-cmdrc.js | 26 ++++ test/conformance/function.js | 88 +++++++++++- test/conformance/package.json | 22 ++- test/data/components/state/state.yaml | 27 ++++ test/data/mock/context.ts | 13 ++ test/data/mock/payload.ts | 108 +++++++++++++++ test/integration/http_statestore.ts | 184 ++++++++++++++++++++++++++ 11 files changed, 799 insertions(+), 8 deletions(-) create mode 100644 test/data/components/state/state.yaml create mode 100644 test/integration/http_statestore.ts diff --git a/docs/generated/api.json b/docs/generated/api.json index 0bf0410a..bc979772 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -577,6 +577,27 @@ }, "releaseTag": "Public", "name": "PubSub" + }, + { + "kind": "EnumMember", + "canonicalReference": "@openfunction/functions-framework!ComponentType.State:member", + "docComment": "/**\n * The state type\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "State = " + }, + { + "kind": "Content", + "text": "\"state\"" + } + ], + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "name": "State" } ] }, @@ -826,6 +847,54 @@ ], "isOptional": false, "name": "IsPubSubComponent" + }, + { + "kind": "Method", + "canonicalReference": "@openfunction/functions-framework!ContextUtils.IsStateComponent:member(1)", + "docComment": "/**\n * Checks if the component is a state component.\n *\n * @param component - The component to check.\n *\n * @returns A boolean value.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "static IsStateComponent(component: " + }, + { + "kind": "Reference", + "text": "OpenFunctionComponent", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionComponent:interface" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "boolean" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": true, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "component", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "name": "IsStateComponent" } ], "implementsTokenRanges": [] @@ -2051,6 +2120,47 @@ "endIndex": 12 } }, + { + "kind": "PropertySignature", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#states:member", + "docComment": "/**\n * Optional state store config;\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "states?: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "states", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, { "kind": "PropertySignature", "canonicalReference": "@openfunction/functions-framework!OpenFunctionContext#version:member", @@ -2635,6 +2745,36 @@ "isStatic": false, "isProtected": false }, + { + "kind": "Property", + "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#state:member", + "docComment": "/**\n * The promise that handle data by state store.\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract get state(): " + }, + { + "kind": "Reference", + "text": "StateOperations", + "canonicalReference": "@openfunction/functions-framework!~StateOperations:interface" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": true, + "isOptional": false, + "releaseTag": "Public", + "name": "state", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false + }, { "kind": "Property", "canonicalReference": "@openfunction/functions-framework!OpenFunctionRuntime#trigger:member", diff --git a/docs/generated/api.md b/docs/generated/api.md index 2fe1b49c..11f21147 100644 --- a/docs/generated/api.md +++ b/docs/generated/api.md @@ -9,10 +9,12 @@ import { CloudEventV1 as CloudEvent } from 'cloudevents'; import { IndexedFieldWithPossiblyUndefined } from 'lodash'; +import { KeyValueType } from '@dapr/dapr/types/KeyValue.type'; 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'; +import { StateQueryResponseType } from '@dapr/dapr/types/state/StateQueryResponse.type'; export { CloudEvent } @@ -44,7 +46,8 @@ export interface CloudFunctionsContext { // @public export enum ComponentType { Binding = "bindings", - PubSub = "pubsub" + PubSub = "pubsub", + State = "state" } // @public @@ -56,6 +59,7 @@ export class ContextUtils { static IsBindingComponent(component: OpenFunctionComponent): boolean; static IsKnativeRuntime(context: OpenFunctionContext): boolean; static IsPubSubComponent(component: OpenFunctionComponent): boolean; + static IsStateComponent(component: OpenFunctionComponent): boolean; } // @public @@ -136,6 +140,7 @@ export interface OpenFunctionContext { postPlugins?: string[]; prePlugins?: string[]; runtime: `${RuntimeType}` | `${Capitalize}` | `${Uppercase}`; + states?: Record; version: string; } @@ -156,6 +161,8 @@ export abstract class OpenFunctionRuntime { HTTP: string; GRPC: string; }; + // Warning: (ae-forgotten-export) The symbol "StateOperations" needs to be exported by the entry point index.d.ts + abstract get state(): StateOperations; // Warning: (ae-forgotten-export) The symbol "OpenFunctionTrigger" needs to be exported by the entry point index.d.ts protected trigger?: OpenFunctionTrigger; static WrapUserFunction(userFunction: OpenFunction, context: OpenFunctionContext | OpenFunctionRuntime): (data: any) => Promise; diff --git a/src/openfunction/context.ts b/src/openfunction/context.ts index 15c66549..173f2fdc 100644 --- a/src/openfunction/context.ts +++ b/src/openfunction/context.ts @@ -30,6 +30,10 @@ export interface OpenFunctionContext { * Optional output binding object. */ outputs?: Record; + /** + * Optional state store config; + */ + states?: Record; /** * Optional plugins to be executed before user function. */ @@ -99,6 +103,10 @@ export enum ComponentType { * The pubsub type. */ PubSub = 'pubsub', + /** + * The state type + */ + State = 'state', } /** @@ -139,6 +147,14 @@ export class ContextUtils { static IsPubSubComponent(component: OpenFunctionComponent): boolean { return component?.componentType.split('.')[0] === ComponentType.PubSub; } + /** + * Checks if the component is a state component. + * @param component - The component to check. + * @returns A boolean value. + */ + static IsStateComponent(component: OpenFunctionComponent): boolean { + return component?.componentType.split('.')[0] === ComponentType.State; + } } /** diff --git a/src/openfunction/runtime.ts b/src/openfunction/runtime.ts index b990c2ec..8730602a 100644 --- a/src/openfunction/runtime.ts +++ b/src/openfunction/runtime.ts @@ -1,8 +1,24 @@ import {env} from 'process'; -import {chain, get, has, extend, isPlainObject} from 'lodash'; +import { + chain, + get, + has, + extend, + isPlainObject, + isEmpty, + size, + values, +} from 'lodash'; import {Request, Response} from 'express'; + import {DaprClient, CommunicationProtocolEnum} from '@dapr/dapr'; +import {KeyValuePairType} from '@dapr/dapr/types/KeyValuePair.type'; +import {KeyValueType} from '@dapr/dapr/types/KeyValue.type'; +import {OperationType} from '@dapr/dapr/types/Operation.type'; +import {IRequestMetadata} from '@dapr/dapr/types/RequestMetadata.type'; +import {StateQueryType} from '@dapr/dapr/types/state/StateQuery.type'; +import {StateQueryResponseType} from '@dapr/dapr/types/state/StateQueryResponse.type'; import {OpenFunction} from '../functions'; @@ -184,6 +200,24 @@ export abstract class OpenFunctionRuntime { * The promise that send data to certain ouput. */ abstract send(data: object, output?: string): Promise; + + /** + * The promise that handle data by state store. + */ + abstract get state(): StateOperations; +} + +/** + * The state's operation. + * @public + */ +export interface StateOperations { + save: (data: object, db?: string) => Promise; + get: (data: object, db?: string) => Promise; + getBulk: (data: object, db?: string) => Promise; + delete: (data: object, db?: string) => Promise; + transaction: (data: object, db?: string) => Promise; + query: (query: object, db?: string) => Promise; } /** @@ -243,4 +277,142 @@ class DaprRuntime extends OpenFunctionRuntime { return Promise.allSettled(actions); } + + /** + * Get the state store + * @param db the user specify the state store + * @returns Corresponding state store + */ + getState(db?: string): OpenFunctionComponent { + // check the states field + if (isEmpty(this.context.states)) { + throw new Error('You must specify the state in the context'); + } + + // if you don't specify the db, we will use the first one defined in the context + if (isEmpty(db)) { + if (!ContextUtils.IsStateComponent(values(this.context.states!)[0])) { + throw new Error('The state component type is wrong'); + } + return values(this.context.states!)[0]; + } + + // or we will use the one specified by user + if (!ContextUtils.IsStateComponent(this.context.states![db!])) { + throw new Error('The state component type is wrong'); + } + return values(this.context.states!)[0]; + } + + /** + * Save the data to the state store + * @param data The data for save operation + * @param db The state store to save the data + * @returns The promise of the save action being executed. + */ + #stateSave(data: object, db?: string): Promise { + return this.daprClient.state.save( + this.getState(db).componentName, + values(data)[0] as KeyValuePairType[] + ); + } + + /** + * Get the data from the state store + * @param data The data for get operation + * @param db The state store to get the data + * @returns The promise of the get action being executed. + */ + #stateGet(data: object, db?: string): Promise { + if (isEmpty(data) || size(data) > 1) { + throw new Error('State get method: invalid key number'); + } + + return this.daprClient.state.get( + this.getState(db).componentName, + values(data)[0] as string + ); + } + + /** + * Get the datas from the state store + * @param data The data for getBulk operation + * @param db The state store to getBulk the data + * @returns The promise of the getBulk action being executed. + */ + #stateGetBulk(data: object, db?: string): Promise { + const [keys, parallelism, metadata] = values(data) as unknown as [ + string[], + number, + string + ]; + return this.daprClient.state.getBulk( + this.getState(db).componentName, + keys, + parallelism, + metadata + ); + } + + /** + * Delete the data from the state store + * @param data The data for delete operation + * @param db The state store to delete the data + * @returns The promise of the delete action being executed. + */ + #stateDelete(data: object, db?: string): Promise { + if (isEmpty(data) || size(data) > 1) { + throw new Error('State get method: invalid key number'); + } + + return this.daprClient.state.delete( + this.getState(db).componentName, + values(data)[0] as string + ); + } + + /** + * Transaction the data from the state store + * @param data The data for transaction operation + * @param db The state store to transaction the data + * @returns The promise of the transaction action being executed. + */ + #stateTransaction(data: object, db?: string): Promise { + const [operations, metadata] = values(data) as unknown as [ + OperationType[], + IRequestMetadata + ]; + return this.daprClient.state.transaction( + this.getState(db).componentName, + operations as OperationType[], + metadata ? (metadata as IRequestMetadata) : null + ); + } + + /** + * query the data from the state store + * @param data The data for query operation + * @param db The state store to query the data + * @returns The promise of the query action being executed. + */ + #stateQuery(data: object, db?: string): Promise { + return this.daprClient.state.query( + this.getState(db).componentName, + values(data)[0] as StateQueryType + ); + } + + /** + * The promise that handle data by state store. + */ + get state(): StateOperations { + return { + save: this.#stateSave.bind(this), + get: this.#stateGet.bind(this), + getBulk: this.#stateGetBulk.bind(this), + delete: this.#stateDelete.bind(this), + transaction: this.#stateTransaction.bind(this), + query: this.#stateQuery.bind(this), + }; + } } diff --git a/test/conformance/.env-cmdrc.js b/test/conformance/.env-cmdrc.js index 4e2d094f..455b8489 100644 --- a/test/conformance/.env-cmdrc.js +++ b/test/conformance/.env-cmdrc.js @@ -14,6 +14,19 @@ module.exports = { }, }, }, + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + redis: { + componentName: 'myredis', + componentType: 'state.redis', + }, + mysql: { + componentName: 'mymysql', + componentType: 'state.mysql', + }, + }, }), }, async: { @@ -29,6 +42,19 @@ module.exports = { componentType: 'bindings.cron', }, }, + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + redis: { + componentName: 'myredis', + componentType: 'state.redis', + }, + mysql: { + componentName: 'mymysql', + componentType: 'state.mysql', + }, + }, }), }, }; diff --git a/test/conformance/function.js b/test/conformance/function.js index 08da0f73..c973158b 100644 --- a/test/conformance/function.js +++ b/test/conformance/function.js @@ -44,12 +44,90 @@ function writeJson(content) { fs.writeFileSync(fileName, json); } -async function tryKnativeAsync(ctx, data) { +async function tryKnativeAsyncBindingAndPubSub(ctx, data) { debug('✅ Function should receive request: %o', data); await ctx.send(data); ctx.res.send(data); } +async function tryKnativeAsyncStateSave(ctx, data) { + debug('✅ Function should receive request: %o', data); + await ctx.state + .save(data) + .then(res => { + debug('✅ Success save: %o', res); + }) + .catch(err => { + debug('❌ Failure occurred: %o', err); + }); + ctx.res.send(data); +} + +async function tryKnativeAsyncStateGet(ctx, data) { + debug('✅ Function should receive request: %o', data); + await ctx.state + .get(data) + .then(res => { + debug('✅ Success save: %o', res); + }) + .catch(err => { + debug('❌ Failure occurred: %o', err); + }); + ctx.res.send(data); +} + +async function tryKnativeAsyncStateGetBulk(ctx, data) { + debug('✅ Function should receive request: %o', data); + await ctx.state + .getBulk(data) + .then(res => { + debug('✅ Success getBulk: %o', res); + }) + .catch(err => { + debug('❌ Failure occurred: %o', err); + }); + ctx.res.send(data); +} + +async function tryKnativeAsyncStateDelete(ctx, data) { + debug('✅ Function should receive request: %o', data); + await ctx.state + .delete(data) + .then(res => { + debug('✅ Success delete: %o', res); + }) + .catch(err => { + debug('❌ Failure occurred: %o', err); + }); + ctx.res.send(data); +} + +async function tryKnativeAsyncStateTransaction(ctx, data) { + debug('✅ Function should receive request: %o', data); + await ctx.state + .transaction(data) + .then(res => { + debug('✅ Success transaction: %o', res); + }) + .catch(err => { + debug('❌ Failure occurred: %o', err); + }); + ctx.res.send(data); +} + +async function tryKnativeAsyncStateQuery(ctx, data) { + debug('✅ Function should receive request: %o', data); + await ctx.state + .query(data) + .then(res => { + debug('✅ Success query: %o', res); + }) + .catch(err => { + debug('❌ Failure occurred: %o', err); + }); + ctx.res.send(data); +} + function tryAsync(ctx, data) { debug('✅ Function should receive from "%o": %o', ctx.inputs, data); } @@ -58,6 +136,12 @@ module.exports = { writeHttp, writeCloudEvent, writeLegacyEvent, - tryKnativeAsync, + tryKnativeAsyncBindingAndPubSub, + tryKnativeAsyncStateSave, + tryKnativeAsyncStateGet, + tryKnativeAsyncStateGetBulk, + tryKnativeAsyncStateDelete, + tryKnativeAsyncStateTransaction, + tryKnativeAsyncStateQuery, tryAsync, }; diff --git a/test/conformance/package.json b/test/conformance/package.json index 3145dd38..1c43e6ce 100644 --- a/test/conformance/package.json +++ b/test/conformance/package.json @@ -9,10 +9,24 @@ "scripts": { "start": "functions-framework --target=writeHttp", "compile": "cd .. && npm run compile", - "knative:async": "npm run compile && 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 --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", + "knative:async:binding_pubsub": "npm run compile && concurrently npm:knative:async:binding_pubsub:run:* npm:knative:async:binding_pubsub:test", + "knative:async:binding_pubsub:run:func": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsyncBindingAndPubSub", + "knative:async:binding_pubsub:run:dapr": "dapr run -H 3500 -d ../data/components/http --log-level warn", + "knative:async:binding_pubsub:test": "wait-on tcp:3500 tcp:8080 && curl -s -d '{\"data\": \"hello\"}' -H 'Content-Type: application/json' localhost:8080", + "knative:async:state:run:docker":"docker run --name myredis --rm -d -p 6379:6379 redis/redis-stack-server:latest", + "knative:async:state:run:dapr":"dapr run -H 3500 -d ../data/components/state --log-level warn", + "knative:async:state:run:func:save": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsyncStateSave", + "knative:async:state:run:test:save": "wait-on tcp:3500 tcp:8080 && curl -s -d '{\"dataObjects\": [{\"key\": \"1\",\"value\": {\"person\": {\"org\": \"Dev Ops\",\"id\": 1036},\"city\": \"Seattle\",\"state\": \"WA\"}},{\"key\": \"2\",\"value\": {\"person\": {\"org\": \"Hardware\",\"id\": 1028},\"city\": \"Portland\",\"state\": \"OR\"}}]}' -H 'Content-Type: application/json' localhost:8080", + "knative:async:state:run:func:get": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsyncStateGet", + "knative:async:state:run:test:get":"wait-on tcp:3500 tcp:8080 && curl -s -d '{\"key\": \"1\"}' -H 'Content-Type: application/json' localhost:8080", + "knative:async:state:run:func:getBulk":"cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsyncStateGetBulk", + "knative:async:state:run:test:getBulk":"wait-on tcp:3500 tcp:8080 && curl -s -d '{\"keys\": [\"1\", \"2\"], \"parallelism\": 10}' -H 'Content-Type: application/json' localhost:8080", + "knative:async:state:run:func:delete":"cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsyncStateDelete", + "knative:async:state:run:test:delete":"wait-on tcp:3500 tcp:8080 && curl -s -d '{\"key\": \"1\"}' -H 'Content-Type: application/json' localhost:8080", + "knative:async:state:run:func:transaction":"cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsyncStateTransaction", + "knative:async:state:run:test:transaction":"wait-on tcp:3500 tcp:8080 && curl -s -d '{\"operations\": [{\"operation\": \"delete\", \"request\": {\"key\": \"2\"}}, {\"operation\": \"upsert\", \"request\": {\"key\": \"1\", \"value\": {\"person\": {\"org\": \"Dev Ops\", \"id\": 1036}, \"city\": \"Seattle\", \"state\": \"WA\"}}}]}' -H 'Content-Type: application/json' localhost:8080", + "knative:async:state:run:func:query":"cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e knative functions-framework --signature-type=openfunction --target=tryKnativeAsyncStateQuery", + "knative:async:state:run:test:query":"wait-on tcp:3500 tcp:8080 && curl -s -d '{\"query\": {\"filter\": {\"EQ\": {\"state\": \"CA\"}}, \"sort\": [{\"key\": \"person.id\", \"order\": \"DESC\"}], \"page\": {\"limit\": 1}}}' -H 'Content-Type: application/json' localhost:8080", "async": "npm run compile && concurrently npm:async:run:*", "async:run:func": "cross-env DEBUG=test:*,common:*,ofn:* env-cmd -e async functions-framework --target=tryAsync", "async:run:dapr": "dapr run -H 3500 -p 8080 -d ../data/components/cron --log-level info" diff --git a/test/data/components/state/state.yaml b/test/data/components/state/state.yaml new file mode 100644 index 00000000..b3a3b148 --- /dev/null +++ b/test/data/components/state/state.yaml @@ -0,0 +1,27 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: myredis + namespace: default +spec: + type: state.redis + version: v1 + metadata: + - name: redisHost + value: localhost:6379 + - name: redisPassword + value: '' + - name: queryIndexes + value: + [ + { + name: 'orgIndx', + indexes: + [ + {key: 'person.org', type: 'TEXT'}, + {key: 'person.id', type: 'NUMERIC'}, + {key: 'state', type: 'TEXT'}, + {key: 'city', type: 'TEXT'}, + ], + }, + ] \ No newline at end of file diff --git a/test/data/mock/context.ts b/test/data/mock/context.ts index 1f934a57..9334e360 100644 --- a/test/data/mock/context.ts +++ b/test/data/mock/context.ts @@ -23,6 +23,19 @@ export const KnativeBase: OpenFunctionContext = { }, }, }, + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + redis: { + componentName: 'myredis', + componentType: 'state.redis', + }, + mysql: { + componentName: 'mymysql', + componentType: 'state.mysql', + }, + }, }; export const AsyncBase: OpenFunctionContext = { diff --git a/test/data/mock/payload.ts b/test/data/mock/payload.ts index 57bca547..3efb284a 100644 --- a/test/data/mock/payload.ts +++ b/test/data/mock/payload.ts @@ -1,8 +1,37 @@ import {CloudEvent} from '../../../src'; +import {KeyValuePairType} from '@dapr/dapr/types/KeyValuePair.type'; +import {OperationType} from '@dapr/dapr/types/Operation.type'; +import {IRequestMetadata} from '@dapr/dapr/types/RequestMetadata.type'; +import {StateQueryType} from '@dapr/dapr/types/state/StateQuery.type'; export interface IPayload { RAW: object; CE?: CloudEvent; + State?: IStateStore; +} + +interface IStateStore { + Save: { + dataObjects: KeyValuePairType[]; + }; + Get: { + key: string; + }; + GetBulk: { + keys: string[]; + parallelism?: number; + metadata?: string[]; + }; + Delete: { + key: string; + }; + Transaction: { + operations?: OperationType[]; + metadata?: IRequestMetadata | null; + }; + Query: { + query: StateQueryType; + }; } export const Plain: IPayload = {RAW: {some: 'payload'}}; @@ -17,3 +46,82 @@ Plain.CE = { datacontenttype: 'application/json', data: Plain.RAW, }; + +Plain.State = { + Save: { + dataObjects: [ + { + key: '1', + value: { + person: { + org: 'Dev Ops', + id: 1036, + }, + city: 'Seattle', + state: 'WA', + }, + }, + { + key: '2', + value: { + person: { + org: 'Hardware', + id: 1028, + }, + city: 'Portland', + state: 'OR', + }, + }, + ], + }, + Get: { + key: '1', + }, + GetBulk: { + keys: ['1', '2'], + parallelism: 10, + }, + Delete: { + key: '1', + }, + Transaction: { + operations: [ + { + operation: 'delete', + request: { + key: '2', + }, + }, + { + operation: 'upsert', + request: { + key: '1', + value: { + person: { + org: 'Dev Ops', + id: 1036, + }, + city: 'Seattle', + state: 'WA', + }, + }, + }, + ], + }, + Query: { + query: { + filter: { + EQ: {state: 'CA'}, + }, + sort: [ + { + key: 'person.id', + order: 'DESC', + }, + ], + page: { + limit: 2, + }, + }, + }, +}; diff --git a/test/integration/http_statestore.ts b/test/integration/http_statestore.ts new file mode 100644 index 00000000..6550935a --- /dev/null +++ b/test/integration/http_statestore.ts @@ -0,0 +1,184 @@ +import {deepStrictEqual} from 'assert'; + +import * as sinon from 'sinon'; +import * as supertest from 'supertest'; +import * as shell from 'shelljs'; +import {cloneDeep, map, omit} from 'lodash'; + +import {OpenFunctionRuntime} from '../../src/functions'; +import {FUNCTION_STATUS_HEADER_FIELD} from '../../src/types'; +import {getServer} from '../../src/server'; +import {StateOperations} from '../../src/openfunction/runtime'; + +import {Context, Payload} from '../data/mock'; +import {KeyValueType} from '@dapr/dapr/types/KeyValue.type'; + +const TEST_CONTEXT = { + ...Context.KnativeBase, +}; + +const TEST_STATESTORE_SAVE = Payload.Plain.State!.Save; +const TEST_STATESTORE_GET = Payload.Plain.State!.Get; +const TEST_STATESTORE_BULK = Payload.Plain.State!.GetBulk; +const TEST_STATESTORE_DELETE = Payload.Plain.State!.Delete; +const TEST_STATESTORE_TRANSACTION = Payload.Plain.State!.Transaction; +const TEST_STATESTORE_QUERY = Payload.Plain.State!.Query; + +type StateOperation = keyof StateOperations; + +describe('OpenFunction - HTTP StateStore', () => { + const APPID = 'http_statestore'; + + before(() => { + if (shell.exec('dapr', {silent: true}).code !== 0) + throw new Error('Please ensure "dapr" is installed'); + + if (shell.exec('docker', {silent: true}).code !== 0) + throw new Error('Please ensure "docker" is installed'); + + // Try to start up redis docker container + shell.exec( + 'docker run --name myredis --rm -d -p 6379:6379 redis/redis-stack-server:latest', + { + silent: true, + } + ); + + // Try to run Dapr sidecar on port 3500 with components for testing + shell.exec( + `dapr run -H 3500 -G 50001 -d ./test/data/components/state -a ${APPID}`, + {silent: true, async: true} + ); + }); + + after(() => { + // Stop redis container + shell.exec('docker stop myredis', {silent: true}); + // Stop dapr sidecar process + shell.exec(`dapr stop ${APPID}`, {silent: true}); + }); + + beforeEach(() => { + // Prevent log spew from the PubSub emulator request. + sinon.stub(console, 'error'); + }); + afterEach(() => { + (console.error as sinon.SinonSpy).restore(); + }); + + const testData = [ + { + name: 'Save data', + tosend: TEST_STATESTORE_SAVE, + operation: 'save', + expect: undefined, + }, + { + name: 'Get data', + operation: 'get', + tosend: TEST_STATESTORE_GET, + expect: { + city: 'Seattle', + person: { + id: 1036, + org: 'Dev Ops', + }, + state: 'WA', + }, + }, + { + name: 'GetBulk data', + operation: 'getBulk', + tosend: TEST_STATESTORE_BULK, + expect: [ + { + data: { + city: 'Seattle', + person: { + id: 1036, + org: 'Dev Ops', + }, + state: 'WA', + }, + key: '1', + }, + { + data: { + city: 'Portland', + person: { + id: 1028, + org: 'Hardware', + }, + state: 'OR', + }, + key: '2', + }, + ], + }, + { + name: 'Delete data', + operation: 'delete', + tosend: TEST_STATESTORE_DELETE, + expect: undefined, + }, + { + name: 'Transcation data', + operation: 'transaction', + tosend: TEST_STATESTORE_TRANSACTION, + expect: undefined, + }, + { + name: 'Query data', + operation: 'query', + tosend: TEST_STATESTORE_QUERY, + // expect: undefined, + }, + ]; + + for (const test of testData) { + it(test.name, async () => { + const context = cloneDeep(TEST_CONTEXT); + // test the ouput of the state sotre + const server = getServer( + async (ctx: OpenFunctionRuntime, data: {}) => { + if (!test.operation) throw new Error('I crashed'); + + await ctx.state[test.operation as StateOperation](data) + .then(res => { + if (test.operation === 'getBulk') { + res = map(res as KeyValueType[], obj => omit(obj, 'etag')); + } + // todo: query still have some problems + if (test.operation === 'query') { + console.log(res); + } + deepStrictEqual(res, test.expect); + }) + .catch(err => { + console.log(err); + }); + // FIXME: This makes server respond right away, even before post hooks + ctx.res?.send(data); + }, + 'openfunction', + context + ); + + await supertest(server) + .post('/') + .send(test.tosend) + .expect(test.operation ? 200 : 500) + // Assert HTTP response first + .then(res => { + if (!test.operation) { + deepStrictEqual( + res.headers[FUNCTION_STATUS_HEADER_FIELD.toLowerCase()], + 'error' + ); + } else { + deepStrictEqual(res.body, test.tosend); + } + }); + }); + } +}); From 164553d1b715d80445895b2e769986fe06e61c9d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 09:05:37 +0000 Subject: [PATCH 121/131] docs: update README.md [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b830400..8d735d88 100644 --- a/README.md +++ b/README.md @@ -303,7 +303,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d MachaYAD
MachaYAD

đŸ’ģ James.Ji
James.Ji

🐛 - yi-ge-dian
yi-ge-dian

🚧 + yi-ge-dian
yi-ge-dian

🚧 đŸ’ģ From 7bc86e3d1bb5036c3fc744d6691ccae6c63ea3ee Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 09:05:38 +0000 Subject: [PATCH 122/131] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 13ba6708..b67a0f9b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -29,7 +29,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/68337798?v=4", "profile": "https://onepoint.link", "contributions": [ - "maintenance" + "maintenance", + "code" ] } ], From decff1f79962286bd0f1a041a3ad7a0a6d04110e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jul 2023 03:06:32 +0000 Subject: [PATCH 123/131] chore(deps): bump cloudevents from 7.0.1 to 8.0.0 Bumps [cloudevents](https://github.com/cloudevents/sdk-javascript) from 7.0.1 to 8.0.0. - [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/v7.0.1...v8.0.0) --- updated-dependencies: - dependency-name: cloudevents dependency-type: direct:production update-type: version-update:semver-major ... 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 1f71c699..b76b210c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@dapr/dapr": "2.5.0", "body-parser": "^1.20.1", - "cloudevents": "^7.0.1", + "cloudevents": "^8.0.0", "debug": "^4.3.4", "express": "^4.18.2", "express-interceptor": "^1.2.0", @@ -1585,9 +1585,9 @@ } }, "node_modules/cloudevents": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.1.tgz", - "integrity": "sha512-/i7HRvIUG2RAiB9AD6TqUd07H2ZkJtwCrNpGa4vJftwz5uJdD/bO+u3kYs/r+kQCtZ6uhZs0I9vfIhuhorKUHw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-8.0.0.tgz", + "integrity": "sha512-G1Z/r8QMFAsP+F1PuZSHzx1ocPy4vrdQMTHD3orjDaM5kccmPU6nMmpVrF07b53aaxcrLbORUmRepY/DgvdhVw==", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", @@ -8471,9 +8471,9 @@ } }, "cloudevents": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.1.tgz", - "integrity": "sha512-/i7HRvIUG2RAiB9AD6TqUd07H2ZkJtwCrNpGa4vJftwz5uJdD/bO+u3kYs/r+kQCtZ6uhZs0I9vfIhuhorKUHw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-8.0.0.tgz", + "integrity": "sha512-G1Z/r8QMFAsP+F1PuZSHzx1ocPy4vrdQMTHD3orjDaM5kccmPU6nMmpVrF07b53aaxcrLbORUmRepY/DgvdhVw==", "requires": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", diff --git a/package.json b/package.json index 912c4d7e..10758246 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "dependencies": { "@dapr/dapr": "2.5.0", "body-parser": "^1.20.1", - "cloudevents": "^7.0.1", + "cloudevents": "^8.0.0", "debug": "^4.3.4", "express": "^4.18.2", "express-interceptor": "^1.2.0", From 8a3b0e7b3e878f01279a9ba53335c8dc4920bf73 Mon Sep 17 00:00:00 2001 From: yi-ge-dian <1085266008@qq.com> Date: Fri, 25 Aug 2023 20:48:55 +0800 Subject: [PATCH 124/131] =?UTF-8?q?=E2=9C=A8=20feat(test):=20introduce=20K?= =?UTF-8?q?inD=20based=20e2e=20testing=20(#205)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feature(test): finish kind based e2e testing Signed-off-by: yi-ge-dian * 📃 docs(e2e): add e2e readme docs Signed-off-by: yi-ge-dian * 📃 docs(e2e): touch up the README document Signed-off-by: yi-ge-dian --------- Signed-off-by: yi-ge-dian --- .eslintignore | 2 +- .github/workflows/e2e.yaml | 57 ++ docs/generated/api.json | 51 +- package-lock.json | 716 +++++++++++------- package.json | 3 +- test/conformance/function.js | 2 +- test/data/components/state/state.yaml | 24 +- test/data/mock/context.ts | 6 +- test/data/mock/payload.ts | 2 +- .../README.assets/image-20230823144027351.png | Bin 0 -> 335398 bytes .../README.assets/image-20230823194111158.png | Bin 0 -> 333786 bytes .../README.assets/image-20230824150648598.png | Bin 0 -> 82864 bytes test/e2e/README.md | 128 ++++ test/e2e/async-openfunction-bindings/e2e.yaml | 68 ++ .../expected.data.yaml | 1 + .../manifests.yaml | 117 +++ .../sender/.env-cmdrc.js | 22 + .../sender/Dockerfile.async.bindings.sender | 18 + .../sender/function.js | 11 + .../target/.env-cmdrc.js | 15 + .../target/Dockerfile.async.bindings.target | 18 + .../target/function.js | 7 + .../e2e/async-openfunction-bindings/verify.sh | 5 + test/e2e/async-openfunction-pubsub/e2e.yaml | 68 ++ .../expected.data.yaml | 1 + .../async-openfunction-pubsub/manifests.yaml | 117 +++ .../pub/.env-cmdrc.js | 23 + .../pub/Dockerfile.async.pubsub.publisher | 18 + .../async-openfunction-pubsub/pub/function.js | 11 + .../sub/.env-cmdrc.js | 17 + .../sub/Dockerfile.async.pubsub.subscriber | 18 + .../async-openfunction-pubsub/sub/function.js | 7 + test/e2e/async-openfunction-pubsub/verify.sh | 5 + test/e2e/kafka.yaml | 62 ++ test/e2e/kind.yaml | 53 ++ .../Dockerfile.knative.cloudevent | 18 + test/e2e/knative-cloudevent/e2e.yaml | 48 ++ .../e2e/knative-cloudevent/expected.data.yaml | 1 + test/e2e/knative-cloudevent/function.js | 8 + test/e2e/knative-cloudevent/manifests.yaml | 41 + test/e2e/knative-cloudevent/verify.sh | 33 + .../knative-event/Dockerfile.knative.event | 18 + test/e2e/knative-event/e2e.yaml | 48 ++ test/e2e/knative-event/expected.data.yaml | 1 + test/e2e/knative-event/function.js | 8 + test/e2e/knative-event/manifests.yaml | 41 + test/e2e/knative-event/verify.sh | 32 + test/e2e/knative-http/Dockerfile.knative.http | 18 + test/e2e/knative-http/e2e.yaml | 48 ++ test/e2e/knative-http/expected.data.yaml | 1 + test/e2e/knative-http/function.js | 9 + test/e2e/knative-http/manifests.yaml | 41 + test/e2e/knative-http/verify.sh | 22 + .../.env-cmdrc.js | 21 + .../Dockerfile.knative.bindings | 18 + .../knative-openfunction-bindings/e2e.yaml | 60 ++ .../expected.data.yaml | 1 + .../knative-openfunction-bindings/function.js | 9 + .../manifests.yaml | 66 ++ .../knative-openfunction-bindings/verify.sh | 22 + .../knative-openfunction-pubsub/.env-cmdrc.js | 16 + .../Dockerfile.knative.pubsub | 18 + test/e2e/knative-openfunction-pubsub/e2e.yaml | 60 ++ .../expected.data.yaml | 1 + .../knative-openfunction-pubsub/function.js | 9 + .../manifests.yaml | 66 ++ .../e2e/knative-openfunction-pubsub/verify.sh | 22 + .../delete/.env-cmdrc.js | 18 + .../delete/Dockerfile.knative.state.delete | 18 + .../delete/function.js | 16 + test/e2e/knative-openfunction-state/e2e.yaml | 87 +++ .../expected.data.yaml | 9 + .../get/.env-cmdrc.js | 18 + .../get/Dockerfile.knative.state.get | 18 + .../get/function.js | 16 + .../getbulk/.env-cmdrc.js | 18 + .../getbulk/Dockerfile.knative.state.getbulk | 18 + .../getbulk/function.js | 16 + .../knative-openfunction-state/manifests.yaml | 298 ++++++++ .../knative-openfunction-state/pg-values.yaml | 8 + .../query/.env-cmdrc.js | 18 + .../query/Dockerfile.knative.state.query | 18 + .../query/function.js | 19 + .../save/.env-cmdrc.js | 18 + .../save/Dockerfile.knative.state.save | 18 + .../save/function.js | 16 + .../transaction/.env-cmdrc.js | 18 + .../Dockerfile.knative.state.transaction | 18 + .../transaction/function.js | 16 + test/e2e/knative-openfunction-state/verify.sh | 113 +++ test/e2e/openfunction-plugins/.env-cmdrc.js | 33 + .../Docker.openfunction.skywalking | 22 + test/e2e/openfunction-plugins/e2e.yaml | 58 ++ .../openfunction-plugins/expected.data.yaml | 18 + test/e2e/openfunction-plugins/function.js | 16 + test/e2e/openfunction-plugins/manifests.yaml | 68 ++ test/e2e/openfunction-plugins/package.json | 12 + test/e2e/openfunction-plugins/pg-values.yaml | 8 + .../plugins/skywalking.mjs | 57 ++ .../openfunction-plugins/plugins/ticktock.mjs | 17 + test/e2e/openfunction-plugins/verify.sh | 39 + test/integration/async_server.ts | 2 +- .../{http_statestore.ts => http_astate.ts} | 70 +- test/integration/http_binding.ts | 2 +- tsconfig.json | 2 +- 105 files changed, 3420 insertions(+), 332 deletions(-) create mode 100644 .github/workflows/e2e.yaml create mode 100644 test/e2e/README.assets/image-20230823144027351.png create mode 100644 test/e2e/README.assets/image-20230823194111158.png create mode 100644 test/e2e/README.assets/image-20230824150648598.png create mode 100644 test/e2e/README.md create mode 100644 test/e2e/async-openfunction-bindings/e2e.yaml create mode 100644 test/e2e/async-openfunction-bindings/expected.data.yaml create mode 100644 test/e2e/async-openfunction-bindings/manifests.yaml create mode 100644 test/e2e/async-openfunction-bindings/sender/.env-cmdrc.js create mode 100644 test/e2e/async-openfunction-bindings/sender/Dockerfile.async.bindings.sender create mode 100644 test/e2e/async-openfunction-bindings/sender/function.js create mode 100644 test/e2e/async-openfunction-bindings/target/.env-cmdrc.js create mode 100644 test/e2e/async-openfunction-bindings/target/Dockerfile.async.bindings.target create mode 100644 test/e2e/async-openfunction-bindings/target/function.js create mode 100644 test/e2e/async-openfunction-bindings/verify.sh create mode 100644 test/e2e/async-openfunction-pubsub/e2e.yaml create mode 100644 test/e2e/async-openfunction-pubsub/expected.data.yaml create mode 100644 test/e2e/async-openfunction-pubsub/manifests.yaml create mode 100644 test/e2e/async-openfunction-pubsub/pub/.env-cmdrc.js create mode 100644 test/e2e/async-openfunction-pubsub/pub/Dockerfile.async.pubsub.publisher create mode 100644 test/e2e/async-openfunction-pubsub/pub/function.js create mode 100644 test/e2e/async-openfunction-pubsub/sub/.env-cmdrc.js create mode 100644 test/e2e/async-openfunction-pubsub/sub/Dockerfile.async.pubsub.subscriber create mode 100644 test/e2e/async-openfunction-pubsub/sub/function.js create mode 100644 test/e2e/async-openfunction-pubsub/verify.sh create mode 100644 test/e2e/kafka.yaml create mode 100644 test/e2e/kind.yaml create mode 100644 test/e2e/knative-cloudevent/Dockerfile.knative.cloudevent create mode 100644 test/e2e/knative-cloudevent/e2e.yaml create mode 100644 test/e2e/knative-cloudevent/expected.data.yaml create mode 100644 test/e2e/knative-cloudevent/function.js create mode 100644 test/e2e/knative-cloudevent/manifests.yaml create mode 100644 test/e2e/knative-cloudevent/verify.sh create mode 100644 test/e2e/knative-event/Dockerfile.knative.event create mode 100644 test/e2e/knative-event/e2e.yaml create mode 100644 test/e2e/knative-event/expected.data.yaml create mode 100644 test/e2e/knative-event/function.js create mode 100644 test/e2e/knative-event/manifests.yaml create mode 100644 test/e2e/knative-event/verify.sh create mode 100644 test/e2e/knative-http/Dockerfile.knative.http create mode 100644 test/e2e/knative-http/e2e.yaml create mode 100644 test/e2e/knative-http/expected.data.yaml create mode 100644 test/e2e/knative-http/function.js create mode 100644 test/e2e/knative-http/manifests.yaml create mode 100644 test/e2e/knative-http/verify.sh create mode 100644 test/e2e/knative-openfunction-bindings/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-bindings/Dockerfile.knative.bindings create mode 100644 test/e2e/knative-openfunction-bindings/e2e.yaml create mode 100644 test/e2e/knative-openfunction-bindings/expected.data.yaml create mode 100644 test/e2e/knative-openfunction-bindings/function.js create mode 100644 test/e2e/knative-openfunction-bindings/manifests.yaml create mode 100644 test/e2e/knative-openfunction-bindings/verify.sh create mode 100644 test/e2e/knative-openfunction-pubsub/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-pubsub/Dockerfile.knative.pubsub create mode 100644 test/e2e/knative-openfunction-pubsub/e2e.yaml create mode 100644 test/e2e/knative-openfunction-pubsub/expected.data.yaml create mode 100644 test/e2e/knative-openfunction-pubsub/function.js create mode 100644 test/e2e/knative-openfunction-pubsub/manifests.yaml create mode 100644 test/e2e/knative-openfunction-pubsub/verify.sh create mode 100644 test/e2e/knative-openfunction-state/delete/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-state/delete/Dockerfile.knative.state.delete create mode 100644 test/e2e/knative-openfunction-state/delete/function.js create mode 100644 test/e2e/knative-openfunction-state/e2e.yaml create mode 100644 test/e2e/knative-openfunction-state/expected.data.yaml create mode 100644 test/e2e/knative-openfunction-state/get/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-state/get/Dockerfile.knative.state.get create mode 100644 test/e2e/knative-openfunction-state/get/function.js create mode 100644 test/e2e/knative-openfunction-state/getbulk/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-state/getbulk/Dockerfile.knative.state.getbulk create mode 100644 test/e2e/knative-openfunction-state/getbulk/function.js create mode 100644 test/e2e/knative-openfunction-state/manifests.yaml create mode 100644 test/e2e/knative-openfunction-state/pg-values.yaml create mode 100644 test/e2e/knative-openfunction-state/query/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-state/query/Dockerfile.knative.state.query create mode 100644 test/e2e/knative-openfunction-state/query/function.js create mode 100644 test/e2e/knative-openfunction-state/save/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-state/save/Dockerfile.knative.state.save create mode 100644 test/e2e/knative-openfunction-state/save/function.js create mode 100644 test/e2e/knative-openfunction-state/transaction/.env-cmdrc.js create mode 100644 test/e2e/knative-openfunction-state/transaction/Dockerfile.knative.state.transaction create mode 100644 test/e2e/knative-openfunction-state/transaction/function.js create mode 100644 test/e2e/knative-openfunction-state/verify.sh create mode 100644 test/e2e/openfunction-plugins/.env-cmdrc.js create mode 100644 test/e2e/openfunction-plugins/Docker.openfunction.skywalking create mode 100644 test/e2e/openfunction-plugins/e2e.yaml create mode 100644 test/e2e/openfunction-plugins/expected.data.yaml create mode 100644 test/e2e/openfunction-plugins/function.js create mode 100644 test/e2e/openfunction-plugins/manifests.yaml create mode 100644 test/e2e/openfunction-plugins/package.json create mode 100644 test/e2e/openfunction-plugins/pg-values.yaml create mode 100644 test/e2e/openfunction-plugins/plugins/skywalking.mjs create mode 100644 test/e2e/openfunction-plugins/plugins/ticktock.mjs create mode 100644 test/e2e/openfunction-plugins/verify.sh rename test/integration/{http_statestore.ts => http_astate.ts} (81%) diff --git a/.eslintignore b/.eslintignore index 93d966f5..7b36b348 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,5 +1,5 @@ **/node_modules build/ test/data/esm_* -test/data/plugins docs/ +**/plugins/** diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml new file mode 100644 index 00000000..d9975ee0 --- /dev/null +++ b/.github/workflows/e2e.yaml @@ -0,0 +1,57 @@ +name: Node.js E2E CI + +on: + push: + branches: [master] + paths: + - ".github/workflows/**" + - "docs/**" + - "src/**" + - "test/**" + - "package.json" + - "package-lock.json" + +jobs: + e2e_test: + runs-on: ubuntu-latest + timeout-minutes: 30 + name: E2E Tests + strategy: + matrix: + case: + - name: knative http e2e test + e2e: "test/e2e/knative-http/e2e.yaml" + - name: knative cloudevent e2e test + e2e: "test/e2e/knative-cloudevent/e2e.yaml" + - name: knative event e2e test + e2e: "test/e2e/knative-event/e2e.yaml" + - name: knative openfunction bindings e2e test + e2e: "test/e2e/knative-openfunction-bindings/e2e.yaml" + - name: knative openfunction pubsub e2e test + e2e: "test/e2e/knative-openfunction-pubsub/e2e.yaml" + # - name: async openfunction bindings e2e test + # e2e: "test/e2e/async-openfunction-bindings/e2e.yaml" + # - name: async openfunction pubsub e2e test + # e2e: "test/e2e/async-openfunction-pubsub/e2e.yaml" + # - name: knative openfunction state e2e test + # e2e: "test/e2e/knative-openfunction-state/e2e.yaml" + - name: openfunction plugins e2e test + e2e: "test/e2e/openfunction-plugins/e2e.yaml" + steps: + - uses: actions/checkout@v2 + + - name: install yq + env: + VERSION: v4.22.1 + BINARY: yq_linux_amd64 + run: | + wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - |\ + tar xz && mv ${BINARY} /usr/local/bin/yq + + - uses: apache/skywalking-infra-e2e@main + with: + e2e-file: ${{matrix.case.e2e}} + + - name: Cleanup + if: ${{ failure() }} + run: e2e cleanup -c ${{matrix.case.e2e}} diff --git a/docs/generated/api.json b/docs/generated/api.json index bc979772..7a80d216 100644 --- a/docs/generated/api.json +++ b/docs/generated/api.json @@ -1,8 +1,8 @@ { "metadata": { "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.33.5", - "schemaVersion": 1010, + "toolVersion": "7.36.3", + "schemaVersion": 1011, "oldestForwardsCompatibleVersion": 1001, "tsdocConfig": { "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", @@ -653,6 +653,7 @@ ], "fileUrlPath": "src/openfunction/context.ts", "releaseTag": "Public", + "isAbstract": false, "name": "ContextUtils", "preserveMemberOrder": false, "members": [ @@ -702,6 +703,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "IsAsyncRuntime" }, { @@ -750,6 +752,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "IsBindingComponent" }, { @@ -798,6 +801,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "IsKnativeRuntime" }, { @@ -846,6 +850,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "IsPubSubComponent" }, { @@ -894,6 +899,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "IsStateComponent" } ], @@ -2203,6 +2209,7 @@ ], "fileUrlPath": "src/openfunction/runtime.ts", "releaseTag": "Public", + "isAbstract": true, "name": "OpenFunctionRuntime", "preserveMemberOrder": false, "members": [ @@ -2267,7 +2274,8 @@ "endIndex": 2 }, "isStatic": false, - "isProtected": true + "isProtected": true, + "isAbstract": false }, { "kind": "Property", @@ -2297,7 +2305,8 @@ "endIndex": 2 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": false }, { "kind": "Method", @@ -2345,6 +2354,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "getPlugin" }, { @@ -2379,7 +2389,8 @@ "endIndex": 3 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": false }, { "kind": "Method", @@ -2428,6 +2439,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "Parse" }, { @@ -2477,6 +2489,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "ProxyContext" }, { @@ -2538,7 +2551,8 @@ "endIndex": 9 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": false }, { "kind": "Property", @@ -2581,7 +2595,8 @@ "endIndex": 5 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": false }, { "kind": "Method", @@ -2649,6 +2664,7 @@ } ], "isOptional": false, + "isAbstract": true, "name": "send" }, { @@ -2714,6 +2730,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "setTrigger" }, { @@ -2743,7 +2760,8 @@ "endIndex": 2 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": false }, { "kind": "Property", @@ -2773,7 +2791,8 @@ "endIndex": 2 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": true }, { "kind": "Property", @@ -2803,7 +2822,8 @@ "endIndex": 2 }, "isStatic": false, - "isProtected": true + "isProtected": true, + "isAbstract": false }, { "kind": "Method", @@ -2886,6 +2906,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "WrapUserFunction" } ], @@ -2903,6 +2924,7 @@ ], "fileUrlPath": "src/openfunction/plugin.ts", "releaseTag": "Public", + "isAbstract": false, "name": "Plugin_2", "preserveMemberOrder": false, "members": [ @@ -3039,6 +3061,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "execPostHook" }, { @@ -3126,6 +3149,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "execPreHook" }, { @@ -3182,6 +3206,7 @@ } ], "isOptional": false, + "isAbstract": false, "name": "get" }, { @@ -3211,7 +3236,8 @@ "endIndex": 2 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": false }, { "kind": "Property", @@ -3240,7 +3266,8 @@ "endIndex": 2 }, "isStatic": false, - "isProtected": false + "isProtected": false, + "isAbstract": false } ], "implementsTokenRanges": [] diff --git a/package-lock.json b/package-lock.json index 1f71c699..95481247 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,8 @@ "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", - "skywalking-backend-js": "^0.6.0" + "skywalking-backend-js": "^0.6.0", + "ts-node": "^10.9.1" }, "bin": { "functions-framework": "build/src/main.js", @@ -115,6 +116,17 @@ "node": ">=0.1.90" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -283,6 +295,28 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@js-temporal/polyfill": { "version": "0.3.0", "resolved": "https://registry.npmmirror.com/@js-temporal/polyfill/-/polyfill-0.3.0.tgz", @@ -301,72 +335,61 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.33.5", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.33.5.tgz", - "integrity": "sha512-ENoWpTWarKNuodpRFDQr3jyBigHuv98KuJ8H5qXc1LZ1aP5Mk77lCo88HbPisTmSnGevJJHTScfd/DPznOb4CQ==", + "version": "7.36.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.36.3.tgz", + "integrity": "sha512-u0H6362AQq+r55X8drHx4npgkrCfJnMzRRHfQo8PMNKB8TcBnrTLfXhXWi+xnTM6CzlU/netEN8c4bq581Rnrg==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.25.2", + "@microsoft/api-extractor-model": "7.27.5", "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2", - "@rushstack/rig-package": "0.3.17", - "@rushstack/ts-command-line": "4.13.0", + "@rushstack/node-core-library": "3.59.6", + "@rushstack/rig-package": "0.4.0", + "@rushstack/ts-command-line": "4.15.1", "colors": "~1.2.1", "lodash": "~4.17.15", - "resolve": "~1.17.0", - "semver": "~7.3.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "~4.8.4" + "typescript": "~5.0.4" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.25.2", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", - "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.27.5.tgz", + "integrity": "sha512-9/tBzYMJitR+o+zkPr1lQh2+e8ClcaTF6eZo7vZGDqRt2O5XmXWPbYJZmxyM3wb5at6lfJNEeGZrQXLjsQ0Nbw==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/resolve": { - "version": "1.17.0", - "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" + "@rushstack/node-core-library": "3.59.6" } }, - "node_modules/@microsoft/api-extractor/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { - "semver": "bin/semver.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10" + "node": ">=12.20" } }, "node_modules/@microsoft/tsdoc": { "version": "0.14.2", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { "version": "0.16.2", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "dependencies": { @@ -378,12 +401,15 @@ }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", + "resolved": "https://registry.npmjs.org/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": { @@ -476,74 +502,42 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { - "version": "3.53.2", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.2.tgz", - "integrity": "sha512-FggLe5DQs0X9MNFeJN3/EXwb+8hyZUTEp2i+V1e8r4Va4JgkjBNY0BuEaQI+3DW6S4apV3UtXU3im17MSY00DA==", + "version": "3.59.6", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.59.6.tgz", + "integrity": "sha512-bMYJwNFfWXRNUuHnsE9wMlW/mOB4jIwSUkRKtu02CwZhQdmzMsUbxE0s1xOLwTpNIwlzfW/YT7OnOHgDffLgYg==", "dev": true, "dependencies": { - "@types/node": "12.20.24", "colors": "~1.2.1", "fs-extra": "~7.0.1", "import-lazy": "~4.0.0", "jju": "~1.4.0", - "resolve": "~1.17.0", - "semver": "~7.3.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", "z-schema": "~5.0.2" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/@types/node": { - "version": "12.20.24", - "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.npmmirror.com/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" }, - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "@types/node": "*" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@rushstack/rig-package": { - "version": "0.3.17", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.17.tgz", - "integrity": "sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.4.0.tgz", + "integrity": "sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==", "dev": true, "dependencies": { - "resolve": "~1.17.0", + "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" } }, - "node_modules/@rushstack/rig-package/node_modules/resolve": { - "version": "1.17.0", - "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" - } - }, "node_modules/@rushstack/ts-command-line": { - "version": "4.13.0", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", - "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.15.1.tgz", + "integrity": "sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -617,9 +611,29 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, "node_modules/@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmmirror.com/@types/argparse/-/argparse-1.0.38.tgz", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, @@ -1058,6 +1072,14 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/aedes": { "version": "0.47.0", "resolved": "https://registry.npmmirror.com/aedes/-/aedes-0.47.0.tgz", @@ -1225,6 +1247,11 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1653,7 +1680,7 @@ }, "node_modules/colors": { "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/colors/-/colors-1.2.5.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true, "engines": { @@ -1681,11 +1708,14 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, - "optional": true + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } }, "node_modules/component-emitter": { "version": "1.3.0", @@ -1966,6 +1996,11 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/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==" + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", @@ -2475,9 +2510,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3199,7 +3234,7 @@ }, "node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "dependencies": { @@ -3398,9 +3433,9 @@ "integrity": "sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==" }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/graphql": { @@ -3732,7 +3767,7 @@ }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/import-lazy/-/import-lazy-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, "engines": { @@ -3966,9 +4001,9 @@ } }, "node_modules/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==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -4199,7 +4234,7 @@ }, "node_modules/jju": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/jju/-/jju-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, @@ -4272,7 +4307,7 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "optionalDependencies": { @@ -4346,7 +4381,7 @@ }, "node_modules/lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, @@ -4476,6 +4511,11 @@ "node": ">=10" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -5046,9 +5086,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -5809,12 +5849,16 @@ } }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5969,9 +6013,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6365,9 +6409,9 @@ ] }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { "node": ">=0.6.19" @@ -6516,6 +6560,17 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/table": { "version": "6.7.3", "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", @@ -6667,6 +6722,67 @@ "node": ">=6" } }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.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", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -6748,7 +6864,6 @@ "version": "4.8.4", "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6773,7 +6888,7 @@ }, "node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { @@ -6842,6 +6957,11 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, "node_modules/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", @@ -6852,9 +6972,9 @@ } }, "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmmirror.com/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", "dev": true, "engines": { "node": ">= 0.10" @@ -6999,9 +7119,9 @@ } }, "node_modules/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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7174,6 +7294,14 @@ "node": ">=8" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -7187,9 +7315,9 @@ } }, "node_modules/z-schema": { - "version": "5.0.4", - "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.4.tgz", - "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", "dev": true, "dependencies": { "lodash.get": "^4.4.2", @@ -7203,7 +7331,7 @@ "node": ">=8.0.0" }, "optionalDependencies": { - "commander": "^2.20.3" + "commander": "^9.4.1" } } }, @@ -7245,6 +7373,14 @@ "resolved": "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, "@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -7388,6 +7524,25 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@js-temporal/polyfill": { "version": "0.3.0", "resolved": "https://registry.npmmirror.com/@js-temporal/polyfill/-/polyfill-0.3.0.tgz", @@ -7405,65 +7560,53 @@ } }, "@microsoft/api-extractor": { - "version": "7.33.5", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.33.5.tgz", - "integrity": "sha512-ENoWpTWarKNuodpRFDQr3jyBigHuv98KuJ8H5qXc1LZ1aP5Mk77lCo88HbPisTmSnGevJJHTScfd/DPznOb4CQ==", + "version": "7.36.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.36.3.tgz", + "integrity": "sha512-u0H6362AQq+r55X8drHx4npgkrCfJnMzRRHfQo8PMNKB8TcBnrTLfXhXWi+xnTM6CzlU/netEN8c4bq581Rnrg==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.25.2", + "@microsoft/api-extractor-model": "7.27.5", "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2", - "@rushstack/rig-package": "0.3.17", - "@rushstack/ts-command-line": "4.13.0", + "@rushstack/node-core-library": "3.59.6", + "@rushstack/rig-package": "0.4.0", + "@rushstack/ts-command-line": "4.15.1", "colors": "~1.2.1", "lodash": "~4.17.15", - "resolve": "~1.17.0", - "semver": "~7.3.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "~4.8.4" + "typescript": "~5.0.4" }, "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.25.2", - "resolved": "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", - "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.27.5.tgz", + "integrity": "sha512-9/tBzYMJitR+o+zkPr1lQh2+e8ClcaTF6eZo7vZGDqRt2O5XmXWPbYJZmxyM3wb5at6lfJNEeGZrQXLjsQ0Nbw==", "dev": true, "requires": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2" + "@rushstack/node-core-library": "3.59.6" } }, "@microsoft/tsdoc": { "version": "0.14.2", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "@microsoft/tsdoc-config": { "version": "0.16.2", - "resolved": "https://registry.npmmirror.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "requires": { @@ -7475,7 +7618,7 @@ "dependencies": { "resolve": { "version": "1.19.0", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.19.0.tgz", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { @@ -7566,72 +7709,34 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@rushstack/node-core-library": { - "version": "3.53.2", - "resolved": "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-3.53.2.tgz", - "integrity": "sha512-FggLe5DQs0X9MNFeJN3/EXwb+8hyZUTEp2i+V1e8r4Va4JgkjBNY0BuEaQI+3DW6S4apV3UtXU3im17MSY00DA==", + "version": "3.59.6", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.59.6.tgz", + "integrity": "sha512-bMYJwNFfWXRNUuHnsE9wMlW/mOB4jIwSUkRKtu02CwZhQdmzMsUbxE0s1xOLwTpNIwlzfW/YT7OnOHgDffLgYg==", "dev": true, "requires": { - "@types/node": "12.20.24", "colors": "~1.2.1", "fs-extra": "~7.0.1", "import-lazy": "~4.0.0", "jju": "~1.4.0", - "resolve": "~1.17.0", - "semver": "~7.3.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", "z-schema": "~5.0.2" - }, - "dependencies": { - "@types/node": { - "version": "12.20.24", - "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.npmmirror.com/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@rushstack/rig-package": { - "version": "0.3.17", - "resolved": "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.3.17.tgz", - "integrity": "sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.4.0.tgz", + "integrity": "sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==", "dev": true, "requires": { - "resolve": "~1.17.0", + "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" - }, - "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } } }, "@rushstack/ts-command-line": { - "version": "4.13.0", - "resolved": "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", - "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.15.1.tgz", + "integrity": "sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -7707,9 +7812,29 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, "@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmmirror.com/@types/argparse/-/argparse-1.0.38.tgz", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, @@ -8059,6 +8184,11 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, "aedes": { "version": "0.47.0", "resolved": "https://registry.npmmirror.com/aedes/-/aedes-0.47.0.tgz", @@ -8181,6 +8311,11 @@ "picomatch": "^2.0.4" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -8534,7 +8669,7 @@ }, "colors": { "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/colors/-/colors-1.2.5.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true }, @@ -8556,9 +8691,9 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, "optional": true }, @@ -8786,6 +8921,11 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "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==" + }, "cross-env": { "version": "7.0.3", "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", @@ -9246,9 +9386,9 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -9708,7 +9848,7 @@ }, "fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { @@ -9848,9 +9988,9 @@ "integrity": "sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==" }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "graphql": { @@ -10090,7 +10230,7 @@ }, "import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/import-lazy/-/import-lazy-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true }, @@ -10260,9 +10400,9 @@ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" }, "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==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "requires": { "has": "^1.0.3" } @@ -10409,7 +10549,7 @@ }, "jju": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/jju/-/jju-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, @@ -10473,7 +10613,7 @@ }, "jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { @@ -10538,7 +10678,7 @@ }, "lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, @@ -10640,6 +10780,11 @@ "yallist": "^4.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, "map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -11065,9 +11210,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, @@ -11629,12 +11774,13 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -11740,9 +11886,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -12065,9 +12211,9 @@ } }, "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true }, "string-similarity": { @@ -12176,6 +12322,11 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "table": { "version": "6.7.3", "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", @@ -12300,6 +12451,38 @@ } } }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "requires": { + "@cspotcode/source-map-support": "^0.8.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", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -12362,8 +12545,7 @@ "typescript": { "version": "4.8.4", "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" }, "unbox-primitive": { "version": "1.0.1", @@ -12378,7 +12560,7 @@ }, "universalify": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, @@ -12435,6 +12617,11 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, "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", @@ -12445,9 +12632,9 @@ } }, "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmmirror.com/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", "dev": true }, "vary": { @@ -12561,9 +12748,9 @@ } }, "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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true }, "workerpool": { @@ -12692,6 +12879,11 @@ } } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -12699,12 +12891,12 @@ "dev": true }, "z-schema": { - "version": "5.0.4", - "resolved": "https://registry.npmmirror.com/z-schema/-/z-schema-5.0.4.tgz", - "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", "dev": true, "requires": { - "commander": "^2.20.3", + "commander": "^9.4.1", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", "validator": "^13.7.0" diff --git a/package.json b/package.json index 912c4d7e..a07906a9 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", - "skywalking-backend-js": "^0.6.0" + "skywalking-backend-js": "^0.6.0", + "ts-node": "^10.9.1" }, "scripts": { "test": "cross-env DEBUG=common:*,ofn:* mocha build/test -t 60000 --recursive --exit", diff --git a/test/conformance/function.js b/test/conformance/function.js index c973158b..0dd1b88a 100644 --- a/test/conformance/function.js +++ b/test/conformance/function.js @@ -68,7 +68,7 @@ async function tryKnativeAsyncStateGet(ctx, data) { await ctx.state .get(data) .then(res => { - debug('✅ Success save: %o', res); + debug('✅ Success get: %o', res); }) .catch(err => { debug('❌ Failure occurred: %o', err); diff --git a/test/data/components/state/state.yaml b/test/data/components/state/state.yaml index b3a3b148..71cb0ce4 100644 --- a/test/data/components/state/state.yaml +++ b/test/data/components/state/state.yaml @@ -1,27 +1,11 @@ apiVersion: dapr.io/v1alpha1 kind: Component metadata: - name: myredis + name: mypg namespace: default spec: - type: state.redis + type: state.postgresql version: v1 metadata: - - name: redisHost - value: localhost:6379 - - name: redisPassword - value: '' - - name: queryIndexes - value: - [ - { - name: 'orgIndx', - indexes: - [ - {key: 'person.org', type: 'TEXT'}, - {key: 'person.id', type: 'NUMERIC'}, - {key: 'state', type: 'TEXT'}, - {key: 'city', type: 'TEXT'}, - ], - }, - ] \ No newline at end of file + - name: connectionString + value: "host=localhost user=postgres password=example port=5432 connect_timeout=10" diff --git a/test/data/mock/context.ts b/test/data/mock/context.ts index 9334e360..93f2ef74 100644 --- a/test/data/mock/context.ts +++ b/test/data/mock/context.ts @@ -27,9 +27,9 @@ export const KnativeBase: OpenFunctionContext = { // there is a policy, if you don't specify the state component, we will use the first one // or you need specify the state name, then the context will use the one you specify // hint : specify the name is the record key, not the component name - redis: { - componentName: 'myredis', - componentType: 'state.redis', + postgreSQL: { + componentName: 'mypg', + componentType: 'state.postgresql', }, mysql: { componentName: 'mymysql', diff --git a/test/data/mock/payload.ts b/test/data/mock/payload.ts index 3efb284a..91237a7e 100644 --- a/test/data/mock/payload.ts +++ b/test/data/mock/payload.ts @@ -111,7 +111,7 @@ Plain.State = { Query: { query: { filter: { - EQ: {state: 'CA'}, + EQ: {state: 'WA'}, }, sort: [ { diff --git a/test/e2e/README.assets/image-20230823144027351.png b/test/e2e/README.assets/image-20230823144027351.png new file mode 100644 index 0000000000000000000000000000000000000000..1478b433bcdbd871b405093199658eedac687726 GIT binary patch literal 335398 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

ukm&r`o4>@{L~f<`5)d|F)K9< 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%0AivPSfYws#T}sS}0a;$GwyjhU-?i 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�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

e);;F}AhsiOQ^!{m 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 Nwb3Cld#$ggP+VL|;q8sv(6Tc(AC}y2IJ^ZM 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 Hn)v-6)R11q literal 0 HcmV?d00001 diff --git a/test/e2e/README.assets/image-20230824150648598.png b/test/e2e/README.assets/image-20230824150648598.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc031927efb23ff4bb0b5638cea7f8c44529390 GIT binary patch literal 82864 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 IKeLJWAFP0S7XSbN literal 0 HcmV?d00001 diff --git a/test/e2e/README.md b/test/e2e/README.md new file mode 100644 index 00000000..3f7c70b8 --- /dev/null +++ b/test/e2e/README.md @@ -0,0 +1,128 @@ +# E2E Test + +In the context of E2E (End-to-End) testing, certain tests within the `.github/workflows/e2e.yaml` file cannot run using the provided machine configuration from GitHub Actions. However, these tests can be executed successfully locally. Below is a guide outlining the process to conduct local E2E tests. + +## Preparations + +### Kind + +Kind (Kubernetes in Docker) is a Kubernetes incubation project. Kind is an out-of-the-box Kubernetes environment construction solution. As the name suggests, all the components required for Kubernetes are deployed in a Docker container, which can easily build Kubernetes cluster. + +Official Documentation: https://kind.sigs.k8s.io/ + +**How to install?** + +```Bash +# For AMD64 / x86_64 +[ $(uname -m) = x86_64 ] && curl -Lo ./kind +# For ARM64 +[ $(uname -m) = aarch64 ] && curl -Lo ./kind +chmod +x ./kind +sudo mv ./kind /usr/local/bin/kind +``` + +### Kubectl + +Kind is only responsible for creating the cluster (this will create kubeconfig), and subsequent cluster operations require kubectl. + +Official Documentation: https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ + +**How to install?** + +```Bash +curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" +chmod +x kubectl +sudo mv kubectl /usr/local/bin +``` + +### SkyWalking Infra E2E + +SkyWalking Infra E2E is an End-to-End Testing framework that streamlines the setup, debugging, and validation of E2E tests. + +Official Documentation: https://skywalking.apache.org/docs/skywalking-infra-e2e/next/readme/ + +**How to install?** + +```bash +git clone https://github.com/apache/skywalking-infra-e2e.git +cd skywalking-infra-e2e +make build +``` + +Upon completion, the executable path for E2E tests is `bin/$PLATFORM/e2e`. You can relocate this to the `usr/local/bin` directory using the `move` command, enabling the use of the e2e command anywhere. + + +### Yq + +Yq is a lightweight and portable command-line YAML processor. + +Official Documentation: https://mikefarah.gitbook.io/yq/ + +**How to install?** + +Download the binary package from the [GitHub repository](https://github.com/mikefarah/yq) and place it in the `/usr/local/bin` directory. + + +## How to run + +For illustration purposes, let's consider the `async openfunction bindings e2e` test. + +### Single Step Execution + +Execute the following command: + +```bash +e2e run -c test/e2e/async-openfunction-bindings/e2e.yaml +``` + + +### Multi-Steps Execution + +SkyWalking Infra E2E follows a multi-step approach for execution: + + +1. Prepare the environment for this test + +```bash +e2e setup -c test/e2e/async-openfunction-bindings/e2e.yaml +``` + +2. Trigger the test (a script executes during test validation, so this step is unnecessary for this test): + +```bash +e2e trigger -c test/e2e/async-openfunction-bindings/e2e.yaml +``` + +3. Verify this test + +```bash +e2e verify -c test/e2e/async-openfunction-bindings/e2e.yaml +``` + +4. Clean up the test environment + +```bash +e2e cleanup -c test/e2e/async-openfunction-bindings/e2e.yaml +``` + +When using the format `e2e setup -c **`, the generated Kubernetes configuration is located at `/tmp/e2e-k8s.config`. + +The setup process involves multiple smaller steps. You can debug incrementally by following each sub-step, applying and rolling back files using `kubectl`. At any point, you can monitor the status of individual pods. + +## Results +Here are the results of the E2E tests: + +1. async openfunction bindings e2e test + +![image-20230823144027351](README.assets/image-20230823144027351.png) + +2. async openfunction pubsub e2e test + +![image-20230824150648598](README.assets/image-20230824150648598.png) + +3. knative openfunction state e2e test + +![image-20230823194111158](README.assets/image-20230823194111158.png) + + + diff --git a/test/e2e/async-openfunction-bindings/e2e.yaml b/test/e2e/async-openfunction-bindings/e2e.yaml new file mode 100644 index 00000000..c08501d1 --- /dev/null +++ b/test/e2e/async-openfunction-bindings/e2e.yaml @@ -0,0 +1,68 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: install dapr + command: | + dapr -v || (wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash) + dapr init -k --runtime-version 1.11.0 --log-as-json --wait --timeout 600 + wait: + - namespace: dapr-system + resource: pod + label-selector: app.kubernetes.io/name=dapr + for: condition=Ready + + - name: install helm + command: | + curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + + - name: install kafka operator + command: | + helm repo add strimzi https://strimzi.io/charts/ + helm install kafka-operator -n default strimzi/strimzi-kafka-operator --version 0.35.0 + + - name: install kafka + path: ../kafka.yaml + + - name: build and load image + command: | + docker build -t async-openfunction-bindings-sender:latest -f test/e2e/async-openfunction-bindings/sender/Dockerfile.async.bindings.sender . + kind load docker-image async-openfunction-bindings-sender:latest + docker build -t async-openfunction-bindings-target:latest -f test/e2e/async-openfunction-bindings/target/Dockerfile.async.bindings.target . + kind load docker-image async-openfunction-bindings-target:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/async-openfunction-bindings-sender-deployment + for: condition=Available + - namespace: default + resource: deployment/async-openfunction-bindings-target-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + - namespace: default + resource: pod + for: condition=Ready + + timeout: 30m + +cleanup: + # always never success failure + on: success + +trigger: + action: "" + +verify: + # verify with retry strategy + retry: + # max retry count + count: 60 + # the interval between two attempts, e.g. 10s, 1m. + interval: 30s + cases: + - query: bash test/e2e/async-openfunction-bindings/verify.sh | yq eval -P + expected: expected.data.yaml diff --git a/test/e2e/async-openfunction-bindings/expected.data.yaml b/test/e2e/async-openfunction-bindings/expected.data.yaml new file mode 100644 index 00000000..68f40017 --- /dev/null +++ b/test/e2e/async-openfunction-bindings/expected.data.yaml @@ -0,0 +1 @@ +Hello: Openfunction-Nodejs-Async-Openfunction-Bindings \ No newline at end of file diff --git a/test/e2e/async-openfunction-bindings/manifests.yaml b/test/e2e/async-openfunction-bindings/manifests.yaml new file mode 100644 index 00000000..e176bf65 --- /dev/null +++ b/test/e2e/async-openfunction-bindings/manifests.yaml @@ -0,0 +1,117 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: async-openfunction-bindings-sender-deployment + labels: + app: async-openfunction-bindings-sender + case: async +spec: + replicas: 1 + selector: + matchLabels: + app: async-openfunction-bindings-sender + case: async + template: + metadata: + labels: + app: async-openfunction-bindings-sender + case: async + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "async-openfunction-bindings-sender-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" + spec: + containers: + - name: my-async-openfunction-bindings-sender + image: async-openfunction-bindings-sender:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: async-openfunction-bindings-target-deployment + labels: + app: async-openfunction-bindings-target + case: async +spec: + replicas: 1 + selector: + matchLabels: + app: async-openfunction-bindings-target + case: async + template: + metadata: + labels: + app: async-openfunction-bindings-target + case: async + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "async-openfunction-bindings-target-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" + spec: + containers: + - name: my-async-openfunction-bindings-target + image: async-openfunction-bindings-target:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: async-openfunction-bindings-sender-component-cron +spec: + type: bindings.cron + version: v1 + metadata: + - name: schedule + value: "@every 2s" +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: async-openfunction-bindings-sender-component-kafka +spec: + type: bindings.kafka + version: v1 + metadata: + - name: brokers + value: kafka-server-kafka-brokers:9092 + - name: consumerGroup + value: async-openfunction-bindings-sender-component-kafka + - name: topics + value: bindings-topic + - name: publishTopic + value: bindings-topic + - name: authRequired + value: false +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: async-openfunction-bindings-target-component-kafka +spec: + type: bindings.kafka + version: v1 + metadata: + - name: brokers + value: kafka-server-kafka-brokers:9092 + - name: consumerGroup + value: async-openfunction-bindings-target-component-kafka + - name: topics + value: bindings-topic + - name: publishTopic + value: bindings-topic + - name: authRequired + value: false + diff --git a/test/e2e/async-openfunction-bindings/sender/.env-cmdrc.js b/test/e2e/async-openfunction-bindings/sender/.env-cmdrc.js new file mode 100644 index 00000000..fc58060b --- /dev/null +++ b/test/e2e/async-openfunction-bindings/sender/.env-cmdrc.js @@ -0,0 +1,22 @@ +module.exports = { + async: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-async-openfunction-bindings-sender-context', + version: '1.0.0', + runtime: 'async', + inputs: { + cron: { + componentName: 'async-openfunction-bindings-sender-component-cron', + componentType: 'bindings.cron', + }, + }, + outputs: { + kafka:{ + componentName: 'async-openfunction-bindings-sender-component-kafka', + componentType: 'bindings.kafka', + operation: 'create' + } + }, + }), + }, +}; diff --git a/test/e2e/async-openfunction-bindings/sender/Dockerfile.async.bindings.sender b/test/e2e/async-openfunction-bindings/sender/Dockerfile.async.bindings.sender new file mode 100644 index 00000000..fb3862da --- /dev/null +++ b/test/e2e/async-openfunction-bindings/sender/Dockerfile.async.bindings.sender @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/async-openfunction-bindings/sender +WORKDIR /ff/test/e2e/async-openfunction-bindings/sender + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "async", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=writeAsyncBindingsSender","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/async-openfunction-bindings/sender/function.js b/test/e2e/async-openfunction-bindings/sender/function.js new file mode 100644 index 00000000..c750297c --- /dev/null +++ b/test/e2e/async-openfunction-bindings/sender/function.js @@ -0,0 +1,11 @@ +async function writeAsyncBindingsSender(ctx, data) { + console.log('✅ Function should receive request: %o', data); + const msg = { + Hello: 'Openfunction-Nodejs-Async-Openfunction-Bindings', + }; + await ctx.send(msg, 'kafka'); +} + +module.exports = { + writeAsyncBindingsSender, +}; diff --git a/test/e2e/async-openfunction-bindings/target/.env-cmdrc.js b/test/e2e/async-openfunction-bindings/target/.env-cmdrc.js new file mode 100644 index 00000000..d4e74a18 --- /dev/null +++ b/test/e2e/async-openfunction-bindings/target/.env-cmdrc.js @@ -0,0 +1,15 @@ +module.exports = { + async: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-async-openfunction-bindings-target-context', + version: '1.0.0', + runtime: 'async', + inputs: { + kafka: { + componentName: 'async-openfunction-bindings-target-component-kafka', + componentType: 'bindings.kafka', + }, + }, + }), + }, +}; diff --git a/test/e2e/async-openfunction-bindings/target/Dockerfile.async.bindings.target b/test/e2e/async-openfunction-bindings/target/Dockerfile.async.bindings.target new file mode 100644 index 00000000..ad8891d0 --- /dev/null +++ b/test/e2e/async-openfunction-bindings/target/Dockerfile.async.bindings.target @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/async-openfunction-bindings/target +WORKDIR /ff/test/e2e/async-openfunction-bindings/target + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "async", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=writeAsyncBindingsTarget","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/async-openfunction-bindings/target/function.js b/test/e2e/async-openfunction-bindings/target/function.js new file mode 100644 index 00000000..9376138b --- /dev/null +++ b/test/e2e/async-openfunction-bindings/target/function.js @@ -0,0 +1,7 @@ +async function writeAsyncBindingsTarget(ctx, data) { + console.log(data); +} + +module.exports = { + writeAsyncBindingsTarget, +}; diff --git a/test/e2e/async-openfunction-bindings/verify.sh b/test/e2e/async-openfunction-bindings/verify.sh new file mode 100644 index 00000000..f9e90622 --- /dev/null +++ b/test/e2e/async-openfunction-bindings/verify.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +data_result=$(KUBECONFIG=/tmp/e2e-k8s.config kubectl logs --tail=1 -l app="async-openfunction-bindings-target" -c my-async-openfunction-bindings-target) + +echo $data_result \ No newline at end of file diff --git a/test/e2e/async-openfunction-pubsub/e2e.yaml b/test/e2e/async-openfunction-pubsub/e2e.yaml new file mode 100644 index 00000000..62da77f6 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/e2e.yaml @@ -0,0 +1,68 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: install dapr + command: | + dapr -v || (wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash) + dapr init -k --runtime-version 1.11.0 --log-as-json --wait --timeout 600 + wait: + - namespace: dapr-system + resource: pod + label-selector: app.kubernetes.io/name=dapr + for: condition=Ready + + - name: install helm + command: | + curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + + - name: install kafka operator + command: | + helm repo add strimzi https://strimzi.io/charts/ + helm install kafka-operator -n default strimzi/strimzi-kafka-operator --version 0.35.0 + + - name: install kafka + path: ../kafka.yaml + + - name: build and load image + command: | + docker build -t async-openfunction-pubsub-publisher:latest -f test/e2e/async-openfunction-pubsub/pub/Dockerfile.async.pubsub.publisher . + kind load docker-image async-openfunction-pubsub-publisher:latest + docker build -t async-openfunction-pubsub-subscriber:latest -f test/e2e/async-openfunction-pubsub/sub/Dockerfile.async.pubsub.subscriber . + kind load docker-image async-openfunction-pubsub-subscriber:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/async-openfunction-pubsub-publisher-deployment + for: condition=Available + - namespace: default + resource: deployment/async-openfunction-pubsub-subscriber-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + - namespace: default + resource: pod + for: condition=Ready + + timeout: 30m + +cleanup: + # always never success failure + on: success + +trigger: + action: "" + +verify: + # verify with retry strategy + retry: + # max retry count + count: 60 + # the interval between two attempts, e.g. 10s, 1m. + interval: 30s + cases: + - query: bash test/e2e/async-openfunction-pubsub/verify.sh | yq eval -P + expected: expected.data.yaml diff --git a/test/e2e/async-openfunction-pubsub/expected.data.yaml b/test/e2e/async-openfunction-pubsub/expected.data.yaml new file mode 100644 index 00000000..e58aefd8 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/expected.data.yaml @@ -0,0 +1 @@ +Hello: Openfunction-Nodejs-Async-Openfunction-Pubsub \ No newline at end of file diff --git a/test/e2e/async-openfunction-pubsub/manifests.yaml b/test/e2e/async-openfunction-pubsub/manifests.yaml new file mode 100644 index 00000000..5b062a5a --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/manifests.yaml @@ -0,0 +1,117 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: async-openfunction-pubsub-publisher-deployment + labels: + app: async-openfunction-pubsub-publisher + case: async +spec: + replicas: 1 + selector: + matchLabels: + app: async-openfunction-pubsub-publisher + case: async + template: + metadata: + labels: + app: async-openfunction-pubsub-publisher + case: async + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "async-openfunction-pubsub-publisher-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" + spec: + containers: + - name: my-async-openfunction-pubsub-publisher + image: async-openfunction-pubsub-publisher:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: async-openfunction-pubsub-subscriber-deployment + labels: + app: async-openfunction-pubsub-subscriber + case: async +spec: + replicas: 1 + selector: + matchLabels: + app: async-openfunction-pubsub-subscriber + case: async + template: + metadata: + labels: + app: async-openfunction-pubsub-subscriber + case: async + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "async-openfunction-pubsub-subscriber-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" + spec: + containers: + - name: my-async-openfunction-pubsub-subscriber + image: async-openfunction-pubsub-subscriber:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: async-openfunction-pubsub-publisher-component-cron +spec: + type: bindings.cron + version: v1 + metadata: + - name: schedule + value: "@every 2s" +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: async-openfunction-pubsub-publisher-component-kafka +spec: + type: pubsub.kafka + version: v1 + metadata: + - name: brokers + value: kafka-server-kafka-brokers:9092 + - name: consumerGroup + value: async-openfunction-pubsub-publisher-component-kafka + - name: authRequired + value: false + - name: disableTls + value: true + - name: authType + value: none +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: async-openfunction-pubsub-subscriber-component-kafka +spec: + type: pubsub.kafka + version: v1 + metadata: + - name: brokers + value: kafka-server-kafka-brokers:9092 + - name: consumerGroup + value: async-openfunction-pubsub-subscriber-component-kafka + - name: authRequired + value: false + - name: disableTls + value: true + - name: authType + value: none + diff --git a/test/e2e/async-openfunction-pubsub/pub/.env-cmdrc.js b/test/e2e/async-openfunction-pubsub/pub/.env-cmdrc.js new file mode 100644 index 00000000..4a2ceeb2 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/pub/.env-cmdrc.js @@ -0,0 +1,23 @@ +module.exports = { + async: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-async-openfunction-pubsub-publisher-context', + version: '1.0.0', + runtime: 'async', + inputs: { + cron: { + componentName: 'async-openfunction-pubsub-publisher-component-cron', + componentType: 'bindings.cron', + }, + }, + outputs: { + kafka:{ + componentName: 'async-openfunction-pubsub-publisher-component-kafka', + componentType: 'pubsub.kafka', + uri: 'pubsub-topic' + } + }, + }), + }, + }; + \ No newline at end of file diff --git a/test/e2e/async-openfunction-pubsub/pub/Dockerfile.async.pubsub.publisher b/test/e2e/async-openfunction-pubsub/pub/Dockerfile.async.pubsub.publisher new file mode 100644 index 00000000..09efa7aa --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/pub/Dockerfile.async.pubsub.publisher @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/async-openfunction-pubsub/pub +WORKDIR /ff/test/e2e/async-openfunction-pubsub/pub + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "async", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=writeAsyncPubsubPublisher","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/async-openfunction-pubsub/pub/function.js b/test/e2e/async-openfunction-pubsub/pub/function.js new file mode 100644 index 00000000..62c5a6f2 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/pub/function.js @@ -0,0 +1,11 @@ +async function writeAsyncPubsubPublisher(ctx, data) { + console.log('✅ Function should receive request: %o', data); + const msg = { + Hello: 'Openfunction-Nodejs-Async-Openfunction-Pubsub', + }; + await ctx.send(msg, 'kafka'); +} + +module.exports = { + writeAsyncPubsubPublisher, +}; diff --git a/test/e2e/async-openfunction-pubsub/sub/.env-cmdrc.js b/test/e2e/async-openfunction-pubsub/sub/.env-cmdrc.js new file mode 100644 index 00000000..ee6d1170 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/sub/.env-cmdrc.js @@ -0,0 +1,17 @@ +module.exports = { + async: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-async-openfunction-pubsub-subscriber-context', + version: '1.0.0', + runtime: 'async', + inputs: { + kafka: { + componentName: 'async-openfunction-pubsub-subscriber-component-kafka', + componentType: 'pubsub.kafka', + uri: 'pubsub-topic', + }, + }, + }), + }, + }; + \ No newline at end of file diff --git a/test/e2e/async-openfunction-pubsub/sub/Dockerfile.async.pubsub.subscriber b/test/e2e/async-openfunction-pubsub/sub/Dockerfile.async.pubsub.subscriber new file mode 100644 index 00000000..20ed12f6 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/sub/Dockerfile.async.pubsub.subscriber @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/async-openfunction-pubsub/sub +WORKDIR /ff/test/e2e/async-openfunction-pubsub/sub + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "async", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=writeAsyncPubsubSubscriber","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/async-openfunction-pubsub/sub/function.js b/test/e2e/async-openfunction-pubsub/sub/function.js new file mode 100644 index 00000000..b1843119 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/sub/function.js @@ -0,0 +1,7 @@ +async function writeAsyncPubsubSubscriber(ctx, data) { + console.log(data); +} + +module.exports = { + writeAsyncPubsubSubscriber, +}; diff --git a/test/e2e/async-openfunction-pubsub/verify.sh b/test/e2e/async-openfunction-pubsub/verify.sh new file mode 100644 index 00000000..5a7ecf36 --- /dev/null +++ b/test/e2e/async-openfunction-pubsub/verify.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +data_result=$(KUBECONFIG=/tmp/e2e-k8s.config kubectl logs --tail=1 -l app="async-openfunction-pubsub-subscriber" -c my-async-openfunction-pubsub-subscriber) + +echo $data_result \ No newline at end of file diff --git a/test/e2e/kafka.yaml b/test/e2e/kafka.yaml new file mode 100644 index 00000000..402b7373 --- /dev/null +++ b/test/e2e/kafka.yaml @@ -0,0 +1,62 @@ +apiVersion: kafka.strimzi.io/v1beta2 +kind: Kafka +metadata: + name: kafka-server + namespace: default +spec: + kafka: + version: 3.4.0 + replicas: 1 + listeners: + - name: plain + port: 9092 + type: internal + tls: false + - name: tls + port: 9093 + type: internal + tls: true + config: + offsets.topic.replication.factor: 1 + transaction.state.log.replication.factor: 1 + transaction.state.log.min.isr: 1 + default.replication.factor: 1 + min.insync.replicas: 1 + inter.broker.protocol.version: "3.4" + storage: + type: ephemeral + zookeeper: + replicas: 1 + storage: + type: ephemeral + entityOperator: + topicOperator: {} + userOperator: {} +--- +apiVersion: kafka.strimzi.io/v1beta2 +kind: KafkaTopic +metadata: + name: bindings-topic + namespace: default + labels: + strimzi.io/cluster: kafka-server +spec: + partitions: 1 + replicas: 1 + config: + retention.ms: 7200000 + segment.bytes: 1073741824 +--- +apiVersion: kafka.strimzi.io/v1beta2 +kind: KafkaTopic +metadata: + name: pubsub-topic + namespace: default + labels: + strimzi.io/cluster: kafka-server +spec: + partitions: 1 + replicas: 1 + config: + retention.ms: 7200000 + segment.bytes: 1073741824 diff --git a/test/e2e/kind.yaml b/test/e2e/kind.yaml new file mode 100644 index 00000000..aed7df0b --- /dev/null +++ b/test/e2e/kind.yaml @@ -0,0 +1,53 @@ +# this config file contains all config fields with comments +# NOTE: this is not a particularly useful config file +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +# patch the generated kubeadm config with some extra settings +kubeadmConfigPatches: + - | + apiVersion: kubelet.config.k8s.io/v1beta1 + kind: KubeletConfiguration + evictionHard: + nodefs.available: "0%" +# patch it further using a JSON 6902 patch +kubeadmConfigPatchesJSON6902: + - group: kubeadm.k8s.io + version: v1beta2 + kind: ClusterConfiguration + patch: | + - op: add + path: /apiServer/certSANs/- + value: my-hostname +# 1 control plane node (workder) +nodes: + # the control plane node (worker) config + - role: control-plane + extraPortMappings: + - containerPort: 31234 + hostPort: 80 + # optional: set the bind address on the host + # 0.0.0.0 is the current default + listenAddress: "127.0.0.1" + # optional: set the protocol to one of TCP, UDP, SCTP. + # TCP is the default + protocol: TCP + - containerPort: 31235 + hostPort: 81 + listenAddress: "127.0.0.1" + protocol: TCP + - containerPort: 31236 + hostPort: 82 + listenAddress: "127.0.0.1" + protocol: TCP + - containerPort: 31237 + hostPort: 83 + listenAddress: "127.0.0.1" + protocol: TCP + - containerPort: 31238 + hostPort: 84 + listenAddress: "127.0.0.1" + protocol: TCP + - containerPort: 31239 + hostPort: 85 + listenAddress: "127.0.0.1" + protocol: TCP \ No newline at end of file diff --git a/test/e2e/knative-cloudevent/Dockerfile.knative.cloudevent b/test/e2e/knative-cloudevent/Dockerfile.knative.cloudevent new file mode 100644 index 00000000..7c5b64ef --- /dev/null +++ b/test/e2e/knative-cloudevent/Dockerfile.knative.cloudevent @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-cloudevent +WORKDIR /ff/test/e2e/knative-cloudevent + +# Run the ts-node command to execute src/main.ts +CMD ["../../../node_modules/.bin/ts-node", "../../../src/main.ts", "--target=writeCloudEvent","--signature-type=cloudevent"] \ No newline at end of file diff --git a/test/e2e/knative-cloudevent/e2e.yaml b/test/e2e/knative-cloudevent/e2e.yaml new file mode 100644 index 00000000..8eb6c8c7 --- /dev/null +++ b/test/e2e/knative-cloudevent/e2e.yaml @@ -0,0 +1,48 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: build and load image + command: | + docker build -t knative-cloudevent:latest -f test/e2e/knative-cloudevent/Dockerfile.knative.cloudevent . + kind load docker-image knative-cloudevent:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/knative-cloudevent-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + +# kind: +# expose-ports: +# - namespace: default +# resource: service/knative +# port: 12345 + + timeout: 30m + +cleanup: + # always never success failure + on: success + +#trigger: +# action: "http" +# interval: 3s +# times: 10 +# url: http://127.0.0.1:80 +# method: GET + +verify: + # verify with retry strategy + retry: + # max retry count + count: 60 + # the interval between two attempts, e.g. 10s, 1m. + interval: 10s + cases: + - query: bash test/e2e/knative-cloudevent/verify.sh 127.0.0.1 80 | yq eval -P + expected: expected.data.yaml \ No newline at end of file diff --git a/test/e2e/knative-cloudevent/expected.data.yaml b/test/e2e/knative-cloudevent/expected.data.yaml new file mode 100644 index 00000000..a5c311b6 --- /dev/null +++ b/test/e2e/knative-cloudevent/expected.data.yaml @@ -0,0 +1 @@ +Hello: Openfunction-Nodejs-Knative-Cloudevent \ No newline at end of file diff --git a/test/e2e/knative-cloudevent/function.js b/test/e2e/knative-cloudevent/function.js new file mode 100644 index 00000000..e733fc4a --- /dev/null +++ b/test/e2e/knative-cloudevent/function.js @@ -0,0 +1,8 @@ +function writeCloudEvent(cloudevent) { + console.log(cloudevent); + console.log(cloudevent.data); +} + +module.exports = { + writeCloudEvent, +}; diff --git a/test/e2e/knative-cloudevent/manifests.yaml b/test/e2e/knative-cloudevent/manifests.yaml new file mode 100644 index 00000000..6071f175 --- /dev/null +++ b/test/e2e/knative-cloudevent/manifests.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-cloudevent-deployment + labels: + app: knative-cloudevent + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-cloudevent + case: knative + template: + metadata: + labels: + app: knative-cloudevent + case: knative + spec: + containers: + - name: my-knative-cloudevent + image: knative-cloudevent:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-cloudevent-service +spec: + type: NodePort + selector: + app: knative-cloudevent + ports: + - protocol: TCP + port: 12345 + targetPort: 8080 + nodePort: 31234 diff --git a/test/e2e/knative-cloudevent/verify.sh b/test/e2e/knative-cloudevent/verify.sh new file mode 100644 index 00000000..3f158a81 --- /dev/null +++ b/test/e2e/knative-cloudevent/verify.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +ip=$1 +port=$2 +url="http://$ip:$port" +headers="Content-Type: application/cloudevents+json" +body=' +{ + "specversion": "1.0", + "id": "test-1234-1234", + "type": "ce.openfunction", + "time": "2020-05-13T01:23:45Z", + "subject": "test-subject", + "source": "https://github.com/OpenFunction/functions-framework-nodejs", + "datacontenttype": "application/json", + "data": { + "Hello": "Openfunction-Nodejs-Knative-Cloudevent" + } +} +' + +while true; do + st=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "$headers" -d "$body" "$url") + if [ "$st" -eq 204 ]; then + data_result=$(KUBECONFIG=/tmp/e2e-k8s.config kubectl logs --tail=1 -l app="knative-cloudevent" -c my-knative-cloudevent) + break + else + sleep 1 + continue + fi +done + +echo $data_result diff --git a/test/e2e/knative-event/Dockerfile.knative.event b/test/e2e/knative-event/Dockerfile.knative.event new file mode 100644 index 00000000..ea8b1f29 --- /dev/null +++ b/test/e2e/knative-event/Dockerfile.knative.event @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-event +WORKDIR /ff/test/e2e/knative-event + +# Run the ts-node command to execute src/main.ts +CMD ["../../../node_modules/.bin/ts-node", "../../../src/main.ts", "--target=writeEvent","--signature-type=event"] \ No newline at end of file diff --git a/test/e2e/knative-event/e2e.yaml b/test/e2e/knative-event/e2e.yaml new file mode 100644 index 00000000..075f7d49 --- /dev/null +++ b/test/e2e/knative-event/e2e.yaml @@ -0,0 +1,48 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: build and load image + command: | + docker build -t knative-event:latest -f test/e2e/knative-event/Dockerfile.knative.event . + kind load docker-image knative-event:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/knative-event-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + +# kind: +# expose-ports: +# - namespace: default +# resource: service/knative +# port: 12345 + + timeout: 30m + +cleanup: + # always never success failure + on: success + +#trigger: +# action: "http" +# interval: 3s +# times: 10 +# url: http://127.0.0.1:80 +# method: GET + +verify: + # verify with retry strategy + retry: + # max retry count + count: 60 + # the interval between two attempts, e.g. 10s, 1m. + interval: 10s + cases: + - query: bash test/e2e/knative-event/verify.sh 127.0.0.1 80 | yq eval -P + expected: expected.data.yaml \ No newline at end of file diff --git a/test/e2e/knative-event/expected.data.yaml b/test/e2e/knative-event/expected.data.yaml new file mode 100644 index 00000000..724e3fe5 --- /dev/null +++ b/test/e2e/knative-event/expected.data.yaml @@ -0,0 +1 @@ +Hello: Openfunction-Nodejs-Knative-Event \ No newline at end of file diff --git a/test/e2e/knative-event/function.js b/test/e2e/knative-event/function.js new file mode 100644 index 00000000..86b541c3 --- /dev/null +++ b/test/e2e/knative-event/function.js @@ -0,0 +1,8 @@ +function writeEvent(data, context) { + console.log(context); + console.log(data); +} + +module.exports = { + writeEvent, +}; diff --git a/test/e2e/knative-event/manifests.yaml b/test/e2e/knative-event/manifests.yaml new file mode 100644 index 00000000..1b0e48a7 --- /dev/null +++ b/test/e2e/knative-event/manifests.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-event-deployment + labels: + app: knative-event + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-event + case: knative + template: + metadata: + labels: + app: knative-event + case: knative + spec: + containers: + - name: my-knative-event + image: knative-event:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-event-service +spec: + type: NodePort + selector: + app: knative-event + ports: + - protocol: TCP + port: 12345 + targetPort: 8080 + nodePort: 31234 diff --git a/test/e2e/knative-event/verify.sh b/test/e2e/knative-event/verify.sh new file mode 100644 index 00000000..13a6c843 --- /dev/null +++ b/test/e2e/knative-event/verify.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +ip=$1 +port=$2 +url="http://$ip:$port" +headers="Content-Type":"application/json" +body=' +{ + "context": { + "eventId": "testEventId", + "timestamp": "testTimestamp", + "eventType": "testEventType", + "resource": "testResource" + }, + "data": { + "Hello": "Openfunction-Nodejs-Knative-Event" + } +} +' + +while true; do + st=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "$headers" -d "$body" "$url") + if [ "$st" -eq 204 ]; then + data_result=$(KUBECONFIG=/tmp/e2e-k8s.config kubectl logs --tail=1 -l app="knative-event" -c my-knative-event) + break + else + sleep 1 + continue + fi +done + +echo $data_result diff --git a/test/e2e/knative-http/Dockerfile.knative.http b/test/e2e/knative-http/Dockerfile.knative.http new file mode 100644 index 00000000..d021c12e --- /dev/null +++ b/test/e2e/knative-http/Dockerfile.knative.http @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-http +WORKDIR /ff/test/e2e/knative-http + +# Run the ts-node command to execute src/main.ts +CMD ["../../../node_modules/.bin/ts-node", "../../../src/main.ts", "--target=writeHttp"] \ No newline at end of file diff --git a/test/e2e/knative-http/e2e.yaml b/test/e2e/knative-http/e2e.yaml new file mode 100644 index 00000000..4d5fc857 --- /dev/null +++ b/test/e2e/knative-http/e2e.yaml @@ -0,0 +1,48 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: build and load image + command: | + docker build -t knative-http:latest -f test/e2e/knative-http/Dockerfile.knative.http . + kind load docker-image knative-http:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/knative-http-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + +# kind: +# expose-ports: +# - namespace: default +# resource: service/knative +# port: 12345 + + timeout: 30m + +cleanup: + # always never success failure + on: success + +#trigger: +# action: "http" +# interval: 3s +# times: 10 +# url: http://127.0.0.1:80 +# method: GET + +verify: + # verify with retry strategy + retry: + # max retry count + count: 60 + # the interval between two attempts, e.g. 10s, 1m. + interval: 10s + cases: + - query: bash test/e2e/knative-http/verify.sh 127.0.0.1 80 | yq eval -P + expected: expected.data.yaml \ No newline at end of file diff --git a/test/e2e/knative-http/expected.data.yaml b/test/e2e/knative-http/expected.data.yaml new file mode 100644 index 00000000..80eb7c3d --- /dev/null +++ b/test/e2e/knative-http/expected.data.yaml @@ -0,0 +1 @@ +Hello: Openfunction-Nodejs-Knative-Http \ No newline at end of file diff --git a/test/e2e/knative-http/function.js b/test/e2e/knative-http/function.js new file mode 100644 index 00000000..c4d5a1ef --- /dev/null +++ b/test/e2e/knative-http/function.js @@ -0,0 +1,9 @@ +function writeHttp(req, res) { + console.log(req.body); + res.setHeader('Content-Type', 'application/json'); + res.status(200).json(req.body); +} + +module.exports = { + writeHttp, +}; diff --git a/test/e2e/knative-http/manifests.yaml b/test/e2e/knative-http/manifests.yaml new file mode 100644 index 00000000..8b896f5d --- /dev/null +++ b/test/e2e/knative-http/manifests.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-http-deployment + labels: + app: knative-http + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-http + case: knative + template: + metadata: + labels: + app: knative-http + case: knative + spec: + containers: + - name: my-knative-http + image: knative-http:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-http-service +spec: + type: NodePort + selector: + app: knative-http + ports: + - protocol: TCP + port: 12345 + targetPort: 8080 + nodePort: 31234 diff --git a/test/e2e/knative-http/verify.sh b/test/e2e/knative-http/verify.sh new file mode 100644 index 00000000..562ab031 --- /dev/null +++ b/test/e2e/knative-http/verify.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +ip=$1 +port=$2 +url="http://$ip:$port" +headers="Content-Type: application/json" +body='{"Hello": "Openfunction-Nodejs-Knative-Http"}' + +while true; do + # st is the get res code + st=$(curl -s -o /dev/null -w "%{http_code}" -X GET "$url") + if [ "$st" -eq 200 ]; then + # data_result is the res body + data_result=$(curl -s -X POST -H "$headers" -d "$body" "$url") + break + else + sleep 1 + continue + fi +done + +echo $data_result diff --git a/test/e2e/knative-openfunction-bindings/.env-cmdrc.js b/test/e2e/knative-openfunction-bindings/.env-cmdrc.js new file mode 100644 index 00000000..9a2cf093 --- /dev/null +++ b/test/e2e/knative-openfunction-bindings/.env-cmdrc.js @@ -0,0 +1,21 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-bindings-context', + version: '1.0.0', + runtime: 'knative', + outputs: { + kafka: { + componentName: 'knative-openfunction-bindings-component', + componentType: 'bindings.kafka', + operation: 'create', + }, + kafka: { + componentName: 'knative-openfunction-bindings-component', + componentType: 'bindings.kafka', + operation: 'get', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-bindings/Dockerfile.knative.bindings b/test/e2e/knative-openfunction-bindings/Dockerfile.knative.bindings new file mode 100644 index 00000000..a799f49e --- /dev/null +++ b/test/e2e/knative-openfunction-bindings/Dockerfile.knative.bindings @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-bindings +WORKDIR /ff/test/e2e/knative-openfunction-bindings + +# Run the ts-node command to execute src/main.ts +CMD ["../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../node_modules/.bin/ts-node", "../../../src/main.ts", "--target=writeKnativeBindings","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-bindings/e2e.yaml b/test/e2e/knative-openfunction-bindings/e2e.yaml new file mode 100644 index 00000000..44220b1e --- /dev/null +++ b/test/e2e/knative-openfunction-bindings/e2e.yaml @@ -0,0 +1,60 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: install dapr + command: | + dapr -v || (wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash) + dapr init -k -n dapr-system --runtime-version 1.11.0 --log-as-json --wait --timeout 600 + wait: + - namespace: dapr-system + resource: pod + label-selector: app.kubernetes.io/name=dapr + for: condition=Ready + + - name: install helm + command: | + curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + + - name: install kafka operator + command: | + helm repo add strimzi https://strimzi.io/charts/ + helm install kafka-operator -n default strimzi/strimzi-kafka-operator --version 0.35.0 + + - name: install kafka + path: ../kafka.yaml + + - name: build and load image + command: | + docker build -t knative-openfunction-bindings:latest -f test/e2e/knative-openfunction-bindings/Dockerfile.knative.bindings . + kind load docker-image knative-openfunction-bindings:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/knative-openfunction-bindings-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + + timeout: 30m + +cleanup: + # always never success failure + on: success + +trigger: + action: "" + +verify: + # verify with retry strategy + retry: + # max retry count + count: 20 + # the interval between two attempts, e.g. 10s, 1m. + interval: 30s + cases: + - query: bash test/e2e/knative-openfunction-bindings/verify.sh 127.0.0.1 80 | yq eval -P + expected: expected.data.yaml diff --git a/test/e2e/knative-openfunction-bindings/expected.data.yaml b/test/e2e/knative-openfunction-bindings/expected.data.yaml new file mode 100644 index 00000000..c1832ebe --- /dev/null +++ b/test/e2e/knative-openfunction-bindings/expected.data.yaml @@ -0,0 +1 @@ +Hello: Openfunction-Nodejs-Knative-Openfunction-Bindings \ No newline at end of file diff --git a/test/e2e/knative-openfunction-bindings/function.js b/test/e2e/knative-openfunction-bindings/function.js new file mode 100644 index 00000000..cb5c11ce --- /dev/null +++ b/test/e2e/knative-openfunction-bindings/function.js @@ -0,0 +1,9 @@ +async function writeKnativeBindings(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.send(data); + ctx.res.send(data); +} + +module.exports = { + writeKnativeBindings, +}; diff --git a/test/e2e/knative-openfunction-bindings/manifests.yaml b/test/e2e/knative-openfunction-bindings/manifests.yaml new file mode 100644 index 00000000..b8450534 --- /dev/null +++ b/test/e2e/knative-openfunction-bindings/manifests.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-bindings-deployment + labels: + app: knative-openfunction-bindings + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-bindings + case: knative + template: + metadata: + labels: + app: knative-openfunction-bindings + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-bindings-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-bindings + image: knative-openfunction-bindings:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: knative-openfunction-bindings-component +spec: + type: bindings.kafka + version: v1 + metadata: + - name: brokers # Required. + value: kafka-server-kafka-brokers:9092 + - name: consumerGroup # Optional. Used for input bindings. + value: knative-openfunction-bindings + - name: topics # Optional. Used for input bindings. + value: bindings-topic + - name: publishTopic # Optional. Used for output bindings. + value: bindings-topic + - name: authRequired # Required. + value: false +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-bindings-service +spec: + type: NodePort + selector: + app: knative-openfunction-bindings + ports: + - protocol: TCP + port: 12345 + targetPort: 8080 + nodePort: 31234 \ No newline at end of file diff --git a/test/e2e/knative-openfunction-bindings/verify.sh b/test/e2e/knative-openfunction-bindings/verify.sh new file mode 100644 index 00000000..3ec1e971 --- /dev/null +++ b/test/e2e/knative-openfunction-bindings/verify.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +ip=$1 +port=$2 +url="http://$ip:$port" +headers="Content-Type: application/json" +body='{"Hello": "Openfunction-Nodejs-Knative-Openfunction-Bindings"}' + +while true; do + # st is the get res code + st=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "$headers" -d "$body" "$url") + if [ "$st" -eq 200 ]; then + # data_result is the res body + data_result=$(curl -s -X POST -H "$headers" -d "$body" "$url") + break + else + sleep 1 + continue + fi +done + +echo $data_result diff --git a/test/e2e/knative-openfunction-pubsub/.env-cmdrc.js b/test/e2e/knative-openfunction-pubsub/.env-cmdrc.js new file mode 100644 index 00000000..d004687c --- /dev/null +++ b/test/e2e/knative-openfunction-pubsub/.env-cmdrc.js @@ -0,0 +1,16 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-pubsub-context', + version: '1.0.0', + runtime: 'knative', + outputs: { + kafka: { + componentName: 'knative-openfunction-pubsub-component', + componentType: 'pubsub.kafka', + uri: 'create', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-pubsub/Dockerfile.knative.pubsub b/test/e2e/knative-openfunction-pubsub/Dockerfile.knative.pubsub new file mode 100644 index 00000000..261b1138 --- /dev/null +++ b/test/e2e/knative-openfunction-pubsub/Dockerfile.knative.pubsub @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-pubsub +WORKDIR /ff/test/e2e/knative-openfunction-pubsub + +# Run the ts-node command to execute src/main.ts +CMD ["../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../node_modules/.bin/ts-node", "../../../src/main.ts", "--target=writeKnativePubsub","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-pubsub/e2e.yaml b/test/e2e/knative-openfunction-pubsub/e2e.yaml new file mode 100644 index 00000000..0bf5d80a --- /dev/null +++ b/test/e2e/knative-openfunction-pubsub/e2e.yaml @@ -0,0 +1,60 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: install dapr + command: | + dapr -v || (wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash) + dapr init -k -n dapr-system --runtime-version 1.11.0 --log-as-json --wait --timeout 600 + wait: + - namespace: dapr-system + resource: pod + label-selector: app.kubernetes.io/name=dapr + for: condition=Ready + + - name: install helm + command: | + curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + + - name: install kafka operator + command: | + helm repo add strimzi https://strimzi.io/charts/ + helm install kafka-operator -n default strimzi/strimzi-kafka-operator --version 0.35.0 + + - name: install kafka + path: ../kafka.yaml + + - name: build and load image + command: | + docker build -t knative-openfunction-pubsub:latest -f test/e2e/knative-openfunction-pubsub/Dockerfile.knative.pubsub . + kind load docker-image knative-openfunction-pubsub:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/knative-openfunction-pubsub-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + + timeout: 30m + +cleanup: + # always never success failure + on: success + +trigger: + action: "" + +verify: + # verify with retry strategy + retry: + # max retry count + count: 20 + # the interval between two attempts, e.g. 10s, 1m. + interval: 30s + cases: + - query: bash test/e2e/knative-openfunction-pubsub/verify.sh 127.0.0.1 80 | yq eval -P + expected: expected.data.yaml diff --git a/test/e2e/knative-openfunction-pubsub/expected.data.yaml b/test/e2e/knative-openfunction-pubsub/expected.data.yaml new file mode 100644 index 00000000..3af0385d --- /dev/null +++ b/test/e2e/knative-openfunction-pubsub/expected.data.yaml @@ -0,0 +1 @@ +Hello: Openfunction-Nodejs-Knative-Openfunction-Pubsub \ No newline at end of file diff --git a/test/e2e/knative-openfunction-pubsub/function.js b/test/e2e/knative-openfunction-pubsub/function.js new file mode 100644 index 00000000..1adcf302 --- /dev/null +++ b/test/e2e/knative-openfunction-pubsub/function.js @@ -0,0 +1,9 @@ +async function writeKnativePubsub(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.send(data); + ctx.res.send(data); +} + +module.exports = { + writeKnativePubsub, +}; diff --git a/test/e2e/knative-openfunction-pubsub/manifests.yaml b/test/e2e/knative-openfunction-pubsub/manifests.yaml new file mode 100644 index 00000000..e46b601a --- /dev/null +++ b/test/e2e/knative-openfunction-pubsub/manifests.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-pubsub-deployment + labels: + app: knative-openfunction-pubsub + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-pubsub + case: knative + template: + metadata: + labels: + app: knative-openfunction-pubsub + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-pubsub-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-pubsub + image: knative-openfunction-pubsub:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: knative-openfunction-pubsub-component +spec: + type: pubsub.kafka + version: v1 + metadata: + - name: brokers # Required. + value: kafka-server-kafka-brokers:9092 + - name: consumerGroup + value: knative-openfunction-pubsub + - name: authRequired + value: "false" + - name: disableTls + value: "true" + - name: authType + value: "none" +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-pubsub-service +spec: + type: NodePort + selector: + app: knative-openfunction-pubsub + ports: + - protocol: TCP + port: 12345 + targetPort: 8080 + nodePort: 31234 \ No newline at end of file diff --git a/test/e2e/knative-openfunction-pubsub/verify.sh b/test/e2e/knative-openfunction-pubsub/verify.sh new file mode 100644 index 00000000..866ad3fb --- /dev/null +++ b/test/e2e/knative-openfunction-pubsub/verify.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +ip=$1 +port=$2 +url="http://$ip:$port" +headers="Content-Type: application/json" +body='{"Hello": "Openfunction-Nodejs-Knative-Openfunction-Pubsub"}' + +while true; do + # st is the get res code + st=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "$headers" -d "$body" "$url") + if [ "$st" -eq 200 ]; then + # data_result is the res body + data_result=$(curl -s -X POST -H "$headers" -d "$body" "$url") + break + else + sleep 1 + continue + fi +done + +echo $data_result diff --git a/test/e2e/knative-openfunction-state/delete/.env-cmdrc.js b/test/e2e/knative-openfunction-state/delete/.env-cmdrc.js new file mode 100644 index 00000000..180f8804 --- /dev/null +++ b/test/e2e/knative-openfunction-state/delete/.env-cmdrc.js @@ -0,0 +1,18 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-state-delete-context', + version: '1.0.0', + runtime: 'knative', + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + pg: { + componentName: 'knative-openfunction-state-component', + componentType: 'state.postgresql', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-state/delete/Dockerfile.knative.state.delete b/test/e2e/knative-openfunction-state/delete/Dockerfile.knative.state.delete new file mode 100644 index 00000000..56807d45 --- /dev/null +++ b/test/e2e/knative-openfunction-state/delete/Dockerfile.knative.state.delete @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-state/delete +WORKDIR /ff/test/e2e/knative-openfunction-state/delete + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=tryKnativeStateDelete","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-state/delete/function.js b/test/e2e/knative-openfunction-state/delete/function.js new file mode 100644 index 00000000..e5c6c949 --- /dev/null +++ b/test/e2e/knative-openfunction-state/delete/function.js @@ -0,0 +1,16 @@ +async function tryKnativeStateDelete(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.state + .delete(data) + .then(res => { + console.log('✅ Success delete'); + console.log(JSON.stringify(res)); + }) + .catch(err => { + console.log('❌ Failure occurred: %o', err); + }); +} + +module.exports = { + tryKnativeStateDelete, +}; diff --git a/test/e2e/knative-openfunction-state/e2e.yaml b/test/e2e/knative-openfunction-state/e2e.yaml new file mode 100644 index 00000000..f72c660b --- /dev/null +++ b/test/e2e/knative-openfunction-state/e2e.yaml @@ -0,0 +1,87 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: install dapr + command: | + dapr -v || (wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash) + dapr init -k -n dapr-system --runtime-version 1.11.0 --log-as-json --wait --timeout 600 + wait: + - namespace: dapr-system + resource: pod + label-selector: app.kubernetes.io/name=dapr + for: condition=Ready + + - name: install helm + command: | + curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + + - name: install postgres + command: | + helm repo add bitnami https://charts.bitnami.com/bitnami + helm install postgres -n default bitnami/postgresql -f test/e2e/knative-openfunction-state/pg-values.yaml + wait: + - namespace: default + resource: pod + for: condition=Ready + + - name: build and load image + command: | + docker build -t knative-openfunction-state-save:latest -f test/e2e/knative-openfunction-state/save/Dockerfile.knative.state.save . + docker build -t knative-openfunction-state-get:latest -f test/e2e/knative-openfunction-state/get/Dockerfile.knative.state.get . + docker build -t knative-openfunction-state-getbulk:latest -f test/e2e/knative-openfunction-state/getbulk/Dockerfile.knative.state.getbulk . + docker build -t knative-openfunction-state-delete:latest -f test/e2e/knative-openfunction-state/delete/Dockerfile.knative.state.delete . + docker build -t knative-openfunction-state-transaction:latest -f test/e2e/knative-openfunction-state/transaction/Dockerfile.knative.state.transaction . + docker build -t knative-openfunction-state-query:latest -f test/e2e/knative-openfunction-state/query/Dockerfile.knative.state.query . + kind load docker-image knative-openfunction-state-save:latest + kind load docker-image knative-openfunction-state-get:latest + kind load docker-image knative-openfunction-state-getbulk:latest + kind load docker-image knative-openfunction-state-delete:latest + kind load docker-image knative-openfunction-state-transaction:latest + kind load docker-image knative-openfunction-state-query:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: deployment/knative-openfunction-state-get-deployment + for: condition=Available + - namespace: default + resource: deployment/knative-openfunction-state-save-deployment + for: condition=Available + - namespace: default + resource: deployment/knative-openfunction-state-getbulk-deployment + for: condition=Available + - namespace: default + resource: deployment/knative-openfunction-state-delete-deployment + for: condition=Available + - namespace: default + resource: deployment/knative-openfunction-state-transaction-deployment + for: condition=Available + - namespace: default + resource: deployment/knative-openfunction-state-query-deployment + for: condition=Available + - namespace: default + resource: pod + for: condition=Ready + + timeout: 30m + +cleanup: + # always never success failure + on: success + +trigger: + action: "" + +verify: + # verify with retry strategy + retry: + # max retry count + count: 20 + # the interval between two attempts, e.g. 10s, 1m. + interval: 30s + + cases: + - query: bash test/e2e/knative-openfunction-state/verify.sh 127.0.0.1 80 81 82 83 84 85 | yq eval -P + expected: expected.data.yaml diff --git a/test/e2e/knative-openfunction-state/expected.data.yaml b/test/e2e/knative-openfunction-state/expected.data.yaml new file mode 100644 index 00000000..dc14570f --- /dev/null +++ b/test/e2e/knative-openfunction-state/expected.data.yaml @@ -0,0 +1,9 @@ +results: + - key: "1" + data: + city: Seattle + state: WA + person: + id: "1036" + org: Dev Ops +token: "1" diff --git a/test/e2e/knative-openfunction-state/get/.env-cmdrc.js b/test/e2e/knative-openfunction-state/get/.env-cmdrc.js new file mode 100644 index 00000000..4c66f604 --- /dev/null +++ b/test/e2e/knative-openfunction-state/get/.env-cmdrc.js @@ -0,0 +1,18 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-state-get-context', + version: '1.0.0', + runtime: 'knative', + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + pg: { + componentName: 'knative-openfunction-state-component', + componentType: 'state.postgresql', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-state/get/Dockerfile.knative.state.get b/test/e2e/knative-openfunction-state/get/Dockerfile.knative.state.get new file mode 100644 index 00000000..5596495d --- /dev/null +++ b/test/e2e/knative-openfunction-state/get/Dockerfile.knative.state.get @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-state/get +WORKDIR /ff/test/e2e/knative-openfunction-state/get + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=tryKnativeStateGet","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-state/get/function.js b/test/e2e/knative-openfunction-state/get/function.js new file mode 100644 index 00000000..5841775f --- /dev/null +++ b/test/e2e/knative-openfunction-state/get/function.js @@ -0,0 +1,16 @@ +async function tryKnativeStateGet(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.state + .get(data) + .then(res => { + console.log('✅ Success get'); + console.log(JSON.stringify(res)); + }) + .catch(err => { + console.log('❌ Failure occurred: %o', err); + }); +} + +module.exports = { + tryKnativeStateGet, +}; diff --git a/test/e2e/knative-openfunction-state/getbulk/.env-cmdrc.js b/test/e2e/knative-openfunction-state/getbulk/.env-cmdrc.js new file mode 100644 index 00000000..d4eb61af --- /dev/null +++ b/test/e2e/knative-openfunction-state/getbulk/.env-cmdrc.js @@ -0,0 +1,18 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-state-getbulk-context', + version: '1.0.0', + runtime: 'knative', + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + pg: { + componentName: 'knative-openfunction-state-component', + componentType: 'state.postgresql', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-state/getbulk/Dockerfile.knative.state.getbulk b/test/e2e/knative-openfunction-state/getbulk/Dockerfile.knative.state.getbulk new file mode 100644 index 00000000..2ee0c2c7 --- /dev/null +++ b/test/e2e/knative-openfunction-state/getbulk/Dockerfile.knative.state.getbulk @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-state/getbulk +WORKDIR /ff/test/e2e/knative-openfunction-state/getbulk + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=tryKnativeStateGetBulk","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-state/getbulk/function.js b/test/e2e/knative-openfunction-state/getbulk/function.js new file mode 100644 index 00000000..8475985d --- /dev/null +++ b/test/e2e/knative-openfunction-state/getbulk/function.js @@ -0,0 +1,16 @@ +async function tryKnativeStateGetBulk(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.state + .getBulk(data) + .then(res => { + console.log('✅ Success getBulk'); + console.log(JSON.stringify(res)); + }) + .catch(err => { + console.log('❌ Failure occurred: %o', err); + }); +} + +module.exports = { + tryKnativeStateGetBulk, +}; diff --git a/test/e2e/knative-openfunction-state/manifests.yaml b/test/e2e/knative-openfunction-state/manifests.yaml new file mode 100644 index 00000000..2ce528e4 --- /dev/null +++ b/test/e2e/knative-openfunction-state/manifests.yaml @@ -0,0 +1,298 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-state-save-deployment + labels: + app: knative-openfunction-state-save + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-state-save + case: knative + template: + metadata: + labels: + app: knative-openfunction-state-save + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-state-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-state-save + image: knative-openfunction-state-save:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-state-get-deployment + labels: + app: knative-openfunction-state-get + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-state-get + case: knative + template: + metadata: + labels: + app: knative-openfunction-state-get + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-state-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-state-get + image: knative-openfunction-state-get:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-state-getbulk-deployment + labels: + app: knative-openfunction-state-getbulk + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-state-getbulk + case: knative + template: + metadata: + labels: + app: knative-openfunction-state-getbulk + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-state-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-state-getbulk + image: knative-openfunction-state-getbulk:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-state-delete-deployment + labels: + app: knative-openfunction-state-delete + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-state-delete + case: knative + template: + metadata: + labels: + app: knative-openfunction-state-delete + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-state-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-state-delete + image: knative-openfunction-state-delete:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-state-transaction-deployment + labels: + app: knative-openfunction-state-transaction + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-state-transaction + case: knative + template: + metadata: + labels: + app: knative-openfunction-state-transaction + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-state-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-state-transaction + image: knative-openfunction-state-transaction:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: knative-openfunction-state-query-deployment + labels: + app: knative-openfunction-state-query + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: knative-openfunction-state-query + case: knative + template: + metadata: + labels: + app: knative-openfunction-state-query + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "knative-openfunction-state-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: my-knative-openfunction-state-query + image: knative-openfunction-state-query:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-state-save-service +spec: + type: NodePort + selector: + app: knative-openfunction-state-save + ports: + - protocol: TCP + port: 12345 + targetPort: 8080 + nodePort: 31234 +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-state-get-service +spec: + type: NodePort + selector: + app: knative-openfunction-state-get + ports: + - protocol: TCP + port: 12346 + targetPort: 8080 + nodePort: 31235 +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-state-getbulk-service +spec: + type: NodePort + selector: + app: knative-openfunction-state-getbulk + ports: + - protocol: TCP + port: 12347 + targetPort: 8080 + nodePort: 31236 +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-state-delete-service +spec: + type: NodePort + selector: + app: knative-openfunction-state-delete + ports: + - protocol: TCP + port: 12348 + targetPort: 8080 + nodePort: 31237 +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-state-transaction-service +spec: + type: NodePort + selector: + app: knative-openfunction-state-transaction + ports: + - protocol: TCP + port: 12349 + targetPort: 8080 + nodePort: 31238 +--- +apiVersion: v1 +kind: Service +metadata: + name: knative-openfunction-state-query-service +spec: + type: NodePort + selector: + app: knative-openfunction-state-query + ports: + - protocol: TCP + port: 12350 + targetPort: 8080 + nodePort: 31239 +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: knative-openfunction-state-component +spec: + type: state.postgresql + version: v1 + metadata: + - name: connectionString + value: "host=postgres-postgresql user=postgres password=password port=5432 connect_timeout=10" diff --git a/test/e2e/knative-openfunction-state/pg-values.yaml b/test/e2e/knative-openfunction-state/pg-values.yaml new file mode 100644 index 00000000..5acc68d6 --- /dev/null +++ b/test/e2e/knative-openfunction-state/pg-values.yaml @@ -0,0 +1,8 @@ +image: + repository: bitnami/postgresql + tag: 15.4.0-debian-11-r0 + +global: + postgresql: + auth: + postgresPassword: password diff --git a/test/e2e/knative-openfunction-state/query/.env-cmdrc.js b/test/e2e/knative-openfunction-state/query/.env-cmdrc.js new file mode 100644 index 00000000..557623ba --- /dev/null +++ b/test/e2e/knative-openfunction-state/query/.env-cmdrc.js @@ -0,0 +1,18 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-state-query-context', + version: '1.0.0', + runtime: 'knative', + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + pg: { + componentName: 'knative-openfunction-state-component', + componentType: 'state.postgresql', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-state/query/Dockerfile.knative.state.query b/test/e2e/knative-openfunction-state/query/Dockerfile.knative.state.query new file mode 100644 index 00000000..fa12a4eb --- /dev/null +++ b/test/e2e/knative-openfunction-state/query/Dockerfile.knative.state.query @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-state/query +WORKDIR /ff/test/e2e/knative-openfunction-state/query + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=tryKnativeStateQuery","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-state/query/function.js b/test/e2e/knative-openfunction-state/query/function.js new file mode 100644 index 00000000..7895fde9 --- /dev/null +++ b/test/e2e/knative-openfunction-state/query/function.js @@ -0,0 +1,19 @@ +async function tryKnativeStateQuery(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.state + .query(data) + .then(res => { + console.log('✅ Success query'); + res.results.forEach(result => { + delete result.etag; + }); + console.log(JSON.stringify(res)); + }) + .catch(err => { + console.log('❌ Failure occurred: %o', err); + }); +} + +module.exports = { + tryKnativeStateQuery, +}; diff --git a/test/e2e/knative-openfunction-state/save/.env-cmdrc.js b/test/e2e/knative-openfunction-state/save/.env-cmdrc.js new file mode 100644 index 00000000..ac4a91b4 --- /dev/null +++ b/test/e2e/knative-openfunction-state/save/.env-cmdrc.js @@ -0,0 +1,18 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-state-save-context', + version: '1.0.0', + runtime: 'knative', + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + pg: { + componentName: 'knative-openfunction-state-component', + componentType: 'state.postgresql', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-state/save/Dockerfile.knative.state.save b/test/e2e/knative-openfunction-state/save/Dockerfile.knative.state.save new file mode 100644 index 00000000..2ea0b211 --- /dev/null +++ b/test/e2e/knative-openfunction-state/save/Dockerfile.knative.state.save @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-state/save +WORKDIR /ff/test/e2e/knative-openfunction-state/save + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=tryKnativeStateSave","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-state/save/function.js b/test/e2e/knative-openfunction-state/save/function.js new file mode 100644 index 00000000..ec538e45 --- /dev/null +++ b/test/e2e/knative-openfunction-state/save/function.js @@ -0,0 +1,16 @@ +async function tryKnativeStateSave(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.state + .save(data) + .then(res => { + console.log('✅ Success query'); + console.log(JSON.stringify(res)); + }) + .catch(err => { + console.log('❌ Failure occurred: %o', err); + }); +} + +module.exports = { + tryKnativeStateSave, +}; diff --git a/test/e2e/knative-openfunction-state/transaction/.env-cmdrc.js b/test/e2e/knative-openfunction-state/transaction/.env-cmdrc.js new file mode 100644 index 00000000..24606e8d --- /dev/null +++ b/test/e2e/knative-openfunction-state/transaction/.env-cmdrc.js @@ -0,0 +1,18 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'my-knative-openfunction-state-transaction-context', + version: '1.0.0', + runtime: 'knative', + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + pg: { + componentName: 'knative-openfunction-state-component', + componentType: 'state.postgresql', + }, + }, + }), + }, +}; diff --git a/test/e2e/knative-openfunction-state/transaction/Dockerfile.knative.state.transaction b/test/e2e/knative-openfunction-state/transaction/Dockerfile.knative.state.transaction new file mode 100644 index 00000000..f423ceff --- /dev/null +++ b/test/e2e/knative-openfunction-state/transaction/Dockerfile.knative.state.transaction @@ -0,0 +1,18 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +# Set working directory to /ff/test/e2e/knative-openfunction-state/transaction +WORKDIR /ff/test/e2e/knative-openfunction-state/transaction + +# Run the ts-node command to execute src/main.ts +CMD ["../../../../node_modules/.bin/env-cmd", "-e", "knative", "../../../../node_modules/.bin/ts-node", "../../../../src/main.ts", "--target=tryKnativeStateTransaction","--signature-type=openfunction"] \ No newline at end of file diff --git a/test/e2e/knative-openfunction-state/transaction/function.js b/test/e2e/knative-openfunction-state/transaction/function.js new file mode 100644 index 00000000..7e7096e8 --- /dev/null +++ b/test/e2e/knative-openfunction-state/transaction/function.js @@ -0,0 +1,16 @@ +async function tryKnativeStateTransaction(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.state + .transaction(data) + .then(res => { + console.log('✅ Success transaction'); + console.log(JSON.stringify(res)); + }) + .catch(err => { + console.log('❌ Failure occurred: %o', err); + }); +} + +module.exports = { + tryKnativeStateTransaction, +}; diff --git a/test/e2e/knative-openfunction-state/verify.sh b/test/e2e/knative-openfunction-state/verify.sh new file mode 100644 index 00000000..c1711aec --- /dev/null +++ b/test/e2e/knative-openfunction-state/verify.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +ip=$1 +port1=$2 +port2=$3 +port3=$4 +port4=$5 +port5=$6 +port6=$7 + +saveURL="http://$ip:$port1" +getURL="http://$ip:$port2" +getBulkURL="http://$ip:$port3" +deleteURL="http://$ip:$port4" +transactionURL="http://$ip:$port5" +queryURL="http://$ip:$port6" + +headers="Content-Type: application/json" + +toSendSave='{ + "data": [ + { + "key": "1", + "value": { + "person": { + "org": "Dev Ops", + "id": 1036 + }, + "city": "Seattle", + "state": "WA" + } + }, + { + "key": "2", + "value": { + "person": { + "org": "Hardware", + "id": 1028 + }, + "city": "Portland", + "state": "OR" + } + } + ] +}' + +toSendGet='{ + "key": "1" +}' + +toSendGetBulk='{ + "keys": ["1", "2"], + "parallelism": 10 +}' + +toSendDelete='{ + "key": "1" +}' + +toSendTransaction='{ + "operations": [ + { + "operation": "delete", + "request": { + "key": "2" + } + }, + { + "operation": "upsert", + "request": { + "key": "1", + "value": { + "person": { + "org": "Dev Ops", + "id": "1036" + }, + "city": "Seattle", + "state": "WA" + } + } + } + ] +}' + +toSendQuery='{ + "query": { + "filter": { + "EQ": { + "state": "WA" + } + }, + "sort": [ + { + "key": "person.id", + "order": "DESC" + } + ], + "page": { + "limit": 1 + } + } +}' + +curl -s -X POST -H "$headers" -d "$toSendSave" "$saveURL" +curl -s -X POST -H "$headers" -d "$toSendGet" "$getURL" +curl -s -X POST -H "$headers" -d "$toSendGetBulk" "$getBulkURL" +curl -s -X POST -H "$headers" -d "$toSendDelete" "$deleteURL" +curl -s -X POST -H "$headers" -d "$toSendTransaction" "$transactionURL" +curl -s -X POST -H "$headers" -d "$toSendQuery" "$queryURL" + +data_result=$(KUBECONFIG=/tmp/e2e-k8s.config kubectl logs -l app="knative-openfunction-state-query" -c my-knative-openfunction-state-query --tail=1) + +echo $data_result diff --git a/test/e2e/openfunction-plugins/.env-cmdrc.js b/test/e2e/openfunction-plugins/.env-cmdrc.js new file mode 100644 index 00000000..a9d84ce5 --- /dev/null +++ b/test/e2e/openfunction-plugins/.env-cmdrc.js @@ -0,0 +1,33 @@ +module.exports = { + knative: { + FUNC_CONTEXT: JSON.stringify({ + name: 'openfunction-plugins-context', + version: '1.0.0', + runtime: 'knative', + states: { + // there is a policy, if you don't specify the state component, we will use the first one + // or you need specify the state name, then the context will use the one you specify + // hint : specify the name is the record key, not the component name + pg: { + componentName: 'pg', + componentType: 'state.postgresql', + }, + }, + pluginsTracing: { + enabled: true, + provider: { + name: 'skywalking', + oapServer: 'localhost:11800', + }, + tags: { + tag1: 'value1', + tag2: 'value2', + }, + baggage: { + key: 'key1', + value: 'value1', + }, + } + }), + }, +}; diff --git a/test/e2e/openfunction-plugins/Docker.openfunction.skywalking b/test/e2e/openfunction-plugins/Docker.openfunction.skywalking new file mode 100644 index 00000000..58c306a3 --- /dev/null +++ b/test/e2e/openfunction-plugins/Docker.openfunction.skywalking @@ -0,0 +1,22 @@ +FROM node:16.17.0-bullseye-slim + +# Set working directory +WORKDIR /ff + +# Copy project files to container +COPY package.json package-lock.json tsconfig.json /ff/ +COPY src /ff/src +COPY test /ff/test + +# Install dependencies +RUN npm install + +RUN npm run build + +# Set working directory to /ff/test/e2e/openfunction-plugins +WORKDIR /ff/test/e2e/openfunction-plugins + +RUN npm install + +# Run the ts-node command to execute src/main.ts +CMD ["npm", "run","knative:plugin:run:func"] \ No newline at end of file diff --git a/test/e2e/openfunction-plugins/e2e.yaml b/test/e2e/openfunction-plugins/e2e.yaml new file mode 100644 index 00000000..7b25cd0e --- /dev/null +++ b/test/e2e/openfunction-plugins/e2e.yaml @@ -0,0 +1,58 @@ +setup: + env: kind + file: ../kind.yaml + steps: + - name: install dapr + command: | + dapr -v || (wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash) + dapr init -k --runtime-version 1.11.0 --log-as-json --wait --timeout 600 + wait: + - namespace: dapr-system + resource: pod + label-selector: app.kubernetes.io/name=dapr + for: condition=Ready + + - name: install helm + command: | + curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + + - name: install postgres + command: | + helm repo add bitnami https://charts.bitnami.com/bitnami + helm install postgres -n default bitnami/postgresql -f test/e2e/openfunction-plugins/pg-values.yaml + wait: + - namespace: default + resource: pod + for: condition=Ready + + - name: build image + command: | + docker build -t openfunction-skywalking-plugins:latest -f test/e2e/openfunction-plugins/Docker.openfunction.skywalking . + kind load docker-image openfunction-skywalking-plugins:latest + + - name: setup manifests + path: manifests.yaml + wait: + - namespace: default + resource: pod + for: condition=Ready + + timeout: 20m + +cleanup: + # always never success failure + on: success + +trigger: + action: "" + +verify: + # verify with retry strategy + retry: + # max retry count + count: 60 + # the interval between two attempts, e.g. 10s, 1m. + interval: 60s + cases: + - query: bash test/e2e/openfunction-plugins/verify.sh 127.0.0.1 80 | yq eval -P + expected: expected.data.yaml diff --git a/test/e2e/openfunction-plugins/expected.data.yaml b/test/e2e/openfunction-plugins/expected.data.yaml new file mode 100644 index 00000000..09f22df6 --- /dev/null +++ b/test/e2e/openfunction-plugins/expected.data.yaml @@ -0,0 +1,18 @@ +endpointName: openfunction-plugins-context +type: Entry +component: OpenFunction +layer: FAAS +isError: false +tags: + - key: runtime + value: knative + - key: http.method + value: POST + - key: http.url + value: / + - key: tag1 + value: value1 + - key: tag2 + value: value2 + - key: func + value: openfunction-plugins-context diff --git a/test/e2e/openfunction-plugins/function.js b/test/e2e/openfunction-plugins/function.js new file mode 100644 index 00000000..820d549b --- /dev/null +++ b/test/e2e/openfunction-plugins/function.js @@ -0,0 +1,16 @@ +async function writeSkywalkingLocalBindings(ctx, data) { + console.log('✅ Function should receive request: %o', data); + await ctx.state + .save(data) + .then(res => { + console.log('✅ Success query'); + console.log(JSON.stringify(res)); + }) + .catch(err => { + console.log('❌ Failure occurred: %o', err); + }); +} + +module.exports = { + writeSkywalkingLocalBindings, +}; diff --git a/test/e2e/openfunction-plugins/manifests.yaml b/test/e2e/openfunction-plugins/manifests.yaml new file mode 100644 index 00000000..b0161c5a --- /dev/null +++ b/test/e2e/openfunction-plugins/manifests.yaml @@ -0,0 +1,68 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: openfunction-skywalking-plugins-deployment + labels: + app: openfunction-skywalking-plugins + case: knative +spec: + replicas: 1 + selector: + matchLabels: + app: openfunction-skywalking-plugins + case: knative + template: + metadata: + labels: + app: openfunction-skywalking-plugins + case: knative + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "openfunction-plugins-app" + dapr.io/app-port: "8080" + dapr.io/log-as-json: "true" + dapr.io/app-protocol: "http" # GRPC is not well supported so far in Dapr Node.js SDK + spec: + containers: + - name: oap + image: apache/skywalking-oap-server:9.2.0 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 11800 + name: grpc + protocol: TCP + - containerPort: 12800 + name: collector + protocol: TCP + - name: my-openfunction-skywalking-plugins + image: openfunction-skywalking-plugins:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: function-port + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: openfunction-skywalking-plugins-service +spec: + type: NodePort + selector: + app: openfunction-skywalking-plugins + ports: + - protocol: TCP + port: 12345 + targetPort: 8080 + nodePort: 31234 +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: pg +spec: + type: state.postgresql + version: v1 + metadata: + - name: connectionString + value: "host=postgres-postgresql user=postgres password=password port=5432 connect_timeout=10" diff --git a/test/e2e/openfunction-plugins/package.json b/test/e2e/openfunction-plugins/package.json new file mode 100644 index 00000000..bbf30f72 --- /dev/null +++ b/test/e2e/openfunction-plugins/package.json @@ -0,0 +1,12 @@ +{ + "dependencies": { + "@openfunction/functions-framework": "file:../../../", + "concurrently": "file:../../../node_modules/concurrently", + "debug": "file:../../../node_modules/debug", + "env-cmd": "file:../../../node_modules/env-cmd", + "wait-on": "file:../../../node_modules/wait-on" + }, + "scripts": { + "knative:plugin:run:func": "env-cmd -e knative functions-framework --signature-type=openfunction --target=writeSkywalkingLocalBindings" + } +} \ No newline at end of file diff --git a/test/e2e/openfunction-plugins/pg-values.yaml b/test/e2e/openfunction-plugins/pg-values.yaml new file mode 100644 index 00000000..5acc68d6 --- /dev/null +++ b/test/e2e/openfunction-plugins/pg-values.yaml @@ -0,0 +1,8 @@ +image: + repository: bitnami/postgresql + tag: 15.4.0-debian-11-r0 + +global: + postgresql: + auth: + postgresPassword: password diff --git a/test/e2e/openfunction-plugins/plugins/skywalking.mjs b/test/e2e/openfunction-plugins/plugins/skywalking.mjs new file mode 100644 index 00000000..1a092ac9 --- /dev/null +++ b/test/e2e/openfunction-plugins/plugins/skywalking.mjs @@ -0,0 +1,57 @@ +import { GraphQLClient, gql } from 'graphql-request'; + +import { Plugin } from '../../../../build/src/index.js'; + +export class SkyPathfinder extends Plugin { + span = {}; + + constructor() { + super('sky-pathfinder', 'v1'); + } + + async execPostHook(ctx) { + // Wait a while for trace logging + await new Promise(r => setTimeout(r, 1000)); + + const traceId = ctx.locals.traceId; + const { trace } = await this.queryGraph(traceId); + + this.span = trace.spans[0]; + + // console.log('[ span ] >', ctx.locals.traceId, this.span); + delete this.span.traceId; + console.log(JSON.stringify(this.span)); + } + + async queryGraph(traceId, endpoint = 'http://localhost:12800/graphql') { + const client = new GraphQLClient(endpoint, { + headers: { + // Why need this header? https://github.com/prisma-labs/graphql-request/issues/140 + accept: 'application/json', + }, + }); + + // Spec: https://github.com/apache/skywalking-query-protocol/blob/master/trace.graphqls + const query = gql` + query ($traceId: ID!) { + trace: queryTrace(traceId: $traceId) { + spans { + traceId + endpointName + type + component + layer + isError + tags { + key + value + } + } + } + } + `; + + const data = await client.request(query, { traceId }); + return data; + } +} diff --git a/test/e2e/openfunction-plugins/plugins/ticktock.mjs b/test/e2e/openfunction-plugins/plugins/ticktock.mjs new file mode 100644 index 00000000..b24c0049 --- /dev/null +++ b/test/e2e/openfunction-plugins/plugins/ticktock.mjs @@ -0,0 +1,17 @@ +import { Plugin } from '../../../../build/src/index.js'; + +export class TickTock extends Plugin { + value = 0; + + constructor() { + super('ticktock', 'v1'); + } + + async execPreHook(ctx, plugins) { + this.value++; + } + + async execPostHook(ctx, plugins) { + this.value--; + } +} \ No newline at end of file diff --git a/test/e2e/openfunction-plugins/verify.sh b/test/e2e/openfunction-plugins/verify.sh new file mode 100644 index 00000000..54a254cd --- /dev/null +++ b/test/e2e/openfunction-plugins/verify.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +ip=$1 +port=$2 +url="http://$ip:$port" +headers="Content-Type: application/json" + +body='{ + "data": [ + { + "key": "1", + "value": { + "person": { + "org": "Dev Ops", + "id": 1036 + }, + "city": "Seattle", + "state": "WA" + } + }, + { + "key": "2", + "value": { + "person": { + "org": "Hardware", + "id": 1028 + }, + "city": "Portland", + "state": "OR" + } + } + ] +}' + +curl -s -X POST -H "$headers" -d "$body" "$url" + +data=$(KUBECONFIG=/tmp/e2e-k8s.config kubectl logs -l app="openfunction-skywalking-plugins" -c my-openfunction-skywalking-plugins --tail=1) + +echo $data diff --git a/test/integration/async_server.ts b/test/integration/async_server.ts index c9254adc..2020e5d6 100644 --- a/test/integration/async_server.ts +++ b/test/integration/async_server.ts @@ -142,7 +142,7 @@ describe('OpenFunction - Async', () => { }); }); - it('mqtt binding w/ custom plugins', done => { + it.skip('mqtt binding w/ custom plugins', done => { getFunctionPlugins(process.cwd() + '/test/data').then(plugins => { const start = get(plugins!.numbers, 'oct'); diff --git a/test/integration/http_statestore.ts b/test/integration/http_astate.ts similarity index 81% rename from test/integration/http_statestore.ts rename to test/integration/http_astate.ts index 6550935a..af03c182 100644 --- a/test/integration/http_statestore.ts +++ b/test/integration/http_astate.ts @@ -26,7 +26,7 @@ const TEST_STATESTORE_QUERY = Payload.Plain.State!.Query; type StateOperation = keyof StateOperations; -describe('OpenFunction - HTTP StateStore', () => { +describe('OpenFunction - HTTP State', () => { const APPID = 'http_statestore'; before(() => { @@ -36,26 +36,27 @@ describe('OpenFunction - HTTP StateStore', () => { if (shell.exec('docker', {silent: true}).code !== 0) throw new Error('Please ensure "docker" is installed'); - // Try to start up redis docker container + // Try to start up pg docker container shell.exec( - 'docker run --name myredis --rm -d -p 6379:6379 redis/redis-stack-server:latest', - { - silent: true, - } + 'docker run --name pg -e POSTGRES_PASSWORD=example --rm -d -p 5432:5432 postgres:12', + {silent: true} ); - // Try to run Dapr sidecar on port 3500 with components for testing - shell.exec( - `dapr run -H 3500 -G 50001 -d ./test/data/components/state -a ${APPID}`, - {silent: true, async: true} - ); + // Delay the execution of Dapr start by 3 seconds + setTimeout(() => { + // Try to run Dapr sidecar on port 3500 with components for testing + shell.exec( + `dapr run -H 3500 -G 50001 -d ./test/data/components/state -a ${APPID}`, + {silent: true, async: true} + ); + }, 10 * 1000); // Delay of 10 seconds }); after(() => { - // Stop redis container - shell.exec('docker stop myredis', {silent: true}); // Stop dapr sidecar process shell.exec(`dapr stop ${APPID}`, {silent: true}); + // Stop pg container + shell.exec('docker stop pg', {silent: true}); }); beforeEach(() => { @@ -93,25 +94,25 @@ describe('OpenFunction - HTTP StateStore', () => { expect: [ { data: { - city: 'Seattle', + city: 'Portland', person: { - id: 1036, - org: 'Dev Ops', + id: 1028, + org: 'Hardware', }, - state: 'WA', + state: 'OR', }, - key: '1', + key: '2', }, { data: { - city: 'Portland', + city: 'Seattle', person: { - id: 1028, - org: 'Hardware', + id: 1036, + org: 'Dev Ops', }, - state: 'OR', + state: 'WA', }, - key: '2', + key: '1', }, ], }, @@ -131,13 +132,30 @@ describe('OpenFunction - HTTP StateStore', () => { name: 'Query data', operation: 'query', tosend: TEST_STATESTORE_QUERY, - // expect: undefined, + expect: { + results: [ + { + data: { + city: 'Seattle', + person: { + id: 1036, + org: 'Dev Ops', + }, + state: 'WA', + }, + etag: '495', + key: '1', + }, + ], + token: '1', + }, }, ]; for (const test of testData) { it(test.name, async () => { const context = cloneDeep(TEST_CONTEXT); + // test the ouput of the state sotre const server = getServer( async (ctx: OpenFunctionRuntime, data: {}) => { @@ -148,10 +166,6 @@ describe('OpenFunction - HTTP StateStore', () => { if (test.operation === 'getBulk') { res = map(res as KeyValueType[], obj => omit(obj, 'etag')); } - // todo: query still have some problems - if (test.operation === 'query') { - console.log(res); - } deepStrictEqual(res, test.expect); }) .catch(err => { diff --git a/test/integration/http_binding.ts b/test/integration/http_binding.ts index 8d777802..680dab84 100644 --- a/test/integration/http_binding.ts +++ b/test/integration/http_binding.ts @@ -73,7 +73,7 @@ describe('OpenFunction - HTTP Binding', () => { ]; for (const test of testData) { - it(test.name, async () => { + it.skip(test.name, async () => { const context = cloneDeep(TEST_CONTEXT); context.prePlugins = context.postPlugins = ['ticktock']; context.postPlugins.push('sky-pathfinder'); diff --git a/tsconfig.json b/tsconfig.json index d9c5627a..35d3fb95 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,4 +10,4 @@ "src/**/*.ts", "test/**/*.ts" ] -} \ No newline at end of file +} From 0951b5a51f3e19308fc20deb3ea95326abbeb8f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 03:46:12 +0000 Subject: [PATCH 125/131] 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/e2e.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index d9975ee0..150616e5 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -38,7 +38,7 @@ jobs: - name: openfunction plugins e2e test e2e: "test/e2e/openfunction-plugins/e2e.yaml" steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: install yq env: From 69c8d8bc065f3755794b09053987feecb2a35ea4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 03:14:09 +0000 Subject: [PATCH 126/131] chore(deps-dev): bump sinon from 15.2.0 to 16.1.0 Bumps [sinon](https://github.com/sinonjs/sinon) from 15.2.0 to 16.1.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/v15.2.0...v16.1.0) --- updated-dependencies: - dependency-name: sinon dependency-type: direct:development update-type: version-update:semver-major ... 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 5781899e..abc91150 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.4", "shelljs": "^0.8.5", - "sinon": "^15.0.0", + "sinon": "^16.1.0", "supertest": "6.3.1", "typescript": "^4.8.4", "wait-on": "^7.0.1" @@ -6180,9 +6180,9 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-16.1.0.tgz", + "integrity": "sha512-ZSgzF0vwmoa8pq0GEynqfdnpEDyP1PkYmEChnkjW0Vyh8IDlyFEJ+fkMhCP0il6d5cJjPl2PUsnUSAuP5sttOQ==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", @@ -12029,9 +12029,9 @@ } }, "sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-16.1.0.tgz", + "integrity": "sha512-ZSgzF0vwmoa8pq0GEynqfdnpEDyP1PkYmEChnkjW0Vyh8IDlyFEJ+fkMhCP0il6d5cJjPl2PUsnUSAuP5sttOQ==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0", diff --git a/package.json b/package.json index 656d5548..ffab8a8e 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "pack-n-play": "^1.0.0-2", "pre-push": "^0.1.4", "shelljs": "^0.8.5", - "sinon": "^15.0.0", + "sinon": "^16.1.0", "supertest": "6.3.1", "typescript": "^4.8.4", "wait-on": "^7.0.1" From c9099a906a4e20bd9105e5bee85a86b627353399 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 03:10:30 +0000 Subject: [PATCH 127/131] chore(deps-dev): bump pack-n-play from 1.0.0-2 to 2.0.1 Bumps [pack-n-play](https://github.com/googleapis/pack-n-play) from 1.0.0-2 to 2.0.1. - [Release notes](https://github.com/googleapis/pack-n-play/releases) - [Changelog](https://github.com/googleapis/pack-n-play/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/pack-n-play/compare/v1.0.0-2...v2.0.1) --- updated-dependencies: - dependency-name: pack-n-play dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 4487 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 2 files changed, 4290 insertions(+), 199 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5781899e..d51c676b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "graphql-request": "^6.1.0", "gts": "^3.1.1", "mocha": "10.1.0", - "pack-n-play": "^1.0.0-2", + "pack-n-play": "^2.0.1", "pre-push": "^0.1.4", "shelljs": "^0.8.5", "sinon": "^15.0.0", @@ -295,6 +295,108 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -447,6 +549,470 @@ "node": ">= 8" } }, + "node_modules/@npmcli/arborist": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-6.5.0.tgz", + "integrity": "sha512-Ir14P+DyH4COJ9fVbmxVy+9GmyU3e/DnlBtijVN7B3Ri53Y9QmAqi1S9IifG0PTGsfa2U4zhAF8e6I/0VXfWjg==", + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^5.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^4.0.0", + "@npmcli/query": "^3.0.0", + "@npmcli/run-script": "^6.0.0", + "bin-links": "^4.0.1", + "cacache": "^17.0.4", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.1", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/arborist/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", + "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", + "dev": true, + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", + "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", + "dev": true, + "dependencies": { + "cacache": "^17.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^15.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.1.0", + "glob": "^10.2.2", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/query": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.1.tgz", + "integrity": "sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -567,6 +1133,54 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -611,6 +1225,15 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -631,6 +1254,52 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -1031,12 +1700,33 @@ "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", - "trouter": "^3.2.0" + "lru-cache": "^6.0.0", + "regexparam": "^2.0.0", + "trouter": "^3.2.0" + }, + "engines": { + "node": ">=10.x" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=10.x" + "node": ">=6.5" } }, "node_modules/accepts": { @@ -1128,6 +1818,43 @@ "node": ">=14" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1247,6 +1974,65 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", + "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -1358,6 +2144,46 @@ "node": "*" } }, + "node_modules/bin-links": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.2.tgz", + "integrity": "sha512-jxJ0PbXR8eQyPlExCvCs3JFnikvs1Yp4gUJt6nmgathdOwvur+q22KWC3h20gvWl4T/14DXKj2IlkJwwZkZPOw==", + "dev": true, + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/bin-links/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/bin-links/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1463,6 +2289,15 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1471,6 +2306,84 @@ "node": ">= 0.8" } }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1565,10 +2478,13 @@ } }, "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/clean-pkg-json": { "version": "1.2.0", @@ -1579,6 +2495,15 @@ "clean-pkg-json": "dist/index.js" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1647,6 +2572,15 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/cmd-shim": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.1.tgz", + "integrity": "sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", @@ -1678,6 +2612,15 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colors": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", @@ -1717,6 +2660,12 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1933,6 +2882,12 @@ "node": ">=12" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -2042,6 +2997,18 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -2146,6 +3113,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2206,6 +3179,12 @@ "node": ">=6.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2229,6 +3208,27 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2275,6 +3275,21 @@ "node": ">= 6" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2807,6 +3822,24 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2830,6 +3863,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", @@ -3187,6 +4226,34 @@ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", @@ -3247,15 +4314,15 @@ } }, "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/fs.realpath": { @@ -3289,6 +4356,37 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "node_modules/gauge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", + "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3624,6 +4722,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -3647,6 +4751,12 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -3662,6 +4772,20 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-terminator": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/http-terminator/-/http-terminator-3.2.0.tgz", @@ -3684,6 +4808,19 @@ "node": ">=12.20" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -3693,6 +4830,15 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/husky": { "version": "7.0.4", "resolved": "https://registry.npmmirror.com/husky/-/husky-7.0.4.tgz", @@ -3741,12 +4887,39 @@ } }, "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/import-fresh": { @@ -3923,6 +5096,12 @@ "node": ">= 0.10" } }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -4068,6 +5247,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -4232,6 +5417,24 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -4293,6 +5496,15 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -4314,6 +5526,27 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -4516,6 +5749,50 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -4722,9 +5999,141 @@ } }, "node_modules/minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" @@ -4746,16 +6155,28 @@ "node": ">= 8" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "yallist": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/mocha": { @@ -5037,41 +6458,149 @@ "path-to-regexp": "^1.7.0" } }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "dependencies": { - "isarray": "0.0.1" + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" }, "engines": { - "node": "4.x || >=6.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" }, - "peerDependencies": { - "encoding": "^0.1.0" + "bin": { + "nopt": "bin/nopt.js" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data": { @@ -5103,36 +6632,126 @@ } }, "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.0.tgz", + "integrity": "sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==", "dev": true, "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "ignore-walk": "^6.0.0" }, - "bin": { - "npm-packlist": "bin/index.js" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/npm-run-path": { @@ -5147,6 +6766,21 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", @@ -5291,6 +6925,21 @@ "node": ">=8" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-timeout": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-3.2.0.tgz", @@ -5322,44 +6971,207 @@ } }, "node_modules/pack-n-play": { - "version": "1.0.0-2", - "resolved": "https://registry.npmjs.org/pack-n-play/-/pack-n-play-1.0.0-2.tgz", - "integrity": "sha512-AUCSyqk/UAD79KPSK678HrVyRGqYZrSeqpjXCwLujR11cW0R3mlc3uHrYrrMniTbfGPzkDXbW8HZj6lZm0KD5w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pack-n-play/-/pack-n-play-2.0.1.tgz", + "integrity": "sha512-TqKXx+OWaQkxucHcFbeRk1a1bE6hdIinMEPi7fGvVLVxq/Wa7/BmfytYBlqE204gRg+IIaEkrNUZowlJpe5xUw==", "dev": true, "dependencies": { - "glob": "^7.1.2", - "npm-packlist": "^2.0.0", + "@npmcli/arborist": "^6.3.0", + "execa": "^5.0.0", + "npm-packlist": "^8.0.0", "once": "^1.4.0", - "rimraf": "^3.0.0", - "tar": "^5.0.0", - "tmp": "0.1.0" + "rimraf": "^5.0.5", + "tar": "^6.2.0", + "tmp": "0.2.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/pack-n-play/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/pack-n-play/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pack-n-play/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pack-n-play/node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=8.x" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/pack-n-play/node_modules/tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "dependencies": { - "rimraf": "^2.6.3" + "rimraf": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8.17.0" + } + }, + "node_modules/pack-n-play/node_modules/tmp/node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/pack-n-play/node_modules/tmp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pack-n-play/node_modules/tmp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/pack-n-play/node_modules/tmp/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pacote/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pacote/node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/parent-module": { @@ -5374,6 +7186,29 @@ "node": ">=6" } }, + "node_modules/parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -5430,6 +7265,31 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -5452,8 +7312,21 @@ "engines": { "node": ">=8.6" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/pre-push": { @@ -5561,6 +7434,15 @@ "node": ">=6.0.0" } }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -5584,6 +7466,43 @@ "node": ">=0.4.0" } }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/protobufjs": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", @@ -5718,6 +7637,143 @@ "node": ">= 0.8" } }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -5904,6 +7960,15 @@ "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==", "dev": true }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6095,6 +8160,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -6161,11 +8232,30 @@ } }, "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -6306,6 +8396,44 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", @@ -6365,6 +8493,18 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz", @@ -6435,6 +8575,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -6470,6 +8625,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -6610,22 +8778,55 @@ "dev": true }, "node_modules/tar": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.11.tgz", - "integrity": "sha512-E6q48d5y4XSCD+Xmwc0yc8lXuyDK38E0FB8N4S/drQRtXOMUhfhDxbB0xr2KKDhNfO51CFmoa6Oz00nAkWsjnA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^2.1.0", - "minipass": "^3.1.3", - "minizlib": "^2.1.2", - "mkdirp": "^0.5.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { "node": ">= 8" } }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/text-hex/-/text-hex-1.0.0.tgz", @@ -6689,6 +8890,15 @@ "tree-kill": "cli.js" } }, + "node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -6804,6 +9014,20 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6886,6 +9110,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -6971,6 +9219,18 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", @@ -7022,6 +9282,12 @@ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -7085,6 +9351,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/winston": { "version": "3.8.1", "resolved": "https://registry.npmmirror.com/winston/-/winston-3.8.1.tgz", @@ -7133,10 +9408,28 @@ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, - "node_modules/wrap-ansi": { + "node_modules/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==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7149,6 +9442,39 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -7524,6 +9850,77 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true + }, "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -7598,62 +9995,414 @@ "@rushstack/node-core-library": "3.59.6" } }, - "@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, - "@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + } + } + }, + "@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" + } + }, + "@npmcli/arborist": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-6.5.0.tgz", + "integrity": "sha512-Ir14P+DyH4COJ9fVbmxVy+9GmyU3e/DnlBtijVN7B3Ri53Y9QmAqi1S9IifG0PTGsfa2U4zhAF8e6I/0VXfWjg==", + "dev": true, + "requires": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^5.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^4.0.0", + "@npmcli/query": "^3.0.0", + "@npmcli/run-script": "^6.0.0", + "bin-links": "^4.0.1", + "cacache": "^17.0.4", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.1", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "requires": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + } + }, + "@npmcli/map-workspaces": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", + "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", + "dev": true, + "requires": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@npmcli/metavuln-calculator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", + "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", + "dev": true, + "requires": { + "cacache": "^17.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^15.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + } + } + }, + "@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true + }, + "@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true + }, + "@npmcli/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", + "dev": true, + "requires": { + "@npmcli/git": "^4.1.0", + "glob": "^10.2.2", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + } + } + }, + "@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" + "which": "^3.0.0" }, "dependencies": { - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "isexe": "^2.0.0" } } } }, - "@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==", + "@npmcli/query": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.1.tgz", + "integrity": "sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "postcss-selector-parser": "^6.0.10" } }, - "@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==", + "@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -7766,6 +10515,42 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, + "@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0" + } + }, + "@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true + }, + "@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "requires": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + } + }, + "@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + } + }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -7812,6 +10597,12 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -7832,6 +10623,42 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, + "@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true + }, + "@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "requires": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -8162,6 +10989,21 @@ "trouter": "^3.2.0" } }, + "abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -8228,6 +11070,34 @@ "qlobber": "^7.0.0" } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -8311,6 +11181,47 @@ "picomatch": "^2.0.4" } }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", + "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + } + } + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -8401,6 +11312,36 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" }, + "bin-links": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.2.tgz", + "integrity": "sha512-jxJ0PbXR8eQyPlExCvCs3JFnikvs1Yp4gUJt6nmgathdOwvur+q22KWC3h20gvWl4T/14DXKj2IlkJwwZkZPOw==", + "dev": true, + "requires": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + } + } + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -8498,11 +11439,79 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, + "cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -8568,9 +11577,9 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "clean-pkg-json": { @@ -8579,6 +11588,12 @@ "integrity": "sha512-QHBWWOtpSCv5nfMFKwyxn4WMvkYE0msxj5xiqejYGqYepWVrK7O/om1Vn6nSl/WPtYn8ge9YmSCbTi1Hp8k+Hg==", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -8636,6 +11651,12 @@ } } }, + "cmd-shim": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.1.tgz", + "integrity": "sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==", + "dev": true + }, "color": { "version": "3.2.1", "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", @@ -8667,6 +11688,12 @@ "simple-swizzle": "^0.2.2" } }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "colors": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", @@ -8697,6 +11724,12 @@ "dev": true, "optional": true }, + "common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", @@ -8879,6 +11912,12 @@ } } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8955,6 +11994,12 @@ "which": "^2.0.1" } }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, "date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -9025,6 +12070,12 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -9069,6 +12120,12 @@ "esutils": "^2.0.2" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -9089,6 +12146,26 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -9125,6 +12202,18 @@ } } }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9503,6 +12592,18 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -9520,6 +12621,12 @@ "strip-final-newline": "^2.0.0" } }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "express": { "version": "4.18.2", "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", @@ -9813,6 +12920,24 @@ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } + } + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", @@ -9857,13 +12982,13 @@ "universalify": "^0.1.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "requires": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" } }, "fs.realpath": { @@ -9890,6 +13015,30 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", + "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -10121,6 +13270,12 @@ "has-symbols": "^1.0.2" } }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -10138,6 +13293,12 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -10150,6 +13311,17 @@ "toidentifier": "1.0.1" } }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "http-terminator": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/http-terminator/-/http-terminator-3.2.0.tgz", @@ -10168,12 +13340,31 @@ } } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "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 }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, "husky": { "version": "7.0.4", "resolved": "https://registry.npmmirror.com/husky/-/husky-7.0.4.tgz", @@ -10210,12 +13401,32 @@ "dev": true }, "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^9.0.0" + }, + "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "import-fresh": { @@ -10349,6 +13560,12 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -10443,6 +13660,12 @@ "is-extglob": "^2.1.1" } }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -10547,6 +13770,16 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -10605,6 +13838,12 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true + }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10620,6 +13859,24 @@ "graceful-fs": "^4.1.6" } }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true + }, + "just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -10785,6 +14042,43 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + } + } + }, "map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -10933,12 +14227,122 @@ } }, "minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "requires": { - "yallist": "^4.0.0" + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minizlib": { @@ -10949,16 +14353,24 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "mocha": { "version": "10.1.0", @@ -11198,6 +14610,89 @@ "whatwg-url": "^5.0.0" } }, + "node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + } + } + }, + "nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "requires": { + "abbrev": "^2.0.0" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -11223,30 +14718,100 @@ "dev": true }, "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^3.0.0" + } + }, + "npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "semver": "^7.1.1" } }, "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + } + } + }, "npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.0.tgz", + "integrity": "sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==", + "dev": true, + "requires": { + "ignore-walk": "^6.0.0" + } + }, + "npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "dev": true, + "requires": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + } + }, + "npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + } } }, "npm-run-path": { @@ -11258,6 +14823,18 @@ "path-key": "^3.0.0" } }, + "npmlog": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + } + }, "object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", @@ -11360,6 +14937,15 @@ "p-limit": "^2.2.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-timeout": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-3.2.0.tgz", @@ -11382,32 +14968,106 @@ } }, "pack-n-play": { - "version": "1.0.0-2", - "resolved": "https://registry.npmjs.org/pack-n-play/-/pack-n-play-1.0.0-2.tgz", - "integrity": "sha512-AUCSyqk/UAD79KPSK678HrVyRGqYZrSeqpjXCwLujR11cW0R3mlc3uHrYrrMniTbfGPzkDXbW8HZj6lZm0KD5w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pack-n-play/-/pack-n-play-2.0.1.tgz", + "integrity": "sha512-TqKXx+OWaQkxucHcFbeRk1a1bE6hdIinMEPi7fGvVLVxq/Wa7/BmfytYBlqE204gRg+IIaEkrNUZowlJpe5xUw==", "dev": true, "requires": { - "glob": "^7.1.2", - "npm-packlist": "^2.0.0", + "@npmcli/arborist": "^6.3.0", + "execa": "^5.0.0", + "npm-packlist": "^8.0.0", "once": "^1.4.0", - "rimraf": "^3.0.0", - "tar": "^5.0.0", - "tmp": "0.1.0" + "rimraf": "^5.0.5", + "tar": "^6.2.0", + "tmp": "0.2.1" }, "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "requires": { + "glob": "^10.3.7" + } + }, "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "rimraf": "^2.6.3" + "rimraf": "^3.0.0" }, "dependencies": { + "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" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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" @@ -11417,6 +15077,49 @@ } } }, + "pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "requires": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "requires": { + "ignore-walk": "^6.0.0" + } + } + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -11426,6 +15129,25 @@ "callsites": "^3.0.0" } }, + "parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + } + } + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -11464,6 +15186,24 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true + } + } + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -11481,6 +15221,16 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, "pre-push": { "version": "0.1.4", "resolved": "https://registry.npmmirror.com/pre-push/-/pre-push-0.1.4.tgz", @@ -11566,6 +15316,12 @@ "fast-diff": "^1.1.2" } }, + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11583,6 +15339,34 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true + }, + "promise-call-limit": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, "protobufjs": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", @@ -11680,6 +15464,108 @@ "unpipe": "1.0.0" } }, + "read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true + }, + "read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "dev": true, + "requires": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "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": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + } + } + }, + "read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + } + } + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -11813,6 +15699,12 @@ "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==", "dev": true }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -11960,6 +15852,12 @@ "send": "0.18.0" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12008,11 +15906,24 @@ } }, "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "requires": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + } + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -12129,6 +16040,33 @@ } } }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", @@ -12185,6 +16123,15 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "requires": { + "minipass": "^7.0.3" + } + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz", @@ -12231,6 +16178,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@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" + } + }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -12257,6 +16215,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@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", @@ -12361,17 +16328,45 @@ } }, "tar": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.11.tgz", - "integrity": "sha512-E6q48d5y4XSCD+Xmwc0yc8lXuyDK38E0FB8N4S/drQRtXOMUhfhDxbB0xr2KKDhNfO51CFmoa6Oz00nAkWsjnA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^2.1.0", - "minipass": "^3.1.3", - "minizlib": "^2.1.2", - "mkdirp": "^0.5.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", "yallist": "^4.0.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + } } }, "text-hex": { @@ -12425,6 +16420,12 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "dev": true + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -12498,6 +16499,17 @@ "tslib": "^1.8.1" } }, + "tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "requires": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12558,6 +16570,24 @@ "which-boxed-primitive": "^1.0.2" } }, + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "requires": { + "unique-slug": "^4.0.0" + } + }, + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -12631,6 +16661,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, "validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", @@ -12672,6 +16711,12 @@ } } }, + "walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -12720,6 +16765,15 @@ "is-typed-array": "^1.1.7" } }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "winston": { "version": "3.8.1", "resolved": "https://registry.npmmirror.com/winston/-/winston-3.8.1.tgz", @@ -12792,6 +16846,43 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@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" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 656d5548..4e1b179c 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "graphql-request": "^6.1.0", "gts": "^3.1.1", "mocha": "10.1.0", - "pack-n-play": "^1.0.0-2", + "pack-n-play": "^2.0.1", "pre-push": "^0.1.4", "shelljs": "^0.8.5", "sinon": "^15.0.0", From 527a20fc0a7418253a763e7c130893159cbfe4ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 03:52:21 +0000 Subject: [PATCH 128/131] chore(deps): bump actions/setup-node from 3 to 4 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3...v4) --- 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/publish.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 468584b9..981a9f10 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@v3 + uses: actions/setup-node@v4 - name: Install dependencies run: npm ci - name: Build docs diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 7c9da6d2..aba88ba0 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@v3 + uses: actions/setup-node@v4 - name: Install dependencies run: npm install - name: Build TypeScript project diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index cfc417df..84b6d793 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,7 +6,7 @@ jobs: steps: - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 16 registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index f48e6353..b9e21c24 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -32,7 +32,7 @@ jobs: run: dapr init -s --runtime-version ${{ matrix.dapr-version }} - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} From 38d700f97ebdaee53c0770c39910a4f756e9c979 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 03:14:01 +0000 Subject: [PATCH 129/131] chore(deps): bump skywalking-backend-js from 0.6.0 to 0.7.0 Bumps [skywalking-backend-js](https://github.com/apache/skywalking-nodejs) from 0.6.0 to 0.7.0. - [Release notes](https://github.com/apache/skywalking-nodejs/releases) - [Changelog](https://github.com/apache/skywalking-nodejs/blob/master/CHANGELOG.md) - [Commits](https://github.com/apache/skywalking-nodejs/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: skywalking-backend-js dependency-type: direct:production 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 364a31fb..9602ba45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", - "skywalking-backend-js": "^0.6.0", + "skywalking-backend-js": "^0.7.0", "ts-node": "^10.9.1" }, "bin": { @@ -8318,9 +8318,9 @@ } }, "node_modules/skywalking-backend-js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/skywalking-backend-js/-/skywalking-backend-js-0.6.0.tgz", - "integrity": "sha512-C0VMSUxTsqfjQwdB705VAo29cIYKxMAfHoFL9aIDv2G3mfxnNdUYPr91hm84fk/BdSV5HKt8Bxt9ulBKfCV6/g==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/skywalking-backend-js/-/skywalking-backend-js-0.7.0.tgz", + "integrity": "sha512-/zJ9TnGl/VG+pPXiNCv/FCNpf4mb9smSGC7i74GFssZC7IjaCTw/T7lfYhW5zaH4G1w7w3lWA3amsIBPdtDd/w==", "hasInstallScript": true, "dependencies": { "@grpc/grpc-js": "^1.6.7", @@ -15977,9 +15977,9 @@ } }, "skywalking-backend-js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/skywalking-backend-js/-/skywalking-backend-js-0.6.0.tgz", - "integrity": "sha512-C0VMSUxTsqfjQwdB705VAo29cIYKxMAfHoFL9aIDv2G3mfxnNdUYPr91hm84fk/BdSV5HKt8Bxt9ulBKfCV6/g==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/skywalking-backend-js/-/skywalking-backend-js-0.7.0.tgz", + "integrity": "sha512-/zJ9TnGl/VG+pPXiNCv/FCNpf4mb9smSGC7i74GFssZC7IjaCTw/T7lfYhW5zaH4G1w7w3lWA3amsIBPdtDd/w==", "requires": { "@grpc/grpc-js": "^1.6.7", "google-protobuf": "^3.14.0", diff --git a/package.json b/package.json index a572e512..3668a847 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "on-finished": "^2.4.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.8", - "skywalking-backend-js": "^0.6.0", + "skywalking-backend-js": "^0.7.0", "ts-node": "^10.9.1" }, "scripts": { From 33f74707f542efbab8478f62cd2a0ce3f5eadaaa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 03:35:28 +0000 Subject: [PATCH 130/131] chore(deps): bump actions/github-script from 6 to 7 Bumps [actions/github-script](https://github.com/actions/github-script) from 6 to 7. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/assign.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/assign.yml b/.github/workflows/assign.yml index e8baf045..e1b27065 100644 --- a/.github/workflows/assign.yml +++ b/.github/workflows/assign.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Comment analyzer - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | From 12aca92da04616bcccf8cac07e946035fa6bdfbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 03:39:27 +0000 Subject: [PATCH 131/131] chore(deps-dev): bump wait-on from 7.0.1 to 7.2.0 Bumps [wait-on](https://github.com/jeffbski/wait-on) from 7.0.1 to 7.2.0. - [Release notes](https://github.com/jeffbski/wait-on/releases) - [Commits](https://github.com/jeffbski/wait-on/compare/v7.0.1...v7.2.0) --- updated-dependencies: - dependency-name: wait-on dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 129 ++++++++++++++++++++++++++-------------------- 1 file changed, 73 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index 364a31fb..98c6042b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2107,13 +2107,14 @@ } }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/balanced-match": { @@ -4202,9 +4203,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, "funding": [ { @@ -5442,15 +5443,15 @@ "dev": true }, "node_modules/joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", + "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, @@ -5980,9 +5981,12 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minimist-options": { "version": "4.1.0", @@ -7543,6 +7547,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", @@ -9249,16 +9259,16 @@ } }, "node_modules/wait-on": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", - "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", "dev": true, "dependencies": { - "axios": "^0.27.2", - "joi": "^17.7.0", + "axios": "^1.6.1", + "joi": "^17.11.0", "lodash": "^4.17.21", - "minimist": "^1.2.7", - "rxjs": "^7.8.0" + "minimist": "^1.2.8", + "rxjs": "^7.8.1" }, "bin": { "wait-on": "bin/wait-on" @@ -9268,18 +9278,18 @@ } }, "node_modules/wait-on/node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { "tslib": "^2.1.0" } }, "node_modules/wait-on/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/walk-up-path": { @@ -11281,13 +11291,14 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "balanced-match": { @@ -12910,9 +12921,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true }, "foreach": { @@ -13787,15 +13798,15 @@ "dev": true }, "joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", + "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, @@ -14211,9 +14222,9 @@ } }, "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minimist-options": { "version": "4.1.0", @@ -15402,6 +15413,12 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", @@ -16682,31 +16699,31 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "wait-on": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", - "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", "dev": true, "requires": { - "axios": "^0.27.2", - "joi": "^17.7.0", + "axios": "^1.6.1", + "joi": "^17.11.0", "lodash": "^4.17.21", - "minimist": "^1.2.7", - "rxjs": "^7.8.0" + "minimist": "^1.2.8", + "rxjs": "^7.8.1" }, "dependencies": { "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "requires": { "tslib": "^2.1.0" } }, "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true } }