I AM ERROR.

This commit is contained in:
tmont 2021-09-21 23:35:42 -07:00
commit 2ee5dca5bd
14 changed files with 1316 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.idea
node_modules

781
package-lock.json generated Normal file
View File

@ -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
}
}
}

8
package.json Normal file
View File

@ -0,0 +1,8 @@
{
"name": "iamerrorgenerator",
"version": "1.0.0",
"devDependencies": {
"@aws-sdk/client-cloudformation": "3.33.0",
"tail-stack-events": "2.1.0"
}
}

BIN
public/brilliant-363636.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

4
public/font/license.txt Normal file
View File

@ -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/).

16
public/font/readme.txt Normal file
View File

@ -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
Its easy and its 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

241
public/index.html Normal file
View File

@ -0,0 +1,241 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>I AM ERROR.</title>
<link rel="icon" type="image/png" href="zelda2-error.png" />
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="I AM ERROR. image generator"/>
<meta property="og:description" content="I AM ERROR. image generator"/>
<meta property="og:title" content="I AM ERROR."/>
<style>
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: sans-serif;
font-size: 16px;
background-color: #2a2a2a;
color: white;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAAAAABzQ+pjAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAUSURBVAjXY9Rk5GBi+vuPhZ2FEQANXQJDZcY4EgAAAABJRU5ErkJggg==');
background-repeat: repeat;
}
h1 {
text-align: center;
font-size: 1rem;
margin: 1rem 0;
}
canvas {
display: none;
}
.render {
box-shadow:
0 0 1px black,
2px 2px 5px rgba(0, 0, 0, 0.75);
border: 2px solid white;
display: inline-block;
}
.render img {
display: block;
}
.container {
text-align: center;
}
@font-face {
font-family: "Zelda II: The Adventure of Link";
src: url("./font/zelda-ii-the-adventure-of-link.ttf");
}
.iamerror-text {
font-family: "Zelda II: The Adventure of Link", sans-serif;
text-shadow: 2px 2px #4240FF;
color: white;
}
label {
display: block;
margin-bottom: 10px;
}
#text {
width: 256px;
height: 150px;
background-color: black;
border: 4px double white;
padding: 2px 10px;
}
</style>
</head>
<body>
<h1><span class="iamerror-text">I AM ERROR GENERATOR.</span></h1>
<div class="container">
<div class="render">
<img width="256" height="240" />
</div>
<canvas id="iamerror" width="256" height="240"></canvas>
<p>
<textarea id="text" class="iamerror-text" placeholder="I AM ERROR." autofocus maxlength="40"></textarea>
</p>
</div>
<script>
(function() {
const colors = {
text: '#FFFFFF',
textShadow: '#4240FF',
background: '#000000',
};
const dimensions = {
left: 127,
top: 63,
width: 80,
height: 52,
};
const samples = [
'i am error.',
'can i eat your ham?',
'the crow flies at midnight.',
'pull my finger.',
'say hi to dark link for me.',
'are you my mother?',
'you shall not pass.',
'it smells like updog in here.',
'i like mary poppins.',
'oh my god, becky.',
'there is a bustle in my hedgerow.',
'you are the man now, dog.',
'want to see a magic trick?',
'yarp.',
'narp?',
'love is the last bastion of hope.',
'my beard is quite luxurious.',
'it is the springtime of my loving.',
'would you have any grey poupon?',
'come with me if you want to live.',
'my tummy feels funny.',
'are you still touching me?',
'your sound card works perfectly.',
'life is pain.',
'say hello to my little friend.',
'please do not make fun of my shirt.',
'bagu? what a terrible name.',
'i thought you were left- handed?',
];
const charWidth = 8;
const charHeight = charWidth;
const lineHeight = charHeight;
const charsPerLine = Math.floor(dimensions.width / charWidth);
const maxLines = Math.floor(dimensions.height / (charHeight + lineHeight));
const templateImg = document.createElement('img');
templateImg.src = './iamerror-template.png';
const canvas = document.querySelector('#iamerror');
const ctx = canvas.getContext('2d');
let imageLoaded = false;
const render = () => {
const text = input.value || samples[Math.floor(Math.random() * samples.length)];
const width = canvas.width;
const height = canvas.height;
ctx.clearRect(0, 0, width, height);
ctx.drawImage(templateImg, 0, 0, width, height);
ctx.font = '7px "Zelda II: The Adventure of Link"';
ctx.textBaseline = 'middle';
const words = text.split(' ').map(word => word.trim());
let lineNum = 0;
let charPos = 0;
while (words.length) {
let word = words.shift();
if (charPos > 0 && charPos + word.length + 1 > charsPerLine) {
// word goes on next line
charPos = 0;
lineNum++;
}
if (charPos > 0) {
word = ' ' + word;
}
const fragments = [ '' ];
let index = 0;
for (let i = 0; i < word.length; i++) {
if (fragments[index].length >= charsPerLine) {
index++;
fragments[index] = '';
}
fragments[index] += word[i];
}
for (const fragment of fragments) {
if (lineNum > maxLines) {
break;
}
const x = dimensions.left + (charPos * charWidth);
const y = dimensions.top + (lineNum * (charHeight + lineHeight));
ctx.fillStyle = colors.textShadow;
ctx.fillText(fragment, x + 1, y + 1);
ctx.fillStyle = colors.text;
ctx.fillText(fragment, x, y);
charPos += fragment.length;
if (charPos >= charsPerLine) {
charPos = 0;
lineNum++;
}
}
}
document.querySelector('.render img').src = canvas.toDataURL('img/png');
};
const input = document.querySelector('#text');
input.addEventListener('input', () => {
if (imageLoaded && fontLoaded) {
render();
}
});
let fontLoaded = false;
templateImg.addEventListener('load', () => {
imageLoaded = true;
if (fontLoaded) {
setTimeout(render, 1);
}
});
const font = new FontFace('"Zelda II: The Adventure of Link"', `url(./font/zelda-ii-the-adventure-of-link.ttf)`);
font.load()
.then(() => {
fontLoaded = true;
if (imageLoaded) {
setTimeout(render, 1);
}
})
.catch((err) => {
console.error('failed to load custom font', err);
});
}());
</script>
</body>
</html>

BIN
public/zelda2-error.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

105
scripts/cfn/iamerror.yaml Normal file
View File

@ -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

36
scripts/deploy.sh Executable file
View File

@ -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 "$@"

123
scripts/update-stack.sh Executable file
View File

@ -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 "$@"