diff --git a/package-lock.json b/package-lock.json index df35bb706847fff6fd94ea74e72ea60258b04677..9f6530332ce026f63a160fc68c6b313652085a24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,47 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@f/animate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@f/animate/-/animate-1.0.1.tgz", + "integrity": "sha1-oDE5itrfmgvTpWOYzskx+HfYhIU=", + "requires": { + "@f/elapsed-time": "1.0.0", + "@f/raf": "1.0.3", + "@f/tween": "1.0.1" + } + }, + "@f/elapsed-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@f/elapsed-time/-/elapsed-time-1.0.0.tgz", + "integrity": "sha1-ageaYQSocni/W0CARE7wLRtZVEk=", + "requires": { + "@f/timestamp": "1.0.0" + } + }, + "@f/map-obj": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@f/map-obj/-/map-obj-1.2.2.tgz", + "integrity": "sha1-2an4vXbKoq4RtjPdok2cbMzB5g0=" + }, + "@f/raf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@f/raf/-/raf-1.0.3.tgz", + "integrity": "sha1-Mt3KN940WyDIw4QwGMxRuPiXkU0=" + }, + "@f/timestamp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@f/timestamp/-/timestamp-1.0.0.tgz", + "integrity": "sha1-MqkWbiUW5cy5sPz9yJIjgZcQ6Iw=" + }, + "@f/tween": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@f/tween/-/tween-1.0.1.tgz", + "integrity": "sha1-GK73nEl15UQVrfMm5LXg0FPSB/A=", + "requires": { + "@f/map-obj": "1.2.2" + } + }, "@types/babel-types": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.1.tgz", @@ -823,6 +864,11 @@ } } }, + "chain-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz", + "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=" + }, "chalk": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", @@ -955,6 +1001,11 @@ } } }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, "clean-css": { "version": "3.4.28", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", @@ -1003,6 +1054,16 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "clipboard": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", + "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", + "requires": { + "good-listener": "1.2.2", + "select": "1.1.2", + "tiny-emitter": "2.0.2" + } + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -1062,6 +1123,17 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" }, + "commonmark": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.28.1.tgz", + "integrity": "sha1-Buq41SM4uDn6Gi11rwCF7tGxvq4=", + "requires": { + "entities": "1.1.1", + "mdurl": "1.0.1", + "minimist": "1.2.0", + "string.prototype.repeat": "0.2.0" + } + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -1235,6 +1307,15 @@ "sha.js": "2.4.10" } }, + "cross-fetch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.0.0.tgz", + "integrity": "sha512-gnx0GnDyW73iDq6DpqceL8i4GGn55PPKDzNwZkopJ3mKPcfJ0BUIXBsnYfJBVw+jFDB+hzIp2ELNRdqoxN6M3w==", + "requires": { + "node-fetch": "2.0.0", + "whatwg-fetch": "2.0.3" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -1352,6 +1433,11 @@ } } }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1405,6 +1491,11 @@ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" }, + "dom-helpers": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", + "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -1469,6 +1560,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.19" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -1480,6 +1579,11 @@ "tapable": "0.2.8" } }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -1834,6 +1938,11 @@ "strip-eof": "1.0.0" } }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2125,6 +2234,27 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.17" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -3262,6 +3392,14 @@ } } }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "3.2.0" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -3308,6 +3446,14 @@ "source-map-support": "0.5.3" } }, + "graphql-request": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.5.1.tgz", + "integrity": "sha512-p1f1q+D+5k1PMxsaZszestYW1BAEKjygliqTAhJI5nueRe74WRmwNQWAdrRBoCFRIpM0SZer98cbJF4PZHXaqg==", + "requires": { + "cross-fetch": "2.0.0" + } + }, "graphql-server-express": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/graphql-server-express/-/graphql-server-express-1.3.2.tgz", @@ -3328,6 +3474,27 @@ "uuid": "3.2.1" } }, + "graphql-voyager": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/graphql-voyager/-/graphql-voyager-1.0.0-rc.15.tgz", + "integrity": "sha512-qKXGrUrWL4/BPUt6XFCSskCcSLwwxiXmNdO+DC6g2I1TRfU/hpMsxQQCZ3ImsrxRSO2FnlIZio58Wzb43Hx0RA==", + "requires": { + "@f/animate": "1.0.1", + "classnames": "2.2.5", + "clipboard": "1.7.1", + "commonmark": "0.28.1", + "graphql-request": "1.5.1", + "lodash": "4.17.5", + "prop-types": "15.6.1", + "react-modal": "2.4.1", + "react-redux": "5.0.7", + "react-toolbox": "2.0.0-beta.12", + "redux": "3.7.2", + "redux-thunk": "2.2.0", + "reselect": "3.0.1", + "svg-pan-zoom": "3.5.3" + } + }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", @@ -3415,6 +3582,11 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "hoist-non-react-statics": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz", + "integrity": "sha512-6Bl6XsDT1ntE0lHbIhr4Kp2PGcleGZ66qu5Jqk8lc0Xc/IeG6gVLmwUGs/K0Us+L8VWoKgj0uWdPMataOsm31w==" + }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", @@ -3536,6 +3708,14 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, + "invariant": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", + "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", + "requires": { + "loose-envify": "1.3.1" + } + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -3829,6 +4009,26 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + } + } + }, "iterall": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.1.tgz", @@ -3847,8 +4047,7 @@ "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { "version": "3.10.0", @@ -4179,11 +4378,24 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, + "lodash-es": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.5.tgz", + "integrity": "sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw==" + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", @@ -4271,6 +4483,11 @@ } } }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4518,6 +4735,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "node-fetch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.0.0.tgz", + "integrity": "sha1-mCu6Q+zU8pIqKcwYamu7C7c/y6Y=" + }, "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", @@ -5241,6 +5463,16 @@ "asap": "2.0.6" } }, + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, "proxy-addr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", @@ -5424,6 +5656,11 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, + "ramda": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.23.0.tgz", + "integrity": "sha1-zNE//3NJepOXTj6GMnv9h71ujis=" + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -5493,6 +5730,77 @@ "strip-json-comments": "2.0.1" } }, + "react-css-themr": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-css-themr/-/react-css-themr-2.1.2.tgz", + "integrity": "sha1-4BdRTkccIy9Dp1SlW0nYH69dr7g=", + "requires": { + "hoist-non-react-statics": "1.2.0", + "invariant": "2.2.3" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + } + } + }, + "react-modal": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-2.4.1.tgz", + "integrity": "sha512-3WQCn3xqkbEUvxRUO3nkeqxMNgt1F4CyEU3BiUIrg7C71tnqjQIuSE7+JXp85yFl8X1iRTJouySNpwNqv4kiWg==", + "requires": { + "exenv": "1.2.2", + "prop-types": "15.6.1" + } + }, + "react-redux": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", + "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", + "requires": { + "hoist-non-react-statics": "2.5.0", + "invariant": "2.2.3", + "lodash": "4.17.5", + "lodash-es": "4.17.5", + "loose-envify": "1.3.1", + "prop-types": "15.6.1" + } + }, + "react-style-proptype": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.0.tgz", + "integrity": "sha512-Mafmkzj3oNmLSJNOlH+WWWyGIdzVLhPj+d12fDxQMQdwDQ5sMX7vQKOLpry4U+zRWieTCx448AyRKK0NLWuXmg==", + "requires": { + "prop-types": "15.6.1" + } + }, + "react-toolbox": { + "version": "2.0.0-beta.12", + "resolved": "https://registry.npmjs.org/react-toolbox/-/react-toolbox-2.0.0-beta.12.tgz", + "integrity": "sha1-HZ3XzEHjs12r3OXrEAqAaO7ojEU=", + "requires": { + "classnames": "2.2.5", + "core-js": "2.5.3", + "ramda": "0.23.0", + "react-css-themr": "2.1.2", + "react-style-proptype": "3.2.0", + "react-transition-group": "1.2.1" + } + }, + "react-transition-group": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz", + "integrity": "sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q==", + "requires": { + "chain-function": "1.0.0", + "dom-helpers": "3.3.1", + "loose-envify": "1.3.1", + "prop-types": "15.6.1", + "warning": "3.0.0" + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -5555,6 +5863,22 @@ "resolve": "1.5.0" } }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.5", + "lodash-es": "4.17.5", + "loose-envify": "1.3.1", + "symbol-observable": "1.2.0" + } + }, + "redux-thunk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.2.0.tgz", + "integrity": "sha1-5hWhbha0ehmlFXZhM9Hj6Zt4UuU=" + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5648,6 +5972,11 @@ } } }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=" + }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", @@ -5786,6 +6115,11 @@ } } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -6254,6 +6588,11 @@ "strip-ansi": "4.0.0" } }, + "string.prototype.repeat": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz", + "integrity": "sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=" + }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", @@ -6295,6 +6634,16 @@ "has-flag": "3.0.0" } }, + "svg-pan-zoom": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/svg-pan-zoom/-/svg-pan-zoom-3.5.3.tgz", + "integrity": "sha512-jlHEOXRW4IF0W2e2DTk+hjKPKassF4TpJSSC7ilHJoZHX9hthFzU63WhluEwzSbTQF4akrWcjmbWxiCoGPa6PA==" + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", @@ -6367,6 +6716,11 @@ "setimmediate": "1.0.5" } }, + "tiny-emitter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", + "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -6535,6 +6889,11 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -6949,6 +7308,14 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "1.3.1" + } + }, "watchpack": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", @@ -7154,6 +7521,11 @@ } } }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", diff --git a/package.json b/package.json index 012148b1897a5c3f756b868280ec9b738d66478e..cd95995964c78a2258e982a934fd227fbba57a7e 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "graphql": "^0.13.1", "graphql-server-express": "^1.3.2", "graphql-tools": "^2.21.0", + "graphql-voyager": "^1.0.0-rc.15", "knex": "^0.14.4", "ldap-escape": "^1.1.5", "ldapjs": "^1.0.2", diff --git a/src/graphql/schema.js b/src/graphql/schema.js index 66854b963022c8cdbde33ad26fb29bec437d8bc6..3ec8bdb31ac2ceac7d1d1131f46f8a66a4ca32ec 100644 --- a/src/graphql/schema.js +++ b/src/graphql/schema.js @@ -8,33 +8,21 @@ import { makeExecutableSchema } from 'graphql-tools'; import { request } from 'https'; import { assertBinaryExpression } from 'babel-types'; +import { Group, User } from './user_and_group'; + const typeDefs = ` + type Query { allGroups: [Group] group(uid: ID) : Group user(uid: ID) : [User] } - type Group { - uid: ID - name: String - website: String - createdAt: String - updatedAt: String - description: String - school: String - parentuid: String - } - - type User { - givenName: String! - lastName: String! - uid: ID! - birthdate: String - groups: [String] - } - type Mutation { + asAdmin(groupid: String): AdminMutation + asMember(groupid: String): MemberMutation + asViewer(groupid: String): ViewerMutation + createGroup( uid: ID = null name: String @@ -45,8 +33,74 @@ const typeDefs = ` ): Group } + type AdminMutation { + + createSubgroup( + uid: ID = null, + name: String, + website: String, + description: String, + school: String, + ): Group + + addUser(userid : String): User + removeUser(userid : String): User + addAdmin(userid : String): User + removeAdmin(userid : String): User + + editGroup( + name: String, + website: String, + description: String, + school: String, + ): Group + + } + + type MemberMutation { + leave: Group + } + + type ViewerMutation { + requestJoin: Group + } + `; +/** + * @summary Renvoie tous les utilisateurs ayant des droits d'administrateur sur un groupe. + * @desc Les utilisateurs qui ont un droit d'administrateur sur un groupe sont ses administrateurs et les utilisateurs ayant droit d'admin sur son parent + * @arg {String} uid - L'uid du groupe dont on veut les administrateurs. + * @return {Promise} Retour de requête knex. Promise qui renvera une liste de tous les utilisateurs ayant droit d'admin sur le groupe + */ +const getUsersWithAdminRights = (user, groupUID) => { + return listAdmins(user, groupUID).then(adminList => { + if(typeof adminList == "undefined") + return undefined; + else + return knex('groups').select('parentuid').where('uid', groupUID).then(reqResult => { + if(reqResult[0].parentuid) + return getUsersWithAdminRights(user, reqResult[0].parentuid).then(parentAdmins => { + return adminList.concat(parentAdmins); + }); + else + return adminList; + }); + }); +}; + +/** + * @summary teste si un utilisateur a des droits + * @desc Cette fonction effectue une requête knex. Elle gère l'arête de parenté. + * @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête. + * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. + */ +const hasAdminRights = (user, groupuid) => { + return getUsersWithAdminRights(user, groupuid).then(adminList => { + return (typeof adminList != "undefined" && adminList.indexOf(user.uid) != -1); + }); +}; + /** * @summary Renvoie tous les groupes visibles par l'utilisateur user * @desc Cette fonction effectue une requête knex. Elle gère l'arête de parenté. @@ -86,16 +140,6 @@ const getGroupIfVisible = (user, uid) => { }); }; -/** - * @summary Renvoie tous les utilisateurs ayant des droits d'administrateur sur un groupe. - * @desc Les utilisateurs qui ont un droit d'administrateur sur un groupe sont ses administrateurs et les utilisateurs ayant droit d'admin sur son parent - * @arg {String} uid - L'uid du groupe dont on veut les administrateurs. - * @return {Promise} Retour de requête knex. Promise qui renvera une liste de tous les utilisateurs ayant droit d'admin sur le groupe - */ -const getUsersWithAdminRights = (user, uid) => { - return listAdmins(user, uid); -}; - /** * @summary Attribue un UID qui n'a pas encore été utilisé à un groupe * @desc RASifie le string initialUID si necessaire (ramené à de l'ASCCI sans espace), puis si l'uid est deja pris rajoute un n a la fin et reteste @@ -169,7 +213,10 @@ const resolvers = { lastName: data.sn, givenName: data.givenName, birthdate: data.brBirthdate, - groups: data.brMemberOf + groups: data.brMemberOf, + mail: data.mail, + phone: data.telephoneNumber, + room: data.brRoom }; }; @@ -185,6 +232,9 @@ const resolvers = { }, Mutation: { + asAdmin: (obj, args, context) => { + + }, createGroup: (obj, args, context) => { return createGroupIfLegal(context.user, args); } @@ -192,7 +242,7 @@ const resolvers = { }; const schema = makeExecutableSchema({ - typeDefs, + typeDefs: [typeDefs, Group, User], resolvers }); diff --git a/src/graphql/user_and_group.js b/src/graphql/user_and_group.js new file mode 100644 index 0000000000000000000000000000000000000000..be03a20ce8fe296933a3465e7e2b8669e8652e1d --- /dev/null +++ b/src/graphql/user_and_group.js @@ -0,0 +1,27 @@ +const User = ` + type User { + givenName: String! + lastName: String! + uid: ID! + birthdate: String! + mail: String + phone: String + groups: [Group] + address: String + } +`; + +const Group = ` + type Group { + uid: ID + name: String + website: String + createdAt: String + updatedAt: String + description: String + school: String + parentuid: String + } +`; + +export { Group, User }; \ No newline at end of file diff --git a/src/index.js b/src/index.js index 2d73129e95d8905dfc5e645a33f556be6a6c84b1..f67d6bccce0487769b26196f21896725d1c53185 100644 --- a/src/index.js +++ b/src/index.js @@ -3,12 +3,8 @@ */ import server from './server'; import colors from 'colors'; -import setupLdapAuth from './ldap/ldap_auth.js'; import router from './admin_view/admin_router'; -// setting up ldap authentication -setupLdapAuth(server); - // setting up l'interface admin des BDD server.use(router); diff --git a/src/ldap/ldap_auth.js b/src/ldap/ldap_auth.js index c881e173417d3d3b049787a938c33b6b6b3782c9..6c4effd01581516d9fdd2f55e661112fce0ad4a5 100644 --- a/src/ldap/ldap_auth.js +++ b/src/ldap/ldap_auth.js @@ -40,9 +40,6 @@ function setupLdapAuth(server) { passport.deserializeUser(function(user, done) { done(null, user); }); - - // Returns middleware that parses cookies - //server.use(cookieParser()); } export default setupLdapAuth; diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js index c200eae358a29feb90890bd2c032a3a8c0af38d4..f82fb7b7ac28bb1d96e533ee5fc7084131ce7438 100644 --- a/src/ldap/ldap_data.js +++ b/src/ldap/ldap_data.js @@ -3,16 +3,16 @@ * @author hawkspar */ -/* Ne pas hésiter à repasser en synthaxe ES5... Plus simple pour tester en solo avec node directement */ +/* Ne pas hésiter à repasser en synthaxe ES5... Plus simple pour tester en solo avec node directement import ldap from 'ldapjs'; import fs from 'fs'; import ldapEscape from 'ldap-escape'; -import path from 'path'; +import path from 'path'; */ -/*var ldap = require('ldapjs'); +/**/var ldap = require('ldapjs'); var fs = require('fs'); var ldapEscape = require('ldap-escape'); -var path = require('path'); */ +var path = require('path'); // Important ; permet de vérifier que l'utilisateur reste connecté. var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; @@ -357,7 +357,7 @@ function creerGroupeLDAP(user, gid, nom, status, admins, members) { //rechercheLDAP({},"ou=groups,dc=frankiz,dc=net","(cn=f*)",["uid"]).then(res => console.log(res)); //trouverGroupes({},"fa").then(res => console.log(res)); -/* Partage pour le reste du monde ; même remarque synthaxe que pour l'import */ -export { listGroups, listMembers, listAdmins, rens, trouverGroupes, idTOL, TOL }; +/* Partage pour le reste du monde ; même remarque synthaxe que pour l'import +export { listGroups, listMembers, listAdmins, rens, trouverGroupes, idTOL, TOL }; */ -/*module.exports ={ listGroups, listMembers, listAdmins, rens, idTOL, TOL }; */ +/**/module.exports ={ listGroups, listMembers, listAdmins, rens, idTOL, TOL }; diff --git a/src/server.js b/src/server.js index 99184c879573b713d47106b48f5607a6e3506460..39e8192fd9df7b37e26a79319747478f0e20874d 100644 --- a/src/server.js +++ b/src/server.js @@ -2,13 +2,14 @@ * @file Cree le serveur express avec tous les middleware qui vont bien */ import express from 'express'; -import session from 'express-session'; import bodyParser from 'body-parser'; import favicon from 'serve-favicon'; import morgan from 'morgan'; import path from 'path'; import cors from 'cors'; import schema from './graphql/schema'; +import setupLdapAuth from './ldap/ldap_auth'; +import { express as graphqlVoyager } from 'graphql-voyager/middleware'; import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'; import flash from 'connect-flash'; @@ -20,19 +21,15 @@ server.use(bodyParser.urlencoded({ extended: true })); +/** + * @description Configuration authentification + */ +setupLdapAuth(server); + /** * @description Cache le fait que l'application tourne sous Express dans le header HTTP. */ server.disable('x-powered-by'); - -// Configuration de express-session -server.use(session({ - secret: 'race condition', - cookie: { maxAge: 60000 }, - resave: true, - saveUninitialized: true -})); - // setting up view engine for pug let viewpath = path.resolve('./','src','views'); server.set('views', viewpath); @@ -69,6 +66,9 @@ server.use('/graphql', bodyParser.json(), cors(), // GraphiQL est une console interactive pour faire des requêtes au schéma GraphQL server.use('/graphiql', graphiqlExpress({endpointURL: '/graphql'})); +// GraphQL voyager +server.use('/voyager', graphqlVoyager({ endpointUrl: '/graphql' })); + // connect-flash is middleware for flashing messages server.use(flash());