commit 2ee5dca5bd84ad48c5ebe03cfc1ac5cbc981f49d Author: tmont Date: Tue Sep 21 23:35:42 2021 -0700 I AM ERROR. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a1537b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +node_modules diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1c91dc1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,781 @@ +{ + "name": "iamerrorgenerator", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", + "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.2.1.tgz", + "integrity": "sha512-WX/Wp6sXPhcBWx/w1aSJv3bDJL0ut5Ik6hl7yfqA1pn3cfsahl4rgHzRRXqYfJ+hnhnCqdgadS17wyBbVPsK+w==", + "dev": true, + "requires": { + "@aws-crypto/ie11-detection": "^1.0.0", + "@aws-crypto/sha256-js": "^1.2.1", + "@aws-crypto/supports-web-crypto": "^1.0.0", + "@aws-crypto/util": "^1.2.1", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/sha256-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.1.tgz", + "integrity": "sha512-KtZ4qFDWZy6pKcky6RvwSytR/I8vPX9Z47pXh9sOuTcxjjtcegzS2uupg9vo0vbFcAWkSHVOEmNPh6ygiC3VFQ==", + "dev": true, + "requires": { + "@aws-crypto/util": "^1.2.1", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", + "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/util": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.1.tgz", + "integrity": "sha512-H6Qrl28lzGGXZgLkdP7DQpJ3D3jJagQJugziThcqZCJVUT0HABHJt9EQMiiuf93KcUV/MMoisl56UfCxCFfmWQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.32.0.tgz", + "integrity": "sha512-fGGlLbGzbfT8lWMt26Cr4lXpYN8rofraIK3mW9cUnV4dwFO/4UJw9m35GU/YNsC1MLzTI9Q1e08kZP+1yubvaw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/client-cloudformation": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.33.0.tgz", + "integrity": "sha512-Jfz1okEn7J8tG9fCPtLouVSSUaG1vZtUi9eT+w/GcaoQs+41yQAgdj/gU6jreCf0urS0h/X+T+crNBQbbKiLzQ==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/client-sts": "3.33.0", + "@aws-sdk/config-resolver": "3.33.0", + "@aws-sdk/credential-provider-node": "3.33.0", + "@aws-sdk/fetch-http-handler": "3.32.0", + "@aws-sdk/hash-node": "3.32.0", + "@aws-sdk/invalid-dependency": "3.32.0", + "@aws-sdk/middleware-content-length": "3.32.0", + "@aws-sdk/middleware-host-header": "3.32.0", + "@aws-sdk/middleware-logger": "3.32.0", + "@aws-sdk/middleware-retry": "3.32.0", + "@aws-sdk/middleware-serde": "3.32.0", + "@aws-sdk/middleware-signing": "3.33.0", + "@aws-sdk/middleware-stack": "3.32.0", + "@aws-sdk/middleware-user-agent": "3.32.0", + "@aws-sdk/node-config-provider": "3.32.0", + "@aws-sdk/node-http-handler": "3.32.0", + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/smithy-client": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/url-parser": "3.32.0", + "@aws-sdk/util-base64-browser": "3.32.0", + "@aws-sdk/util-base64-node": "3.32.0", + "@aws-sdk/util-body-length-browser": "3.32.0", + "@aws-sdk/util-body-length-node": "3.32.0", + "@aws-sdk/util-user-agent-browser": "3.32.0", + "@aws-sdk/util-user-agent-node": "3.33.0", + "@aws-sdk/util-utf8-browser": "3.32.0", + "@aws-sdk/util-utf8-node": "3.32.0", + "@aws-sdk/util-waiter": "3.32.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/client-sso": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.33.0.tgz", + "integrity": "sha512-NADcWgmcBFwfe2Fl26MJ8vpO34aGspgASh7WhVpbjN8R8hjxQJTJihpETieZ8foKZTp576LgedOxAHRYgMOiew==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.33.0", + "@aws-sdk/fetch-http-handler": "3.32.0", + "@aws-sdk/hash-node": "3.32.0", + "@aws-sdk/invalid-dependency": "3.32.0", + "@aws-sdk/middleware-content-length": "3.32.0", + "@aws-sdk/middleware-host-header": "3.32.0", + "@aws-sdk/middleware-logger": "3.32.0", + "@aws-sdk/middleware-retry": "3.32.0", + "@aws-sdk/middleware-serde": "3.32.0", + "@aws-sdk/middleware-stack": "3.32.0", + "@aws-sdk/middleware-user-agent": "3.32.0", + "@aws-sdk/node-config-provider": "3.32.0", + "@aws-sdk/node-http-handler": "3.32.0", + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/smithy-client": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/url-parser": "3.32.0", + "@aws-sdk/util-base64-browser": "3.32.0", + "@aws-sdk/util-base64-node": "3.32.0", + "@aws-sdk/util-body-length-browser": "3.32.0", + "@aws-sdk/util-body-length-node": "3.32.0", + "@aws-sdk/util-user-agent-browser": "3.32.0", + "@aws-sdk/util-user-agent-node": "3.33.0", + "@aws-sdk/util-utf8-browser": "3.32.0", + "@aws-sdk/util-utf8-node": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.33.0.tgz", + "integrity": "sha512-5UnPi69MUHO6rhuzBYmxDrZ9wYdUvCiP2S8kp3xPwLEAyMNIrFbMBkuC+BhSAsIlaToxGz1ScouVQH6GFcf46Q==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.33.0", + "@aws-sdk/credential-provider-node": "3.33.0", + "@aws-sdk/fetch-http-handler": "3.32.0", + "@aws-sdk/hash-node": "3.32.0", + "@aws-sdk/invalid-dependency": "3.32.0", + "@aws-sdk/middleware-content-length": "3.32.0", + "@aws-sdk/middleware-host-header": "3.32.0", + "@aws-sdk/middleware-logger": "3.32.0", + "@aws-sdk/middleware-retry": "3.32.0", + "@aws-sdk/middleware-sdk-sts": "3.33.0", + "@aws-sdk/middleware-serde": "3.32.0", + "@aws-sdk/middleware-signing": "3.33.0", + "@aws-sdk/middleware-stack": "3.32.0", + "@aws-sdk/middleware-user-agent": "3.32.0", + "@aws-sdk/node-config-provider": "3.32.0", + "@aws-sdk/node-http-handler": "3.32.0", + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/smithy-client": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/url-parser": "3.32.0", + "@aws-sdk/util-base64-browser": "3.32.0", + "@aws-sdk/util-base64-node": "3.32.0", + "@aws-sdk/util-body-length-browser": "3.32.0", + "@aws-sdk/util-body-length-node": "3.32.0", + "@aws-sdk/util-user-agent-browser": "3.32.0", + "@aws-sdk/util-user-agent-node": "3.33.0", + "@aws-sdk/util-utf8-browser": "3.32.0", + "@aws-sdk/util-utf8-node": "3.32.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.33.0.tgz", + "integrity": "sha512-+2uySfe1B8bxEI8zhqRYTWAajIchjFeamNGaOX5jM6XPLBfBfZYSFgrtqe3d6ra+jsqHXwm/Z1OYUdVkEXKapA==", + "dev": true, + "requires": { + "@aws-sdk/signature-v4": "3.33.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.32.0.tgz", + "integrity": "sha512-L/YL20wmgXY3R+6lZ94aIomPVIwxj4obfZkjSEncFZwBeB1A7UPSOsqrXFwrag5rPwgfyzy6Dgz1sIUYcdH1XQ==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.32.0.tgz", + "integrity": "sha512-jRXqE0nQta91KVNKtVl3Pqc/vveGEaLfWvqhkJEbhVX+myI5pzTLxINNyTR111oBvoq1sFIeqJQY0KT3qn5BMA==", + "dev": true, + "requires": { + "@aws-sdk/node-config-provider": "3.32.0", + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/url-parser": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.33.0.tgz", + "integrity": "sha512-a8UvxsB1+8BSlotqNLleqJzNLUGDInyG9zCAmHRNujkNkkY+1DpJ30e2ZwtBzcz25cx0ULT4OgHHlqETGEXPwg==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.32.0", + "@aws-sdk/credential-provider-imds": "3.32.0", + "@aws-sdk/credential-provider-sso": "3.33.0", + "@aws-sdk/credential-provider-web-identity": "3.32.0", + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/shared-ini-file-loader": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-credentials": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.33.0.tgz", + "integrity": "sha512-aZNYt7BOTkBMdpcdXF5livfGcP5sZRYAnO0i2o6dkjnOJ5nl2p014FS+xJNSk5/rtV3p7n740bQ5mMdz/kngHQ==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.32.0", + "@aws-sdk/credential-provider-imds": "3.32.0", + "@aws-sdk/credential-provider-ini": "3.33.0", + "@aws-sdk/credential-provider-process": "3.32.0", + "@aws-sdk/credential-provider-sso": "3.33.0", + "@aws-sdk/credential-provider-web-identity": "3.32.0", + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/shared-ini-file-loader": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-credentials": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.32.0.tgz", + "integrity": "sha512-9DbcunIMW6Xmpq9mDlNlZ59q23X37uEfi9aESX1fBtu6r2cfbNKPZyY1984GsDLA3jEnXj+LhNympeAD2psAew==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/shared-ini-file-loader": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-credentials": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.33.0.tgz", + "integrity": "sha512-3KyvrpiOeCx93DfelQZz5IRLN49Il4sNpIySVgJSG9WwMVJC/vBHukBwB89hkEUifPtw5lMcKb6MJlEq7+sgxQ==", + "dev": true, + "requires": { + "@aws-sdk/client-sso": "3.33.0", + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/shared-ini-file-loader": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-credentials": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.32.0.tgz", + "integrity": "sha512-0aqG2ioVoekXgTdlYhcbOM3HDsgq7J1SRwib/jpRy/gKa+EeYwk79NI6SnMpSQH8ThHwSK5LCe0SCBj8G5mCCg==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.32.0.tgz", + "integrity": "sha512-gPozFdAjIyj7XiUemJHuwKIFpd3bpA+P5GjYhnWRW/iV2vlmR+q4M8EcgxWyf55ME8ZTj9CpEMGED8u8Hpkrzg==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/querystring-builder": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-base64-browser": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/hash-node": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.32.0.tgz", + "integrity": "sha512-SQf10cM67WuZ1rFKqvxzgKS/rD6B0jM/1CUGHR2p6HfxlWQyGn4ea4fpyqDzZ53D0msmYPx06LmIQtmcc0kMgQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-buffer-from": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.32.0.tgz", + "integrity": "sha512-ISX2d4sXeZSOYk5Bger9VAVigEE0Jgb2xucjqplcg9+Q0/Tm4PwPJTXgYXpc/fGxkVIy535fl/lrHnZZT/tTHA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.32.0.tgz", + "integrity": "sha512-ywBtlNwQzA3971o+cG2WptNhARFQBSM7PX+l/LJA/XwczE0ZPcTVACbSDu+Aqphz0XjFZ8FDoYMTdbZZeVR4wQ==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.32.0.tgz", + "integrity": "sha512-6paddPqlx86OyGCtf2IFVQd4eJWRotpYLCfEcaxno/ihoybhOgSSL3kvRMy77Y168jYjB88kilACzEVrOg8gYA==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.32.0.tgz", + "integrity": "sha512-zL2zj+HU/t4hU/btzyuKU7+Ct3GuyGUCaex1wE1wilLgiMQWlHx6tAVyA6lT3Zie4helHiIEnf1wYShm+Kmv4w==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.32.0.tgz", + "integrity": "sha512-d6HH0SMI0m4U9lHk35zAbovop3ivHreZvcH5jw0A64izZQt5eqRbre+R0sfK+UjC1bARo1Wb+SaHcSDmxrqrJg==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.32.0.tgz", + "integrity": "sha512-i5Uz/Z67kq/whrW+ZROgqz2NKNVZIGIk1V6tFte48jw1L2PMu+AQkgwKufY30p7oxOn0/v1qu2VMz0BBFYVeoQ==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/service-error-classification": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.33.0.tgz", + "integrity": "sha512-svCAHOAg3KXgxlVtrjtmwey8/tc4tkGGpq+8EFajrf0/UMkGSnd7Lg1lelpTsJa02DdSwuww8z7TIysTEe5Z5w==", + "dev": true, + "requires": { + "@aws-sdk/middleware-signing": "3.33.0", + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/signature-v4": "3.33.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.32.0.tgz", + "integrity": "sha512-y3bFjq8Fm9jd0EKbDyohrHtpZLMO2GLabvpNTcQpt/2YOv8wAMPWpCllJXdFAGRav5xkzMJItYFNDuLB5foHyQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.33.0.tgz", + "integrity": "sha512-GBqTM2gAFo/UTRWkTUipbHHyGkGXDOjimQDNscoUyTXeA8q0J7+k1z5ZSJLVtAUge7LOJmE3VSkOEc7C3SDx1w==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/signature-v4": "3.33.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.32.0.tgz", + "integrity": "sha512-tklpaAeAKGQmdbj98unhr/cSh5nJCkPJFuK2R1+LOY57IiQSzKRg+CEF3wDU9DH/ILv6r/z5wxVlXxO8T0b+3Q==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.32.0.tgz", + "integrity": "sha512-lg4Y8Z6EwiNpHEPoOfQtchJEm41xiVyr3wFoVWNShhRncn39FMTVJGx3uqAgh/HLSoDZ4W8MNfm3jUnvUb1rEw==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.32.0.tgz", + "integrity": "sha512-7Ro3loMlm5DA6IGFbSmBqoopgYojm5lQhuZksSI2xPXCBHyu3ym6a39ikjVsEmSQrJdXRiB77XM94fM+jGxjCg==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.32.0", + "@aws-sdk/shared-ini-file-loader": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.32.0.tgz", + "integrity": "sha512-LHO+ikctC+FdPINoh84T5ooioEPjrzYrXpRXa1tufTfVN6DmtaFxukBa0XAGv/PGyL5obfHmi1ErPFSLwBfr9A==", + "dev": true, + "requires": { + "@aws-sdk/abort-controller": "3.32.0", + "@aws-sdk/protocol-http": "3.32.0", + "@aws-sdk/querystring-builder": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/property-provider": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.32.0.tgz", + "integrity": "sha512-RucvDIm2UX45xz0UvypO/KRKR0FmmLgYg3I++Twjl2aA2TGh/xR8AImbhmL6P1u98e9agkSnZVJHBMfMPbqALg==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.32.0.tgz", + "integrity": "sha512-5ORPDE+LGjSoeeaR/LIVVwJN51AvaHo+lQe9gH1jpS6/0nGXlcHOgAPRSz8+gr5rVFvwUx8GnjNSqxChRnfbAQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.32.0.tgz", + "integrity": "sha512-L+C7Nqg/h3gN9TksUrbT1h75+Cdj2tb4OOWcjv4z8Ud88Rc9ZXLEL2cAjKuAKJqWkVHEunm3X2Nm92x3bUNKoQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-uri-escape": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.32.0.tgz", + "integrity": "sha512-iuoVZ469fn0iU4MELLuUDoS9FJeW5UG2rejk6k395QAPSjHQa/6NbBGt0cKUOWloMxli3c8VEprZbnl/QVpujA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.32.0.tgz", + "integrity": "sha512-hzshKuW6x9Qe43wF0dtAS1W/NzeZUUXb/FlV+733Jw+MZlZxVaCiYSTGi8azK1coLNZ5JhesmrRbT5JitoOe/w==", + "dev": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.32.0.tgz", + "integrity": "sha512-d5Djy/mudtIiwk3nRoPm/+7OEwYWgxprLlJN7PB2ehwaolQHOZVEkJtoJ/e5hFEWZ96T7QwsHbEvCrSMNjDRkQ==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.33.0.tgz", + "integrity": "sha512-HuB9dvXV+SYwry6DlV8EHHuh7SlK5jSxLThQ4LOtqkNKC14W+8gQxhu7il/0aDJyCELblEQ+DBmrsB74LOmhGA==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.32.0", + "@aws-sdk/types": "3.32.0", + "@aws-sdk/util-hex-encoding": "3.32.0", + "@aws-sdk/util-uri-escape": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.32.0.tgz", + "integrity": "sha512-FjGujKpctsI18vJGVvZ9FmqAWffvdmT0o6nL3vD8hWoi4O2x05FGpx5rrAPo+wwhOga6ejuKtj3T9lhjU9c2vw==", + "dev": true, + "requires": { + "@aws-sdk/middleware-stack": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/types": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.32.0.tgz", + "integrity": "sha512-ZkB+jFk6FZ9wA9wvQTqv6ao2sPSVeMlUF349NecPGLtpy2c/+RPxO10NmJ8yG9jFfmB0OXLnEPrDR7VinxTHNw==", + "dev": true + }, + "@aws-sdk/url-parser": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.32.0.tgz", + "integrity": "sha512-K7hvWjFTAqfBhg9nP7zdfGqGY4ioOAqfDXCt+LYtoAkVcdyic+LcUgAB9pwxujN0SZ2hJYaBj93ERA/qJu/FVw==", + "dev": true, + "requires": { + "@aws-sdk/querystring-parser": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-base64-browser": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.32.0.tgz", + "integrity": "sha512-fWheT9FmpKWbSqyk+IpiXFADUXOHhEIBf8ipDK4Rghy6NtlipJFYOeg6ACoafRG+1BV9M2zz3WqS3Xfnck3Muw==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-base64-node": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.32.0.tgz", + "integrity": "sha512-Fy3rGPUjWVtuiosUhcKtnuhsCLs7upDWWk1D35op2hRgyUXypYdSD1+mdJyQTUFOrw5P2MlbrvBAbQA3TYv0KA==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.32.0.tgz", + "integrity": "sha512-9Poj9JXMiyEM3mQdM0SgZGl7hjb8KvPS+HO3+BPoC5aDD5d10KXmC3rIxxV4YHM7wMbZZco7qhoyF9fCnXOiaQ==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.32.0.tgz", + "integrity": "sha512-9o4ZhjkGsLBN2WIYHWEuHk4f/oFa17IIh8Errjhub/17MKd5uX5cPVw/Bs4tNIzdFh/mz+bcbOeEnBQirUpoPg==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.32.0.tgz", + "integrity": "sha512-Vt6JQ48jYwnvPMJxv51Eh/DAS2ox/nNETxQjnpMnlKKkXmyxeH1nSQB47rgXkfmw4luvaRdiWCpx5XnU4dMgbQ==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-credentials": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.32.0.tgz", + "integrity": "sha512-iHk7opjLLw8gjJdu2ut4GC+KptsTFVABRg5NNVHE0VDjd2h7kaRFKiAsEgBqD8lqEU+06n+8mOjxKN1reRfnAw==", + "dev": true, + "requires": { + "@aws-sdk/shared-ini-file-loader": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.32.0.tgz", + "integrity": "sha512-N8h5Ci74S+cahVJ0P4BWo4N1kSqsIYYzYylc5lNrrLH6oc34tg48yjJK4mKF3B0jkPZ01sb7yAufS89cPmOtgg==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.32.0.tgz", + "integrity": "sha512-P5sOlu7AhzxhyUtKj4aYK35MrXFrt64XivwgAUo7h+ZUx6iWUEflpurMqm2dExUYNVnpGaeTKkNX8qdvbnDGZw==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.32.0.tgz", + "integrity": "sha512-iFNCobc5OCVtTcNTFTUGB1ib5p+EOLV2s6KYej66dRUxBdioi4a2X63Exx/jOP7jS6TRTc5pTF6B+Z0uKjMe9w==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.32.0.tgz", + "integrity": "sha512-CaDg+lQaZLUwYtMq20FVgK8xz51zNGtolGblpM4ng6pZceH7EKSOgC5/E1VUb7O53vhpVlyVVFM1GD50QFOzcw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.32.0", + "bowser": "^2.11.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.33.0.tgz", + "integrity": "sha512-2xfZHx3hzlqLdvAO/MFfs8ylAqtnFWwAeFVvBv6+CBWjDHvPJvdq2PWrPnr/j5gCmy6BrBPpbzt8mT3VJpAblA==", + "dev": true, + "requires": { + "@aws-sdk/node-config-provider": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.32.0.tgz", + "integrity": "sha512-KjyGj1TFmR5siw5960hKaicdtyQJJDXgiXm0CM7PMXKLgrT8C2/PmVrpF2qYDGpGgfXVRgZNHNMv3XNMAw9vlw==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.32.0.tgz", + "integrity": "sha512-a+CkvoVe4mCXWau+vyEn++Wjj9LhE3vrbqwt7R0knm/ep0SEnMnwEG0KFVogBK6Zfwf2tqAzT/0JFFZvd3DXTg==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.32.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-waiter": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.32.0.tgz", + "integrity": "sha512-kd8RI2A8JO/55FL2AIzDHEd7b5KThU7+l7798fTUt2/2iWjIGDm8srGFCvlQFoo1zcgqtJCHz21x1gRNF2XvzA==", + "dev": true, + "requires": { + "@aws-sdk/abort-controller": "3.32.0", + "@aws-sdk/types": "3.32.0", + "tslib": "^2.3.0" + } + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", + "dev": true + }, + "tail-stack-events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tail-stack-events/-/tail-stack-events-2.1.0.tgz", + "integrity": "sha512-c/GTzZqW7dM/jOyswiLW8VD6iSMXuoyoyFn2cF5kyesAqmtAbuKwtm0Gr+7MYacJ3BsVg0RHkAulnIQnUYgbJw==", + "dev": true + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..83ca536 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "name": "iamerrorgenerator", + "version": "1.0.0", + "devDependencies": { + "@aws-sdk/client-cloudformation": "3.33.0", + "tail-stack-events": "2.1.0" + } +} diff --git a/public/brilliant-363636.png b/public/brilliant-363636.png new file mode 100644 index 0000000..37ed9c0 Binary files /dev/null and b/public/brilliant-363636.png differ diff --git a/public/font/license.txt b/public/font/license.txt new file mode 100644 index 0000000..746c510 --- /dev/null +++ b/public/font/license.txt @@ -0,0 +1,4 @@ +The FontStruction “Zelda II: The Adventure of Link” +(https://fontstruct.com/fontstructions/show/1695575) by Patrick Lauke is +licensed under a Creative Commons Attribution license +(http://creativecommons.org/licenses/by/3.0/). diff --git a/public/font/readme.txt b/public/font/readme.txt new file mode 100644 index 0000000..37fd18b --- /dev/null +++ b/public/font/readme.txt @@ -0,0 +1,16 @@ +The font file in this archive was created using Fontstruct the free, online +font-building tool. +This font was created by Patrick Lauke. +This font has a homepage where this archive and other versions may be found: +https://fontstruct.com/fontstructions/show/1695575 + +Try Fontstruct at https://fontstruct.com +It’s easy and it’s fun. + +Fontstruct is copyright ©2019 Rob Meek + +LEGAL NOTICE: +In using this font you must comply with the licensing terms described in the +file “license.txt” included with this archive. +If you redistribute the font file in this archive, it must be accompanied by all +the other files from this archive, including this one. diff --git a/public/font/zelda-ii-the-adventure-of-link.png b/public/font/zelda-ii-the-adventure-of-link.png new file mode 100644 index 0000000..81fa089 Binary files /dev/null and b/public/font/zelda-ii-the-adventure-of-link.png differ diff --git a/public/font/zelda-ii-the-adventure-of-link.ttf b/public/font/zelda-ii-the-adventure-of-link.ttf new file mode 100644 index 0000000..c1c9cb8 Binary files /dev/null and b/public/font/zelda-ii-the-adventure-of-link.ttf differ diff --git a/public/iamerror-template.png b/public/iamerror-template.png new file mode 100644 index 0000000..43529a7 Binary files /dev/null and b/public/iamerror-template.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..37bf2dd --- /dev/null +++ b/public/index.html @@ -0,0 +1,241 @@ + + + + + I AM ERROR. + + + + + + + + +

I AM ERROR GENERATOR.

+
+
+ +
+ +

+ +

+
+ + + + diff --git a/public/zelda2-error.png b/public/zelda2-error.png new file mode 100644 index 0000000..bc20287 Binary files /dev/null and b/public/zelda2-error.png differ diff --git a/scripts/cfn/iamerror.yaml b/scripts/cfn/iamerror.yaml new file mode 100644 index 0000000..4c8eeba --- /dev/null +++ b/scripts/cfn/iamerror.yaml @@ -0,0 +1,105 @@ +AWSTemplateFormatVersion: "2010-09-09" +Description: "I AM ERROR. generator static site" + +Resources: + IAmErrorSiteBucket: + Type: "AWS::S3::Bucket" + Properties: + BucketName: "iamerrorgenerator.com" + PublicAccessBlockConfiguration: + BlockPublicAcls: false + BlockPublicPolicy: false + IgnorePublicAcls: false + RestrictPublicBuckets: false + DeletionPolicy: Retain + + IAmErrorSiteCachePolicy: + Type: "AWS::CloudFront::CachePolicy" + Properties: + CachePolicyConfig: + Comment: "Cache policy for iamerrorgenerator.com distribution" + DefaultTTL: 300 # five minutes + MaxTTL: 31536000 + MinTTL: 60 + Name: "iamerror-cache-policy" + ParametersInCacheKeyAndForwardedToOrigin: + CookiesConfig: + CookieBehavior: none + EnableAcceptEncodingBrotli: true + EnableAcceptEncodingGzip: true + HeadersConfig: + HeaderBehavior: none + QueryStringsConfig: + QueryStringBehavior: none + + IAmErrorSiteDistribution: + Type: "AWS::CloudFront::Distribution" + Properties: + DistributionConfig: + Aliases: + - iamerrorgenerator.com + - iamerror.tmont.com + Comment: "Frontend proxy for iamerrorgenerator.com" + DefaultCacheBehavior: + AllowedMethods: + - GET + - HEAD + CachedMethods: + - GET + - HEAD + CachePolicyId: !Ref IAmErrorSiteCachePolicy + Compress: true + TargetOriginId: s3-iamerror-bucket + ViewerProtocolPolicy: "redirect-to-https" + DefaultRootObject: "index.html" + Enabled: true + HttpVersion: http2 + IPV6Enabled: true + Origins: + - DomainName: !GetAtt IAmErrorSiteBucket.RegionalDomainName + Id: s3-iamerror-bucket + S3OriginConfig: + OriginAccessIdentity: "" + ViewerCertificate: + AcmCertificateArn: "arn:aws:acm:us-east-1:592283802202:certificate/8bb1c1c8-a76c-44fb-9f3a-bfad0c3a5450" + MinimumProtocolVersion: "TLSv1" + SslSupportMethod: "sni-only" + Tags: + - Key: app + Value: iamerrorgenerator + + IAmErrorSiteDNS: + Type: "AWS::Route53::RecordSetGroup" + Properties: + Comment: "DNS for iamerrorgenerator.com CloudFront proxy" + HostedZoneName: "iamerrorgenerator.com." + RecordSets: + - Name: iamerrorgenerator.com + Type: "A" + AliasTarget: + # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid + HostedZoneId: "Z2FDTNDATAQYW2" + DNSName: !GetAtt IAmErrorSiteDistribution.DomainName + - Name: iamerrorgenerator.com + Type: "AAAA" + AliasTarget: + HostedZoneId: "Z2FDTNDATAQYW2" + DNSName: !GetAtt IAmErrorSiteDistribution.DomainName + + IAmErrorTmontSiteDNS: + Type: "AWS::Route53::RecordSetGroup" + Properties: + Comment: "DNS for iamerror.tmont.com CloudFront proxy" + HostedZoneName: "tmont.com." + RecordSets: + - Name: iamerror.tmont.com + Type: "A" + AliasTarget: + # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid + HostedZoneId: "Z2FDTNDATAQYW2" + DNSName: !GetAtt IAmErrorSiteDistribution.DomainName + - Name: iamerror.tmont.com + Type: "AAAA" + AliasTarget: + HostedZoneId: "Z2FDTNDATAQYW2" + DNSName: !GetAtt IAmErrorSiteDistribution.DomainName diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..41bb676 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -euo pipefail + +readonly thisDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly rootDir="$(dirname "${thisDir}")" + +main() { + SECONDS=0 + echo "copying files to S3..." + aws s3 cp --recursive --acl public-read "${rootDir}/public/" s3://iamerrorgenerator.com/ + + local distId + + echo "querying for CloudFront distribution..." + distId=$( + aws cloudfront list-distributions \ + --query "DistributionList.Items[?contains(Aliases.Items, 'iamerrorgenerator.com')].Id | [0]" \ + --output text + ) + + if [[ -z "${distId}" ]]; then + echo "failed to find cloudfront distribution" + exit 1 + fi + + echo "found distribution \"${distId}\", invalidating CloudFront cache..." + + aws cloudfront create-invalidation \ + --distribution-id "${distId}" \ + --paths '/*' + + echo "all done in ${SECONDS}s" +} + +main "$@" diff --git a/scripts/update-stack.sh b/scripts/update-stack.sh new file mode 100755 index 0000000..f8e9f6a --- /dev/null +++ b/scripts/update-stack.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +set -euo pipefail + +getStackAction() { + local stackName=$1 + local region=$2 + local command="create" + + aws cloudformation describe-stacks \ + --stack-name "${stackName}" \ + --output text \ + --region "${region}" &> /dev/null + + # shellcheck disable=SC2181 + if [[ $? -eq 0 ]]; then + command="update" + fi + + echo "${command}" +} + +checkError() { + # shellcheck disable=SC2181 + if [[ $? -ne 0 ]]; then + echo "$1" + exit 1 + fi +} + +usage() { + cat << USAGE +Updates or creates a CloudFormation stack + +Usage: $0 [--region region] template.yaml + +Options: + + --region region The region to create/update the stack in (us-west-2) + -h|--help Show this message + +Example: + $0 path/to/template.yaml +USAGE +} + +main() { + local cfnFile= + local region=us-west-2 + + parseArgs() { + while [[ $# -gt 0 ]]; do + local key="$1" + shift + + case "${key}" in + -h | --help) + usage + exit 0 + ;; + --region) + region=$1 + shift + ;; + *) + if [[ -n "${cfnFile}" ]]; then + echo "only one template file allowed" + exit 1 + fi + cfnFile="${key}" + ;; + esac + done + } + + parseArgs "$@" + + if [[ ! -f "${cfnFile}" ]]; then + echo "template \"${cfnFile}\" does not exist" + exit 1 + fi + + local stackName + stackName=$(basename "${cfnFile%.*}") + + local action + action=$(getStackAction "${stackName}" "${region}") + local command= + local extraOpts= + if [ "${action}" = "create" ]; then + command="create-stack" + extraOpts="--on-failure DO_NOTHING" + else + command="update-stack" + fi + + local shouldContinue + read -r -p "${action} stack ${stackName} in ${region} (profile: ${AWS_PROFILE}), continue? [y/n] " shouldContinue + if [ "${shouldContinue}" != "y" ]; then + echo "ok bye" + exit + fi + + aws cloudformation ${command} \ + --stack-name "${stackName}" \ + ${extraOpts} \ + --template-body "file://${cfnFile}" \ + --region "${region}" \ + > /dev/null + + checkError "${command} failed" + echo + + local -r tailStackEvents="node_modules/.bin/tail-stack-events" + if [ -x "${tailStackEvents}" ]; then + "${tailStackEvents}" --region "${region}" --stack-name "${stackName}" --die --outputs + fi + + echo + echo "finished in ${SECONDS}s" +} + +main "$@"