From 4b2b49e9d3212c637cea2a62d70c4d60a0ea2fa6 Mon Sep 17 00:00:00 2001 From: tmont Date: Mon, 13 Sep 2021 15:09:18 -0700 Subject: [PATCH] added cloudformation stack and deployment script --- package-lock.json | 1783 ++++++++++++++++++++++++++++++++++- package.json | 3 +- scripts/cfn/genreviews.yaml | 86 ++ scripts/deploy.sh | 36 + scripts/update-stack.sh | 123 +++ 5 files changed, 2029 insertions(+), 2 deletions(-) create mode 100644 scripts/cfn/genreviews.yaml create mode 100755 scripts/deploy.sh create mode 100755 scripts/update-stack.sh diff --git a/package-lock.json b/package-lock.json index f466e1d..9b2f880 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,909 @@ "devDependencies": { "@fortawesome/fontawesome-free": "5.15.4", "serve": "12.0.1", - "sql.js": "1.6.1" + "sql.js": "1.6.1", + "tail-stack-events": "2.1.0" + } + }, + "node_modules/@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==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "peer": true + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.1.tgz", + "integrity": "sha512-nS4vdan97It6HcweV58WXtjPbPSc0JXd3sAwlw3Ou5Mc3WllSycAS32Tv2LRn8butNQoU9AE3jEQAOgiMdNC1Q==", + "dev": true, + "peer": true, + "dependencies": { + "@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" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "peer": true + }, + "node_modules/@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==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "peer": true + }, + "node_modules/@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==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "peer": true + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.29.0.tgz", + "integrity": "sha512-MLeexxMs06WkPKuA/ltOCA3TV+vN1WQjEhojNtylQzz/AJDDq4z/7nmIf4lJKM7h1PDuD4XHLPfbxNuv75mu6A==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.31.0.tgz", + "integrity": "sha512-EWfo1M3gTWV2QOAK7iXAprwfHZFGRWQAG7F8KkUZJ2eQeoOi9Xqm9oH+Gf/US8Nh2FantlWFZ1Ohj+Z8V6UUVg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/client-sts": "3.31.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "@aws-sdk/util-waiter": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.31.0.tgz", + "integrity": "sha512-fbquWlOS8+uotT2aZexK/3g85NYt2T5LpfWnk9mPV5HWfoevqTz9kwsZEW4DTnW9zibRl89vwXKolNpyszuZnw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.31.0.tgz", + "integrity": "sha512-XL8l88iUHPxfByFPp9a9eZV6Shb9QijHM+aGJPFU5zYvX3ruclfuBIs/3gLgqeX8rsmjt8AfeICxaP4BwJcaZA==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-sdk-sts": "3.30.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.30.0.tgz", + "integrity": "sha512-1qb8WB2uiH2O1UYc98adfmQX3/Rxh1bwU1VW2FxEfCGBTT6wi+Ic1nVTdVy+2gd3usCeIim5mEs8REXgvjLENQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.29.0.tgz", + "integrity": "sha512-FUhdZODjkUeTFNfH7EnqN9piQwBR1gg+8NUJt6Rn7G4rj5lN2n2ryAatowIlzIB+/oWDvpPj+yMIE+XGjQrMhg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.29.0.tgz", + "integrity": "sha512-sjyJrJoLhP2ekx+Z3m5g+/YIWYtuKII9eXuTTwRhzBKTpqv0WQm1ilISdNcz691JueF5jHQs4bP6FWk55RUWEg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.31.0.tgz", + "integrity": "sha512-t95Gix2fWLIxrM2c2QZfRgJ1aCY1zGSlhb1JBlzPwxVRay7iUKa9U2dPoPhbOTsD1abQMjE4AnpDt9Bj+AXgyA==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.31.0.tgz", + "integrity": "sha512-T5309Q/MPHmaKYX0gSo6dv8w1ll4wsXvAUDXFC3MMdL/WYBfYvJa9H5nB9D9bL0xmtsm9e3WtfAcvEkN8Qz1xg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-ini": "3.31.0", + "@aws-sdk/credential-provider-process": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.29.0.tgz", + "integrity": "sha512-1dMq84uGh3zcu+/bGohibWYMSxcrjwaIAc4dBU/3+rkNzPPdRA83hzYS34EizQ61JQHnM3z/xX9SLMeaNRKaSA==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.31.0.tgz", + "integrity": "sha512-x+xQvq8AFt+V1EpwRWa3Obsd1w2L7pQyP/P6O9Q5Enq6OwmdrM+i51jMD58QMRz4h+Ys5eaLLfi0wE0AjrUbng==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-sso": "3.31.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.29.0.tgz", + "integrity": "sha512-TwICG9y/iw08urlCymroQfRRJY++4JZwdhR0/2ycU+/Cgac6u4MfZsB1qD+u9+Q39/TqSz6QwtNhKLNdf0N23A==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.29.0.tgz", + "integrity": "sha512-rx+YlHFYzgGsCZMEvJBUdRsqfMGW4RY6J3USQvz63a32jVlMC3Kw9xINaXGhCEmOlUlzdeeIMQOZW5VxavLnjQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.29.0.tgz", + "integrity": "sha512-iANkXAGNgUSX17GjyTdrFRE357AmAgnIsuyKhuaK8vi4SPPxHYCyXOdxtUx5TjkzW4bUym3cRJS8zeirayTEHA==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.29.0.tgz", + "integrity": "sha512-0TyZZbPs5SWCF2tT1DXccK5SUx7/bDJCVojgBuW3QRJn9ta3US/u5l7w8k6jwWFU3CQhLAWuG0TD7FhATiM2HQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.29.0.tgz", + "integrity": "sha512-QqIhHGp2qTfDlW7uNh/T4kcyAU2TfxHA29cppQusuTJjploAXXMzvBdmxjFH1ZvPbKs0Rd7owQ0YnC9Lnq+Nzg==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.29.0.tgz", + "integrity": "sha512-g+tOOXQXqKG84XwFrJexZa2iTuYJce9jnjHV4vyfXwVuKrwuf+ZFguPZ4hzEd40vDo5aLM49JtF/OcO4plCneg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.29.0.tgz", + "integrity": "sha512-aBifr86Owrhvy29cvZD17JzdoTtKMxzdjCkMA7ckNP+9Lg7kLI/6ws1yZ6BJlmcOnKxtNSnkvunGmJy8BU8EWQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.29.0.tgz", + "integrity": "sha512-0rLvuTvfaMWNb7+FApXAH0111FEp/AfG3fO7QkyVrXmHlTrNIJozilhkd0FwEMcQqqM9UK5lPLXwloH9Rkp9vw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.29.0.tgz", + "integrity": "sha512-yRQ48UIGPmK3/jWMJ2LC4trltFevMDEXyvtT6knwDnwXxmuwv7K6udk6TnGaUU5TlLVI1XdRQHaZY7xZH1KbGw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/service-error-classification": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.30.0.tgz", + "integrity": "sha512-TZQQ0LA/rjYNgV+DbU0KvyHZaNhihrWf4IeJeKoez1vpvQmU58G5zAm0+rVHbzazJaOQuHYKKdPttOPxl/JAAg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.29.0.tgz", + "integrity": "sha512-jN6zuaXg3k9HiWJZjBROiVJEdFaZrMikhyVdqYTT3hR+i08M/9UgVuX84HP/dALChZazOn9MPhvPWGvxrMOr9A==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.30.0.tgz", + "integrity": "sha512-T/zGCijEGODmpbS/HlwnxT0Bn69FhZpBrVAjfofLUFzHteJ5Ab2q7AEt1dOdi3GrtTGStdwbfiZVeTxMKIjaTw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.29.0.tgz", + "integrity": "sha512-S6Jt108uxs/PEoLAgGow9SdMKWXhlg0EGgY77Z4pNPQDrBYoca2kwWeTsyTpgBXSsyV0z0WZB4TJK5/doGv6CA==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.29.0.tgz", + "integrity": "sha512-AVbn9QEbqBgScaD3cxLv7/yi9Up10vYKy/AWIwgTrW0LxOuy9+Za2hdk5eZRP/QpqS/Ibz2/CqcmK1GQ/03kmg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.29.0.tgz", + "integrity": "sha512-ANRnPz4IT4FiSAc+9p0HqGSjL+cdzB2E68BFmbbGin0fZwhflX1BksjuUEibw8Emf8jvhvbUxdtAIUWctTYxOA==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.29.0.tgz", + "integrity": "sha512-FnPdoK0hmEr2JO/g7MVE3oeC2TvMpoRDQqUnDrn9C1bzRzgzhHqGVyaiRmc1HECMKjPFYVn02NCzY4qx56K0Ag==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.29.0.tgz", + "integrity": "sha512-N2fd3H4mGGE51PgmMbEzBGSNwcyPkEgMxgfZsrQUaFh+CE5uuelOAL70Yzr4IZ4yZJvf1F9e8drtCuUcHnSUEw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.29.0.tgz", + "integrity": "sha512-OIeJ7ukfgGkaIL0/NNM5sxIlfxtOqQN+KoaQ89YeLBlJPVoKnptAw+eWjjLwxLs+r/SbyZHXbBawP+sbzq0mSQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.29.0.tgz", + "integrity": "sha512-htrHPmwGfWxl/Mt0JpR63NmlDtmwMJTjvLVrdbxBBXfjiyB8023lEFfyMSDHzD6fegQcw/rOwaliQNAuaVNnXQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.29.0.tgz", + "integrity": "sha512-v22PBXafAHw+wMaSGbq4B9wEsSYV2e0nZgGHZBNML3HPDiAYJqsQHiYEbiz8nzkmoayU0wrVFZ/XfKNXXcXGbw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.29.0.tgz", + "integrity": "sha512-VqOjXXTLTGbifzg3Fg2g/Ac6W3uzC3llPZjm/b0goM17KLWMGU7JKiem2l+CFyN4sxkver7InNlIUJCJAPB6+Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.29.0.tgz", + "integrity": "sha512-x4Chk4+iMiYaxcomZjdg7IwU1mQhJ7iPl/3RrIqCShPIOZDwwH4vLl6Fw0bniOZiHK30JQ1wlAgLxzVP0JMHTw==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.30.0.tgz", + "integrity": "sha512-uBvut8RrhXGunTDYuJMALlV8IaFHyZHPzadhrqx12QJT+LQevSB4CR2WXZknz0JZ4HcFvpaJqbiionLobwVEuQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-hex-encoding": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.31.0.tgz", + "integrity": "sha512-QZHOMM6npFyDEW8wrp8rLs+YGZIPRfuItlWHm6Upejp6a7s1ksb/1c44vNeqwnAeUJrdXfOX9QFkbh1+gZF21A==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.29.0.tgz", + "integrity": "sha512-8ilWQU5ZTdiRfblmmjl38+6JZKKM8EqA5Sbn8djgDLShCLeVJ2TsL2guzNi+WHcL7BHdv1pI/NNmTcgRUo6yOw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.29.0.tgz", + "integrity": "sha512-385f+g4xeRym2S4bzF+Nc0MB8addAlCSb5hIUJu1JKH6FwFLrNRuixeaelGLyWr77xv25P0ruyXQAFf2ISxzKw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-base64-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.29.0.tgz", + "integrity": "sha512-yMgn5vZ7laVO/497iPDjTdmia3sDdFBDq6k42EZxVTpkUcd8JS2nWJ+9ePuIMwqOgPjhhkOOXiidrbZaUQ+L6Q==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-base64-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.29.0.tgz", + "integrity": "sha512-4pRwjQ6+yS7SQm+yK3pchrsmGPEuoR2YiNsBG0LVNecQmnxWUbOhaEWIxXKTnAzs9bAt7AWEbLzsW8/cN/yTNw==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.29.0.tgz", + "integrity": "sha512-cKSwlDlZkcxuhSdoiq1TxleaBvveEgKA2Yo4TYP4DKVPHZuYZtbFv8r1driml1SaIKXg4GQpe+pJit3mxDRxAg==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.29.0.tgz", + "integrity": "sha512-8rG65GMpsjVFd9jhx5y/dhwbJVIKq0OqwNRK+GoIVDo0KKaGtjNbCVHYYDjpwIuksZumiqvlC0E3AUcXn7p1rQ==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.29.0.tgz", + "integrity": "sha512-4ODxK5y/yONgsuc9SAzZ0j/v0IQkJVCRApziF4Q8NiZ1z9050nZ08rgTEhrTbWgLmDju4SDvJhn/nUNTrsLhug==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-credentials": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.29.0.tgz", + "integrity": "sha512-xCWQizP5d6SwbwB2HmxpDqu0WYY7/E7pNrZ+7tSMrJxZlT8Zsd+lFaO23JVFMEBqjjBnpLBr+XkNZgOpD1BYwA==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.29.0.tgz", + "integrity": "sha512-YZ9fhJ2HKnnPL+8M9/YMFo4906Cvh1NaVOZT61joPM5Vv1rSYXdD1/tvn2qNjVhAJAGFWdBsIqZWw43km5DNpw==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.29.0.tgz", + "integrity": "sha512-gvcbl9UdTOvuCCzgbtTTsKnL1l/cnT/CFl0f6ZCQ6qubUTRCuL/aK8DvgWa1n9p/ddCiVKPLmHu/L1xtX4gc0A==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.29.0.tgz", + "integrity": "sha512-js834TiNTdwIZOxmGSCPiLETUoc2JslY07D6A+yLNI/kZmmTHa0tKCyPxMqo7LBb+iU9ymky2LLJuDGp6aZNHw==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.29.0.tgz", + "integrity": "sha512-se9WLQS3H36u8FUA3/DfnzH3LU77QBRpJN4FmQtcQHR3A5mR2tRty+eOrvIf2R4QtveMWXrQbvScTrca7ZFZug==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.29.0", + "bowser": "^2.11.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.29.0.tgz", + "integrity": "sha512-atyjuDnD1WtIR1sZzcCJcD0JyYKGZ6bYqAhh/apaiPs0LoTyaFGYN8K7wSr3gL8PqD9YYNKfiNiPU3AbY6pW5A==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.29.0.tgz", + "integrity": "sha512-ZIHbBYByMq5vadQ1SZOQTHVtrkGAFiuypATYF5ST8YB3j7XKvflv+fiBX2xQ8xpqb28noEg6dNPnvqkQQ1n/aw==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-utf8-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.29.0.tgz", + "integrity": "sha512-CIZPDnSvtfv7MeHM/hA1fHXcXJR2f7ULjw4nXsX/BLaKGKf/O6IhOXPt1ecUIpGeUrCgPCqxkDjmThUCa87Bcg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-waiter": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.29.0.tgz", + "integrity": "sha512-9qNsX+yRpX8xE0eW9qHZCy7W6+MFkYFR10umSPVl9gc5p+RViQwS0D2wVYmQblrqGK6VpK+wAb3faFf6KaDesg==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/@fortawesome/fontawesome-free": { @@ -119,6 +1021,13 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true, + "peer": true + }, "node_modules/boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -305,6 +1214,16 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -353,6 +1272,20 @@ "punycode": "^1.3.2" } }, + "node_modules/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==", + "dev": true, + "peer": true, + "bin": { + "xml2js": "cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -795,6 +1728,18 @@ "node": ">=4" } }, + "node_modules/tail-stack-events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tail-stack-events/-/tail-stack-events-2.1.0.tgz", + "integrity": "sha512-c/GTzZqW7dM/jOyswiLW8VD6iSMXuoyoyFn2cF5kyesAqmtAbuKwtm0Gr+7MYacJ3BsVg0RHkAulnIQnUYgbJw==", + "dev": true, + "bin": { + "tail-stack-events": "tail-stack-events.js" + }, + "peerDependencies": { + "@aws-sdk/client-cloudformation": "3.x" + } + }, "node_modules/term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -845,6 +1790,13 @@ "node": ">=4" } }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true, + "peer": true + }, "node_modules/update-check": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.2.tgz", @@ -873,6 +1825,16 @@ "node": ">=6" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -920,6 +1882,783 @@ } }, "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.1.tgz", + "integrity": "sha512-nS4vdan97It6HcweV58WXtjPbPSc0JXd3sAwlw3Ou5Mc3WllSycAS32Tv2LRn8butNQoU9AE3jEQAOgiMdNC1Q==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + } + } + }, + "@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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + } + } + }, + "@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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.29.0.tgz", + "integrity": "sha512-MLeexxMs06WkPKuA/ltOCA3TV+vN1WQjEhojNtylQzz/AJDDq4z/7nmIf4lJKM7h1PDuD4XHLPfbxNuv75mu6A==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/client-cloudformation": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.31.0.tgz", + "integrity": "sha512-EWfo1M3gTWV2QOAK7iXAprwfHZFGRWQAG7F8KkUZJ2eQeoOi9Xqm9oH+Gf/US8Nh2FantlWFZ1Ohj+Z8V6UUVg==", + "dev": true, + "peer": true, + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/client-sts": "3.31.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "@aws-sdk/util-waiter": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/client-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.31.0.tgz", + "integrity": "sha512-fbquWlOS8+uotT2aZexK/3g85NYt2T5LpfWnk9mPV5HWfoevqTz9kwsZEW4DTnW9zibRl89vwXKolNpyszuZnw==", + "dev": true, + "peer": true, + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.31.0.tgz", + "integrity": "sha512-XL8l88iUHPxfByFPp9a9eZV6Shb9QijHM+aGJPFU5zYvX3ruclfuBIs/3gLgqeX8rsmjt8AfeICxaP4BwJcaZA==", + "dev": true, + "peer": true, + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-sdk-sts": "3.30.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.30.0.tgz", + "integrity": "sha512-1qb8WB2uiH2O1UYc98adfmQX3/Rxh1bwU1VW2FxEfCGBTT6wi+Ic1nVTdVy+2gd3usCeIim5mEs8REXgvjLENQ==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.29.0.tgz", + "integrity": "sha512-FUhdZODjkUeTFNfH7EnqN9piQwBR1gg+8NUJt6Rn7G4rj5lN2n2ryAatowIlzIB+/oWDvpPj+yMIE+XGjQrMhg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.29.0.tgz", + "integrity": "sha512-sjyJrJoLhP2ekx+Z3m5g+/YIWYtuKII9eXuTTwRhzBKTpqv0WQm1ilISdNcz691JueF5jHQs4bP6FWk55RUWEg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.31.0.tgz", + "integrity": "sha512-t95Gix2fWLIxrM2c2QZfRgJ1aCY1zGSlhb1JBlzPwxVRay7iUKa9U2dPoPhbOTsD1abQMjE4AnpDt9Bj+AXgyA==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.31.0.tgz", + "integrity": "sha512-T5309Q/MPHmaKYX0gSo6dv8w1ll4wsXvAUDXFC3MMdL/WYBfYvJa9H5nB9D9bL0xmtsm9e3WtfAcvEkN8Qz1xg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-ini": "3.31.0", + "@aws-sdk/credential-provider-process": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.29.0.tgz", + "integrity": "sha512-1dMq84uGh3zcu+/bGohibWYMSxcrjwaIAc4dBU/3+rkNzPPdRA83hzYS34EizQ61JQHnM3z/xX9SLMeaNRKaSA==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.31.0.tgz", + "integrity": "sha512-x+xQvq8AFt+V1EpwRWa3Obsd1w2L7pQyP/P6O9Q5Enq6OwmdrM+i51jMD58QMRz4h+Ys5eaLLfi0wE0AjrUbng==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/client-sso": "3.31.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.29.0.tgz", + "integrity": "sha512-TwICG9y/iw08urlCymroQfRRJY++4JZwdhR0/2ycU+/Cgac6u4MfZsB1qD+u9+Q39/TqSz6QwtNhKLNdf0N23A==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.29.0.tgz", + "integrity": "sha512-rx+YlHFYzgGsCZMEvJBUdRsqfMGW4RY6J3USQvz63a32jVlMC3Kw9xINaXGhCEmOlUlzdeeIMQOZW5VxavLnjQ==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/hash-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.29.0.tgz", + "integrity": "sha512-iANkXAGNgUSX17GjyTdrFRE357AmAgnIsuyKhuaK8vi4SPPxHYCyXOdxtUx5TjkzW4bUym3cRJS8zeirayTEHA==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.29.0.tgz", + "integrity": "sha512-0TyZZbPs5SWCF2tT1DXccK5SUx7/bDJCVojgBuW3QRJn9ta3US/u5l7w8k6jwWFU3CQhLAWuG0TD7FhATiM2HQ==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.29.0.tgz", + "integrity": "sha512-QqIhHGp2qTfDlW7uNh/T4kcyAU2TfxHA29cppQusuTJjploAXXMzvBdmxjFH1ZvPbKs0Rd7owQ0YnC9Lnq+Nzg==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.29.0.tgz", + "integrity": "sha512-g+tOOXQXqKG84XwFrJexZa2iTuYJce9jnjHV4vyfXwVuKrwuf+ZFguPZ4hzEd40vDo5aLM49JtF/OcO4plCneg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.29.0.tgz", + "integrity": "sha512-aBifr86Owrhvy29cvZD17JzdoTtKMxzdjCkMA7ckNP+9Lg7kLI/6ws1yZ6BJlmcOnKxtNSnkvunGmJy8BU8EWQ==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.29.0.tgz", + "integrity": "sha512-0rLvuTvfaMWNb7+FApXAH0111FEp/AfG3fO7QkyVrXmHlTrNIJozilhkd0FwEMcQqqM9UK5lPLXwloH9Rkp9vw==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.29.0.tgz", + "integrity": "sha512-yRQ48UIGPmK3/jWMJ2LC4trltFevMDEXyvtT6knwDnwXxmuwv7K6udk6TnGaUU5TlLVI1XdRQHaZY7xZH1KbGw==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/service-error-classification": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.30.0.tgz", + "integrity": "sha512-TZQQ0LA/rjYNgV+DbU0KvyHZaNhihrWf4IeJeKoez1vpvQmU58G5zAm0+rVHbzazJaOQuHYKKdPttOPxl/JAAg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.29.0.tgz", + "integrity": "sha512-jN6zuaXg3k9HiWJZjBROiVJEdFaZrMikhyVdqYTT3hR+i08M/9UgVuX84HP/dALChZazOn9MPhvPWGvxrMOr9A==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.30.0.tgz", + "integrity": "sha512-T/zGCijEGODmpbS/HlwnxT0Bn69FhZpBrVAjfofLUFzHteJ5Ab2q7AEt1dOdi3GrtTGStdwbfiZVeTxMKIjaTw==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.29.0.tgz", + "integrity": "sha512-S6Jt108uxs/PEoLAgGow9SdMKWXhlg0EGgY77Z4pNPQDrBYoca2kwWeTsyTpgBXSsyV0z0WZB4TJK5/doGv6CA==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.29.0.tgz", + "integrity": "sha512-AVbn9QEbqBgScaD3cxLv7/yi9Up10vYKy/AWIwgTrW0LxOuy9+Za2hdk5eZRP/QpqS/Ibz2/CqcmK1GQ/03kmg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.29.0.tgz", + "integrity": "sha512-ANRnPz4IT4FiSAc+9p0HqGSjL+cdzB2E68BFmbbGin0fZwhflX1BksjuUEibw8Emf8jvhvbUxdtAIUWctTYxOA==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.29.0.tgz", + "integrity": "sha512-FnPdoK0hmEr2JO/g7MVE3oeC2TvMpoRDQqUnDrn9C1bzRzgzhHqGVyaiRmc1HECMKjPFYVn02NCzY4qx56K0Ag==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/property-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.29.0.tgz", + "integrity": "sha512-N2fd3H4mGGE51PgmMbEzBGSNwcyPkEgMxgfZsrQUaFh+CE5uuelOAL70Yzr4IZ4yZJvf1F9e8drtCuUcHnSUEw==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.29.0.tgz", + "integrity": "sha512-OIeJ7ukfgGkaIL0/NNM5sxIlfxtOqQN+KoaQ89YeLBlJPVoKnptAw+eWjjLwxLs+r/SbyZHXbBawP+sbzq0mSQ==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.29.0.tgz", + "integrity": "sha512-htrHPmwGfWxl/Mt0JpR63NmlDtmwMJTjvLVrdbxBBXfjiyB8023lEFfyMSDHzD6fegQcw/rOwaliQNAuaVNnXQ==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.29.0.tgz", + "integrity": "sha512-v22PBXafAHw+wMaSGbq4B9wEsSYV2e0nZgGHZBNML3HPDiAYJqsQHiYEbiz8nzkmoayU0wrVFZ/XfKNXXcXGbw==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.29.0.tgz", + "integrity": "sha512-VqOjXXTLTGbifzg3Fg2g/Ac6W3uzC3llPZjm/b0goM17KLWMGU7JKiem2l+CFyN4sxkver7InNlIUJCJAPB6+Q==", + "dev": true, + "peer": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.29.0.tgz", + "integrity": "sha512-x4Chk4+iMiYaxcomZjdg7IwU1mQhJ7iPl/3RrIqCShPIOZDwwH4vLl6Fw0bniOZiHK30JQ1wlAgLxzVP0JMHTw==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.30.0.tgz", + "integrity": "sha512-uBvut8RrhXGunTDYuJMALlV8IaFHyZHPzadhrqx12QJT+LQevSB4CR2WXZknz0JZ4HcFvpaJqbiionLobwVEuQ==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-hex-encoding": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.31.0.tgz", + "integrity": "sha512-QZHOMM6npFyDEW8wrp8rLs+YGZIPRfuItlWHm6Upejp6a7s1ksb/1c44vNeqwnAeUJrdXfOX9QFkbh1+gZF21A==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/types": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.29.0.tgz", + "integrity": "sha512-8ilWQU5ZTdiRfblmmjl38+6JZKKM8EqA5Sbn8djgDLShCLeVJ2TsL2guzNi+WHcL7BHdv1pI/NNmTcgRUo6yOw==", + "dev": true, + "peer": true + }, + "@aws-sdk/url-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.29.0.tgz", + "integrity": "sha512-385f+g4xeRym2S4bzF+Nc0MB8addAlCSb5hIUJu1JKH6FwFLrNRuixeaelGLyWr77xv25P0ruyXQAFf2ISxzKw==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/querystring-parser": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-base64-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.29.0.tgz", + "integrity": "sha512-yMgn5vZ7laVO/497iPDjTdmia3sDdFBDq6k42EZxVTpkUcd8JS2nWJ+9ePuIMwqOgPjhhkOOXiidrbZaUQ+L6Q==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-base64-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.29.0.tgz", + "integrity": "sha512-4pRwjQ6+yS7SQm+yK3pchrsmGPEuoR2YiNsBG0LVNecQmnxWUbOhaEWIxXKTnAzs9bAt7AWEbLzsW8/cN/yTNw==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.29.0.tgz", + "integrity": "sha512-cKSwlDlZkcxuhSdoiq1TxleaBvveEgKA2Yo4TYP4DKVPHZuYZtbFv8r1driml1SaIKXg4GQpe+pJit3mxDRxAg==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.29.0.tgz", + "integrity": "sha512-8rG65GMpsjVFd9jhx5y/dhwbJVIKq0OqwNRK+GoIVDo0KKaGtjNbCVHYYDjpwIuksZumiqvlC0E3AUcXn7p1rQ==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.29.0.tgz", + "integrity": "sha512-4ODxK5y/yONgsuc9SAzZ0j/v0IQkJVCRApziF4Q8NiZ1z9050nZ08rgTEhrTbWgLmDju4SDvJhn/nUNTrsLhug==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-credentials": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.29.0.tgz", + "integrity": "sha512-xCWQizP5d6SwbwB2HmxpDqu0WYY7/E7pNrZ+7tSMrJxZlT8Zsd+lFaO23JVFMEBqjjBnpLBr+XkNZgOpD1BYwA==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.29.0.tgz", + "integrity": "sha512-YZ9fhJ2HKnnPL+8M9/YMFo4906Cvh1NaVOZT61joPM5Vv1rSYXdD1/tvn2qNjVhAJAGFWdBsIqZWw43km5DNpw==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.29.0.tgz", + "integrity": "sha512-gvcbl9UdTOvuCCzgbtTTsKnL1l/cnT/CFl0f6ZCQ6qubUTRCuL/aK8DvgWa1n9p/ddCiVKPLmHu/L1xtX4gc0A==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.29.0.tgz", + "integrity": "sha512-js834TiNTdwIZOxmGSCPiLETUoc2JslY07D6A+yLNI/kZmmTHa0tKCyPxMqo7LBb+iU9ymky2LLJuDGp6aZNHw==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.29.0.tgz", + "integrity": "sha512-se9WLQS3H36u8FUA3/DfnzH3LU77QBRpJN4FmQtcQHR3A5mR2tRty+eOrvIf2R4QtveMWXrQbvScTrca7ZFZug==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/types": "3.29.0", + "bowser": "^2.11.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.29.0.tgz", + "integrity": "sha512-atyjuDnD1WtIR1sZzcCJcD0JyYKGZ6bYqAhh/apaiPs0LoTyaFGYN8K7wSr3gL8PqD9YYNKfiNiPU3AbY6pW5A==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.29.0.tgz", + "integrity": "sha512-ZIHbBYByMq5vadQ1SZOQTHVtrkGAFiuypATYF5ST8YB3j7XKvflv+fiBX2xQ8xpqb28noEg6dNPnvqkQQ1n/aw==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.29.0.tgz", + "integrity": "sha512-CIZPDnSvtfv7MeHM/hA1fHXcXJR2f7ULjw4nXsX/BLaKGKf/O6IhOXPt1ecUIpGeUrCgPCqxkDjmThUCa87Bcg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-waiter": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.29.0.tgz", + "integrity": "sha512-9qNsX+yRpX8xE0eW9qHZCy7W6+MFkYFR10umSPVl9gc5p+RViQwS0D2wVYmQblrqGK6VpK+wAb3faFf6KaDesg==", + "dev": true, + "peer": true, + "requires": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, "@fortawesome/fontawesome-free": { "version": "5.15.4", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", @@ -996,6 +2735,13 @@ "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==", + "dev": true, + "peer": true + }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -1149,6 +2895,13 @@ "once": "^1.4.0" } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "peer": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1191,6 +2944,13 @@ "punycode": "^1.3.2" } }, + "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==", + "dev": true, + "peer": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -1545,6 +3305,13 @@ "has-flag": "^3.0.0" } }, + "tail-stack-events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tail-stack-events/-/tail-stack-events-2.1.0.tgz", + "integrity": "sha512-c/GTzZqW7dM/jOyswiLW8VD6iSMXuoyoyFn2cF5kyesAqmtAbuKwtm0Gr+7MYacJ3BsVg0RHkAulnIQnUYgbJw==", + "dev": true, + "requires": {} + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -1588,6 +3355,13 @@ } } }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true, + "peer": true + }, "update-check": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.2.tgz", @@ -1615,6 +3389,13 @@ } } }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "peer": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 7881e4b..c33082b 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "devDependencies": { "@fortawesome/fontawesome-free": "5.15.4", "serve": "12.0.1", - "sql.js": "1.6.1" + "sql.js": "1.6.1", + "tail-stack-events": "2.1.0" } } diff --git a/scripts/cfn/genreviews.yaml b/scripts/cfn/genreviews.yaml new file mode 100644 index 0000000..db161df --- /dev/null +++ b/scripts/cfn/genreviews.yaml @@ -0,0 +1,86 @@ +AWSTemplateFormatVersion: "2010-09-09" +Description: "genreviews site" + +Resources: + GenreviewsSiteBucket: + Type: "AWS::S3::Bucket" + Properties: + BucketName: "genreviews.tmont.com" + PublicAccessBlockConfiguration: + BlockPublicAcls: false + BlockPublicPolicy: false + IgnorePublicAcls: false + RestrictPublicBuckets: false + DeletionPolicy: Retain + + GenreviewsSiteCachePolicy: + Type: "AWS::CloudFront::CachePolicy" + Properties: + CachePolicyConfig: + Comment: "Cache policy for genreviews.tmont.com distribution" + DefaultTTL: 300 # five minutes + MaxTTL: 31536000 + MinTTL: 60 + Name: "genreviews-cache-policy" + ParametersInCacheKeyAndForwardedToOrigin: + CookiesConfig: + CookieBehavior: none + EnableAcceptEncodingBrotli: true + EnableAcceptEncodingGzip: true + HeadersConfig: + HeaderBehavior: none + QueryStringsConfig: + QueryStringBehavior: none + + GenreviewsSiteDistribution: + Type: "AWS::CloudFront::Distribution" + Properties: + DistributionConfig: + Aliases: + - genreviews.tmont.com + Comment: "Frontend proxy for genreviews.tmont.com" + DefaultCacheBehavior: + AllowedMethods: + - GET + - HEAD + CachedMethods: + - GET + - HEAD + CachePolicyId: !Ref GenreviewsSiteCachePolicy + Compress: true + TargetOriginId: s3-genreviews-bucket + ViewerProtocolPolicy: "redirect-to-https" + DefaultRootObject: "index.html" + Enabled: true + HttpVersion: http2 + IPV6Enabled: true + Origins: + - DomainName: !GetAtt GenreviewsSiteBucket.RegionalDomainName + Id: s3-genreviews-bucket + S3OriginConfig: + OriginAccessIdentity: "" + ViewerCertificate: + AcmCertificateArn: "arn:aws:acm:us-east-1:592283802202:certificate/73845214-de19-46df-9504-d3c9995564b2" + MinimumProtocolVersion: "TLSv1" + SslSupportMethod: "sni-only" + Tags: + - Key: app + Value: genreviews + + GenreviewsSiteDNS: + Type: "AWS::Route53::RecordSetGroup" + Properties: + Comment: "DNS for genreviews.tmont.com CloudFront proxy" + HostedZoneName: "tmont.com." + RecordSets: + - Name: genreviews.tmont.com + Type: "A" + AliasTarget: + # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid + HostedZoneId: "Z2FDTNDATAQYW2" + DNSName: !GetAtt GenreviewsSiteDistribution.DomainName + - Name: genreviews.tmont.com + Type: "AAAA" + AliasTarget: + HostedZoneId: "Z2FDTNDATAQYW2" + DNSName: !GetAtt GenreviewsSiteDistribution.DomainName diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..e226ea9 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -euo pipefail + +readonly thisDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly rootDir="$(dirname "${thisDir}")" + +main() { + SECONDS=0 + echo "copying files to S3..." + aws s3 cp --recursive --acl public-read "${rootDir}/web/" s3://genreviews.tmont.com/ + + local distId + + echo "querying for CloudFront distribution..." + distId=$( + aws cloudfront list-distributions \ + --query "DistributionList.Items[?contains(Aliases.Items, 'genreviews.tmont.com')].Id | [0]" \ + --output text + ) + + if [[ -z "${distId}" ]]; then + echo "failed to find cloudfront distribution" + exit 1 + fi + + echo "found distribution \"${distId}\", invalidating CloudFront cache..." + + aws cloudfront create-invalidation \ + --distribution-id "${distId}" \ + --paths '/*' + + echo "all done in ${SECONDS}s" +} + +main "$@" diff --git a/scripts/update-stack.sh b/scripts/update-stack.sh new file mode 100755 index 0000000..f8e9f6a --- /dev/null +++ b/scripts/update-stack.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +set -euo pipefail + +getStackAction() { + local stackName=$1 + local region=$2 + local command="create" + + aws cloudformation describe-stacks \ + --stack-name "${stackName}" \ + --output text \ + --region "${region}" &> /dev/null + + # shellcheck disable=SC2181 + if [[ $? -eq 0 ]]; then + command="update" + fi + + echo "${command}" +} + +checkError() { + # shellcheck disable=SC2181 + if [[ $? -ne 0 ]]; then + echo "$1" + exit 1 + fi +} + +usage() { + cat << USAGE +Updates or creates a CloudFormation stack + +Usage: $0 [--region region] template.yaml + +Options: + + --region region The region to create/update the stack in (us-west-2) + -h|--help Show this message + +Example: + $0 path/to/template.yaml +USAGE +} + +main() { + local cfnFile= + local region=us-west-2 + + parseArgs() { + while [[ $# -gt 0 ]]; do + local key="$1" + shift + + case "${key}" in + -h | --help) + usage + exit 0 + ;; + --region) + region=$1 + shift + ;; + *) + if [[ -n "${cfnFile}" ]]; then + echo "only one template file allowed" + exit 1 + fi + cfnFile="${key}" + ;; + esac + done + } + + parseArgs "$@" + + if [[ ! -f "${cfnFile}" ]]; then + echo "template \"${cfnFile}\" does not exist" + exit 1 + fi + + local stackName + stackName=$(basename "${cfnFile%.*}") + + local action + action=$(getStackAction "${stackName}" "${region}") + local command= + local extraOpts= + if [ "${action}" = "create" ]; then + command="create-stack" + extraOpts="--on-failure DO_NOTHING" + else + command="update-stack" + fi + + local shouldContinue + read -r -p "${action} stack ${stackName} in ${region} (profile: ${AWS_PROFILE}), continue? [y/n] " shouldContinue + if [ "${shouldContinue}" != "y" ]; then + echo "ok bye" + exit + fi + + aws cloudformation ${command} \ + --stack-name "${stackName}" \ + ${extraOpts} \ + --template-body "file://${cfnFile}" \ + --region "${region}" \ + > /dev/null + + checkError "${command} failed" + echo + + local -r tailStackEvents="node_modules/.bin/tail-stack-events" + if [ -x "${tailStackEvents}" ]; then + "${tailStackEvents}" --region "${region}" --stack-name "${stackName}" --die --outputs + fi + + echo + echo "finished in ${SECONDS}s" +} + +main "$@"