diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb2d56589c2e0785d002557fcb7480e525d9d237..1653c644cca9982a53127e665b2210170b88260b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,6 +46,7 @@ deploy-staging: only: - stable before_script: + - export NODE_ENV=staging - eval $(ssh-agent -s) - ssh-add <(echo "$STAGING_PRIVATE_KEY") - mkdir -p ~/.ssh diff --git a/package-lock.json b/package-lock.json index abab8e2fa0346c35cc0d8b89a2b17aee1aa20f9e..1e27db5d84d4589c40af3a157f0d3b4745114300 100644 --- a/package-lock.json +++ b/package-lock.json @@ -626,6 +626,167 @@ "normalize-path": "^2.1.1" } }, + "apollo-codegen": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/apollo-codegen/-/apollo-codegen-0.19.1.tgz", + "integrity": "sha512-jlxz/b5iinRWfh48hXdmMtrjTPn/rDok0Z3b7icvkiaD6I30w4sq9B+JDkFbLnkldzsFLV2BZtBDa/dkZhx8Ng==", + "dev": true, + "requires": { + "@babel/generator": "7.0.0-beta.38", + "@babel/types": "7.0.0-beta.38", + "change-case": "^3.0.1", + "common-tags": "^1.5.1", + "core-js": "^2.5.3", + "glob": "^7.1.2", + "graphql": "^0.13.1", + "graphql-config": "^1.1.1", + "inflected": "^2.0.3", + "node-fetch": "^1.7.3", + "rimraf": "^2.6.2", + "source-map-support": "^0.5.0", + "yargs": "^10.0.3" + }, + "dependencies": { + "@babel/generator": { + "version": "7.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.38.tgz", + "integrity": "sha512-aOHQPhsEyaB6p2n+AK981+onHoc+Ork9rcAQVSUJR33wUkGiWRpu6/C685knRyIZVsKeSdG5Q4xMiYeFUhuLzA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.38", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/types": { + "version": "7.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.38.tgz", + "integrity": "sha512-SAtyEjmA7KiEoL2eAOAUM6M9arQJGWxJKK0S9x0WyPOosHS420RXoxPhn57u/8orRnK8Kxm0nHQQNTX203cP1Q==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "graphql": { + "version": "0.13.2", + "resolved": "http://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz", + "integrity": "sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog==", + "dev": true, + "requires": { + "iterall": "^1.2.1" + } + }, + "graphql-config": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-1.2.1.tgz", + "integrity": "sha512-BOtbEOn/fD13jT0peCy3Fzp1DSTsA/1AcZp266AQ5Sk3wFndKCEa/H7donbu5UriOw1V/N1WDirYPnr7rd8E7Q==", + "dev": true, + "requires": { + "graphql": "^0.12.3", + "graphql-import": "^0.4.0", + "graphql-request": "^1.4.0", + "js-yaml": "^3.10.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "graphql": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.12.3.tgz", + "integrity": "sha512-Hn9rdu4zacplKXNrLCvR8YFiTGnbM4Zw/UH8FDmzBDsH7ou40lSNH4tIlsxcYnz2TGNVJCpu1WxCM23yd6kzhA==", + "dev": true, + "requires": { + "iterall": "1.1.3" + } + }, + "iterall": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", + "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", + "dev": true + } + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.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", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "apollo-link": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.2.tgz", @@ -2034,6 +2195,12 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "buffer-writer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", @@ -2153,6 +2320,16 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -2194,6 +2371,32 @@ "supports-color": "^5.3.0" } }, + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, "character-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", @@ -2498,6 +2701,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2574,6 +2783,16 @@ "date-now": "^0.1.4" } }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "dev": true, + "requires": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, "constantinople": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", @@ -3038,6 +3257,15 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -3135,6 +3363,15 @@ "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=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -3358,6 +3595,16 @@ } } }, + "eslint-plugin-graphql": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-2.1.1.tgz", + "integrity": "sha512-JT2paUyu3e9ZDnroSshwUMc6pKcnkfXTsZInX1+/rPotvqOLVLtdrx/cmfb7PTJwjiEAshwcpm3/XPdTpsKJPw==", + "dev": true, + "requires": { + "graphql-config": "^2.0.1", + "lodash": "^4.11.1" + } + }, "eslint-plugin-import": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", @@ -4970,6 +5217,28 @@ "iterall": "^1.2.2" } }, + "graphql-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-2.1.0.tgz", + "integrity": "sha512-LWpkME3x+KSFMVuMpRmDHTIZLyQQsBoKtMXJrT4RgXk6y0GRf0lsJ81R3S2FmT1CKZQOJfFsOpUfPpAcfmoN/A==", + "dev": true, + "requires": { + "graphql-import": "^0.4.4", + "graphql-request": "^1.5.0", + "js-yaml": "^3.10.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.4" + } + }, + "graphql-import": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/graphql-import/-/graphql-import-0.4.5.tgz", + "integrity": "sha512-G/+I08Qp6/QGTb9qapknCm3yPHV0ZL7wbaalWFpxsfR8ZhZoTBe//LsbsCKlbALQpcMegchpJhpTSKiJjhaVqQ==", + "dev": true, + "requires": { + "lodash": "^4.17.4" + } + }, "graphql-request": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.6.0.tgz", @@ -5112,6 +5381,16 @@ "minimalistic-assert": "^1.0.1" } }, + "header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -5245,6 +5524,12 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, + "inflected": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inflected/-/inflected-2.0.4.tgz", + "integrity": "sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5494,6 +5779,15 @@ "is-path-inside": "^1.0.0" } }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "dev": true, + "requires": { + "lower-case": "^1.1.0" + } + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -5666,6 +5960,15 @@ "unc-path-regex": "^0.1.2" } }, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "dev": true, + "requires": { + "upper-case": "^1.1.0" + } + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -6669,6 +6972,21 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "dev": true, + "requires": { + "lower-case": "^1.1.2" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -7138,6 +7456,15 @@ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", "dev": true }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, "node-dir": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", @@ -7652,6 +7979,15 @@ "readable-stream": "^2.1.5" } }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, "parse-asn1": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", @@ -7723,6 +8059,16 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -7774,6 +8120,15 @@ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -8968,6 +9323,16 @@ } } }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, "serialize-javascript": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", @@ -9109,6 +9474,15 @@ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -9523,6 +9897,16 @@ "resolved": "https://registry.npmjs.org/svg-pan-zoom/-/svg-pan-zoom-3.5.3.tgz", "integrity": "sha512-jlHEOXRW4IF0W2e2DTk+hjKPKassF4TpJSSC7ilHJoZHX9hthFzU63WhluEwzSbTQF4akrWcjmbWxiCoGPa6PA==" }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "dev": true, + "requires": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -9660,6 +10044,16 @@ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -10039,6 +10433,21 @@ "xdg-basedir": "^3.0.0" } }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "dev": true, + "requires": { + "upper-case": "^1.1.1" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -10627,6 +11036,17 @@ } } }, + "webpack-graphql-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webpack-graphql-loader/-/webpack-graphql-loader-1.0.0.tgz", + "integrity": "sha512-P0aU8uRHtRYMNMtl0cIasY1SQ8L6vLyo66VPXSDtRFyXogiVpTtPfZHNtIIMqIbvx0Eh9zxcSFc7kwrFoW5bbQ==", + "dev": true, + "requires": { + "apollo-codegen": "^0.19.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + } + }, "webpack-node-externals": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", diff --git a/package.json b/package.json index 6d5a9f72b379aaaf2817ba819d9fb44b8a2cb3e1..b3b2009d983c0ca19ca12618ffde8f55775f5cb2 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "eslint": "^4.19.1", "eslint-config-standard": "^11.0.0", "eslint-loader": "^2.1.0", + "eslint-plugin-graphql": "^2.1.1", "eslint-plugin-import": "^2.14.0", "eslint-plugin-node": "^6.0.1", "eslint-plugin-promise": "^3.8.0", @@ -67,6 +68,7 @@ "typescript": "^3.0.3", "webpack": "^4.17.1", "webpack-cli": "^2.1.5", + "webpack-graphql-loader": "^1.0.0", "webpack-node-externals": "^1.7.2" } } diff --git a/src/graphql/schema.js b/src/graphql/schema.js index 39fc0087a5121a640a0dec8c5502383101408d81..212e583c7d18142a525940b70f5fc55c10711228 100644 --- a/src/graphql/schema.js +++ b/src/graphql/schema.js @@ -4,8 +4,8 @@ */ import { makeExecutableSchema } from 'graphql-tools'; -import actionDefs from './typeDefs/actions'; -import objectDefs from './typeDefs/objects'; +import actionDefs from './typeDefs/actions.graphql'; +import objectDefs from './typeDefs/objects.graphql'; import { resolvers } from './resolvers'; const typeDefs = actionDefs.concat(objectDefs); diff --git a/src/graphql/typeDefs/actions.graphql b/src/graphql/typeDefs/actions.graphql new file mode 100644 index 0000000000000000000000000000000000000000..ba699c0bf89ef781f6b51442383838d427014626 --- /dev/null +++ b/src/graphql/typeDefs/actions.graphql @@ -0,0 +1,238 @@ +# Requêtes +type Query { + + # group queries + + allGroups: [Group] + allSimpleGroups: [SimpleGroup] + + group(uid: ID!) : Group + simpleGroup(uid : ID!) : SimpleGroup + metaGroup(uid : ID!) : MetaGroup + + # message queries + + allMessages: [Message] + message(id: ID!): Message + allPosts: [Post] + post(id: ID!): Post + allEvents: [Event] + allAnnouncements: [Announcement] + + # user queries + + user(uid: ID) : User + + searchTOL( + givenName: String, + lastName: String, + nickname: String, + nationality: String, + school: String, + promotion: String, + groups: String, + studies: String, + sport: String, + phone: String, + mail: String, + adress: String, + ip: String + ): [String] + + # Admin queries + + allRequests(from : String!) : [Request] + + # Speaker queries + + # allRequests(from : String!) : [Request] + + # Member Queries + + allMembers(from : String!) : [Group] + + # Viewer Queries + +} + +type Mutation { + + # Superviser mutations + + takeAdminRights(from : String!) : Boolean + releaseAdminRights(from : String!) : Boolean + + # Admin mutations + + createSubgroup( + from : String!, + uid: ID = null, + name: String!, + website: String, + description: String, + school: String + ): Group + + addUser(from : String!, userid : String!): User + removeUser(from : String!, userid : String!): User + addAdmin(from : String!, userid : String!): User + removeAdmin(from : String!, userid : String!): User + + editGroup( + from : String!, + name: String, + website: String, + description: String, + school: String + ): Group + + # Creates a new event. + postEvent( + # ID of the organizing group. + from: ID!, + # Title of the event. + title: String, + # Date of event. + date: String + ): Event + + answerEventRequest(from : String, request: ID, accept : Boolean): Request + + # Log user into the API + login(username: String!, password: String!): String! + # Log user out of the API + logout(username: String!): Boolean + leave(from : String!) : Boolean + + # Viewer mutations + + requestJoin(from : String!) : Boolean + +} + + + +# asSuperviser(groupUID: String): SuperviserMutation +# asAdmin(groupUID: String): AdminMutation +# asSpeaker(groupUID: String): SpeakerMutation +# asMember(groupUID: String): MemberMutation +# asViewer(groupUID: String): ViewerMutation + +# accessGroups : GroupQuery +# accessPosts : MessageQuery +# accessUsers : UserQuery + +# asAdmin(groupUID: ID): AdminQuery +# asSpeaker(groupUID: ID): AdminQuery +# asMember(groupUID: ID): MemberQuery +# asViewer(groupUID: ID): AdminQuery + + +type SuperviserMutation { + runAdminOperation : AdminMutation + takeAdminRights : Boolean + releaseAdminRights : Boolean +} + +type AdminMutation { + + isAdmin: Boolean + + 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 SpeakerMutation{ + postEvent(name: String, date: String): Event + answerEventRequest(request: ID, accept : Boolean): Request +} + +type MemberMutation { + leave: Group +} + +type ViewerMutation { + requestJoin: Group +} + + +# Requête pour obtenir un groupe. +type GroupQuery{ + allGroups: [Group] + allSimpleGroups: [SimpleGroup] + + group(uid: ID) : Group + simpleGroup(uid : ID) : SimpleGroup + metaGroup(uid : ID) : MetaGroup + +} + +# Requête pour obtenir un message. +type MessageQuery{ + allMessages: [Message] + allEvents: [Event] + allPosts: [Post] + message(id: ID): Message + allAnnouncements: [Announcement] +} + + +# Requête pour obtenir un utilisateur. +type UserQuery{ + + user(uid: ID) : User + + searchTOL( + givenName: String, + lastName: String, + nickname: String, + nationality: String, + school: String, + promotion: String, + groups: String, + studies: String, + sport: String, + phone: String, + mail: String, + adress: String, + ip: String + ): [String] +} + +# Requête à la base de donnée nécessitant d'être administrateur. +type AdminQuery{ + isAdmin: Boolean + allRequests : [Request] +} + +type SpeakerQuery{ + isSpeaker: Boolean + allRequests : [Request] +} + +type MemberQuery{ + isMember: Boolean + allMembers : [Group] +} + +type ViewerQuery{ + isViewer: Boolean +} diff --git a/src/graphql/typeDefs/objects.graphql b/src/graphql/typeDefs/objects.graphql new file mode 100644 index 0000000000000000000000000000000000000000..bc6609bd22f82ca46911a38768a4ff6616f98ee8 --- /dev/null +++ b/src/graphql/typeDefs/objects.graphql @@ -0,0 +1,164 @@ +type User { + # Prénom de l'utilisateur + givenName: String! + # Nom de famille + lastName: String! + # Surnom + nickname: String + nationality: String + uid: ID! + birthdate: String! + mail: String + phone: String + # Groupes dont l'utilisateur est membre. + groups: [SimpleGroup] + # Groupes que l'utilisateur aime. + likes: [Group] + # Adresse(s) de l'utilisateur. + address: [String] + # Promotion + promotion: String +} + +# Groupes associatifs + + +""" +L'interface Group représente les deux types de groupes implémentés dans Sigma : les groupes +simples, dont les membres sont des utilisateurs, et les métagroupes, dont les membres sont +des groupes simples (tel que Federez, dont les membres incluent le BR et DaTA). +""" +interface Group { + uid: ID + name: String + # Site Web. + website: String + description: String + + # Jour et heure de création du groupe. + createdAt: String! + # Dernière mise à jour du groupe. + updatedAt: String! + +} + +# Le groupe de base, dont les membres sont des utilisateurs : binets, Kès... +type SimpleGroup implements Group { + uid: ID + name: String + website: String + createdAt: String! + updatedAt: String! + + # Membres du groupe + members: [User] + description: String + # École d'origine du groupe + school: String + # Groupe parent + parent: Group +} + +# Un groupe dont les membre sont d'autres groupes +type MetaGroup implements Group { + uid: ID + name: String + website: String + createdAt: String! + updatedAt: String! + description: String + + # Les groupes constitutifs du méta-groupe. + members: [Group]! +} + +# Tout type de message créé par un ou plusieurs groupes. +interface Message { + id: ID! + # Titre du message + title: String! + content: String + createdAt: String! + updatedAt: String! + # Auteur(s) du message + authors: [Group] +} + +# Publication postée par un ou plusieurs groupes. +type Post implements Message { + id: ID! + title: String! + createdAt: String! + updatedAt: String! + authors: [Group] + content: String! +} + +# Annonce publique effectuée par un ou plusieurs groupes. +type Announcement implements Message { + id: ID! + title: String! + createdAt: String! + updatedAt: String! + authors: [Group] + content: String! + importance: Int + views: Int + forEvent : Event +} + +# Événements organisés par un ou plusieurs groupes. +type Event implements Message { + id: ID! + # Intitulé de l'événement + title: String! + # Lieu de l'événement + location: String + createdAt: String! + updatedAt: String! + startTime: String! + endTime: String! + # Organisateurs + authors: [Group] + # Personnes qui participent à l'événement. + participatingGroups: [Group] + participatingUsers: [User] + content: String + asAnnouncement : Announcement +} + +interface Request { + # ID de la demande + id: ID! + # message accompagnant la demande + message: String +} + +# Demande d'un utilisateur désirant rejoindre le groupe. +type UserJoinGroup implements Request{ + id: ID! + message: String + # Émetteur de la demande + user: User +} + + +# Demande d'un groupe voulant rejoindre un événement +type GroupJoinEvent implements Request{ + id: ID! + message: String + # Événement concerné + event: Event + # Groupe voulant rejoindre l'événement + groupWantingToJoin: Group +} + +# Demande au récipiendaire de rejoindre l'organisation d'un événement. +type YourGroupHostEvent implements Request{ + id: ID! + message: String + # Événement concerné + event: Event + # Groupe ayant publié l'évènement et lancé l'invitation + sender: Group +} diff --git a/webpack.config.js b/webpack.config.js index 33696452d9956d7e0c177f5c4b17e633bf203f7f..5b75c263f4d29d2f9280d180bb8b40d044043152 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -28,10 +28,23 @@ const config = { },{ test: /\.css$/, use: ['style-loader', 'css-loader'] - }, { + },{ type: 'javascript/auto', test: /\.json$/, use: ['file-loader'] + }, { + test: /\.graphql?$/, + use: [ + { + loader: 'webpack-graphql-loader', + options: { + // validate: true, + // schema: "./path/to/schema.json", + // removeUnusedFragments: true + // etc. See "Loader Options" below + } + } + ] },{ test: /\.(png|jpg|ico)$/, loader: 'file-loader',