diff --git a/package-lock.json b/package-lock.json index a764a0e..9c39e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,6 +60,10 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-escapes": { @@ -102,7 +106,21 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/asn1": { "version": "0.2.4", @@ -126,9 +144,9 @@ } }, "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, "node_modules/assert": { @@ -178,9 +196,9 @@ "dev": true }, "node_modules/aws-sdk": { - "version": "2.805.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.805.0.tgz", - "integrity": "sha512-mnIiHWp541pappZPJs+P6bx18yIcJTTr4eu2n0aF9+MY4UteuFWRu0fGLssYnDwCHvtzN7/j776Pd/1QXy9hqg==", + "version": "2.891.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.891.0.tgz", + "integrity": "sha512-st6bKbmA1iWyAz9Fn7CHHNVk/6d51aemPBNpg5sK0kkOSYEob/pCAVSLiN1tGVX6qvjtD41ljeeJDQ3pwRTJfA==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -212,15 +230,29 @@ "dev": true }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -238,9 +270,9 @@ "dev": true }, "node_modules/bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "node_modules/bower": { @@ -420,6 +452,9 @@ }, "bin": { "browserifyinc": "bin/cmd.js" + }, + "peerDependencies": { + "browserify": "*" } }, "node_modules/browserify-incremental/node_modules/jsonparse": { @@ -488,12 +523,6 @@ "node": ">= 6" } }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, "node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", @@ -513,6 +542,21 @@ "ieee754": "^1.1.4" } }, + "node_modules/browserify/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/browserify/node_modules/events": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", @@ -523,9 +567,9 @@ } }, "node_modules/browserify/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, "node_modules/browserify/node_modules/url": { @@ -538,12 +582,6 @@ "querystring": "0.2.0" } }, - "node_modules/browserify/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, "node_modules/buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -721,20 +759,34 @@ "dev": true }, "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "engines": [ - "node >= 0.8" + "node >= 6.0" ], "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", - "readable-stream": "^2.2.2", + "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -784,9 +836,9 @@ } }, "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, "node_modules/create-hash": { @@ -960,9 +1012,9 @@ } }, "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, "node_modules/domain-browser": { @@ -1007,24 +1059,24 @@ } }, "node_modules/elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, "node_modules/emoji-regex": { @@ -1043,9 +1095,9 @@ } }, "node_modules/env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "engines": { "node": ">=6" @@ -1256,6 +1308,9 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/getpass": { @@ -1282,6 +1337,9 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globule": { @@ -1299,9 +1357,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "node_modules/har-schema": { @@ -1317,6 +1375,7 @@ "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dev": true, "dependencies": { "ajv": "^6.12.3", @@ -1375,12 +1434,6 @@ "node": ">= 6" } }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -1498,6 +1551,21 @@ "insert-module-globals": "bin/cmd.js" } }, + "node_modules/insert-module-globals/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -1511,6 +1579,9 @@ "dev": true, "dependencies": { "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-fullwidth-code-point": { @@ -1608,7 +1679,10 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, "node_modules/jsonparse": { "version": "1.3.1", @@ -1661,9 +1735,9 @@ } }, "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "node_modules/lodash.memoize": { @@ -1696,6 +1770,9 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru-cache": { @@ -1738,9 +1815,9 @@ } }, "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, "node_modules/mime": { @@ -1756,21 +1833,21 @@ } }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "dev": true, "dependencies": { - "mime-db": "1.44.0" + "mime-db": "1.47.0" }, "engines": { "node": ">= 0.6" @@ -1855,6 +1932,21 @@ "node": ">=4.0.0" } }, + "node_modules/mississippi/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -1902,6 +1994,21 @@ "node": ">= 0.8.0" } }, + "node_modules/module-deps/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/mold-source-map": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/mold-source-map/-/mold-source-map-0.4.0.tgz", @@ -1933,9 +2040,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/mute-stream": { @@ -2010,6 +2117,9 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optimist": { @@ -2131,9 +2241,9 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "dependencies": { "create-hash": "^1.1.2", @@ -2194,9 +2304,9 @@ } }, "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, "node_modules/pulp": { @@ -2227,35 +2337,6 @@ "node": ">= 4" } }, - "node_modules/pulp/node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/pulp/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -2287,20 +2368,12 @@ "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/purescript": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz", - "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.1.tgz", + "integrity": "sha512-dh87XeDP/JGe/3DKBMglkRuIRfGLGkL8beuLIl9KemzckgyuD+j7VK15eVb9n5Exp3DIr6SNEuGG4FjuQQ7Rpg==", "dev": true, + "hasInstallScript": true, "dependencies": { "purescript-installer": "^0.2.0" }, @@ -2343,9 +2416,9 @@ } }, "node_modules/purty": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/purty/-/purty-6.3.0.tgz", - "integrity": "sha512-l70uQyz+t5GvCPzOorUbIhRX3oQW9i8Kgwr0LvS6nUq+UM4rMJdYcHazuupcLVInvNsbd290EnpjaRgAITt0dw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/purty/-/purty-6.3.1.tgz", + "integrity": "sha512-KfOSejzz4PExqRwhRuLIJoggKY+cCVLGt+fB4csiyEv3ATX0IB93udl66UW4ZVj/zNJ4Ds+FK9nLfEXcNwBo5A==", "dev": true, "os": [ "linux", @@ -2437,10 +2510,26 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -2469,13 +2558,16 @@ } }, "node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "dependencies": { - "is-core-module": "^2.1.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/restore-cursor": { @@ -2544,10 +2636,24 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -2641,7 +2747,21 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/sorcery": { "version": "0.10.0", @@ -2678,6 +2798,7 @@ "resolved": "https://registry.npmjs.org/spago/-/spago-0.15.3.tgz", "integrity": "sha512-CNpbJiI+6MPpttbCtGIGFUroegXze4I7joXCTfiiTRzOUKcMV925fm7dxyAa3AVUUUvGi3D55k65aniGR1cVMA==", "dev": true, + "hasInstallScript": true, "dependencies": { "request": "^2.88.0", "tar": "^4.4.8" @@ -2712,9 +2833,9 @@ } }, "node_modules/ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "dependencies": { "figgy-pudding": "^3.5.1" @@ -2751,9 +2872,9 @@ } }, "node_modules/stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, "dependencies": { "builtin-status-codes": "^3.0.0", @@ -2793,12 +2914,12 @@ } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { @@ -2950,6 +3071,15 @@ "node": ">=0.8" } }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -3033,14 +3163,23 @@ } }, "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -3169,9 +3308,9 @@ } }, "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "node_modules/yallist": { @@ -3278,9 +3417,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3331,9 +3470,9 @@ "dev": true }, "aws-sdk": { - "version": "2.805.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.805.0.tgz", - "integrity": "sha512-mnIiHWp541pappZPJs+P6bx18yIcJTTr4eu2n0aF9+MY4UteuFWRu0fGLssYnDwCHvtzN7/j776Pd/1QXy9hqg==", + "version": "2.891.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.891.0.tgz", + "integrity": "sha512-st6bKbmA1iWyAz9Fn7CHHNVk/6d51aemPBNpg5sK0kkOSYEob/pCAVSLiN1tGVX6qvjtD41ljeeJDQ3pwRTJfA==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -3359,9 +3498,9 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base64-js": { @@ -3385,9 +3524,9 @@ "dev": true }, "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "bower": { @@ -3501,6 +3640,18 @@ "ieee754": "^1.1.4" } }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "events": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", @@ -3508,9 +3659,9 @@ "dev": true }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, "url": { @@ -3521,14 +3672,6 @@ "requires": { "punycode": "1.3.2", "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } } } } @@ -3648,12 +3791,6 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true } } }, @@ -3825,15 +3962,28 @@ "dev": true }, "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", - "readable-stream": "^2.2.2", + "readable-stream": "^3.0.2", "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "console-browserify": { @@ -3885,9 +4035,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -4038,9 +4188,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -4083,24 +4233,24 @@ } }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -4121,9 +4271,9 @@ } }, "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, "es6-promise": { @@ -4341,9 +4491,9 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "har-schema": { @@ -4398,12 +4548,6 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true } } }, @@ -4509,6 +4653,20 @@ "through2": "^2.0.0", "undeclared-identifiers": "^1.1.2", "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } } }, "is-buffer": { @@ -4650,9 +4808,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.memoize": { @@ -4718,9 +4876,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -4732,18 +4890,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.47.0" } }, "mimic-fn": { @@ -4814,6 +4972,20 @@ "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } } }, "mkdirp": { @@ -4852,6 +5024,20 @@ "subarg": "^1.0.0", "through2": "^2.0.0", "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } } }, "mold-source-map": { @@ -4887,9 +5073,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "mute-stream": { @@ -5054,9 +5240,9 @@ "dev": true }, "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -5111,9 +5297,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -5138,31 +5324,6 @@ "tree-kill": "^1.2.1", "which": "^1.3.1", "wordwrap": "1.0.0" - }, - "dependencies": { - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "pump": { @@ -5198,16 +5359,10 @@ } } }, - "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 - }, "purescript": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz", - "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.1.tgz", + "integrity": "sha512-dh87XeDP/JGe/3DKBMglkRuIRfGLGkL8beuLIl9KemzckgyuD+j7VK15eVb9n5Exp3DIr6SNEuGG4FjuQQ7Rpg==", "dev": true, "requires": { "purescript-installer": "^0.2.0" @@ -5242,9 +5397,9 @@ } }, "purty": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/purty/-/purty-6.3.0.tgz", - "integrity": "sha512-l70uQyz+t5GvCPzOorUbIhRX3oQW9i8Kgwr0LvS6nUq+UM4rMJdYcHazuupcLVInvNsbd290EnpjaRgAITt0dw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/purty/-/purty-6.3.1.tgz", + "integrity": "sha512-KfOSejzz4PExqRwhRuLIJoggKY+cCVLGt+fB4csiyEv3ATX0IB93udl66UW4ZVj/zNJ4Ds+FK9nLfEXcNwBo5A==", "dev": true }, "qs": { @@ -5314,6 +5469,23 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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 + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "request": { @@ -5345,12 +5517,12 @@ } }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "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.1.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -5410,9 +5582,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safer-buffer": { @@ -5552,9 +5724,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -5591,9 +5763,9 @@ } }, "stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", @@ -5632,12 +5804,12 @@ } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "string-width": { @@ -5762,6 +5934,14 @@ "requires": { "psl": "^1.1.28", "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 + } } }, "tree-kill": { @@ -5835,12 +6015,20 @@ } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" + }, + "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 + } } }, "url": { @@ -5957,9 +6145,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { diff --git a/package.json b/package.json index 7c9467d..6720843 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "devDependencies": { "bower": "^1.8.12", "pulp": "^15.0.0", - "purescript": "^0.14.0", - "purty": "^6.2.0", - "spago": "^0.15.2" + "purescript": "^0.14.2", + "purty": "^7.0.0", + "spago": "^0.20.3" }, "dependencies": { "aws-sdk": "^2.665.0" diff --git a/packages.dhall b/packages.dhall index d1fd1c3..1656d38 100644 --- a/packages.dhall +++ b/packages.dhall @@ -1,5 +1,5 @@ let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.14.0-20210309/packages.dhall sha256:585332a8a11c6420d7287943f81bc2121746cdd352f2cf3f5ecf65053f2afcd3 + https://github.com/purescript/package-sets/releases/download/psc-0.14.2-20210613/packages.dhall sha256:64d7b5a1921e8458589add8a1499a1c82168e726a87fc4f958b3f8760cca2efe let overrides = {=} diff --git a/spago.dhall b/spago.dhall index d20452b..7ddacb1 100644 --- a/spago.dhall +++ b/spago.dhall @@ -1,19 +1,36 @@ { name = "purescript-aws-sdk-basic" , dependencies = - [ "aff-promise" + [ "aff" + , "aff-promise" , "argonaut" , "argonaut-codecs" + , "arrays" + , "bifunctors" , "console" , "datetime" + , "debug" , "effect" + , "either" + , "exceptions" , "foreign" + , "foreign-object" , "formatters" + , "functions" + , "integers" , "js-date" , "justifill" + , "maybe" , "monad-control" + , "newtype" , "node-buffer" , "nullable" , "numbers" + , "ordered-collections" + , "prelude" + , "record" + , "transformers" + , "tuples" + , "unfoldable" ] , packages = ./packages.dhall , sources = [ "src/**/*.purs" ] diff --git a/src/AWS/CloudWatch/Cloudwatch.purs b/src/AWS/CloudWatch/Cloudwatch.purs index 8ec1825..488a3d1 100644 --- a/src/AWS/CloudWatch/Cloudwatch.purs +++ b/src/AWS/CloudWatch/Cloudwatch.purs @@ -1,18 +1,19 @@ module AWS.CloudWatch ( CloudWatch , makeClient - , InternalGetMetricStatisticsOutput - , InternalMetricDatapoint - , getMetricStatistics + , getMetricStatisticsAverage + , getMetricStatisticsMaximum ) where import Prelude +import AWS.CloudWatch.Types (Dimension, GetMetricStatisticsOutput, MetricDatapointMaximum, MetricSettings, Statistics, MetricDatapointAverage) import AWS.Core.Client (makeClientHelper) -import AWS.Core.Types (DefaultClientProps, InstanceId) +import AWS.Core.Types (DefaultClientProps) import AWS.Core.Util (handleError) import Control.Promise (Promise) import Control.Promise as Promise -import Data.Argonaut (Json, decodeJson, parseJson) +import Data.Argonaut (Json, parseJson) +import Data.Argonaut.Decode (decodeJson) import Data.Bifunctor (lmap) import Data.DateTime (DateTime) import Data.Either (Either) @@ -55,36 +56,77 @@ type InternalGetMetricsStatisticsParams , "Statistics" :: Array String } -type InternalMetricDatapoint - = { "Timestamp" :: String - , "Maximum" :: Number - , "Unit" :: String - } +type InternalDimension + = { "Name" :: String, "Value" :: String } -type InternalGetMetricStatisticsOutput - = { "ResponseMetadata" :: { "RequestId" :: String } - , "Label" :: String - , "Datapoints" :: Array InternalMetricDatapoint - } +toInternalDimension :: Dimension -> InternalDimension +toInternalDimension dimension = + { "Name": show dimension.name + , "Value": unwrap dimension.value + } + +toInternalGetMetricStatisticsParams :: + forall a. + { start :: DateTime, end :: DateTime | a } -> + Statistics -> + MetricSettings -> + InternalGetMetricsStatisticsParams +toInternalGetMetricStatisticsParams range statistics ms = + { "Namespace": nameSpace + , "MetricName": metricName + , "Dimensions": dimensions + , "Statistics": stat + , "StartTime": start + , "EndTime": end + , "Period": 86400 -- 1Day + } + where + nameSpace = show ms.nameSpace + + metricName = show ms.metricName + + dimensions = ms.dimensions <#> toInternalDimension -foreign import data GetMetricStatisticsResponse :: Type + stat = statistics <#> show + + start = fromDateTime range.start + + end = fromDateTime range.end foreign import getMetricStatisticsImpl :: Fn2 CloudWatch InternalGetMetricsStatisticsParams (Effect (Promise String)) -getMetricStatistics :: forall a. CloudWatch -> { start :: DateTime, end :: DateTime | a } -> InstanceId -> Aff (Either String InternalGetMetricStatisticsOutput) -getMetricStatistics cw range instanceId = liftEffect curried >>= Promise.toAff <#> parse +curried :: + forall a. + CloudWatch -> + { start :: DateTime, end :: DateTime | a } -> + Statistics -> + MetricSettings -> + Effect (Promise String) +curried cw range statistics ms = runFn2 getMetricStatisticsImpl cw params + where + params :: InternalGetMetricsStatisticsParams + params = toInternalGetMetricStatisticsParams range statistics ms + +getMetricStatisticsMaximum :: + forall a. + CloudWatch -> + { start :: DateTime, end :: DateTime | a } -> + Statistics -> + MetricSettings -> + Aff (Either String (GetMetricStatisticsOutput MetricDatapointMaximum)) +getMetricStatisticsMaximum cw range statistics ms = liftEffect (curried cw range statistics ms) >>= Promise.toAff <#> parse where - parse :: String -> Either String InternalGetMetricStatisticsOutput + parse :: String -> Either String (GetMetricStatisticsOutput MetricDatapointMaximum) parse = (parseJson >=> decodeJson) >>> lmap handleError - curried :: Effect (Promise String) - curried = - runFn2 getMetricStatisticsImpl cw - { "Namespace": "AWS/EC2" - , "MetricName": "CPUUtilization" - , "Dimensions": [ { "Name": "InstanceId", "Value": unwrap instanceId } ] - , "Statistics": [ "Maximum" ] - , "StartTime": fromDateTime range.start - , "EndTime": fromDateTime range.end - , "Period": 86400 - } +getMetricStatisticsAverage :: + forall a. + CloudWatch -> + { start :: DateTime, end :: DateTime | a } -> + Statistics -> + MetricSettings -> + Aff (Either String (GetMetricStatisticsOutput MetricDatapointAverage)) +getMetricStatisticsAverage cw range statistics ms = liftEffect (curried cw range statistics ms) >>= Promise.toAff <#> parse + where + parse :: String -> Either String (GetMetricStatisticsOutput MetricDatapointAverage) + parse = (parseJson >=> decodeJson) >>> lmap handleError diff --git a/src/AWS/CloudWatch/Types.purs b/src/AWS/CloudWatch/Types.purs new file mode 100644 index 0000000..e93fb66 --- /dev/null +++ b/src/AWS/CloudWatch/Types.purs @@ -0,0 +1,80 @@ +module AWS.CloudWatch.Types where + +import Data.Newtype (class Newtype) +import Prelude (class Show) + +data Statistic + = Minimum + | Maximum + | Average + | SampleCount + | Sum + +instance showStatistic :: Show Statistic where + show Minimum = "Minimum" + show Maximum = "Maximum" + show Average = "Average" + show SampleCount = "SampleCount" + show Sum = "Sum" + +type Statistics + = Array Statistic + +newtype DimensionValue + = DimensionValue String + +derive instance ntDimensionValue :: Newtype DimensionValue _ + +derive newtype instance showDimensionValue :: Show DimensionValue + +data NameSpace + = EC2 + | ECS + +instance showNameSpace :: Show NameSpace where + show EC2 = "AWS/EC2" + show ECS = "AWS/ECS" + +data DimensionName + = EC2InstanceId + | ClusterName + +instance showDimensionName :: Show DimensionName where + show EC2InstanceId = "InstanceId" + show ClusterName = "ClusterName" + +data MetricName + = CPUUtilization + | CPUReservation + | MemoryUtilization + | MemoryReservation + +instance showMetricName :: Show MetricName where + show CPUUtilization = "CPUUtilization" + show CPUReservation = "CPUReservation" + show MemoryUtilization = "MemoryUtilization" + show MemoryReservation = "MemoryReservation" + +type Dimension + = { name :: DimensionName, value :: DimensionValue } + +type MetricSettings + = { nameSpace :: NameSpace + , metricName :: MetricName + , dimensions :: Array Dimension + } + +type Raw + = ( "Timestamp" :: String, "Unit" :: String ) + +type MetricDatapointAverage + = { "Average" :: Number | Raw } + +type MetricDatapointMaximum + = { "Maximum" :: Number | Raw } + +type GetMetricStatisticsOutput a + = { "ResponseMetadata" :: { "RequestId" :: String } + , "Label" :: String + , "Datapoints" :: Array a + } diff --git a/src/AWS/Core/Client.purs b/src/AWS/Core/Client.purs index f93f195..080a1e4 100644 --- a/src/AWS/Core/Client.purs +++ b/src/AWS/Core/Client.purs @@ -9,12 +9,13 @@ import Justifill.Justifiable (class JustifiableFields) import Prelude ((>>>)) import Prim.Row (class Nub, class Union) import Prim.RowList (class RowToList) +import Debug (spy) makeClientHelper :: forall additionalProps client. EncodeJson (BasicClientProps additionalProps) => (Json -> Effect client) -> BasicClientProps additionalProps -> Effect client -makeClientHelper newClient = encodeJson >>> newClient +makeClientHelper newClient = spy "makeClientHelper: " >>> encodeJson >>> newClient makeDefaultClient :: forall additionalProps output input to toRL inputRL. diff --git a/src/AWS/Core/Credentials.js b/src/AWS/Core/Credentials.js index 3b71fcd..e2ad0d7 100644 --- a/src/AWS/Core/Credentials.js +++ b/src/AWS/Core/Credentials.js @@ -2,4 +2,6 @@ var AWS = require('aws-sdk') -exports.newSharedIniFileCredentials = (params) => () => new AWS.SharedIniFileCredentials(params) +exports.newSharedIniFileCredentials = (params) => () => { + console.log("Params SharedIniFileCredentials: ", params); + return new AWS.SharedIniFileCredentials(params);} diff --git a/src/AWS/Core/Types.purs b/src/AWS/Core/Types.purs index 031090b..12ba571 100644 --- a/src/AWS/Core/Types.purs +++ b/src/AWS/Core/Types.purs @@ -1,12 +1,13 @@ module AWS.Core.Types where +import Data.Argonaut (class DecodeJson, Json, JsonDecodeError, decodeJson) +import Data.Argonaut.Encode (class EncodeJson) +import Data.Either (Either) +import Data.Map as Map import Data.Maybe (Maybe) import Data.Newtype (class Newtype) -import Prelude (class Show, bind, ($), pure, (>>>), map) -import Data.Argonaut.Encode (class EncodeJson) -import Data.Argonaut (class DecodeJson, decodeJson) import Foreign.Object as F -import Data.Map as Map +import Prelude (class Show, bind, ($), pure, (>>>), map) newtype AccessKeyId = AccessKeyId String @@ -78,6 +79,11 @@ derive newtype instance showEndpoint :: Show Endpoint derive newtype instance encodeEndpoint :: EncodeJson Endpoint +decodeAsMap :: forall r. DecodeJson r => Json -> Either JsonDecodeError (Map.Map String r) +decodeAsMap str = do + obj <- decodeJson str + pure $ Map.fromFoldable $ (F.toUnfoldable obj :: Array _) + newtype Tags = Tags (Map.Map String String) @@ -87,10 +93,6 @@ derive instance ntTags :: Newtype Tags _ instance tagsDecoder :: DecodeJson Tags where decodeJson = decodeAsMap >>> map Tags - where - decodeAsMap str = do - obj <- decodeJson str - pure $ Map.fromFoldable $ (F.toUnfoldable obj :: Array _) type BasicClientPropsR r = ( accessKeyId :: Maybe AccessKeyId @@ -110,3 +112,811 @@ type DefaultClientPropsR type DefaultClientProps = Record DefaultClientPropsR + +data EC2InstanceType + = T1micro + | T2nano + | T2micro + | T2small + | T2medium + | T2large + | T2xlarge + | T22xlarge + | T3nano + | T3micro + | T3small + | T3medium + | T3large + | T3xlarge + | T32xlarge + | T3anano + | T3amicro + | T3asmall + | T3amedium + | T3alarge + | T3axlarge + | T3a2xlarge + | T4gnano + | T4gmicro + | T4gsmall + | T4gmedium + | T4glarge + | T4gxlarge + | T4g2xlarge + | M1small + | M1medium + | M1large + | M1xlarge + | M3medium + | M3large + | M3xlarge + | M32xlarge + | M4large + | M4xlarge + | M42xlarge + | M44xlarge + | M410xlarge + | M416xlarge + | M2xlarge + | M22xlarge + | M24xlarge + | Cr18xlarge + | R3large + | R3xlarge + | R32xlarge + | R34xlarge + | R38xlarge + | R4large + | R4xlarge + | R42xlarge + | R44xlarge + | R48xlarge + | R416xlarge + | R5large + | R5xlarge + | R52xlarge + | R54xlarge + | R58xlarge + | R512xlarge + | R516xlarge + | R524xlarge + | R5metal + | R5alarge + | R5axlarge + | R5a2xlarge + | R5a4xlarge + | R5a8xlarge + | R5a12xlarge + | R5a16xlarge + | R5a24xlarge + | R5blarge + | R5bxlarge + | R5b2xlarge + | R5b4xlarge + | R5b8xlarge + | R5b12xlarge + | R5b16xlarge + | R5b24xlarge + | R5bmetal + | R5dlarge + | R5dxlarge + | R5d2xlarge + | R5d4xlarge + | R5d8xlarge + | R5d12xlarge + | R5d16xlarge + | R5d24xlarge + | R5dmetal + | R5adlarge + | R5adxlarge + | R5ad2xlarge + | R5ad4xlarge + | R5ad8xlarge + | R5ad12xlarge + | R5ad16xlarge + | R5ad24xlarge + | R6gmetal + | R6gmedium + | R6glarge + | R6gxlarge + | R6g2xlarge + | R6g4xlarge + | R6g8xlarge + | R6g12xlarge + | R6g16xlarge + | R6gdmetal + | R6gdmedium + | R6gdlarge + | R6gdxlarge + | R6gd2xlarge + | R6gd4xlarge + | R6gd8xlarge + | R6gd12xlarge + | R6gd16xlarge + | X116xlarge + | X132xlarge + | X1exlarge + | X1e2xlarge + | X1e4xlarge + | X1e8xlarge + | X1e16xlarge + | X1e32xlarge + | I2xlarge + | I22xlarge + | I24xlarge + | I28xlarge + | I3large + | I3xlarge + | I32xlarge + | I34xlarge + | I38xlarge + | I316xlarge + | I3metal + | I3enlarge + | I3enxlarge + | I3en2xlarge + | I3en3xlarge + | I3en6xlarge + | I3en12xlarge + | I3en24xlarge + | I3enmetal + | Hi14xlarge + | Hs18xlarge + | C1medium + | C1xlarge + | C3large + | C3xlarge + | C32xlarge + | C34xlarge + | C38xlarge + | C4large + | C4xlarge + | C42xlarge + | C44xlarge + | C48xlarge + | C5large + | C5xlarge + | C52xlarge + | C54xlarge + | C59xlarge + | C512xlarge + | C518xlarge + | C524xlarge + | C5metal + | C5alarge + | C5axlarge + | C5a2xlarge + | C5a4xlarge + | C5a8xlarge + | C5a12xlarge + | C5a16xlarge + | C5a24xlarge + | C5adlarge + | C5adxlarge + | C5ad2xlarge + | C5ad4xlarge + | C5ad8xlarge + | C5ad12xlarge + | C5ad16xlarge + | C5ad24xlarge + | C5dlarge + | C5dxlarge + | C5d2xlarge + | C5d4xlarge + | C5d9xlarge + | C5d12xlarge + | C5d18xlarge + | C5d24xlarge + | C5dmetal + | C5nlarge + | C5nxlarge + | C5n2xlarge + | C5n4xlarge + | C5n9xlarge + | C5n18xlarge + | C5nmetal + | C6gmetal + | C6gmedium + | C6glarge + | C6gxlarge + | C6g2xlarge + | C6g4xlarge + | C6g8xlarge + | C6g12xlarge + | C6g16xlarge + | C6gdmetal + | C6gdmedium + | C6gdlarge + | C6gdxlarge + | C6gd2xlarge + | C6gd4xlarge + | C6gd8xlarge + | C6gd12xlarge + | C6gd16xlarge + | C6gnmedium + | C6gnlarge + | C6gnxlarge + | C6gn2xlarge + | C6gn4xlarge + | C6gn8xlarge + | C6gn12xlarge + | C6gn16xlarge + | Cc14xlarge + | Cc28xlarge + | G22xlarge + | G28xlarge + | G34xlarge + | G38xlarge + | G316xlarge + | G3sxlarge + | G4ad4xlarge + | G4ad8xlarge + | G4ad16xlarge + | G4dnxlarge + | G4dn2xlarge + | G4dn4xlarge + | G4dn8xlarge + | G4dn12xlarge + | G4dn16xlarge + | G4dnmetal + | Cg14xlarge + | P2xlarge + | P28xlarge + | P216xlarge + | P32xlarge + | P38xlarge + | P316xlarge + | P3dn24xlarge + | P4d24xlarge + | D2xlarge + | D22xlarge + | D24xlarge + | D28xlarge + | D3xlarge + | D32xlarge + | D34xlarge + | D38xlarge + | D3enxlarge + | D3en2xlarge + | D3en4xlarge + | D3en6xlarge + | D3en8xlarge + | D3en12xlarge + | F12xlarge + | F14xlarge + | F116xlarge + | M5large + | M5xlarge + | M52xlarge + | M54xlarge + | M58xlarge + | M512xlarge + | M516xlarge + | M524xlarge + | M5metal + | M5alarge + | M5axlarge + | M5a2xlarge + | M5a4xlarge + | M5a8xlarge + | M5a12xlarge + | M5a16xlarge + | M5a24xlarge + | M5dlarge + | M5dxlarge + | M5d2xlarge + | M5d4xlarge + | M5d8xlarge + | M5d12xlarge + | M5d16xlarge + | M5d24xlarge + | M5dmetal + | M5adlarge + | M5adxlarge + | M5ad2xlarge + | M5ad4xlarge + | M5ad8xlarge + | M5ad12xlarge + | M5ad16xlarge + | M5ad24xlarge + | M5znlarge + | M5znxlarge + | M5zn2xlarge + | M5zn3xlarge + | M5zn6xlarge + | M5zn12xlarge + | M5znmetal + | H12xlarge + | H14xlarge + | H18xlarge + | H116xlarge + | Z1dlarge + | Z1dxlarge + | Z1d2xlarge + | Z1d3xlarge + | Z1d6xlarge + | Z1d12xlarge + | Z1dmetal + | U6tb156xlarge + | U6tb1112xlarge + | U9tb1112xlarge + | U12tb1112xlarge + | U6tb1metal + | U9tb1metal + | U12tb1metal + | U18tb1metal + | U24tb1metal + | A1medium + | A1large + | A1xlarge + | A12xlarge + | A14xlarge + | A1metal + | M5dnlarge + | M5dnxlarge + | M5dn2xlarge + | M5dn4xlarge + | M5dn8xlarge + | M5dn12xlarge + | M5dn16xlarge + | M5dn24xlarge + | M5nlarge + | M5nxlarge + | M5n2xlarge + | M5n4xlarge + | M5n8xlarge + | M5n12xlarge + | M5n16xlarge + | M5n24xlarge + | R5dnlarge + | R5dnxlarge + | R5dn2xlarge + | R5dn4xlarge + | R5dn8xlarge + | R5dn12xlarge + | R5dn16xlarge + | R5dn24xlarge + | R5nlarge + | R5nxlarge + | R5n2xlarge + | R5n4xlarge + | R5n8xlarge + | R5n12xlarge + | R5n16xlarge + | R5n24xlarge + | Inf1xlarge + | Inf12xlarge + | Inf16xlarge + | Inf124xlarge + | M6gmetal + | M6gmedium + | M6glarge + | M6gxlarge + | M6g2xlarge + | M6g4xlarge + | M6g8xlarge + | M6g12xlarge + | M6g16xlarge + | M6gdmetal + | M6gdmedium + | M6gdlarge + | M6gdxlarge + | M6gd2xlarge + | M6gd4xlarge + | M6gd8xlarge + | M6gd12xlarge + | M6gd16xlarge + | Mac1metal + | X2gdmedium + | X2gdlarge + | X2gdxlarge + | X2gd2xlarge + | X2gd4xlarge + | X2gd8xlarge + | X2gd12xlarge + | X2gd16xlarge + | X2gdmetal + +instance showEC2InstanceType :: Show EC2InstanceType where + show T1micro = "t1.micro" + show T2nano = "t2.nano" + show T2micro = "t2.micro" + show T2small = "t2.small" + show T2medium = "t2.medium" + show T2large = "t2.large" + show T2xlarge = "t2.xlarge" + show T22xlarge = "t2.2xlarge" + show T3nano = "t3.nano" + show T3micro = "t3.micro" + show T3small = "t3.small" + show T3medium = "t3.medium" + show T3large = "t3.large" + show T3xlarge = "t3.xlarge" + show T32xlarge = "t3.2xlarge" + show T3anano = "t3a.nano" + show T3amicro = "t3a.micro" + show T3asmall = "t3a.small" + show T3amedium = "t3a.medium" + show T3alarge = "t3a.large" + show T3axlarge = "t3a.xlarge" + show T3a2xlarge = "t3a.2xlarge" + show T4gnano = "t4g.nano" + show T4gmicro = "t4g.micro" + show T4gsmall = "t4g.small" + show T4gmedium = "t4g.medium" + show T4glarge = "t4g.large" + show T4gxlarge = "t4g.xlarge" + show T4g2xlarge = "t4g.2xlarge" + show M1small = "m1.small" + show M1medium = "m1.medium" + show M1large = "m1.large" + show M1xlarge = "m1.xlarge" + show M3medium = "m3.medium" + show M3large = "m3.large" + show M3xlarge = "m3.xlarge" + show M32xlarge = "m3.2xlarge" + show M4large = "m4.large" + show M4xlarge = "m4.xlarge" + show M42xlarge = "m4.2xlarge" + show M44xlarge = "m4.4xlarge" + show M410xlarge = "m4.10xlarge" + show M416xlarge = "m4.16xlarge" + show M2xlarge = "m2.xlarge" + show M22xlarge = "m2.2xlarge" + show M24xlarge = "m2.4xlarge" + show Cr18xlarge = "cr1.8xlarge" + show R3large = "r3.large" + show R3xlarge = "r3.xlarge" + show R32xlarge = "r3.2xlarge" + show R34xlarge = "r3.4xlarge" + show R38xlarge = "r3.8xlarge" + show R4large = "r4.large" + show R4xlarge = "r4.xlarge" + show R42xlarge = "r4.2xlarge" + show R44xlarge = "r4.4xlarge" + show R48xlarge = "r4.8xlarge" + show R416xlarge = "r4.16xlarge" + show R5large = "r5.large" + show R5xlarge = "r5.xlarge" + show R52xlarge = "r5.2xlarge" + show R54xlarge = "r5.4xlarge" + show R58xlarge = "r5.8xlarge" + show R512xlarge = "r5.12xlarge" + show R516xlarge = "r5.16xlarge" + show R524xlarge = "r5.24xlarge" + show R5metal = "r5.metal" + show R5alarge = "r5a.large" + show R5axlarge = "r5a.xlarge" + show R5a2xlarge = "r5a.2xlarge" + show R5a4xlarge = "r5a.4xlarge" + show R5a8xlarge = "r5a.8xlarge" + show R5a12xlarge = "r5a.12xlarge" + show R5a16xlarge = "r5a.16xlarge" + show R5a24xlarge = "r5a.24xlarge" + show R5blarge = "r5b.large" + show R5bxlarge = "r5b.xlarge" + show R5b2xlarge = "r5b.2xlarge" + show R5b4xlarge = "r5b.4xlarge" + show R5b8xlarge = "r5b.8xlarge" + show R5b12xlarge = "r5b.12xlarge" + show R5b16xlarge = "r5b.16xlarge" + show R5b24xlarge = "r5b.24xlarge" + show R5bmetal = "r5b.metal" + show R5dlarge = "r5d.large" + show R5dxlarge = "r5d.xlarge" + show R5d2xlarge = "r5d.2xlarge" + show R5d4xlarge = "r5d.4xlarge" + show R5d8xlarge = "r5d.8xlarge" + show R5d12xlarge = "r5d.12xlarge" + show R5d16xlarge = "r5d.16xlarge" + show R5d24xlarge = "r5d.24xlarge" + show R5dmetal = "r5d.metal" + show R5adlarge = "r5ad.large" + show R5adxlarge = "r5ad.xlarge" + show R5ad2xlarge = "r5ad.2xlarge" + show R5ad4xlarge = "r5ad.4xlarge" + show R5ad8xlarge = "r5ad.8xlarge" + show R5ad12xlarge = "r5ad.12xlarge" + show R5ad16xlarge = "r5ad.16xlarge" + show R5ad24xlarge = "r5ad.24xlarge" + show R6gmetal = "r6g.metal" + show R6gmedium = "r6g.medium" + show R6glarge = "r6g.large" + show R6gxlarge = "r6g.xlarge" + show R6g2xlarge = "r6g.2xlarge" + show R6g4xlarge = "r6g.4xlarge" + show R6g8xlarge = "r6g.8xlarge" + show R6g12xlarge = "r6g.12xlarge" + show R6g16xlarge = "r6g.16xlarge" + show R6gdmetal = "r6gd.metal" + show R6gdmedium = "r6gd.medium" + show R6gdlarge = "r6gd.large" + show R6gdxlarge = "r6gd.xlarge" + show R6gd2xlarge = "r6gd.2xlarge" + show R6gd4xlarge = "r6gd.4xlarge" + show R6gd8xlarge = "r6gd.8xlarge" + show R6gd12xlarge = "r6gd.12xlarge" + show R6gd16xlarge = "r6gd.16xlarge" + show X116xlarge = "x1.16xlarge" + show X132xlarge = "x1.32xlarge" + show X1exlarge = "x1e.xlarge" + show X1e2xlarge = "x1e.2xlarge" + show X1e4xlarge = "x1e.4xlarge" + show X1e8xlarge = "x1e.8xlarge" + show X1e16xlarge = "x1e.16xlarge" + show X1e32xlarge = "x1e.32xlarge" + show I2xlarge = "i2.xlarge" + show I22xlarge = "i2.2xlarge" + show I24xlarge = "i2.4xlarge" + show I28xlarge = "i2.8xlarge" + show I3large = "i3.large" + show I3xlarge = "i3.xlarge" + show I32xlarge = "i3.2xlarge" + show I34xlarge = "i3.4xlarge" + show I38xlarge = "i3.8xlarge" + show I316xlarge = "i3.16xlarge" + show I3metal = "i3.metal" + show I3enlarge = "i3en.large" + show I3enxlarge = "i3en.xlarge" + show I3en2xlarge = "i3en.2xlarge" + show I3en3xlarge = "i3en.3xlarge" + show I3en6xlarge = "i3en.6xlarge" + show I3en12xlarge = "i3en.12xlarge" + show I3en24xlarge = "i3en.24xlarge" + show I3enmetal = "i3en.metal" + show Hi14xlarge = "hi1.4xlarge" + show Hs18xlarge = "hs1.8xlarge" + show C1medium = "c1.medium" + show C1xlarge = "c1.xlarge" + show C3large = "c3.large" + show C3xlarge = "c3.xlarge" + show C32xlarge = "c3.2xlarge" + show C34xlarge = "c3.4xlarge" + show C38xlarge = "c3.8xlarge" + show C4large = "c4.large" + show C4xlarge = "c4.xlarge" + show C42xlarge = "c4.2xlarge" + show C44xlarge = "c4.4xlarge" + show C48xlarge = "c4.8xlarge" + show C5large = "c5.large" + show C5xlarge = "c5.xlarge" + show C52xlarge = "c5.2xlarge" + show C54xlarge = "c5.4xlarge" + show C59xlarge = "c5.9xlarge" + show C512xlarge = "c5.12xlarge" + show C518xlarge = "c5.18xlarge" + show C524xlarge = "c5.24xlarge" + show C5metal = "c5.metal" + show C5alarge = "c5a.large" + show C5axlarge = "c5a.xlarge" + show C5a2xlarge = "c5a.2xlarge" + show C5a4xlarge = "c5a.4xlarge" + show C5a8xlarge = "c5a.8xlarge" + show C5a12xlarge = "c5a.12xlarge" + show C5a16xlarge = "c5a.16xlarge" + show C5a24xlarge = "c5a.24xlarge" + show C5adlarge = "c5ad.large" + show C5adxlarge = "c5ad.xlarge" + show C5ad2xlarge = "c5ad.2xlarge" + show C5ad4xlarge = "c5ad.4xlarge" + show C5ad8xlarge = "c5ad.8xlarge" + show C5ad12xlarge = "c5ad.12xlarge" + show C5ad16xlarge = "c5ad.16xlarge" + show C5ad24xlarge = "c5ad.24xlarge" + show C5dlarge = "c5d.large" + show C5dxlarge = "c5d.xlarge" + show C5d2xlarge = "c5d.2xlarge" + show C5d4xlarge = "c5d.4xlarge" + show C5d9xlarge = "c5d.9xlarge" + show C5d12xlarge = "c5d.12xlarge" + show C5d18xlarge = "c5d.18xlarge" + show C5d24xlarge = "c5d.24xlarge" + show C5dmetal = "c5d.metal" + show C5nlarge = "c5n.large" + show C5nxlarge = "c5n.xlarge" + show C5n2xlarge = "c5n.2xlarge" + show C5n4xlarge = "c5n.4xlarge" + show C5n9xlarge = "c5n.9xlarge" + show C5n18xlarge = "c5n.18xlarge" + show C5nmetal = "c5n.metal" + show C6gmetal = "c6g.metal" + show C6gmedium = "c6g.medium" + show C6glarge = "c6g.large" + show C6gxlarge = "c6g.xlarge" + show C6g2xlarge = "c6g.2xlarge" + show C6g4xlarge = "c6g.4xlarge" + show C6g8xlarge = "c6g.8xlarge" + show C6g12xlarge = "c6g.12xlarge" + show C6g16xlarge = "c6g.16xlarge" + show C6gdmetal = "c6gd.metal" + show C6gdmedium = "c6gd.medium" + show C6gdlarge = "c6gd.large" + show C6gdxlarge = "c6gd.xlarge" + show C6gd2xlarge = "c6gd.2xlarge" + show C6gd4xlarge = "c6gd.4xlarge" + show C6gd8xlarge = "c6gd.8xlarge" + show C6gd12xlarge = "c6gd.12xlarge" + show C6gd16xlarge = "c6gd.16xlarge" + show C6gnmedium = "c6gn.medium" + show C6gnlarge = "c6gn.large" + show C6gnxlarge = "c6gn.xlarge" + show C6gn2xlarge = "c6gn.2xlarge" + show C6gn4xlarge = "c6gn.4xlarge" + show C6gn8xlarge = "c6gn.8xlarge" + show C6gn12xlarge = "c6gn.12xlarge" + show C6gn16xlarge = "c6gn.16xlarge" + show Cc14xlarge = "cc1.4xlarge" + show Cc28xlarge = "cc2.8xlarge" + show G22xlarge = "g2.2xlarge" + show G28xlarge = "g2.8xlarge" + show G34xlarge = "g3.4xlarge" + show G38xlarge = "g3.8xlarge" + show G316xlarge = "g3.16xlarge" + show G3sxlarge = "g3s.xlarge" + show G4ad4xlarge = "g4ad.4xlarge" + show G4ad8xlarge = "g4ad.8xlarge" + show G4ad16xlarge = "g4ad.16xlarge" + show G4dnxlarge = "g4dn.xlarge" + show G4dn2xlarge = "g4dn.2xlarge" + show G4dn4xlarge = "g4dn.4xlarge" + show G4dn8xlarge = "g4dn.8xlarge" + show G4dn12xlarge = "g4dn.12xlarge" + show G4dn16xlarge = "g4dn.16xlarge" + show G4dnmetal = "g4dn.metal" + show Cg14xlarge = "cg1.4xlarge" + show P2xlarge = "p2.xlarge" + show P28xlarge = "p2.8xlarge" + show P216xlarge = "p2.16xlarge" + show P32xlarge = "p3.2xlarge" + show P38xlarge = "p3.8xlarge" + show P316xlarge = "p3.16xlarge" + show P3dn24xlarge = "p3dn.24xlarge" + show P4d24xlarge = "p4d.24xlarge" + show D2xlarge = "d2.xlarge" + show D22xlarge = "d2.2xlarge" + show D24xlarge = "d2.4xlarge" + show D28xlarge = "d2.8xlarge" + show D3xlarge = "d3.xlarge" + show D32xlarge = "d3.2xlarge" + show D34xlarge = "d3.4xlarge" + show D38xlarge = "d3.8xlarge" + show D3enxlarge = "d3en.xlarge" + show D3en2xlarge = "d3en.2xlarge" + show D3en4xlarge = "d3en.4xlarge" + show D3en6xlarge = "d3en.6xlarge" + show D3en8xlarge = "d3en.8xlarge" + show D3en12xlarge = "d3en.12xlarge" + show F12xlarge = "f1.2xlarge" + show F14xlarge = "f1.4xlarge" + show F116xlarge = "f1.16xlarge" + show M5large = "m5.large" + show M5xlarge = "m5.xlarge" + show M52xlarge = "m5.2xlarge" + show M54xlarge = "m5.4xlarge" + show M58xlarge = "m5.8xlarge" + show M512xlarge = "m5.12xlarge" + show M516xlarge = "m5.16xlarge" + show M524xlarge = "m5.24xlarge" + show M5metal = "m5.metal" + show M5alarge = "m5a.large" + show M5axlarge = "m5a.xlarge" + show M5a2xlarge = "m5a.2xlarge" + show M5a4xlarge = "m5a.4xlarge" + show M5a8xlarge = "m5a.8xlarge" + show M5a12xlarge = "m5a.12xlarge" + show M5a16xlarge = "m5a.16xlarge" + show M5a24xlarge = "m5a.24xlarge" + show M5dlarge = "m5d.large" + show M5dxlarge = "m5d.xlarge" + show M5d2xlarge = "m5d.2xlarge" + show M5d4xlarge = "m5d.4xlarge" + show M5d8xlarge = "m5d.8xlarge" + show M5d12xlarge = "m5d.12xlarge" + show M5d16xlarge = "m5d.16xlarge" + show M5d24xlarge = "m5d.24xlarge" + show M5dmetal = "m5d.metal" + show M5adlarge = "m5ad.large" + show M5adxlarge = "m5ad.xlarge" + show M5ad2xlarge = "m5ad.2xlarge" + show M5ad4xlarge = "m5ad.4xlarge" + show M5ad8xlarge = "m5ad.8xlarge" + show M5ad12xlarge = "m5ad.12xlarge" + show M5ad16xlarge = "m5ad.16xlarge" + show M5ad24xlarge = "m5ad.24xlarge" + show M5znlarge = "m5zn.large" + show M5znxlarge = "m5zn.xlarge" + show M5zn2xlarge = "m5zn.2xlarge" + show M5zn3xlarge = "m5zn.3xlarge" + show M5zn6xlarge = "m5zn.6xlarge" + show M5zn12xlarge = "m5zn.12xlarge" + show M5znmetal = "m5zn.metal" + show H12xlarge = "h1.2xlarge" + show H14xlarge = "h1.4xlarge" + show H18xlarge = "h1.8xlarge" + show H116xlarge = "h1.16xlarge" + show Z1dlarge = "z1d.large" + show Z1dxlarge = "z1d.xlarge" + show Z1d2xlarge = "z1d.2xlarge" + show Z1d3xlarge = "z1d.3xlarge" + show Z1d6xlarge = "z1d.6xlarge" + show Z1d12xlarge = "z1d.12xlarge" + show Z1dmetal = "z1d.metal" + show U6tb156xlarge = "u-6tb1.56xlarge" + show U6tb1112xlarge = "u-6tb1.112xlarge" + show U9tb1112xlarge = "u-9tb1.112xlarge" + show U12tb1112xlarge = "u-12tb1.112xlarge" + show U6tb1metal = "u-6tb1.metal" + show U9tb1metal = "u-9tb1.metal" + show U12tb1metal = "u-12tb1.metal" + show U18tb1metal = "u-18tb1.metal" + show U24tb1metal = "u-24tb1.metal" + show A1medium = "a1.medium" + show A1large = "a1.large" + show A1xlarge = "a1.xlarge" + show A12xlarge = "a1.2xlarge" + show A14xlarge = "a1.4xlarge" + show A1metal = "a1.metal" + show M5dnlarge = "m5dn.large" + show M5dnxlarge = "m5dn.xlarge" + show M5dn2xlarge = "m5dn.2xlarge" + show M5dn4xlarge = "m5dn.4xlarge" + show M5dn8xlarge = "m5dn.8xlarge" + show M5dn12xlarge = "m5dn.12xlarge" + show M5dn16xlarge = "m5dn.16xlarge" + show M5dn24xlarge = "m5dn.24xlarge" + show M5nlarge = "m5n.large" + show M5nxlarge = "m5n.xlarge" + show M5n2xlarge = "m5n.2xlarge" + show M5n4xlarge = "m5n.4xlarge" + show M5n8xlarge = "m5n.8xlarge" + show M5n12xlarge = "m5n.12xlarge" + show M5n16xlarge = "m5n.16xlarge" + show M5n24xlarge = "m5n.24xlarge" + show R5dnlarge = "r5dn.large" + show R5dnxlarge = "r5dn.xlarge" + show R5dn2xlarge = "r5dn.2xlarge" + show R5dn4xlarge = "r5dn.4xlarge" + show R5dn8xlarge = "r5dn.8xlarge" + show R5dn12xlarge = "r5dn.12xlarge" + show R5dn16xlarge = "r5dn.16xlarge" + show R5dn24xlarge = "r5dn.24xlarge" + show R5nlarge = "r5n.large" + show R5nxlarge = "r5n.xlarge" + show R5n2xlarge = "r5n.2xlarge" + show R5n4xlarge = "r5n.4xlarge" + show R5n8xlarge = "r5n.8xlarge" + show R5n12xlarge = "r5n.12xlarge" + show R5n16xlarge = "r5n.16xlarge" + show R5n24xlarge = "r5n.24xlarge" + show Inf1xlarge = "inf1.xlarge" + show Inf12xlarge = "inf1.2xlarge" + show Inf16xlarge = "inf1.6xlarge" + show Inf124xlarge = "inf1.24xlarge" + show M6gmetal = "m6g.metal" + show M6gmedium = "m6g.medium" + show M6glarge = "m6g.large" + show M6gxlarge = "m6g.xlarge" + show M6g2xlarge = "m6g.2xlarge" + show M6g4xlarge = "m6g.4xlarge" + show M6g8xlarge = "m6g.8xlarge" + show M6g12xlarge = "m6g.12xlarge" + show M6g16xlarge = "m6g.16xlarge" + show M6gdmetal = "m6gd.metal" + show M6gdmedium = "m6gd.medium" + show M6gdlarge = "m6gd.large" + show M6gdxlarge = "m6gd.xlarge" + show M6gd2xlarge = "m6gd.2xlarge" + show M6gd4xlarge = "m6gd.4xlarge" + show M6gd8xlarge = "m6gd.8xlarge" + show M6gd12xlarge = "m6gd.12xlarge" + show M6gd16xlarge = "m6gd.16xlarge" + show Mac1metal = "mac1.metal" + show X2gdmedium = "x2gd.medium" + show X2gdlarge = "x2gd.large" + show X2gdxlarge = "x2gd.xlarge" + show X2gd2xlarge = "x2gd.2xlarge" + show X2gd4xlarge = "x2gd.4xlarge" + show X2gd8xlarge = "x2gd.8xlarge" + show X2gd12xlarge = "x2gd.12xlarge" + show X2gd16xlarge = "x2gd.16xlarge" + show X2gdmetal = "x2gd.metal" diff --git a/src/AWS/Core/Util.purs b/src/AWS/Core/Util.purs index ce2834e..c7c4721 100644 --- a/src/AWS/Core/Util.purs +++ b/src/AWS/Core/Util.purs @@ -35,15 +35,452 @@ handleError = show -- | and at the second element the element which needs to be passed on (if there is any of course). -- | The first element of the result tuple will be accumlated with the other results and returned at the end. -- | and wrapped in `ls`. -unfoldrM1 :: forall m ls a b. Monad m => Monoid (m a) => Applicative ls => Monoid (ls b) => Maybe a -> (a -> m (Tuple b (Maybe a))) -> m (ls b) -unfoldrM1 initial fun = do +-- foldRecM :: forall m a b. MonadRec m => (b -> a -> m b) -> b -> Array a -> m b +unfoldrM1 :: + forall m ls a b. + Monad m => + Monoid (m a) => + Applicative ls => + Monoid (ls b) => + Maybe a -> + (a -> m (Tuple b (Maybe a))) -> + m (ls b) +unfoldrM1 initialMaybeToken func = do let - rec (resSoFar :: ls b) possibleValue = do - case possibleValue of + rec (resSoFar :: ls b) maybeToken = do + case maybeToken of Just newValue -> do - res :: Tuple b (Maybe a) <- fun newValue + res :: Tuple b (Maybe a) <- func newValue let + newResSoFar :: ls b newResSoFar = resSoFar <> (pure $ fst res) rec newResSoFar $ snd res Nothing -> pure resSoFar - rec mempty initial + rec mempty initialMaybeToken + +ec2InstanceTypes :: Array String +ec2InstanceTypes = + [ "t1.micro" + , "t2.nano" + , "t2.micro" + , "t2.small" + , "t2.medium" + , "t2.large" + , "t2.xlarge" + , "t2.2xlarge" + , "t3.nano" + , "t3.micro" + , "t3.small" + , "t3.medium" + , "t3.large" + , "t3.xlarge" + , "t3.2xlarge" + , "t3a.nano" + , "t3a.micro" + , "t3a.small" + , "t3a.medium" + , "t3a.large" + , "t3a.xlarge" + , "t3a.2xlarge" + , "t4g.nano" + , "t4g.micro" + , "t4g.small" + , "t4g.medium" + , "t4g.large" + , "t4g.xlarge" + , "t4g.2xlarge" + , "m1.small" + , "m1.medium" + , "m1.large" + , "m1.xlarge" + , "m3.medium" + , "m3.large" + , "m3.xlarge" + , "m3.2xlarge" + , "m4.large" + , "m4.xlarge" + , "m4.2xlarge" + , "m4.4xlarge" + , "m4.10xlarge" + , "m4.16xlarge" + , "m2.xlarge" + , "m2.2xlarge" + , "m2.4xlarge" + , "cr1.8xlarge" + , "r3.large" + , "r3.xlarge" + , "r3.2xlarge" + , "r3.4xlarge" + , "r3.8xlarge" + , "r4.large" + , "r4.xlarge" + , "r4.2xlarge" + , "r4.4xlarge" + , "r4.8xlarge" + , "r4.16xlarge" + , "r5.large" + , "r5.xlarge" + , "r5.2xlarge" + , "r5.4xlarge" + , "r5.8xarge" + , "r5.12xlarge" + , "r5.16xlarge" + , "r5.24xlarge" + , "r5.metal" + , "r5a.large" + , "r5a.xlarge" + , "r5a.2xlarge" + , "r5a.4xlarge" + , "r5a.8xlarge" + , "r5a.12xlarge" + , "r5a.16xlarge" + , "r5a.24xlarge" + , "r5b.large" + , "r5b.xlarge" + , "r5b.2xlarge" + , "r5b.4xlarge" + , "r5b.8xlarge" + , "r5b.12xlarge" + , "r5b.16xlarge" + , "r5b.24xlarge" + , "r5b.metal" + , "r5d.large" + , "r5d.xlarge" + , "r5d.2xlarge" + , "r5d.4xlarge" + , "r5d.8xlarge" + , "r5d.12xlarge" + , "r5d.16xlarge" + , "r5d.24xlarge" + , "r5d.metal" + , "r5ad.large" + , "r5ad.xlarge" + , "r5ad.2xlarge" + , "r5ad.4xlarge" + , "r5ad.8xlarge" + , "r5ad.12xlarge" + , "r5ad.16xlarge" + , "r5ad.24xlarge" + , "r6g.metal" + , "r6g.medium" + , "r6g.large" + , "r6g.xlarge" + , "r6g.2xlarge" + , "r6g.4xlarge" + , "r6g.8xlarge" + , "r6g.12xlarge" + , "r6g.16xlarge" + , "r6gd.metal" + , "r6gd.medium" + , "r6gd.large" + , "r6gd.xlarge" + , "r6gd.2xlarge" + , "r6gd.4xlarge" + , "r6gd.8xlarge" + , "r6gd.12xlarge" + , "r6gd.16xlarge" + , "x1.16xlarge" + , "x1.32xlarge" + , "x1e.xlarge" + , "x1e.2xlarge" + , "x1e.4xlarge" + , "x1e.8xlarge" + , "x1e.16xlarge" + , "x1e.32xlarge" + , "i2.xlarge" + , "i2.2xlarge" + , "i2.4xlarge" + , "i2.8xlarge" + , "i3.large" + , "i3.xlarge" + , "i3.2xlarge" + , "i3.4xlarge" + , "i3.8xlarge" + , "i3.16xlarge" + , "i3.metal" + , "i3en.large" + , "i3en.xlarge" + , "i3en.2xlarge" + , "i3en.3xlarge" + , "i3en.6xlarge" + , "i3en.12xlarge" + , "i3en.24xlarge" + , "i3en.metal" + , "hi1.4xlarge" + , "hs1.8xlarge" + , "c1.medium" + , "c1.xlarge" + , "c3.large" + , "c3.xlarge" + , "c3.2xlarge" + , "c3.4xlarge" + , "c3.8xlarge" + , "c4.large" + , "c4.xlarge" + , "c4.2xlarge" + , "c4.4xlarge" + , "c4.8xlarge" + , "c5.large" + , "c5.xlarge" + , "c5.2xlarge" + , "c5.4xlarge" + , "c5.9xlarge" + , "c5.12xlarge" + , "c5.18xlarge" + , "c5.24xlarge" + , "c5.metal" + , "c5a.large" + , "c5a.xlarge" + , "c5a.2xlarge" + , "c5a.4xlarge" + , "c5a.8xlarge" + , "c5a.12xlarge" + , "c5a.16xlarge" + , "c5a.24xlarge" + , "c5ad.large" + , "c5ad.xlarge" + , "c5ad.2xlarge" + , "c5ad.4xlarge" + , "c5ad.8xlarge" + , "c5ad.12xlarge" + , "c5ad.16xlarge" + , "c5ad.24xlarge" + , "c5d.large" + , "c5d.xlarge" + , "c5d.2xlarge" + , "c5d.4xlarge" + , "c5d.9xlarge" + , "c5d.12xlarge" + , "c5d.18xlarge" + , "c5d.24xlarge" + , "c5d.metal" + , "c5n.large" + , "c5n.xlarge" + , "c5n.2xlarge" + , "c5n.4xlarge" + , "c5n.9xlarge" + , "c5n.18xlarge" + , "c5n.metal" + , "c6g.metal" + , "c6g.medium" + , "c6g.large" + , "c6g.xlarge" + , "c6g.2xlarge" + , "c6g.4xlarge" + , "c6g.8xlarge" + , "c6g.12xlarge" + , "c6g.16xlarge" + , "c6gd.metal" + , "c6gd.medium" + , "c6gd.large" + , "c6gd.xlarge" + , "c6gd.2xlarge" + , "c6gd.4xlarge" + , "c6gd.8xlarge" + , "c6gd.12xlarge" + , "c6gd.16xlarge" + , "c6gn.medium" + , "c6gn.large" + , "c6gn.xlarge" + , "c6gn.2xlarge" + , "c6gn.4xlarge" + , "c6gn.8xlarge" + , "c6gn.12xlarge" + , "c6gn.16xlarge" + , "cc1.4xlarge" + , "cc2.8xlarge" + , "g2.2xlarge" + , "g2.8xlarge" + , "g3.4xlarge" + , "g3.8xlarge" + , "g3.16xlarge" + , "g3s.xlarge" + , "g4ad.4xlarge" + , "g4ad.8xlarge" + , "g4ad.16xlarge" + , "g4dn.xlarge" + , "g4dn.2xlarge" + , "g4dn.4xlarge" + , "g4dn.8xlarge" + , "g4dn.12xlarge" + , "g4dn.16xlarge" + , "g4dn.metal" + , "cg1.4xlarge" + , "p2.xlarge" + , "p2.8xlarge" + , "p2.16xlarge" + , "p3.2xlarge" + , "p3.8xlarge" + , "p3.16xlarge" + , "p3dn.24xlarge" + , "p4d.24xlarge" + , "d2.xlarge" + , "d2.2xlarge" + , "d2.4xlarge" + , "d2.8xlarge" + , "d3.xlarge" + , "d3.2xlarge" + , "d3.4xlarge" + , "d3.8xlarge" + , "d3en.xlarge" + , "d3en.2xlarge" + , "d3en.4xlarge" + , "d3en.6xlarge" + , "d3en.8xlarge" + , "d3en.12xlarge" + , "f1.2xlarge" + , "f1.4xlarge" + , "f1.16xlarge" + , "m5.large" + , "m5.xlarge" + , "m5.2xlarge" + , "m5.4xlarge" + , "m5.8xlarge" + , "m5.12xlarge" + , "m5.16xlarge" + , "m5.24xlarge" + , "m5.metal" + , "m5a.large" + , "m5a.xlarge" + , "m5a.2xlarge" + , "m5a.4xlarge" + , "m5a.8xlarge" + , "m5a.12xlarge" + , "m5a.16xlarge" + , "m5a.24xlarge" + , "m5d.large" + , "m5d.xlarge" + , "m5d.2xlarge" + , "m5d.4xlarge" + , "m5d.8xlarge" + , "m5d.12xlarge" + , "m5d.16xlarge" + , "m5d.24xlarge" + , "m5d.metal" + , "m5ad.large" + , "m5ad.xlarge" + , "m5ad.2xlarge" + , "m5ad.4xlarge" + , "m5ad.8xlarge" + , "m5ad.12xlarge" + , "m5ad.16xlarge" + , "m5ad.24xlarge" + , "m5zn.large" + , "m5zn.xlarge" + , "m5zn.2xlarge" + , "m5zn.3xlarge" + , "m5zn.6xlarge" + , "m5zn.12xlarge" + , "m5zn.metal" + , "h1.2xlarge" + , "h1.4xlarge" + , "h1.8xlarge" + , "h1.16xlarge" + , "z1d.large" + , "z1d.xlarge" + , "z1d.2xlarge" + , "z1d.3xlarge" + , "z1d.6xlarge" + , "z1d.12xlarge" + , "z1d.metal" + , "u-6tb1.56xlarge" + , "u-6tb1.112xlarge" + , "u-9tb1.112xlarge" + , "u-12tb1.112xlarge" + , "u-6tb1.metal" + , "u-9tb1.metal" + , "u-12tb1.metal" + , "u-18tb1.metal" + , "u-24tb1.metal" + , "a1.medium" + , "a1.large" + , "a1.xlarge" + , "a1.2xlarge" + , "a1.4xlarge" + , "a1.metal" + , "m5dn.large" + , "m5dn.xlarge" + , "m5dn.2xlarge" + , "m5dn.4xlarge" + , "m5dn.8xlarge" + , "m5dn.12xlarge" + , "m5dn.16xlarge" + , "m5dn.24xlarge" + , "m5n.large" + , "m5n.xlarge" + , "m5n.2xlarge" + , "m5n.4xlarge" + , "m5n.8xlarge" + , "m5n.12xlarge" + , "m5n.16xlarge" + , "m5n.24xlarge" + , "r5dn.large" + , "r5dn.xlarge" + , "r5dn.2xlarge" + , "r5dn.4xlarge" + , "r5dn.8xlarge" + , "r5dn.12xlarge" + , "r5dn.16xlarge" + , "r5dn.24xlarge" + , "r5n.large" + , "r5n.xlarge" + , "r5n.2xlarge" + , "r5n.4xlarge" + , "r5n.8xlarge" + , "r5n.12xlarge" + , "r5n.16xlarge" + , "r5n.24xlarge" + , "inf1.xlarge" + , "inf1.2xlarge" + , "inf1.6xlarge" + , "inf1.24xlarge" + , "m6g.metal" + , "m6g.medium" + , "m6g.large" + , "m6g.xlarge" + , "m6g.2xlarge" + , "m6g.4xlarge" + , "m6g.8xlarge" + , "m6g.12xlarge" + , "m6g.16xlarge" + , "m6gd.metal" + , "m6gd.medium" + , "m6gd.large" + , "m6gd.xlarge" + , "m6gd.2xlarge" + , "m6gd.4xlarge" + , "m6gd.8xlarge" + , "m6gd.12xlarge" + , "m6gd.16xlarge" + , "mac1.metal" + , "x2gd.medium" + , "x2gd.large" + , "x2gd.xlarge" + , "x2gd.2xlarge" + , "x2gd.4xlarge" + , "x2gd.8xlarge" + , "x2gd.12xlarge" + , "x2gd.16xlarge" + , "x2gd.metal" + ] + +regions :: Array String +regions = + [ "eu-north-1" + , "ap-south-1" + , "eu-west-3" + , "eu-west-2" + , "eu-west-1" + , "ap-northeast-3" + , "ap-northeast-2" + , "ap-northeast-1" + , "sa-east-1" + , "ca-central-1" + , "ap-southeast-1" + , "ap-southeast-2" + , "eu-central-1" + , "us-east-1" + , "us-east-2" + , "us-west-1" + , "us-west-2" + ] \ No newline at end of file diff --git a/src/AWS/DynamoDB/DynamoDb.js b/src/AWS/DynamoDB/DynamoDb.js index d67e955..23ef8af 100644 --- a/src/AWS/DynamoDB/DynamoDb.js +++ b/src/AWS/DynamoDB/DynamoDb.js @@ -2,10 +2,15 @@ var AWS = require('aws-sdk') -exports.newDynamoDbClient = (params) => () => new AWS.DynamoDB(params) +exports.newDynamoDbClient = (params) => () => { + console.log("Params newDynamoDbClient: ", params); + return new AWS.DynamoDB(params);} exports.getItemImpl = (db, params) => () => db.getItem(params).promise() -exports.putItemImpl = (db, params) => () => db.putItem(params).promise() +exports.putItemImpl = (db, params) => () => { + console.log("Params putItemImpl: ", params); + console.log("Db putItemImpl: ", db); + return db.putItem(params).promise();} exports.createTableImpl = (db, params) => () => db.createTable(params).promise() diff --git a/src/AWS/EC2/EC2.js b/src/AWS/EC2/EC2.js index 95d8f88..699867d 100644 --- a/src/AWS/EC2/EC2.js +++ b/src/AWS/EC2/EC2.js @@ -10,3 +10,6 @@ exports.describeInstancesImpl = (ec2) => exports.describeTagsImpl = (ec2, filters) => () => ec2.describeTags({ Filters: filters }).promise() + +exports.describeInstanceAttributeImpl = (ec2, attribute, instanceId) => + () => ec2.describeInstanceAttribute({ Attribute: attribute, InstanceId: instanceId }).promise() diff --git a/src/AWS/EC2/EC2.purs b/src/AWS/EC2/EC2.purs index 09977df..3d65ab6 100644 --- a/src/AWS/EC2/EC2.purs +++ b/src/AWS/EC2/EC2.purs @@ -7,15 +7,22 @@ module AWS.EC2 , describeTags , DescribeTagsResponse , Tag + , describeInstanceTypeAttribute + , newEC2 ) where import Prelude import AWS.Core.Client (makeClientHelper) import AWS.Core.Types (DefaultClientProps, Instance, InstanceId(..), InstanceType(..)) +import AWS.Core.Util (handleError) +import AWS.EC2.Types (Attribute, InstanceTypeAttribute) import Control.Promise (Promise, toAffE) import Control.Promise as Promise -import Data.Argonaut (Json) -import Data.Function.Uncurried (Fn1, Fn2, runFn2) +import Data.Argonaut (Json, decodeJson) +import Data.Bifunctor (lmap) +import Data.Either (Either) +import Data.Function.Uncurried (Fn1, Fn2, Fn3, runFn2, runFn3) +import Data.Newtype (unwrap) import Effect (Effect) import Effect.Aff (Aff) import Effect.Class (liftEffect) @@ -192,3 +199,20 @@ describeTags ec2 filters = toResponse :: InternalDescribeTagsResponse -> DescribeTagsResponse toResponse internalRspse = { tags: internalRspse."Tags" <#> toTag } + +foreign import describeInstanceAttributeImpl :: Fn3 EC2 String String (Effect (Promise Json)) + +curriedInstanceAttribute :: EC2 -> Attribute -> InstanceId -> Effect (Promise Json) +curriedInstanceAttribute ec2 attribute instanceId = + runFn3 describeInstanceAttributeImpl + ec2 + (show attribute) + (unwrap instanceId) + +describeInstanceTypeAttribute :: EC2 -> Attribute -> InstanceId -> Aff (Either String (InstanceTypeAttribute ())) +describeInstanceTypeAttribute ec2 attribute instanceId = + (toAffE $ curriedInstanceAttribute ec2 attribute instanceId) + <#> parse + where + parse :: Json -> Either String (InstanceTypeAttribute ()) + parse = decodeJson <#> lmap handleError diff --git a/src/AWS/EC2/Types.purs b/src/AWS/EC2/Types.purs new file mode 100644 index 0000000..f175a92 --- /dev/null +++ b/src/AWS/EC2/Types.purs @@ -0,0 +1,68 @@ +module AWS.EC2.Types where + +import Prelude (class Show) + +data Attribute + = InstanceType + | Kernel + | Ramdisk + | UserData + | DisableApiTermination + | InstanceInitiatedShutdownBehavior + | RootDeviceName + | BlockDeviceMapping + | ProductCodes + | SourceDestCheck + | GroupSet + | EbsOptimized + | SriovNetSupport + | EnaSupport + | EnclaveOptions + +instance showAttribute :: Show Attribute where + show InstanceType = "instanceType" + show Kernel = "kernel" + show Ramdisk = "ramdisk" + show UserData = "userData" + show DisableApiTermination = "disableApiTermination" + show InstanceInitiatedShutdownBehavior = "instanceInitiatedShutdownBehavior" + show RootDeviceName = "rootDeviceName" + show BlockDeviceMapping = "blockDeviceMapping" + show ProductCodes = "productCodes" + show SourceDestCheck = "sourceDestCheck" + show GroupSet = "groupSet" + show EbsOptimized = "ebsOptimized" + show SriovNetSupport = "sriovNetSupport" + show EnaSupport = "enaSupport" + show EnclaveOptions = "enclaveOptions" + +{- +Depending on which Attribute is sent in the request the response can contain different keys +But it looks like "InstanceId" will always be present +Examples: + +with Attribute.KernelId +{ + Groups: [], + BlockDeviceMappings: [], + InstanceId: 'i-0b7ae30b85f749328', + KernelId: {}, + ProductCodes: [] +} + +with Attribute.InstanceType +{ + Groups: [], + BlockDeviceMappings: [], + InstanceId: 'i-0b7ae30b85f749328', + InstanceType: { Value: 'm5.2xlarge' }, + ProductCodes: [] +} +-} +type Raw a + = ( "InstanceId" :: String | a ) + +type InstanceTypeAttribute a + = { "InstanceType" :: { "Value" :: String } + | Raw a + } diff --git a/src/AWS/ECS/ECS.js b/src/AWS/ECS/ECS.js new file mode 100644 index 0000000..ec77ed3 --- /dev/null +++ b/src/AWS/ECS/ECS.js @@ -0,0 +1,24 @@ +"use strict" + +const ECS = require('aws-sdk/clients/ecs') + +exports.newECS = (params) => + () => new ECS(params) + +exports.listClustersImpl = (ecs) => + () => ecs.listClusters().promise() + +exports.listTasksImpl = (ecs, clusterArn, containerInstanceArn) => + () => ecs.listTasks({ cluster: clusterArn, containerInstance: containerInstanceArn }).promise() + +exports.listContainerInstancesImpl = (ecs, clusterArn) => + () => ecs.listContainerInstances({ cluster: clusterArn }).promise() + +exports.describeClustersImpl = (ecs, clusterArns) => + () => ecs.describeClusters({ clusters: clusterArns }).promise() + +exports.describeContainerInstancesImpl = (ecs, clusterArn, containerInstanceArns) => + () => ecs.describeContainerInstances({ cluster: clusterArn, containerInstances: containerInstanceArns }).promise() + +exports.describeTasksImpl = (ecs, taskArns, clusterArn) => + () => ecs.describeTasks({ tasks: taskArns, cluster: clusterArn }).promise() diff --git a/src/AWS/ECS/ECS.purs b/src/AWS/ECS/ECS.purs new file mode 100644 index 0000000..49bfcdd --- /dev/null +++ b/src/AWS/ECS/ECS.purs @@ -0,0 +1,156 @@ +module AWS.ECS + ( ECS + , makeClient + , listClusters + , listTasks + , listContainerInstances + , describeClusters + , describeContainerInstances + , newECS + , describeTasks + ) where + +import Prelude +import AWS.Core.Client (makeClientHelper) +import AWS.Core.Types (DefaultClientProps) +import AWS.Core.Util (handleError) +import AWS.ECS.Types (Tasks, DescribeTasksResponse, ClusterArn(..), ClusterParams, Clusters, ContainerInstanceArn(..), ContainerInstanceParams, ContainerInstances, DescribeClustersResponse, DescribeContainerInstancesResponse, ListClustersResponse, ListContainerInstancesResponse, ListTasksResponse) +import Control.Promise (Promise, toAffE) +import Data.Argonaut (Json, decodeJson) +import Data.Bifunctor (lmap) +import Data.Either (Either) +import Data.Function.Uncurried (Fn1, Fn2, Fn3, runFn1, runFn2, runFn3) +import Data.Newtype (un, wrap, unwrap) +import Effect (Effect) +import Effect.Aff (Aff) +import Justifill (justifillVia) +import Justifill.Fillable (class Fillable) +import Justifill.Justifiable (class Justifiable) +import Type.Proxy (Proxy(..)) + +foreign import data ECS :: Type + +foreign import newECS :: Json -> (Effect ECS) + +makeClient :: + forall r via. + Justifiable { | r } { | via } => + Fillable { | via } DefaultClientProps => + { | r } -> + Effect ECS +makeClient r = makeClientHelper newECS props + where + viaProxy :: Proxy { | via } + viaProxy = Proxy + + props :: DefaultClientProps + props = justifillVia viaProxy r + +type InternalListClustersResponse + = { clusterArns :: Array String } + +foreign import listClustersImpl :: Fn1 ECS (Effect (Promise InternalListClustersResponse)) + +listClusters :: ECS -> Aff ListClustersResponse +listClusters ecs = + runFn1 listClustersImpl ecs + # toAffE + <#> toResponse + where + toResponse :: InternalListClustersResponse -> ListClustersResponse + toResponse internalRspse = { clusterArns: internalRspse."clusterArns" <#> wrap } + +foreign import listTasksImpl :: Fn3 ECS String String (Effect (Promise InternalListTasksResponse)) + +type InternalListTasksResponse + = { taskArns :: Array String } + +listTasks :: ECS -> ClusterArn -> ContainerInstanceArn -> Aff ListTasksResponse +listTasks ecs clusterArn containerInstanceArn = + runFn3 listTasksImpl ecs (un ClusterArn clusterArn) (un ContainerInstanceArn containerInstanceArn) + # toAffE + <#> toResponse + where + toResponse :: InternalListTasksResponse -> ListTasksResponse + toResponse internalRspse = { taskArns: internalRspse."taskArns" <#> wrap } + +foreign import listContainerInstancesImpl :: Fn2 ECS String (Effect (Promise InternalListContainerInstancesResponse)) + +type InternalListContainerInstancesResponse + = { containerInstanceArns :: Array String } + +listContainerInstances :: ECS -> ClusterArn -> Aff ListContainerInstancesResponse +listContainerInstances ecs clusterArn = + runFn2 listContainerInstancesImpl ecs (un ClusterArn clusterArn) + # toAffE + <#> toResponse + where + toResponse :: InternalListContainerInstancesResponse -> ListContainerInstancesResponse + toResponse internalRspse = { containerInstanceArns: internalRspse."containerInstanceArns" <#> wrap } + +type InternalCluster r + = { clusterArn :: String + , clusterName :: String + , status :: String + , registeredContainerInstancesCount :: Number + | r + } + +type InternalDescribeClustersResponse r + = { clusters :: Array (InternalCluster r) } + +foreign import describeClustersImpl :: forall r. Fn2 ECS (Array String) (Effect (Promise (InternalDescribeClustersResponse r))) + +describeClusters :: ECS -> Clusters -> Aff DescribeClustersResponse +describeClusters ecs clusterArns = + runFn2 describeClustersImpl ecs (clusterArns <#> unwrap) + # toAffE + <#> toResponse + where + toResponse :: forall r. InternalDescribeClustersResponse r -> DescribeClustersResponse + toResponse internalRspse = { clusters: internalRspse."clusters" <#> toClusterParams } + + toClusterParams :: forall r. InternalCluster r -> ClusterParams + toClusterParams i = + { clusterArn: i.clusterArn + , clusterName: i.clusterName + , status: i.status + , registeredContainerInstancesCount: i.registeredContainerInstancesCount + } + +type InternalContainerInstanceParams r + = { containerInstanceArn :: String + , ec2InstanceId :: String + | r + } + +type InternalDescribeContainerInstancesResponse r + = { containerInstances :: Array (InternalContainerInstanceParams r) } + +foreign import describeContainerInstancesImpl :: forall r. Fn3 ECS String (Array String) (Effect (Promise (InternalDescribeContainerInstancesResponse r))) + +describeContainerInstances :: ECS -> ClusterArn -> ContainerInstances -> Aff DescribeContainerInstancesResponse +describeContainerInstances ecs clusterArn containers = + runFn3 describeContainerInstancesImpl ecs (unwrap clusterArn) (containers <#> unwrap) + # toAffE + <#> toResponse + where + toResponse :: forall r. InternalDescribeContainerInstancesResponse r -> DescribeContainerInstancesResponse + toResponse internalRspse = { containerInstances: internalRspse."containerInstances" <#> toContainerInstanceParams } + + toContainerInstanceParams :: forall r. InternalContainerInstanceParams r -> ContainerInstanceParams + toContainerInstanceParams i = + { containerInstanceArn: i.containerInstanceArn + , ec2InstanceId: i.ec2InstanceId + } + +foreign import describeTasksImpl :: Fn3 ECS (Array String) String (Effect (Promise (Json))) + +describeTasks :: ECS -> Tasks -> ClusterArn -> Aff (Either String (DescribeTasksResponse ())) +describeTasks ecs tasks cluster = + runFn3 describeTasksImpl ecs (tasks <#> unwrap) (unwrap cluster) + # toAffE + <#> parse + where + parse :: Json -> Either String (DescribeTasksResponse ()) + parse = decodeJson <#> lmap handleError diff --git a/src/AWS/ECS/Types.purs b/src/AWS/ECS/Types.purs new file mode 100644 index 0000000..9cc0ddd --- /dev/null +++ b/src/AWS/ECS/Types.purs @@ -0,0 +1,112 @@ +module AWS.ECS.Types where + +import Prelude (class Show) +import Data.Newtype (class Newtype) + +newtype ClusterArn + = ClusterArn String + +derive instance ntClusterArn :: Newtype ClusterArn _ + +derive newtype instance showClusterArn :: Show ClusterArn + +type Clusters + = Array ClusterArn + +type ListClustersResponse + = { clusterArns :: Clusters } + +newtype TaskArn + = TaskArn String + +derive instance ntTaskArn :: Newtype TaskArn _ + +derive newtype instance showTaskArn :: Show TaskArn + +type Tasks + = Array TaskArn + +type ListTasksResponse + = { taskArns :: Tasks } + +newtype ContainerInstanceArn + = ContainerInstanceArn String + +derive instance ntContainerInstanceArn :: Newtype ContainerInstanceArn _ + +derive newtype instance showContainerInstanceArn :: Show ContainerInstanceArn + +type ContainerInstances + = Array ContainerInstanceArn + +type ListContainerInstancesResponse + = { containerInstanceArns :: ContainerInstances } + +type ClusterParams + = { clusterArn :: String + , clusterName :: String + , status :: String + , registeredContainerInstancesCount :: Number + } + +type DescribeClustersResponse + = { clusters :: Array ClusterParams } + +type ContainerInstanceParams + = { containerInstanceArn :: String + , ec2InstanceId :: String + } + +type DescribeContainerInstancesResponse + = { containerInstances :: Array ContainerInstanceParams } + +{- +{ + tasks: [ + { + attachments: [], + availabilityZone: 'eu-central-1b', + clusterArn: 'arn:aws:ecs:eu-central-1:677840207937:cluster/cbis-production-microservices', + connectivity: 'CONNECTED', + connectivityAt: 2021-01-18T16:43:32.008Z, + containerInstanceArn: 'arn:aws:ecs:eu-central-1:677840207937:container-instance/cbis-production-microservices/59f156757059479f8c1a8a742174c15c', + containers: [Array], + cpu: '512', + createdAt: 2021-01-18T16:43:32.008Z, + desiredStatus: 'RUNNING', + enableExecuteCommand: false, + group: 'service:app-configuration', + healthStatus: 'UNKNOWN', + lastStatus: 'RUNNING', + launchType: 'EC2', + memory: '512', + overrides: [Object], + pullStartedAt: 2021-01-18T16:43:32.115Z, + pullStoppedAt: 2021-01-18T16:44:01.115Z, + startedAt: 2021-01-18T16:44:02.115Z, + startedBy: 'ecs-svc/7390572488766464431', + tags: [], + taskArn: 'arn:aws:ecs:eu-central-1:677840207937:task/cbis-production-microservices/7e66abc54a4b457399417f57d77a4582', + taskDefinitionArn: 'arn:aws:ecs:eu-central-1:677840207937:task-definition/cbis-app-configuration-production-app-configuration:2', + version: 2 + } + ], + failures: [] +} +-} +type TaskDetails r + = { cpu :: String + , memory :: String + | r + } + +type Failure + = { arn :: String + , reason :: String + , detail :: String + } + +type DescribeTasksResponse r + = { tasks :: Array (TaskDetails r) + , failures :: Array Failure + } diff --git a/src/AWS/Pricing/EC2/Types.purs b/src/AWS/Pricing/EC2/Types.purs new file mode 100644 index 0000000..dd35ae3 --- /dev/null +++ b/src/AWS/Pricing/EC2/Types.purs @@ -0,0 +1,31 @@ +module AWS.Pricing.EC2.Types where + +import AWS.Pricing.Types (Terms) +import Data.Either (Either) +import Data.Maybe (Maybe) + +type GetEC2ProductsResponse + = { formatVersion :: String + , priceList :: Array (Either String EC2PriceList) + , nextToken :: Maybe String + } + +type EC2Attributes r + = { instanceType :: String + , instanceFamily :: String + , operatingSystem :: String + , vcpu :: String + , servicename :: String + | r + } + +type EC2Product r + = { attributes :: (Either String (EC2Attributes ())) | r } + +type EC2PriceList + = { serviceCode :: String + , version :: String + , publicationDate :: String + , product :: EC2Product () + , terms :: Terms + } diff --git a/src/AWS/Pricing/EC2/Utils.purs b/src/AWS/Pricing/EC2/Utils.purs new file mode 100644 index 0000000..8481094 --- /dev/null +++ b/src/AWS/Pricing/EC2/Utils.purs @@ -0,0 +1,30 @@ +module AWS.Pricing.EC2.Utils where + +import Prelude +import AWS.Core.Util (handleError) +import AWS.Pricing.EC2.Types (EC2Attributes, EC2PriceList, EC2Product) +import AWS.Pricing.Types (InternalPriceList, InternalProduct) +import AWS.Pricing.Utils (toTerms) +import Data.Argonaut (Json, decodeJson) +import Data.Bifunctor (lmap, bimap) +import Data.Either (Either) + +toEC2PriceList :: InternalPriceList -> EC2PriceList +toEC2PriceList pl = + { serviceCode: pl.serviceCode + , version: pl.version + , publicationDate: pl.publicationDate + , product: toEC2Product pl.product + , terms: toTerms pl.terms + } + +toEC2Product :: InternalProduct -> EC2Product () +toEC2Product internalProduct = + { attributes: parseAttributes internalProduct.attributes + } + where + parseAttributes :: Json -> Either String (EC2Attributes ()) + parseAttributes = decodeJson <#> lmap handleError + +parseEC2PriceList :: Json -> Either String EC2PriceList +parseEC2PriceList = decodeJson <#> bimap handleError toEC2PriceList diff --git a/src/AWS/Pricing/ECS/Types.purs b/src/AWS/Pricing/ECS/Types.purs new file mode 100644 index 0000000..dfa1154 --- /dev/null +++ b/src/AWS/Pricing/ECS/Types.purs @@ -0,0 +1,41 @@ +module AWS.Pricing.ECS.Types where + +import Prelude +import Data.Either (Either) +import Data.Maybe (Maybe) +import AWS.Pricing.Types (Terms) + +type GetECSProductsResponse + = { formatVersion :: String + , priceList :: Array (Either String ECSPriceList) + , nextToken :: Maybe String + } + +type ECSAttributes r + = { servicecode :: String + , usagetype :: String + , servicename :: String + , operation :: String + | r + } + +type ECSProduct r + = { attributes :: (Either String (ECSAttributes ())) | r } + +type ECSPriceList + = { serviceCode :: String + , version :: String + , publicationDate :: String + , product :: ECSProduct () + , terms :: Terms + } + +data ECSUsageType + = EUC1FargateEphemeralStorageGBHours + | EUC1FargateGBHours + | EUC1FargatevCPUHoursperCPU + +instance showECSUsageType :: Show ECSUsageType where + show EUC1FargateEphemeralStorageGBHours = "EUC1-Fargate-EphemeralStorage-GB-Hours" + show EUC1FargateGBHours = "EUC1-Fargate-GB-Hours" + show EUC1FargatevCPUHoursperCPU = "EUC1-Fargate-vCPU-Hours:perCPU" diff --git a/src/AWS/Pricing/ECS/Utils.purs b/src/AWS/Pricing/ECS/Utils.purs new file mode 100644 index 0000000..b280c2c --- /dev/null +++ b/src/AWS/Pricing/ECS/Utils.purs @@ -0,0 +1,34 @@ +module AWS.Pricing.ECS.Utils where + +import Prelude +import AWS.Core.Util (handleError) +import AWS.Pricing.ECS.Types + ( ECSPriceList + , ECSProduct + , ECSAttributes + ) +import AWS.Pricing.Types (InternalPriceList, InternalProduct) +import AWS.Pricing.Utils (toTerms) +import Data.Argonaut (Json, decodeJson) +import Data.Bifunctor (lmap, bimap) +import Data.Either (Either) + +toECSPriceList :: InternalPriceList -> ECSPriceList +toECSPriceList pl = + { serviceCode: pl.serviceCode + , version: pl.version + , publicationDate: pl.publicationDate + , product: toECSProduct pl.product + , terms: toTerms pl.terms + } + +toECSProduct :: InternalProduct -> ECSProduct () +toECSProduct internalProduct = + { attributes: parseAttributes internalProduct.attributes + } + where + parseAttributes :: Json -> Either String (ECSAttributes ()) + parseAttributes = decodeJson <#> lmap handleError + +parseECSPriceList :: Json -> Either String ECSPriceList +parseECSPriceList = decodeJson <#> bimap handleError toECSPriceList diff --git a/src/AWS/Pricing/Pricing.js b/src/AWS/Pricing/Pricing.js new file mode 100644 index 0000000..72cfcf9 --- /dev/null +++ b/src/AWS/Pricing/Pricing.js @@ -0,0 +1,10 @@ + +"use strict" + +const Pricing = require('aws-sdk/clients/pricing') + +exports.newPricing = (params) => + () => new Pricing(params) + +exports.getProductsImpl = (client, filters, serviceCode, token, max) => + () => client.getProducts({ Filters: filters, ServiceCode: serviceCode, NextToken: token, MaxResults: max }).promise() diff --git a/src/AWS/Pricing/Pricing.purs b/src/AWS/Pricing/Pricing.purs new file mode 100644 index 0000000..f2daaad --- /dev/null +++ b/src/AWS/Pricing/Pricing.purs @@ -0,0 +1,161 @@ +module AWS.Pricing + ( Pricing + , makeClient + , getEC2Products + , getECSProducts + , getAllEC2Products + ) where + +import Prelude + +import AWS.Core.Client (makeClientHelper) +import AWS.Core.Types (DefaultClientProps) +import AWS.Core.Util (unfoldrM1) +import AWS.Pricing.EC2.Types (GetEC2ProductsResponse, EC2PriceList) +import AWS.Pricing.EC2.Utils (parseEC2PriceList) +import AWS.Pricing.ECS.Types (GetECSProductsResponse) +import AWS.Pricing.ECS.Utils (parseECSPriceList) +import AWS.Pricing.Types (Filter, ServiceCode) +import AWS.Pricing.Types as ServiceCode +import Control.Promise (Promise, toAffE) +import Data.Argonaut (Json) +import Data.Either (Either) +import Data.Function.Uncurried (Fn5, runFn5) +import Data.Maybe (Maybe(..)) +import Data.Newtype (unwrap) +import Data.Nullable (Nullable) +import Data.Nullable as Nullable +import Data.Tuple (Tuple(..)) +import Effect (Effect) +import Effect.Aff (Aff) +import Justifill (justifillVia) +import Justifill.Fillable (class Fillable) +import Justifill.Justifiable (class Justifiable) +import Type.Proxy (Proxy(..)) + +foreign import data Pricing :: Type + +foreign import newPricing :: Json -> Effect Pricing + +makeClient :: + forall r via. + Justifiable { | r } { | via } => + Fillable { | via } DefaultClientProps => + { | r } -> + Effect Pricing +makeClient r = makeClientHelper newPricing props + where + viaProxy :: Proxy { | via } + viaProxy = Proxy + + props :: DefaultClientProps + props = justifillVia viaProxy r + +type InternalFilter + = { "Field" :: String + , "Type" :: String + , "Value" :: String + } + +type InternalGetProductsResponse + = { "FormatVersion" :: String + , "PriceList" :: Array Json + , "NextToken" :: Nullable String + } + +foreign import getProductsImpl :: + Fn5 + Pricing + (Array InternalFilter) + String + (Nullable String) + (Nullable Number) + (Effect (Promise InternalGetProductsResponse)) + +curried :: + Pricing -> + Array Filter -> + ServiceCode -> + Maybe String -> + Maybe Number -> + Aff InternalGetProductsResponse +curried pricing filters serviceCode token max = + ( toAffE + $ runFn5 getProductsImpl + pricing + (filters <#> toInternalFilter) + (show serviceCode) + (Nullable.toNullable token) + (Nullable.toNullable max) + ) + where + toInternalFilter :: Filter -> InternalFilter + toInternalFilter filter = + { "Field": unwrap filter.field + , "Type": show filter.type + , "Value": unwrap filter.value + } + +getEC2Products :: + Pricing -> + Array Filter -> + Maybe String -> + Maybe Number -> + Aff GetEC2ProductsResponse +getEC2Products pricing filters token max = curried pricing filters ServiceCode.AmazonEC2 token max <#> toResponse + where + toResponse :: InternalGetProductsResponse -> GetEC2ProductsResponse + toResponse internal = + { formatVersion: internal."FormatVersion" + , priceList: internal."PriceList" <#> parseEC2PriceList + , nextToken: Nullable.toMaybe internal."NextToken" + } + +getECSProducts :: + Pricing -> + Array Filter -> + Maybe String -> + Maybe Number -> + Aff GetECSProductsResponse +getECSProducts pricing filters token max = curried pricing filters ServiceCode.AmazonECS token max <#> toResponse + where + toResponse :: InternalGetProductsResponse -> GetECSProductsResponse + toResponse internal = + { formatVersion: internal."FormatVersion" + , priceList: internal."PriceList" <#> parseECSPriceList + , nextToken: Nullable.toMaybe internal."NextToken" + } + +getAllEC2Products :: + Pricing -> + Array Filter -> + Aff (Array (Either String EC2PriceList)) +getAllEC2Products api filters = do + initial :: GetEC2ProductsResponse <- getEC2Products api filters Nothing Nothing + next :: Array (Array (Either String EC2PriceList)) <- fetchAllNext initial.nextToken + let + all :: Array (Array (Either String EC2PriceList)) + all = pure initial.priceList <> next + + allFlatten :: Array (Either String EC2PriceList) + allFlatten = all # join + pure allFlatten + where + -- func + getProductsAndNextToken :: + String -> + Aff + ( Tuple + (Array (Either String EC2PriceList)) + (Maybe String) + ) + getProductsAndNextToken currentNextToken = do + products <- getEC2Products api filters (Just currentNextToken) Nothing + let + nextToken = products.nextToken + + priceList = products.priceList + pure $ Tuple priceList nextToken + + fetchAllNext :: Maybe String -> Aff (Array (Array (Either String EC2PriceList))) + fetchAllNext token = unfoldrM1 token getProductsAndNextToken diff --git a/src/AWS/Pricing/Types.purs b/src/AWS/Pricing/Types.purs new file mode 100644 index 0000000..0e84a4f --- /dev/null +++ b/src/AWS/Pricing/Types.purs @@ -0,0 +1,141 @@ +module AWS.Pricing.Types where + +import Prelude +import AWS.Core.Types (decodeAsMap) +import Data.Argonaut (class DecodeJson, Json) +import Data.Argonaut.Encode (class EncodeJson) +import Data.Argonaut.Encode.Encoders (encodeString) +import Data.DateTime (DateTime) +import Data.Map as Map +import Data.Maybe (Maybe) +import Data.Newtype (class Newtype) + +data FilterType + = TERM_MATCH + +instance showFilterType :: Show FilterType where + show TERM_MATCH = "TERM_MATCH" + +newtype FilterField + = FilterField String + +derive instance ntFilterField :: Newtype FilterField _ + +newtype FilterValue + = FilterValue String + +derive instance ntFilterValue :: Newtype FilterValue _ + +type Filter + = { field :: FilterField + , type :: FilterType + , value :: FilterValue + } + +data ServiceCode + = AmazonEC2 + | AmazonECS + +instance showServiceCode :: Show ServiceCode where + show AmazonEC2 = "AmazonEC2" + show AmazonECS = "AmazonECS" + +type InternalProduct + = { attributes :: Json } + +type InternalPriceDimension r + = { description :: String + , unit :: String + , pricePerUnit :: { "USD" :: String } + | r + } + +newtype InternalPriceDimensions + = InternalPriceDimensions (Map.Map String (InternalPriceDimension ())) + +derive newtype instance showPriceDimensions :: Show InternalPriceDimensions + +derive instance ntPriceDimensions :: Newtype InternalPriceDimensions _ + +instance priceDimensionsDecoder :: DecodeJson InternalPriceDimensions where + decodeJson = decodeAsMap >>> map InternalPriceDimensions + +newtype InternalOnDemand + = InternalOnDemand (Map.Map String (InternalPriceDetails ())) + +derive newtype instance showOnDemand :: Show InternalOnDemand + +derive instance ntOnDemand :: Newtype InternalOnDemand _ + +instance onDemandDecoder :: DecodeJson InternalOnDemand where + decodeJson = decodeAsMap >>> map InternalOnDemand + +type InternalPriceDetails r + = { priceDimensions :: InternalPriceDimensions + , effectiveDate :: String + | r + } + +-- there is also "Reserved" prices +-- but at the time of writing we don't need that information +-- type InternalTerms r +type InternalTerms r + = { "OnDemand" :: InternalOnDemand + | r + } + +type InternalPriceList + = { serviceCode :: String + , version :: String + , publicationDate :: String + , product :: InternalProduct + , terms :: InternalTerms () + } + +type Terms + = { "OnDemand" :: OnDemand } + +newtype OnDemand + = OnDemand (Map.Map String PriceDetails) + +derive newtype instance showOnDemandA :: Show OnDemand + +derive instance ntOnDemandA :: Newtype OnDemand _ + +type PriceDetails + = { priceDimensions :: PriceDimensions + , effectiveDate :: Maybe DateTime + } + +newtype PriceDimensions + = PriceDimensions (Map.Map String PriceDimension) + +derive newtype instance showPriceDimensionsA :: Show PriceDimensions + +derive instance ntPriceDimensionsA :: Newtype PriceDimensions _ + +type PriceDimension + = { description :: String + , unit :: PriceUnit + , pricePerUnit :: { "USD" :: String } + } + +data PriceUnit + = Hours + | Quantity + +instance encodeUnit :: EncodeJson PriceUnit where + encodeJson Hours = encodeString "Hrs" + encodeJson Quantity = encodeString "Quantity" + +instance showUnit :: Show PriceUnit where + show Hours = "Hrs" + show Quantity = "Quantity" + +derive instance eqUnit :: Eq PriceUnit + +toUnit :: String -> PriceUnit +toUnit unit = case unit of + "Hrs" -> Hours + "Quantity" -> Quantity + _ -> Hours diff --git a/src/AWS/Pricing/Utils.purs b/src/AWS/Pricing/Utils.purs new file mode 100644 index 0000000..63d41e9 --- /dev/null +++ b/src/AWS/Pricing/Utils.purs @@ -0,0 +1,54 @@ +module AWS.Pricing.Utils where + +import Prelude +import AWS.Core.Types (Region) +import AWS.Pricing.Types (FilterValue(..), InternalOnDemand, InternalPriceDetails, InternalPriceDimension, InternalTerms, OnDemand(..), PriceDetails, PriceDimension, PriceDimensions(..), Terms, toUnit) +import Data.DateTime (DateTime) +import Data.Either (Either, hush) +import Data.Formatter.DateTime (unformatDateTime) +import Data.Newtype (unwrap) + +toTerms :: InternalTerms () -> Terms +toTerms terms = { "OnDemand": toOnDemand terms."OnDemand" } + +toOnDemand :: InternalOnDemand -> OnDemand +toOnDemand onDemand = (unwrap onDemand) <#> toPriceDetails # OnDemand + +toPriceDetails :: InternalPriceDetails () -> PriceDetails +toPriceDetails priceDetails = + { priceDimensions: + (unwrap priceDetails.priceDimensions) + <#> toPriceDimension + # PriceDimensions + , effectiveDate: hush $ parseDateTime priceDetails.effectiveDate + } + +toPriceDimension :: InternalPriceDimension () -> PriceDimension +toPriceDimension priceDimension = + { description: priceDimension.description + , unit: toUnit priceDimension.unit + , pricePerUnit: priceDimension.pricePerUnit + } + +parseDateTime :: String -> Either String DateTime +parseDateTime = unformatDateTime "YYYY-MM-DDTHH:mm:ssZ" + +toLocation :: Region -> FilterValue +toLocation r = case unwrap r of + "eu-central-1" -> FilterValue "EU (Frankfurt)" + "eu-west-1" -> FilterValue "EU (Ireland)" + _ -> FilterValue "EU (Frankfurt)" + +toBoxUsage :: Region -> String -> FilterValue +toBoxUsage region instanceType = case unwrap region of + "eu-central-1" -> FilterValue $ "EUC1-BoxUsage:" <> instanceType + "eu-west-1" -> FilterValue $ "EU-BoxUsage:" <> instanceType + _ -> FilterValue $ "EUC1-BoxUsage:" <> instanceType + +-- "EU-Reservation:" +-- "EU-UnusedBox:" +-- "EU-DedicatedRes:" +-- "EU-BoxUsage:" +-- "EU-UnusedDed:" +-- "EU-DedicatedUsage:" +-- "EU-HostBoxUsage:" \ No newline at end of file diff --git a/src/MainTemp.purs b/src/MainTemp.purs new file mode 100644 index 0000000..9795d21 --- /dev/null +++ b/src/MainTemp.purs @@ -0,0 +1,95 @@ +module MainTemp where + +import Prelude + +import AWS.Core.Types (InstanceId(..), Region(..)) +import AWS.EC2 (DescribeTagsResponse, Filter(..), ResourceTypeName(..)) +import AWS.EC2 (describeInstanceTypeAttribute, describeTags) +import AWS.EC2 as EC2 +import AWS.EC2.Types (Attribute(..)) +import AWS.ECS (describeClusters, describeContainerInstances, describeTasks, listClusters, listContainerInstances, listTasks) +import AWS.ECS as ECS +import AWS.ECS.Types (ClusterArn(..), ContainerInstanceArn(..), TaskArn(..), Tasks) +import AWS.Pricing (getAllEC2Products, getEC2Products, getECSProducts) +import AWS.Pricing as Pricing +import AWS.Pricing.ECS.Types (ECSUsageType(..)) +import AWS.Pricing.Types (FilterField(..), FilterType(..), FilterValue(..), ServiceCode(..)) +import Control.Promise (fromAff) +import Data.Argonaut (encodeJson) +import Data.Array (head) +import Data.Either (Either(..)) +import Data.Maybe (Maybe(..)) +import Effect (Effect) +import Effect.Class.Console (logShow, log) + +mainTemp :: Effect Unit +mainTemp = do + ec2 <- EC2.newEC2 $ encodeJson {} + ecs <- ECS.newECS $ encodeJson {} + pricing <- Pricing.makeClient { region: Region "us-east-1" } + _ <- + fromAff do + -- let + -- filters :: Array Filter + -- filters = [ ResourceType [ Instance ] ] + let + filterLocation = + { type: TERM_MATCH + , field: FilterField "location" + , value: FilterValue "EU (Frankfurt)" + } + -- ECS + filterUsageType = + { type: TERM_MATCH + , field: FilterField "UsageType" + , value: FilterValue (show EUC1FargateGBHours) + } + -- EC2 + filterInstanceType= + { type: TERM_MATCH + , field: FilterField "instanceType" + , value: FilterValue ("c5.2xlarge") + } + filterOperatingSystem= + { type: TERM_MATCH + , field: FilterField "operatingSystem" + , value: FilterValue "Linux" + -- no possibility to find out which operatingSystem is runnning on a given instanceId so far + -- so we will have to query prices for different OperatingSystem and give an approximative price + } + filterUsagetype= + { type: TERM_MATCH + , field: FilterField "usagetype" + , value: FilterValue "EUC1-BoxUsage:c5.2xlarge" + } + filterPreInstalledSw= + { type: TERM_MATCH + , field: FilterField "preInstalledSw" + , value: FilterValue "NA" + } + + -- res <- describeTags ec2 filters + -- res <- describeTasks ecs [ TaskArn "arn:aws:ecs:eu-central-1:677840207937:task/cbis-production-microservices/7e66abc54a4b457399417f57d77a4582" ] (ClusterArn "arn:aws:ecs:eu-central-1:677840207937:cluster/cbis-production-microservices") + -- res <- listClusters ecs + -- res <- listTasks ecs (ClusterArn "arn:aws:ecs:eu-central-1:677840207937:cluster/cbis-production-microservices") (ContainerInstanceArn "arn:aws:ecs:eu-central-1:677840207937:container-instance/cbis-production-microservices/59f156757059479f8c1a8a742174c15c") + -- res <- listContainerInstances ecs (ClusterArn "arn:aws:ecs:eu-central-1:677840207937:cluster/cbis-production-microservices") + -- res <- describeClusters ecs [ClusterArn "arn:aws:ecs:eu-central-1:677840207937:cluster/cbis-production-microservices"] + -- res <- describeContainerInstances ecs (ClusterArn "arn:aws:ecs:eu-central-1:677840207937:cluster/cbis-production-microservices") [ContainerInstanceArn "arn:aws:ecs:eu-central-1:677840207937:container-instance/cbis-production-microservices/59f156757059479f8c1a8a742174c15c"] + + res <- getAllEC2Products + pricing + [ + filterLocation + , filterInstanceType + , filterOperatingSystem + , filterUsagetype + , filterPreInstalledSw + ] + -- res <- getECSProducts pricing [ filterLocation, filfilterUsageType ] AmazonECS Nothing (Just 10.0) + _ <- log $ show res + -- _ <- log $ show res + -- _ <- case res of + -- Left e -> log e + -- Right r -> log $ show r + logShow "Done fromAff" + logShow "Done do"