diff --git a/factory_burgers-ui/package-lock.json b/factory_burgers-ui/package-lock.json index 38507d8..6a37076 100644 --- a/factory_burgers-ui/package-lock.json +++ b/factory_burgers-ui/package-lock.json @@ -4162,11 +4162,6 @@ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -5402,9 +5397,9 @@ } }, "eslint": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz", - "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.27.0.tgz", + "integrity": "sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA==", "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.1", @@ -5414,12 +5409,14 @@ "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", @@ -5431,7 +5428,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -5440,7 +5437,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -5472,6 +5469,11 @@ "which": "^2.0.1" } }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, "globals": { "version": "13.8.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", @@ -5550,21 +5552,89 @@ } } }, + "eslint-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz", + "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==", + "requires": { + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "loader-utils": "^2.0.0", + "object-hash": "^2.0.3", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", "requires": { - "debug": "^2.6.9", + "debug": "^3.2.7", "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "find-up": { @@ -5584,11 +5654,6 @@ "path-exists": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -5635,22 +5700,24 @@ } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.23.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.3.tgz", + "integrity": "sha512-wDxdYbSB55F7T5CC7ucDjY641VvKmlRwT0Vxh7PkY1mI4rclVRFWYfsrjDgZvwYYDZ5ee0ZtfFKXowWjqvEoRQ==", "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", - "doctrine": "1.5.0", + "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", "has": "^1.0.3", + "is-core-module": "^2.4.0", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", "tsconfig-paths": "^3.9.0" }, "dependencies": { @@ -5663,18 +5730,85 @@ } }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "locate-path": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "requires": { + "has": "^1.0.3" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } } } }, @@ -8980,28 +9114,29 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -9058,6 +9193,11 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -9780,6 +9920,11 @@ } } }, + "object-hash": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" + }, "object-inspect": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", @@ -11954,37 +12099,37 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "requires": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" }, "dependencies": { "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "pify": "^2.0.0" + "pify": "^3.0.0" } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "requires": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "read-pkg": "^3.0.0" }, "dependencies": { "find-up": { @@ -13789,9 +13934,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.0.tgz", - "integrity": "sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", @@ -13802,9 +13947,9 @@ }, "dependencies": { "ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", + "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -14241,6 +14386,11 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==" + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", diff --git a/factory_burgers-ui/package.json b/factory_burgers-ui/package.json index 6dcb713..2df38c4 100644 --- a/factory_burgers-ui/package.json +++ b/factory_burgers-ui/package.json @@ -8,17 +8,22 @@ "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", "aphrodite": "^2.4.0", + "eslint": "^7.27.0", + "eslint-loader": "^4.0.2", + "eslint-plugin-import": "^2.23.3", "react": "^17.0.2", "react-bootstrap": "^1.6.0", "react-dom": "^17.0.2", "react-scripts": "4.0.3", + "typescript": "^4.2.4", "web-vitals": "^1.0.1" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build && cp -r build/* ../lib/assets", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "lint": "eslint" }, "eslintConfig": { "extends": [ diff --git a/factory_burgers-ui/src/components/Factories.js b/factory_burgers-ui/src/components/Factories.js index 9a91e46..66f94e7 100644 --- a/factory_burgers-ui/src/components/Factories.js +++ b/factory_burgers-ui/src/components/Factories.js @@ -122,9 +122,7 @@ function Factories(props) { } function formData(form) { - const data = new FormData(form); - data.append("authenticity_token", props.csrfToken); - return data; + return new FormData(form); } return ( @@ -169,7 +167,6 @@ function Factories(props) { } Factories.propTypes = { - csrfToken: PropTypes.string, factories: PropTypes.arrayOf(factoryShape), submitPath: PropTypes.string, }; diff --git a/lib/assets/asset-manifest.json b/lib/assets/asset-manifest.json index 36b9bf0..3314f74 100644 --- a/lib/assets/asset-manifest.json +++ b/lib/assets/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "./static/css/main.510d0fb6.chunk.css", - "main.js": "./static/js/main.06049a6c.chunk.js", - "main.js.map": "./static/js/main.06049a6c.chunk.js.map", + "main.js": "./static/js/main.056013c5.chunk.js", + "main.js.map": "./static/js/main.056013c5.chunk.js.map", "runtime-main.js": "./static/js/runtime-main.38f920d2.js", "runtime-main.js.map": "./static/js/runtime-main.38f920d2.js.map", "static/js/2.3ff1dc5f.chunk.js": "./static/js/2.3ff1dc5f.chunk.js", @@ -18,6 +18,6 @@ "static/js/runtime-main.38f920d2.js", "static/js/2.3ff1dc5f.chunk.js", "static/css/main.510d0fb6.chunk.css", - "static/js/main.06049a6c.chunk.js" + "static/js/main.056013c5.chunk.js" ] } \ No newline at end of file diff --git a/lib/assets/index.html b/lib/assets/index.html index d65429f..50371b8 100644 --- a/lib/assets/index.html +++ b/lib/assets/index.html @@ -1 +1 @@ -React App
\ No newline at end of file +React App
\ No newline at end of file diff --git a/lib/assets/static/js/main.056013c5.chunk.js b/lib/assets/static/js/main.056013c5.chunk.js new file mode 100644 index 0000000..0e6729f --- /dev/null +++ b/lib/assets/static/js/main.056013c5.chunk.js @@ -0,0 +1,2 @@ +(this["webpackJsonpfactory_burgers-ui"]=this["webpackJsonpfactory_burgers-ui"]||[]).push([[0],{31:function(e,t,n){},32:function(e,t,n){},33:function(e,t,n){},34:function(e,t,n){},42:function(e,t,n){"use strict";n.r(t);var r=n(0),a=n.n(r),c=n(10),i=n.n(c),o=(n(31),n(32),n(33),n(34),n(1));var s=function(){return Object(o.jsx)("div",{children:"86 on that ... something went wrong."})};var u=function(){return Object(o.jsx)("div",{children:"Coming right up..."})},l=n(11),b=n.n(l),j=n(15),d=n(7),f=n(9),h=n(8),m=n.n(h),O=m.a.shape({name:m.a.string.isRequired}),v=m.a.shape({name:m.a.string.isRequired}),p=(m.a.shape({attributes:m.a.arrayOf(O),name:m.a.string.isRequired,traits:m.a.arrayOf(v)}),n(23)),x=n(6),g=n(26),y=n(13);var w=function(e){return Object(o.jsxs)(x.a.Row,{children:[Object(o.jsxs)(y.a,{children:[Object(o.jsx)(x.a.Label,{children:"Attribute Name"}),Object(o.jsxs)(x.a.Control,{as:"select",disabled:e.disabled,name:"attributes[][name]",className:"form-control",value:e.attribute.name,onChange:function(t){return e.onChangeName(t)},children:[Object(o.jsx)("option",{value:e.attribute.name,children:e.attribute.name}),e.children]})]}),Object(o.jsxs)(y.a,{children:[Object(o.jsx)(x.a.Label,{children:"Value"}),Object(o.jsx)("input",{disabled:e.disabled||!e.attribute.name,name:"attributes[][value]",className:"form-control",value:e.attribute.value,onChange:function(t){return e.onChangeValue(t)}})]})]})};var k=function(e){var t=e.attributes,n=Object(r.useState)([]),a=Object(d.a)(n,2),c=a[0],i=a[1],s=Object(r.useMemo)((function(){return function(e,t){var n=new Set(t.map((function(e){return e.name})));return e.filter((function(e){return!n.has(e.name)}))}(t,c)})).map((function(e){return Object(o.jsx)("option",{value:e.name,children:e.name},e.name)}));function u(e){var t=e.name,n=e.value;i([].concat(Object(g.a)(c),[{name:t,value:n}]))}function l(e,t){var n=c.slice();n.splice(e,1,t),i(n)}return Object(o.jsxs)(x.a.Group,{controlId:"factories.Traits",children:[Object(o.jsx)(x.a.Label,{children:"Pickles or onions?"}),c.map((function(t,n){return Object(o.jsx)(w,{attribute:t,disabled:e.disabled,onChangeName:function(e){return function(e,t){l(e,{name:t.target.value,value:c[e].value})}(n,e)},onChangeValue:function(e){return function(e,t){l(e,{name:c[e].name,value:t.target.value})}(n,e)},children:s},n)})),Object(o.jsx)(w,{attribute:{name:"",value:""},disabled:e.disabled,onChangeName:function(e){return u({name:e.target.value,value:""})},onChangeValue:function(e){return u({name:"",value:e.target.value})},children:s},c.length+1)]})};function C(e,t){return t?"".concat(e.association," (").concat(e.factory.name,", ").concat(e.factory.class_name,")"):"".concat(e.factory.name," (").concat(e.factory.class_name,")")}var S=function(e){var t=e.options,n=e.label,r=e.value,a=e.onChange,c=e.owner;return Object(o.jsxs)(x.a.Group,{controlId:"factories.FactorySelect",children:[Object(o.jsx)(x.a.Label,{children:n}),Object(o.jsx)("input",{name:"factory",list:"factories",autoComplete:"off",className:"form-control",value:r,onChange:a}),Object(o.jsx)("datalist",{id:"factories",children:t.map((function(e){return Object(o.jsx)("option",{value:e.factory.name,children:C(e,c)},C(e,c))}))})]})};var N=function(e){var t=e.association,n=e.owner;return Object(o.jsxs)(o.Fragment,{children:[Object(o.jsx)(x.a.Group,{controlId:"factories.OwnerType",children:Object(o.jsx)(x.a.Control,{type:"hidden",value:n&&n.type||"",name:"owner_type"})}),Object(o.jsx)(x.a.Group,{controlId:"factories.OwnerId",children:Object(o.jsx)(x.a.Control,{type:"hidden",value:n&&n.id||"",name:"owner_id"})}),Object(o.jsx)(x.a.Group,{controlId:"factories.OwnerReflection",children:Object(o.jsx)(x.a.Control,{type:"hidden",value:t||"",name:"owner_association"})})]})};var L=f.a.create({traits:{display:"flex",flexDirection:"column",flexWrap:"wrap",maxHeight:"6em"}}),_=function(e){var t=e.traits;return Object(o.jsxs)(x.a.Group,{controlId:"factories.Traits",children:[Object(o.jsx)(x.a.Label,{children:"How would you like that cooked?"}),Object(o.jsx)("div",{className:Object(f.b)(L.traits),children:t.map((function(t){return Object(o.jsx)(x.a.Check,{type:"checkbox",disabled:e.disabled,id:t.name,name:"traits[".concat(t.name),label:t.name},t.name)}))})]})};function M(){for(var e=arguments.length,t=new Array(e),n=0;n0&&Object(o.jsx)(_,{disabled:e.disabled,traits:h}),j.length>0&&Object(o.jsx)(k,{disabled:e.disabled,attributes:j}),Object(o.jsxs)("div",{className:Object(f.b)(I.buttons),children:[Object(o.jsx)(p.a,{variant:"outline-dark",className:"btn-primary",disabled:e.disabled||!m,type:"submit",children:"Gimme!"}),Object(o.jsx)(p.a,{variant:"outline-dark",className:"btn-danger",disabled:e.disabled,onClick:function(){v.current&&v.current.reset(),u(""),e.startOver()},type:"button",children:"Start Over"})," "]})]})},T=n(25);var F=function(e){var t=e.message||"Something went wrong";return Object(o.jsx)(T.a,{variant:"danger",children:t})};var D=function(){return Object(o.jsx)("svg",{width:"1em",height:"1em",viewBox:"0 0 24 24",children:Object(o.jsxs)("g",{"stroke-width":"2.1",stroke:"#666",fill:"none","stroke-linecap":"round","stroke-linejoin":"round",children:[Object(o.jsx)("polyline",{points:"17 13.5 17 19.5 5 19.5 5 7.5 11 7.5"}),Object(o.jsx)("path",{d:"M14,4.5 L20,4.5 L20,10.5 M20,4.5 L11,13.5"})]})})};var G=f.a.create({active:{boxShadow:"5px 5px 0px #333"},object:{border:"2px solid #222",borderRadius:"1em",display:"flex",flexDirection:"column",padding:"0.5em",marginRight:"0.5em",position:"relative",cursor:"pointer",transition:"background-color 0.2s"},objectDetails:{flex:1,width:"100%"},objectTitle:{flex:0,width:"100%",borderBottom:"2px solid #222",marginBottom:"3px"}}),P=function(e){var t=e.object,n=void 0===t?{}:t,r=n.attributes||{},a=function(e){var t=e.isNew,n=e.isActive;return t?"created":n?"selected":null}({isNew:e.new,isActive:e.active});return Object(o.jsxs)("div",{className:M(Object(f.b)(G.object,e.active&&G.active),a,"background-mayo hoverable"),onClick:e.activate,children:[Object(o.jsxs)("div",{className:Object(f.b)(G.objectTitle),children:[n.type,n.link&&Object(o.jsx)("a",{href:n.link,target:"_blank",rel:"noopener noreferrer",className:"ml-1",children:Object(o.jsx)(D,{})})]}),Object(o.jsx)("div",{className:Object(f.b)(G.objectDetails),children:Object.entries(r).map((function(e){var t=Object(d.a)(e,2),n=t[0],r=t[1];return Object(o.jsx)("div",{children:"".concat(n,": ").concat(r)},n)}))})]})};var B=function(){return Object(o.jsx)("div",{className:"under-construction",children:Object(o.jsx)(P,{object:{type:"building..."}})})};var E=f.a.create({form:{marginBottom:"2em",transition:"opacity 0.5s ease-out",overflow:"hidden"},objectList:{display:"flex",margin:"0.5em 0 1em"}}),q=function(e){var t,n=e.factories,a=Object(r.useState)(!1),c=Object(d.a)(a,2),i=c[0],s=c[1],u=Object(r.useState)(null),l=Object(d.a)(u,2),h=l[0],m=l[1],O=Object(r.useState)(!1),v=Object(d.a)(O,2),p=v[0],x=v[1],g=Object(r.useState)(null),y=Object(d.a)(g,2),w=y[0],k=y[1],C=Object(r.useState)([].concat([])),S=Object(d.a)(C,2),N=S[0],L=S[1],_=Object(r.useState)(null),M=Object(d.a)(_,2),I=M[0],T=M[1],D=n.map((function(e){return{factory:e}})),G=null!==I&&N.length>0&&N[I],q=Object(r.useMemo)((function(){return G&&G.association_factories?G.association_factories.map((function(e){return function(e,t){return{factory:e.find((function(e){return e.name===t.factory_name})),association:t.association_name}}(n,e)})):[]}),[G]),A=G?q:D,J=G?"Would you like fries with that ".concat(G.type,"?"):null;function V(){return(V=Object(j.a)(b.a.mark((function t(n){var r,a,c;return b.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=e.submitPath,t.next=3,fetch(r,{method:"POST",body:n});case 3:return a=t.sent,t.next=6,a.json();case 6:c=t.sent,a.ok?H(c):(console.error(JSON.stringify(c)),U(c.error||"Uh oh, something broke."));case 8:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function H(e){e.ok?(console.log(JSON.stringify(e)),function(e){s(!1),m(null),x(!1),L(N.slice().concat([e])),0===N.length&&T(0);k(N.length)}(e.data)):(console.error(e.error),U(e.error||"Uh oh, something went wrong."))}function U(e){s(!1),m(e),x(!1)}return Object(o.jsxs)("div",{className:"container",children:[Object(o.jsx)("h2",{children:"Order Up!"}),(i||N.length>0)&&Object(o.jsxs)(o.Fragment,{children:[i?"Comin' right up!":"Here you go!",N.length>1&&Object(o.jsxs)("span",{children:[" ","P.S. -- select any object to build out its dependencies."]}),Object(o.jsxs)("div",{className:Object(f.b)(E.objectList),children:[N.map((function(e,t){return Object(o.jsx)(P,{object:e,active:I===t,activate:function(){return function(e){k(null),T(e)}(t)},new:w===t},t)})),i&&Object(o.jsx)(B,{})]})]}),h&&Object(o.jsx)(F,{message:h}),Object(o.jsx)("div",{className:Object(f.b)(E.form),children:Object(o.jsx)(R,{owner:G?(t=G,{type:t.type,id:t.attributes.id}):null,blueprints:A,disabled:p,handleSubmit:function(e){var t;e.preventDefault(),s(!0),m(null),x(!0),function(e){V.apply(this,arguments)}((t=e.target,new FormData(t)))},startOver:function(){k(null),k(null),L([]),T(null)},inquiry:J})})]})};function A(){return fetch("./data").then((function(e){return e.json()}))}var J=function(){var e=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=Object(r.useState)(null),a=Object(d.a)(n,2),c=a[0],i=a[1],o=Object(r.useState)(0===t.length),s=Object(d.a)(o,2),u=s[0],l=s[1],f=Object(r.useState)(null),h=Object(d.a)(f,2),m=h[0],O=h[1];function v(){return p.apply(this,arguments)}function p(){return(p=Object(j.a)(b.a.mark((function t(){return b.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e());case 1:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function x(){l(!1)}return Object(r.useEffect)((function(){l(!0),v().then(O).catch(i).then(x)}),t),Object(r.useMemo)((function(){return{error:c,fetching:u,response:m}}),[c,u,m])}(A);return Object(r.useEffect)((function(){console.log(e)}),[e]),Object(o.jsxs)("div",{className:"App",children:[Object(o.jsx)("header",{children:Object(o.jsx)("div",{class:"header-text",children:"testing"})}),Object(o.jsxs)("main",{children:[e.fetching&&Object(o.jsx)(u,{}),e.error&&Object(o.jsx)(s,{}),e.response&&Object(o.jsx)(q,{csrfToken:"",submitPath:"./build",factories:e.response})]})]})},V=function(e){e&&e instanceof Function&&n.e(3).then(n.bind(null,44)).then((function(t){var n=t.getCLS,r=t.getFID,a=t.getFCP,c=t.getLCP,i=t.getTTFB;n(e),r(e),a(e),c(e),i(e)}))};i.a.render(Object(o.jsx)(a.a.StrictMode,{children:Object(o.jsx)(J,{})}),document.getElementById("root")),V()}},[[42,1,2]]]); +//# sourceMappingURL=main.056013c5.chunk.js.map \ No newline at end of file diff --git a/lib/assets/static/js/main.056013c5.chunk.js.map b/lib/assets/static/js/main.056013c5.chunk.js.map new file mode 100644 index 0000000..c44d244 --- /dev/null +++ b/lib/assets/static/js/main.056013c5.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["components/Error.js","components/Fetching.js","lib/shapes.js","components/partials/AttributeRow.js","components/partials/Attributes.js","components/partials/FactorySelection.js","components/partials/FormFieldsForOwner.js","components/partials/Traits.js","components/framework.js","components/FactoryForm.js","components/FactoryMalfunction.js","components/icons/ExternalLinkIcon.js","components/ObjectCard.js","components/ObjectUnderConstruction.js","components/Factories.js","lib/api.js","App.js","lib/hooks.js","reportWebVitals.js","index.js"],"names":["Error","Fetching","attributesShape","PropTypes","shape","name","string","isRequired","traitsShape","attributes","arrayOf","traits","AttributeRow","props","Form","Row","Col","Label","Control","as","disabled","className","value","attribute","onChange","event","onChangeName","children","onChangeValue","Traits","useState","inputAttributes","setInputAttributes","remainingAttributeOptions","useMemo","a","b","bNames","Set","map","item","filter","has","attrDiff","attr","addAttribute","replaceAttribute","ii","replacement","newAttributes","slice","splice","Group","controlId","target","setAttributeName","setAttributeValue","length","displayName","blueprint","owner","association","factory","class_name","FactorySelection","options","label","list","autoComplete","id","FormFieldsForOwner","type","styles","StyleSheet","create","display","flexDirection","flexWrap","maxHeight","css","trait","Check","classes","classNames","x","join","buttons","justifyContent","FactoryForm","blueprints","inquiry","factoryInput","setFactoryInput","indexedBluePrints","items","func","indexed","forEach","indexBy","selectedBlueprint","validSelection","prevOwner","ref","useRef","useEffect","current","usePrevious","other","ownerType","ownerId","otherOwnerType","otherOwnerId","sameOwner","form","onSubmit","handleSubmit","Attributes","Button","variant","onClick","reset","startOver","FactoryMalfunction","message","Alert","ExternalLinkIcon","width","height","viewBox","stroke-width","stroke","fill","stroke-linecap","stroke-linejoin","points","d","active","boxShadow","object","border","borderRadius","padding","marginRight","position","cursor","transition","objectDetails","flex","objectTitle","borderBottom","marginBottom","ObjectCard","isNew","isActive","animationClass","new","activate","link","href","rel","Object","entries","ObjectUnderConstruction","overflow","objectList","margin","Factories","factories","constructing","setConstructing","error","setError","fetching","setFetching","newObjectIndex","setNewObjectIndex","objects","setObjects","selectedObjectIndex","setSelectedObjectIndex","factoryList","selectedObject","associationFactories","association_factories","find","f","factory_name","association_name","findAssociationFactory","data","url","submitPath","fetch","method","body","response","json","responseData","ok","handleResponseData","console","JSON","stringify","handleSubmitError","log","concat","handleObject","selectObject","preventDefault","submit","FormData","index","then","res","App","loadFn","dependencies","setResponse","asyncFetch","done","catch","useRemoteData","api","class","csrfToken","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"gSAQeA,MANf,WACE,OACE,wECIWC,MANf,WACE,OACE,sD,uDCFEC,EAAkBC,IAAUC,MAAM,CACtCC,KAAMF,IAAUG,OAAOC,aAGnBC,EAAcL,IAAUC,MAAM,CAClCC,KAAMF,IAAUG,OAAOC,a,GAGJJ,IAAUC,MAAM,CACnCK,WAAYN,IAAUO,QAAQR,GAC9BG,KAAMF,IAAUG,OAAOC,WACvBI,OAAQR,IAAUO,QAAQF,K,8BCoCbI,MA1Cf,SAAsBC,GACpB,OACE,eAACC,EAAA,EAAKC,IAAN,WACE,eAACC,EAAA,EAAD,WACE,cAACF,EAAA,EAAKG,MAAN,6BACA,eAACH,EAAA,EAAKI,QAAN,CACEC,GAAG,SACHC,SAAUP,EAAMO,SAChBf,KAAI,qBACJgB,UAAU,eACVC,MAAOT,EAAMU,UAAUlB,KACvBmB,SAAU,SAAAC,GAAK,OAAIZ,EAAMa,aAAaD,IANxC,UAQE,wBAAQH,MAAOT,EAAMU,UAAUlB,KAA/B,SAAsCQ,EAAMU,UAAUlB,OACrDQ,EAAMc,eAGX,eAACX,EAAA,EAAD,WACE,cAACF,EAAA,EAAKG,MAAN,oBACA,uBACEG,SAAUP,EAAMO,WAAaP,EAAMU,UAAUlB,KAC7CA,KAAI,sBACJgB,UAAU,eACVC,MAAOT,EAAMU,UAAUD,MACvBE,SAAU,SAAAC,GAAK,OAAIZ,EAAMe,cAAcH,aCiDlCI,MAjEf,SAAgBhB,GACd,IAAQJ,EAAeI,EAAfJ,WAER,EAA8CqB,mBAAS,IAAvD,mBAAOC,EAAP,KAAwBC,EAAxB,KAGMC,EAFsBC,mBAAQ,kBATtC,SAAkBC,EAAGC,GACnB,IAAMC,EAAS,IAAIC,IAAIF,EAAEG,KAAI,SAAAC,GAAI,OAAIA,EAAKnC,SAC1C,OAAO8B,EAAEM,QAAO,SAAAD,GAAI,OAAKH,EAAOK,IAAIF,EAAKnC,SAOCsC,CAASlC,EAAYsB,MAETQ,KAAI,SAAAK,GAAI,OAC5D,wBAAwBtB,MAAOsB,EAAKvC,KAApC,SAA2CuC,EAAKvC,MAAnCuC,EAAKvC,SAGpB,SAASwC,EAAT,GAAsC,IAAfxC,EAAc,EAAdA,KAAMiB,EAAQ,EAARA,MAC3BU,EAAmB,GAAD,mBAAKD,GAAL,CAAsB,CAAC1B,OAAMiB,YAajD,SAASwB,EAAiBC,EAAIC,GAC5B,IAAMC,EAAgBlB,EAAgBmB,QACtCD,EAAcE,OAAOJ,EAAI,EAAGC,GAC5BhB,EAAmBiB,GAGrB,OACE,eAACnC,EAAA,EAAKsC,MAAN,CAAYC,UAAU,mBAAtB,UACE,cAACvC,EAAA,EAAKG,MAAN,iCAECc,EAAgBQ,KAAI,SAACK,EAAMG,GAAP,OACnB,cAAC,EAAD,CAEExB,UAAWqB,EACXxB,SAAUP,EAAMO,SAChBM,aAAc,SAAAD,GAAK,OAzB3B,SAA0BsB,EAAItB,GAE5BqB,EAAiBC,EADG,CAAC1C,KAAMoB,EAAM6B,OAAOhC,MAAOA,MAAOS,EAAgBgB,GAAIzB,QAwB7CiC,CAAiBR,EAAItB,IAC5CG,cAAe,SAAAH,GAAK,OArB5B,SAA2BsB,EAAItB,GAE7BqB,EAAiBC,EADG,CAAC1C,KAAM0B,EAAgBgB,GAAI1C,KAAMiB,MAAOG,EAAM6B,OAAOhC,QAoB3CkC,CAAkBT,EAAItB,IALhD,SAOGQ,GANIc,MAUT,cAAC,EAAD,CAEExB,UAAW,CAAClB,KAAM,GAAIiB,MAAO,IAC7BF,SAAUP,EAAMO,SAChBM,aAAc,SAAAD,GAAK,OAAIoB,EAAa,CAACxC,KAAMoB,EAAM6B,OAAOhC,MAAOA,MAAO,MACtEM,cAAe,SAAAH,GAAK,OAAIoB,EAAa,CAACxC,KAAM,GAAIiB,MAAOG,EAAM6B,OAAOhC,SALtE,SAOGW,GANIF,EAAgB0B,OAAS,OCtDtC,SAASC,EAAYC,EAAWC,GAC9B,OAAIA,EACI,GAAN,OAAUD,EAAUE,YAApB,aAAoCF,EAAUG,QAAQzD,KAAtD,aAA+DsD,EAAUG,QAAQC,WAAjF,KAEM,GAAN,OAAUJ,EAAUG,QAAQzD,KAA5B,aAAqCsD,EAAUG,QAAQC,WAAvD,KA4CWC,MAxCf,SAA0BnD,GACxB,IAAQoD,EAA2CpD,EAA3CoD,QAASC,EAAkCrD,EAAlCqD,MAAO5C,EAA2BT,EAA3BS,MAAOE,EAAoBX,EAApBW,SAAUoC,EAAU/C,EAAV+C,MACzC,OACE,eAAC9C,EAAA,EAAKsC,MAAN,CAAYC,UAAU,0BAAtB,UACE,cAACvC,EAAA,EAAKG,MAAN,UAAaiD,IACb,uBACE7D,KAAK,UACL8D,KAAK,YACLC,aAAa,MACb/C,UAAU,eACVC,MAAOA,EACPE,SAAUA,IAEZ,0BAAU6C,GAAG,YAAb,SACGJ,EAAQ1B,KAAI,SAAAoB,GAAS,OACpB,wBAA4CrC,MAAOqC,EAAUG,QAAQzD,KAArE,SACGqD,EAAYC,EAAWC,IADbF,EAAYC,EAAWC,aCa/BU,MAtCf,SAA4BzD,GAC1B,IAAQgD,EAAuBhD,EAAvBgD,YAAaD,EAAU/C,EAAV+C,MAErB,OACE,qCACE,cAAC9C,EAAA,EAAKsC,MAAN,CAAYC,UAAU,sBAAtB,SACE,cAACvC,EAAA,EAAKI,QAAN,CACEqD,KAAK,SACLjD,MAAOsC,GAASA,EAAMW,MAAQ,GAC9BlE,KAAK,iBAGT,cAACS,EAAA,EAAKsC,MAAN,CAAYC,UAAU,oBAAtB,SACE,cAACvC,EAAA,EAAKI,QAAN,CACEqD,KAAK,SACLjD,MAAOsC,GAASA,EAAMS,IAAM,GAC5BhE,KAAK,eAGT,cAACS,EAAA,EAAKsC,MAAN,CAAYC,UAAU,4BAAtB,SACE,cAACvC,EAAA,EAAKI,QAAN,CACEqD,KAAK,SACLjD,MAAOuC,GAAe,GACtBxD,KAAK,4BCOf,IAAMmE,EAASC,IAAWC,OAAO,CAC/B/D,OAAQ,CACNgE,QAAS,OACTC,cAAe,SACfC,SAAU,OACVC,UAAW,SAIAjD,EApCf,SAAgBhB,GACd,IAAQF,EAAWE,EAAXF,OAER,OACE,eAACG,EAAA,EAAKsC,MAAN,CAAYC,UAAU,mBAAtB,UACE,cAACvC,EAAA,EAAKG,MAAN,8CACA,qBAAKI,UAAW0D,YAAIP,EAAO7D,QAA3B,SACGA,EAAO4B,KAAI,SAAAyC,GAAK,OACf,cAAClE,EAAA,EAAKmE,MAAN,CAEEV,KAAK,WACLnD,SAAUP,EAAMO,SAChBiD,GAAIW,EAAM3E,KACVA,KAAI,iBAAY2E,EAAM3E,MACtB6D,MAAOc,EAAM3E,MALR2E,EAAM3E,eChBhB,SAAS6E,IAAwB,IAAD,uBAAZC,EAAY,yBAAZA,EAAY,gBACrC,OAAOA,EAAW1C,QAAO,SAAA2C,GAAC,OAAIA,KAAGC,KAAK,KCuGxC,IAAMb,EAASC,IAAWC,OAAO,CAC/BY,QAAS,CACPX,QAAS,OACTY,eAAgB,mBAILC,EAjGf,SAAqB3E,GACnB,IAAM4E,EAAa5E,EAAM4E,YAAc,GACjC7B,EAAQ/C,EAAM+C,MACd8B,EAAU7E,EAAM6E,SAAW,iBAEjC,EAAwC5D,mBAAS,IAAjD,mBAAO6D,EAAP,KAAqBC,EAArB,KAOMC,EAAoB3D,mBAAQ,kBDtB7B,SAAiB4D,EAAOC,GAC7B,IAAMC,EAAU,GAEhB,OADAF,EAAMG,SAAQ,SAAAzD,GAAI,OAAIwD,EAAQD,EAAKvD,IAASA,KACrCwD,ECmBiCE,CAAQT,GAAY,SAAA9B,GAAS,OAAIA,EAAUG,QAAQzD,UAAO,CAACoF,IAC7FU,EAAoBjE,mBAAQ,kBAAM2D,EAAkBF,KAAe,CAACA,IACpElF,EAAayB,mBAAQ,kBAAMiE,GAAqBA,EAAkBrC,QAAQrD,YAAc,KAAI,CAAC0F,IAC7FxF,EAASuB,mBAAQ,kBAAMiE,GAAqBA,EAAkBrC,QAAQnD,QAAU,KAAI,CAACwF,IACrFC,IAAmBD,EAEnBE,EDtBD,SAAqB/E,GAC1B,IAAMgF,EAAMC,mBAIZ,OAHAC,qBAAU,WACRF,EAAIG,QAAUnF,KAETgF,EAAIG,QCiBOC,CAAY7F,EAAM+C,OAUpC4C,qBAAU,YARV,SAAmB5C,EAAO+C,GACxB,IAAMC,EAAYhD,GAASA,EAAMW,KAC3BsC,EAAUjD,GAASA,EAAMS,GACzByC,EAAiBH,GAASA,EAAMpC,KAChCwC,EAAeJ,GAASA,EAAMtC,GACpC,OAAOuC,IAAcE,GAAkBD,GAAWE,GAI7CC,CAAUnG,EAAM+C,MAAOyC,IAAcT,EAAgB,MACzD,CAAC/E,EAAM+C,QAEV,IAAMqD,EAAOV,iBAAO,MAQpB,OACE,eAACzF,EAAA,EAAD,CAAMwF,IAAKW,EAAMC,SAAUrG,EAAMsG,aAAjC,UAEE,cAAC,EAAD,CACElD,QAASwB,EACTvB,MAAOwB,EACPpE,MAAOqE,EACPnE,SAxCN,SAAuBC,GACrB,IAAMH,EAAQG,EAAM6B,OAAOhC,MAC3BsE,EAAgBtE,IAuCZsC,MAAOA,IAGT,cAAC,EAAD,CAAoBA,MAAOA,EAAOC,YAAasC,GAAqBA,EAAkBtC,cAErFlD,EAAO8C,OAAS,GACf,cAAC,EAAD,CAAQrC,SAAUP,EAAMO,SAAUT,OAAQA,IAG3CF,EAAWgD,OAAS,GACnB,cAAC2D,EAAD,CAAYhG,SAAUP,EAAMO,SAAUX,WAAYA,IAGpD,sBAAKY,UAAW0D,YAAIP,EAAOc,SAA3B,UACE,cAAC+B,EAAA,EAAD,CAAQC,QAAQ,eAAejG,UAAU,cAAcD,SAAUP,EAAMO,WAAagF,EAAgB7B,KAAK,SAAzG,oBAGA,cAAC8C,EAAA,EAAD,CAAQC,QAAQ,eAAejG,UAAU,aAAaD,SAAUP,EAAMO,SAAUmG,QA/BtF,WACEN,EAAKR,SAAWQ,EAAKR,QAAQe,QAC7B5B,EAAgB,IAChB/E,EAAM4G,aA4BkGlD,KAAK,SAAzG,wBAEU,W,QCjEHmD,MAbf,SAA4B7G,GAC1B,IAAM8G,EAAU9G,EAAM8G,SAAW,uBACjC,OACE,cAACC,EAAA,EAAD,CAAON,QAAQ,SAAf,SACGK,KCIQE,MAXf,WACE,OACE,qBAAKC,MAAM,MAAMC,OAAO,MAAMC,QAAQ,YAAtC,SACE,oBAAGC,eAAa,MAAMC,OAAO,OAAOC,KAAK,OAAOC,iBAAe,QAAQC,kBAAgB,QAAvF,UACE,0BAAUC,OAAO,wCACjB,sBAAMC,EAAE,oDCgDhB,IAAM/D,EAASC,IAAWC,OAAO,CAC/B8D,OAAQ,CACNC,UAAW,oBAEbC,OAAQ,CACNC,OAAQ,iBACRC,aAAc,MACdjE,QAAS,OACTC,cAAe,SACfiE,QAAS,QACTC,YAAa,QACbC,SAAU,WACVC,OAAQ,UACRC,WAAY,yBAEdC,cAAe,CACbC,KAAM,EACNrB,MAAO,QAETsB,YAAa,CACXD,KAAM,EACNrB,MAAO,OACPuB,aAAc,iBACdC,aAAc,SAIHC,EA/Df,SAAoB1I,GAClB,MAAwBA,EAAhB6H,cAAR,MAAiB,GAAjB,EACMjI,EAAaiI,EAAOjI,YAAc,GAClCY,EAbR,YAA8C,IAApBmI,EAAmB,EAAnBA,MAAOC,EAAY,EAAZA,SAC/B,OAAID,EACK,UACEC,EACF,WAEA,KAOSC,CAAe,CAACF,MAAO3I,EAAM8I,IAAKF,SAAU5I,EAAM2H,SACpE,OACE,sBAAKnH,UAAW6D,EAAQH,YAAIP,EAAOkE,OAAQ7H,EAAM2H,QAAUhE,EAAOgE,QAASnH,EAAW,6BAA8BkG,QAAS1G,EAAM+I,SAAnI,UACE,sBAAKvI,UAAW0D,YAAIP,EAAO4E,aAA3B,UACGV,EAAOnE,KACPmE,EAAOmB,MACN,mBAAGC,KAAMpB,EAAOmB,KAAMvG,OAAO,SAASyG,IAAI,sBAAsB1I,UAAU,OAA1E,SACE,cAAC,EAAD,SAIN,qBAAKA,UAAW0D,YAAIP,EAAO0E,eAA3B,SACGc,OAAOC,QAAQxJ,GAAY8B,KAAI,mCAAElC,EAAF,KAAQiB,EAAR,YAC9B,wCACMjB,EADN,aACeiB,IADLjB,YCrBL6J,MAVf,WACE,OACE,qBAAK7I,UAAU,qBAAf,SACE,cAAC,EAAD,CACEqH,OAAQ,CAACnE,KAAM,oBCqKvB,IAAMC,EAASC,IAAWC,OAAO,CAC/BuC,KAAM,CACJqC,aAAc,MACdL,WAAY,wBACZkB,SAAU,UAEZC,WAAY,CACVzF,QAAS,OACT0F,OAAQ,iBAIGC,EA/Jf,SAAmBzJ,GACjB,IARgB6H,EAQR6B,EAAc1J,EAAd0J,UAMR,EAAwCzI,oBAAS,GAAjD,mBAAO0I,EAAP,KAAqBC,EAArB,KACA,EAA0B3I,mBAAS,MAAnC,mBAAO4I,EAAP,KAAcC,EAAd,KACA,EAAgC7I,oBAAS,GAAzC,mBAAO8I,EAAP,KAAiBC,EAAjB,KACA,EAA4C/I,mBAAS,MAArD,mBAAOgJ,EAAP,KAAuBC,EAAvB,KACA,EAA8BjJ,mBAAS,GAAD,OANjB,KAMrB,mBAAOkJ,EAAP,KAAgBC,EAAhB,KACA,EAAsDnJ,mBAAS,MAA/D,mBAAOoJ,EAAP,KAA4BC,EAA5B,KAEMC,EAAcb,EAAUhI,KAAI,SAAAuB,GAAO,MAAK,CAACA,cACzCuH,EAAyC,OAAxBH,GAAgCF,EAAQvH,OAAS,GAAKuH,EAAQE,GAE/EI,EAAuBpJ,mBAAQ,WACnC,OAAKmJ,GAAmBA,EAAeE,sBACbF,EAAeE,sBAAsBhJ,KAC7D,SAAAC,GAAI,OAlCV,SAAgC+H,EAAW1G,GACzC,MAAO,CACLC,QAASyG,EAAUiB,MAAK,SAAAC,GAAC,OAAIA,EAAEpL,OAASwD,EAAY6H,gBACpD7H,YAAaA,EAAY8H,kBA+BfC,CAAuBrB,EAAW/H,MAF2B,KAKtE,CAAC6I,IAEE5F,EAAa4F,EAAiBC,EAAuBF,EACrD1F,EAAU2F,EAAc,yCAAqCA,EAAe9G,KAApD,KAA8D,KA1BpE,4CAiDxB,WAAsBsH,GAAtB,mBAAA1J,EAAA,6DACQ2J,EAAMjL,EAAMkL,WADpB,SAGyBC,MAAMF,EAAK,CAChCG,OAAQ,OACRC,KAAML,IALV,cAGQM,EAHR,gBAQ6BA,EAASC,OARtC,OAQQC,EARR,OAUOF,EAASG,GAKZC,EAAmBF,IAHnBG,QAAQ9B,MAAM+B,KAAKC,UAAUL,IAC7BM,EAAkBN,EAAa3B,OAAS,4BAb5C,4CAjDwB,sBAoExB,SAAS6B,EAAmBF,GACtBA,EAAaC,IAEfE,QAAQI,IAAIH,KAAKC,UAAUL,IAe/B,SAAsB3D,GACpB+B,GAAgB,GAChBE,EAAS,MACTE,GAAY,GACZI,EAAWD,EAAQ9H,QAAQ2J,OAAO,CAACnE,KACZ,IAAnBsC,EAAQvH,QACV0H,EAAuB,GAEzBJ,EAAkBC,EAAQvH,QAtBxBqJ,CAAaT,EAAaR,QAG1BW,QAAQ9B,MAAM2B,EAAa3B,OAC3BiC,EAAkBN,EAAa3B,OAAS,iCAI5C,SAASiC,EAAkBhF,GACzB8C,GAAgB,GAChBE,EAAShD,GACTkD,GAAY,GAkBd,OACE,sBAAKxJ,UAAU,YAAf,UACE,4CAEEmJ,GAAiBQ,EAAQvH,OAAS,IAClC,qCACG+G,EAAe,mBAAqB,eACpCQ,EAAQvH,OAAS,GAChB,iCAAO,IAAP,8DAEF,sBAAKpC,UAAW0D,YAAIP,EAAO4F,YAA3B,UACGY,EAAQzI,KAAI,SAACmG,EAAQ3F,GAAT,OACX,cAAC,EAAD,CAEE2F,OAAQA,EACRF,OAAQ0C,IAAwBnI,EAChC6G,SAAU,kBAlFxB,SAAsB7G,GACpBgI,EAAkB,MAClBI,EAAuBpI,GAgFKgK,CAAahK,IAC7B4G,IAAKmB,IAAmB/H,GAJnBA,MAORyH,GAAgB,cAAC,EAAD,UAKtBE,GAAS,cAAC,EAAD,CAAoB/C,QAAS+C,IAEvC,qBAAKrJ,UAAW0D,YAAIP,EAAOyC,MAA3B,SACE,cAAC,EAAD,CACErD,MAAOyH,GAzIC3C,EAyIyB2C,EAxIlC,CACL9G,KAAMmE,EAAOnE,KACbF,GAAIqE,EAAOjI,WAAW4D,KAsImC,KACnDoB,WAAYA,EACZrE,SAAUwJ,EACVzD,aA7FR,SAAsB1F,GAKpB,IAoDgBwF,EAxDhBxF,EAAMuL,iBACNvC,GAAgB,GAChBE,EAAS,MACTE,GAAY,GA5CU,oCA8CtBoC,EAmDgBhG,EApDMxF,EAAM6B,OAqDrB,IAAI4J,SAASjG,MAoCdQ,UA1GR,WACEsD,EAAkB,MAClBA,EAAkB,MAClBE,EAAW,IACXE,EAAuB,OAuGjBzF,QAASA,UCjKZ,SAASyH,IACd,OAAOnB,MAAM,UACVoB,MAAK,SAAAC,GAAG,OAAIA,EAAIjB,UCoCNkB,MAzBf,WACE,IAAM/C,ECGD,SAAuBgD,GAA4B,IAApBC,EAAmB,uDAAJ,GACnD,EAA0B1L,mBAAS,MAAnC,mBAAO4I,EAAP,KAAcC,EAAd,KACA,EAAgC7I,mBAAiC,IAAxB0L,EAAa/J,QAAtD,mBAAOmH,EAAP,KAAiBC,EAAjB,KACA,EAAgC/I,mBAAS,MAAzC,mBAAOqK,EAAP,KAAiBsB,EAAjB,KAHuD,SAUxCC,IAVwC,2EAUvD,sBAAAvL,EAAA,+EACSoL,KADT,4CAVuD,sBAcvD,SAASI,IACP9C,GAAY,GAOd,OAjBArE,qBAAU,WACRqE,GAAY,GACZ6C,IAAaN,KAAKK,GAAaG,MAAMjD,GAAUyC,KAAKO,KACnDH,GAUWtL,mBAAQ,WACpB,MAAO,CAACwI,QAAOE,WAAUuB,cACxB,CAACzB,EAAOE,EAAUuB,IDvBH0B,CAAcC,GAIhC,OAFAtH,qBAAU,WAAQgG,QAAQI,IAAIrC,KAAc,CAACA,IAG3C,sBAAKlJ,UAAU,MAAf,UACE,iCACE,qBAAK0M,MAAM,cAAX,uBAEF,iCACGxD,EAAUK,UAAY,cAAC,EAAD,IACtBL,EAAUG,OAAS,cAAC,EAAD,IACnBH,EAAU4B,UACT,cAAC,EAAD,CACE6B,UAAU,GACVjC,WAAW,UACXxB,UAAWA,EAAU4B,kBElBlB8B,EAZS,SAAAC,GAClBA,GAAeA,aAAuBC,UACxC,6BAAqBf,MAAK,YAAkD,IAA/CgB,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAQN,OCDdO,IAASC,OACP,cAAC,IAAMC,WAAP,UACE,cAAC,EAAD,MAEFC,SAASC,eAAe,SAM1BZ,M","file":"static/js/main.056013c5.chunk.js","sourcesContent":["import React from \"react\";\n\nfunction Error() {\n return (\n
86 on that ... something went wrong.
\n );\n}\n\nexport default Error;\n","import React from \"react\";\n\nfunction Fetching() {\n return (\n
Coming right up...
\n );\n}\n\nexport default Fetching;\n","import PropTypes from 'prop-types';\n\nconst attributesShape = PropTypes.shape({\n name: PropTypes.string.isRequired,\n});\n\nconst traitsShape = PropTypes.shape({\n name: PropTypes.string.isRequired,\n});\n\nconst factoryShape = PropTypes.shape({\n attributes: PropTypes.arrayOf(attributesShape),\n name: PropTypes.string.isRequired,\n traits: PropTypes.arrayOf(traitsShape),\n});\n\nexport {\n attributesShape,\n factoryShape,\n traitsShape,\n};\n","import React from \"react\";\n\nimport PropTypes from \"prop-types\";\n\nimport Col from \"react-bootstrap/Col\";\nimport Form from \"react-bootstrap/Form\";\n\nfunction AttributeRow(props) {\n return (\n \n \n Attribute Name\n props.onChangeName(event)}\n >\n \n {props.children}\n \n \n \n Value\n props.onChangeValue(event)}\n />\n \n \n );\n}\n\nAttributeRow.propTypes = {\n attribute: PropTypes.shape({\n name: PropTypes.string,\n value: PropTypes.string,\n }),\n children: PropTypes.node,\n disabled: PropTypes.bool,\n onChangeName: PropTypes.func.isRequired,\n onChangeValue: PropTypes.func.isRequired,\n};\n\nexport default AttributeRow;\n","import React, { useMemo, useState } from \"react\";\n\nimport PropTypes from \"prop-types\";\n\nimport Form from \"react-bootstrap/Form\";\n\nimport AttributeRow from \"./AttributeRow\";\n\nimport { attributesShape } from \"lib/shapes\";\n\nfunction attrDiff(a, b) {\n const bNames = new Set(b.map(item => item.name));\n return a.filter(item => !bNames.has(item.name));\n}\n\nfunction Traits(props) {\n const { attributes } = props;\n\n const [inputAttributes, setInputAttributes] = useState([]);\n const remainingAttributes = useMemo(() => attrDiff(attributes, inputAttributes));\n\n const remainingAttributeOptions = remainingAttributes.map(attr => (\n \n ));\n\n function addAttribute({name, value}) {\n setInputAttributes([...inputAttributes, {name, value}]);\n }\n\n function setAttributeName(ii, event) {\n const replacement = {name: event.target.value, value: inputAttributes[ii].value};\n replaceAttribute(ii, replacement);\n }\n\n function setAttributeValue(ii, event) {\n const replacement = {name: inputAttributes[ii].name, value: event.target.value};\n replaceAttribute(ii, replacement);\n }\n\n function replaceAttribute(ii, replacement) {\n const newAttributes = inputAttributes.slice();\n newAttributes.splice(ii, 1, replacement);\n setInputAttributes(newAttributes);\n }\n\n return (\n \n Pickles or onions?\n\n {inputAttributes.map((attr, ii) => (\n setAttributeName(ii, event)}\n onChangeValue={event => setAttributeValue(ii, event)}\n >\n {remainingAttributeOptions}\n \n ))}\n\n addAttribute({name: event.target.value, value: \"\"})}\n onChangeValue={event => addAttribute({name: \"\", value: event.target.value})}\n >\n {remainingAttributeOptions}\n \n\n \n );\n}\n\nTraits.propTypes = {\n disabled: PropTypes.bool,\n attributes: PropTypes.arrayOf(attributesShape).isRequired,\n};\n\nexport default Traits;\n","import React from \"react\";\n\nimport PropTypes from \"prop-types\";\n\nimport Form from \"react-bootstrap/Form\";\n\nimport { factoryShape } from \"lib/shapes\";\n\nfunction displayName(blueprint, owner) {\n if (owner) {\n return `${blueprint.association} (${blueprint.factory.name}, ${blueprint.factory.class_name})`;\n } else {\n return `${blueprint.factory.name} (${blueprint.factory.class_name})` ;\n }\n}\n\nfunction FactorySelection(props) {\n const { options, label, value, onChange, owner } = props;\n return (\n \n {label}\n \n \n {options.map(blueprint => (\n \n ))}\n \n \n );\n}\n\nFactorySelection.propTypes = {\n options: PropTypes.arrayOf(\n PropTypes.shape({\n factory: factoryShape.isRequired,\n association: PropTypes.string,\n })\n ).isRequired,\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n label: PropTypes.string,\n owner: PropTypes.shape({\n type: PropTypes.string,\n id: PropTypes.any,\n }),\n};\n\nexport default FactorySelection;\n","import React from \"react\";\n\nimport PropTypes from 'prop-types';\n\nimport Form from \"react-bootstrap/Form\";\n\nfunction FormFieldsForOwner(props) {\n const { association, owner } = props;\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n );\n}\n\nFormFieldsForOwner.propTypes = {\n association: PropTypes.string,\n owner: PropTypes.shape({\n type: PropTypes.string,\n id: PropTypes.any,\n }),\n};\n\nexport default FormFieldsForOwner;\n","import React from \"react\";\n\nimport { StyleSheet, css } from \"aphrodite\";\nimport PropTypes from \"prop-types\";\n\nimport Form from \"react-bootstrap/Form\";\n\nimport { traitsShape } from \"lib/shapes\";\n\nfunction Traits(props) {\n const { traits } = props;\n\n return (\n \n How would you like that cooked?\n
\n {traits.map(trait => (\n \n ))}\n
\n
\n );\n}\n\nTraits.propTypes = {\n disabled: PropTypes.bool,\n traits: PropTypes.arrayOf(traitsShape).isRequired,\n};\n\nconst styles = StyleSheet.create({\n traits: {\n display: \"flex\",\n flexDirection: \"column\",\n flexWrap: \"wrap\",\n maxHeight: \"6em\",\n },\n});\n\nexport default Traits;\n","import { useEffect, useRef } from \"react\";\n\nexport function classes(...classNames) {\n return classNames.filter(x => x).join(\" \");\n}\n\nexport function indexBy(items, func) {\n const indexed = {};\n items.forEach(item => indexed[func(item)] = item);\n return indexed;\n}\n\nexport function usePrevious(value) {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n","import React, { useEffect, useMemo, useState, useRef } from 'react';\n\nimport { css, StyleSheet } from 'aphrodite';\nimport PropTypes from 'prop-types';\n\nimport Button from \"react-bootstrap/Button\";\nimport Form from \"react-bootstrap/Form\";\n\nimport Attributes from \"./partials/Attributes\";\nimport FactorySelection from \"./partials/FactorySelection\";\nimport FormFieldsForOwner from \"./partials/FormFieldsForOwner\";\nimport Traits from \"./partials/Traits\";\n\nimport { factoryShape } from \"lib/shapes\";\nimport { indexBy, usePrevious } from \"./framework\";\n\nfunction FactoryForm(props) {\n const blueprints = props.blueprints || [];\n const owner = props.owner;\n const inquiry = props.inquiry || \"What'll it be?\";\n\n const [factoryInput, setFactoryInput] = useState(\"\");\n\n function handleFactory(event) {\n const value = event.target.value;\n setFactoryInput(value);\n }\n\n const indexedBluePrints = useMemo(() => indexBy(blueprints, blueprint => blueprint.factory.name), [blueprints]);\n const selectedBlueprint = useMemo(() => indexedBluePrints[factoryInput], [factoryInput]);\n const attributes = useMemo(() => selectedBlueprint && selectedBlueprint.factory.attributes || [], [selectedBlueprint]);\n const traits = useMemo(() => selectedBlueprint && selectedBlueprint.factory.traits || [], [selectedBlueprint]);\n const validSelection = !!selectedBlueprint;\n\n const prevOwner = usePrevious(props.owner);\n\n function sameOwner(owner, other) {\n const ownerType = owner && owner.type;\n const ownerId = owner && owner.id;\n const otherOwnerType = other && other.type;\n const otherOwnerId = other && other.id;\n return ownerType === otherOwnerType && ownerId == otherOwnerId;\n }\n\n useEffect(() => {\n if (!sameOwner(props.owner, prevOwner)) { setFactoryInput(\"\"); }\n }, [props.owner]);\n\n const form = useRef(null);\n\n function startOver() {\n form.current && form.current.reset();\n setFactoryInput(\"\");\n props.startOver();\n }\n\n return (\n
\n\n \n\n \n\n {traits.length > 0 && (\n \n )}\n\n {attributes.length > 0 && (\n \n )}\n\n
\n \n {' '}\n
\n \n );\n}\n\nFactoryForm.propTypes = {\n blueprints: PropTypes.arrayOf(\n PropTypes.shape({\n factory: factoryShape.isRequired,\n association: PropTypes.string,\n })\n ).isRequired,\n disabled: PropTypes.bool,\n handleSubmit: PropTypes.func,\n inquiry: PropTypes.string,\n owner: PropTypes.shape({\n type: PropTypes.string,\n id: PropTypes.any,\n }),\n startOver: PropTypes.func,\n};\n\nconst styles = StyleSheet.create({\n buttons: {\n display: \"flex\",\n justifyContent: \"space-between\",\n },\n});\n\nexport default FactoryForm;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport Alert from \"react-bootstrap/Alert\";\n\nfunction FactoryMalfunction(props) {\n const message = props.message || \"Something went wrong\";\n return (\n \n {message}\n \n );\n}\n\nFactoryMalfunction.propTypes = {\n message: PropTypes.string,\n};\n\nexport default FactoryMalfunction;\n","import React from \"react\";\n\nfunction ExternalLinkIcon() {\n return (\n \n \n \n \n \n \n )\n}\n\nexport default ExternalLinkIcon;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport { StyleSheet, css } from \"aphrodite\";\n\nimport ExternalLinkIcon from \"./icons/ExternalLinkIcon\";\n\nimport { classes } from \"./framework\";\n\nfunction animationClass({ isNew, isActive }) {\n if (isNew) {\n return \"created\";\n } else if (isActive) {\n return \"selected\";\n } else {\n return null;\n }\n}\n\nfunction ObjectCard(props) {\n const { object = {} } = props;\n const attributes = object.attributes || {};\n const className = animationClass({isNew: props.new, isActive: props.active});\n return (\n
\n
\n {object.type}\n {object.link && (\n \n \n \n )}\n
\n
\n {Object.entries(attributes).map(([name, value]) => (\n
\n {`${name}: ${value}`}\n
\n ))}\n
\n
\n );\n}\n\nObjectCard.propTypes = {\n activate: PropTypes.func.isRequired,\n active: PropTypes.bool,\n new: PropTypes.bool,\n object: PropTypes.shape({\n attributes: PropTypes.object.isRequired,\n type: PropTypes.string.isRequired,\n link: PropTypes.string,\n }).isRequired,\n};\n\nconst styles = StyleSheet.create({\n active: {\n boxShadow: \"5px 5px 0px #333\",\n },\n object: {\n border: \"2px solid #222\",\n borderRadius: \"1em\",\n display: \"flex\",\n flexDirection: \"column\",\n padding: \"0.5em\",\n marginRight: \"0.5em\",\n position: \"relative\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s\",\n },\n objectDetails: {\n flex: 1,\n width: \"100%\",\n },\n objectTitle: {\n flex: 0,\n width: \"100%\",\n borderBottom: \"2px solid #222\",\n marginBottom: \"3px\",\n },\n});\n\nexport default ObjectCard;\n","import React from \"react\";\n\nimport ObjectCard from \"./ObjectCard\";\n\nfunction ObjectUnderConstruction() {\n return (\n
\n \n
\n );\n}\n\nexport default ObjectUnderConstruction;\n","import React, { useMemo, useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { StyleSheet, css } from \"aphrodite\";\n\nimport { factoryShape } from \"lib/shapes\";\n\nimport FactoryForm from \"./FactoryForm\";\nimport FactoryMalfunction from \"./FactoryMalfunction\";\nimport ObjectCard from \"./ObjectCard\";\nimport ObjectUnderConstruction from \"./ObjectUnderConstruction.js\";\n\nfunction findAssociationFactory(factories, association) {\n return {\n factory: factories.find(f => f.name === association.factory_name),\n association: association.association_name,\n };\n}\n\nfunction objectId(object) {\n return {\n type: object.type,\n id: object.attributes.id,\n };\n}\n\nfunction Factories(props) {\n const { factories } = props;\n\n // Just use this for testing objects without having to create them\n // const staticObject = [{type: \"test\", attributes: {id: 1, name: \"first\"}}, {type: \"test\", attributes: {id: 1, name: \"second\"}}];\n const staticObject = [];\n\n const [constructing, setConstructing] = useState(false);\n const [error, setError] = useState(null);\n const [fetching, setFetching] = useState(false);\n const [newObjectIndex, setNewObjectIndex] = useState(null);\n const [objects, setObjects] = useState([...staticObject]);\n const [selectedObjectIndex, setSelectedObjectIndex] = useState(null);\n\n const factoryList = factories.map(factory => ({factory}));\n const selectedObject = selectedObjectIndex !== null && objects.length > 0 && objects[selectedObjectIndex];\n\n const associationFactories = useMemo(() => {\n if (!selectedObject || !selectedObject.association_factories) { return []; }\n const matchingFactories = selectedObject.association_factories.map(\n item => findAssociationFactory(factories, item)\n );\n return matchingFactories;\n }, [selectedObject]);\n\n const blueprints = selectedObject ? associationFactories : factoryList;\n const inquiry = selectedObject ? `Would you like fries with that ${selectedObject.type}?` : null;\n\n function startOver() {\n setNewObjectIndex(null);\n setNewObjectIndex(null);\n setObjects([]);\n setSelectedObjectIndex(null);\n }\n\n function selectObject(ii) {\n setNewObjectIndex(null);\n setSelectedObjectIndex(ii);\n }\n\n function handleSubmit(event) {\n event.preventDefault();\n setConstructing(true);\n setError(null);\n setFetching(true);\n const data = formData(event.target);\n submit(data);\n }\n\n async function submit(data) {\n const url = props.submitPath;\n\n const response = await fetch(url, {\n method: \"POST\",\n body: data,\n });\n\n const responseData = await response.json();\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error(JSON.stringify(responseData));\n handleSubmitError(responseData.error || \"Uh oh, something broke.\");\n } else {\n handleResponseData(responseData);\n }\n }\n\n function handleResponseData(responseData) {\n if (responseData.ok) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(responseData));\n handleObject(responseData.data);\n } else {\n // eslint-disable-next-line no-console\n console.error(responseData.error);\n handleSubmitError(responseData.error || \"Uh oh, something went wrong.\");\n }\n }\n\n function handleSubmitError(message) {\n setConstructing(false);\n setError(message);\n setFetching(false);\n }\n\n function handleObject(object) {\n setConstructing(false);\n setError(null);\n setFetching(false);\n setObjects(objects.slice().concat([object]));\n if (objects.length === 0) {\n setSelectedObjectIndex(0);\n }\n setNewObjectIndex(objects.length);\n }\n\n function formData(form) {\n return new FormData(form);\n }\n\n return (\n
\n

Order Up!

\n\n {(constructing || (objects.length > 0)) && (\n <>\n {constructing ? \"Comin' right up!\" : \"Here you go!\"}\n {objects.length > 1 && (\n {\" \"}P.S. -- select any object to build out its dependencies.\n )}\n
\n {objects.map((object, ii) => (\n selectObject(ii)}\n new={newObjectIndex === ii}\n />\n ))}\n {constructing && }\n
\n \n )}\n\n {error && }\n\n
\n \n
\n
\n );\n}\n\nFactories.propTypes = {\n factories: PropTypes.arrayOf(factoryShape),\n submitPath: PropTypes.string,\n};\n\nconst styles = StyleSheet.create({\n form: {\n marginBottom: \"2em\",\n transition: \"opacity 0.5s ease-out\",\n overflow: \"hidden\",\n },\n objectList: {\n display: \"flex\",\n margin: \"0.5em 0 1em\",\n },\n});\n\nexport default Factories;\n","export function index() {\n return fetch(\"./data\")\n .then(res => res.json());\n}\n","import { useEffect } from \"react\";\n\nimport './App.css';\nimport './burgers.css';\nimport './layout.css';\n\nimport Error from \"components/Error\";\nimport Fetching from \"components/Fetching\";\nimport Factories from \"components/Factories\";\n\nimport * as api from \"lib/api\";\nimport { useRemoteData } from \"lib/hooks\";\n\nfunction App() {\n const factories = useRemoteData(api.index);\n\n useEffect(() => { console.log(factories) }, [factories]);\n\n return (\n
\n
\n
testing
\n
\n
\n {factories.fetching && }\n {factories.error && }\n {factories.response && (\n \n )}\n
\n
\n );\n}\n\nexport default App;\n","// useRemoteData -- fetch remote data with standardized fetching and error states\n//\n// USAGE\n//\n// function fetchMyData() {\n// // ... return your data or a promise for your data ...\n// }\n//\n// const data = useRemoteData(fetchMyData);\n// // -- OR --\n// const data = useRemoteData(fetchMyData, dependencies);\n//\n// Similar to `useEffect`, `dependencies` will trigger the fetch to occur again.\n// `dependencies` defaults to [], meaning the fetch will happen only once.\n\n\nimport { useEffect, useMemo, useState } from \"react\";\nexport function useRemoteData(loadFn, dependencies = []) {\n const [error, setError] = useState(null);\n const [fetching, setFetching] = useState(dependencies.length === 0);\n const [response, setResponse] = useState(null);\n\n useEffect(() => {\n setFetching(true);\n asyncFetch().then(setResponse).catch(setError).then(done);\n }, dependencies);\n\n async function asyncFetch() {\n return loadFn();\n }\n\n function done() {\n setFetching(false);\n }\n\n const value = useMemo(() => {\n return {error, fetching, response};\n }, [error, fetching, response]);\n\n return value;\n}\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""} \ No newline at end of file