From 79c2d1579b3ada21a99a733e0fb875cba4e5d07e Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Wed, 16 Jun 2021 16:50:48 -0400 Subject: [PATCH 01/11] WIP: Image Builder start script --- scripts/app-stream/README.md | 14 + scripts/app-stream/package-lock.json | 677 ++++++++++++++++++++++ scripts/app-stream/package.json | 13 + scripts/app-stream/start-image-builder.js | 60 ++ 4 files changed, 764 insertions(+) create mode 100644 scripts/app-stream/README.md create mode 100644 scripts/app-stream/package-lock.json create mode 100644 scripts/app-stream/package.json create mode 100644 scripts/app-stream/start-image-builder.js diff --git a/scripts/app-stream/README.md b/scripts/app-stream/README.md new file mode 100644 index 0000000000..6a63eaf93b --- /dev/null +++ b/scripts/app-stream/README.md @@ -0,0 +1,14 @@ +# Overview + +This package allows you to initialize an AppStream Image Builder + + +# Development + +To pull in dependencies + +`npm install` + +To run the script to start an image builder + +`npm run start-image-builder -- ` \ No newline at end of file diff --git a/scripts/app-stream/package-lock.json b/scripts/app-stream/package-lock.json new file mode 100644 index 0000000000..2e178adce2 --- /dev/null +++ b/scripts/app-stream/package-lock.json @@ -0,0 +1,677 @@ +{ + "name": "app-stream-scripts", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@aws-sdk/client-appstream": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appstream/-/client-appstream-3.18.0.tgz", + "integrity": "sha512-DVdY2YrgDdDiUW5yqnrVqJ8vRGpXzDj/K1baAeICRBI6zBqEvzWwomVMgWQhxqJVDGPrq/2VCXGLB11o2RZxbA==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/client-sts": "3.18.0", + "@aws-sdk/config-resolver": "3.18.0", + "@aws-sdk/credential-provider-node": "3.18.0", + "@aws-sdk/fetch-http-handler": "3.18.0", + "@aws-sdk/hash-node": "3.18.0", + "@aws-sdk/invalid-dependency": "3.18.0", + "@aws-sdk/middleware-content-length": "3.18.0", + "@aws-sdk/middleware-host-header": "3.18.0", + "@aws-sdk/middleware-logger": "3.18.0", + "@aws-sdk/middleware-retry": "3.18.0", + "@aws-sdk/middleware-serde": "3.18.0", + "@aws-sdk/middleware-signing": "3.18.0", + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/middleware-user-agent": "3.18.0", + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/node-http-handler": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/smithy-client": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/url-parser": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "@aws-sdk/util-base64-node": "3.18.0", + "@aws-sdk/util-body-length-browser": "3.18.0", + "@aws-sdk/util-body-length-node": "3.18.0", + "@aws-sdk/util-user-agent-browser": "3.18.0", + "@aws-sdk/util-user-agent-node": "3.18.0", + "@aws-sdk/util-utf8-browser": "3.18.0", + "@aws-sdk/util-utf8-node": "3.18.0", + "@aws-sdk/util-waiter": "3.18.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", + "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.0.tgz", + "integrity": "sha512-VIpuLRDonMAHgomrsm/zKbeXTnxpr4aHDQmS4pF+NcpvBp64l675yjGA9hyUYs/QJwBjUl8WqMjh9tIRgi85Sg==", + "requires": { + "@aws-crypto/ie11-detection": "^1.0.0", + "@aws-crypto/sha256-js": "^1.1.0", + "@aws-crypto/supports-web-crypto": "^1.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", + "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.18.0.tgz", + "integrity": "sha512-AxDm2QLq2Z+PjzMESB+lPD5XL73MzC4CtUAajPn09ocWj7p9poVN0dd8NVFhBDfQMVPWTQaQBZk7h5TDvZrsBg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/client-sso": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.18.0.tgz", + "integrity": "sha512-OAS2R13NJ/mNnKxBc//Nva/+BmqaZZrzJ3pHsfGNUvzYE6rNj5iWHACD8LIV/Glf5Z3H52fbwfmYpwkMuvPuXQ==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.18.0", + "@aws-sdk/fetch-http-handler": "3.18.0", + "@aws-sdk/hash-node": "3.18.0", + "@aws-sdk/invalid-dependency": "3.18.0", + "@aws-sdk/middleware-content-length": "3.18.0", + "@aws-sdk/middleware-host-header": "3.18.0", + "@aws-sdk/middleware-logger": "3.18.0", + "@aws-sdk/middleware-retry": "3.18.0", + "@aws-sdk/middleware-serde": "3.18.0", + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/middleware-user-agent": "3.18.0", + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/node-http-handler": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/smithy-client": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/url-parser": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "@aws-sdk/util-base64-node": "3.18.0", + "@aws-sdk/util-body-length-browser": "3.18.0", + "@aws-sdk/util-body-length-node": "3.18.0", + "@aws-sdk/util-user-agent-browser": "3.18.0", + "@aws-sdk/util-user-agent-node": "3.18.0", + "@aws-sdk/util-utf8-browser": "3.18.0", + "@aws-sdk/util-utf8-node": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.18.0.tgz", + "integrity": "sha512-xRaBx3A4Edd216ZSZP4360siOx7yGiPY2Ez/w4JbdcwFRjoen8cP9kTgbipgMhbwHVUvgNZpyDrCp0eRHL24bg==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.18.0", + "@aws-sdk/credential-provider-node": "3.18.0", + "@aws-sdk/fetch-http-handler": "3.18.0", + "@aws-sdk/hash-node": "3.18.0", + "@aws-sdk/invalid-dependency": "3.18.0", + "@aws-sdk/middleware-content-length": "3.18.0", + "@aws-sdk/middleware-host-header": "3.18.0", + "@aws-sdk/middleware-logger": "3.18.0", + "@aws-sdk/middleware-retry": "3.18.0", + "@aws-sdk/middleware-sdk-sts": "3.18.0", + "@aws-sdk/middleware-serde": "3.18.0", + "@aws-sdk/middleware-signing": "3.18.0", + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/middleware-user-agent": "3.18.0", + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/node-http-handler": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/smithy-client": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/url-parser": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "@aws-sdk/util-base64-node": "3.18.0", + "@aws-sdk/util-body-length-browser": "3.18.0", + "@aws-sdk/util-body-length-node": "3.18.0", + "@aws-sdk/util-user-agent-browser": "3.18.0", + "@aws-sdk/util-user-agent-node": "3.18.0", + "@aws-sdk/util-utf8-browser": "3.18.0", + "@aws-sdk/util-utf8-node": "3.18.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.18.0.tgz", + "integrity": "sha512-2uSa/YccHckyYuY0OLDemgb+Jprif/NP+6OW+4eAjkwMGpZ3TtyGXoAZprBHqDXV12QxOYWjL6X6pyHvvsBAsQ==", + "requires": { + "@aws-sdk/signature-v4": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.18.0.tgz", + "integrity": "sha512-+PajLjjpXib9rseqC/r8hnlgq5mOloIaTLYZsdbEC9Afwo5VmYlemL5gAfH+ABxYeanbTvHaP7lUNS3pLrM7dA==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.18.0.tgz", + "integrity": "sha512-l/yDGjmZkkO0mSqatk7lOHKE6/EGplD5HHgAEY6pr5Y7C5a6ck7/mU7iNtmfq5HAv/YFsXHrewMGyXoE9iQBpg==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.18.0.tgz", + "integrity": "sha512-Hsef5NC4hPh4BDlin/Eik9S2icFZIvQjPGVL2z3OO30Xer0GHwIQNMAf0WTREQ+cCuXFrIyCwSsdxIo1n2yQnA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.18.0", + "@aws-sdk/credential-provider-imds": "3.18.0", + "@aws-sdk/credential-provider-web-identity": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.18.0.tgz", + "integrity": "sha512-iFwBl6w7mJAFo4YNVL960bkY6c4bUtABtbI+Wka8QbauGTGfAPMlET0JBesPNRAjkB7xzEtujPQL7pz4qlzeNQ==", + "requires": { + "@aws-sdk/credential-provider-env": "3.18.0", + "@aws-sdk/credential-provider-imds": "3.18.0", + "@aws-sdk/credential-provider-ini": "3.18.0", + "@aws-sdk/credential-provider-process": "3.18.0", + "@aws-sdk/credential-provider-sso": "3.18.0", + "@aws-sdk/credential-provider-web-identity": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.18.0.tgz", + "integrity": "sha512-0KwouUPsAALTqAlzy7HOddujjka3FmlNLe58bPPUk+2nqgg1qKGaNEtDTGCpusIaqLJm7ZbPJ0cJ8B+q/ytuwg==", + "requires": { + "@aws-sdk/credential-provider-ini": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.18.0.tgz", + "integrity": "sha512-EEHnWb/tFvFb9+a7dfChBdHmOZnqZeAbn6TOgc4LME4No9EG3XvkH48wxS0Mdhi9ziEGEdnNLQSVaIFzprWn8w==", + "requires": { + "@aws-sdk/client-sso": "3.18.0", + "@aws-sdk/credential-provider-ini": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.18.0.tgz", + "integrity": "sha512-s+F9hE5f2hcrVluEWpDMCSAWUntNQyzJexQKq5KYdJuHsm+oQbACJwWPcB63rbmpzWQht88tU6+YeMRq8P9HIA==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.18.0.tgz", + "integrity": "sha512-jJS34wJzv+5wumVpQ7fGOmTxkJlu1tmGkbCt13xuSjYpt2M/by+WAShxcxEhrsBJlMNMHTHF+v2Tew6JwEP00w==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/querystring-builder": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/hash-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.18.0.tgz", + "integrity": "sha512-rmjpJl4oG4JxHydnb9F3GzHu5wDJAQswgnBV0NszHfDndJm34f0Dta6OTmreK5nZ8ns/g6ZAjLjiTuKJoxjVmg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-buffer-from": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.18.0.tgz", + "integrity": "sha512-+VlXE8G22+H7d6K0EafpmihodOiF8I957J/euWIAGTSYYhLuAXPgCyPoKk1Qmxqfb3oAoG/cuoehCuPfFWwTPA==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.18.0.tgz", + "integrity": "sha512-HvPRgESVQt0UbzRQZVKhf8SpGGc5Jrln3AtTzkVu6PBHO04Dh2EHsrsxiu7X3oB453Mnp8+LYBVIgsmM/RyJzA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.18.0.tgz", + "integrity": "sha512-N1qTzkn+vNjMXBRybW9/S9WtCFiJp2B8agr+41zja4hnZVA07kClvI76jM6KUwQHADB2q79FWT+i6PeyCHHh1Q==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.18.0.tgz", + "integrity": "sha512-MPX9GJk3Wl3OjRJ3ti+ptkG+7dTpXGtEjIPF0MsCSlfTKH01lsNGDpSZpeUyhYFrvl3fXoMrPeJHUuFeXA3bIA==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.18.0.tgz", + "integrity": "sha512-GGiT4w8R7GOvlp4Q1w8JmBaBSsxNUL+ebEcs8ahJBrm9brYZG7tN8ncLXfF7d3oLd5XMoSbBkTn8+dQ973pkEQ==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.18.0.tgz", + "integrity": "sha512-PIvbtN05IftmbLACEdV6atNXJVuXNDkK5pcqKgggCteIKHz0QWnLUrgvi9wh2/HqDJD/XpY+ZmOEoZqUnwYSgg==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/service-error-classification": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.18.0.tgz", + "integrity": "sha512-FVowN386wlLBt7ND5ALbkgJl65ynzxYNBH351mcD2/VwgCx3PZqZSr8sLoVDyuB+X2n9/GAI+r3W++zQ8YOymQ==", + "requires": { + "@aws-sdk/middleware-signing": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/signature-v4": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.18.0.tgz", + "integrity": "sha512-46PtAvnGONN/v5OcNE4/3UywadCJunITwXDK/AGs6SMijkOPtoGMjP7fme9XlB6wg4QTSfeF3eKsieOF47RlPg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.18.0.tgz", + "integrity": "sha512-0DCwl1Hp66XVG3UUIvBhf7zy8pmeHFATInqRMF91Ch4mYJJdk/U0xLla+ouA2t6SjBkl2tb1bJLgjwkWnvR5Rg==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/signature-v4": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.18.0.tgz", + "integrity": "sha512-+FDsKMRq3Gsd6ddVt1P+7ltSiRRcEj6KpRccMHkFkFqWWqn9OcPh+Et076ivSBXCW8q9Ib4qJi04hiCD/md2EQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.18.0.tgz", + "integrity": "sha512-BGm+buvq0wHtIylYGmyLhuRUvb2MsKx2mBhEx9m5Vs4M8I8GnTgrWtblOzwqZ+Q7dl+GQCL0/tLYTw50BTeLGQ==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.18.0.tgz", + "integrity": "sha512-U+qqNIWivZK9bd1BJMwRyXcTHZAS9r4sgPMrjFyOutdLxBCrhU7QUUr0hFaHdrsVA7cU+D3bBhFxq6JxGmj8Hg==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.18.0.tgz", + "integrity": "sha512-87ZxGlq3dnlPjAIN0yhawiF+n3oQQihxYaSeysltsuz13X/beYTDyGTEBZXWKwB06O/XHbfBV6iYUR7XgMP20w==", + "requires": { + "@aws-sdk/abort-controller": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/querystring-builder": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/property-provider": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.18.0.tgz", + "integrity": "sha512-e7ADhSv8zAePAJLdXT0QItFPnA2ewOCDrD130E0NYA90AnW3xIyLB+J5HbwTWYUcF9Fbo0xSKh+0y8hBjNsT/w==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.18.0.tgz", + "integrity": "sha512-GIKvZBEnm87/mRaVYHnsQDYBSvU6qyKjyVdHDpQHhF+MZ+MKafygmpdBjsrRRstWr7h5WepnUVImYgvmaW6vyw==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.18.0.tgz", + "integrity": "sha512-1DrzflLp80RG674XfhZsl4jehIe0mdSPqXqMH6vOMDcmF/lLEsfwPs307G+Go3kwWXSUup52bcMmfi8Ef4xLBg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-uri-escape": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.18.0.tgz", + "integrity": "sha512-7pkgPCeTtsgcgBwYSK2QN9Kij88Adi4bKMBxCqpanloTng2KrZ3DfyyD7c0H70mt21Zqfwr2M1HrPSs1SZKBkw==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.18.0.tgz", + "integrity": "sha512-bgKy3fl1sIimpXUKqN9Mmb6tRtdtFQDYd/eX0LISSbdtJiVnMgiTxwTPEX72pN54L8zun3zU6xOuwoZP1Af6YA==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.18.0.tgz", + "integrity": "sha512-YpBCZWRvJhnPHbdFLzRvLIfx7Zxre8/5YsWrrNNBWRJ90z/6czzPdOn9jab/AVfLPpC/VSSubf4v4b8Cjeb4eA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.18.0.tgz", + "integrity": "sha512-md52+v+aIDfhwtaN+xIJ+7XgSqtRmreGkSCnJziGINRSnUSdycoR/ZJhT5d9TbMpYHdoT0Rm9RXNXImlfKCNGw==", + "requires": { + "@aws-sdk/is-array-buffer": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-hex-encoding": "3.18.0", + "@aws-sdk/util-uri-escape": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.18.0.tgz", + "integrity": "sha512-fIcfzrf2TnhB4W8UyqdPQ9fPAfIfuLQ0dO/Y9qwzsw0Bvj4qYYPcUaNI2raX7WN1G2KHa9wZdiceR0J+uQO7yg==", + "requires": { + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.18.0.tgz", + "integrity": "sha512-fyk6HXK1wk83n4fDvsG+ewV+yS4uegepeMNrmLr7iBKjzc/bLckTWk7GKFM5ZaF/9jWyk7o2eKW3C3BltgDrfQ==" + }, + "@aws-sdk/url-parser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.18.0.tgz", + "integrity": "sha512-ye3sSF8R6kp1r98MRNk9UDj6P0luQfSZ5N2EZjF8AUG0y4PTVc4L/PlSsH3/sMOjG831al+khNo+cZNO9wZeiQ==", + "requires": { + "@aws-sdk/querystring-parser": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-base64-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.18.0.tgz", + "integrity": "sha512-XG7ls/9utSgCGzD0hgnNAQWLWU9Nnc/IqjQCZ6td84Y1/kTBBafSN3RTPeQ3fLzJ063sTDOy/DPEh21IPZCF6A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-base64-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.18.0.tgz", + "integrity": "sha512-NzkHCynFU2wfqU/15IkI5H0ukafu//LSUTFp9w4MzFNYpfbXAjcAK4S53VQe46bvciRRk8pyHc4wixiYsxFbpA==", + "requires": { + "@aws-sdk/util-buffer-from": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.18.0.tgz", + "integrity": "sha512-+x0yrV9Z/gGGRVoWmx7t+skwG110vngkq5Clu7z+k/DtuZrkrspYKOVzidaH80pGJwJi+0JzxbIhA5JblBAf7Q==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.18.0.tgz", + "integrity": "sha512-r/m+TP9O1G8k9V51LvDCjkoc53Parn7BjP81cBplDrA6Uc2iezVRcjuXzRU+4X8EBIlUtCNhDYryl5xN8cohKw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.18.0.tgz", + "integrity": "sha512-4Pp4owEfjNdmqH9cByJnN0GbfM2II3I4FnRN5d9BysJ6mG+rLhc6WYxBgr4sEFtsJGYCgFzLU5MfUMx9OuDdPA==", + "requires": { + "@aws-sdk/is-array-buffer": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.18.0.tgz", + "integrity": "sha512-tayCN0+jLJRyM7W059ybwaEojjI4ylP4UyyG+LDc4m62PskmsCWTWOJzudjtx4d765e0I/F1w1ELrE+VhUdOpQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.18.0.tgz", + "integrity": "sha512-Lj2O9KaXCn+gPW23l3ydcSWe4HK0jH6teeSymbaFTwTjKtr4oLfDDKAOFoG5YyppQstEPqsL/RidVey4kOFfcg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.18.0.tgz", + "integrity": "sha512-Ui+uydvhzQALj/Q8sat4cVnCedwB/8iBPoMzcm1hr1r7ttWfmBKKElFZFl6ljCUtKaCE3rTb3JrZ2sKy9wT09A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.18.0.tgz", + "integrity": "sha512-qBfyQJqN3RFyeY6nr03RZQ6uT6t5BIdthqwSPZ99K2gvf75TdhPA3PJsaIZfluNHEPQrgrNd32OED8jnd+GXwA==", + "requires": { + "@aws-sdk/types": "3.18.0", + "bowser": "^2.11.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.18.0.tgz", + "integrity": "sha512-gSdWW3X0kLMvooo2vc0yqWClclGUqcBfRq0K2w6XhYaJRT4E07KmQa4nPdBMYD1g79xW+53AbdQNnGq8b/bmhA==", + "requires": { + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.18.0.tgz", + "integrity": "sha512-JwcdTb6AAMtnlt2Sg0I18DBK1sWlsfDR/23CkDQ52niXvCSRdHeNkh5b7SdEPVUKI76hyce9nEshzI1OasTv7w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.18.0.tgz", + "integrity": "sha512-yQtKkW5V6ycT6DlJkYgeMjj6HJc+jj50LUUx2ukW6IfRmCeAGWdUu82NgIzlzvlsqH1jvmQ/kaeqZ7ruOtmA6Q==", + "requires": { + "@aws-sdk/util-buffer-from": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-waiter": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.18.0.tgz", + "integrity": "sha512-ba67ZEn96RR7Nm0xXGtxD1ISWsG6ePpnOEi2p6hhP1/zJth70mCgxfMPHbxBmfQuadCtP3lhMGpRIptdAlXnDA==", + "requires": { + "@aws-sdk/abort-controller": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + } + } +} diff --git a/scripts/app-stream/package.json b/scripts/app-stream/package.json new file mode 100644 index 0000000000..3c0b318ca0 --- /dev/null +++ b/scripts/app-stream/package.json @@ -0,0 +1,13 @@ +{ + "name": "app-stream-scripts", + "version": "1.0.0", + "description": "Scripts for intializing AppStream", + "main": "index.js", + "license": "MIT", + "scripts": { + "start-image-builder": "node start-image-builder.js" + }, + "dependencies": { + "@aws-sdk/client-appstream": "^3.18.0" + } +} diff --git a/scripts/app-stream/start-image-builder.js b/scripts/app-stream/start-image-builder.js new file mode 100644 index 0000000000..970cba9bbd --- /dev/null +++ b/scripts/app-stream/start-image-builder.js @@ -0,0 +1,60 @@ + +const { AppStreamClient, DescribeImageBuildersCommand, CreateImageBuilderCommand } = require("@aws-sdk/client-appstream"); + +async function run() { + const profile = process.argv[2]; + const region = process.argv[3]; + console.log(`Starting Image Builder using AWS Profile ${profile} in region ${region}`); + + const client = new AppStreamClient({ region, profile}); + const imageBuilderName = `SWBImageBuilder-${Date.now()}`; + await createImageBuilder(client, imageBuilderName); + await waitForImageBuilderToBeReady(client, imageBuilderName); + + const imageBuilderUrl = `https://console.aws.amazon.com/appstream2/home?region=${region}#/images?bottomTab=details&topTab=image-builders` + + console.log(`You can find your new Image Builder at this address ${imageBuilderUrl}`) +} + +async function createImageBuilder(client, imageBuilderName) { + console.log(`Starting image builder with name ${imageBuilderName}`) + try { + await client.send( + new CreateImageBuilderCommand({ + InstanceType: 'stream.graphics.g4dn.xlarge', + Name: imageBuilderName, + ImageName: 'AppStream-Graphics-G4dn-WinServer2019-06-01-2021', + DisplayName: imageBuilderName, + VpcConfig: { + SubnetIds: [ + 'subnet-13f5b44c' + ] + }, + EnableDefaultInternetAccess: true + } + ) + ); + } catch (e) { + console.log("Failed to start image builder"); + throw e; + } +} + +async function waitForImageBuilderToBeReady(client, name) { + let imageInRunningState = false; + while (!imageInRunningState) { + await new Promise(r => setTimeout(r, 5000)); + const decribeImageBuilderResponse = await client.send(new DescribeImageBuildersCommand({ + Names: [ + name + ] + })); + const imageState = decribeImageBuilderResponse.ImageBuilders[0].State; + console.log(`Image Builder is in ${imageState} state`) + imageInRunningState = imageState === 'RUNNING'; + } +} +(async() => { + await run(); +})(); + From de18e7105732d1147caa0b685ae500bbf1f58b63 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Wed, 16 Jun 2021 17:24:21 -0400 Subject: [PATCH 02/11] Create script into a class --- scripts/app-stream/package-lock.json | 694 ++++++++++++++++++++++ scripts/app-stream/package.json | 3 +- scripts/app-stream/start-image-builder.js | 127 ++-- 3 files changed, 777 insertions(+), 47 deletions(-) diff --git a/scripts/app-stream/package-lock.json b/scripts/app-stream/package-lock.json index 2e178adce2..4ee2fca487 100644 --- a/scripts/app-stream/package-lock.json +++ b/scripts/app-stream/package-lock.json @@ -4,6 +4,83 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", + "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.0.tgz", + "integrity": "sha512-VIpuLRDonMAHgomrsm/zKbeXTnxpr4aHDQmS4pF+NcpvBp64l675yjGA9hyUYs/QJwBjUl8WqMjh9tIRgi85Sg==", + "requires": { + "@aws-crypto/ie11-detection": "^1.0.0", + "@aws-crypto/sha256-js": "^1.1.0", + "@aws-crypto/supports-web-crypto": "^1.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", + "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.18.0.tgz", + "integrity": "sha512-AxDm2QLq2Z+PjzMESB+lPD5XL73MzC4CtUAajPn09ocWj7p9poVN0dd8NVFhBDfQMVPWTQaQBZk7h5TDvZrsBg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, "@aws-sdk/client-appstream": { "version": "3.18.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-appstream/-/client-appstream-3.18.0.tgz", @@ -672,6 +749,623 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } + }, + "@aws-sdk/client-ec2": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.18.0.tgz", + "integrity": "sha512-IIZJiGGe2gMSTOOMACMWN3i+uYfUl4CwV2aqCguMRYQtBczH0hnAtGv3FUTTq4R2QZUgYwY6S/A/xi+6VQUU/A==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/client-sts": "3.18.0", + "@aws-sdk/config-resolver": "3.18.0", + "@aws-sdk/credential-provider-node": "3.18.0", + "@aws-sdk/fetch-http-handler": "3.18.0", + "@aws-sdk/hash-node": "3.18.0", + "@aws-sdk/invalid-dependency": "3.18.0", + "@aws-sdk/middleware-content-length": "3.18.0", + "@aws-sdk/middleware-host-header": "3.18.0", + "@aws-sdk/middleware-logger": "3.18.0", + "@aws-sdk/middleware-retry": "3.18.0", + "@aws-sdk/middleware-sdk-ec2": "3.18.0", + "@aws-sdk/middleware-serde": "3.18.0", + "@aws-sdk/middleware-signing": "3.18.0", + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/middleware-user-agent": "3.18.0", + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/node-http-handler": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/smithy-client": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/url-parser": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "@aws-sdk/util-base64-node": "3.18.0", + "@aws-sdk/util-body-length-browser": "3.18.0", + "@aws-sdk/util-body-length-node": "3.18.0", + "@aws-sdk/util-user-agent-browser": "3.18.0", + "@aws-sdk/util-user-agent-node": "3.18.0", + "@aws-sdk/util-utf8-browser": "3.18.0", + "@aws-sdk/util-utf8-node": "3.18.0", + "@aws-sdk/util-waiter": "3.18.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.0.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/client-sso": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.18.0.tgz", + "integrity": "sha512-OAS2R13NJ/mNnKxBc//Nva/+BmqaZZrzJ3pHsfGNUvzYE6rNj5iWHACD8LIV/Glf5Z3H52fbwfmYpwkMuvPuXQ==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.18.0", + "@aws-sdk/fetch-http-handler": "3.18.0", + "@aws-sdk/hash-node": "3.18.0", + "@aws-sdk/invalid-dependency": "3.18.0", + "@aws-sdk/middleware-content-length": "3.18.0", + "@aws-sdk/middleware-host-header": "3.18.0", + "@aws-sdk/middleware-logger": "3.18.0", + "@aws-sdk/middleware-retry": "3.18.0", + "@aws-sdk/middleware-serde": "3.18.0", + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/middleware-user-agent": "3.18.0", + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/node-http-handler": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/smithy-client": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/url-parser": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "@aws-sdk/util-base64-node": "3.18.0", + "@aws-sdk/util-body-length-browser": "3.18.0", + "@aws-sdk/util-body-length-node": "3.18.0", + "@aws-sdk/util-user-agent-browser": "3.18.0", + "@aws-sdk/util-user-agent-node": "3.18.0", + "@aws-sdk/util-utf8-browser": "3.18.0", + "@aws-sdk/util-utf8-node": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.18.0.tgz", + "integrity": "sha512-xRaBx3A4Edd216ZSZP4360siOx7yGiPY2Ez/w4JbdcwFRjoen8cP9kTgbipgMhbwHVUvgNZpyDrCp0eRHL24bg==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.18.0", + "@aws-sdk/credential-provider-node": "3.18.0", + "@aws-sdk/fetch-http-handler": "3.18.0", + "@aws-sdk/hash-node": "3.18.0", + "@aws-sdk/invalid-dependency": "3.18.0", + "@aws-sdk/middleware-content-length": "3.18.0", + "@aws-sdk/middleware-host-header": "3.18.0", + "@aws-sdk/middleware-logger": "3.18.0", + "@aws-sdk/middleware-retry": "3.18.0", + "@aws-sdk/middleware-sdk-sts": "3.18.0", + "@aws-sdk/middleware-serde": "3.18.0", + "@aws-sdk/middleware-signing": "3.18.0", + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/middleware-user-agent": "3.18.0", + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/node-http-handler": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/smithy-client": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/url-parser": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "@aws-sdk/util-base64-node": "3.18.0", + "@aws-sdk/util-body-length-browser": "3.18.0", + "@aws-sdk/util-body-length-node": "3.18.0", + "@aws-sdk/util-user-agent-browser": "3.18.0", + "@aws-sdk/util-user-agent-node": "3.18.0", + "@aws-sdk/util-utf8-browser": "3.18.0", + "@aws-sdk/util-utf8-node": "3.18.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.18.0.tgz", + "integrity": "sha512-2uSa/YccHckyYuY0OLDemgb+Jprif/NP+6OW+4eAjkwMGpZ3TtyGXoAZprBHqDXV12QxOYWjL6X6pyHvvsBAsQ==", + "requires": { + "@aws-sdk/signature-v4": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.18.0.tgz", + "integrity": "sha512-+PajLjjpXib9rseqC/r8hnlgq5mOloIaTLYZsdbEC9Afwo5VmYlemL5gAfH+ABxYeanbTvHaP7lUNS3pLrM7dA==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.18.0.tgz", + "integrity": "sha512-l/yDGjmZkkO0mSqatk7lOHKE6/EGplD5HHgAEY6pr5Y7C5a6ck7/mU7iNtmfq5HAv/YFsXHrewMGyXoE9iQBpg==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.18.0.tgz", + "integrity": "sha512-Hsef5NC4hPh4BDlin/Eik9S2icFZIvQjPGVL2z3OO30Xer0GHwIQNMAf0WTREQ+cCuXFrIyCwSsdxIo1n2yQnA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.18.0", + "@aws-sdk/credential-provider-imds": "3.18.0", + "@aws-sdk/credential-provider-web-identity": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.18.0.tgz", + "integrity": "sha512-iFwBl6w7mJAFo4YNVL960bkY6c4bUtABtbI+Wka8QbauGTGfAPMlET0JBesPNRAjkB7xzEtujPQL7pz4qlzeNQ==", + "requires": { + "@aws-sdk/credential-provider-env": "3.18.0", + "@aws-sdk/credential-provider-imds": "3.18.0", + "@aws-sdk/credential-provider-ini": "3.18.0", + "@aws-sdk/credential-provider-process": "3.18.0", + "@aws-sdk/credential-provider-sso": "3.18.0", + "@aws-sdk/credential-provider-web-identity": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.18.0.tgz", + "integrity": "sha512-0KwouUPsAALTqAlzy7HOddujjka3FmlNLe58bPPUk+2nqgg1qKGaNEtDTGCpusIaqLJm7ZbPJ0cJ8B+q/ytuwg==", + "requires": { + "@aws-sdk/credential-provider-ini": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.18.0.tgz", + "integrity": "sha512-EEHnWb/tFvFb9+a7dfChBdHmOZnqZeAbn6TOgc4LME4No9EG3XvkH48wxS0Mdhi9ziEGEdnNLQSVaIFzprWn8w==", + "requires": { + "@aws-sdk/client-sso": "3.18.0", + "@aws-sdk/credential-provider-ini": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.18.0.tgz", + "integrity": "sha512-s+F9hE5f2hcrVluEWpDMCSAWUntNQyzJexQKq5KYdJuHsm+oQbACJwWPcB63rbmpzWQht88tU6+YeMRq8P9HIA==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.18.0.tgz", + "integrity": "sha512-jJS34wJzv+5wumVpQ7fGOmTxkJlu1tmGkbCt13xuSjYpt2M/by+WAShxcxEhrsBJlMNMHTHF+v2Tew6JwEP00w==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/querystring-builder": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-base64-browser": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/hash-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.18.0.tgz", + "integrity": "sha512-rmjpJl4oG4JxHydnb9F3GzHu5wDJAQswgnBV0NszHfDndJm34f0Dta6OTmreK5nZ8ns/g6ZAjLjiTuKJoxjVmg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-buffer-from": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.18.0.tgz", + "integrity": "sha512-+VlXE8G22+H7d6K0EafpmihodOiF8I957J/euWIAGTSYYhLuAXPgCyPoKk1Qmxqfb3oAoG/cuoehCuPfFWwTPA==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.18.0.tgz", + "integrity": "sha512-HvPRgESVQt0UbzRQZVKhf8SpGGc5Jrln3AtTzkVu6PBHO04Dh2EHsrsxiu7X3oB453Mnp8+LYBVIgsmM/RyJzA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.18.0.tgz", + "integrity": "sha512-N1qTzkn+vNjMXBRybW9/S9WtCFiJp2B8agr+41zja4hnZVA07kClvI76jM6KUwQHADB2q79FWT+i6PeyCHHh1Q==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.18.0.tgz", + "integrity": "sha512-MPX9GJk3Wl3OjRJ3ti+ptkG+7dTpXGtEjIPF0MsCSlfTKH01lsNGDpSZpeUyhYFrvl3fXoMrPeJHUuFeXA3bIA==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.18.0.tgz", + "integrity": "sha512-GGiT4w8R7GOvlp4Q1w8JmBaBSsxNUL+ebEcs8ahJBrm9brYZG7tN8ncLXfF7d3oLd5XMoSbBkTn8+dQ973pkEQ==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.18.0.tgz", + "integrity": "sha512-PIvbtN05IftmbLACEdV6atNXJVuXNDkK5pcqKgggCteIKHz0QWnLUrgvi9wh2/HqDJD/XpY+ZmOEoZqUnwYSgg==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/service-error-classification": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-ec2": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.18.0.tgz", + "integrity": "sha512-xjCT7iHduOHle7sGLYVc5nhcL1XOUvcRfpwapIWZqJMVkqhODPMLRAuNMZihr4D+M5IAlITT4iBbebr6nO2Pog==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/signature-v4": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-format-url": "3.18.0", + "@aws-sdk/util-uri-escape": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.18.0.tgz", + "integrity": "sha512-FVowN386wlLBt7ND5ALbkgJl65ynzxYNBH351mcD2/VwgCx3PZqZSr8sLoVDyuB+X2n9/GAI+r3W++zQ8YOymQ==", + "requires": { + "@aws-sdk/middleware-signing": "3.18.0", + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/signature-v4": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.18.0.tgz", + "integrity": "sha512-46PtAvnGONN/v5OcNE4/3UywadCJunITwXDK/AGs6SMijkOPtoGMjP7fme9XlB6wg4QTSfeF3eKsieOF47RlPg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.18.0.tgz", + "integrity": "sha512-0DCwl1Hp66XVG3UUIvBhf7zy8pmeHFATInqRMF91Ch4mYJJdk/U0xLla+ouA2t6SjBkl2tb1bJLgjwkWnvR5Rg==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/signature-v4": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.18.0.tgz", + "integrity": "sha512-+FDsKMRq3Gsd6ddVt1P+7ltSiRRcEj6KpRccMHkFkFqWWqn9OcPh+Et076ivSBXCW8q9Ib4qJi04hiCD/md2EQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.18.0.tgz", + "integrity": "sha512-BGm+buvq0wHtIylYGmyLhuRUvb2MsKx2mBhEx9m5Vs4M8I8GnTgrWtblOzwqZ+Q7dl+GQCL0/tLYTw50BTeLGQ==", + "requires": { + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.18.0.tgz", + "integrity": "sha512-U+qqNIWivZK9bd1BJMwRyXcTHZAS9r4sgPMrjFyOutdLxBCrhU7QUUr0hFaHdrsVA7cU+D3bBhFxq6JxGmj8Hg==", + "requires": { + "@aws-sdk/property-provider": "3.18.0", + "@aws-sdk/shared-ini-file-loader": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.18.0.tgz", + "integrity": "sha512-87ZxGlq3dnlPjAIN0yhawiF+n3oQQihxYaSeysltsuz13X/beYTDyGTEBZXWKwB06O/XHbfBV6iYUR7XgMP20w==", + "requires": { + "@aws-sdk/abort-controller": "3.18.0", + "@aws-sdk/protocol-http": "3.18.0", + "@aws-sdk/querystring-builder": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/property-provider": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.18.0.tgz", + "integrity": "sha512-e7ADhSv8zAePAJLdXT0QItFPnA2ewOCDrD130E0NYA90AnW3xIyLB+J5HbwTWYUcF9Fbo0xSKh+0y8hBjNsT/w==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.18.0.tgz", + "integrity": "sha512-GIKvZBEnm87/mRaVYHnsQDYBSvU6qyKjyVdHDpQHhF+MZ+MKafygmpdBjsrRRstWr7h5WepnUVImYgvmaW6vyw==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.18.0.tgz", + "integrity": "sha512-1DrzflLp80RG674XfhZsl4jehIe0mdSPqXqMH6vOMDcmF/lLEsfwPs307G+Go3kwWXSUup52bcMmfi8Ef4xLBg==", + "requires": { + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-uri-escape": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.18.0.tgz", + "integrity": "sha512-7pkgPCeTtsgcgBwYSK2QN9Kij88Adi4bKMBxCqpanloTng2KrZ3DfyyD7c0H70mt21Zqfwr2M1HrPSs1SZKBkw==", + "requires": { + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.18.0.tgz", + "integrity": "sha512-bgKy3fl1sIimpXUKqN9Mmb6tRtdtFQDYd/eX0LISSbdtJiVnMgiTxwTPEX72pN54L8zun3zU6xOuwoZP1Af6YA==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.18.0.tgz", + "integrity": "sha512-YpBCZWRvJhnPHbdFLzRvLIfx7Zxre8/5YsWrrNNBWRJ90z/6czzPdOn9jab/AVfLPpC/VSSubf4v4b8Cjeb4eA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.18.0.tgz", + "integrity": "sha512-md52+v+aIDfhwtaN+xIJ+7XgSqtRmreGkSCnJziGINRSnUSdycoR/ZJhT5d9TbMpYHdoT0Rm9RXNXImlfKCNGw==", + "requires": { + "@aws-sdk/is-array-buffer": "3.18.0", + "@aws-sdk/types": "3.18.0", + "@aws-sdk/util-hex-encoding": "3.18.0", + "@aws-sdk/util-uri-escape": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.18.0.tgz", + "integrity": "sha512-fIcfzrf2TnhB4W8UyqdPQ9fPAfIfuLQ0dO/Y9qwzsw0Bvj4qYYPcUaNI2raX7WN1G2KHa9wZdiceR0J+uQO7yg==", + "requires": { + "@aws-sdk/middleware-stack": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.18.0.tgz", + "integrity": "sha512-fyk6HXK1wk83n4fDvsG+ewV+yS4uegepeMNrmLr7iBKjzc/bLckTWk7GKFM5ZaF/9jWyk7o2eKW3C3BltgDrfQ==" + }, + "@aws-sdk/url-parser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.18.0.tgz", + "integrity": "sha512-ye3sSF8R6kp1r98MRNk9UDj6P0luQfSZ5N2EZjF8AUG0y4PTVc4L/PlSsH3/sMOjG831al+khNo+cZNO9wZeiQ==", + "requires": { + "@aws-sdk/querystring-parser": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-base64-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.18.0.tgz", + "integrity": "sha512-XG7ls/9utSgCGzD0hgnNAQWLWU9Nnc/IqjQCZ6td84Y1/kTBBafSN3RTPeQ3fLzJ063sTDOy/DPEh21IPZCF6A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-base64-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.18.0.tgz", + "integrity": "sha512-NzkHCynFU2wfqU/15IkI5H0ukafu//LSUTFp9w4MzFNYpfbXAjcAK4S53VQe46bvciRRk8pyHc4wixiYsxFbpA==", + "requires": { + "@aws-sdk/util-buffer-from": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.18.0.tgz", + "integrity": "sha512-+x0yrV9Z/gGGRVoWmx7t+skwG110vngkq5Clu7z+k/DtuZrkrspYKOVzidaH80pGJwJi+0JzxbIhA5JblBAf7Q==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.18.0.tgz", + "integrity": "sha512-r/m+TP9O1G8k9V51LvDCjkoc53Parn7BjP81cBplDrA6Uc2iezVRcjuXzRU+4X8EBIlUtCNhDYryl5xN8cohKw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.18.0.tgz", + "integrity": "sha512-4Pp4owEfjNdmqH9cByJnN0GbfM2II3I4FnRN5d9BysJ6mG+rLhc6WYxBgr4sEFtsJGYCgFzLU5MfUMx9OuDdPA==", + "requires": { + "@aws-sdk/is-array-buffer": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-format-url": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.18.0.tgz", + "integrity": "sha512-I9O9f/afdOy2tjNDUrrG6Q7e1VBY3l8xXZiQBk5poSlVPlAN2tWVia3qeYFsKvrBKW6HacYEuYkR7AdGUKgY0w==", + "requires": { + "@aws-sdk/querystring-builder": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.18.0.tgz", + "integrity": "sha512-tayCN0+jLJRyM7W059ybwaEojjI4ylP4UyyG+LDc4m62PskmsCWTWOJzudjtx4d765e0I/F1w1ELrE+VhUdOpQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.18.0.tgz", + "integrity": "sha512-Lj2O9KaXCn+gPW23l3ydcSWe4HK0jH6teeSymbaFTwTjKtr4oLfDDKAOFoG5YyppQstEPqsL/RidVey4kOFfcg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.18.0.tgz", + "integrity": "sha512-Ui+uydvhzQALj/Q8sat4cVnCedwB/8iBPoMzcm1hr1r7ttWfmBKKElFZFl6ljCUtKaCE3rTb3JrZ2sKy9wT09A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.18.0.tgz", + "integrity": "sha512-qBfyQJqN3RFyeY6nr03RZQ6uT6t5BIdthqwSPZ99K2gvf75TdhPA3PJsaIZfluNHEPQrgrNd32OED8jnd+GXwA==", + "requires": { + "@aws-sdk/types": "3.18.0", + "bowser": "^2.11.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.18.0.tgz", + "integrity": "sha512-gSdWW3X0kLMvooo2vc0yqWClclGUqcBfRq0K2w6XhYaJRT4E07KmQa4nPdBMYD1g79xW+53AbdQNnGq8b/bmhA==", + "requires": { + "@aws-sdk/node-config-provider": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.18.0.tgz", + "integrity": "sha512-JwcdTb6AAMtnlt2Sg0I18DBK1sWlsfDR/23CkDQ52niXvCSRdHeNkh5b7SdEPVUKI76hyce9nEshzI1OasTv7w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.18.0.tgz", + "integrity": "sha512-yQtKkW5V6ycT6DlJkYgeMjj6HJc+jj50LUUx2ukW6IfRmCeAGWdUu82NgIzlzvlsqH1jvmQ/kaeqZ7ruOtmA6Q==", + "requires": { + "@aws-sdk/util-buffer-from": "3.18.0", + "tslib": "^2.0.0" + } + }, + "@aws-sdk/util-waiter": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.18.0.tgz", + "integrity": "sha512-ba67ZEn96RR7Nm0xXGtxD1ISWsG6ePpnOEi2p6hhP1/zJth70mCgxfMPHbxBmfQuadCtP3lhMGpRIptdAlXnDA==", + "requires": { + "@aws-sdk/abort-controller": "3.18.0", + "@aws-sdk/types": "3.18.0", + "tslib": "^2.0.0" + } + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } } diff --git a/scripts/app-stream/package.json b/scripts/app-stream/package.json index 3c0b318ca0..5b4fd60943 100644 --- a/scripts/app-stream/package.json +++ b/scripts/app-stream/package.json @@ -8,6 +8,7 @@ "start-image-builder": "node start-image-builder.js" }, "dependencies": { - "@aws-sdk/client-appstream": "^3.18.0" + "@aws-sdk/client-appstream": "^3.18.0", + "@aws-sdk/client-ec2": "^3.18.0" } } diff --git a/scripts/app-stream/start-image-builder.js b/scripts/app-stream/start-image-builder.js index 970cba9bbd..06fcbb5708 100644 --- a/scripts/app-stream/start-image-builder.js +++ b/scripts/app-stream/start-image-builder.js @@ -1,60 +1,95 @@ const { AppStreamClient, DescribeImageBuildersCommand, CreateImageBuilderCommand } = require("@aws-sdk/client-appstream"); +const { DescribeVpcsCommand, EC2Client, DescribeSubnetsCommand} = require("@aws-sdk/client-ec2"); -async function run() { - const profile = process.argv[2]; - const region = process.argv[3]; - console.log(`Starting Image Builder using AWS Profile ${profile} in region ${region}`); +class StartImageBuilder { + constructor(profile, region) { + console.log(`Starting Image Builder using AWS Profile ${profile} in region ${region}`); + this.appStreamClient = new AppStreamClient({ region, profile}); + this.ec2Client = new EC2Client({region, profile}); + this.imageBuilderName = `SWBImageBuilder-${Date.now()}`; + } - const client = new AppStreamClient({ region, profile}); - const imageBuilderName = `SWBImageBuilder-${Date.now()}`; - await createImageBuilder(client, imageBuilderName); - await waitForImageBuilderToBeReady(client, imageBuilderName); + async run() { + try { + await this.createImageBuilder(); + await this.waitForImageBuilderToBeReady(); - const imageBuilderUrl = `https://console.aws.amazon.com/appstream2/home?region=${region}#/images?bottomTab=details&topTab=image-builders` + const imageBuilderUrl = `https://console.aws.amazon.com/appstream2/home?region=${region}#/images?bottomTab=details&topTab=image-builders` - console.log(`You can find your new Image Builder at this address ${imageBuilderUrl}`) -} + console.log(`You can find your new Image Builder at this address ${imageBuilderUrl}`) + } catch (e) { + process.exit(1); + } + } -async function createImageBuilder(client, imageBuilderName) { - console.log(`Starting image builder with name ${imageBuilderName}`) - try { - await client.send( - new CreateImageBuilderCommand({ - InstanceType: 'stream.graphics.g4dn.xlarge', - Name: imageBuilderName, - ImageName: 'AppStream-Graphics-G4dn-WinServer2019-06-01-2021', - DisplayName: imageBuilderName, - VpcConfig: { - SubnetIds: [ - 'subnet-13f5b44c' + async createImageBuilder() { + console.log(`Starting image builder with name ${this.imageBuilderName}`) + try { + const vpcsResponse = await this.ec2Client.send( + new DescribeVpcsCommand({ + Filters: [{ + Name: 'isDefault', + Values: [true] + }] + }) + ); + const vpcId = vpcsResponse.Vpcs[0].VpcId; + const subnetsResponse = await this.ec2Client.send( + new DescribeSubnetsCommand({ + Filters: [ + { + Name: 'vpc-id', + Values: [vpcId] + } ] - }, - EnableDefaultInternetAccess: true - } + }) ) - ); - } catch (e) { - console.log("Failed to start image builder"); - throw e; + + const subnetId = subnetsResponse.Subnets[0].SubnetId; + + await this.appStreamClient.send( + new CreateImageBuilderCommand({ + InstanceType: 'stream.graphics.g4dn.xlarge', + Name: this.imageBuilderName, + ImageName: 'AppStream-Graphics-G4dn-WinServer2019-06-01-2021', + DisplayName: this.imageBuilderName, + VpcConfig: { + SubnetIds: [ + subnetId + ] + }, + EnableDefaultInternetAccess: true + } + ) + ); + } catch (e) { + console.error("Failed to start image builder", e); + throw e; + } } -} -async function waitForImageBuilderToBeReady(client, name) { - let imageInRunningState = false; - while (!imageInRunningState) { - await new Promise(r => setTimeout(r, 5000)); - const decribeImageBuilderResponse = await client.send(new DescribeImageBuildersCommand({ - Names: [ - name - ] - })); - const imageState = decribeImageBuilderResponse.ImageBuilders[0].State; - console.log(`Image Builder is in ${imageState} state`) - imageInRunningState = imageState === 'RUNNING'; + async waitForImageBuilderToBeReady() { + try { + let imageInRunningState = false; + while (!imageInRunningState) { + await new Promise(r => setTimeout(r, 5000)); + const decribeImageBuilderResponse = await this.appStreamClient.send(new DescribeImageBuildersCommand({ + Names: [ + this.imageBuilderName + ] + })); + const imageState = decribeImageBuilderResponse.ImageBuilders[0].State; + console.log(`Image Builder is in ${imageState} state`) + imageInRunningState = imageState === 'RUNNING'; + } + } catch (e) { + console.error("Failed to check for Image Builder status", e); + throw e; + } } + } -(async() => { - await run(); -})(); +const startImageBuilder = new StartImageBuilder(process.argv[2], process.argv[3]); +startImageBuilder.run(); From 20cbd29d29fb2d7e0b6d19897bbed2b5d1822ecc Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Thu, 17 Jun 2021 10:36:36 -0400 Subject: [PATCH 03/11] Add buildImage.ps1 script for ImageBuilder --- scripts/app-stream/buildImage.ps1 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 scripts/app-stream/buildImage.ps1 diff --git a/scripts/app-stream/buildImage.ps1 b/scripts/app-stream/buildImage.ps1 new file mode 100644 index 0000000000..89cb0a5d4a --- /dev/null +++ b/scripts/app-stream/buildImage.ps1 @@ -0,0 +1,20 @@ +# Install Putty using Chocolatey +Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) + +choco install -y putty.install + +# Add Applications + +cd "C:\Program Files\Amazon\Photon\ConsoleImageBuilder" + +.\image-assistant.exe add-application --absolute-app-path "C:\Program Files\PuTTY\putty.exe" --display-name Putty --name Putty + +.\image-assistant.exe add-application --absolute-app-path "C:\Program Files\PuTTY\puttygen.exe" --display-name PuttyGen --name PuttyGen + +.\image-assistant.exe add-application --absolute-app-path "C:\Windows\System32\notepad.exe" --display-name Notepad --name Notepad + +.\image-assistant.exe add-application --absolute-app-path "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" --display-name Firefox --name Firefox + +# Create App +$ImageName="FirefoxPuttyNotepad_" + $(Get-Date -Format "MM-dd-yyyy-hh-mm-ss") +.\image-assistant.exe create-image --name $ImageName \ No newline at end of file From 4db7ff66f8f316dba9759da6261d45268d391e7f Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Thu, 17 Jun 2021 15:04:27 -0400 Subject: [PATCH 04/11] Add SETUP.md --- scripts/app-stream/SETUP.md | 33 +++++++++++++++++++++++ scripts/app-stream/start-image-builder.js | 4 ++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 scripts/app-stream/SETUP.md diff --git a/scripts/app-stream/SETUP.md b/scripts/app-stream/SETUP.md new file mode 100644 index 0000000000..15fa411b0a --- /dev/null +++ b/scripts/app-stream/SETUP.md @@ -0,0 +1,33 @@ +# Overview + +This following guide will show you how to set up an AppStream image with three applications installed: Firefox, Notepad, and Putty. + +### High Level Overview +1. We launch an AppStream Image Builder instance. +2. We log into the AppStream Image builder instance and run a script to build an image with Firefox, Putty, PuttyGen, and Notepad. + + +### Launching an AppStream Image Builder instance +1. Navigate to `scripts/app-stream` directory +2. Run the following commands +``` +npm install +npm run start-image-builder -- +``` +Note: Please set up your [AWS Profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) beforehand so that you have permission to launch an AppStream image builder instance in your AWS Account. +3. Once the Image Builder is launched and ready, click on the URL provided on the terminal console to be taken to the AWS Console. + +### Building AppStream Image +![Image Builder Screenshot](./screenshots/ImageBuilderSelector.png) +1. On the AppStream page in AWS console, select the AppStream image that was built in the previous step and click Connect. +2. This will open a new tab in your browser. When the prompt ask for which user you would like to log in as, choose Administrator. This will take you to a Windows desktop that you can interact with to create your AppStream image. +3. On the Windows desktop, click the `Start` button and type in `Windows Powershell`. Right click the application in the search result, and choose `Run as administrator` +4. Run the following commands +``` +# Pull the Image Builder script from Github +Invoke-WebRequest -Uri https://raw.githubusercontent.com/awslabs/service-workbench-on-aws/image-builder-scripts/scripts/app-stream/buildImage.ps1 -OutFile buildImage.ps1 + +# Execute Image builder script +.\buildImage.ps1 +``` +5. At this point the Image builder will build your image and you'll see a "Failed to reserve a session" modal. This is expected. Log back into AppStream on the AWS Console and wait till the AppStream image is built. \ No newline at end of file diff --git a/scripts/app-stream/start-image-builder.js b/scripts/app-stream/start-image-builder.js index 06fcbb5708..0ed77a22b9 100644 --- a/scripts/app-stream/start-image-builder.js +++ b/scripts/app-stream/start-image-builder.js @@ -6,6 +6,7 @@ class StartImageBuilder { constructor(profile, region) { console.log(`Starting Image Builder using AWS Profile ${profile} in region ${region}`); this.appStreamClient = new AppStreamClient({ region, profile}); + this.region = region; this.ec2Client = new EC2Client({region, profile}); this.imageBuilderName = `SWBImageBuilder-${Date.now()}`; } @@ -15,7 +16,7 @@ class StartImageBuilder { await this.createImageBuilder(); await this.waitForImageBuilderToBeReady(); - const imageBuilderUrl = `https://console.aws.amazon.com/appstream2/home?region=${region}#/images?bottomTab=details&topTab=image-builders` + const imageBuilderUrl = `https://console.aws.amazon.com/appstream2/home?region=${this.region}#/images?bottomTab=details&topTab=image-builders` console.log(`You can find your new Image Builder at this address ${imageBuilderUrl}`) } catch (e) { @@ -71,6 +72,7 @@ class StartImageBuilder { async waitForImageBuilderToBeReady() { try { + console.log("Waiting for Image Builder to be in RUNNNING state. This can take 5 to 10 minutes"); let imageInRunningState = false; while (!imageInRunningState) { await new Promise(r => setTimeout(r, 5000)); From c734c6e1a147d97a5a03f4d4d9dd8e14fede03cf Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Thu, 17 Jun 2021 15:04:40 -0400 Subject: [PATCH 05/11] Add screenshots --- .../screenshots/ImageBuilderSelector.png | Bin 0 -> 132076 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 scripts/app-stream/screenshots/ImageBuilderSelector.png diff --git a/scripts/app-stream/screenshots/ImageBuilderSelector.png b/scripts/app-stream/screenshots/ImageBuilderSelector.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5ea1167cb31195b8093f207d13462a992ba173 GIT binary patch literal 132076 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

