diff --git a/config/config.json b/config/config.json deleted file mode 100644 index 08be48b..0000000 --- a/config/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "apiUrl": "http://localhost:5000", - "blobUrl": "https://flexordev.blob.core.windows.net/media/", - "media": { - "defaultMaxSize": 5242880, - "coverMaxSize": 5242880, - "iconMaxSize": 1048576 - } -} diff --git a/config/dev.json b/config/dev.json deleted file mode 100644 index 3ad76d3..0000000 --- a/config/dev.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "apiUrl": "http://api-dev.flexor.cc", - "blobUrl": "https://flexordev.blob.core.windows.net/media/", - "media": { - "defaultMaxSize": 5242880, - "coverMaxSize": 5242880, - "iconMaxSize": 1048576 - } -} diff --git a/config/prod.json b/config/prod.json deleted file mode 100644 index 0d8fba1..0000000 --- a/config/prod.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "apiUrl": "https://api.flexor.cc", - "blobUrl": "https://flexordev.blob.core.windows.net/media/", - "media": { - "defaultMaxSize": 5242880, - "coverMaxSize": 5242880, - "iconMaxSize": 1048576 - } -} diff --git a/package-lock.json b/package-lock.json index 766eaa4..b33c0e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "flexor-web", - "version": "1.0.0", + "version": "1.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -111,18 +111,6 @@ "regenerator-runtime": "^0.13.2" } }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", - "dev": true - }, "@fortawesome/fontawesome-common-types": { "version": "0.2.26", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.26.tgz", @@ -152,6 +140,12 @@ "prop-types": "^15.5.10" } }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, "@opencensus/web-types": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz", @@ -168,16 +162,6 @@ "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, - "@types/body-parser": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", - "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, "@types/clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.1.tgz", @@ -187,61 +171,15 @@ "@types/node": "*" } }, - "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz", - "integrity": "sha512-7SxFCd+FLlxCfwVwbyPxbR4khL9aNikJhrorw8nUIOqeuooc9gifBuDQOJw5kzN7i6i3vLn9G8Wde/4QDihpYw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", - "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz", - "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/range-parser": "*" - } - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "@types/copy-webpack-plugin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/copy-webpack-plugin/-/copy-webpack-plugin-5.0.0.tgz", + "integrity": "sha512-yQHocgdgES7W5Q2UyxJ5cj/E6MrV1zq3MZ8jdApS9NJKqax+rux9IE3QAbBmNCGbgivEsejrkIq3Rm76JLubkg==", "dev": true, "requires": { - "@types/events": "*", "@types/minimatch": "*", - "@types/node": "*" + "@types/node": "*", + "@types/webpack": "*" } }, "@types/history": { @@ -282,47 +220,12 @@ "@types/webpack": "*" } }, - "@types/http-proxy": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.2.tgz", - "integrity": "sha512-Qfb7batJJBlI8wcrd48vHpgsOOYzQQa+OZcaIz33jkJPe8A7KktAJFmRAiR42s5BfnErdlFnOyQucq2BKy/98g==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-proxy-middleware": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz", - "integrity": "sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/http-proxy": "*", - "@types/node": "*" - } - }, "@types/lodash": { "version": "4.14.149", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", "dev": true }, - "@types/mime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", - "dev": true - }, - "@types/mini-css-extract-plugin": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@types/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", - "integrity": "sha512-L7OKmXudo048RMw/NeLjJMNRAbyXG76b3uGZ49OKe03imYEplx0JzcM0goVNc7X1IeESf2Bk9RP+tS1U3OSmVg==", - "dev": true, - "requires": { - "@types/webpack": "*" - } - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -348,12 +251,6 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", "dev": true }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, "@types/react": { "version": "16.9.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", @@ -435,16 +332,6 @@ "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=", "dev": true }, - "@types/serve-static": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", - "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -514,19 +401,6 @@ "@types/webpack": "*" } }, - "@types/webpack-dev-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", - "integrity": "sha512-4wXREDfUJmKTNcoaLLHjgsRHZhogIScXJPc5B6e5bYx16zd9H3WfM67w+mEgNaRxVCgb6YNnc8O2lX2IUn4zdQ==", - "dev": true, - "requires": { - "@types/connect-history-api-fallback": "*", - "@types/express": "*", - "@types/http-proxy-middleware": "*", - "@types/serve-static": "*", - "@types/webpack": "*" - } - }, "@types/webpack-sources": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", @@ -732,6 +606,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abstract-logging": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.0.tgz", + "integrity": "sha512-/oA9z7JszpIioo6J6dB79LVUgJ3eD3cxkAmdCkvWWS+Y9tPtALs1rLqOekLUXUbYqM2fB9TTK0ibAyZJJOP/CA==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -758,7 +637,6 @@ "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -784,12 +662,6 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -935,19 +807,35 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, "arg": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "args": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", + "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + } } }, "arr-diff": { @@ -1039,15 +927,6 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -1071,48 +950,35 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "autoprefixer": { - "version": "9.7.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", - "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", - "dev": true, + "avvio": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-6.3.0.tgz", + "integrity": "sha512-J91oN84XE6A0FCO+T4FXeKj1p7C25j+HeGCpbBzJaf5dQ/1tDnluFgKokq0TvC953yA730VhSWcbuDqncPv/5Q==", "requires": { - "browserslist": "^4.7.2", - "caniuse-lite": "^1.0.30001006", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.21", - "postcss-value-parser": "^4.0.2" + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.0" }, "dependencies": { - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "ms": "^2.1.1" } }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1175,12 +1041,6 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, "bfj": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", @@ -1245,28 +1105,6 @@ "type-is": "~1.6.17" } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - } - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1277,7 +1115,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1369,17 +1206,6 @@ "pako": "~1.0.5" } }, - "browserslist": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", - "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001004", - "electron-to-chromium": "^1.3.295", - "node-releases": "^1.1.38" - } - }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -1397,12 +1223,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1461,30 +1281,6 @@ "unset-value": "^1.0.0" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -1501,12 +1297,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "caniuse-lite": { - "version": "1.0.30001008", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", - "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1689,12 +1479,6 @@ "wrap-ansi": "^5.1.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1746,43 +1530,10 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", - "dev": true, - "requires": { - "mime-db": ">= 1.40.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - } - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -1796,12 +1547,6 @@ "typedarray": "^0.0.6" } }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -1861,24 +1606,31 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" } }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -1956,44 +1708,6 @@ "randomfill": "^1.0.3" } }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, "css-loader": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.0.tgz", @@ -2046,15 +1760,6 @@ } } }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -2073,12 +1778,6 @@ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2097,11 +1796,16 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -2123,29 +1827,10 @@ "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "define-properties": { "version": "1.1.3", @@ -2196,21 +1881,6 @@ } } }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2219,8 +1889,7 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { "version": "1.0.1", @@ -2235,8 +1904,7 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-file": { "version": "1.0.0", @@ -2244,12 +1912,6 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, "diff": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", @@ -2267,29 +1929,13 @@ "randombytes": "^2.0.0" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "path-type": "^3.0.0" } }, "dom-converter": { @@ -2350,6 +1996,11 @@ "domelementtype": "1" } }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -2371,8 +2022,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { "version": "2.7.1", @@ -2380,12 +2030,6 @@ "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.306", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", - "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", - "dev": true - }, "elliptic": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", @@ -2416,14 +2060,12 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -2489,8 +2131,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -2508,12 +2149,6 @@ "estraverse": "^4.1.1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", @@ -2532,29 +2167,13 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -2748,25 +2367,191 @@ } } }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, + "fast-json-stringify": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-1.16.0.tgz", + "integrity": "sha512-K06RTF3YV0gUAfUpwZ4m62CjI4NvV+0/eSz0YVmSKZHEDCgxNYBGI7weZdGZJFBjdZky1Tk5YTev2qLtKGGbzw==", + "requires": { + "ajv": "^6.10.2", + "deepmerge": "^4.0.0" + } + }, + "fast-redact": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.0.0.tgz", + "integrity": "sha512-zxpkULI9W9MNTK2sJ3BpPQrTEXFNESd2X6O1tXMFpK/XM0G5c5Rll2EVYZH2TqI3xRGK/VaJ+eEOt7pnENJpeA==" + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "fastify": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-2.11.0.tgz", + "integrity": "sha512-IoYht8U19KhOtvpFCgwpsu6BDywCk32bfzoGfzgdkEvEYkdcpiwTUIlxSVNaArYF4MPDzpA2q8V7nPHu23OQBQ==", + "requires": { + "abstract-logging": "^2.0.0", + "ajv": "^6.10.2", + "avvio": "^6.2.2", + "fast-json-stringify": "^1.15.7", + "find-my-way": "^2.2.0", + "flatstr": "^1.0.12", + "light-my-request": "^3.6.2", + "middie": "^4.1.0", + "pino": "^5.14.0", + "proxy-addr": "^2.0.4", + "readable-stream": "^3.1.1", + "rfdc": "^1.1.2", + "secure-json-parse": "^2.0.0", + "tiny-lru": "^7.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "fastify-http-proxy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fastify-http-proxy/-/fastify-http-proxy-2.3.0.tgz", + "integrity": "sha512-vrDZysadyxT7P1K0prt1pcBuRwNlV/TdK+cPLbnCpLqmv8hEVUzBpZROHFXLdp6hjKrNEjFlb52u9IP/f34hXw==", + "requires": { + "fastify-reply-from": "^1.0.0" + } + }, + "fastify-plugin": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-1.6.0.tgz", + "integrity": "sha512-lFa9txg8LZx4tljj33oG53nUXhVg0baZxtP9Pxi0dJmI0NQxzkDk5DS9kr3D7iMalUAp3mvIq16OQumc7eIvLA==", + "requires": { + "semver": "^6.0.0" + } + }, + "fastify-reply-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fastify-reply-from/-/fastify-reply-from-1.1.0.tgz", + "integrity": "sha512-7goHg/6delymJH0psUAdaOsIeQTX9z0My7r5or5FBAmveyua6VdfX0gLcNCtV46ttzIKL0WqjXq3vpu1e3tGVg==", + "requires": { + "end-of-stream": "^1.4.1", + "fastify-plugin": "^1.6.0", + "pump": "^3.0.0", + "semver": "^6.2.0", + "tiny-lru": "^6.0.1", + "undici": "^0.4.0" + }, + "dependencies": { + "tiny-lru": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-6.1.0.tgz", + "integrity": "sha512-lbz53M11ioFDKxPUBR2UVK7a8JolPZpSkzL0iXW60fpvU98P9+VqWQ7bGGJpGjqnIlILQzl9r+fikhqbcOs7bg==" + } + } + }, + "fastify-static": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/fastify-static/-/fastify-static-2.5.1.tgz", + "integrity": "sha512-aPpyT+ADHtZ/i35Ly6Cyyz9DA6HRwgJr0bJEMucmTxaXBIO5LaEsIOTzTP+U0/UBScer/mL4x2eSHp9l6WTnkw==", + "requires": { + "fastify-plugin": "^1.6.0", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "send": "^0.16.0" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "fastq": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", + "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", "requires": { - "websocket-driver": ">=0.5.1" + "reusify": "^1.0.0" } }, "figgy-pudding": { @@ -2845,6 +2630,16 @@ "pkg-dir": "^3.0.0" } }, + "find-my-way": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-2.2.1.tgz", + "integrity": "sha512-pzZA9/PlhDGG5PRzmd4vH4AbKW7FO68RE7q2I3NzjJHcVPukYbDA7bPdArg7ySKfS6pKki+qhrawFoN6aNZfjA==", + "requires": { + "fast-decode-uri-component": "^1.0.0", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -2971,11 +2766,10 @@ } } }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true + "flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" }, "flush-write-stream": { "version": "1.1.1", @@ -2987,32 +2781,6 @@ "readable-stream": "^2.3.6" } }, - "follow-redirects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", - "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -3032,8 +2800,7 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fragment-cache": { "version": "0.2.1", @@ -3047,8 +2814,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from2": { "version": "2.3.0", @@ -3075,8 +2841,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.11", @@ -3666,7 +3431,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3733,22 +3497,23 @@ } }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, "requires": { "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" }, "dependencies": { "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=", "dev": true } } @@ -3774,12 +3539,6 @@ "pify": "^4.0.1" } }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3930,24 +3689,6 @@ "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, "html-minifier": { "version": "3.5.21", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", @@ -4045,12 +3786,6 @@ } } }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -4073,158 +3808,29 @@ } }, "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=" + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, "requires": { "postcss": "^7.0.14" @@ -4242,33 +3848,11 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true }, "import-local": { "version": "2.0.0", @@ -4302,7 +3886,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4311,8 +3894,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -4320,16 +3902,6 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -4350,12 +3922,6 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -4364,14 +3930,7 @@ "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -4393,12 +3952,6 @@ } } }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4469,12 +4022,6 @@ } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4508,36 +4055,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -4584,8 +4101,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -4599,21 +4115,23 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true + }, + "joycon": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", + "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -4623,14 +4141,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json5": { "version": "1.0.1", @@ -4641,12 +4152,6 @@ "minimist": "^1.2.0" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -4662,6 +4167,38 @@ "invert-kv": "^2.0.0" } }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "light-my-request": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-3.6.3.tgz", + "integrity": "sha512-hALF8T3oTgIhl9KUkH6rbgs3H7y5E8lDfkQ6oO+7ZCO0BjrfK6LKO1NfhS/WWsCf6VkEd8A3kqyU3tGhLRofAg==", + "requires": { + "ajv": "^6.10.2", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -4720,37 +4257,6 @@ "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==", "dev": true }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "loglevel": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", - "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4894,6 +4400,22 @@ "picomatch": "^2.0.5" } }, + "middie": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/middie/-/middie-4.1.0.tgz", + "integrity": "sha512-eylPpZA+K3xO9kpDjagoPkEUkNcWV3EAo5OEz0MqsekUpT7KbnQkk8HNZkh4phx2vvOAmNNZuLRWF9lDDHPpVQ==", + "requires": { + "path-to-regexp": "^4.0.0", + "reusify": "^1.0.2" + }, + "dependencies": { + "path-to-regexp": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-4.0.5.tgz", + "integrity": "sha512-l+fTaGG2N9ZRpCEUj5fG1VKdDLaiqwCIvPngpnxzREhcdobhZC4ou4w984HBu72DqAJ5CfcdV6tjqNOunfpdsQ==" + } + } + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -4939,18 +4461,6 @@ "tiny-warning": "^1.0.2" } }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -4967,7 +4477,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5053,27 +4562,16 @@ "run-queue": "^1.0.3" } }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { "version": "2.14.0", @@ -5133,12 +4631,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -5178,15 +4670,6 @@ } } }, - "node-releases": { - "version": "1.1.39", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", - "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -5213,24 +4696,12 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", "dev": true }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -5266,18 +4737,6 @@ "boolbase": "~1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5314,18 +4773,6 @@ } } }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -5340,18 +4787,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -5370,32 +4805,18 @@ "isobject": "^3.0.1" } }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -5406,24 +4827,6 @@ "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", "dev": true }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -5477,21 +4880,6 @@ "p-limit": "^2.0.0" } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -5587,14 +4975,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -5662,58 +5043,65 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, + "pino": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-5.15.0.tgz", + "integrity": "sha512-7+FXMTA3H3sNP5+2miY2K9JKnAAW5GKuhHfNWsukFCsPprGQY3ctqpwbV74wAHW3Nl93cEEQ1G82MgOLM8P7TQ==", "requires": { - "find-up": "^3.0.0" + "fast-redact": "^2.0.0", + "fast-safe-stringify": "^2.0.7", + "flatstr": "^1.0.12", + "pino-std-serializers": "^2.4.2", + "quick-format-unescaped": "^3.0.3", + "sonic-boom": "^0.7.5" } }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "pino-pretty": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-3.5.0.tgz", + "integrity": "sha512-3sg6s7nI5vgjrEBKhLckAfLPjgjm1U/Fw0C6jhoWnIU2D6QqCpF8eAqL+E1A6bBglCGR/APCx8VuxchBxtuMjA==", "dev": true, "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" + "@hapi/bourne": "^1.3.2", + "args": "^5.0.1", + "chalk": "^2.4.2", + "dateformat": "^3.0.3", + "fast-safe-stringify": "^2.0.7", + "jmespath": "^0.15.0", + "joycon": "^2.2.5", + "pump": "^3.0.0", + "readable-stream": "^3.4.0", + "split2": "^3.1.1", + "strip-json-comments": "^3.0.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, "requires": { - "ms": "^2.1.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, + "pino-std-serializers": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz", + "integrity": "sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -5748,300 +5136,6 @@ } } }, - "postcss-attribute-case-insensitive": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz", - "integrity": "sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dev": true, - "requires": { - "postcss": "^7" - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, "postcss-modules-extract-imports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", @@ -6083,159 +5177,6 @@ "postcss": "^7.0.6" } }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dev": true, - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "postcss-selector-not": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, "postcss-selector-parser": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", @@ -6253,23 +5194,6 @@ "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", "dev": true }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -6288,8 +5212,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", @@ -6311,7 +5234,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.9.0" @@ -6346,7 +5268,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6386,16 +5307,6 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -6408,11 +5319,10 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true + "quick-format-unescaped": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz", + "integrity": "sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ==" }, "randombytes": { "version": "2.1.0", @@ -6436,8 +5346,7 @@ "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { "version": "2.4.0", @@ -6551,7 +5460,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6679,9 +5587,9 @@ } }, "redux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", - "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" @@ -6715,69 +5623,6 @@ "safe-regex": "^1.1.0" } }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -6844,12 +5689,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, "reselect": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", @@ -6919,11 +5758,20 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true + "retimer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/retimer/-/retimer-1.1.0.tgz", + "integrity": "sha512-+Tjoa47XqpO+cmNObvmK6UPFmUTzQPtr4MqMS7ZJKPKYAnryCxG2FXT8/SEgPsEghQQgXFPZEdILNxJkvXtjUw==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" }, "rimraf": { "version": "2.7.1", @@ -6956,8 +5804,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -6968,18 +5815,27 @@ "ret": "~0.1.10" } }, + "safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "requires": { + "ret": "~0.2.0" + }, + "dependencies": { + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + } + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", - "dev": true - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -7005,26 +5861,20 @@ "ajv-keywords": "^3.1.0" } }, - "select-hose": { + "secure-json-parse": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.0.0.tgz", + "integrity": "sha512-5m06oylEcPAmFerbz1zu7yEPo0Gk/zJbPn/HGw0b1orz1xCON+C3dHgRzZ/u2ZIA8Pc7mfmDJIyprIvdJ79JkA==" }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" }, "send": { "version": "0.17.1", @@ -7048,60 +5898,19 @@ }, "dependencies": { "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -7192,6 +6001,12 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -7305,63 +6120,12 @@ } } }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, + "sonic-boom": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.6.tgz", + "integrity": "sha512-k9E2QQ4zxuVRLDW+ZW6ISzJs3wlEorVdmM7ApDgor7wsGKSDG5YGHsGmgLY4XYh4DMlr/2ap2BWAE7yTFJtWnQ==", "requires": { - "is-plain-obj": "^1.0.0" + "flatstr": "^1.0.12" } }, "source-list-map": { @@ -7437,65 +6201,24 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "extend-shallow": "^3.0.0" } }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "split2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", + "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", "dev": true, "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "readable-stream": "^3.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", @@ -7509,21 +6232,6 @@ } } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -7599,12 +6307,6 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -7627,31 +6329,10 @@ "function-bind": "^1.0.2" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -7677,10 +6358,16 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, "style-loader": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.1.tgz", - "integrity": "sha512-oIVF12trRq0od4Yojg7q0K3Lq/O6Ix/AYgVosykrVg+kWxxxUyk8KhKCCmekyGSUiVK1xxlAQymLWWdh6S9lOg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.2.tgz", + "integrity": "sha512-0Mpq1ZHFDCNq1F+6avNBgv+7q8V+mWRuzehxyJT+aKgzyN/yfKTwjYqaYwBgx+11UpQxL21zNQfzzlz+JcGURw==", "dev": true, "requires": { "loader-utils": "^1.2.3", @@ -7713,6 +6400,23 @@ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, + "syncthrough": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/syncthrough/-/syncthrough-0.5.0.tgz", + "integrity": "sha1-nRNdOJz0WJp4+qrjRTU/5hLIzqA=", + "requires": { + "inherits": "^2.0.3", + "listenercount": "^1.0.1", + "process-nextick-args": "^1.0.7" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -7757,12 +6461,6 @@ "xtend": "~4.0.1" } }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, "timers-browserify": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", @@ -7777,6 +6475,11 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" }, + "tiny-lru": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-7.0.2.tgz", + "integrity": "sha512-cmc9OOwmnAJtyFBYaznKR3abypEhWecarFrvS5db6qwSgoaDUWV0JX+mdh6B9wN60Wux3+gE1vjzxkoqxFBjqw==" + }, "tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -7945,6 +6648,19 @@ } } }, + "undici": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-0.4.0.tgz", + "integrity": "sha512-5S64X43hM2bSUFY00+ji5hcvuxtXAy/ssx826rsJbx6P0gFNKUksb8rxiJWggig+AiNLLtQhfgcaq3T6V5Wcxw==", + "requires": { + "end-of-stream": "^1.4.1", + "fastq": "^1.6.0", + "http-parser-js": "^0.4.13", + "readable-stream": "^2.3.6", + "retimer": "^1.1.0", + "syncthrough": "^0.5.0" + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -8043,7 +6759,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -8072,16 +6787,6 @@ } } }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -8108,8 +6813,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", @@ -8181,19 +6885,10 @@ "neo-async": "^2.5.0" } }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, "webpack": { - "version": "4.41.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.4.tgz", - "integrity": "sha512-Lc+2uB6NjpCWsHI3trkoISOI64h9QYIXenbEWj3bn3oyjfB1lEBXjWAfAyY2sM0rZn41oD5V91OLwKRwS6Wp8Q==", + "version": "4.41.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", + "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -8377,238 +7072,6 @@ } } }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz", - "integrity": "sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, "webpack-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", @@ -8629,23 +7092,6 @@ "source-map": "~0.6.1" } }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -8684,8 +7130,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "6.2.1", diff --git a/package.json b/package.json index 9242eb0..167b42f 100644 --- a/package.json +++ b/package.json @@ -7,22 +7,17 @@ "defaults" ], "scripts": { - "start": "webpack-dev-server --config webpack.config.ts", - "build": "npm run build:dev", - "build:dev": "webpack --mode production --config webpack.config.ts", - "build:prod": "webpack --mode production --config webpack.config.ts", - "build:communicator": "webpack --config etc/communicator/webpack.config.ts", - "deploy:batch:dev": "az storage blob upload-batch --source ./dist/ -d '$web' --account-name flexordev", - "deploy:batch:prod": "az storage blob upload-batch --source ./dist/ -d '$web' --account-name flexor", - "deploy:config:dev": "az storage blob upload --file ./config/dev.json --name config.json --container-name '$web' --account-name flexordev", - "deploy:config:prod": "az storage blob upload --file ./config/prod.json --name config.json --container-name '$web' --account-name flexor", - "deploy:dev": "run-s deploy:batch:dev deploy:config:dev", - "deploy:prod": "run-s deploy:batch:prod deploy:config:prod" + "start": "node dist/server.js", + "prestart": "npm run build", + "build": "run-p build:app build:server build:communicator", + "build:app": "webpack --mode production --config src/app/webpack.config.ts", + "build:server": "tsc -p src/server/tsconfig.json", + "build:communicator": "webpack --mode production --config src/communicator/webpack.config.ts" }, "devDependencies": { + "@types/copy-webpack-plugin": "^5.0.0", "@types/html-webpack-plugin": "^3.2.1", "@types/lodash": "^4.14.149", - "@types/mini-css-extract-plugin": "^0.8.0", "@types/react": "^16.9.17", "@types/react-dom": "^16.9.4", "@types/react-redux": "^7.1.5", @@ -31,24 +26,21 @@ "@types/uuid": "^3.4.6", "@types/webpack": "^4.41.0", "@types/webpack-bundle-analyzer": "^2.13.3", - "@types/webpack-dev-server": "^3.9.0", "@types/zxcvbn": "^4.4.0", + "copy-webpack-plugin": "^5.1.1", "css-loader": "^3.4.0", "file-loader": "^5.0.2", "html-webpack-plugin": "^3.2.0", - "mini-css-extract-plugin": "^0.9.0", + "normalize.css": "^8.0.1", "npm-run-all": "^4.1.5", - "postcss-loader": "^3.0.0", - "postcss-normalize": "^8.0.1", - "postcss-preset-env": "^6.7.0", - "style-loader": "^1.1.1", + "pino-pretty": "^3.5.0", + "style-loader": "^1.1.2", "ts-loader": "^6.2.1", "ts-node": "^8.5.4", "typescript": "^3.7.4", - "webpack": "^4.41.4", + "webpack": "^4.41.5", "webpack-bundle-analyzer": "^3.6.0", - "webpack-cli": "^3.3.10", - "webpack-dev-server": "^3.10.1" + "webpack-cli": "^3.3.10" }, "dependencies": { "@azure/storage-blob": "^12.0.1", @@ -56,6 +48,10 @@ "@fortawesome/fontawesome-svg-core": "^1.2.26", "@fortawesome/free-solid-svg-icons": "^5.12.0", "@fortawesome/react-fontawesome": "^0.1.8", + "dotenv": "^8.2.0", + "fastify": "^2.11.0", + "fastify-http-proxy": "^2.3.0", + "fastify-static": "^2.5.1", "history": "^4.10.1", "lodash": "^4.17.15", "moment": "^2.24.0", @@ -63,7 +59,7 @@ "react-dom": "^16.12.0", "react-redux": "^7.1.3", "react-router-dom": "^5.1.2", - "redux": "^4.0.4", + "redux": "^4.0.5", "redux-logger": "^3.0.6", "redux-thunk": "^2.3.0", "reselect": "^4.0.0", diff --git a/postcss-normalize.d.ts b/postcss-normalize.d.ts deleted file mode 100644 index ac414a2..0000000 --- a/postcss-normalize.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare module 'postcss-normalize' { - import { - plugin, Plugin, ParserInput, - Result, LazyResult, Root, ProcessOptions - } from 'postcss' - - interface PluginOptions { - allowDuplicates?: boolean - forceImport?: string | boolean - browsers?: string - } - - const PostcssNormalize: Plugin - export default PostcssNormalize -} diff --git a/postcss-preset-env.d.ts b/postcss-preset-env.d.ts deleted file mode 100644 index 3aceab5..0000000 --- a/postcss-preset-env.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -declare module 'postcss-preset-env' { - import { - plugin, Plugin, ParserInput, - Result, LazyResult, Root, ProcessOptions - } from 'postcss' - - interface PluginOptions { - stage?: number - features?: any - browsers?: string - insertBefore?: any - insertAfter?: any - autoprefixer?: any - preserve?: boolean - importFrom?: string - exportTo?: string - } - - const PostcssPresetEnv: Plugin - export default PostcssPresetEnv -} diff --git a/src/actions/config.ts b/src/actions/config.ts deleted file mode 100644 index 0fc5dac..0000000 --- a/src/actions/config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Action } from 'redux' -import { Config } from 'src/types' - -export interface SetConfigAction extends Action { - type: 'CONFIG_SET' - payload: Config -} - -export type ConfigActions = SetConfigAction - -export const setConfig = (config: Config): SetConfigAction => ({ - type: 'CONFIG_SET', - payload: config -}) diff --git a/src/actions/apps.ts b/src/app/actions/apps.ts similarity index 94% rename from src/actions/apps.ts rename to src/app/actions/apps.ts index bb87875..60705b8 100644 --- a/src/actions/apps.ts +++ b/src/app/actions/apps.ts @@ -1,13 +1,13 @@ -import { apiFetch } from 'src/api' -import { setEntities } from 'src/actions/entities' -import { startRequest, finishRequest } from 'src/actions/requests' -import { setFieldNotification } from 'src/actions/forms' -import { listSet, listAppend } from 'src/actions/lists' -import { objectToQuerystring } from 'src/utils' -import { normalize } from 'src/utils/normalization' -import { EntityListKey, Entity } from 'src/types' - -import { AppThunkAction, RequestKey, EntityType, App, AvailabilityResponse, NotificationType }from 'src/types' +import { apiFetch } from '../api' +import { setEntities } from '../actions/entities' +import { startRequest, finishRequest } from '../actions/requests' +import { setFieldNotification } from '../actions/forms' +import { listSet, listAppend } from '../actions/lists' +import { objectToQuerystring } from '../utils' +import { normalize } from '../utils/normalization' +import { EntityListKey, Entity } from '../types' + +import { AppThunkAction, RequestKey, EntityType, App, AvailabilityResponse, NotificationType }from '../types' interface AppsResponse { apps: App[] diff --git a/src/actions/authentication.ts b/src/app/actions/authentication.ts similarity index 91% rename from src/actions/authentication.ts rename to src/app/actions/authentication.ts index 39938ae..0175725 100644 --- a/src/actions/authentication.ts +++ b/src/app/actions/authentication.ts @@ -1,17 +1,17 @@ import { Action } from 'redux' -import { apiFetch } from 'src/api' -import { setEntities } from 'src/actions/entities' -import { startRequest, finishRequest } from 'src/actions/requests' -import { normalize } from 'src/utils/normalization' +import { apiFetch } from '../api' +import { setEntities } from '../actions/entities' +import { startRequest, finishRequest } from '../actions/requests' +import { normalize } from '../utils/normalization' import { LOCAL_STORAGE_ACCESS_TOKEN_KEY, LOCAL_STORAGE_REFRESH_TOKEN_KEY, - LOCAL_STORAGE_ACCESS_TOKEN_AT_KEY, -} from 'src/constants' + LOCAL_STORAGE_ACCESS_TOKEN_EXPIRES_AT_KEY, +} from '../constants' -import { AppThunkAction, Entity, RequestKey, EntityType, Settings } from 'src/types' +import { AppThunkAction, Entity, RequestKey, EntityType, Settings } from '../types' export interface SetCheckedAction extends Action { type: 'AUTHENTICATION_SET_CHECKED' @@ -95,7 +95,7 @@ export const authenticate = (name: string, password: string): AppThunkAction { return async dispatch => { diff --git a/src/actions/lists.ts b/src/app/actions/lists.ts similarity index 95% rename from src/actions/lists.ts rename to src/app/actions/lists.ts index 469c2f3..c66e126 100644 --- a/src/actions/lists.ts +++ b/src/app/actions/lists.ts @@ -1,5 +1,5 @@ import { Action } from 'redux' -import { EntityListKey } from 'src/types' +import { EntityListKey } from '../types' export interface ListAppendAction extends Action { type: 'LISTS_APPEND' diff --git a/src/actions/notifications.ts b/src/app/actions/notifications.ts similarity index 100% rename from src/actions/notifications.ts rename to src/app/actions/notifications.ts diff --git a/src/actions/posts.ts b/src/app/actions/posts.ts similarity index 92% rename from src/actions/posts.ts rename to src/app/actions/posts.ts index 88db5d4..44d19ae 100644 --- a/src/actions/posts.ts +++ b/src/app/actions/posts.ts @@ -1,13 +1,11 @@ -import { Action } from 'redux' - -import { apiFetch } from 'src/api' -import { setEntities } from 'src/actions/entities' -import { listSet, listAppend } from 'src/actions/lists' -import { startRequest, finishRequest } from 'src/actions/requests' - -import { objectToQuerystring } from 'src/utils' -import { normalize } from 'src/utils/normalization' -import { AppThunkAction, Entity, RequestKey, EntityType, User, Post, Attachment, EntityListKey } from 'src/types' +import { apiFetch } from '../api' +import { setEntities } from '../actions/entities' +import { listSet, listAppend } from '../actions/lists' +import { startRequest, finishRequest } from '../actions/requests' + +import { objectToQuerystring } from '../utils' +import { normalize } from '../utils/normalization' +import { AppThunkAction, Entity, RequestKey, EntityType, User, Post, Attachment, EntityListKey } from '../types' interface CreatePostResponse { id: string diff --git a/src/actions/registration.ts b/src/app/actions/registration.ts similarity index 95% rename from src/actions/registration.ts rename to src/app/actions/registration.ts index b421f38..f170290 100644 --- a/src/actions/registration.ts +++ b/src/app/actions/registration.ts @@ -1,15 +1,15 @@ import { Action } from 'redux' -import { apiFetch } from 'src/api' -import { setFieldNotification } from 'src/actions/forms' -import { startRequest, finishRequest } from 'src/actions/requests' +import { apiFetch } from '../api' +import { setFieldNotification } from '../actions/forms' +import { startRequest, finishRequest } from '../actions/requests' import { LOCAL_STORAGE_ACCESS_TOKEN_KEY, LOCAL_STORAGE_REFRESH_TOKEN_KEY, -} from 'src/constants' +} from '../constants' -import { AppThunkAction, NotificationType, RequestKey, AvailabilityResponse } from 'src/types' +import { AppThunkAction, NotificationType, RequestKey, AvailabilityResponse } from '../types' export interface SetStepAction extends Action { type: 'REGISTRATION_SET_STEP' diff --git a/src/actions/requests.ts b/src/app/actions/requests.ts similarity index 67% rename from src/actions/requests.ts rename to src/app/actions/requests.ts index 4a1e7f4..1846975 100644 --- a/src/actions/requests.ts +++ b/src/app/actions/requests.ts @@ -1,30 +1,31 @@ import { Action } from 'redux' +import { RequestKey } from '../types' export interface StartRequestAction extends Action { type: 'REQUESTS_START_REQUEST' payload: { - id: string + id: RequestKey } } export interface FinishRequestAction extends Action { type: 'REQUESTS_FINISH_REQUEST' payload: { - id: string + id: RequestKey succeeded: boolean } } export type RequestsActions = StartRequestAction | FinishRequestAction -export const startRequest = (id: string): StartRequestAction => ({ +export const startRequest = (id: RequestKey): StartRequestAction => ({ type: 'REQUESTS_START_REQUEST', payload: { id, }, }) -export const finishRequest = (id: string, succeeded: boolean): FinishRequestAction => ({ +export const finishRequest = (id: RequestKey, succeeded: boolean): FinishRequestAction => ({ type: 'REQUESTS_FINISH_REQUEST', payload: { id, diff --git a/src/actions/theme.ts b/src/app/actions/theme.ts similarity index 100% rename from src/actions/theme.ts rename to src/app/actions/theme.ts diff --git a/src/actions/users.ts b/src/app/actions/users.ts similarity index 88% rename from src/actions/users.ts rename to src/app/actions/users.ts index b6e9b3a..b101f04 100644 --- a/src/actions/users.ts +++ b/src/app/actions/users.ts @@ -1,8 +1,8 @@ -import { apiFetch } from 'src/api' -import { setEntities } from 'src/actions/entities' -import { startRequest, finishRequest } from 'src/actions/requests' -import { AppThunkAction, Entity, RequestKey, EntityType } from 'src/types' -import { normalize } from 'src/utils/normalization' +import { apiFetch } from '../api' +import { setEntities } from '../actions/entities' +import { startRequest, finishRequest } from '../actions/requests' +import { AppThunkAction, Entity, RequestKey, EntityType } from '../types' +import { normalize } from '../utils/normalization' export const fetchUser = (id: string): AppThunkAction => { return async dispatch => { diff --git a/src/api/errors.ts b/src/app/api/errors.ts similarity index 94% rename from src/api/errors.ts rename to src/app/api/errors.ts index fe38aea..e46845c 100644 --- a/src/api/errors.ts +++ b/src/app/api/errors.ts @@ -1,8 +1,8 @@ import { History } from 'history' -import { setFieldNotification } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { AppThunkDispatch, FormNotification, NotificationType } from 'src/types' +import { setFieldNotification } from '../actions/forms' +import { showNotification } from '../actions/notifications' +import { AppThunkDispatch, FormNotification, NotificationType } from '../types' export function handleApiError(err: HttpError, dispatch: AppThunkDispatch, history?: History) { console.error('Error:', err) diff --git a/src/api/fetch.ts b/src/app/api/fetch.ts similarity index 91% rename from src/api/fetch.ts rename to src/app/api/fetch.ts index 2c1ec5a..12da1c9 100644 --- a/src/api/fetch.ts +++ b/src/app/api/fetch.ts @@ -5,14 +5,15 @@ import { ServerError, } from './errors' +import { pathJoin } from '../utils' + import { LOCAL_STORAGE_ACCESS_TOKEN_KEY, - LOCAL_STORAGE_ACCESS_TOKEN_AT_KEY, + LOCAL_STORAGE_ACCESS_TOKEN_EXPIRES_AT_KEY, LOCAL_STORAGE_REFRESH_TOKEN_KEY, } from '../constants' import { FetchOptions, FormNotification, NotificationType } from '../types' -import getConfig from '../config' interface RefreshResponse { id: string @@ -71,7 +72,6 @@ const getResponseData = async (response: Response) => { export const apiFetch: APIFetch = async (options: FetchOptions) => { const { path, method = 'get', body } = options const contentType = 'application/json' - const config = await getConfig() const doFetch = async () => { const headers = new Headers({ @@ -84,7 +84,7 @@ export const apiFetch: APIFetch = async (options: FetchOptions) => { const accessToken = localStorage.getItem(LOCAL_STORAGE_ACCESS_TOKEN_KEY) if (accessToken) headers.append('Authorization', `Bearer ${accessToken}`) - return await fetch(`${config.apiUrl}${path}`, { + return await fetch(`/${pathJoin('api', path)}`, { headers, method, body: body ? JSON.stringify(body) : undefined, @@ -96,7 +96,7 @@ export const apiFetch: APIFetch = async (options: FetchOptions) => { const refreshToken = localStorage.getItem(LOCAL_STORAGE_REFRESH_TOKEN_KEY) if (accessToken && refreshToken) { - const refreshResponse = await fetch(`${config.apiUrl}/v1/refresh`, { + const refreshResponse = await fetch('/api/v1/refresh', { headers: new Headers({ 'Content-Type': contentType, 'Authorization': `Bearer ${accessToken}` @@ -114,7 +114,7 @@ export const apiFetch: APIFetch = async (options: FetchOptions) => { const data = await getResponseData(refreshResponse) as RefreshResponse localStorage.setItem(LOCAL_STORAGE_ACCESS_TOKEN_KEY, data.access) - localStorage.setItem(LOCAL_STORAGE_ACCESS_TOKEN_AT_KEY, data.expires.toString()) + localStorage.setItem(LOCAL_STORAGE_ACCESS_TOKEN_EXPIRES_AT_KEY, data.expires.toString()) localStorage.setItem(LOCAL_STORAGE_REFRESH_TOKEN_KEY, data.refresh) const secondResponse = await doFetch() @@ -126,7 +126,7 @@ export const apiFetch: APIFetch = async (options: FetchOptions) => { } } - const accessTokenExpiresAt = localStorage.getItem(LOCAL_STORAGE_ACCESS_TOKEN_AT_KEY) + const accessTokenExpiresAt = localStorage.getItem(LOCAL_STORAGE_ACCESS_TOKEN_EXPIRES_AT_KEY) if (accessTokenExpiresAt && Date.now() >= parseInt(accessTokenExpiresAt, 10)) { return await doRefresh() } diff --git a/src/api/index.ts b/src/app/api/index.ts similarity index 100% rename from src/api/index.ts rename to src/app/api/index.ts diff --git a/src/app.tsx b/src/app/app.tsx similarity index 100% rename from src/app.tsx rename to src/app/app.tsx diff --git a/src/components/app-list-item.tsx b/src/app/components/app-list-item.tsx similarity index 79% rename from src/components/app-list-item.tsx rename to src/app/components/app-list-item.tsx index 6486f3d..d45be6f 100644 --- a/src/components/app-list-item.tsx +++ b/src/app/components/app-list-item.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react' import { Link } from 'react-router-dom' -import { useConfig, useTheme } from 'src/hooks' -import { App } from 'src/types' +import { useTheme } from '../hooks' +import { App } from '../types' interface Props { app: App @@ -9,13 +9,12 @@ interface Props { const AppListItem: FC = ({ app }) => { const theme = useTheme() - const config = useConfig() return (
{app.imageUrl &&
- +
}
diff --git a/src/components/app.tsx b/src/app/components/app.tsx similarity index 91% rename from src/components/app.tsx rename to src/app/components/app.tsx index c8d94f0..aea36ce 100644 --- a/src/components/app.tsx +++ b/src/app/components/app.tsx @@ -2,17 +2,15 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' import { BrowserRouter as Router, Route, Switch } from 'react-router-dom' -import { handleApiError } from 'src/api/errors' -import { fetchSelf, setChecked } from 'src/actions/authentication' -import { setConfig } from 'src/actions/config' -import { setTheme } from 'src/actions/theme' -import { getAuthenticatedUser } from 'src/selectors/authentication' -import { getFetching } from 'src/selectors' +import { handleApiError } from '../api/errors' +import { fetchSelf, setChecked } from '../actions/authentication' +import { setTheme } from '../actions/theme' +import { getAuthenticatedUser } from '../selectors/authentication' +import { getFetching } from '../selectors' -import getConfig from 'src/config' -import { LOCAL_STORAGE_ACCESS_TOKEN_KEY } from 'src/constants' -import { useDeepCompareEffect, useTheme } from 'src/hooks' -import { AppThunkDispatch } from 'src/types' +import { LOCAL_STORAGE_ACCESS_TOKEN_KEY } from '../constants' +import { useDeepCompareEffect, useTheme } from '../hooks' +import { AppThunkDispatch } from '../types' import Footer from './footer' import Logo from './logo' @@ -61,8 +59,6 @@ const App: FC = () => { } else { dispatch(setChecked()) } - - dispatch(setConfig(await getConfig())) } useEffect(() => { diff --git a/src/components/composer.tsx b/src/app/components/composer.tsx similarity index 92% rename from src/components/composer.tsx rename to src/app/components/composer.tsx index 2389233..55cb819 100644 --- a/src/components/composer.tsx +++ b/src/app/components/composer.tsx @@ -1,21 +1,21 @@ import React, { FC, useState, useEffect, useRef } from 'react' import { useSelector, useDispatch } from 'react-redux' -import { getOrigin } from 'src/utils' -import { useConfig, useDeepCompareEffect, useTheme } from 'src/hooks' +import { getOrigin } from '../utils' +import { useDeepCompareEffect, useTheme } from '../hooks' import { fetchInstallations, setSelectedInstallation, setHeight as setComposerHeight, setError as setComposerError, saveInstallationSettings, -} from 'src/actions/composer' -import { showNotification } from 'src/actions/notifications' -import { createPost } from 'src/actions/posts' -import { getInstallations, getSelectedInstallation, getError, getHeight as getComposerHeight } from 'src/selectors/composer' -import { getColorScheme } from 'src/selectors/theme' -import { AppThunkDispatch, NotificationType, Post } from 'src/types' -import { IncomingMessageData, OutgoingMessageData } from 'src/types/communicator' +} from '../actions/composer' +import { showNotification } from '../actions/notifications' +import { createPost } from '../actions/posts' +import { getInstallations, getSelectedInstallation, getError, getHeight as getComposerHeight } from '../selectors/composer' +import { getColorScheme } from '../selectors/theme' +import { AppThunkDispatch, NotificationType, Post } from '../types' +import { IncomingMessageData, OutgoingMessageData } from '../types/communicator' interface LimiterCollection { [key: string]: number @@ -33,7 +33,6 @@ const Composer: FC = ({ parent, onPost }) => { const installation = useSelector(getSelectedInstallation) const height = useSelector(getComposerHeight) const error = useSelector(getError) - const config = useConfig() const dispatch = useDispatch() const ref = useRef(null) const [limiters, setLimiters] = useState({}) @@ -214,7 +213,7 @@ const Composer: FC = ({ parent, onPost }) => {
{installations.map(i => (
handleClick(i.id)}> - {i.app.name} + {i.app.name}

{i.app.name}

))} diff --git a/src/components/controls/button.tsx b/src/app/components/controls/button.tsx similarity index 100% rename from src/components/controls/button.tsx rename to src/app/components/controls/button.tsx diff --git a/src/components/controls/checkbox-field.tsx b/src/app/components/controls/checkbox-field.tsx similarity index 79% rename from src/components/controls/checkbox-field.tsx rename to src/app/components/controls/checkbox-field.tsx index af33dd4..633b92a 100644 --- a/src/components/controls/checkbox-field.tsx +++ b/src/app/components/controls/checkbox-field.tsx @@ -1,9 +1,9 @@ import React, { FC } from 'react' import { useSelector, useDispatch } from 'react-redux' -import { useTheme } from 'src/hooks' -import { setFieldValue } from 'src/actions/forms' -import { getFieldValue } from 'src/selectors/forms' -import { AppState } from 'src/types' +import { useTheme } from '../../hooks' +import { setFieldValue } from '../../actions/forms' +import { getFieldValue } from '../../selectors/forms' +import { AppState } from '../../types' interface Props { name: string diff --git a/src/components/controls/cover-image-field.tsx b/src/app/components/controls/cover-image-field.tsx similarity index 74% rename from src/components/controls/cover-image-field.tsx rename to src/app/components/controls/cover-image-field.tsx index aeb5b5a..068144c 100644 --- a/src/components/controls/cover-image-field.tsx +++ b/src/app/components/controls/cover-image-field.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useConfig } from 'src/hooks' +import { MEDIA_COVER_MAX_SIZE } from '../../constants' import FileField from './file-field' interface Props { @@ -9,8 +9,7 @@ interface Props { } const CoverImageField: FC = ({ name, label = 'Cover Image', help = 'Approx 400 x 200. Max 5 MBs.' }) => { - const config = useConfig() - return + return } export default CoverImageField diff --git a/src/components/controls/field-label.tsx b/src/app/components/controls/field-label.tsx similarity index 85% rename from src/components/controls/field-label.tsx rename to src/app/components/controls/field-label.tsx index 7e503d5..70022a3 100644 --- a/src/components/controls/field-label.tsx +++ b/src/app/components/controls/field-label.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../../hooks' const FieldLabel: FC = ({ children }) => { const theme = useTheme() diff --git a/src/components/controls/file-field.tsx b/src/app/components/controls/file-field.tsx similarity index 78% rename from src/components/controls/file-field.tsx rename to src/app/components/controls/file-field.tsx index d69dc04..442bbbf 100644 --- a/src/components/controls/file-field.tsx +++ b/src/app/components/controls/file-field.tsx @@ -4,15 +4,16 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faUpload } from '@fortawesome/free-solid-svg-icons' import { BlockBlobClient, AnonymousCredential } from '@azure/storage-blob' -import { useConfig, useTheme } from 'src/hooks' -import { setFieldValue } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { getFieldValue } from 'src/selectors/forms' -import { apiFetch } from 'src/api/fetch' -import { AppState, AppThunkDispatch, SasResponse, NotificationType } from 'src/types' +import { useTheme } from '../../hooks' +import { setFieldValue } from '../../actions/forms' +import { showNotification } from '../../actions/notifications' +import { getFieldValue } from '../../selectors/forms' +import { apiFetch } from '../../api/fetch' +import { MEDIA_DEFAULT_MAX_SIZE } from '../../constants' +import { AppState, AppThunkDispatch, SasResponse, NotificationType } from '../../types' -import Progress from 'src/components/progress' -import FieldLabel from 'src/components/controls/field-label' +import Progress from '../../components/progress' +import FieldLabel from '../../components/controls/field-label' interface Props { name: string @@ -24,11 +25,10 @@ interface Props { const FileField: FC = props => { const theme = useTheme() - const value = useSelector(state => getFieldValue(state, props.name, false)) - const config = useConfig() + const value = useSelector(state => getFieldValue(state, props.name, '')) const dispatch = useDispatch() - const { name, label, help, previewWidth = 128, maxSize = config.media.defaultMaxSize } = props + const { name, label, help, previewWidth = 128, maxSize = MEDIA_DEFAULT_MAX_SIZE } = props const [progress, setProgress] = useState(0) const [uploading, setUploading] = useState(false) @@ -45,13 +45,13 @@ const FileField: FC = props => { } const ext = file.name.substring(file.name.lastIndexOf('.')) - const { sas, id } = await apiFetch({ path: '/v1/sas' }) + const { sas, blobUrl, id } = await apiFetch({ path: '/v1/sas' }) const filename = `${id}${ext}` setUploading(true) try { - const blockBlobClient = new BlockBlobClient(`${config.blobUrl}${filename}?${sas}`, new AnonymousCredential()) + const blockBlobClient = new BlockBlobClient(`${blobUrl}/${filename}?${sas}`, new AnonymousCredential()) await blockBlobClient.uploadBrowserData(file, { onProgress: p => { setProgress((p.loadedBytes / file.size) * 100) @@ -69,7 +69,7 @@ const FileField: FC = props => { } }) - dispatch(setFieldValue(name, filename)) + dispatch(setFieldValue(name, `${blobUrl}/${filename}`)) setUploaded(true) } catch (err) { console.error(err) @@ -105,9 +105,9 @@ const FileField: FC = props => { {label} {value &&
- +
- {value} + {value.split('/').pop()}    ( handleDelete()}>Delete)
diff --git a/src/components/controls/icon-image-field.tsx b/src/app/components/controls/icon-image-field.tsx similarity index 74% rename from src/components/controls/icon-image-field.tsx rename to src/app/components/controls/icon-image-field.tsx index 4f38e81..f0acd23 100644 --- a/src/components/controls/icon-image-field.tsx +++ b/src/app/components/controls/icon-image-field.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useConfig } from 'src/hooks' +import { MEDIA_ICON_MAX_SIZE } from '../../constants' import FileField from './file-field' interface Props { @@ -9,8 +9,7 @@ interface Props { } const IconImageField: FC = ({ name, label = 'Icon Image', help = 'Approx 32 x 32. Max 1 MB.' }) => { - const config = useConfig() - return + return } export default IconImageField diff --git a/src/components/controls/image-field.tsx b/src/app/components/controls/image-field.tsx similarity index 73% rename from src/components/controls/image-field.tsx rename to src/app/components/controls/image-field.tsx index 50ada96..c7a7b54 100644 --- a/src/components/controls/image-field.tsx +++ b/src/app/components/controls/image-field.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useConfig } from 'src/hooks' +import { MEDIA_DEFAULT_MAX_SIZE } from '../../constants' import FileField from './file-field' interface Props { @@ -9,8 +9,7 @@ interface Props { } const ImageField: FC = ({ name, label = 'Image', help = 'Approx 128 x 128. Max 5 MBs.' }) => { - const config = useConfig() - return + return } export default ImageField diff --git a/src/components/controls/password-field.tsx b/src/app/components/controls/password-field.tsx similarity index 89% rename from src/components/controls/password-field.tsx rename to src/app/components/controls/password-field.tsx index 7937432..2a395c2 100644 --- a/src/components/controls/password-field.tsx +++ b/src/app/components/controls/password-field.tsx @@ -3,13 +3,13 @@ import { useSelector, useDispatch } from 'react-redux' import zxcvbn from 'zxcvbn' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faKey } from '@fortawesome/free-solid-svg-icons' -import { useTheme } from 'src/hooks' -import { setFieldValue } from 'src/actions/forms' -import { getFieldValue, getFieldNotification } from 'src/selectors/forms' -import { AppState, FormNotification, NotificationType } from 'src/types' +import { useTheme } from '../../hooks' +import { setFieldValue } from '../../actions/forms' +import { getFieldValue, getFieldNotification } from '../../selectors/forms' +import { AppState, FormNotification, NotificationType } from '../../types' -import FieldLabel from 'src/components/controls/field-label' -import FormNotificationComponent from 'src/components/form-notification' +import FieldLabel from '../../components/controls/field-label' +import FormNotificationComponent from '../../components/form-notification' export interface Props { placeholder?: string diff --git a/src/components/controls/primary-button.tsx b/src/app/components/controls/primary-button.tsx similarity index 87% rename from src/components/controls/primary-button.tsx rename to src/app/components/controls/primary-button.tsx index 6d33ff7..69d94bb 100644 --- a/src/components/controls/primary-button.tsx +++ b/src/app/components/controls/primary-button.tsx @@ -1,9 +1,9 @@ import React, { FC, MouseEventHandler } from 'react' import noop from 'lodash/noop' import { IconDefinition } from '@fortawesome/fontawesome-common-types' -import { useTheme } from 'src/hooks' +import { useTheme } from '../../hooks' -import Button from 'src/components/controls/button' +import Button from '../../components/controls/button' export interface Props { text: string diff --git a/src/components/controls/secondary-button.tsx b/src/app/components/controls/secondary-button.tsx similarity index 87% rename from src/components/controls/secondary-button.tsx rename to src/app/components/controls/secondary-button.tsx index 7951b43..62a29f4 100644 --- a/src/components/controls/secondary-button.tsx +++ b/src/app/components/controls/secondary-button.tsx @@ -1,9 +1,9 @@ import React, { FC, MouseEventHandler } from 'react' import noop from 'lodash/noop' import { IconDefinition } from '@fortawesome/fontawesome-common-types' -import { useTheme } from 'src/hooks' +import { useTheme } from '../../hooks' -import Button from 'src/components/controls/button' +import Button from '../../components/controls/button' export interface Props { text: string diff --git a/src/components/controls/select-field.tsx b/src/app/components/controls/select-field.tsx similarity index 83% rename from src/components/controls/select-field.tsx rename to src/app/components/controls/select-field.tsx index c2d7f05..edab7b5 100644 --- a/src/components/controls/select-field.tsx +++ b/src/app/components/controls/select-field.tsx @@ -2,13 +2,13 @@ import React, { FC } from 'react' import { useSelector, useDispatch } from 'react-redux' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { IconDefinition } from '@fortawesome/fontawesome-svg-core' -import { useTheme } from 'src/hooks' -import { setFieldValue } from 'src/actions/forms' -import { getFieldValue, getFieldNotification } from 'src/selectors/forms' -import { AppState, FormNotification } from 'src/types' +import { useTheme } from '../../hooks' +import { setFieldValue } from '../../actions/forms' +import { getFieldValue, getFieldNotification } from '../../selectors/forms' +import { AppState, FormNotification } from '../../types' -import FieldLabel from 'src/components/controls/field-label' -import FormNotificationComponent from 'src/components/form-notification' +import FieldLabel from '../../components/controls/field-label' +import FormNotificationComponent from '../../components/form-notification' interface SelectOptions { [value: string]: string diff --git a/src/components/controls/static-field.tsx b/src/app/components/controls/static-field.tsx similarity index 91% rename from src/components/controls/static-field.tsx rename to src/app/components/controls/static-field.tsx index d7f94a5..6f7b783 100644 --- a/src/components/controls/static-field.tsx +++ b/src/app/components/controls/static-field.tsx @@ -1,9 +1,9 @@ import React, { FC } from 'react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { IconDefinition } from '@fortawesome/free-solid-svg-icons' -import { useTheme } from 'src/hooks' +import { useTheme } from '../../hooks' -import FieldLabel from 'src/components/controls/field-label' +import FieldLabel from '../../components/controls/field-label' interface Props { label: string diff --git a/src/components/controls/text-field.tsx b/src/app/components/controls/text-field.tsx similarity index 84% rename from src/components/controls/text-field.tsx rename to src/app/components/controls/text-field.tsx index e0b5abd..36d589c 100644 --- a/src/components/controls/text-field.tsx +++ b/src/app/components/controls/text-field.tsx @@ -3,14 +3,14 @@ import { useSelector, useDispatch } from 'react-redux' import noop from 'lodash/noop' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { IconDefinition } from '@fortawesome/fontawesome-common-types' -import { useTheme } from 'src/hooks' -import { setFieldValue } from 'src/actions/forms' -import { getFieldValue, getFieldNotification } from 'src/selectors/forms' -import { AppState, FormNotification, NotificationType } from 'src/types' +import { useTheme } from '../../hooks' +import { setFieldValue } from '../../actions/forms' +import { getFieldValue, getFieldNotification } from '../../selectors/forms' +import { AppState, FormNotification, NotificationType } from '../../types' -import FieldLabel from 'src/components/controls/field-label' -import FormNotificationComponent from 'src/components/form-notification' -import HelpText from 'src/components/help-text' +import FieldLabel from '../../components/controls/field-label' +import FormNotificationComponent from '../../components/form-notification' +import HelpText from '../../components/help-text' interface Props { name: string diff --git a/src/components/controls/textarea-field.tsx b/src/app/components/controls/textarea-field.tsx similarity index 81% rename from src/components/controls/textarea-field.tsx rename to src/app/components/controls/textarea-field.tsx index d68cff3..eaf23b3 100644 --- a/src/components/controls/textarea-field.tsx +++ b/src/app/components/controls/textarea-field.tsx @@ -1,13 +1,13 @@ import React, { FC, FocusEventHandler } from 'react' import { useSelector, useDispatch } from 'react-redux' import noop from 'lodash/noop' -import { useTheme } from 'src/hooks' -import { setFieldValue } from 'src/actions/forms' -import { getFieldValue, getFieldNotification } from 'src/selectors/forms' -import { AppState, FormNotification, NotificationType } from 'src/types' +import { useTheme } from '../../hooks' +import { setFieldValue } from '../../actions/forms' +import { getFieldValue, getFieldNotification } from '../../selectors/forms' +import { AppState, FormNotification, NotificationType } from '../../types' -import FieldLabel from 'src/components/controls/field-label' -import FormNotificationComponent from 'src/components/form-notification' +import FieldLabel from '../../components/controls/field-label' +import FormNotificationComponent from '../../components/form-notification' export interface Props { name: string diff --git a/src/components/controls/theme-field.tsx b/src/app/components/controls/theme-field.tsx similarity index 82% rename from src/components/controls/theme-field.tsx rename to src/app/components/controls/theme-field.tsx index 8c86a37..30224b4 100644 --- a/src/components/controls/theme-field.tsx +++ b/src/app/components/controls/theme-field.tsx @@ -1,15 +1,14 @@ import React, { FC, useState, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' import capitalize from 'lodash/capitalize' -import { useTheme } from 'src/hooks' -import { setFieldValue } from 'src/actions/forms' -import { setTheme } from 'src/actions/theme' -import { getFieldValue } from 'src/selectors/forms' -import { getThemeName } from 'src/selectors/theme' -import { AppState, Theme, ColorScheme } from 'src/types' - -import FieldLabel from 'src/components/controls/field-label' -import themes from 'src/themes' +import { useTheme } from '../../hooks' +import { setFieldValue } from '../../actions/forms' +import { setTheme } from '../../actions/theme' +import { getFieldValue } from '../../selectors/forms' +import { AppState, Theme, ColorScheme } from '../../types' + +import FieldLabel from '../../components/controls/field-label' +import themes from '../../themes' export interface Props { name: string diff --git a/src/components/create-group-form.tsx b/src/app/components/create-group-form.tsx similarity index 71% rename from src/components/create-group-form.tsx rename to src/app/components/create-group-form.tsx index 2f77292..f1bc442 100644 --- a/src/components/create-group-form.tsx +++ b/src/app/components/create-group-form.tsx @@ -3,16 +3,16 @@ import { useDispatch } from 'react-redux' import { Link } from 'react-router-dom' import { faIdCard } from '@fortawesome/free-solid-svg-icons' -import { checkGroupAvailability } from 'src/actions/registration' -import { useTheme } from 'src/hooks' +import { checkGroupAvailability } from '../actions/registration' +import { useTheme } from '../hooks' -import CheckboxField from 'src/components/controls/checkbox-field' -import TextField from 'src/components/controls/text-field' -import SelectField from 'src/components/controls/select-field' -import ImageField from 'src/components/controls/image-field' -import CoverImageField from 'src/components/controls/cover-image-field' -import IconImageField from 'src/components/controls/icon-image-field' -import ThemeField from 'src/components/controls/theme-field' +import CheckboxField from '../components/controls/checkbox-field' +import TextField from '../components/controls/text-field' +import SelectField from '../components/controls/select-field' +import ImageField from '../components/controls/image-field' +import CoverImageField from '../components/controls/cover-image-field' +import IconImageField from '../components/controls/icon-image-field' +import ThemeField from '../components/controls/theme-field' const CreateGroupForm: FC = () => { const theme = useTheme() diff --git a/src/components/create-group-step.tsx b/src/app/components/create-group-step.tsx similarity index 76% rename from src/components/create-group-step.tsx rename to src/app/components/create-group-step.tsx index ac1cb68..71521be 100644 --- a/src/components/create-group-step.tsx +++ b/src/app/components/create-group-step.tsx @@ -2,19 +2,19 @@ import React, { FC } from 'react' import { useSelector, useDispatch } from 'react-redux' import { faArrowLeft } from '@fortawesome/free-solid-svg-icons' -import { setFieldNotification } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { setStep } from 'src/actions/registration' -import { getForm } from 'src/selectors/forms' +import { setFieldNotification } from '../actions/forms' +import { showNotification } from '../actions/notifications' +import { setStep } from '../actions/registration' +import { getForm } from '../selectors/forms' -import { valueFromForm } from 'src/utils' -import { MAX_ID_LENGTH } from 'src/constants' -import { AppThunkDispatch, NotificationType } from 'src/types' +import { valueFromForm } from '../utils' +import { MAX_ID_LENGTH } from '../constants' +import { AppThunkDispatch, NotificationType } from '../types' import CreateGroupForm from './create-group-form' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' -import SecondaryButton from 'src/components/controls/secondary-button' +import HorizontalRule from '../components/horizontal-rule' +import PrimaryButton from '../components/controls/primary-button' +import SecondaryButton from '../components/controls/secondary-button' interface Props { register: () => void diff --git a/src/components/create-user-form.tsx b/src/app/components/create-user-form.tsx similarity index 73% rename from src/components/create-user-form.tsx rename to src/app/components/create-user-form.tsx index cb27aea..54c93c8 100644 --- a/src/components/create-user-form.tsx +++ b/src/app/components/create-user-form.tsx @@ -2,17 +2,17 @@ import React, { FC } from 'react' import { useDispatch } from 'react-redux' import { Link } from 'react-router-dom' import { faEnvelope, faIdCard, faUserShield } from '@fortawesome/free-solid-svg-icons' -import { checkUserAvailability } from 'src/actions/registration' -import { PRIVACY_OPTIONS } from 'src/constants' -import { useTheme } from 'src/hooks' +import { checkUserAvailability } from '../actions/registration' +import { PRIVACY_OPTIONS } from '../constants' +import { useTheme } from '../hooks' -import CheckboxField from 'src/components/controls/checkbox-field' -import TextField from 'src/components/controls/text-field' -import PasswordField from 'src/components/controls/password-field' -import SelectField from 'src/components/controls/select-field' -import ImageField from 'src/components/controls/image-field' -import CoverImageField from 'src/components/controls/cover-image-field' -import ThemeField from 'src/components/controls/theme-field' +import CheckboxField from '../components/controls/checkbox-field' +import TextField from '../components/controls/text-field' +import PasswordField from '../components/controls/password-field' +import SelectField from '../components/controls/select-field' +import ImageField from '../components/controls/image-field' +import CoverImageField from '../components/controls/cover-image-field' +import ThemeField from '../components/controls/theme-field' const CreateUserForm: FC = () => { const theme = useTheme() diff --git a/src/components/create-user-step.tsx b/src/app/components/create-user-step.tsx similarity index 83% rename from src/components/create-user-step.tsx rename to src/app/components/create-user-step.tsx index 8732b2c..819abee 100644 --- a/src/components/create-user-step.tsx +++ b/src/app/components/create-user-step.tsx @@ -2,18 +2,18 @@ import React, { FC } from 'react' import { useSelector, useDispatch } from 'react-redux' import zxcvbn from 'zxcvbn' -import { setFieldNotification } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { setStep } from 'src/actions/registration' -import { getForm } from 'src/selectors/forms' -import { MAX_ID_LENGTH, MAX_NAME_LENGTH } from 'src/constants' -import { valueFromForm } from 'src/utils' +import { setFieldNotification } from '../actions/forms' +import { showNotification } from '../actions/notifications' +import { setStep } from '../actions/registration' +import { getForm } from '../selectors/forms' +import { MAX_ID_LENGTH, MAX_NAME_LENGTH } from '../constants' +import { valueFromForm } from '../utils' -import { AppThunkDispatch, NotificationType } from 'src/types' +import { AppThunkDispatch, NotificationType } from '../types' import CreateUserForm from './create-user-form' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' +import HorizontalRule from '../components/horizontal-rule' +import PrimaryButton from '../components/controls/primary-button' const CreateUserStep: FC = () => { const form = useSelector(getForm) diff --git a/src/components/footer.tsx b/src/app/components/footer.tsx similarity index 94% rename from src/components/footer.tsx rename to src/app/components/footer.tsx index e8d0620..4c278e3 100644 --- a/src/components/footer.tsx +++ b/src/app/components/footer.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react' import { Link } from 'react-router-dom' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const Divider: FC = () => <>  ⚬   diff --git a/src/components/form-notification.tsx b/src/app/components/form-notification.tsx similarity index 83% rename from src/components/form-notification.tsx rename to src/app/components/form-notification.tsx index db73908..bbf890f 100644 --- a/src/components/form-notification.tsx +++ b/src/app/components/form-notification.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' -import { NotificationType, FormNotification } from 'src/types' +import { useTheme } from '../hooks' +import { NotificationType, FormNotification } from '../types' interface Props { notification: FormNotification diff --git a/src/components/group-invitations.tsx b/src/app/components/group-invitations.tsx similarity index 87% rename from src/components/group-invitations.tsx rename to src/app/components/group-invitations.tsx index 77f4554..357b68c 100644 --- a/src/components/group-invitations.tsx +++ b/src/app/components/group-invitations.tsx @@ -4,17 +4,17 @@ import { Link, useHistory } from 'react-router-dom' import { faCheckCircle, faStopwatch, faPauseCircle } from '@fortawesome/free-solid-svg-icons' import moment from 'moment' -import { useTheme } from 'src/hooks' -import { handleApiError } from 'src/api/errors' -import { fetchInvitations, createInvitation } from 'src/actions/groups' -import { getInvitations } from 'src/selectors/groups' -import { getFieldValue } from 'src/selectors/forms' +import { useTheme } from '../hooks' +import { handleApiError } from '../api/errors' +import { fetchInvitations, createInvitation } from '../actions/groups' +import { getInvitations } from '../selectors/groups' +import { getFieldValue } from '../selectors/forms' -import { AppState, AppThunkDispatch } from 'src/types' +import { AppState, AppThunkDispatch } from '../types' -import PrimaryButton from 'src/components/controls/primary-button' -import Subtitle from 'src/components/subtitle' -import SelectField from 'src/components/controls/select-field' +import PrimaryButton from '../components/controls/primary-button' +import Subtitle from '../components/subtitle' +import SelectField from '../components/controls/select-field' interface Props { group: string diff --git a/src/components/group-list-item.tsx b/src/app/components/group-list-item.tsx similarity index 79% rename from src/components/group-list-item.tsx rename to src/app/components/group-list-item.tsx index 2bcb8e6..8d025cf 100644 --- a/src/components/group-list-item.tsx +++ b/src/app/components/group-list-item.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react' import { Link } from 'react-router-dom' -import { useTheme, useConfig } from 'src/hooks' -import { Group } from 'src/types' +import { useTheme } from '../hooks' +import { Group } from '../types' interface Props { group: Group @@ -9,13 +9,12 @@ interface Props { const GroupListItem: FC = ({ group }) => { const theme = useTheme() - const config = useConfig() return (
{group.imageUrl &&
- +
}
diff --git a/src/components/group-logs.tsx b/src/app/components/group-logs.tsx similarity index 88% rename from src/components/group-logs.tsx rename to src/app/components/group-logs.tsx index 00c6c99..ef0566f 100644 --- a/src/components/group-logs.tsx +++ b/src/app/components/group-logs.tsx @@ -3,10 +3,10 @@ import { useSelector, useDispatch } from 'react-redux' import { Link } from 'react-router-dom' import moment from 'moment' -import { handleApiError } from 'src/api/errors' -import { fetchLogs } from 'src/actions/groups' -import { getLogs } from 'src/selectors/groups' -import { useTheme } from 'src/hooks' +import { handleApiError } from '../api/errors' +import { fetchLogs } from '../actions/groups' +import { getLogs } from '../selectors/groups' +import { useTheme } from '../hooks' interface Props { group: string diff --git a/src/components/help-text.tsx b/src/app/components/help-text.tsx similarity index 86% rename from src/components/help-text.tsx rename to src/app/components/help-text.tsx index df5bcb3..e1ef43e 100644 --- a/src/components/help-text.tsx +++ b/src/app/components/help-text.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const Notification: FC = ({ children }) => { const theme = useTheme() diff --git a/src/components/horizontal-rule.tsx b/src/app/components/horizontal-rule.tsx similarity index 85% rename from src/components/horizontal-rule.tsx rename to src/app/components/horizontal-rule.tsx index 6e12772..85adb19 100644 --- a/src/components/horizontal-rule.tsx +++ b/src/app/components/horizontal-rule.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const HorizontalRule: FC = () => { const theme = useTheme() diff --git a/src/components/level.tsx b/src/app/components/level.tsx similarity index 88% rename from src/components/level.tsx rename to src/app/components/level.tsx index c749863..721bf82 100644 --- a/src/components/level.tsx +++ b/src/app/components/level.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' -import { LevelItem } from 'src/types' +import { useTheme } from '../hooks' +import { LevelItem } from '../types' interface Props { items: LevelItem[] diff --git a/src/components/logo.tsx b/src/app/components/logo.tsx similarity index 91% rename from src/components/logo.tsx rename to src/app/components/logo.tsx index 8a80abf..457eb17 100644 --- a/src/components/logo.tsx +++ b/src/app/components/logo.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react' import { useHistory } from 'react-router-dom' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const Logo: FC = () => { const theme = useTheme() diff --git a/src/components/member-list-item.tsx b/src/app/components/member-list-item.tsx similarity index 92% rename from src/components/member-list-item.tsx rename to src/app/components/member-list-item.tsx index 08cc8e7..fda410a 100644 --- a/src/components/member-list-item.tsx +++ b/src/app/components/member-list-item.tsx @@ -1,8 +1,8 @@ import React, { FC } from 'react' import { Link } from 'react-router-dom' import capitalize from 'lodash/capitalize' -import { useTheme } from 'src/hooks' -import { User, GroupMembershipType } from 'src/types' +import { useTheme } from '../hooks' +import { User, GroupMembershipType } from '../types' interface Props { member: User diff --git a/src/components/member-list.tsx b/src/app/components/member-list.tsx similarity index 79% rename from src/components/member-list.tsx rename to src/app/components/member-list.tsx index a6eda82..e1a4516 100644 --- a/src/components/member-list.tsx +++ b/src/app/components/member-list.tsx @@ -2,10 +2,10 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router-dom' -import { handleApiError } from 'src/api/errors' -import { fetchGroupMembers } from 'src/actions/groups' -import { getGroupMembers } from 'src/selectors/groups' -import { AppState, User, AppThunkDispatch } from 'src/types' +import { handleApiError } from '../api/errors' +import { fetchGroupMembers } from '../actions/groups' +import { getGroupMembers } from '../selectors/groups' +import { AppState, User, AppThunkDispatch } from '../types' import MemberListItem from './member-list-item' diff --git a/src/components/navigation-menu.tsx b/src/app/components/navigation-menu.tsx similarity index 92% rename from src/components/navigation-menu.tsx rename to src/app/components/navigation-menu.tsx index 676dcf8..1337e04 100644 --- a/src/components/navigation-menu.tsx +++ b/src/app/components/navigation-menu.tsx @@ -3,10 +3,10 @@ import { Link } from 'react-router-dom' import { useSelector, useDispatch } from 'react-redux' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faStream, faPaperPlane, faSun, faMoon } from '@fortawesome/free-solid-svg-icons' -import { useTheme } from 'src/hooks' -import { setColorScheme } from 'src/actions/theme' -import { getColorScheme } from 'src/selectors/theme' -import { ColorScheme } from 'src/types' +import { useTheme } from '../hooks' +import { setColorScheme } from '../actions/theme' +import { getColorScheme } from '../selectors/theme' +import { ColorScheme } from '../types' const NavigationMenu: FC = () => { const theme = useTheme() diff --git a/src/components/notification-container.tsx b/src/app/components/notification-container.tsx similarity index 93% rename from src/components/notification-container.tsx rename to src/app/components/notification-container.tsx index c983d31..f6f417f 100644 --- a/src/components/notification-container.tsx +++ b/src/app/components/notification-container.tsx @@ -3,8 +3,8 @@ import { useSelector, useDispatch } from 'react-redux' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faDoorOpen } from '@fortawesome/free-solid-svg-icons' -import { setNotificationAuto, removeNotification } from 'src/actions/notifications' -import { getNotifications } from 'src/selectors' +import { setNotificationAuto, removeNotification } from '../actions/notifications' +import { getNotifications } from '../selectors' import Notification from './notification' diff --git a/src/components/notification.tsx b/src/app/components/notification.tsx similarity index 93% rename from src/components/notification.tsx rename to src/app/components/notification.tsx index bd6d5d5..ba5f54b 100644 --- a/src/components/notification.tsx +++ b/src/app/components/notification.tsx @@ -1,8 +1,8 @@ import React, { FC, MouseEventHandler } from 'react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faWindowClose } from '@fortawesome/free-solid-svg-icons' -import { useTheme } from 'src/hooks' -import { NotificationType } from 'src/types' +import { useTheme } from '../hooks' +import { NotificationType } from '../types' interface Props { id: string diff --git a/src/components/pages/about.tsx b/src/app/components/pages/about.tsx similarity index 82% rename from src/components/pages/about.tsx rename to src/app/components/pages/about.tsx index 12663b6..9a02f3f 100644 --- a/src/components/pages/about.tsx +++ b/src/app/components/pages/about.tsx @@ -1,11 +1,11 @@ import React, { FC, useEffect } from 'react' import { Link } from 'react-router-dom' -import { useTheme } from 'src/hooks' -import { setTitle } from 'src/utils' +import { useTheme } from '../../hooks' +import { setTitle } from '../../utils' -import Section from 'src/components/section' -import Title from 'src/components/title' -import Subtitle from 'src/components/subtitle' +import Section from '../../components/section' +import Title from '../../components/title' +import Subtitle from '../../components/subtitle' const About: FC = () => { const theme = useTheme() diff --git a/src/components/pages/admin-apps.tsx b/src/app/components/pages/admin-apps.tsx similarity index 71% rename from src/components/pages/admin-apps.tsx rename to src/app/components/pages/admin-apps.tsx index 32d025d..e58b26d 100644 --- a/src/components/pages/admin-apps.tsx +++ b/src/app/components/pages/admin-apps.tsx @@ -1,21 +1,21 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router-dom' -import { useAuthenticationCheck, useTheme } from 'src/hooks' -import { fetchPendingApps, activateApp, setPreinstall } from 'src/actions/apps' -import { getAuthenticatedUser, getChecked } from 'src/selectors/authentication' -import { getPendingApps } from 'src/selectors/apps' -import { handleApiError } from 'src/api/errors' -import { setTitle } from 'src/utils' -import { AppThunkDispatch } from 'src/types' +import { useAuthenticationCheck, useTheme } from '../../hooks' +import { fetchPendingApps, activateApp, setPreinstall } from '../../actions/apps' +import { getAuthenticatedUser, getChecked } from '../../selectors/authentication' +import { getPendingApps } from '../../selectors/apps' +import { handleApiError } from '../../api/errors' +import { setTitle } from '../../utils' +import { AppThunkDispatch } from '../../types' -import Section from 'src/components/section' -import Title from 'src/components/title' -import Loading from 'src/components/pages/loading' -import AppListItem from 'src/components/app-list-item' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' -import SecondaryButton from 'src/components/controls/secondary-button' +import Section from '../../components/section' +import Title from '../../components/title' +import Loading from '../../components/pages/loading' +import AppListItem from '../../components/app-list-item' +import HorizontalRule from '../../components/horizontal-rule' +import PrimaryButton from '../../components/controls/primary-button' +import SecondaryButton from '../../components/controls/secondary-button' const AdminApps: FC = () => { useAuthenticationCheck() diff --git a/src/components/pages/admin-groups.tsx b/src/app/components/pages/admin-groups.tsx similarity index 68% rename from src/components/pages/admin-groups.tsx rename to src/app/components/pages/admin-groups.tsx index fdac219..cded583 100644 --- a/src/components/pages/admin-groups.tsx +++ b/src/app/components/pages/admin-groups.tsx @@ -1,20 +1,20 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router-dom' -import { useAuthenticationCheck, useTheme } from 'src/hooks' -import { fetchPendingGroups, activateGroup } from 'src/actions/groups' -import { getAuthenticatedUser, getChecked } from 'src/selectors/authentication' -import { getPendingGroups } from 'src/selectors/groups' -import { handleApiError } from 'src/api/errors' -import { setTitle } from 'src/utils' -import { AppThunkDispatch } from 'src/types' +import { useAuthenticationCheck, useTheme } from '../../hooks' +import { fetchPendingGroups, activateGroup } from '../../actions/groups' +import { getAuthenticatedUser, getChecked } from '../../selectors/authentication' +import { getPendingGroups } from '../../selectors/groups' +import { handleApiError } from '../../api/errors' +import { setTitle } from '../../utils' +import { AppThunkDispatch } from '../../types' -import Section from 'src/components/section' -import Title from 'src/components/title' -import Loading from 'src/components/pages/loading' -import GroupListItem from 'src/components/group-list-item' -import HorizontalRule from 'src/components//horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' +import Section from '../../components/section' +import Title from '../../components/title' +import Loading from '../../components/pages/loading' +import GroupListItem from '../../components/group-list-item' +import HorizontalRule from '../../components//horizontal-rule' +import PrimaryButton from '../../components/controls/primary-button' const AdminGroups: FC = () => { useAuthenticationCheck() diff --git a/src/components/pages/admin.tsx b/src/app/components/pages/admin.tsx similarity index 70% rename from src/components/pages/admin.tsx rename to src/app/components/pages/admin.tsx index fe90eeb..1f543c1 100644 --- a/src/components/pages/admin.tsx +++ b/src/app/components/pages/admin.tsx @@ -1,14 +1,14 @@ import React, { FC, useEffect } from 'react' import { useSelector } from 'react-redux' import { Link, useHistory } from 'react-router-dom' -import { useTheme, useAuthenticationCheck } from 'src/hooks' -import { getAuthenticatedUser, getChecked } from 'src/selectors/authentication' -import { setTitle } from 'src/utils' - -import Section from 'src/components/section' -import Title from 'src/components/title' -import HorizontalRule from 'src/components/horizontal-rule' -import Loading from 'src/components/pages/loading' +import { useTheme, useAuthenticationCheck } from '../../hooks' +import { getAuthenticatedUser, getChecked } from '../../selectors/authentication' +import { setTitle } from '../../utils' + +import Section from '../../components/section' +import Title from '../../components/title' +import HorizontalRule from '../../components/horizontal-rule' +import Loading from '../../components/pages/loading' const Admin: FC = () => { useAuthenticationCheck() diff --git a/src/components/pages/apps.tsx b/src/app/components/pages/apps.tsx similarity index 64% rename from src/components/pages/apps.tsx rename to src/app/components/pages/apps.tsx index a81e221..5101763 100644 --- a/src/components/pages/apps.tsx +++ b/src/app/components/pages/apps.tsx @@ -1,16 +1,16 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' -import { fetchApps } from 'src/actions/apps' -import { getApps } from 'src/selectors/apps' -import { useTheme } from 'src/hooks' -import { setTitle } from 'src/utils' -import { AppThunkDispatch } from 'src/types' - -import Title from 'src/components/title' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import AppListItem from 'src/components/app-list-item' +import { fetchApps } from '../../actions/apps' +import { getApps } from '../../selectors/apps' +import { useTheme } from '../../hooks' +import { setTitle } from '../../utils' +import { AppThunkDispatch } from '../../types' + +import Title from '../../components/title' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import AppListItem from '../../components/app-list-item' const Apps: FC = () => { const theme = useTheme() diff --git a/src/components/pages/create-app.tsx b/src/app/components/pages/create-app.tsx similarity index 82% rename from src/components/pages/create-app.tsx rename to src/app/components/pages/create-app.tsx index 7e95226..1962e4a 100644 --- a/src/components/pages/create-app.tsx +++ b/src/app/components/pages/create-app.tsx @@ -3,25 +3,25 @@ import { useDispatch, useSelector } from 'react-redux' import { Link, useHistory } from 'react-router-dom' import { faCheckCircle, faIdCard, faLink, faAddressBook, faCodeBranch } from '@fortawesome/free-solid-svg-icons' -import { checkAppAvailability, createApp } from 'src/actions/apps' -import { initForm, initField, setFieldNotification } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { getForm } from 'src/selectors/forms' -import { getIsFetching } from 'src/selectors/requests' -import { useTheme } from 'src/hooks' -import { setTitle, valueFromForm } from 'src/utils' -import { AppState, NotificationType, AppThunkDispatch, RequestKey } from 'src/types' - -import Title from 'src/components/title' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' -import TextField from 'src/components/controls/text-field' -import TextareaField from 'src/components/controls/textarea-field' -import CheckboxField from 'src/components/controls/checkbox-field' -import ImageField from 'src/components/controls/image-field' -import CoverImageField from 'src/components/controls/cover-image-field' -import IconImageField from 'src/components/controls/icon-image-field' +import { checkAppAvailability, createApp } from '../../actions/apps' +import { initForm, initField, setFieldNotification } from '../../actions/forms' +import { showNotification } from '../../actions/notifications' +import { getForm } from '../../selectors/forms' +import { getIsFetching } from '../../selectors/requests' +import { useTheme } from '../../hooks' +import { setTitle, valueFromForm } from '../../utils' +import { AppState, NotificationType, AppThunkDispatch, RequestKey } from '../../types' + +import Title from '../../components/title' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import PrimaryButton from '../../components/controls/primary-button' +import TextField from '../../components/controls/text-field' +import TextareaField from '../../components/controls/textarea-field' +import CheckboxField from '../../components/controls/checkbox-field' +import ImageField from '../../components/controls/image-field' +import CoverImageField from '../../components/controls/cover-image-field' +import IconImageField from '../../components/controls/icon-image-field' const CreateApp: FC = () => { const theme = useTheme() diff --git a/src/components/pages/developers.tsx b/src/app/components/pages/developers.tsx similarity index 82% rename from src/components/pages/developers.tsx rename to src/app/components/pages/developers.tsx index 93c27ee..f7670cb 100644 --- a/src/components/pages/developers.tsx +++ b/src/app/components/pages/developers.tsx @@ -3,16 +3,16 @@ import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router-dom' import { faPlusCircle } from '@fortawesome/free-solid-svg-icons' -import { fetchCreatedApps } from 'src/actions/apps' -import { getCreatedApps } from 'src/selectors/apps' -import { setTitle } from 'src/utils' -import { AppThunkDispatch } from 'src/types' +import { fetchCreatedApps } from '../../actions/apps' +import { getCreatedApps } from '../../selectors/apps' +import { setTitle } from '../../utils' +import { AppThunkDispatch } from '../../types' -import Title from 'src/components/title' -import Subtitle from 'src/components/subtitle' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' +import Title from '../../components/title' +import Subtitle from '../../components/subtitle' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import PrimaryButton from '../../components/controls/primary-button' const Developers: FC = () => { const apps = useSelector(getCreatedApps) diff --git a/src/components/pages/edit-app.tsx b/src/app/components/pages/edit-app.tsx similarity index 82% rename from src/components/pages/edit-app.tsx rename to src/app/components/pages/edit-app.tsx index 175a6d6..23b25af 100644 --- a/src/components/pages/edit-app.tsx +++ b/src/app/components/pages/edit-app.tsx @@ -3,30 +3,30 @@ import { useSelector, useDispatch } from 'react-redux' import { useParams, useHistory } from 'react-router-dom' import { faIdCard, faCheckCircle, faKey, faShieldAlt, faLink, faAddressBook, faCodeBranch } from '@fortawesome/free-solid-svg-icons' -import { handleApiError } from 'src/api/errors' -import { fetchApp, updateApp } from 'src/actions/apps' -import { initForm, initField, setFieldNotification } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { getAuthenticatedUserId } from 'src/selectors/authentication' -import { getEntity } from 'src/selectors/entities' -import { getForm } from 'src/selectors/forms' -import { getIsFetching } from 'src/selectors/requests' - -import { useAuthenticationCheck, useDeepCompareEffect, useTheme } from 'src/hooks' -import { setTitle, valueFromForm } from 'src/utils' -import { AppState, AppThunkDispatch, EntityType, App, NotificationType, RequestKey } from 'src/types' - -import Title from 'src/components/title' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import Loading from 'src/components/pages/loading' -import TextField from 'src/components/controls/text-field' -import TextareaField from 'src/components/controls/textarea-field' -import ImageField from 'src/components/controls/image-field' -import CoverImageField from 'src/components/controls/cover-image-field' -import IconImageField from 'src/components/controls/icon-image-field' -import StaticField from 'src/components/controls/static-field' -import PrimaryButton from 'src/components/controls/primary-button' +import { handleApiError } from '../../api/errors' +import { fetchApp, updateApp } from '../../actions/apps' +import { initForm, initField, setFieldNotification } from '../../actions/forms' +import { showNotification } from '../../actions/notifications' +import { getAuthenticatedUserId } from '../../selectors/authentication' +import { getEntity } from '../../selectors/entities' +import { getForm } from '../../selectors/forms' +import { getIsFetching } from '../../selectors/requests' + +import { useAuthenticationCheck, useDeepCompareEffect, useTheme } from '../../hooks' +import { setTitle, valueFromForm } from '../../utils' +import { AppState, AppThunkDispatch, EntityType, App, NotificationType, RequestKey } from '../../types' + +import Title from '../../components/title' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import Loading from '../../components/pages/loading' +import TextField from '../../components/controls/text-field' +import TextareaField from '../../components/controls/textarea-field' +import ImageField from '../../components/controls/image-field' +import CoverImageField from '../../components/controls/cover-image-field' +import IconImageField from '../../components/controls/icon-image-field' +import StaticField from '../../components/controls/static-field' +import PrimaryButton from '../../components/controls/primary-button' interface Params { id: string diff --git a/src/components/pages/group-admin.tsx b/src/app/components/pages/group-admin.tsx similarity index 77% rename from src/components/pages/group-admin.tsx rename to src/app/components/pages/group-admin.tsx index e8a205b..a796cc6 100644 --- a/src/components/pages/group-admin.tsx +++ b/src/app/components/pages/group-admin.tsx @@ -3,14 +3,14 @@ import { useSelector, useDispatch } from 'react-redux' import { Link, useParams, useHistory } from 'react-router-dom' import { faCheckCircle, faIdCard } from '@fortawesome/free-solid-svg-icons' -import { handleApiError } from 'src/api/errors' -import { initForm, initField } from 'src/actions/forms' -import { fetchGroup, updateGroup } from 'src/actions/groups' -import { getEntity } from 'src/selectors/entities' -import { getForm } from 'src/selectors/forms' - -import { useDeepCompareEffect, useTheme } from 'src/hooks' -import { setTitle, valueFromForm } from 'src/utils' +import { handleApiError } from '../../api/errors' +import { initForm, initField } from '../../actions/forms' +import { fetchGroup, updateGroup } from '../../actions/groups' +import { getEntity } from '../../selectors/entities' +import { getForm } from '../../selectors/forms' + +import { useDeepCompareEffect, useTheme } from '../../hooks' +import { setTitle, valueFromForm } from '../../utils' import { AppState, AppThunkDispatch, @@ -18,23 +18,23 @@ import { GroupMembershipType, Tab, EntityType, -} from 'src/types' - -import Title from 'src/components/title' -import Subtitle from 'src/components/subtitle' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' -import MemberList from 'src/components/member-list' -import GroupInvitations from 'src/components/group-invitations' -import GroupLogs from 'src/components/group-logs' -import Loading from 'src/components/pages/loading' - -import TextareaField from 'src/components/controls/textarea-field' -import ImageField from 'src/components/controls/image-field' -import CoverImageField from 'src/components/controls/cover-image-field' -import IconImageField from 'src/components/controls/icon-image-field' -import StaticField from 'src/components/controls/static-field' +} from '../../types' + +import Title from '../../components/title' +import Subtitle from '../../components/subtitle' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import PrimaryButton from '../../components/controls/primary-button' +import MemberList from '../../components/member-list' +import GroupInvitations from '../../components/group-invitations' +import GroupLogs from '../../components/group-logs' +import Loading from '../../components/pages/loading' + +import TextareaField from '../../components/controls/textarea-field' +import ImageField from '../../components/controls/image-field' +import CoverImageField from '../../components/controls/cover-image-field' +import IconImageField from '../../components/controls/icon-image-field' +import StaticField from '../../components/controls/static-field' interface Params { id: string diff --git a/src/components/pages/groups.tsx b/src/app/components/pages/groups.tsx similarity index 69% rename from src/components/pages/groups.tsx rename to src/app/components/pages/groups.tsx index 766a362..7f4dfa3 100644 --- a/src/components/pages/groups.tsx +++ b/src/app/components/pages/groups.tsx @@ -3,16 +3,16 @@ import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router-dom' import { faPlusCircle } from '@fortawesome/free-solid-svg-icons' -import { fetchGroups } from 'src/actions/groups' -import { getGroups } from 'src/selectors/groups' -import { setTitle } from 'src/utils' -import { AppThunkDispatch } from 'src/types' - -import Title from 'src/components/title' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import GroupListItem from 'src/components/group-list-item' -import PrimaryButton from 'src/components/controls/primary-button' +import { fetchGroups } from '../../actions/groups' +import { getGroups } from '../../selectors/groups' +import { setTitle } from '../../utils' +import { AppThunkDispatch } from '../../types' + +import Title from '../../components/title' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import GroupListItem from '../../components/group-list-item' +import PrimaryButton from '../../components/controls/primary-button' const Groups: FC = () => { const groups = useSelector(getGroups) diff --git a/src/components/pages/home.tsx b/src/app/components/pages/home.tsx similarity index 65% rename from src/components/pages/home.tsx rename to src/app/components/pages/home.tsx index 4420330..e9f843a 100644 --- a/src/components/pages/home.tsx +++ b/src/app/components/pages/home.tsx @@ -1,16 +1,16 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' -import { fetchTimeline } from 'src/actions/posts' -import { getAuthenticated } from 'src/selectors/authentication' -import { setTitle } from 'src/utils' -import { AppThunkDispatch } from 'src/types' - -import Title from 'src/components/title' -import Composer from 'src/components/composer' -import Timeline from 'src/components/timeline' -import Section from 'src/components/section' -import Subtitle from 'src/components/subtitle' +import { fetchTimeline } from '../../actions/posts' +import { getAuthenticated } from '../../selectors/authentication' +import { setTitle } from '../../utils' +import { AppThunkDispatch } from '../../types' + +import Title from '../../components/title' +import Composer from '../../components/composer' +import Timeline from '../../components/timeline' +import Section from '../../components/section' +import Subtitle from '../../components/subtitle' const Home: FC = () => { const authenticated = useSelector(getAuthenticated) diff --git a/src/components/pages/loading.tsx b/src/app/components/pages/loading.tsx similarity index 81% rename from src/components/pages/loading.tsx rename to src/app/components/pages/loading.tsx index e7a62c5..4fe27d0 100644 --- a/src/components/pages/loading.tsx +++ b/src/app/components/pages/loading.tsx @@ -1,9 +1,9 @@ import React, { FC } from 'react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' -import { useTheme } from 'src/hooks' -import Title from 'src/components/title' -import Section from 'src/components/section' +import { useTheme } from '../../hooks' +import Title from '../../components/title' +import Section from '../../components/section' const Loading: FC = () => { const theme = useTheme() diff --git a/src/components/pages/login.tsx b/src/app/components/pages/login.tsx similarity index 72% rename from src/components/pages/login.tsx rename to src/app/components/pages/login.tsx index dd8970f..2a04f1f 100644 --- a/src/components/pages/login.tsx +++ b/src/app/components/pages/login.tsx @@ -3,21 +3,21 @@ import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router' import { faIdCard } from '@fortawesome/free-solid-svg-icons' -import { handleApiError } from 'src/api/errors' -import { authenticate } from 'src/actions/authentication' -import { showNotification } from 'src/actions/notifications' -import { getChecked, getAuthenticated } from 'src/selectors/authentication' -import { getFieldValue } from 'src/selectors/forms' -import { getIsFetching } from 'src/selectors/requests' -import { initForm, initField, setFieldNotification } from 'src/actions/forms' +import { handleApiError } from '../../api/errors' +import { authenticate } from '../../actions/authentication' +import { showNotification } from '../../actions/notifications' +import { getChecked, getAuthenticated } from '../../selectors/authentication' +import { getFieldValue } from '../../selectors/forms' +import { getIsFetching } from '../../selectors/requests' +import { initForm, initField, setFieldNotification } from '../../actions/forms' -import Title from 'src/components/title' -import Section from 'src/components/section' -import TextField from 'src/components/controls/text-field' -import PasswordField from 'src/components/controls/password-field' -import PrimaryButton from 'src/components/controls/primary-button' +import Title from '../../components/title' +import Section from '../../components/section' +import TextField from '../../components/controls/text-field' +import PasswordField from '../../components/controls/password-field' +import PrimaryButton from '../../components/controls/primary-button' -import { AppState, RequestKey, NotificationType } from 'src/types' +import { AppState, RequestKey, NotificationType } from '../../types' const Login: FC = () => { const checked = useSelector(getChecked) diff --git a/src/components/pages/register-group.tsx b/src/app/components/pages/register-group.tsx similarity index 77% rename from src/components/pages/register-group.tsx rename to src/app/components/pages/register-group.tsx index ba5cde4..b376a7a 100644 --- a/src/components/pages/register-group.tsx +++ b/src/app/components/pages/register-group.tsx @@ -3,26 +3,26 @@ import { useSelector, useDispatch } from 'react-redux' import { useParams, useHistory } from 'react-router' import { faUserPlus } from '@fortawesome/free-solid-svg-icons' -import { handleApiError } from 'src/api/errors' -import { fetchGroup } from 'src/actions/groups' -import { initField } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { register } from 'src/actions/registration' -import { getEntity } from 'src/selectors/entities' -import { getForm } from 'src/selectors/forms' - -import { setTitle, valueFromForm, getDefaultThemeName } from 'src/utils' -import { useDeepCompareEffect } from 'src/hooks' - -import { AppState, AppThunkDispatch, Group, EntityType, NotificationType } from 'src/types' - -import Title from 'src/components/title' -import Subtitle from 'src/components/subtitle' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' -import Loading from 'src/components/pages/loading' -import CreateUserForm from 'src/components/create-user-form' +import { handleApiError } from '../../api/errors' +import { fetchGroup } from '../../actions/groups' +import { initField } from '../../actions/forms' +import { showNotification } from '../../actions/notifications' +import { register } from '../../actions/registration' +import { getEntity } from '../../selectors/entities' +import { getForm } from '../../selectors/forms' + +import { setTitle, valueFromForm, getDefaultThemeName } from '../../utils' +import { useDeepCompareEffect } from '../../hooks' + +import { AppState, AppThunkDispatch, Group, EntityType, NotificationType } from '../../types' + +import Title from '../../components/title' +import Subtitle from '../../components/subtitle' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import PrimaryButton from '../../components/controls/primary-button' +import Loading from '../../components/pages/loading' +import CreateUserForm from '../../components/create-user-form' interface Params { id: string diff --git a/src/components/pages/register.tsx b/src/app/components/pages/register.tsx similarity index 84% rename from src/components/pages/register.tsx rename to src/app/components/pages/register.tsx index ed04e33..d81e73d 100644 --- a/src/components/pages/register.tsx +++ b/src/app/components/pages/register.tsx @@ -2,20 +2,20 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router' -import { handleApiError } from 'src/api/errors' -import { getForm } from 'src/selectors/forms' -import { getStep } from 'src/selectors/registration' -import { initForm, initField } from 'src/actions/forms' -import { showNotification } from 'src/actions/notifications' -import { createGroup, register } from 'src/actions/registration' -import { setTitle, valueFromForm, getDefaultThemeName } from 'src/utils' -import { AppThunkDispatch, NotificationType } from 'src/types' - -import Title from 'src/components/title' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import CreateGroupStep from 'src/components/create-group-step' -import CreateUserStep from 'src/components/create-user-step' +import { handleApiError } from '../../api/errors' +import { getForm } from '../../selectors/forms' +import { getStep } from '../../selectors/registration' +import { initForm, initField } from '../../actions/forms' +import { showNotification } from '../../actions/notifications' +import { createGroup, register } from '../../actions/registration' +import { setTitle, valueFromForm, getDefaultThemeName } from '../../utils' +import { AppThunkDispatch, NotificationType } from '../../types' + +import Title from '../../components/title' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import CreateGroupStep from '../../components/create-group-step' +import CreateUserStep from '../../components/create-user-step' const Register: FC = () => { const stepIndex = useSelector(getStep) diff --git a/src/components/pages/self.tsx b/src/app/components/pages/self.tsx similarity index 75% rename from src/components/pages/self.tsx rename to src/app/components/pages/self.tsx index 63c3b74..3b12892 100644 --- a/src/components/pages/self.tsx +++ b/src/app/components/pages/self.tsx @@ -3,31 +3,31 @@ import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router-dom' import { faDoorOpen, faCheckCircle, faIdCard, faEnvelope, faUserShield, faUserCircle } from '@fortawesome/free-solid-svg-icons' -import { unauthenticate, updateSelf } from 'src/actions/authentication' -import { initForm, initField } from 'src/actions/forms' -import { getAuthenticatedUser } from 'src/selectors/authentication' -import { getForm } from 'src/selectors/forms' - -import { handleApiError } from 'src/api/errors' -import { PRIVACY_OPTIONS } from 'src/constants' -import { useAuthenticationCheck, useDeepCompareEffect } from 'src/hooks' -import { setTitle, valueFromForm } from 'src/utils' - -import Title from 'src/components/title' -import Subtitle from 'src/components/subtitle' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import PrimaryButton from 'src/components/controls/primary-button' -import SecondaryButton from 'src/components/controls/secondary-button' -import Loading from 'src/components/pages/loading' -import TextField from 'src/components/controls/text-field' -import TextareaField from 'src/components/controls/textarea-field' -import SelectField from 'src/components/controls/select-field' -import CheckboxField from 'src/components/controls/checkbox-field' -import ImageField from 'src/components/controls/image-field' -import CoverImageField from 'src/components/controls/cover-image-field' -import ThemeField from 'src/components/controls/theme-field' -import StaticField from 'src/components/controls/static-field' +import { unauthenticate, updateSelf } from '../../actions/authentication' +import { initForm, initField } from '../../actions/forms' +import { getAuthenticatedUser } from '../../selectors/authentication' +import { getForm } from '../../selectors/forms' + +import { handleApiError } from '../../api/errors' +import { PRIVACY_OPTIONS } from '../../constants' +import { useAuthenticationCheck, useDeepCompareEffect } from '../../hooks' +import { setTitle, valueFromForm } from '../../utils' + +import Title from '../../components/title' +import Subtitle from '../../components/subtitle' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import PrimaryButton from '../../components/controls/primary-button' +import SecondaryButton from '../../components/controls/secondary-button' +import Loading from '../../components/pages/loading' +import TextField from '../../components/controls/text-field' +import TextareaField from '../../components/controls/textarea-field' +import SelectField from '../../components/controls/select-field' +import CheckboxField from '../../components/controls/checkbox-field' +import ImageField from '../../components/controls/image-field' +import CoverImageField from '../../components/controls/cover-image-field' +import ThemeField from '../../components/controls/theme-field' +import StaticField from '../../components/controls/static-field' const Self: FC = () => { const dispatch = useDispatch() diff --git a/src/components/pages/view-app.tsx b/src/app/components/pages/view-app.tsx similarity index 74% rename from src/components/pages/view-app.tsx rename to src/app/components/pages/view-app.tsx index 17cd2dc..e245d5e 100644 --- a/src/components/pages/view-app.tsx +++ b/src/app/components/pages/view-app.tsx @@ -4,24 +4,24 @@ import { Link, useParams, useHistory } from 'react-router-dom' import { faPlusSquare, faMinusSquare } from '@fortawesome/free-solid-svg-icons' import moment from 'moment' -import { handleApiError } from 'src/api/errors' -import { fetchApp, installApp, uninstallApp } from 'src/actions/apps' -import { fetchInstallations } from 'src/actions/composer' -import { getAuthenticatedUserId } from 'src/selectors/authentication' -import { getInstallations } from 'src/selectors/composer' -import { getEntity } from 'src/selectors/entities' -import { getIsFetching } from 'src/selectors/requests' - -import { useConfig, useTheme } from 'src/hooks' -import { setTitle, urlForBlob } from 'src/utils' -import { AppState, AppThunkDispatch, EntityType, App, RequestKey, LevelItem } from 'src/types' - -import Title from 'src/components/title' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import Button from 'src/components/controls/button' -import Level from 'src/components/level' -import Loading from 'src/components/pages/loading' +import { handleApiError } from '../../api/errors' +import { fetchApp, installApp, uninstallApp } from '../../actions/apps' +import { fetchInstallations } from '../../actions/composer' +import { getAuthenticatedUserId } from '../../selectors/authentication' +import { getInstallations } from '../../selectors/composer' +import { getEntity } from '../../selectors/entities' +import { getIsFetching } from '../../selectors/requests' + +import { useTheme } from '../../hooks' +import { setTitle } from '../../utils' +import { AppState, AppThunkDispatch, EntityType, App, RequestKey, LevelItem } from '../../types' + +import Title from '../../components/title' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import Button from '../../components/controls/button' +import Level from '../../components/level' +import Loading from '../../components/pages/loading' interface Params { id: string @@ -35,7 +35,6 @@ const ViewApp: FC = () => { const selfId = useSelector(getAuthenticatedUserId) const fetching = useSelector(state => getIsFetching(state, RequestKey.InstallApp) || getIsFetching(state, RequestKey.UninstallApp)) const dispatch = useDispatch() - const config = useConfig() const history = useHistory() useEffect(() => { @@ -78,9 +77,6 @@ const ViewApp: FC = () => { } } - const imageUrl = app.imageUrl ? urlForBlob(config, app.imageUrl) : undefined - const coverImageUrl = app.coverImageUrl ? urlForBlob(config, app.coverImageUrl) : undefined - const items: LevelItem[] = [] items.push({ label: 'Users', @@ -106,16 +102,16 @@ const ViewApp: FC = () => { return (
- {coverImageUrl && + {app.coverImageUrl &&
- +
}
- {imageUrl && + {app.imageUrl &&
- +
}
diff --git a/src/components/pages/view-group.tsx b/src/app/components/pages/view-group.tsx similarity index 73% rename from src/components/pages/view-group.tsx rename to src/app/components/pages/view-group.tsx index 43af56c..aefc8c6 100644 --- a/src/components/pages/view-group.tsx +++ b/src/app/components/pages/view-group.tsx @@ -4,24 +4,24 @@ import { useParams, useHistory } from 'react-router-dom' import { faEdit, faUserCheck, faBan } from '@fortawesome/free-solid-svg-icons' import moment from 'moment' -import { handleApiError } from 'src/api/errors' -import { setTheme } from 'src/actions/theme' -import { fetchGroup } from 'src/actions/groups' -import { getAuthenticated } from 'src/selectors/authentication' -import { getEntity } from 'src/selectors/entities' -import { getThemeName } from 'src/selectors/theme' - -import { useDeepCompareEffect, useConfig, useTheme, useSetting } from 'src/hooks' -import { setTitle, urlForBlob } from 'src/utils' -import { AppState, EntityType, Group, GroupMembershipType, AppThunkDispatch, LevelItem } from 'src/types' - -import Title from 'src/components/title' -import Level from 'src/components/level' -import Section from 'src/components/section' -import PrimaryButton from 'src/components/controls/primary-button' -import Button from 'src/components/controls/button' -import Loading from 'src/components/pages/loading' -import HorizontalRule from 'src/components/horizontal-rule' +import { handleApiError } from '../../api/errors' +import { setTheme } from '../../actions/theme' +import { fetchGroup } from '../../actions/groups' +import { getAuthenticated } from '../../selectors/authentication' +import { getEntity } from '../../selectors/entities' +import { getThemeName } from '../../selectors/theme' + +import { useDeepCompareEffect, useTheme, useSetting } from '../../hooks' +import { setTitle } from '../../utils' +import { AppState, EntityType, Group, GroupMembershipType, AppThunkDispatch, LevelItem } from '../../types' + +import Title from '../../components/title' +import Level from '../../components/level' +import Section from '../../components/section' +import PrimaryButton from '../../components/controls/primary-button' +import Button from '../../components/controls/button' +import Loading from '../../components/pages/loading' +import HorizontalRule from '../../components/horizontal-rule' interface Params { id: string @@ -35,7 +35,6 @@ const ViewGroup: FC = () => { const group = useSelector(state => getEntity(state, EntityType.Group, id)) const authenticated = useSelector(getAuthenticated) const dispatch = useDispatch() - const config = useConfig() const history = useHistory() const allowThemeChange = useSetting('allowThemeChange', true) @@ -62,8 +61,6 @@ const ViewGroup: FC = () => { const isAdmin = group.membership === GroupMembershipType.Admin const isMember = !!group.membership - const imageUrl = group.imageUrl ? urlForBlob(config, group.imageUrl) : undefined - const coverImageUrl = group.coverImageUrl ? urlForBlob(config, group.coverImageUrl) : undefined const items: LevelItem[] = [] items.push({ @@ -90,16 +87,16 @@ const ViewGroup: FC = () => { return (
- {coverImageUrl && + {group.coverImageUrl &&
- +
}
- {imageUrl && + {group.imageUrl &&
- +
}
diff --git a/src/components/pages/view-post.tsx b/src/app/components/pages/view-post.tsx similarity index 75% rename from src/components/pages/view-post.tsx rename to src/app/components/pages/view-post.tsx index f5ba57f..0f65117 100644 --- a/src/components/pages/view-post.tsx +++ b/src/app/components/pages/view-post.tsx @@ -4,22 +4,22 @@ import { useParams, useHistory } from 'react-router-dom' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faArrowsAltV } from '@fortawesome/free-solid-svg-icons' -import { handleApiError } from 'src/api/errors' -import { fetchPost } from 'src/actions/posts' -import { getAuthenticated, getChecked } from 'src/selectors/authentication' -import { getEntity } from 'src/selectors/entities' -import { getPostParents, getPostChildren } from 'src/selectors/posts' +import { handleApiError } from '../../api/errors' +import { fetchPost } from '../../actions/posts' +import { getAuthenticated, getChecked } from '../../selectors/authentication' +import { getEntity } from '../../selectors/entities' +import { getPostParents, getPostChildren } from '../../selectors/posts' -import { setTitle } from 'src/utils' -import { AppState, AppThunkDispatch, EntityType, Post } from 'src/types' +import { setTitle } from '../../utils' +import { AppState, AppThunkDispatch, EntityType, Post } from '../../types' -import Title from 'src/components/title' -import Subtitle from 'src/components/subtitle' -import Section from 'src/components/section' -import Loading from 'src/components/pages/loading' -import PostComponent from 'src/components/post' -import PostList from 'src/components/post-list' -import Composer from 'src/components/composer' +import Title from '../../components/title' +import Subtitle from '../../components/subtitle' +import Section from '../../components/section' +import Loading from '../../components/pages/loading' +import PostComponent from '../../components/post' +import PostList from '../../components/post-list' +import Composer from '../../components/composer' interface Params { id: string diff --git a/src/components/pages/view-user.tsx b/src/app/components/pages/view-user.tsx similarity index 80% rename from src/components/pages/view-user.tsx rename to src/app/components/pages/view-user.tsx index 7fde2cf..3a8dd6d 100644 --- a/src/components/pages/view-user.tsx +++ b/src/app/components/pages/view-user.tsx @@ -5,26 +5,26 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faUserPlus, faUserMinus, faUserClock, faBan } from '@fortawesome/free-solid-svg-icons' import moment from 'moment' -import { handleApiError } from 'src/api/errors' -import { fetchUser, subscribe, unsubscribe } from 'src/actions/users' -import { fetchUserPosts } from 'src/actions/posts' -import { setTheme } from 'src/actions/theme' -import { getEntity } from 'src/selectors/entities' -import { getAuthenticatedUser, getChecked } from 'src/selectors/authentication' -import { getUserPosts } from 'src/selectors/posts' -import { getThemeName } from 'src/selectors/theme' - -import { useDeepCompareEffect, useConfig, useTheme, useSetting } from 'src/hooks' -import { setTitle, urlForBlob } from 'src/utils' -import { AppState, EntityType, User, Post, AppThunkDispatch, LevelItem } from 'src/types' - -import Title from 'src/components/title' -import Subtitle from 'src/components/subtitle' -import Level from 'src/components/level' -import PostList from 'src/components/post-list' -import Section from 'src/components/section' -import HorizontalRule from 'src/components/horizontal-rule' -import Loading from 'src/components/pages/loading' +import { handleApiError } from '../../api/errors' +import { fetchUser, subscribe, unsubscribe } from '../../actions/users' +import { fetchUserPosts } from '../../actions/posts' +import { setTheme } from '../../actions/theme' +import { getEntity } from '../../selectors/entities' +import { getAuthenticatedUser, getChecked } from '../../selectors/authentication' +import { getUserPosts } from '../../selectors/posts' +import { getThemeName } from '../../selectors/theme' + +import { useDeepCompareEffect, useTheme, useSetting } from '../../hooks' +import { setTitle } from '../../utils' +import { AppState, EntityType, User, Post, AppThunkDispatch, LevelItem } from '../../types' + +import Title from '../../components/title' +import Subtitle from '../../components/subtitle' +import Level from '../../components/level' +import PostList from '../../components/post-list' +import Section from '../../components/section' +import HorizontalRule from '../../components/horizontal-rule' +import Loading from '../../components/pages/loading' interface Params { id: string @@ -40,7 +40,6 @@ const ViewUser: FC = () => { const user = useSelector(state => getEntity(state, EntityType.User, id)) const posts = useSelector(state => getUserPosts(state, id)) const dispatch = useDispatch() - const config = useConfig() const history = useHistory() const allowThemeChange = useSetting('allowThemeChange', true) @@ -72,8 +71,6 @@ const ViewUser: FC = () => { const isSelf = self && self.id === user.id const isGroup = self && self.group && user.group && self.group.id === user.group.id - const imageUrl = user.imageUrl ? urlForBlob(config, user.imageUrl) : undefined - const coverImageUrl = user.coverImageUrl ? urlForBlob(config, user.coverImageUrl) : undefined const subscription = self && user.subscriptions ? user.subscriptions.find(subscription => subscription.from === self.id && subscription.to === user.id) : undefined const subscribed = subscription && !subscription.pending const subscriptionPending = subscription && subscription.pending @@ -99,16 +96,16 @@ const ViewUser: FC = () => { return (
- {coverImageUrl && + {user.coverImageUrl &&
- +
}
- {imageUrl && + {user.imageUrl &&
- +
}
diff --git a/src/components/post-list.tsx b/src/app/components/post-list.tsx similarity index 82% rename from src/components/post-list.tsx rename to src/app/components/post-list.tsx index 4b270fc..05b2513 100644 --- a/src/components/post-list.tsx +++ b/src/app/components/post-list.tsx @@ -1,9 +1,9 @@ import React, { FC, useState } from 'react' -import { useTheme } from 'src/hooks' -import { classNames } from 'src/utils' -import { Post, ClassDictionary } from 'src/types' +import { useTheme } from '../hooks' +import { classNames } from '../utils' +import { Post, ClassDictionary } from '../types' -import PostComponent from 'src/components/post' +import PostComponent from '../components/post' interface Props { posts: Post[] diff --git a/src/components/post.tsx b/src/app/components/post.tsx similarity index 93% rename from src/components/post.tsx rename to src/app/components/post.tsx index f46db6d..767ad7a 100644 --- a/src/components/post.tsx +++ b/src/app/components/post.tsx @@ -4,12 +4,12 @@ import { Link } from 'react-router-dom' import moment from 'moment' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faClock, faReplyAll, faExclamationCircle } from '@fortawesome/free-solid-svg-icons' -import { useTheme } from 'src/hooks' -import { setEntities } from 'src/actions/entities' -import { normalize } from 'src/utils/normalization' -import { Post, EntityType } from 'src/types' +import { useTheme } from '../hooks' +import { setEntities } from '../actions/entities' +import { normalize } from '../utils/normalization' +import { Post, EntityType } from '../types' -import User from 'src/components/user' +import User from '../components/user' interface Props { post: Post diff --git a/src/components/progress.tsx b/src/app/components/progress.tsx similarity index 91% rename from src/components/progress.tsx rename to src/app/components/progress.tsx index feadab6..ff2b88e 100644 --- a/src/components/progress.tsx +++ b/src/app/components/progress.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' interface Props { value: number diff --git a/src/components/search.tsx b/src/app/components/search.tsx similarity index 91% rename from src/components/search.tsx rename to src/app/components/search.tsx index 612bc95..490d855 100644 --- a/src/components/search.tsx +++ b/src/app/components/search.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const App: FC = () => { const theme = useTheme() diff --git a/src/components/section.tsx b/src/app/components/section.tsx similarity index 88% rename from src/components/section.tsx rename to src/app/components/section.tsx index cabf37f..cb81b72 100644 --- a/src/components/section.tsx +++ b/src/app/components/section.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const Section: FC = ({ children }) => { const theme = useTheme() diff --git a/src/components/self-info.tsx b/src/app/components/self-info.tsx similarity index 79% rename from src/components/self-info.tsx rename to src/app/components/self-info.tsx index 5001a9c..b7ae53c 100644 --- a/src/components/self-info.tsx +++ b/src/app/components/self-info.tsx @@ -1,15 +1,13 @@ import React, { FC } from 'react' import { useSelector } from 'react-redux' import { Link } from 'react-router-dom' -import { getAuthenticatedUser } from 'src/selectors/authentication' -import { useConfig, useTheme } from 'src/hooks' -import { urlForBlob } from 'src/utils' +import { getAuthenticatedUser } from '../selectors/authentication' +import { useTheme } from '../hooks' -import HorizontalRule from 'src/components/horizontal-rule' +import HorizontalRule from '../components/horizontal-rule' const SelfInfo: FC = () => { const theme = useTheme() - const config = useConfig() const user = useSelector(getAuthenticatedUser) if (!user) { @@ -23,8 +21,7 @@ const SelfInfo: FC = () => { } const group = user.group - const imageUrl = user.imageUrl ? urlForBlob(config, user.imageUrl) : undefined - const groupImageUrl = group && group.iconImageUrl ? urlForBlob(config, group.iconImageUrl) : undefined + const groupImageUrl = group && group.iconImageUrl ? group.iconImageUrl : undefined const name = () => { if (user.name) { @@ -40,9 +37,9 @@ const SelfInfo: FC = () => { return (
- {imageUrl && + {user.imageUrl &&
- +
}
diff --git a/src/components/spinner.tsx b/src/app/components/spinner.tsx similarity index 91% rename from src/components/spinner.tsx rename to src/app/components/spinner.tsx index 8555a17..bd0d096 100644 --- a/src/components/spinner.tsx +++ b/src/app/components/spinner.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const Spinner: FC = () => { const theme = useTheme() diff --git a/src/components/subtitle.tsx b/src/app/components/subtitle.tsx similarity index 85% rename from src/components/subtitle.tsx rename to src/app/components/subtitle.tsx index aa571f0..7b09f1f 100644 --- a/src/components/subtitle.tsx +++ b/src/app/components/subtitle.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const Subtitle: FC = ({ children }) => { const theme = useTheme() diff --git a/src/components/timeline.tsx b/src/app/components/timeline.tsx similarity index 70% rename from src/components/timeline.tsx rename to src/app/components/timeline.tsx index 854b6ea..13de38b 100644 --- a/src/components/timeline.tsx +++ b/src/app/components/timeline.tsx @@ -2,14 +2,14 @@ import React, { FC, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router-dom' -import { handleApiError } from 'src/api/errors' -import { fetchTimeline } from 'src/actions/posts' -import { getTimeline } from 'src/selectors/posts' -import { getAuthenticated } from 'src/selectors/authentication' +import { handleApiError } from '../api/errors' +import { fetchTimeline } from '../actions/posts' +import { getTimeline } from '../selectors/posts' +import { getAuthenticated } from '../selectors/authentication' -import { AppThunkDispatch } from 'src/types' +import { AppThunkDispatch } from '../types' -import PostList from 'src/components/post-list' +import PostList from '../components/post-list' const Timeline: FC = () => { const authenticated = useSelector(getAuthenticated) diff --git a/src/components/title.tsx b/src/app/components/title.tsx similarity index 83% rename from src/components/title.tsx rename to src/app/components/title.tsx index 307f9cf..5fd34a6 100644 --- a/src/components/title.tsx +++ b/src/app/components/title.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { useTheme } from 'src/hooks' +import { useTheme } from '../hooks' const Title: FC = ({ children }) => { const theme = useTheme() diff --git a/src/components/user-apps.tsx b/src/app/components/user-apps.tsx similarity index 94% rename from src/components/user-apps.tsx rename to src/app/components/user-apps.tsx index 1fd02d9..f234fa2 100644 --- a/src/components/user-apps.tsx +++ b/src/app/components/user-apps.tsx @@ -3,7 +3,7 @@ import { Link } from 'react-router-dom' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faPlusCircle } from '@fortawesome/free-solid-svg-icons' -import { setTitle } from 'src/utils' +import { setTitle } from '../utils' const UserApps: FC = () => { useEffect(() => { diff --git a/src/components/user.tsx b/src/app/components/user.tsx similarity index 70% rename from src/components/user.tsx rename to src/app/components/user.tsx index a39aaa3..d63acc7 100644 --- a/src/components/user.tsx +++ b/src/app/components/user.tsx @@ -1,8 +1,7 @@ import React, { FC } from 'react' import { Link } from 'react-router-dom' -import { useTheme, useConfig } from 'src/hooks' -import { urlForBlob } from 'src/utils' -import { User } from 'src/types' +import { useTheme } from '../hooks' +import { User } from '../types' interface Props { user: User @@ -10,15 +9,13 @@ interface Props { const UserComponent: FC = ({ user }) => { const theme = useTheme() - const config = useConfig() - const imageUrl = user && user.imageUrl ? urlForBlob(config, user.imageUrl) : undefined - const groupImageUrl = user.group && user.group.iconImageUrl ? urlForBlob(config, user.group.iconImageUrl) : undefined + const groupImageUrl = user?.group?.iconImageUrl return (
- {imageUrl && + {user.imageUrl &&
- +
}
diff --git a/src/app/constants/index.ts b/src/app/constants/index.ts new file mode 100644 index 0000000..30772bc --- /dev/null +++ b/src/app/constants/index.ts @@ -0,0 +1,17 @@ +export const MAX_ID_LENGTH = 40 +export const MAX_NAME_LENGTH = 80 + +export const LOCAL_STORAGE_ACCESS_TOKEN_KEY = 'access-token' +export const LOCAL_STORAGE_ACCESS_TOKEN_EXPIRES_AT_KEY = 'access-token-expires-at' +export const LOCAL_STORAGE_REFRESH_TOKEN_KEY = 'refresh-token' + +export const MEDIA_DEFAULT_MAX_SIZE = 5242880 +export const MEDIA_COVER_MAX_SIZE = 5242880 +export const MEDIA_ICON_MAX_SIZE = 1048576 + +export const PRIVACY_OPTIONS = { + public: 'Anyone can see your posts', + group: 'Only the people in your community can see your posts', + subscribers: 'Only your subscribers can see your posts', + private: 'Nobody can see your posts', +} diff --git a/src/hooks/index.ts b/src/app/hooks/index.ts similarity index 87% rename from src/hooks/index.ts rename to src/app/hooks/index.ts index fed8bea..8db32cb 100644 --- a/src/hooks/index.ts +++ b/src/app/hooks/index.ts @@ -3,9 +3,8 @@ import { useSelector } from 'react-redux' import { useHistory } from 'react-router-dom' import isEqual from 'lodash/isEqual' -import { getAuthenticated, getChecked, getAuthenticatedUser } from 'src/selectors/authentication' -import { getTheme } from 'src/selectors/theme' -import { getConfig } from 'src/selectors' +import { getAuthenticated, getChecked, getAuthenticatedUser } from '../selectors/authentication' +import { getTheme } from '../selectors/theme' export const useAuthenticationCheck = () => { const checked = useSelector(getChecked) @@ -17,8 +16,6 @@ export const useAuthenticationCheck = () => { }, [checked, authenticated]) } -export const useConfig = () => useSelector(getConfig) - const useDeepCompareMemoize = (value: any) => { const ref = useRef() diff --git a/src/images/caret-down.svg b/src/app/images/caret-down.svg similarity index 100% rename from src/images/caret-down.svg rename to src/app/images/caret-down.svg diff --git a/src/app/images/favicon-16x16.png b/src/app/images/favicon-16x16.png new file mode 100644 index 0000000..495fbca Binary files /dev/null and b/src/app/images/favicon-16x16.png differ diff --git a/src/app/images/favicon-32x32.png b/src/app/images/favicon-32x32.png new file mode 100644 index 0000000..bbee67c Binary files /dev/null and b/src/app/images/favicon-32x32.png differ diff --git a/src/app/images/favicon.ico b/src/app/images/favicon.ico new file mode 100644 index 0000000..85b2a2e Binary files /dev/null and b/src/app/images/favicon.ico differ diff --git a/src/index.ejs b/src/app/index.ejs similarity index 82% rename from src/index.ejs rename to src/app/index.ejs index 1a751a6..6a5375f 100644 --- a/src/index.ejs +++ b/src/app/index.ejs @@ -4,9 +4,9 @@ Flexor +
- diff --git a/src/reducers/authentication.ts b/src/app/reducers/authentication.ts similarity index 100% rename from src/reducers/authentication.ts rename to src/app/reducers/authentication.ts diff --git a/src/reducers/composer.ts b/src/app/reducers/composer.ts similarity index 100% rename from src/reducers/composer.ts rename to src/app/reducers/composer.ts diff --git a/src/reducers/entities.ts b/src/app/reducers/entities.ts similarity index 100% rename from src/reducers/entities.ts rename to src/app/reducers/entities.ts diff --git a/src/reducers/forms.ts b/src/app/reducers/forms.ts similarity index 98% rename from src/reducers/forms.ts rename to src/app/reducers/forms.ts index d93d9c4..030faf5 100644 --- a/src/reducers/forms.ts +++ b/src/app/reducers/forms.ts @@ -2,7 +2,7 @@ import { Reducer } from 'redux' import { FormsActions } from '../actions/forms' import { FormsState } from '../types' -import { valueFromForm } from 'src/utils' +import { valueFromForm } from '../utils' const initialState: FormsState = { form: {}, diff --git a/src/reducers/lists.ts b/src/app/reducers/lists.ts similarity index 95% rename from src/reducers/lists.ts rename to src/app/reducers/lists.ts index 1526453..5221382 100644 --- a/src/reducers/lists.ts +++ b/src/app/reducers/lists.ts @@ -1,7 +1,7 @@ import { Reducer } from 'redux' import { ListsActions } from '../actions/lists' -import { EntityListsState, EntityList } from '../types' +import { EntityListsState } from '../types' const initialState: EntityListsState = {} diff --git a/src/reducers/notifications.ts b/src/app/reducers/notifications.ts similarity index 100% rename from src/reducers/notifications.ts rename to src/app/reducers/notifications.ts diff --git a/src/reducers/registration.ts b/src/app/reducers/registration.ts similarity index 100% rename from src/reducers/registration.ts rename to src/app/reducers/registration.ts diff --git a/src/reducers/requests.ts b/src/app/reducers/requests.ts similarity index 85% rename from src/reducers/requests.ts rename to src/app/reducers/requests.ts index c3260cc..579217c 100644 --- a/src/reducers/requests.ts +++ b/src/app/reducers/requests.ts @@ -8,7 +8,7 @@ const initialState: RequestsState = {} const reducer: Reducer = (state = initialState, action) => { switch (action.type) { case 'REQUESTS_START_REQUEST': { - const request = state[action.payload.id] ?? {} + const request = state[action.payload.id] ?? { id: action.payload.id } return { ...state, @@ -21,7 +21,8 @@ const reducer: Reducer = (state = initialState, } } case 'REQUESTS_FINISH_REQUEST': { - const request = state[action.payload.id] ?? {} + const request = state[action.payload.id] + if (!request) return state return { ...state, diff --git a/src/reducers/theme.ts b/src/app/reducers/theme.ts similarity index 100% rename from src/reducers/theme.ts rename to src/app/reducers/theme.ts diff --git a/src/selectors/apps.ts b/src/app/selectors/apps.ts similarity index 84% rename from src/selectors/apps.ts rename to src/app/selectors/apps.ts index 2ba0a66..58d5e1f 100644 --- a/src/selectors/apps.ts +++ b/src/app/selectors/apps.ts @@ -1,5 +1,5 @@ -import { denormalize } from 'src/utils/normalization' -import { AppState, EntityType, App, EntityListKey } from 'src/types' +import { denormalize } from '../utils/normalization' +import { AppState, EntityType, App, EntityListKey } from '../types' export const getApps = (state: AppState) => { const entityList = state.lists[EntityListKey.Apps] diff --git a/src/selectors/authentication.ts b/src/app/selectors/authentication.ts similarity index 84% rename from src/selectors/authentication.ts rename to src/app/selectors/authentication.ts index 01fd281..16cd43b 100644 --- a/src/selectors/authentication.ts +++ b/src/app/selectors/authentication.ts @@ -1,8 +1,8 @@ import { createSelector } from 'reselect' import { getEntityStore } from './entities' -import { denormalize } from 'src/utils/normalization' -import { AppState, User, EntityType } from 'src/types' +import { denormalize } from '../utils/normalization' +import { AppState, User, EntityType } from '../types' export const getChecked = (state: AppState) => state.authentication.checked export const getAuthenticated = (state: AppState) => state.authentication.checked && state.authentication.authenticated diff --git a/src/selectors/composer.ts b/src/app/selectors/composer.ts similarity index 80% rename from src/selectors/composer.ts rename to src/app/selectors/composer.ts index 8233570..69506f3 100644 --- a/src/selectors/composer.ts +++ b/src/app/selectors/composer.ts @@ -1,5 +1,5 @@ -import { denormalize } from 'src/utils/normalization' -import { AppState, EntityType, App, Installation } from 'src/types' +import { denormalize } from '../utils/normalization' +import { AppState, EntityType, Installation } from '../types' export const getInstallations = (state: AppState) => denormalize(state.composer.installations, EntityType.Installation, state.entities) as Installation[] export const getError = (state: AppState) => state.composer.error diff --git a/src/selectors/entities.ts b/src/app/selectors/entities.ts similarity index 88% rename from src/selectors/entities.ts rename to src/app/selectors/entities.ts index 73f4742..112a179 100644 --- a/src/selectors/entities.ts +++ b/src/app/selectors/entities.ts @@ -1,4 +1,4 @@ -import { denormalize } from 'src/utils/normalization' +import { denormalize } from '../utils/normalization' import { AppState, Entity, EntityType } from '../types' export const getEntityStore = (state: AppState) => state.entities diff --git a/src/selectors/forms.ts b/src/app/selectors/forms.ts similarity index 100% rename from src/selectors/forms.ts rename to src/app/selectors/forms.ts diff --git a/src/selectors/groups.ts b/src/app/selectors/groups.ts similarity index 93% rename from src/selectors/groups.ts rename to src/app/selectors/groups.ts index 86497b0..0512e64 100644 --- a/src/selectors/groups.ts +++ b/src/app/selectors/groups.ts @@ -1,5 +1,5 @@ -import { denormalize } from 'src/utils/normalization' -import { AppState, Group, User, EntityType, GroupLog, Invitation, EntityListKey } from 'src/types' +import { denormalize } from '../utils/normalization' +import { AppState, Group, User, EntityType, GroupLog, Invitation, EntityListKey } from '../types' export const getGroups = (state: AppState) => { const entityList = state.lists[EntityListKey.Groups] diff --git a/src/selectors/index.ts b/src/app/selectors/index.ts similarity index 87% rename from src/selectors/index.ts rename to src/app/selectors/index.ts index 7e0ce61..d20ddf3 100644 --- a/src/selectors/index.ts +++ b/src/app/selectors/index.ts @@ -5,7 +5,6 @@ import { AppState } from '../types' export const getNotifications = (state: AppState) => state.notifications export const getRequests = (state: AppState) => state.requests -export const getConfig = (state: AppState) => state.config export const getFetching = createSelector(getRequests, requests => { return values(requests).reduce((fetching, request) => fetching || request.fetching, false) diff --git a/src/selectors/lists.ts b/src/app/selectors/lists.ts similarity index 90% rename from src/selectors/lists.ts rename to src/app/selectors/lists.ts index 0cef4f0..c9c4f4c 100644 --- a/src/selectors/lists.ts +++ b/src/app/selectors/lists.ts @@ -1,4 +1,4 @@ -import { AppState } from 'src/types' +import { AppState } from '../types' export const getEntities = (state: AppState, name: string) => { const entityList = state.lists[name] diff --git a/src/selectors/posts.ts b/src/app/selectors/posts.ts similarity index 86% rename from src/selectors/posts.ts rename to src/app/selectors/posts.ts index dc5515a..2ccefe2 100644 --- a/src/selectors/posts.ts +++ b/src/app/selectors/posts.ts @@ -1,5 +1,5 @@ -import { denormalize } from 'src/utils/normalization' -import { AppState, Post, EntityType, EntityListKey } from 'src/types' +import { denormalize } from '../utils/normalization' +import { AppState, Post, EntityType, EntityListKey } from '../types' const getPostsFromList = (state: AppState, name: string) => { const entityList = state.lists[name] diff --git a/src/selectors/registration.ts b/src/app/selectors/registration.ts similarity index 65% rename from src/selectors/registration.ts rename to src/app/selectors/registration.ts index c97442d..b0a3b89 100644 --- a/src/selectors/registration.ts +++ b/src/app/selectors/registration.ts @@ -1,3 +1,3 @@ -import { AppState } from 'src/types' +import { AppState } from '../types' export const getStep = (state: AppState) => state.registration.step diff --git a/src/selectors/requests.ts b/src/app/selectors/requests.ts similarity index 72% rename from src/selectors/requests.ts rename to src/app/selectors/requests.ts index 2680720..b87f152 100644 --- a/src/selectors/requests.ts +++ b/src/app/selectors/requests.ts @@ -1,3 +1,3 @@ -import { AppState, RequestKey } from 'src/types' +import { AppState, RequestKey } from '../types' export const getIsFetching = (state: AppState, key: RequestKey) => state.requests[key] ? state.requests[key].fetching : false diff --git a/src/selectors/theme.ts b/src/app/selectors/theme.ts similarity index 76% rename from src/selectors/theme.ts rename to src/app/selectors/theme.ts index ef51704..3857740 100644 --- a/src/selectors/theme.ts +++ b/src/app/selectors/theme.ts @@ -1,5 +1,5 @@ -import themes from 'src/themes' -import { AppState } from 'src/types' +import themes from '../themes' +import { AppState } from '../types' export const getTheme = (state: AppState) => themes[state.theme.name][state.theme.scheme] export const getThemeName = (state: AppState) => state.theme.name diff --git a/src/store/index.ts b/src/app/store/index.ts similarity index 93% rename from src/store/index.ts rename to src/app/store/index.ts index a94971c..ca5cbe2 100644 --- a/src/store/index.ts +++ b/src/app/store/index.ts @@ -3,7 +3,6 @@ import { AppState } from '../types' import authentication from '../reducers/authentication' import composer from '../reducers/composer' -import config from '../reducers/config' import entities from '../reducers/entities' import forms from '../reducers/forms' import lists from '../reducers/lists' @@ -19,7 +18,6 @@ const store = createStore( combineReducers({ authentication, composer, - config, entities, forms, lists, diff --git a/src/styles/app.css b/src/app/styles/app.css similarity index 92% rename from src/styles/app.css rename to src/app/styles/app.css index 32b2cc6..89d91ef 100644 --- a/src/styles/app.css +++ b/src/app/styles/app.css @@ -1,10 +1,9 @@ @charset "utf-8"; -@import "normalize.css"; -@import url('https://fonts.googleapis.com/css?family=Quicksand:300,400,500,600,700&display=swap'); +@import "../../../node_modules/normalize.css/normalize.css"; :root { --default-border: 1px solid; - --default-font: 'Quicksand', sans-serif; + --default-font: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; --input-padding: 0.5rem 0.75rem; --content-width: 600px; --menu-width: 270px; @@ -16,16 +15,36 @@ html { font-weight: 300; } -body, div, h1, h2, input, select, textarea, label, button, p.help, section, div.icon { +body, +div, +h1, +h2, +input, +textarea, +select, +label, +button, +section, +p.help, +div.icon { transition: color 1s; } -input, select, textarea, button, div, div.content, div.menu, section, div.icon { +div, +input, +textarea, +select, +button, +section, +div.content, +div.menu, +div.icon { transition: background-color 1s, border-color 1s; } body { font-family: var(--default-font); + line-height: 1.2; margin: 0px; padding: 0px; } @@ -33,7 +52,8 @@ body { input, textarea, select { border: var(--default-border); border-radius: 0; - box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; font-family: var(--default-font); font-size: 0.9rem; margin: 0px; @@ -42,7 +62,9 @@ input, textarea, select { } select { - appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; background: url(../images/caret-down.svg) 98% / 2% no-repeat #ccc; } diff --git a/src/themes.ts b/src/app/themes.ts similarity index 98% rename from src/themes.ts rename to src/app/themes.ts index 8c2b94f..769fb15 100644 --- a/src/themes.ts +++ b/src/app/themes.ts @@ -1,4 +1,4 @@ -import { ThemeCollection, ColorScheme } from 'src/types' +import { ThemeCollection, ColorScheme } from './types' const themes: ThemeCollection = { 'blueish': { diff --git a/src/app/tsconfig.json b/src/app/tsconfig.json new file mode 100644 index 0000000..06bffb0 --- /dev/null +++ b/src/app/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "jsx": "react", + "module": "commonjs", + "sourceMap": true, + "strict": true, + "target": "es6" + } +} diff --git a/src/types/communicator.ts b/src/app/types/communicator.ts similarity index 100% rename from src/types/communicator.ts rename to src/app/types/communicator.ts diff --git a/src/types/entities.ts b/src/app/types/entities.ts similarity index 100% rename from src/types/entities.ts rename to src/app/types/entities.ts diff --git a/src/types/index.ts b/src/app/types/index.ts similarity index 98% rename from src/types/index.ts rename to src/app/types/index.ts index 75e17df..f96e3dd 100644 --- a/src/types/index.ts +++ b/src/app/types/index.ts @@ -27,6 +27,7 @@ export interface AvailabilityResponse { export interface SasResponse { sas: string + blobUrl: string id: string } @@ -57,7 +58,6 @@ export interface ThemeCollection { } } -export * from './config' export * from './entities' export * from './store' diff --git a/src/types/store.ts b/src/app/types/store.ts similarity index 97% rename from src/types/store.ts rename to src/app/types/store.ts index ba8934e..1ce8b5e 100644 --- a/src/types/store.ts +++ b/src/app/types/store.ts @@ -1,6 +1,5 @@ import { EntityStore } from './entities' -import { Config } from './config' export enum NotificationType { Info = 'info', @@ -139,7 +138,6 @@ export interface EntityListCollection { [key: string]: EntityList } -export type ConfigState = Config export type RequestsState = APIRequestCollection export type NotificationsState = Notification[] export type EntitiesState = EntityStore @@ -148,7 +146,6 @@ export type EntityListsState = EntityListCollection export interface AppState { authentication: AuthenticationState composer: ComposerState - config: ConfigState entities: EntitiesState forms: FormsState lists: EntityListsState diff --git a/src/utils/index.ts b/src/app/utils/index.ts similarity index 78% rename from src/utils/index.ts rename to src/app/utils/index.ts index 78b0482..cf69ba4 100644 --- a/src/utils/index.ts +++ b/src/app/utils/index.ts @@ -1,6 +1,5 @@ -import getConfig from 'src/config' -import themes from 'src/themes' -import { Form, FormValue, Config, ClassDictionary } from 'src/types' +import themes from '../themes' +import { Form, FormValue, ClassDictionary } from '../types' export const objectToQuerystring = (obj: object) => Object.entries(obj).filter(([_, value]) => value !== undefined).map(([name, value]) => `${name}=${value}`).join('&') @@ -24,13 +23,6 @@ export function valueFromForm(form: Form, name: string, def return field.value as T } -export const urlForBlob = (config: Config, name: string) => `${config.blobUrl}${name}` - -export async function urlForBlobAsync(name: string) { - const config = await getConfig() - return urlForBlob(config, name) -} - export function getOrigin(url: string) { const parser = document.createElement('a') parser.href = url @@ -40,3 +32,5 @@ export function getOrigin(url: string) { export const classNames = (dictionary: ClassDictionary) => Object.entries(dictionary).filter(([_, value]) => !!value).map(([key, _]) => key).join(' ') export const getDefaultThemeName = () => Object.keys(themes)[0] + +export const pathJoin = (...paths: string[]) => paths.map(path => path.trim().replace(/(^\/|\/$)/, '')).join('/') diff --git a/src/utils/normalization.ts b/src/app/utils/normalization.ts similarity index 100% rename from src/utils/normalization.ts rename to src/app/utils/normalization.ts diff --git a/src/app/webpack.config.ts b/src/app/webpack.config.ts new file mode 100644 index 0000000..1db648a --- /dev/null +++ b/src/app/webpack.config.ts @@ -0,0 +1,58 @@ +import { resolve } from 'path' +import { Configuration } from 'webpack' +import HtmlWebpackPlugin from 'html-webpack-plugin' +import CopyWebpackPlugin from 'copy-webpack-plugin' +// import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' + +const config: Configuration = { + mode: 'development', + devtool: 'eval-source-map', + entry: { + app: resolve(__dirname, 'app.tsx'), + }, + output: { + path: resolve(__dirname, '../../dist/app'), + publicPath: '/', + filename: '[name].js', + }, + optimization: { + splitChunks: { + chunks: 'all', + }, + }, + resolve: { + extensions: ['.ts', '.tsx', '.js'], + }, + module: { + rules: [ + { + test: /\.ts(x?)$/, + exclude: /node_modules/, + use: 'ts-loader', + }, + { + test: /\.css$/, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.(jpe?g|gif|png|svg)$/, + use: ['file-loader'], + }, + ], + }, + plugins: [ + new HtmlWebpackPlugin({ + title: 'Flexor', + hash: true, + template: resolve(__dirname, 'index.ejs'), + }), + new CopyWebpackPlugin([ + { from: resolve(__dirname, './images/favicon.ico'), to: resolve(__dirname, '../../dist/app') }, + { from: resolve(__dirname, './images/favicon-16x16.png'), to: resolve(__dirname, '../../dist/app') }, + { from: resolve(__dirname, './images/favicon-32x32.png'), to: resolve(__dirname, '../../dist/app') }, + ]), + // new BundleAnalyzerPlugin(), + ], +} + +export default config diff --git a/etc/communicator/index.ts b/src/communicator/index.ts similarity index 92% rename from etc/communicator/index.ts rename to src/communicator/index.ts index 1a96bdb..788202c 100644 --- a/etc/communicator/index.ts +++ b/src/communicator/index.ts @@ -1,4 +1,14 @@ -import { OutgoingMessageData, MessageContent } from 'src/types/communicator' +interface MessageContent { + [key: string]: any + height?: number +} + +interface OutgoingMessageData { + name: string + content?: MessageContent + error?: string + settings?: object +} declare global { interface Window { NewFlexorCommunicator: (publicKey: string) => Communicator } @@ -14,15 +24,10 @@ interface ListenerCollection { [name: string]: Listener } -interface AppSettings { - [key: string]: any -} - export class Communicator { private origin = 'http://localhost:8080' private publicKey: string private listeners: ListenerCollection - private settings?: AppSettings constructor(publicKey: string) { this.publicKey = publicKey diff --git a/etc/communicator/webpack.config.ts b/src/communicator/webpack.config.ts similarity index 90% rename from etc/communicator/webpack.config.ts rename to src/communicator/webpack.config.ts index 94a5f28..381bf71 100644 --- a/etc/communicator/webpack.config.ts +++ b/src/communicator/webpack.config.ts @@ -4,7 +4,7 @@ import { Configuration } from 'webpack' const config: Configuration = { mode: 'production', entry: { - communicator: `${__dirname}/index.ts` + communicator: resolve(__dirname, 'index.ts'), }, output: { path: resolve(__dirname, '../../dist'), diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index f9e05e5..0000000 --- a/src/config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Config } from './types' - -declare global { - interface Window { - flexorConfig?: Config - } -} - -export default async function getConfig(): Promise { - if (window.flexorConfig) return window.flexorConfig - - const response = await fetch('/config.json') - if (!response.ok) throw new Error() - - const config = await response.json() - window.flexorConfig = config - - return config -} diff --git a/src/constants/index.ts b/src/constants/index.ts deleted file mode 100644 index 16a0334..0000000 --- a/src/constants/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const MAX_ID_LENGTH = 40 -export const MAX_NAME_LENGTH = 80 - -export const LOCAL_STORAGE_ACCESS_TOKEN_KEY = 'FLEXOR_ACCESS_TOKEN' -export const LOCAL_STORAGE_ACCESS_TOKEN_AT_KEY = 'FLEXOR_ACCESS_TOKEN_AT' -export const LOCAL_STORAGE_REFRESH_TOKEN_KEY = 'FLEXOR_REFRESH_TOKEN' - -export const PRIVACY_OPTIONS = { - public: 'Anyone can see your posts', - group: 'Only the people in your community can see your posts', - subscribers: 'Only your subscribers can see your posts', - private: 'Nobody can see your posts', -} diff --git a/src/reducers/config.ts b/src/reducers/config.ts deleted file mode 100644 index 77c4fe8..0000000 --- a/src/reducers/config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Reducer } from 'redux' - -import { ConfigActions } from '../actions/config' -import { ConfigState } from '../types' - -const initialState: ConfigState = { - apiUrl: '', - blobUrl: '', - media: { - defaultMaxSize: 0, - coverMaxSize: 0, - iconMaxSize: 0, - } -} - -const reducer: Reducer = (state = initialState, action) => { - switch (action.type) { - case 'CONFIG_SET': - return action.payload - default: - return state - } -} - -export default reducer diff --git a/src/server/server.ts b/src/server/server.ts new file mode 100644 index 0000000..3523701 --- /dev/null +++ b/src/server/server.ts @@ -0,0 +1,39 @@ +import { resolve } from 'path' +import { config } from 'dotenv' +import fastify from 'fastify' +import fastifyStatic from 'fastify-static' +import httpProxy from 'fastify-http-proxy' + +config() + +const server = fastify({ + logger: { + level: process.env.LOGGER_LEVEL, + prettyPrint: process.env.LOGGER_PRETTY_PRINT === 'true', + } +}) + +server.register(httpProxy, { + upstream: process.env.API_URL!, + prefix: '/api', +}) + +server.register(fastifyStatic, { + root: resolve(__dirname, './app'), + wildcard: false, +}) + +server.get('/*', {}, (_, reply) => { + reply.sendFile('index.html') +}) + +const port = parseInt(process.env.PORT!, 10) + +server.listen(port, (err, address) => { + if (err) { + server.log.error(err) + process.exit(1) + } + + server.log.info(`✊🏾 Flexor Web listening at ${address}`) +}) \ No newline at end of file diff --git a/src/server/tsconfig.json b/src/server/tsconfig.json new file mode 100644 index 0000000..c701193 --- /dev/null +++ b/src/server/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "esModuleInterop": true, + "module": "commonjs", + "moduleResolution": "node", + "outDir": "../../dist", + "sourceMap": true, + "strict": true, + "target": "es6", + "paths": { + "*": [ + "node_modules/*" + ] + } + }, + "include": [ + "server.ts" + ] +} diff --git a/src/types/config.ts b/src/types/config.ts deleted file mode 100644 index 4c5949b..0000000 --- a/src/types/config.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Config { - apiUrl: string - blobUrl: string - media: { - defaultMaxSize: number - coverMaxSize: number - iconMaxSize: number - } -} diff --git a/tsconfig.json b/tsconfig.json index f1eaa43..36d019a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,9 @@ { "compilerOptions": { - "baseUrl": ".", - "sourceMap": true, - "strict": true, - "module": "commonjs", "esModuleInterop": true, - "target": "es6", "jsx": "react", - "resolveJsonModule": true + "module": "commonjs", + "strict": true, + "target": "ES6" } } diff --git a/webpack.config.ts b/webpack.config.ts deleted file mode 100644 index 9229918..0000000 --- a/webpack.config.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Configuration } from 'webpack' -import HtmlWebpackPlugin from 'html-webpack-plugin' -import MiniCssExtractPlugin from 'mini-css-extract-plugin' -import postcssPresetEnv from 'postcss-preset-env' -import postcssNormalize from 'postcss-normalize' -import PACKAGE from './package.json' -// import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' - -import c from './config/config.json' - -const config: Configuration = { - mode: 'development', - devtool: 'eval-source-map', - entry: { - app: `${__dirname}/src/app.tsx` - }, - output: { - path: `${__dirname}/dist`, - publicPath: '/', - filename: '[name].js', - }, - optimization: { - splitChunks: { - chunks: 'all', - }, - }, - devServer: { - contentBase: `${__dirname}/dist`, - historyApiFallback: true, - before: app => { - app.get('/config.json', (_, res) => { - res.json(c) - }) - }, - }, - resolve: { - extensions: ['.ts', '.tsx', '.js'], - alias: { - src: `${__dirname}/src`, - } - }, - module: { - rules: [ - { - test: /\.ts(x?)$/, - exclude: /node_modules/, - use: 'ts-loader', - }, - { - test: /\.css$/, - use: [ - MiniCssExtractPlugin.loader, - { - loader: 'css-loader', - options: { - importLoaders: 1, - }, - }, - { - loader: 'postcss-loader', - options: { - plugins: [ - postcssNormalize(), - postcssPresetEnv({ - stage: 2, - }), - ] - } - } - ], - }, - { - test: /\.(jpe?g|gif|png|svg)$/, - use: ['file-loader'], - }, - ], - }, - plugins: [ - new HtmlWebpackPlugin({ - title: 'Flexor', - hash: true, - template: 'src/index.ejs', - templateParameters: { - 'version': PACKAGE.version, - }, - }), - new MiniCssExtractPlugin({ - filename: '[name].css', - }), - // new BundleAnalyzerPlugin(), - ], -} - -export default config