From 00473fda64b709bcb023800d2293907b3ae736f1 Mon Sep 17 00:00:00 2001 From: apichick Date: Sun, 20 Feb 2022 21:22:41 +0100 Subject: [PATCH] API gateway module and example that creates a multi-region deployment for API gateway --- .gitignore | 1 + examples/serverless/api-gateway/README.md | 41 + .../serverless/api-gateway/architecture.png | Bin 0 -> 53654 bytes .../serverless/api-gateway/function/index.js | 7 + .../api-gateway/function/package-lock.json | 2560 +++++++++++++++++ .../api-gateway/function/package.json | 18 + examples/serverless/api-gateway/main.tf | 145 + examples/serverless/api-gateway/outputs.tf | 20 + examples/serverless/api-gateway/spec.yaml | 35 + examples/serverless/api-gateway/variables.tf | 34 + modules/api-gateway/README.md | 89 + modules/api-gateway/main.tf | 115 + modules/api-gateway/outputs.tf | 107 + modules/api-gateway/variables.tf | 59 + modules/api-gateway/versions.tf | 29 + .../serverless/api_gateway/__init__.py | 13 + .../serverless/api_gateway/fixture/main.tf | 22 + .../api_gateway/fixture/variables.tf | 39 + .../serverless/api_gateway/test_plan.py | 19 + tests/modules/api_gateway/__init__.py | 13 + tests/modules/api_gateway/fixture/main.tf | 26 + .../modules/api_gateway/fixture/variables.tf | 55 + tests/modules/api_gateway/test_plan.py | 26 + 23 files changed, 3473 insertions(+) create mode 100644 examples/serverless/api-gateway/README.md create mode 100644 examples/serverless/api-gateway/architecture.png create mode 100644 examples/serverless/api-gateway/function/index.js create mode 100644 examples/serverless/api-gateway/function/package-lock.json create mode 100644 examples/serverless/api-gateway/function/package.json create mode 100644 examples/serverless/api-gateway/main.tf create mode 100644 examples/serverless/api-gateway/outputs.tf create mode 100644 examples/serverless/api-gateway/spec.yaml create mode 100644 examples/serverless/api-gateway/variables.tf create mode 100644 modules/api-gateway/README.md create mode 100644 modules/api-gateway/main.tf create mode 100644 modules/api-gateway/outputs.tf create mode 100644 modules/api-gateway/variables.tf create mode 100644 modules/api-gateway/versions.tf create mode 100644 tests/examples/serverless/api_gateway/__init__.py create mode 100644 tests/examples/serverless/api_gateway/fixture/main.tf create mode 100644 tests/examples/serverless/api_gateway/fixture/variables.tf create mode 100644 tests/examples/serverless/api_gateway/test_plan.py create mode 100644 tests/modules/api_gateway/__init__.py create mode 100644 tests/modules/api_gateway/fixture/main.tf create mode 100644 tests/modules/api_gateway/fixture/variables.tf create mode 100644 tests/modules/api_gateway/test_plan.py diff --git a/.gitignore b/.gitignore index b0522066..816a1109 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ fast/stages/**/terraform.tfvars fast/stages/**/terraform.tfvars.json fast/stages/**/terraform-*.auto.tfvars.json fast/stages/**/0*.auto.tfvars* +**/node_modules diff --git a/examples/serverless/api-gateway/README.md b/examples/serverless/api-gateway/README.md new file mode 100644 index 00000000..3b5cad38 --- /dev/null +++ b/examples/serverless/api-gateway/README.md @@ -0,0 +1,41 @@ +# Creating multi-region deployments for API Gateway + +This tutorial shows you how to configure an HTTP(S) load balancer to enable multi-region deployments for API Gateway. For more details on how this set up work have a look at the article [here](https://cloud.google.com/api-gateway/docs/multi-region-deployment). + +The diagram below depicts the architecture that this example sets up. + +![Architecture](architecture.png) + +# Running the example + +Clone this repository or [open it in cloud shell](https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fcloud-foundation-fabric&cloudshell_print=cloud-shell-readme.txt&cloudshell_working_dir=examples%2Fserverless%2Fapi-gateway), then go through the following steps to create resources: + +* `terraform init` +* `terraform apply -var project_id=my-project-id` + +## Testing the example + +1. Copy the IP address returned as output + +2. Execute the following command + + curl -v http:///hello + +Once done testing, you can clean up resources by running `terraform destroy`. + + +## Variables + +| name | description | type | required | default | +|---|---|:---:|:---:|:---:| +| [project_id](variables.tf#L26) | Identifier of the project. | string | ✓ | | +| [regions](variables.tf#L31) | List of regions to deploy the proxy in. | list(string) | ✓ | | +| [project_create](variables.tf#L17) | Parameters for the creation of the new project. | object({…}) | | null | + +## Outputs + +| name | description | sensitive | +|---|---|:---:| +| [ip_address](outputs.tf#L17) | The reserved global IP address. | | + + diff --git a/examples/serverless/api-gateway/architecture.png b/examples/serverless/api-gateway/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3f616023f502a42f179ccd60cdcc5409ca8878 GIT binary patch literal 53654 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 { + res.send('Hello World!'); +}); \ No newline at end of file diff --git a/examples/serverless/api-gateway/function/package-lock.json b/examples/serverless/api-gateway/function/package-lock.json new file mode 100644 index 00000000..6bf7ab5c --- /dev/null +++ b/examples/serverless/api-gateway/function/package-lock.json @@ -0,0 +1,2560 @@ +{ + "name": "function", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "function", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@google-cloud/functions-framework": "^3.0.0", + "express": "^4.17.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@google-cloud/functions-framework": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/functions-framework/-/functions-framework-3.0.0.tgz", + "integrity": "sha512-+K9+y39/5ig4QrbnaCM8BOzt4+Qx5SRMu2dj5QDTNFc5s8f/Lubty8u3aBQN6JC86M0NuHL9zIj8xs8Awj7C+w==", + "dependencies": { + "body-parser": "^1.18.3", + "cloudevents": "^5.1.0", + "express": "^4.16.4", + "minimist": "^1.2.5", + "on-finished": "^2.3.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.5" + }, + "bin": { + "functions-framework": "build/src/main.js", + "functions-framework-nodejs": "build/src/main.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@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==" + }, + "node_modules/accepts": { + "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.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cloudevents": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-5.3.2.tgz", + "integrity": "sha512-ZjEFjx0BJnio8SED1TzD7GHA118zCk04Mz6aDMMii+4/ZvX5LPgn1D4lT5Jj7HodCbdeRS6dX88unH06Qc3mkA==", + "dependencies": { + "ajv": "~6.12.3", + "util": "^0.12.4", + "uuid": "~8.3.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/content-disposition": { + "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.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.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", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/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==" + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "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", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==" + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "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", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/negotiator": { + "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" + } + }, + "node_modules/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==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "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.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "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", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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/toidentifier": { + "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" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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/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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/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==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@google-cloud/functions-framework": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/functions-framework/-/functions-framework-3.0.0.tgz", + "integrity": "sha512-+K9+y39/5ig4QrbnaCM8BOzt4+Qx5SRMu2dj5QDTNFc5s8f/Lubty8u3aBQN6JC86M0NuHL9zIj8xs8Awj7C+w==", + "requires": { + "body-parser": "^1.18.3", + "cloudevents": "^5.1.0", + "express": "^4.16.4", + "minimist": "^1.2.5", + "on-finished": "^2.3.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.5" + } + }, + "@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==" + }, + "accepts": { + "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.34", + "negotiator": "0.6.3" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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-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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + } + }, + "bytes": { + "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", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cloudevents": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-5.3.2.tgz", + "integrity": "sha512-ZjEFjx0BJnio8SED1TzD7GHA118zCk04Mz6aDMMii+4/ZvX5LPgn1D4lT5Jj7HodCbdeRS6dX88unH06Qc3mkA==", + "requires": { + "ajv": "~6.12.3", + "util": "^0.12.4", + "uuid": "~8.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==", + "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=" + }, + "content-disposition": { + "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.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "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==" + }, + "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==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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==" + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "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", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==" + }, + "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==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "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", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "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==" + }, + "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==", + "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" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.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==" + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "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": { + "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==" + } + } + }, + "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==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "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==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "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.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "setprototypeof": { + "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", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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==" + }, + "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==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "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==" + }, + "toidentifier": { + "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", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "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==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/examples/serverless/api-gateway/function/package.json b/examples/serverless/api-gateway/function/package.json new file mode 100644 index 00000000..6e44d266 --- /dev/null +++ b/examples/serverless/api-gateway/function/package.json @@ -0,0 +1,18 @@ +{ + "name": "function", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "engines": { + "node": ">=16.0.0" + }, + "dependencies": { + "@google-cloud/functions-framework": "^3.0.0", + "express": "^4.17.3" + } +} diff --git a/examples/serverless/api-gateway/main.tf b/examples/serverless/api-gateway/main.tf new file mode 100644 index 00000000..664ee990 --- /dev/null +++ b/examples/serverless/api-gateway/main.tf @@ -0,0 +1,145 @@ +/** + * Copyright 2022 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. + */ + +locals { + api_id_prefix = "api" + function_name_prefix = "cf-hello" + specs = { for region in var.regions : region => + templatefile("${path.module}/spec.yaml", { + api_id = "${local.api_id_prefix}-${region}" + function_name = "${local.function_name_prefix}-${region}" + region = region + project_id = var.project_id + }) + } + backends = [for region in var.regions : { + group = google_compute_region_network_endpoint_group.serverless-negs[region].id + options = null + } + ] +} + +module "project" { + source = "../../../modules/project" + billing_account = (var.project_create != null + ? var.project_create.billing_account_id + : null + ) + parent = (var.project_create != null + ? var.project_create.parent + : null + ) + name = var.project_id + services = [ + "apigateway.googleapis.com", + "cloudbuild.googleapis.com", + "cloudfunctions.googleapis.com", + "compute.googleapis.com", + "servicemanagement.googleapis.com", + "servicecontrol.googleapis.com" + ] + project_create = var.project_create != null +} + +module "sa" { + source = "../../../modules/iam-service-account" + project_id = module.project.project_id + name = "sa-api" +} + + +module "functions" { + for_each = toset(var.regions) + source = "../../../modules/cloud-function" + project_id = module.project.project_id + name = "${local.function_name_prefix}-${each.value}" + bucket_name = "bkt-${module.project.project_id}-${each.value}" + region = each.value + ingress_settings = "ALLOW_ALL" + bucket_config = { + location = null + lifecycle_delete_age = 1 + } + bundle_config = { + source_dir = "${path.module}/function" + output_path = "${path.module}/bundle.zip" + excludes = null + } + function_config = { + entry_point = "helloGET" + instances = null + memory = null + runtime = "nodejs16" + timeout = null + } + service_account_create = true + iam = { + "roles/cloudfunctions.invoker" = [module.sa.iam_email] + } +} + +module "gateways" { + for_each = toset(var.regions) + source = "../../../modules/api-gateway" + project_id = module.project.project_id + api_id = "${local.api_id_prefix}-${each.value}" + region = each.value + spec = local.specs[each.value] + service_account_email = module.sa.email +} + +module "glb" { + source = "../../../modules/net-glb" + name = "glb" + project_id = module.project.project_id + # This is important as serverless backends require no HCs + health_checks_config_defaults = null + reserve_ip_address = true + backend_services_config = { + serverless-backend = { + bucket_config = null + enable_cdn = false + cdn_config = null + group_config = { + backends = [for region in var.regions : { + group = google_compute_region_network_endpoint_group.serverless-negs[region].id + options = null + } + ], + health_checks = [] + log_config = null + options = null + } + } + } +} + +resource "google_compute_region_network_endpoint_group" "serverless-negs" { + for_each = toset(var.regions) + provider = google-beta + name = "serverless-neg-${module.gateways[each.value].gateway_id}" + project = module.project.project_id + network_endpoint_type = "SERVERLESS" + region = each.value + serverless_deployment { + platform = "apigateway.googleapis.com" + resource = module.gateways[each.value].gateway_id + url_mask = "" + } + lifecycle { + create_before_destroy = true + } +} diff --git a/examples/serverless/api-gateway/outputs.tf b/examples/serverless/api-gateway/outputs.tf new file mode 100644 index 00000000..9cc48f5b --- /dev/null +++ b/examples/serverless/api-gateway/outputs.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2022 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. + */ + +output "ip_address" { + description = "The reserved global IP address." + value = module.glb.ip_address +} diff --git a/examples/serverless/api-gateway/spec.yaml b/examples/serverless/api-gateway/spec.yaml new file mode 100644 index 00000000..605c1f27 --- /dev/null +++ b/examples/serverless/api-gateway/spec.yaml @@ -0,0 +1,35 @@ +# Copyright 2022 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. + +swagger: '2.0' +info: + title: ${api_id} Sample API + description: Sample API on API Gateway with a Google Cloud Functions backend + version: 1.0.0 +schemes: + - https +produces: + - application/json +paths: + /hello: + get: + summary: Greet a user + operationId: hello + x-google-backend: + address: https://${region}-${project_id}.cloudfunctions.net/${function_name} + responses: + '200': + description: A successful response + schema: + type: string \ No newline at end of file diff --git a/examples/serverless/api-gateway/variables.tf b/examples/serverless/api-gateway/variables.tf new file mode 100644 index 00000000..cba15113 --- /dev/null +++ b/examples/serverless/api-gateway/variables.tf @@ -0,0 +1,34 @@ +/** + * Copyright 2022 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. + */ + +variable "project_create" { + description = "Parameters for the creation of the new project." + type = object({ + billing_account_id = string + parent = string + }) + default = null +} + +variable "project_id" { + description = "Identifier of the project." + type = string +} + +variable "regions" { + description = "List of regions to deploy the proxy in." + type = list(string) +} diff --git a/modules/api-gateway/README.md b/modules/api-gateway/README.md new file mode 100644 index 00000000..b503f37e --- /dev/null +++ b/modules/api-gateway/README.md @@ -0,0 +1,89 @@ +# Api Gateway +This module allows creating an API with its associated API config and API gateway. It also allows you grant IAM roles on the created resources. + +# Examples + +## Basic example +```hcl +module "gateway" { + source = "./modules/api-gateway" + project_id = "my-project" + api_id = "api" + region = "europe-west1" + spec = < + +## Variables + +| name | description | type | required | default | +|---|---|:---:|:---:|:---:| +| [api_id](variables.tf#L17) | API identifier. | string | ✓ | | +| [project_id](variables.tf#L34) | Project identifier. | string | ✓ | | +| [region](variables.tf#L39) | Region | string | ✓ | | +| [spec](variables.tf#L56) | String with the contents of the OpenAPI spec. | string | ✓ | | +| [iam](variables.tf#L22) | IAM bindings for the API in {ROLE => [MEMBERS]} format. | map(list(string)) | | null | +| [labels](variables.tf#L28) | Map of labels. | map(string) | | null | +| [service_account_create](variables.tf#L44) | Flag indicating whether a service account needs to be created | bool | | false | +| [service_account_email](variables.tf#L50) | Service account for creating API configs | string | | null | + +## Outputs + +| name | description | sensitive | +|---|---|:---:| +| [api](outputs.tf#L17) | API. | | +| [api_config](outputs.tf#L28) | API configs. | | +| [api_config_id](outputs.tf#L39) | The identifiers of the API configs. | | +| [api_id](outputs.tf#L50) | API identifier. | | +| [default_hostname](outputs.tf#L61) | The default host names of the API gateway. | | +| [gateway](outputs.tf#L72) | API gateways. | | +| [gateway_id](outputs.tf#L83) | The identifiers of the API gateways. | | +| [service_account](outputs.tf#L94) | Service account resource. | | +| [service_account_email](outputs.tf#L99) | The service account for creating API configs. | | +| [service_account_iam_email](outputs.tf#L104) | The service account for creating API configs. | | + + diff --git a/modules/api-gateway/main.tf b/modules/api-gateway/main.tf new file mode 100644 index 00000000..ae52e47b --- /dev/null +++ b/modules/api-gateway/main.tf @@ -0,0 +1,115 @@ +/** + * Copyright 2022 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. + */ + +locals { + service_account_email = ( + var.service_account_create + ? ( + length(google_service_account.service_account) > 0 + ? google_service_account.service_account[0].email + : null + ) + : var.service_account_email + ) +} + +resource "google_api_gateway_api" "api" { + provider = google-beta + project = var.project_id + api_id = var.api_id + display_name = var.api_id + labels = var.labels +} + +resource "google_service_account" "service_account" { + count = var.service_account_create ? 1 : 0 + project = var.project_id + account_id = "sa-api-cfg-${google_api_gateway_api.api.api_id}" + display_name = "Service account to create API configs for ${google_api_gateway_api.api.api_id} API" +} + +resource "google_api_gateway_api_config" "api_config" { + provider = google-beta + project = google_api_gateway_api.api.project + api = google_api_gateway_api.api.api_id + api_config_id = "api-cfg-${google_api_gateway_api.api.api_id}-${md5(var.spec)}" + display_name = "api-cfg-${google_api_gateway_api.api.api_id}-${md5(var.spec)}" + openapi_documents { + document { + path = "spec.yaml" + contents = base64encode(var.spec) + } + } + dynamic "gateway_config" { + for_each = local.service_account_email == null ? [] : [""] + content { + backend_config { + google_service_account = local.service_account_email + } + } + } + lifecycle { + create_before_destroy = true + } +} + +resource "google_api_gateway_gateway" "gateway" { + provider = google-beta + project = google_api_gateway_api_config.api_config.project + api_config = google_api_gateway_api_config.api_config.id + gateway_id = "gw-${google_api_gateway_api.api.api_id}" + display_name = "gw-${google_api_gateway_api.api.api_id}" + region = var.region + lifecycle { + create_before_destroy = true + } +} + +resource "google_project_service" "service" { + project = google_api_gateway_gateway.gateway.project + service = google_api_gateway_api.api.managed_service + disable_on_destroy = true + disable_dependent_services = true +} + +resource "google_api_gateway_api_iam_binding" "api_iam_bindings" { + for_each = var.iam == null ? {} : var.iam + provider = google-beta + project = google_api_gateway_api.api.project + api = google_api_gateway_api.api.api_id + role = each.key + members = each.value +} + +resource "google_api_gateway_api_config_iam_binding" "api_config_iam_bindings" { + for_each = var.iam == null ? {} : var.iam + provider = google-beta + project = google_api_gateway_api_config.api_config.project + api = google_api_gateway_api.api.api_id + api_config = google_api_gateway_api_config.api_config.api_config_id + role = each.key + members = each.value +} + +resource "google_api_gateway_gateway_iam_binding" "gateway_iam_bindings" { + for_each = coalesce(var.iam, {}) + provider = google-beta + project = google_api_gateway_gateway.gateway.project + gateway = google_api_gateway_gateway.gateway.gateway_id + region = var.region + role = each.key + members = each.value +} diff --git a/modules/api-gateway/outputs.tf b/modules/api-gateway/outputs.tf new file mode 100644 index 00000000..863c3828 --- /dev/null +++ b/modules/api-gateway/outputs.tf @@ -0,0 +1,107 @@ +/** + * Copyright 2022 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. + */ + +output "api" { + description = "API." + value = google_api_gateway_api.api + depends_on = [ + google_project_service.service, + google_api_gateway_api_iam_binding.api_iam_bindings, + google_api_gateway_api_config_iam_binding.api_config_iam_bindings, + google_api_gateway_gateway_iam_binding.gateway_iam_bindings + ] +} + +output "api_config" { + description = "API configs." + value = google_api_gateway_api_config.api_config + depends_on = [ + google_project_service.service, + google_api_gateway_api_iam_binding.api_iam_bindings, + google_api_gateway_api_config_iam_binding.api_config_iam_bindings, + google_api_gateway_gateway_iam_binding.gateway_iam_bindings + ] +} + +output "api_config_id" { + description = "The identifiers of the API configs." + value = google_api_gateway_api_config.api_config.api_config_id + depends_on = [ + google_project_service.service, + google_api_gateway_api_iam_binding.api_iam_bindings, + google_api_gateway_api_config_iam_binding.api_config_iam_bindings, + google_api_gateway_gateway_iam_binding.gateway_iam_bindings + ] +} + +output "api_id" { + description = "API identifier." + value = google_api_gateway_api.api.api_id + depends_on = [ + google_project_service.service, + google_api_gateway_api_iam_binding.api_iam_bindings, + google_api_gateway_api_config_iam_binding.api_config_iam_bindings, + google_api_gateway_gateway_iam_binding.gateway_iam_bindings + ] +} + +output "default_hostname" { + description = "The default host names of the API gateway." + value = google_api_gateway_gateway.gateway.default_hostname + depends_on = [ + google_project_service.service, + google_api_gateway_api_iam_binding.api_iam_bindings, + google_api_gateway_api_config_iam_binding.api_config_iam_bindings, + google_api_gateway_gateway_iam_binding.gateway_iam_bindings + ] +} + +output "gateway" { + description = "API gateways." + value = google_api_gateway_gateway.gateway + depends_on = [ + google_project_service.service, + google_api_gateway_api_iam_binding.api_iam_bindings, + google_api_gateway_api_config_iam_binding.api_config_iam_bindings, + google_api_gateway_gateway_iam_binding.gateway_iam_bindings + ] +} + +output "gateway_id" { + description = "The identifiers of the API gateways." + value = google_api_gateway_gateway.gateway.gateway_id + depends_on = [ + google_project_service.service, + google_api_gateway_api_iam_binding.api_iam_bindings, + google_api_gateway_api_config_iam_binding.api_config_iam_bindings, + google_api_gateway_gateway_iam_binding.gateway_iam_bindings + ] +} + +output "service_account" { + description = "Service account resource." + value = try(google_service_account.service_account[0], null) +} + +output "service_account_email" { + description = "The service account for creating API configs." + value = local.service_account_email +} + +output "service_account_iam_email" { + description = "The service account for creating API configs." + value = local.service_account_email == null ? null : "serviceAccount:${local.service_account_email}" +} diff --git a/modules/api-gateway/variables.tf b/modules/api-gateway/variables.tf new file mode 100644 index 00000000..96259198 --- /dev/null +++ b/modules/api-gateway/variables.tf @@ -0,0 +1,59 @@ +/** + * Copyright 2022 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. + */ + +variable "api_id" { + description = "API identifier." + type = string +} + +variable "iam" { + description = "IAM bindings for the API in {ROLE => [MEMBERS]} format." + type = map(list(string)) + default = null +} + +variable "labels" { + description = "Map of labels." + type = map(string) + default = null +} + +variable "project_id" { + description = "Project identifier." + type = string +} + +variable "region" { + description = "Region" + type = string +} + +variable "service_account_create" { + description = "Flag indicating whether a service account needs to be created" + type = bool + default = false +} + +variable "service_account_email" { + description = "Service account for creating API configs" + type = string + default = null +} + +variable "spec" { + description = "String with the contents of the OpenAPI spec." + type = string +} diff --git a/modules/api-gateway/versions.tf b/modules/api-gateway/versions.tf new file mode 100644 index 00000000..039f8199 --- /dev/null +++ b/modules/api-gateway/versions.tf @@ -0,0 +1,29 @@ +/** + * Copyright 2022 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. + */ + +terraform { + required_version = ">= 1.0.0" + required_providers { + google = { + source = "hashicorp/google" + version = ">= 4.0.0" + } + google-beta = { + source = "hashicorp/google-beta" + version = ">= 4.0.0" + } + } +} \ No newline at end of file diff --git a/tests/examples/serverless/api_gateway/__init__.py b/tests/examples/serverless/api_gateway/__init__.py new file mode 100644 index 00000000..6d6d1266 --- /dev/null +++ b/tests/examples/serverless/api_gateway/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 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. diff --git a/tests/examples/serverless/api_gateway/fixture/main.tf b/tests/examples/serverless/api_gateway/fixture/main.tf new file mode 100644 index 00000000..b36e2fd4 --- /dev/null +++ b/tests/examples/serverless/api_gateway/fixture/main.tf @@ -0,0 +1,22 @@ +/** + * Copyright 2022 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. + */ + +module "test" { + source = "../../../../../examples/serverless/api-gateway" + project_create = var.project_create + project_id = var.project_id + regions = var.regions +} diff --git a/tests/examples/serverless/api_gateway/fixture/variables.tf b/tests/examples/serverless/api_gateway/fixture/variables.tf new file mode 100644 index 00000000..dce1579c --- /dev/null +++ b/tests/examples/serverless/api_gateway/fixture/variables.tf @@ -0,0 +1,39 @@ +/** + * Copyright 2022 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. + */ + +variable "project_create" { + type = object({ + billing_account_id = string + parent = string + }) + default = { + billing_account_id = "123456789" + parent = "organizations/123456789" + } +} + +variable "project_id" { + type = string + default = "project-1" +} + +variable "regions" { + type = list(string) + default = [ + "europe-west1", + "europe-west2" + ] +} diff --git a/tests/examples/serverless/api_gateway/test_plan.py b/tests/examples/serverless/api_gateway/test_plan.py new file mode 100644 index 00000000..6cf48a87 --- /dev/null +++ b/tests/examples/serverless/api_gateway/test_plan.py @@ -0,0 +1,19 @@ +# Copyright 2022 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. + +def test_resources(e2e_plan_runner): + "Test that plan works and the numbers of resources is as expected." + modules, resources = e2e_plan_runner() + assert len(modules) == 7 + assert len(resources) == 31 diff --git a/tests/modules/api_gateway/__init__.py b/tests/modules/api_gateway/__init__.py new file mode 100644 index 00000000..6d6d1266 --- /dev/null +++ b/tests/modules/api_gateway/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 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. diff --git a/tests/modules/api_gateway/fixture/main.tf b/tests/modules/api_gateway/fixture/main.tf new file mode 100644 index 00000000..d4cd134f --- /dev/null +++ b/tests/modules/api_gateway/fixture/main.tf @@ -0,0 +1,26 @@ +/** + * Copyright 2022 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. + */ + +module "gateway" { + source = "../../../../modules/api-gateway" + api_id = var.api_id + project_id = var.project_id + labels = var.labels + iam = var.iam + region = var.region + spec = var.spec + service_account_create = true +} diff --git a/tests/modules/api_gateway/fixture/variables.tf b/tests/modules/api_gateway/fixture/variables.tf new file mode 100644 index 00000000..977af921 --- /dev/null +++ b/tests/modules/api_gateway/fixture/variables.tf @@ -0,0 +1,55 @@ +/** + * Copyright 2022 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. + */ + +variable "api_id" { + type = string + default = "my-api" +} + +variable "iam" { + type = map(list(string)) + default = null +} + +variable "labels" { + type = map(string) + default = null +} + +variable "project_id" { + type = string + default = "my-project" +} + +variable "region" { + type = string + default = "europe-west1" +} + +variable "service_account_create" { + type = bool + default = true +} + +variable "service_account_email" { + type = string + default = null +} + +variable "spec" { + type = string + default = "Spec contents" +} diff --git a/tests/modules/api_gateway/test_plan.py b/tests/modules/api_gateway/test_plan.py new file mode 100644 index 00000000..0e94cdec --- /dev/null +++ b/tests/modules/api_gateway/test_plan.py @@ -0,0 +1,26 @@ +# Copyright 2022 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 pytest + + +@pytest.fixture +def resources(plan_runner): + _, resources = plan_runner() + return resources + + +def test_resource_count(resources): + "Test number of resources created." + assert len(resources) == 5