Tu1BL+-T(DlbU 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 Date: Thu, 17 Jun 2021 15:23:35 -0400 Subject: [PATCH 06/11] Update Setyp.md --- scripts/app-stream/SETUP.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/app-stream/SETUP.md b/scripts/app-stream/SETUP.md index 15fa411b0a..1f1597cef7 100644 --- a/scripts/app-stream/SETUP.md +++ b/scripts/app-stream/SETUP.md @@ -1,10 +1,10 @@ # Overview -This following guide will show you how to set up an AppStream image with three applications installed: Firefox, Notepad, and Putty. +This following guide will show you how to set up an AppStream image with the following applications installed: Firefox, Notepad, PuttyGen, and Putty. ### High Level Overview 1. We launch an AppStream Image Builder instance. -2. We log into the AppStream Image builder instance and run a script to build an image with Firefox, Putty, PuttyGen, and Notepad. +2. We log into the AppStream Image builder instance and run a script to build an image with Firefox, PuttyGen, Putty, and Notepad. ### Launching an AppStream Image Builder instance @@ -15,12 +15,12 @@ npm install npm run start-image-builder -- ``` Note: Please set up your [AWS Profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) beforehand so that you have permission to launch an AppStream image builder instance in your AWS Account. -3. Once the Image Builder is launched and ready, click on the URL provided on the terminal console to be taken to the AWS Console. +3. Once the Image Builder is launched and ready, click on the URL provided in the terminal console. This will take you to the AppStream page on the AWS Console. ### Building AppStream Image ![Image Builder Screenshot](./screenshots/ImageBuilderSelector.png) 1. On the AppStream page in AWS console, select the AppStream image that was built in the previous step and click Connect. -2. This will open a new tab in your browser. When the prompt ask for which user you would like to log in as, choose Administrator. This will take you to a Windows desktop that you can interact with to create your AppStream image. +2. This will open a new tab in your browser. When the prompt ask for which user you would like to log in as, choose Administrator. This will take you to a Windows Desktop that you can interact with to create your AppStream image. 3. On the Windows desktop, click the `Start` button and type in `Windows Powershell`. Right click the application in the search result, and choose `Run as administrator` 4. Run the following commands ``` From c7f35148e091ebce781308191581eb70bfece1b8 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Fri, 18 Jun 2021 11:29:44 -0400 Subject: [PATCH 07/11] Update SETUP.md and image builder script --- scripts/app-stream/README.md | 8 +----- scripts/app-stream/SETUP.md | 7 ++++- scripts/app-stream/start-image-builder.js | 34 ++++++++++++++++------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/scripts/app-stream/README.md b/scripts/app-stream/README.md index 6a63eaf93b..2e4926aa9f 100644 --- a/scripts/app-stream/README.md +++ b/scripts/app-stream/README.md @@ -5,10 +5,4 @@ This package allows you to initialize an AppStream Image Builder # Development -To pull in dependencies - -`npm install` - -To run the script to start an image builder - -`npm run start-image-builder -- ` \ No newline at end of file +Please refer [here](./SETUP.md#Launching an AppStream Image Builder instance) \ No newline at end of file diff --git a/scripts/app-stream/SETUP.md b/scripts/app-stream/SETUP.md index 1f1597cef7..053e8f916d 100644 --- a/scripts/app-stream/SETUP.md +++ b/scripts/app-stream/SETUP.md @@ -12,7 +12,9 @@ This following guide will show you how to set up an AppStream image with the fol 2. Run the following commands ``` npm install -npm run start-image-builder -- +npm run start-image-builder -- +# Example: npm run start-image-builder -- default us-east-1 AppStream-WinServer2019-06-01-2021 stream.standard.medium +# If preferred you can choose the default base image name and instance size by running this command: npm run start-image-builder -- default us-east-1 default default ``` Note: Please set up your [AWS Profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) beforehand so that you have permission to launch an AppStream image builder instance in your AWS Account. 3. Once the Image Builder is launched and ready, click on the URL provided in the terminal console. This will take you to the AppStream page on the AWS Console. @@ -24,10 +26,13 @@ Note: Please set up your [AWS Profile](https://docs.aws.amazon.com/cli/latest/us 3. On the Windows desktop, click the `Start` button and type in `Windows Powershell`. Right click the application in the search result, and choose `Run as administrator` 4. Run the following commands ``` +cd ~\Documents + # Pull the Image Builder script from Github Invoke-WebRequest -Uri https://raw.githubusercontent.com/awslabs/service-workbench-on-aws/image-builder-scripts/scripts/app-stream/buildImage.ps1 -OutFile buildImage.ps1 # Execute Image builder script .\buildImage.ps1 ``` + 5. At this point the Image builder will build your image and you'll see a "Failed to reserve a session" modal. This is expected. Log back into AppStream on the AWS Console and wait till the AppStream image is built. \ No newline at end of file diff --git a/scripts/app-stream/start-image-builder.js b/scripts/app-stream/start-image-builder.js index 0ed77a22b9..3375183bec 100644 --- a/scripts/app-stream/start-image-builder.js +++ b/scripts/app-stream/start-image-builder.js @@ -2,13 +2,20 @@ const { AppStreamClient, DescribeImageBuildersCommand, CreateImageBuilderCommand } = require("@aws-sdk/client-appstream"); const { DescribeVpcsCommand, EC2Client, DescribeSubnetsCommand} = require("@aws-sdk/client-ec2"); + class StartImageBuilder { - constructor(profile, region) { - console.log(`Starting Image Builder using AWS Profile ${profile} in region ${region}`); + constructor(profile, region, imageName, imageSize) { + if (!profile || !region || !imageName || !imageSize) { + console.log('Please provide a value for AWS Profile, region, image name, and image size'); + process.exit(1); + } this.appStreamClient = new AppStreamClient({ region, profile}); this.region = region; this.ec2Client = new EC2Client({region, profile}); this.imageBuilderName = `SWBImageBuilder-${Date.now()}`; + this.imageName = imageName === 'default' ? 'AppStream-WinServer2019-06-01-2021' : imageName; + this.imageSize = imageSize === 'default' ? 'stream.standard.medium' : imageSize; + console.log(`Starting Image Builder using AWS Profile ${profile} in region ${region} with base image ${this.imageName} and instance type ${this.imageSize}`); } async run() { @@ -49,11 +56,12 @@ class StartImageBuilder { const subnetId = subnetsResponse.Subnets[0].SubnetId; + await this.appStreamClient.send( new CreateImageBuilderCommand({ - InstanceType: 'stream.graphics.g4dn.xlarge', + InstanceType: this.imageSize, Name: this.imageBuilderName, - ImageName: 'AppStream-Graphics-G4dn-WinServer2019-06-01-2021', + ImageName: this.imageName, DisplayName: this.imageBuilderName, VpcConfig: { SubnetIds: [ @@ -72,18 +80,24 @@ class StartImageBuilder { async waitForImageBuilderToBeReady() { try { - console.log("Waiting for Image Builder to be in RUNNNING state. This can take 5 to 10 minutes"); - let imageInRunningState = false; - while (!imageInRunningState) { + console.log("Waiting for Image Builder to finish starting up. This can take 5 to 10 minutes"); + let imageInPendingState = true; + let imageState = ""; + while (imageInPendingState) { await new Promise(r => setTimeout(r, 5000)); const decribeImageBuilderResponse = await this.appStreamClient.send(new DescribeImageBuildersCommand({ Names: [ this.imageBuilderName ] })); - const imageState = decribeImageBuilderResponse.ImageBuilders[0].State; + imageState = decribeImageBuilderResponse.ImageBuilders[0].State; console.log(`Image Builder is in ${imageState} state`) - imageInRunningState = imageState === 'RUNNING'; + imageInPendingState = imageState === 'PENDING'; + } + if (imageState !== 'RUNNING') { + console.log(`Image Builder ${this.imageBuilderName} failed to transition to RUNNING state. Image Builder is in ${imageState} state`) + } else { + console.log(`Image Builder ${this.imageBuilderName} is now in RUNNING state`); } } catch (e) { console.error("Failed to check for Image Builder status", e); @@ -93,5 +107,5 @@ class StartImageBuilder { } -const startImageBuilder = new StartImageBuilder(process.argv[2], process.argv[3]); +const startImageBuilder = new StartImageBuilder(process.argv[2], process.argv[3], process.argv[4], process.argv[5]); startImageBuilder.run(); From 833eed60ccf735d300496ccb995d09d60e9c04d5 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Fri, 18 Jun 2021 12:56:08 -0400 Subject: [PATCH 08/11] Add start-image-builder.test.js --- scripts/app-stream/README.md | 2 +- scripts/app-stream/package-lock.json | 3168 ++++++++++++++++- scripts/app-stream/package.json | 7 +- scripts/app-stream/start-image-builder.js | 14 +- .../app-stream/start-image-builder.test.js | 71 + 5 files changed, 3250 insertions(+), 12 deletions(-) create mode 100644 scripts/app-stream/start-image-builder.test.js diff --git a/scripts/app-stream/README.md b/scripts/app-stream/README.md index 2e4926aa9f..75117bf96b 100644 --- a/scripts/app-stream/README.md +++ b/scripts/app-stream/README.md @@ -5,4 +5,4 @@ This package allows you to initialize an AppStream Image Builder # Development -Please refer [here](./SETUP.md#Launching an AppStream Image Builder instance) \ No newline at end of file +Please refer [here](./SETUP.md##launching-an-appstream-image-builder-instance) \ No newline at end of file diff --git a/scripts/app-stream/package-lock.json b/scripts/app-stream/package-lock.json index 4ee2fca487..a5551bb8db 100644 --- a/scripts/app-stream/package-lock.json +++ b/scripts/app-stream/package-lock.json @@ -1342,30 +1342,3184 @@ "tslib": "^2.0.0" } }, + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz", + "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==", + "dev": true + }, + "@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz", + "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "dev": true, + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", + "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", + "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.2.tgz", + "integrity": "sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.2", + "jest-util": "^27.0.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.4.tgz", + "integrity": "sha512-+dsmV8VUs1h/Szb+rEWk8xBM1fp1I///uFy9nk3wXGvRsF2lBp8EVPmtWc+QFRb3MY2b7u2HbkGF1fzoDzQTLA==", + "dev": true, + "requires": { + "@jest/console": "^27.0.2", + "@jest/reporters": "^27.0.4", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.2", + "jest-config": "^27.0.4", + "jest-haste-map": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-resolve-dependencies": "^27.0.4", + "jest-runner": "^27.0.4", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "jest-watcher": "^27.0.2", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.3.tgz", + "integrity": "sha512-pN9m7fbKsop5vc3FOfH8NF7CKKdRbEZzcxfIo1n2TT6ucKWLFq0P6gCJH0GpnQp036++yY9utHOxpeT1WnkWTA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", + "@types/node": "*", + "jest-mock": "^27.0.3" + } + }, + "@jest/fake-timers": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.3.tgz", + "integrity": "sha512-fQ+UCKRIYKvTCEOyKPnaPnomLATIhMnHC/xPZ7yT1Uldp7yMgMxoYIFidDbpSTgB79+/U+FgfoD30c6wg3IUjA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.2", + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2" + } + }, + "@jest/globals": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.3.tgz", + "integrity": "sha512-OzsIuf7uf+QalqAGbjClyezzEcLQkdZ+7PejUrZgDs+okdAK8GwRCGcYCirHvhMBBQh60Jr3NlIGbn/KBPQLEQ==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.3", + "@jest/types": "^27.0.2", + "expect": "^27.0.2" + } + }, + "@jest/reporters": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.4.tgz", + "integrity": "sha512-Xa90Nm3JnV0xCe4M6A10M9WuN9krb+WFKxV1A98Y4ePCw40n++r7uxFUNU7DT1i9Behj7fjrAIju9oU0t1QtCg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.2", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + } + }, + "@jest/source-map": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.1.tgz", + "integrity": "sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.2.tgz", + "integrity": "sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==", + "dev": true, + "requires": { + "@jest/console": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz", + "integrity": "sha512-6UFEVwdmxYdyNffBxVVZxmXEdBE4riSddXYSnFNH0ELFQFk/bvagizim8WfgJTqF4EKd+j1yFxvhb8BMHfOjSQ==", + "dev": true, + "requires": { + "@jest/test-result": "^27.0.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.2", + "jest-runtime": "^27.0.4" + } + }, + "@jest/transform": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.2.tgz", + "integrity": "sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-util": "^27.0.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz", + "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/node": { + "version": "15.12.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.3.tgz", + "integrity": "sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==", + "dev": true + }, + "@types/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", + "dev": true + }, + "@types/sinon": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.1.tgz", + "integrity": "sha512-tZulsvuJwif5ddTBtscflI7gJcd+RpENcNZ7QCp0jKEl0bZY3Pu6PbJs4GR3SfQkGgsUa+FrlKsKQ0XyGNvDuA==", + "dev": true, + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/yargs": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", + "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", + "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sdk-client-mock": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-0.5.2.tgz", + "integrity": "sha512-4/P3WTi73KheqXSMK27VFyo4uQF6ZOWQ7Q/jn8GpP9al3foQryqtsYF/ODydBxzffBF2EKSaKEgWMCXQhDz4Hw==", + "dev": true, + "requires": { + "@types/sinon": "10.0.1", + "sinon": "^11.1.1", + "tslib": "^2.1.0" + } + }, + "babel-jest": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.2.tgz", + "integrity": "sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q==", + "dev": true, + "requires": { + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz", + "integrity": "sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz", + "integrity": "sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.0.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, - "entities": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001238", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001238.tgz", + "integrity": "sha512-bZGam2MxEt7YNsa2VwshqWQMwrYs5tR5WZQRYSuFxsBQunWjBuXhN4cS9nV5FFb1Z9y+DoQcQ0COyQbv6A+CKw==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", + "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "diff-sequences": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz", + "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.3.752", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", + "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expect": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz", + "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.1", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-regex-util": "^27.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "requires": { + "ci-info": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz", + "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==", + "dev": true, + "requires": { + "@jest/core": "^27.0.4", + "import-local": "^3.0.2", + "jest-cli": "^27.0.4" + }, + "dependencies": { + "jest-cli": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.4.tgz", + "integrity": "sha512-E0T+/i2lxsWAzV7LKYd0SB7HUAvePqaeIh5vX43/G5jXLhv1VzjYzJAGEkTfvxV774ll9cyE2ljcL73PVMEOXQ==", + "dev": true, + "requires": { + "@jest/core": "^27.0.4", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + } + } + } + }, + "jest-changed-files": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.2.tgz", + "integrity": "sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.4.tgz", + "integrity": "sha512-QD+eblDiRphta630WRKewuASLs/oY1Zki2G4bccntRvrTHQ63ljwFR5TLduuK4Zg0ZPzW0+8o6AP7KRd1yKOjw==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.3", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + } + }, + "jest-config": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.4.tgz", + "integrity": "sha512-VkQFAHWnPQefdvHU9A+G3H/Z3NrrTKqWpvxgQz3nkUdkDTWeKJE6e//BL+R7z79dXOMVksYgM/z6ndtN0hfChg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.4", + "@jest/types": "^27.0.2", + "babel-jest": "^27.0.2", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.4", + "jest-environment-jsdom": "^27.0.3", + "jest-environment-node": "^27.0.3", + "jest-get-type": "^27.0.1", + "jest-jasmine2": "^27.0.4", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-runner": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.2" + } + }, + "jest-diff": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz", + "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.1", + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" + } + }, + "jest-docblock": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.1.tgz", + "integrity": "sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.2.tgz", + "integrity": "sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.1", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2" + } + }, + "jest-environment-jsdom": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz", + "integrity": "sha512-5KLmgv1bhiimpSA8oGTnZYk6g4fsNyZiA/6gI2tAZUgrufd7heRUSVh4gRokzZVEj8zlwAQYT0Zs6tuJSW/ECA==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", + "@types/node": "*", + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.3.tgz", + "integrity": "sha512-co2/IVnIFL3cItpFULCvXFg9us4gvWXgs7mutAMPCbFhcqh56QAOdKhNzC2+RycsC/k4mbMj1VF+9F/NzA0ROg==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", + "@types/node": "*", + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2" + } + }, + "jest-get-type": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz", + "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==", + "dev": true + }, + "jest-haste-map": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.2.tgz", + "integrity": "sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.1", + "jest-serializer": "^27.0.1", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz", + "integrity": "sha512-yj3WrjjquZwkJw+eA4c9yucHw4/+EHndHWSqgHbHGQfT94ihaaQsa009j1a0puU8CNxPDk0c1oAPeOpdJUElwA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.3", + "@jest/source-map": "^27.0.1", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2", + "throat": "^6.0.1" + } + }, + "jest-leak-detector": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz", + "integrity": "sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==", + "dev": true, + "requires": { + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" + } + }, + "jest-matcher-utils": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz", + "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.2", + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" + } + }, + "jest-message-util": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz", + "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.3.tgz", + "integrity": "sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz", + "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==", + "dev": true + }, + "jest-resolve": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.4.tgz", + "integrity": "sha512-BcfyK2i3cG79PDb/6gB6zFeFQlcqLsQjGBqznFCpA0L/3l1L/oOsltdUjs5eISAWA9HS9qtj8v2PSZr/yWxONQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "resolve": "^1.20.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz", + "integrity": "sha512-F33UPfw1YGWCV2uxJl7wD6TvcQn5IC0LtguwY3r4L7R6H4twpLkp5Q2ZfzRx9A2I3G8feiy0O0sqcn/Qoym71A==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-snapshot": "^27.0.4" + } + }, + "jest-runner": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.4.tgz", + "integrity": "sha512-NfmvSYLCsCJk2AG8Ar2NAh4PhsJJpO+/r+g4bKR5L/5jFzx/indUpnVBdrfDvuqhGLLAvrKJ9FM/Nt8o1dsqxg==", + "dev": true, + "requires": { + "@jest/console": "^27.0.2", + "@jest/environment": "^27.0.3", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.1", + "jest-environment-jsdom": "^27.0.3", + "jest-environment-node": "^27.0.3", + "jest-haste-map": "^27.0.2", + "jest-leak-detector": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-runtime": "^27.0.4", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + } + }, + "jest-runtime": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.4.tgz", + "integrity": "sha512-voJB4xbAjS/qYPboV+e+gmg3jfvHJJY4CagFWBOM9dQKtlaiTjcpD2tWwla84Z7PtXSQPeIpXY0qksA9Dum29A==", + "dev": true, + "requires": { + "@jest/console": "^27.0.2", + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/globals": "^27.0.3", + "@jest/source-map": "^27.0.1", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-mock": "^27.0.3", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + } + }, + "jest-serializer": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.1.tgz", + "integrity": "sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.4.tgz", + "integrity": "sha512-hnjrvpKGdSMvKfbHyaG5Kul7pDJGZvjVy0CKpzhu28MmAssDXS6GpynhXzgst1wBQoKD8c9b2VS2a5yhDLQRCA==", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.2", + "jest-get-type": "^27.0.1", + "jest-haste-map": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-util": "^27.0.2", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.2", + "semver": "^7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.2.tgz", + "integrity": "sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.2.tgz", + "integrity": "sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.1", + "leven": "^3.1.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.2.tgz", + "integrity": "sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==", + "dev": true, + "requires": { + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.2", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", + "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, - "fast-xml-parser": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", - "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-format": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz", + "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sinon": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.1.tgz", + "integrity": "sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } }, "tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", + "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true } } } diff --git a/scripts/app-stream/package.json b/scripts/app-stream/package.json index 5b4fd60943..1f5a93beb5 100644 --- a/scripts/app-stream/package.json +++ b/scripts/app-stream/package.json @@ -5,10 +5,15 @@ "main": "index.js", "license": "MIT", "scripts": { - "start-image-builder": "node start-image-builder.js" + "start-image-builder": "node -e \"require('./start-image-builder.js').runCodeAsScript()\"", + "test": "jest --silent" }, "dependencies": { "@aws-sdk/client-appstream": "^3.18.0", "@aws-sdk/client-ec2": "^3.18.0" + }, + "devDependencies": { + "aws-sdk-client-mock": "^0.5.2", + "jest": "^27.0.4" } } diff --git a/scripts/app-stream/start-image-builder.js b/scripts/app-stream/start-image-builder.js index 3375183bec..e8194012d5 100644 --- a/scripts/app-stream/start-image-builder.js +++ b/scripts/app-stream/start-image-builder.js @@ -3,7 +3,7 @@ const { AppStreamClient, DescribeImageBuildersCommand, CreateImageBuilderCommand const { DescribeVpcsCommand, EC2Client, DescribeSubnetsCommand} = require("@aws-sdk/client-ec2"); -class StartImageBuilder { +const StartImageBuilder = class StartImageBuilder { constructor(profile, region, imageName, imageSize) { if (!profile || !region || !imageName || !imageSize) { console.log('Please provide a value for AWS Profile, region, image name, and image size'); @@ -107,5 +107,13 @@ class StartImageBuilder { } -const startImageBuilder = new StartImageBuilder(process.argv[2], process.argv[3], process.argv[4], process.argv[5]); -startImageBuilder.run(); +const runCodeAsScript = () => { + const startImageBuilder = new StartImageBuilder(process.argv[1], process.argv[2], process.argv[3], process.argv[4]); + startImageBuilder.run(); +} + +module.exports = { + StartImageBuilder, + runCodeAsScript +} + diff --git a/scripts/app-stream/start-image-builder.test.js b/scripts/app-stream/start-image-builder.test.js new file mode 100644 index 0000000000..105192ff0f --- /dev/null +++ b/scripts/app-stream/start-image-builder.test.js @@ -0,0 +1,71 @@ +const {mockClient} = require('aws-sdk-client-mock'); +const { DescribeVpcsCommand, EC2Client, DescribeSubnetsCommand} = require("@aws-sdk/client-ec2"); +const { AppStreamClient, DescribeImageBuildersCommand, CreateImageBuilderCommand } = require("@aws-sdk/client-appstream"); + +const {StartImageBuilder} = require('./start-image-builder'); + +describe('start-image-builder', () => { + describe('createImageBuilder', () => { + test('start image builder successfully', async () => { + // BUILD + const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default'); + const ec2Mock = mockClient(EC2Client); + ec2Mock + .on(DescribeVpcsCommand) + .resolves({ + Vpcs: [ + { + VpcId: 'vpc123' + } + ] + + }) + ec2Mock + .on(DescribeSubnetsCommand) + .resolves( + { + Subnets: [ + { + SubnetId: 'subnet123' + } + ] + } + ) + + + const appStreamMock = mockClient(AppStreamClient); + appStreamMock + .on(CreateImageBuilderCommand) + .resolves(); + + // OPERATE + await startImageBuilder.createImageBuilder(); + + + const nameRegEx = /SWBImageBuilder-\d{13}/; + // CHECK + expect(appStreamMock.calls(0)[0].args[0].input).toEqual({ + "DisplayName": expect.stringMatching(nameRegEx), + "EnableDefaultInternetAccess": true, + "ImageName": "AppStream-WinServer2019-06-01-2021", + "InstanceType": "stream.standard.medium", + "Name": expect.stringMatching(nameRegEx), + "VpcConfig": { + "SubnetIds": [ + "subnet123" + ] + } + }); + }) + test('failed to get default vpc', async () => { + const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default'); + const ec2Mock = mockClient(EC2Client); + ec2Mock + .on(DescribeVpcsCommand) + .rejects('Describe VPCs failed'); + + await expect(startImageBuilder.createImageBuilder()).rejects.toEqual(new Error('Describe VPCs failed')); + + }) + }) +}) \ No newline at end of file From 7a5527202b3a95b927c2978ebfcf533df758c9b7 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Fri, 18 Jun 2021 14:16:01 -0400 Subject: [PATCH 09/11] Added more tests --- scripts/app-stream/package-lock.json | 20 +++++----- scripts/app-stream/start-image-builder.js | 2 +- .../app-stream/start-image-builder.test.js | 40 +++++++++++++++++-- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/scripts/app-stream/package-lock.json b/scripts/app-stream/package-lock.json index a5551bb8db..bfbde16463 100644 --- a/scripts/app-stream/package-lock.json +++ b/scripts/app-stream/package-lock.json @@ -2117,15 +2117,6 @@ "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", "dev": true }, - "@types/sinon": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.1.tgz", - "integrity": "sha512-tZulsvuJwif5ddTBtscflI7gJcd+RpENcNZ7QCp0jKEl0bZY3Pu6PbJs4GR3SfQkGgsUa+FrlKsKQ0XyGNvDuA==", - "dev": true, - "requires": { - "@sinonjs/fake-timers": "^7.1.0" - } - }, "@types/stack-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", @@ -2250,6 +2241,17 @@ "@types/sinon": "10.0.1", "sinon": "^11.1.1", "tslib": "^2.1.0" + }, + "dependencies": { + "@types/sinon": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.1.tgz", + "integrity": "sha512-tZulsvuJwif5ddTBtscflI7gJcd+RpENcNZ7QCp0jKEl0bZY3Pu6PbJs4GR3SfQkGgsUa+FrlKsKQ0XyGNvDuA==", + "dev": true, + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + } } }, "babel-jest": { diff --git a/scripts/app-stream/start-image-builder.js b/scripts/app-stream/start-image-builder.js index e8194012d5..50c95d341e 100644 --- a/scripts/app-stream/start-image-builder.js +++ b/scripts/app-stream/start-image-builder.js @@ -84,7 +84,7 @@ const StartImageBuilder = class StartImageBuilder { let imageInPendingState = true; let imageState = ""; while (imageInPendingState) { - await new Promise(r => setTimeout(r, 5000)); + // await new Promise(r => setTimeout(r, 5000)); const decribeImageBuilderResponse = await this.appStreamClient.send(new DescribeImageBuildersCommand({ Names: [ this.imageBuilderName diff --git a/scripts/app-stream/start-image-builder.test.js b/scripts/app-stream/start-image-builder.test.js index 105192ff0f..86b57f519f 100644 --- a/scripts/app-stream/start-image-builder.test.js +++ b/scripts/app-stream/start-image-builder.test.js @@ -5,11 +5,18 @@ const { AppStreamClient, DescribeImageBuildersCommand, CreateImageBuilderCommand const {StartImageBuilder} = require('./start-image-builder'); describe('start-image-builder', () => { + + const appStreamMock = mockClient(AppStreamClient); + const ec2Mock = mockClient(EC2Client); describe('createImageBuilder', () => { + beforeEach(() => { + appStreamMock.reset(); + ec2Mock.reset(); + }) + test('start image builder successfully', async () => { // BUILD const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default'); - const ec2Mock = mockClient(EC2Client); ec2Mock .on(DescribeVpcsCommand) .resolves({ @@ -32,8 +39,6 @@ describe('start-image-builder', () => { } ) - - const appStreamMock = mockClient(AppStreamClient); appStreamMock .on(CreateImageBuilderCommand) .resolves(); @@ -41,7 +46,6 @@ describe('start-image-builder', () => { // OPERATE await startImageBuilder.createImageBuilder(); - const nameRegEx = /SWBImageBuilder-\d{13}/; // CHECK expect(appStreamMock.calls(0)[0].args[0].input).toEqual({ @@ -68,4 +72,32 @@ describe('start-image-builder', () => { }) }) + + describe('waitForImageBuilderToBeReady', () => { + beforeEach(() => { + appStreamMock.reset(); + }) + + test('AppStream builder transitioned to RUNNING state', async() => { + // BUILD + const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default'); + + appStreamMock + .on(DescribeImageBuildersCommand) + .resolves({ + ImageBuilders: [ + { + State: 'RUNNING' + } + ] + }) + + // OPERATE + await startImageBuilder.waitForImageBuilderToBeReady(); + + // CHECK + expect(appStreamMock.calls().length).toEqual(1); + }, 10000) + + }) }) \ No newline at end of file From dec62847eda6309c6b2949abe0883d0b70e1ba69 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Fri, 18 Jun 2021 16:24:13 -0400 Subject: [PATCH 10/11] Update tests --- scripts/app-stream/start-image-builder.js | 2 +- .../app-stream/start-image-builder.test.js | 41 +++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/scripts/app-stream/start-image-builder.js b/scripts/app-stream/start-image-builder.js index 50c95d341e..e8194012d5 100644 --- a/scripts/app-stream/start-image-builder.js +++ b/scripts/app-stream/start-image-builder.js @@ -84,7 +84,7 @@ const StartImageBuilder = class StartImageBuilder { let imageInPendingState = true; let imageState = ""; while (imageInPendingState) { - // await new Promise(r => setTimeout(r, 5000)); + await new Promise(r => setTimeout(r, 5000)); const decribeImageBuilderResponse = await this.appStreamClient.send(new DescribeImageBuildersCommand({ Names: [ this.imageBuilderName diff --git a/scripts/app-stream/start-image-builder.test.js b/scripts/app-stream/start-image-builder.test.js index 86b57f519f..131f052222 100644 --- a/scripts/app-stream/start-image-builder.test.js +++ b/scripts/app-stream/start-image-builder.test.js @@ -14,7 +14,7 @@ describe('start-image-builder', () => { ec2Mock.reset(); }) - test('start image builder successfully', async () => { + test('start Image Builder successfully', async () => { // BUILD const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default'); ec2Mock @@ -78,25 +78,42 @@ describe('start-image-builder', () => { appStreamMock.reset(); }) - test('AppStream builder transitioned to RUNNING state', async() => { + test('Image Builder transitioned to RUNNING state', async() => { // BUILD const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default'); - appStreamMock - .on(DescribeImageBuildersCommand) - .resolves({ - ImageBuilders: [ - { - State: 'RUNNING' - } - ] - }) + appStreamMock.send.onFirstCall().resolves({ + ImageBuilders: [ + { + State: 'PENDING' + } + ] + }); + + appStreamMock.send.onSecondCall().resolves({ + ImageBuilders: [ + { + State: 'RUNNING' + } + ] + }); // OPERATE await startImageBuilder.waitForImageBuilderToBeReady(); // CHECK - expect(appStreamMock.calls().length).toEqual(1); + expect(appStreamMock.calls().length).toEqual(2); + }, 15000) + + test('Image Builder failed to transition to RUNNING state', async () => { + // BUILD + const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default'); + + appStreamMock.rejects('DescribeImageBuilder failed'); + + // OPERATE, CHECK + await expect(startImageBuilder.waitForImageBuilderToBeReady()).rejects.toEqual(new Error('DescribeImageBuilder failed')); + }, 10000) }) From cea4f8ba7200a5c2d81e85df9baada134fabe853 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Fri, 18 Jun 2021 16:30:13 -0400 Subject: [PATCH 11/11] Update tests --- scripts/app-stream/start-image-builder.test.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/scripts/app-stream/start-image-builder.test.js b/scripts/app-stream/start-image-builder.test.js index 131f052222..2098cea2bc 100644 --- a/scripts/app-stream/start-image-builder.test.js +++ b/scripts/app-stream/start-image-builder.test.js @@ -8,11 +8,12 @@ describe('start-image-builder', () => { const appStreamMock = mockClient(AppStreamClient); const ec2Mock = mockClient(EC2Client); + beforeEach(() => { + appStreamMock.reset(); + ec2Mock.reset(); + }) + describe('createImageBuilder', () => { - beforeEach(() => { - appStreamMock.reset(); - ec2Mock.reset(); - }) test('start Image Builder successfully', async () => { // BUILD @@ -74,10 +75,6 @@ describe('start-image-builder', () => { }) describe('waitForImageBuilderToBeReady', () => { - beforeEach(() => { - appStreamMock.reset(); - }) - test('Image Builder transitioned to RUNNING state', async() => { // BUILD const startImageBuilder = new StartImageBuilder('default', 'us-east-1', 'default', 'default');