diff --git a/transform/.gitignore b/transform/.gitignore new file mode 100644 index 00000000..c3af8579 --- /dev/null +++ b/transform/.gitignore @@ -0,0 +1 @@ +lib/ diff --git a/transform/.npmignore b/transform/.npmignore new file mode 100644 index 00000000..d7819044 --- /dev/null +++ b/transform/.npmignore @@ -0,0 +1,3 @@ +test/ +src/ +tsconfig.json diff --git a/transform/package-lock.json b/transform/package-lock.json new file mode 100644 index 00000000..3cc8c5c5 --- /dev/null +++ b/transform/package-lock.json @@ -0,0 +1,6757 @@ +{ + "name": "typescript-transform-relay", + "version": "1.0.0-0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.54.tgz", + "integrity": "sha1-wEPH7r7r/X5mXZXCgaSq/IPU4ck=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.54", + "jsesc": "^2.5.1", + "lodash": "^4.17.5", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + } + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.54.tgz", + "integrity": "sha1-wBqmO1fJyNzodEeWyB2d8SHyDbQ=", + "dev": true + }, + "@babel/types": { + "version": "7.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.54.tgz", + "integrity": "sha1-AlrWhJL+1ULBPxTFeaRMhI5TEGM=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.5", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz", + "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==", + "dev": true + }, + "@types/graphql": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.0.0.tgz", + "integrity": "sha512-fQ61KKDKyEztu4AdZOKGBHz6h4UpDiuMJOhA8A+GsNF+mwBnTtBwVwoU/oDyRDrigB10v5gvZApNqEXyBKmYVg==", + "dev": true + }, + "@types/jest": { + "version": "22.2.3", + "resolved": "http://registry.npmjs.org/@types/jest/-/jest-22.2.3.tgz", + "integrity": "sha512-e74sM9W/4qqWB6D4TWV9FQk0WoHtX1X4FJpbjxucMSVJHtFjbQOH3H6yp+xno4br0AKG0wz/kPtaN599GUOvAg==", + "dev": true + }, + "@types/node": { + "version": "10.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.10.1.tgz", + "integrity": "sha512-nzsx28VwfaIykfzMAG9TB3jxF5Nn+1/WMKnmVZc8TsB+LMIVvwUscVn7PAq+LFaY5ng5u4jp5mRROSswo76PPA==", + "dev": true + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.1.tgz", + "integrity": "sha512-SiwgrRuRD2D1R6qjwwoopKcCTkmmIWjy1M15Wv+Nk/7VUsBad4P8GOPft2t6coDZG0TuR5dq9o1v0g8wo7F6+A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.0.1.tgz", + "integrity": "sha512-PqVQ8c6a3kyqdsUZlC7nljp3FFuxipBRHKu+7C1h8QygBFlzTaDX5HD383jej3Peed+1aDG8HwkfB1Z1HMNPkw==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "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" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "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" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "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" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://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": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es3-member-expression-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", + "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es3-property-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", + "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-preset-fbjs": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-2.2.0.tgz", + "integrity": "sha512-jj0KFJDioYZMtPtZf77dQuU+Ad/1BtN0UnAYlHDa8J8f4tGXr3YrPoJImD5MdueaOPeN/jUdrCgu330EfXr0XQ==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.8.0", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-plugin-syntax-flow": "^6.8.0", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-plugin-syntax-trailing-function-commas": "^6.8.0", + "babel-plugin-transform-class-properties": "^6.8.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.8.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.8.0", + "babel-plugin-transform-es2015-block-scoping": "^6.8.0", + "babel-plugin-transform-es2015-classes": "^6.8.0", + "babel-plugin-transform-es2015-computed-properties": "^6.8.0", + "babel-plugin-transform-es2015-destructuring": "^6.8.0", + "babel-plugin-transform-es2015-for-of": "^6.8.0", + "babel-plugin-transform-es2015-function-name": "^6.8.0", + "babel-plugin-transform-es2015-literals": "^6.8.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.8.0", + "babel-plugin-transform-es2015-object-super": "^6.8.0", + "babel-plugin-transform-es2015-parameters": "^6.8.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.8.0", + "babel-plugin-transform-es2015-spread": "^6.8.0", + "babel-plugin-transform-es2015-template-literals": "^6.8.0", + "babel-plugin-transform-es3-member-expression-literals": "^6.8.0", + "babel-plugin-transform-es3-property-literals": "^6.8.0", + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-plugin-transform-object-rest-spread": "^6.8.0", + "babel-plugin-transform-react-display-name": "^6.8.0", + "babel-plugin-transform-react-jsx": "^6.8.0" + } + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "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" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "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 + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "ci-info": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.5.1.tgz", + "integrity": "sha512-fKFIKXaYiL1exImwJ0AhR/6jxFPSKQBk2ayV5NiNoruUs2+rxC2kNw0EG+1Z9dugZRdCrppskQ8DN2cyaUM1Hw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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" + } + }, + "closest-file-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/closest-file-data/-/closest-file-data-0.1.4.tgz", + "integrity": "sha1-l1+HwTLymdJKA3W59jyj+4j3Kzo=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "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", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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 + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "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 + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cssom": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "dev": true + }, + "cssstyle": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", + "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", + "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "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, + "optional": true + } + } + }, + "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 + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "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" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "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" + } + } + } + }, + "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 + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "dev": true, + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + } + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.6", + "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + } + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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 + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graphql": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", + "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", + "requires": { + "iterall": "^1.2.2" + } + }, + "graphql-compiler": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/graphql-compiler/-/graphql-compiler-1.6.2.tgz", + "integrity": "sha512-ZpnZm6ijwfphsnJpUvWd/M4taRR0xy5wYf1JR9LC29IGobORjAhXtEng41hYL4hAiSIpqep8zcac1yGCknaVMg==", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "fb-watchman": "^2.0.0", + "immutable": "~3.7.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.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": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "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 + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "immutable": { + "version": "3.7.6", + "resolved": "http://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "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" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, + "jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.6.0" + }, + "dependencies": { + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + } + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + } + }, + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "dev": true, + "requires": { + "pretty-format": "^23.6.0" + } + }, + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "dev": true, + "requires": { + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.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 + }, + "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" + } + } + } + }, + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^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 + } + } + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "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 + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "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" + } + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "requires": { + "mime-db": "~1.36.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "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" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "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" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "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 + }, + "nwsapi": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", + "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.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 + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "realpath-native": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", + "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "relay-compiler": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-1.6.2.tgz", + "integrity": "sha512-p2dYbQR4up4ZPLbTQ7GRP0ySlN3Btr1eT4PBhzCC+z4iJxZJczUPJnCvmxTvIHaxgoSjlUS88TR0Dbl13s7gDw==", + "dev": true, + "requires": { + "@babel/generator": "7.0.0-beta.54", + "@babel/parser": "7.0.0-beta.54", + "@babel/types": "7.0.0-beta.54", + "babel-polyfill": "^6.20.0", + "babel-preset-fbjs": "2.2.0", + "babel-runtime": "^6.23.0", + "babel-traverse": "^6.26.0", + "chalk": "^1.1.1", + "fast-glob": "^2.2.2", + "fb-watchman": "^2.0.0", + "fbjs": "0.8.17", + "graphql-compiler": "1.6.2", + "immutable": "~3.7.6", + "relay-runtime": "1.6.2", + "signedsource": "^1.0.0", + "yargs": "^9.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^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": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "relay-runtime": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-1.6.2.tgz", + "integrity": "sha512-eWjdlK+OvzW35fbYcFrO+S4dMyxb1LqrCU9HBh1OEEK465Te+l+l2Rmg9RCdcvaPuq7zGC6+Anec2/2aNXtiUA==", + "dev": true, + "requires": { + "babel-runtime": "^6.23.0", + "fbjs": "0.8.17" + } + }, + "relay-test-utils": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/relay-test-utils/-/relay-test-utils-1.6.2.tgz", + "integrity": "sha512-nyuqBYJAb9ut9L+3B2FlrYbUBBQ6VC2QqzTC+C2JYWRv+Re8MAcUx5Wk5Wo9E6g+Td7qKqM7AURW1tHvLUmYsg==", + "dev": true, + "requires": { + "babel-runtime": "^6.23.0", + "fbjs": "0.8.17", + "iterall": "^1.2.1", + "prop-types": "^15.5.8", + "relay-compiler": "1.6.2", + "relay-runtime": "1.6.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "^4.13.1" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "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 + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "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" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "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" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^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" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=", + "dev": true + }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "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", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "dev": true + }, + "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 + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + }, + "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-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-jest": { + "version": "23.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.1.4.tgz", + "integrity": "sha512-9rCSxbWfoZxxeXnSoEIzRNr9hDIQ8iEJAWmSRsWhDHDT8OeuGfURhJQUE8jtJlkyEygs6rngH8RYtHz9cfjmEA==", + "dev": true, + "requires": { + "closest-file-data": "^0.1.4", + "fs-extra": "6.0.1", + "json5": "^0.5.0", + "lodash": "^4.17.10" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", + "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "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, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "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" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz", + "integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==", + "dev": true, + "requires": { + "iconv-lite": "0.4.23" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", + "dev": true + }, + "whatwg-mimetype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz", + "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://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" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "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": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } +} diff --git a/transform/package.json b/transform/package.json new file mode 100644 index 00000000..4b399a81 --- /dev/null +++ b/transform/package.json @@ -0,0 +1,50 @@ +{ + "name": "typescript-transform-relay", + "version": "1.0.0", + "description": "A transformer for use with TypeScript when using relay (modern/compat/classic)", + "main": "lib/index.js", + "scripts": { + "test": "jest" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/kastermester/relay-compiler-language-typescript.git" + }, + "keywords": [ + "relay", + "typescript" + ], + "author": "Kaare Hoff Skovgaard ", + "license": "MIT", + "bugs": { + "url": "https://github.com/kastermester/relay-compiler-language-typescript/issues" + }, + "homepage": "https://github.com/kastermester/relay-compiler-language-typescript#readme", + "dependencies": { + "graphql": "^14.0.2" + }, + "devDependencies": { + "@types/graphql": "^14.0.0", + "@types/jest": "^22.0.1", + "@types/node": "^10.10.0", + "jest": "^23.6.0", + "relay-test-utils": "^1.6.0", + "ts-jest": "^23.1.4", + "typescript": "^2.9.2" + }, + "peerDependencies": { + "typescript": "^2.9.2 || >3.0.0" + }, + "jest": { + "transform": { + "^.+\\.tsx?$": "ts-jest" + }, + "testURL": "http://localhost", + "testRegex": "test/.+?-test\\.tsx?$", + "moduleFileExtensions": [ + "js", + "ts", + "tsx" + ] + } +} diff --git a/transform/src/GraphQLRelayDirective.ts b/transform/src/GraphQLRelayDirective.ts new file mode 100644 index 00000000..c3c4a398 --- /dev/null +++ b/transform/src/GraphQLRelayDirective.ts @@ -0,0 +1,32 @@ +import { buildSchema, GraphQLDirective } from "graphql"; + +export const SCHEMA_EXTENSION = `directive @relay( + # Marks this fragment spread as being deferrable such that it loads after + # other portions of the view. + deferrable: Boolean, + + # Marks a connection field as containing nodes without 'id' fields. + # This is used to silence the warning when diffing connections. + isConnectionWithoutNodeID: Boolean, + + # Marks a fragment as intended for pattern matching (as opposed to fetching). + # Used in Classic only. + pattern: Boolean, + + # Marks a fragment as being backed by a GraphQLList. + plural: Boolean, + + # Marks a fragment spread which should be unmasked if provided false + mask: Boolean = true, + + # Selectively pass variables down into a fragment. Only used in Classic. + variables: [String!], +) on FRAGMENT_DEFINITION | FRAGMENT_SPREAD | INLINE_FRAGMENT | FIELD`; + +export const GraphQLRelayDirective = buildSchema( + SCHEMA_EXTENSION + '\ntype Query { x: String }', +).getDirective('relay') as GraphQLDirective; + +if (!GraphQLRelayDirective) { + throw new Error('Failed to create GraphQLRelayDirective.'); +} diff --git a/transform/src/Options.ts b/transform/src/Options.ts new file mode 100644 index 00000000..7220387b --- /dev/null +++ b/transform/src/Options.ts @@ -0,0 +1,61 @@ +import { GraphQLSchema, buildClientSchema, buildASTSchema, parse } from "graphql"; +import * as fs from 'fs'; +import * as path from 'path'; +import { RelayQLTransformer } from "./RelayQLTransformer"; +import { SCHEMA_EXTENSION } from "./GraphQLRelayDirective"; + +export interface Options { + artifactDirectory?: string; + compat?: boolean; + schema?: string; + isDevVariable?: string; + buildCommand?: string; + isDevelopment?: boolean; + substituteVariables?: boolean; +} + +export interface NormalizedOptions { + artifactDirectory?: string; + compat?: boolean; + relayQLTransformer?: RelayQLTransformer; + isDevVariable?: string; + buildCommand?: string; + isDevelopment?: boolean; + substituteVariables?: boolean; +} + +const dotJsonLength = '.json'.length; +const dotGraphQLLength = '.graphql'.length; + +export function readGraphQLSchema(schemaPath: string): GraphQLSchema { + const contents = fs.readFileSync(path.resolve(schemaPath), { encoding: 'utf8' }); + if (schemaPath.substring(schemaPath.length - dotJsonLength) === '.json') { + const json = JSON.parse(contents); + if (json.__schema) { + return buildClientSchema(json); + } + if (json.data && json.data.__schema) { + return buildClientSchema(json.data); + } + throw new Error('Expected data file to contain a JSON encoded GraphQLSchema'); + } else if (schemaPath.substring(schemaPath.length - dotGraphQLLength) === '.graphql') { + return buildASTSchema(parse(SCHEMA_EXTENSION + "\n" + contents, { + allowLegacySDLImplementsInterfaces: true, + allowLegacySDLEmptyFields: true, + })); + } + throw new Error('Unsupported file. schema option only supports json and graphql file extensions'); +} + +export function normalizeOptions(options: Options): NormalizedOptions { + const { schema, ...opts } = options; + return { + ...opts, + relayQLTransformer: options.schema ? new RelayQLTransformer(readGraphQLSchema(options.schema), { + inputArgumentName: 'input', + snakeCase: false, + substituteVariables: options.substituteVariables || false, + validator: null, + }) : undefined, + }; +} diff --git a/transform/src/RelayQLAST.ts b/transform/src/RelayQLAST.ts new file mode 100644 index 00000000..8ffa7d20 --- /dev/null +++ b/transform/src/RelayQLAST.ts @@ -0,0 +1,907 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + * @fullSyntaxTransform + * @format + */ + +'use strict'; + +import { RelayTransformError } from "./RelayTransformError"; + +import { find } from "./find"; +import * as util from "util"; + +import { GraphQLRelayDirective } from "./GraphQLRelayDirective"; +import { ID } from "./RelayQLNodeInterface"; +import { + GraphQLBoolean, + GraphQLEnumType, + GraphQLFloat, + GraphQLID, + GraphQLInputObjectType, + GraphQLInt, + GraphQLInterfaceType, + GraphQLList, + GraphQLNonNull, + GraphQLObjectType, + GraphQLScalarType, + GraphQLString, + GraphQLUnionType, + isAbstractType, + SchemaMetaFieldDef, + TypeMetaFieldDef, + TypeNameMetaFieldDef, + NamedTypeNode, + GraphQLType, + ASTNode, + SelectionSetNode, + ArgumentNode, + DirectiveNode, + FieldNode, + FragmentDefinitionNode, + FragmentSpreadNode, + InlineFragmentNode, + Location, + OperationDefinitionNode, + ValueNode, + GraphQLSchema, + NameNode, +} from "graphql"; + +// TODO: Import types from `graphql`. +type GraphQLSchemaArgumentType = any; +type GraphQLSchemaField = any; +type GraphQLSchemaType = any; + +type RelayQLContext = { + definitionName: string, + generateID: () => string, + isPattern: boolean, + schema: GraphQLSchema, +}; + +type RelayQLSelection = + | RelayQLField + | RelayQLFragmentSpread + | RelayQLInlineFragment; + +export type RelayQLNodeType = Node & { + selectionSet?: SelectionSetNode; + directives?: DirectiveNode[]; + name?: NameNode; +} + +class RelayQLNode { + ast: RelayQLNodeType; + context: RelayQLContext; + + constructor(context: RelayQLContext, ast: RelayQLNodeType) { + this.ast = ast; + this.context = context; + } + + getLocation(): Location | undefined { + return this.ast.loc; + } + + getType(): RelayQLType { + throw new Error("Missing Implementation"); + } + + getField(fieldName: string): RelayQLField | undefined { + return find(this.getFields(), field => field.getName() === fieldName); + } + + getFields(): Array { + const fields: RelayQLField[] = []; + this.getSelections().forEach(selection => { + if (selection instanceof RelayQLField) { + fields.push(selection); + } + }); + return fields; + } + + getSelections(): Array { + if (!this.ast.selectionSet) { + return []; + } + // $FlowFixMe + return this.ast.selectionSet.selections.map(selection => { + if (selection.kind === 'Field') { + return new RelayQLField(this.context, selection as RelayQLNodeType, this.getType()); + } else if (selection.kind === 'FragmentSpread') { + return new RelayQLFragmentSpread(this.context, selection as RelayQLNodeType); + } else if (selection.kind === 'InlineFragment') { + return new RelayQLInlineFragment( + this.context, + selection as RelayQLNodeType, + this.getType(), + ); + } else { + throw new RelayTransformError( + util.format('Unexpected selection kind: %s', (selection as any).kind), + this.getLocation(), + ); + } + }); + } + + getDirectives(): Array { + // $FlowFixMe + return (this.ast.directives || []) + .filter(directive => directive.name.value !== 'fb_native_field') + .map(directive => new RelayQLDirective(this.context, directive)); + } + + hasDirective(name: string): boolean { + // $FlowFixMe + return (this.ast.directives || []).some(d => d.name.value === name); + } + + isPattern(): boolean { + return this.context.isPattern; + } +} + +export class RelayQLDefinition extends RelayQLNode { + getName(): string { + // TODO: this.context.definitionName; + return this.ast.name + ? // $FlowFixMe + this.ast.name.value + : this.getType().getName({ modifiers: false }); + } +} + +export class RelayQLFragment extends RelayQLDefinition< + // $FlowFixMe TT24544397 + FragmentDefinitionNode | InlineFragmentNode + > { + parentType: RelayQLType | undefined; + + constructor( + context: RelayQLContext, + ast: RelayQLNodeType, + parentType?: RelayQLType, + ) { + const relayDirectiveArgs: { [key: string]: ValueNode } = {}; + const relayDirective = find( + ast.directives || [], + directive => directive.name.value === 'relay', + ); + if (relayDirective) { + (relayDirective.arguments || []).forEach(arg => { + relayDirectiveArgs[arg.name.value] = arg.value; + }); + } + + const patternArg = relayDirectiveArgs.pattern; + + // @relay(pattern: true) + const isPattern = + patternArg && + patternArg.kind === 'BooleanValue' && + patternArg.value; + + super({ ...context, isPattern }, ast); + this.parentType = parentType; + } + + getType(): RelayQLType { + let type = this.ast.typeCondition; + if (type) { + let actualType: NamedTypeNode = type; + // Convert `ListType` and `NonNullType` into `NamedType`. + while (actualType.kind !== 'NamedType') { + actualType = (actualType as any as { type: NamedTypeNode }).type; + } + return new RelayQLType( + this.context, + this.context.schema.getType(actualType.name.value), + ); + } else if (this.ast.kind === 'InlineFragment') { + // Inline fragments without type conditions fall back to parent type. + if (!this.parentType) { + throw new RelayTransformError( + 'Cannot get type of typeless inline fragment without parent type.', + this.getLocation(), + ); + } + return this.parentType; + } else { + throw new RelayTransformError( + util.format('Unexpected fragment kind: %s', this.ast.kind), + this.getLocation(), + ); + } + } +} + +// $FlowFixMe TT24544397 +export class RelayQLMutation extends RelayQLDefinition { + getType(): RelayQLType { + return new RelayQLType(this.context, this.context.schema.getMutationType() as any); + } +} + +// $FlowFixMe TT24544397 +export class RelayQLQuery extends RelayQLDefinition { + getType(): RelayQLType { + return new RelayQLType(this.context, this.context.schema.getQueryType()); + } +} + +// $FlowFixMe TT24544397 +export class RelayQLSubscription extends RelayQLDefinition { + getType(): RelayQLType { + return new RelayQLType( + this.context, + this.context.schema.getSubscriptionType() as any, + ); + } +} + +// $FlowFixMe TT24544397 +export class RelayQLField extends RelayQLNode { + fieldDef: RelayQLFieldDefinition; + + constructor( + context: RelayQLContext, + ast: RelayQLNodeType, + parentType: RelayQLType, + ) { + super(context, ast); + const fieldName = this.ast.name.value; + const fieldDef = parentType.getFieldDefinition(fieldName, ast); + if (!fieldDef) { + throw new RelayTransformError( + util.format( + 'You supplied a field named `%s` on type `%s`, but no such field ' + + 'exists on that type.', + fieldName, + parentType.getName({ modifiers: false }), + ), + this.getLocation(), + ); + } + this.fieldDef = fieldDef; + } + + getName(): string { + return this.ast.name.value; + } + + getAlias(): string | null { + return this.ast.alias ? this.ast.alias.value : null; + } + + getType(): RelayQLType { + return this.fieldDef.getType(); + } + + hasArgument(argName: string): boolean { + return this.getArguments().some(arg => arg.getName() === argName); + } + + findArgument(argName: string): RelayQLArgument | undefined { + return find(this.getArguments(), arg => arg.getName() === argName); + } + + getArguments(): Array { + const argTypes = this.fieldDef.getDeclaredArguments(); + return (this.ast.arguments || []).map(arg => { + const argName = arg.name.value; + const argType = argTypes[argName]; + if (!argType) { + throw new RelayTransformError( + util.format( + 'You supplied an argument named `%s` on field `%s`, but no such ' + + 'argument exists on that field.', + argName, + this.getName(), + ), + this.getLocation(), + ); + } + return new RelayQLArgument(this.context, arg, argType); + }); + } + + hasDeclaredArgument(argName: string): boolean { + return this.fieldDef.getDeclaredArguments().hasOwnProperty(argName); + } + + getDeclaredArgument(argName: string): RelayQLArgumentType { + return this.fieldDef.getArgument(argName); + } + + getDeclaredArguments(): { [argName: string]: RelayQLArgumentType } { + return this.fieldDef.getDeclaredArguments(); + } +} + +// $FlowFixMe TT24544397 +export class RelayQLFragmentSpread extends RelayQLNode { + getName(): string { + return this.ast.name.value; + } + + getSelections(): Array { + throw new RelayTransformError( + 'Cannot get selection of a fragment spread.', + this.getLocation(), + ); + } +} + +// $FlowFixMe TT24544397 +export class RelayQLInlineFragment extends RelayQLNode { + parentType: RelayQLType; + + constructor( + context: RelayQLContext, + ast: RelayQLNodeType, + parentType: RelayQLType, + ) { + super(context, ast); + this.parentType = parentType; + } + + getFragment(): RelayQLFragment { + return new RelayQLFragment(this.context, this.ast, this.parentType); + } +} + +export class RelayQLDirective { + ast: DirectiveNode; + context: RelayQLContext; + argTypes: { [name: string]: RelayQLArgumentType }; + + constructor(context: RelayQLContext, ast: DirectiveNode) { + this.ast = ast; + this.context = context; + this.argTypes = {}; + + const directiveName = ast.name.value; + const schemaDirective = + directiveName === GraphQLRelayDirective.name + ? GraphQLRelayDirective + : context.schema.getDirective(directiveName); + if (!schemaDirective) { + throw new RelayTransformError( + util.format( + 'You supplied a directive named `%s`, but no such directive exists.', + directiveName, + ), + this.getLocation(), + ); + } + schemaDirective.args.forEach(schemaArg => { + this.argTypes[schemaArg.name] = new RelayQLArgumentType(schemaArg.type); + }); + } + + getLocation(): Location | undefined { + return this.ast.loc; + } + + getName(): string { + return this.ast.name.value; + } + + getArguments(): Array { + return (this.ast.arguments || []).map(arg => { + const argName = arg.name.value; + const argType = this.argTypes[argName]; + if (!argType) { + throw new RelayTransformError( + util.format( + 'You supplied an argument named `%s` on directive `%s`, but no ' + + 'such argument exists on that directive.', + argName, + this.getName(), + ), + this.getLocation(), + ); + } + return new RelayQLArgument(this.context, arg, argType); + }); + } +} + +export class RelayQLArgument { + ast: ArgumentNode; + context: RelayQLContext; + type: RelayQLArgumentType; + + constructor( + context: RelayQLContext, + ast: ArgumentNode, + type: RelayQLArgumentType, + ) { + this.ast = ast; + this.context = context; + this.type = type; + } + + getLocation(): Location | undefined { + return this.ast.loc; + } + + getName(): string { + return this.ast.name.value; + } + + getType(): RelayQLArgumentType { + return this.type; + } + + isVariable(): boolean { + return this.ast.value.kind === 'Variable'; + } + + getVariableName(): string { + if (this.ast.value.kind !== 'Variable') { + throw new RelayTransformError( + 'Cannot get variable name of an argument value.', + this.getLocation(), + ); + } + return this.ast.value.name.value; + } + + getValue(): any { + if (this.isVariable()) { + throw new RelayTransformError( + 'Cannot get value of an argument variable.', + this.getLocation(), + ); + } + + const value = this.ast.value; + if (value.kind === 'ListValue') { + return value.values.map( + val => + new RelayQLArgument( + this.context, + { ...this.ast, value: val }, + this.type.ofType(), + ), + ); + } else { + return getLiteralValue(value); + } + } +} + +export class RelayQLType { + isListType: boolean; + isNonNullType: boolean; + context: RelayQLContext; + schemaModifiedType: GraphQLSchemaType; + schemaUnmodifiedType: GraphQLSchemaType; + + constructor(context: RelayQLContext, schemaModifiedType: GraphQLSchemaType) { + this.context = context; + const { isListType, isNonNullType, schemaUnmodifiedType } = stripMarkerTypes( + schemaModifiedType, + ); + this.isListType = isListType; + this.isNonNullType = isNonNullType; + this.schemaUnmodifiedType = schemaUnmodifiedType; + this.schemaModifiedType = schemaModifiedType; + } + + canHaveSubselections(): boolean { + return !( + this.schemaUnmodifiedType instanceof GraphQLScalarType || + this.schemaUnmodifiedType instanceof GraphQLEnumType + ); + } + + getName({ modifiers }: { modifiers: boolean }): string { + return modifiers + ? this.schemaModifiedType.toString() + : this.schemaUnmodifiedType.toString(); + } + + hasField(fieldName: string): boolean { + return !!this.getFieldDefinition(fieldName); + } + + getFieldDefinition( + fieldName: string, + fieldAST?: any, + ): RelayQLFieldDefinition | null { + const type = this.schemaUnmodifiedType; + const isQueryType = type === this.context.schema.getQueryType(); + const hasTypeName = + type instanceof GraphQLObjectType || + type instanceof GraphQLInterfaceType || + type instanceof GraphQLUnionType; + const hasFields = + type instanceof GraphQLObjectType || type instanceof GraphQLInterfaceType; + + let schemaFieldDef; + if (isQueryType && fieldName === SchemaMetaFieldDef.name) { + schemaFieldDef = SchemaMetaFieldDef; + } else if (isQueryType && fieldName === TypeMetaFieldDef.name) { + schemaFieldDef = TypeMetaFieldDef; + } else if (hasTypeName && fieldName === TypeNameMetaFieldDef.name) { + schemaFieldDef = TypeNameMetaFieldDef; + } else if (hasFields) { + schemaFieldDef = (type as any).getFields()[fieldName]; + } + + // Temporary workarounds to support legacy schemas + if (!schemaFieldDef) { + if (hasTypeName && fieldName === '__type__') { + const typeType = this.context.schema.getType('Type'); + if (typeType == null) { + throw new Error('Could not read schema type `Type`'); + } + schemaFieldDef = { + name: '__type__', + type: new GraphQLNonNull(typeType), + description: 'The introspected type of this object.', + deprecatedReason: 'Use __typename', + args: [], + }; + } else if ( + isAbstractType(type as GraphQLType) && + fieldAST && + fieldAST.directives && + fieldAST.directives.some( + (directive: DirectiveNode) => directive.name.value === 'fixme_fat_interface', + ) + ) { + const possibleTypes = this.context.schema.getPossibleTypes(type as any); + for (let ii = 0; ii < possibleTypes.length; ii++) { + const possibleField = possibleTypes[ii].getFields()[fieldName]; + if (possibleField) { + // Fat interface fields can have differing arguments. Try to return + // a field with matching arguments, but still return a field if the + // arguments do not match. + schemaFieldDef = possibleField; + if (fieldAST && fieldAST.arguments) { + const argumentsAllExist = fieldAST.arguments.every((argument: ArgumentNode) => + find( + possibleField.args, + argDef => argDef.name === argument.name.value, + ), + ); + if (argumentsAllExist) { + break; + } + } + } + } + } + } + + return schemaFieldDef + ? new RelayQLFieldDefinition(this.context, schemaFieldDef) + : null; + } + + getInterfaces(): Array { + if (this.schemaUnmodifiedType instanceof GraphQLObjectType) { + return this.schemaUnmodifiedType + .getInterfaces() + .map(schemaInterface => new RelayQLType(this.context, schemaInterface)); + } + return []; + } + + getConcreteTypes(): Array { + if (! + this.isAbstract() + ) { + throw new Error("Cannot get concrete types of a concrete type."); + } + return this.context.schema + .getPossibleTypes(this.schemaUnmodifiedType as any) + .map(concreteType => new RelayQLType(this.context, concreteType)); + } + + getIdentifyingFieldDefinition(): RelayQLFieldDefinition | null { + if (this.alwaysImplements('Node')) { + return this.getFieldDefinition(ID); + } + return null; + } + + isAbstract(): boolean { + return isAbstractType(this.schemaUnmodifiedType as any); + } + + isList(): boolean { + return this.isListType; + } + + isNonNull(): boolean { + return this.isNonNullType; + } + + isQueryType(): boolean { + return this.schemaUnmodifiedType === this.context.schema.getQueryType(); + } + + isConnection(): boolean { + if (!/Connection$/.test(this.getName({ modifiers: false }))) { + return false; + } + const edges = this.getFieldDefinition('edges'); + if (!edges || !edges.getType().canHaveSubselections()) { + return false; + } + const node = edges.getType().getFieldDefinition('node'); + if (!node || !node.getType().canHaveSubselections()) { + return false; + } + const cursor = edges.getType().getFieldDefinition('cursor'); + if (!cursor || cursor.getType().canHaveSubselections()) { + return false; + } + return true; + } + + isConnectionEdge(): boolean { + return ( + /Edge$/.test(this.getName({ modifiers: false })) && + this.hasField('node') && + this.hasField('cursor') + ); + } + + isConnectionPageInfo(): boolean { + return this.getName({ modifiers: false }) === 'PageInfo'; + } + + alwaysImplements(typeName: string): boolean { + return ( + this.getName({ modifiers: false }) === typeName || + this.getInterfaces().some( + type => type.getName({ modifiers: false }) === typeName, + ) || + (this.isAbstract() && + this.getConcreteTypes().every(type => type.alwaysImplements(typeName))) + ); + } + + mayImplement(typeName: string): boolean { + return ( + this.getName({ modifiers: false }) === typeName || + this.getInterfaces().some( + type => type.getName({ modifiers: false }) === typeName, + ) || + (this.isAbstract() && + this.getConcreteTypes().some(type => type.alwaysImplements(typeName))) + ); + } + + generateField(fieldName: string): RelayQLField { + const generatedFieldAST: FieldNode = { + kind: 'Field', + name: { + kind: 'Name', + value: fieldName, + }, + }; + return new RelayQLField(this.context, generatedFieldAST as RelayQLNodeType, this); + } + + generateIdFragment(): RelayQLFragment { + const generatedFragmentAST = { + kind: 'Fragment', + name: { + kind: 'Name', + value: 'IdFragment', + }, + typeCondition: { + kind: 'NamedType', + name: { + value: 'Node', + }, + }, + // ID field will be generated by the printer; we won't declare it here. + }; + return new RelayQLFragment(this.context, (generatedFragmentAST as any), this); + } +} + +export class RelayQLFieldDefinition { + context: RelayQLContext; + schemaFieldDef: GraphQLSchemaField; + + constructor(context: RelayQLContext, schemaFieldDef: GraphQLSchemaField) { + this.context = context; + this.schemaFieldDef = schemaFieldDef; + } + + getName(): string { + return this.schemaFieldDef.name; + } + + getType(): RelayQLType { + return new RelayQLType(this.context, this.schemaFieldDef.type); + } + + hasArgument(argName: string): boolean { + return this.schemaFieldDef.args.some( + (schemaArg: any) => schemaArg.name === argName, + ); + } + + getArgument(argName: string): RelayQLArgumentType { + const schemaArg = find( + this.schemaFieldDef.args, + (arg: any) => arg.name === argName, + ); + if (!schemaArg) { + throw new Error(util.format("You tried to get an argument named `%s` on field `%s`, but no such " + + "argument exists on that field.", + argName, + this.getName(), + )); + } + return new RelayQLArgumentType(schemaArg.type); + } + + getDeclaredArguments(): { [argName: string]: RelayQLArgumentType } { + const args: { [key: string]: RelayQLArgumentType } = {}; + this.schemaFieldDef.args.forEach((schemaArg: any) => { + args[schemaArg.name] = new RelayQLArgumentType(schemaArg.type); + }); + return args; + } +} + +export class RelayQLArgumentType { + isListType: boolean; + isNonNullType: boolean; + schemaModifiedArgType: GraphQLSchemaArgumentType; + schemaUnmodifiedArgType: GraphQLSchemaArgumentType; + + constructor(schemaModifiedArgType: GraphQLSchemaArgumentType) { + const { isListType, isNonNullType, schemaUnmodifiedType } = stripMarkerTypes( + schemaModifiedArgType, + ); + this.isListType = isListType; + this.isNonNullType = isNonNullType; + this.schemaUnmodifiedArgType = schemaUnmodifiedType; + this.schemaModifiedArgType = schemaModifiedArgType; + } + + getName({ modifiers }: { modifiers: boolean }): string { + return modifiers + ? this.schemaModifiedArgType.toString() + : this.schemaUnmodifiedArgType.toString(); + } + + ofType(): RelayQLArgumentType { + if (!this.isList() && !this.isNonNull()) { + throw new Error("Can only get type of list or non-null type."); + } + return new RelayQLArgumentType(this.schemaUnmodifiedArgType); + } + + isCustomScalar(): boolean { + return ( + this.isScalar() && + !( + this.schemaUnmodifiedArgType === GraphQLBoolean || + this.schemaUnmodifiedArgType === GraphQLFloat || + this.schemaUnmodifiedArgType === GraphQLID || + this.schemaUnmodifiedArgType === GraphQLInt || + this.schemaUnmodifiedArgType === GraphQLString + ) + ); + } + + isBoolean(): boolean { + return this.schemaUnmodifiedArgType === GraphQLBoolean; + } + + isEnum(): boolean { + return this.schemaUnmodifiedArgType instanceof GraphQLEnumType; + } + + isID(): boolean { + return this.schemaUnmodifiedArgType === GraphQLID; + } + + isList(): boolean { + return this.isListType; + } + + isNonNull(): boolean { + return this.isNonNullType; + } + + isNumber(): boolean { + return ( + this.schemaUnmodifiedArgType === GraphQLFloat || + this.schemaUnmodifiedArgType === GraphQLInt + ); + } + + isObject(): boolean { + return this.schemaUnmodifiedArgType instanceof GraphQLInputObjectType; + } + + isScalar(): boolean { + return this.schemaUnmodifiedArgType instanceof GraphQLScalarType; + } + + isString(): boolean { + return this.schemaUnmodifiedArgType === GraphQLString; + } +} + +function stripMarkerTypes( + schemaModifiedType: GraphQLSchemaType, +): { + isListType: boolean, + isNonNullType: boolean, + schemaUnmodifiedType: GraphQLSchemaType, + } { + let isListType = false; + let isNonNullType = false; + let schemaUnmodifiedType = schemaModifiedType; + while (true) { + if (schemaUnmodifiedType instanceof GraphQLList) { + isListType = true; + } else if (schemaUnmodifiedType instanceof GraphQLNonNull) { + isNonNullType = true; + } else { + break; + } + schemaUnmodifiedType = schemaUnmodifiedType.ofType; + } + return { isListType, isNonNullType, schemaUnmodifiedType }; +} + +function getLiteralValue(value: ValueNode): any { + switch (value.kind) { + case 'IntValue': + return parseInt(value.value, 10); + case 'FloatValue': + return parseFloat(value.value); + case 'StringValue': + case 'BooleanValue': + case 'EnumValue': + return value.value; + case 'ListValue': + return value.values.map(getLiteralValue); + case 'NullValue': + return null; + case 'ObjectValue': + const object: { [key: string]: any } = {}; + value.fields.forEach(field => { + object[field.name.value] = getLiteralValue(field.value); + }); + return object; + case 'Variable': + throw new RelayTransformError( + util.format( + 'Unexpected nested variable `%s`; variables are supported as top-' + + 'level arguments - `node(id: $id)` - or directly within lists - ' + + '`nodes(ids: [$id])`.', + value.name.value, + ), + value.loc, + ); + default: + throw new RelayTransformError( + util.format('Unexpected value kind: %s', (value as any).kind), + (value as any).loc, + ); + } +} diff --git a/transform/src/RelayQLNodeInterface.ts b/transform/src/RelayQLNodeInterface.ts new file mode 100644 index 00000000..9fb7459b --- /dev/null +++ b/transform/src/RelayQLNodeInterface.ts @@ -0,0 +1 @@ +export const ID = 'id'; diff --git a/transform/src/RelayQLPrinter.ts b/transform/src/RelayQLPrinter.ts new file mode 100644 index 00000000..7bab5354 --- /dev/null +++ b/transform/src/RelayQLPrinter.ts @@ -0,0 +1,1025 @@ +import * as ts from "typescript"; + +import { RelayTransformError } from "./RelayTransformError"; + +import { find } from "./find"; +import * as util from "util"; + +import { + RelayQLField, + RelayQLFragment, + RelayQLFragmentSpread, + RelayQLInlineFragment, + RelayQLMutation, + RelayQLQuery, + RelayQLSubscription, +} from "./RelayQLAST"; +import { ID } from "./RelayQLNodeInterface"; + +import { + RelayQLArgument, + RelayQLArgumentType, + RelayQLDefinition, + RelayQLDirective, + RelayQLType, +} from "./RelayQLAST"; + +export type Printable = ts.Expression; +export type Substitution = { + name: string, + value: Printable, +}; + +type PrinterOptions = { + inputArgumentName: string | null, + snakeCase: boolean, +}; + +export function RelayQLPrinter(options: PrinterOptions) { + const formatFields = options.snakeCase + ? function (fields: T): T { + const formatted = {} as T; + (Object.keys(fields) as (keyof T)[]).forEach(name => { + formatted[name] = (name as string).replace( + /[A-Z]/g, + letter => '_' + letter.toLowerCase(), + ); + }); + return formatted; + } + : function (fields: T): T { + return fields; + }; + + const EMPTY_ARRAY = ts.createArrayLiteral([], /* multiLine */ false); + const FIELDS = formatFields({ + __typename: '__typename', + clientMutationId: 'clientMutationId', + clientSubscriptionId: 'clientSubscriptionId', + cursor: 'cursor', + edges: 'edges', + hasNextPage: 'hasNextPage', + hasPreviousPage: 'hasPreviousPage', + node: 'node', + pageInfo: 'pageInfo', + }); + const INPUT_ARGUMENT_NAME = options.inputArgumentName || 'input'; + const NULL = ts.createNull(); + + class RelayQLPrinter { + tagName: string; + variableNames: { [variableName: string]: void }; + + constructor( + tagName: string, + variableNames: { [variableName: string]: void }, + ) { + this.tagName = tagName; + this.variableNames = variableNames; + } + + print( + definition: RelayQLDefinition, + substitutions: Array, + enableValidation: boolean = true, + ): Printable { + let printedDocument: ts.Expression; + if (definition instanceof RelayQLQuery) { + printedDocument = this.printQuery(definition, enableValidation); + } else if (definition instanceof RelayQLFragment) { + printedDocument = this.printFragment(definition); + } else if (definition instanceof RelayQLMutation) { + printedDocument = this.printMutation(definition, enableValidation); + } else if (definition instanceof RelayQLSubscription) { + printedDocument = this.printSubscription(definition, enableValidation); + } else { + throw new RelayTransformError( + util.format('Unsupported definition: %s', definition), + definition.getLocation(), + ); + } + return ts.createCall( + ts.createFunctionExpression( + undefined, + undefined, + undefined, + undefined, + substitutions.map(substitution => ts.createParameter( + undefined, + undefined, + undefined, + ts.createIdentifier(substitution.name), undefined, undefined, undefined), + ), + undefined, + ts.createBlock([ + ts.createReturn(printedDocument), + ], /* mutliLine */ true), + ), + undefined, + substitutions.map(substitution => substitution.value), + ); + } + + printQuery(query: RelayQLQuery, enableValidation: boolean): Printable { + const rootFields = query.getFields(); + if (rootFields.length !== 1 && enableValidation) { + throw new RelayTransformError( + util.format( + 'There are %d fields supplied to the query named `%s`, but queries ' + + 'must have exactly one field.', + rootFields.length, + query.getName(), + ), + query.getLocation(), + ); + } + const rootField = rootFields[0]; + const rootFieldType = rootField.getType(); + const rootFieldArgs = rootField.getArguments(); + + const requisiteFields: { [key: string]: boolean } = {}; + const identifyingFieldDef = rootFieldType.getIdentifyingFieldDefinition(); + if (identifyingFieldDef) { + requisiteFields[identifyingFieldDef.getName()] = true; + } + if (rootFieldType.isAbstract()) { + requisiteFields[FIELDS.__typename] = true; + } + const selections = this.printSelections(rootField, requisiteFields); + const metadata = {} as { isPlural?: boolean; isAbstract?: boolean; identifyingArgName?: string; identifyingArgType?: string }; + if (rootFieldType.isList()) { + metadata.isPlural = true; + } + if (rootFieldType.isAbstract()) { + metadata.isAbstract = true; + } + if (rootFieldArgs.length > 1) { + throw new RelayTransformError( + util.format( + 'Invalid root field `%s`; Relay only supports root fields with zero ' + + 'or one argument.', + rootField.getName(), + ), + query.getLocation(), + ); + } + + let calls: Printable = NULL; + if (rootFieldArgs.length === 1) { + // Until such time as a root field's 'identifying argument' (one that has + // a 1-1 correspondence with a Relay record, or null) has a formal type, + // assume that the lone arg in a root field's call is the identifying one. + const identifyingArg = rootFieldArgs[0]; + const identifyingArgName = identifyingArg.getName(); + const identifyingArgType = identifyingArg + .getType() + .getName({ modifiers: true }); + metadata.identifyingArgName = identifyingArgName; + metadata.identifyingArgType = identifyingArgType; + calls = ts.createArrayLiteral( + [ + codify({ + kind: ts.createLiteral('Call'), + metadata: objectify({ + type: identifyingArgType, + }), + name: ts.createLiteral(identifyingArgName), + value: this.printArgumentValue(identifyingArg), + }), + ], + /* multiLine */ true, + ); + } + + return codify({ + calls, + children: selections, + directives: this.printDirectives(rootField.getDirectives()), + fieldName: ts.createLiteral(rootField.getName()), + kind: ts.createLiteral('Query'), + metadata: objectify(metadata as {}), + name: ts.createLiteral(query.getName()), + type: ts.createLiteral(rootFieldType.getName({ modifiers: false })), + }); + } + + printFragment(fragment: RelayQLFragment): Printable { + const fragmentType = fragment.getType(); + + const requisiteFields: { [key: string]: boolean } = {}; + let idFragment; + if (fragmentType.hasField(ID)) { + requisiteFields[ID] = true; + } else if (shouldGenerateIdFragment(fragment)) { + idFragment = fragmentType.generateIdFragment(); + } + if (fragmentType.isAbstract()) { + requisiteFields[FIELDS.__typename] = true; + } + const selections = this.printSelections( + fragment, + requisiteFields, + idFragment ? [idFragment] : null, + fragment.hasDirective('generated'), + ); + + const relayDirective = findRelayDirective(fragment); + const selectVariables = + relayDirective && + find( + relayDirective.getArguments(), + arg => arg.getName() === 'variables', + ); + + const metadata = this.printRelayDirectiveMetadata(fragment, { + isAbstract: fragmentType.isAbstract(), + isTrackingEnabled: !!selectVariables, + }); + + const fragmentCode = codify({ + children: selections, + directives: this.printDirectives(fragment.getDirectives()), + id: this.printFragmentID(fragment), + kind: ts.createLiteral('Fragment'), + metadata, + name: ts.createLiteral(fragment.getName()), + type: ts.createLiteral(fragmentType.getName({ modifiers: false })), + }); + + if (selectVariables) { + const selectVariablesValue = selectVariables.getValue(); + if (!Array.isArray(selectVariablesValue)) { + throw new RelayTransformError( + 'The variables argument to the @relay directive should be an array ' + + 'of strings.', + fragment.getLocation(), + ); + } + return ts.createCall( + ts.createPropertyAccess( + identify(this.tagName), + ts.createIdentifier('__createFragment'), + ), + undefined, + [ + fragmentCode, + ts.createObjectLiteral( + selectVariablesValue.map(item => { + const value = item.getValue(); + return ts.createPropertyAssignment(value, this.printVariable(value)); + }), + /* multiLine */ true, + ), + ], + ); + } + + return fragmentCode; + } + + printFragmentID(fragment: RelayQLFragment): Printable { + return ts.createCall( + ts.createPropertyAccess(identify(this.tagName), ts.createIdentifier('__id')), + undefined, + [], + ); + } + + printMutation( + mutation: RelayQLMutation, + enableValidation: boolean, + ): Printable { + const rootFields = mutation.getFields(); + if (rootFields.length !== 1 && enableValidation) { + throw new RelayTransformError( + util.format( + 'There are %d fields supplied to the mutation named `%s`, but ' + + 'mutations must have exactly one field.', + rootFields.length, + mutation.getName(), + ), + mutation.getLocation(), + ); + } + const rootField = rootFields[0]; + const rootFieldType = rootField.getType(); + validateMutationField(rootField); + const requisiteFields: { [key: string]: boolean } = {}; + if (rootFieldType.hasField(FIELDS.clientMutationId)) { + requisiteFields[FIELDS.clientMutationId] = true; + } + const selections = this.printSelections(rootField, requisiteFields); + const metadata = { + inputType: this.printArgumentTypeForMetadata( + rootField.getDeclaredArgument(INPUT_ARGUMENT_NAME), + ), + }; + + return codify({ + calls: ts.createArrayLiteral([ + codify({ + kind: ts.createLiteral('Call'), + metadata: objectify({}), + name: ts.createLiteral(rootField.getName()), + value: this.printVariable('input'), + }), + ], /* multiLine */ true), + children: selections, + directives: this.printDirectives(mutation.getDirectives()), + kind: ts.createLiteral('Mutation'), + metadata: objectify(metadata), + name: ts.createLiteral(mutation.getName()), + responseType: ts.createLiteral(rootFieldType.getName({ modifiers: false })), + }); + } + + printSubscription( + subscription: RelayQLSubscription, + enableValidation: boolean, + ): Printable { + const rootFields = subscription.getFields(); + if (rootFields.length !== 1 && enableValidation) { + throw new RelayTransformError( + util.format( + 'There are %d fields supplied to the subscription named `%s`, but ' + + 'subscriptions must have exactly one field.', + rootFields.length, + subscription.getName(), + ), + subscription.getLocation(), + ); + } + const rootField = rootFields[0]; + const rootFieldType = rootField.getType(); + validateMutationField(rootField); + const requisiteFields: { [key: string]: boolean } = {}; + if (rootFieldType.hasField(FIELDS.clientSubscriptionId)) { + requisiteFields[FIELDS.clientSubscriptionId] = true; + } + if (rootFieldType.hasField(FIELDS.clientMutationId)) { + requisiteFields[FIELDS.clientMutationId] = true; + } + const selections = this.printSelections(rootField, requisiteFields); + const metadata = { + inputType: this.printArgumentTypeForMetadata( + rootField.getDeclaredArgument(INPUT_ARGUMENT_NAME), + ), + }; + + return codify({ + calls: ts.createArrayLiteral([ + codify({ + kind: ts.createLiteral('Call'), + metadata: objectify({}), + name: ts.createLiteral(rootField.getName()), + value: this.printVariable('input'), + }), + ], /* multiLine */ true), + children: selections, + directives: this.printDirectives(subscription.getDirectives()), + kind: ts.createLiteral('Subscription'), + metadata: objectify(metadata), + name: ts.createLiteral(subscription.getName()), + responseType: ts.createLiteral(rootFieldType.getName({ modifiers: false })), + }); + } + + printSelections( + parent: RelayQLField | RelayQLFragment, + requisiteFields: { [fieldName: string]: boolean }, + extraFragments?: Array | null, + isGeneratedQuery = false, + ): Printable { + const fields: RelayQLField[] = []; + const printedFragments: Printable[] = []; + let didPrintFragmentReference = false; + parent.getSelections().forEach(selection => { + if (selection instanceof RelayQLFragmentSpread) { + // Assume that all spreads exist via template substitution. + if (selection.getDirectives().length !== 0) { + throw new RelayTransformError( + 'Directives are not yet supported for `${fragment}`-style fragment ' + + 'references.', + selection.getLocation(), + ); + } + printedFragments.push(this.printFragmentReference(selection)); + didPrintFragmentReference = true; + } else if (selection instanceof RelayQLInlineFragment) { + printedFragments.push(this.printFragment(selection.getFragment())); + } else if (selection instanceof RelayQLField) { + fields.push(selection); + } else { + throw new RelayTransformError( + util.format('Unsupported selection type `%s`.', selection), + (selection as any).getLocation(), + ); + } + }); + if (extraFragments) { + extraFragments.forEach(fragment => { + printedFragments.push(this.printFragment(fragment)); + }); + } + const printedFields = this.printFields( + fields, + parent, + requisiteFields, + isGeneratedQuery, + ); + const selections = [...printedFields, ...printedFragments]; + + if (selections.length) { + const arrayExpressionOfSelections = ts.createArrayLiteral(selections, /* multiLine */ true); + return didPrintFragmentReference + ? shallowFlatten(arrayExpressionOfSelections) + : arrayExpressionOfSelections; + } + return NULL; + } + + printFields( + fields: Array, + parent: RelayQLField | RelayQLFragment, + requisiteFields: { [fieldName: string]: boolean }, + isGeneratedQuery = false, + ): Array { + const parentType = parent.getType(); + if ( + parentType.isConnection() && + parentType.hasField(FIELDS.pageInfo) && + fields.some(field => field.getName() === FIELDS.edges) + ) { + requisiteFields[FIELDS.pageInfo] = true; + } + + const generatedFields = { ...requisiteFields }; + + const printedFields: Printable[] = []; + fields.forEach(field => { + delete generatedFields[field.getName()]; + printedFields.push( + this.printField( + field, + parent, + requisiteFields, + generatedFields, + isGeneratedQuery, + ), + ); + }); + + Object.keys(generatedFields).forEach(fieldName => { + const generatedField = parentType.generateField(fieldName); + printedFields.push( + this.printField( + generatedField, + parent, + requisiteFields, + generatedFields, + isGeneratedQuery, + ), + ); + }); + return printedFields; + } + + printField( + field: RelayQLField, + parent: RelayQLField | RelayQLFragment, + requisiteSiblings: { [fieldName: string]: boolean }, + generatedSiblings: { [fieldName: string]: boolean }, + isGeneratedQuery = false, + ): Printable { + const fieldType = field.getType(); + + const metadata: { + canHaveSubselections?: boolean, + inferredPrimaryKey?: string | null, + inferredRootCallName?: string | null, + isAbstract?: boolean, + isConnection?: boolean, + isFindable?: boolean, + isGenerated?: boolean, + isPlural?: boolean, + isRequisite?: boolean, + } = {}; + const requisiteFields: { [key: string]: boolean } = {}; + let idFragment; + if (fieldType.hasField(ID)) { + requisiteFields[ID] = true; + } else if (shouldGenerateIdFragment(field)) { + idFragment = fieldType.generateIdFragment(); + } + + if (!isGeneratedQuery) { + validateField(field, parent.getType()); + } + + if (fieldType.canHaveSubselections()) { + metadata.canHaveSubselections = true; + } + // TODO: Generalize to non-`Node` types. + if (fieldType.alwaysImplements('Node')) { + metadata.inferredRootCallName = 'node'; + metadata.inferredPrimaryKey = ID; + } + if (fieldType.isConnection()) { + if ( + field.hasDeclaredArgument('first') || + field.hasDeclaredArgument('last') + ) { + if (!isGeneratedQuery) { + validateConnectionField(field); + } + metadata.isConnection = true; + if (field.hasDeclaredArgument('find')) { + metadata.isFindable = true; + } + } + } else if (fieldType.isConnectionPageInfo()) { + requisiteFields[FIELDS.hasNextPage] = true; + requisiteFields[FIELDS.hasPreviousPage] = true; + } else if (fieldType.isConnectionEdge()) { + requisiteFields[FIELDS.cursor] = true; + requisiteFields[FIELDS.node] = true; + } + if (fieldType.isAbstract()) { + metadata.isAbstract = true; + requisiteFields[FIELDS.__typename] = true; + } + if (fieldType.isList()) { + metadata.isPlural = true; + } + if (generatedSiblings.hasOwnProperty(field.getName())) { + metadata.isGenerated = true; + } + if (requisiteSiblings.hasOwnProperty(field.getName())) { + metadata.isRequisite = true; + } + + const selections = this.printSelections( + field, + requisiteFields, + idFragment ? [idFragment] : null, + isGeneratedQuery, + ); + const fieldAlias = field.getAlias(); + const args = field.getArguments(); + const calls = args.length + ? ts.createArrayLiteral(args.map(arg => this.printArgument(arg)), /* multiLine */ true) + : NULL; + + return codify({ + alias: fieldAlias ? ts.createLiteral(fieldAlias) : NULL, + calls, + children: selections, + directives: this.printDirectives(field.getDirectives()), + fieldName: ts.createLiteral(field.getName()), + kind: ts.createLiteral('Field'), + metadata: this.printRelayDirectiveMetadata(field, metadata), + type: ts.createLiteral(fieldType.getName({ modifiers: false })), + }); + } + + printFragmentReference( + fragmentReference: RelayQLFragmentSpread, + ): Printable { + return ts.createCall( + ts.createPropertyAccess(identify(this.tagName), ts.createIdentifier('__frag')), + undefined, + [ts.createIdentifier(fragmentReference.getName())], + ); + } + + printArgument(arg: RelayQLArgument): Printable { + const metadata: { [key: string]: string } = {}; + const inputType = this.printArgumentTypeForMetadata(arg.getType()); + if (inputType) { + metadata.type = inputType; + } + return codify({ + kind: ts.createLiteral('Call'), + metadata: objectify(metadata), + name: ts.createLiteral(arg.getName()), + value: this.printArgumentValue(arg), + }); + } + + printArgumentValue(arg: RelayQLArgument): Printable { + if (arg.isVariable()) { + return this.printVariable(arg.getVariableName()); + } else { + return this.printValue(arg.getValue()); + } + } + + printVariable(name: string): Printable { + // Assume that variables named like substitutions are substitutions. + if (this.variableNames.hasOwnProperty(name)) { + return ts.createCall( + ts.createPropertyAccess(identify(this.tagName), ts.createIdentifier('__var')), + undefined, + [ts.createIdentifier(name)], + ); + } + return codify({ + kind: ts.createLiteral('CallVariable'), + callVariableName: ts.createLiteral(name), + }); + } + + printValue(value: any): Printable { + if (Array.isArray(value)) { + return ts.createArrayLiteral( + // $FlowFixMe + value.map(element => this.printArgumentValue(element)), + /* multiLine */ true + ); + } + return codify({ + kind: ts.createLiteral('CallValue'), + // codify() skips properties where value === NULL, but `callValue` is a + // required property. Create fresh null literals to force the property + // to be printed. + callValue: value == null ? ts.createNull() : printLiteralValue(value), + }); + } + + printDirectives(directives: Array): Printable { + const printedDirectives: Printable[] = []; + directives.forEach(directive => { + if (directive.getName() === 'relay') { + return; + } + printedDirectives.push( + ts.createObjectLiteral([ + ts.createPropertyAssignment('kind', ts.createLiteral('Directive')), + ts.createPropertyAssignment('name', ts.createLiteral(directive.getName())), + ts.createPropertyAssignment( + 'args', + ts.createArrayLiteral( + directive + .getArguments() + .map(arg => + ts.createObjectLiteral([ + ts.createPropertyAssignment('name', ts.createLiteral(arg.getName())), + ts.createPropertyAssignment('value', this.printArgumentValue(arg)), + ], true), + ), + /* multiLine */ true + ), + ), + ], true), + ); + }); + if (printedDirectives.length) { + return ts.createArrayLiteral(printedDirectives, /* multiLine */ true); + } + return NULL; + } + + printRelayDirectiveMetadata( + node: RelayQLField | RelayQLFragment, + maybeMetadata?: { [key: string]: any }, + ): Printable { + const properties: ts.PropertyAssignment[] = []; + const relayDirective = findRelayDirective(node); + if (relayDirective) { + relayDirective.getArguments().forEach(arg => { + if (arg.isVariable()) { + throw new RelayTransformError( + util.format( + 'You supplied `$%s` as the `%s` argument to the `@relay` ' + + 'directive, but `@relay` require scalar argument values.', + arg.getVariableName(), + arg.getName(), + ), + node.getLocation(), + ); + } + if (arg.getName() !== 'variables') { + properties.push( + ts.createPropertyAssignment(arg.getName(), ts.createLiteral(arg.getValue())), + ); + } + }); + } + if (maybeMetadata) { + const metadata = maybeMetadata; + Object.keys(metadata).forEach(key => { + if (metadata[key]) { + properties.push(ts.createPropertyAssignment(key, ts.createLiteral(metadata[key]))); + } + }); + } + return ts.createObjectLiteral(properties, /* multiLine */ true); + } + + /** + * Prints the type for arguments that are transmitted via variables. + */ + printArgumentTypeForMetadata(argType: RelayQLArgumentType): string | null { + // Only booleans and strings can be safely inlined, which is indicated to + // the runtime by the lack of a `metadata.type` property. + // - numbers may be represented as strings in client code due to + // the limitations with JavaScript numeric representations, and a + // string can't be inlined where a number is expected. + // - enums are unquoted, unlike JSON. + // - input objects have unquoted keys, unlike JSON. + // - custom scalars could be objects, in which case input object rules + // apply. + if (argType.isBoolean() || argType.isID() || argType.isString()) { + return null; + } + return argType.getName({ modifiers: true }); + } + } + + /** + * Determine if a `... on Node { id }` fragment should be generated for a + * field/fragment to allow identification of the response record. This + * fragment should be added when some/all implementors of the node's type + * also implement `Node` but a `Node` fragment is not already present. If it + * is present then `id` would be added as a requisite field. + */ + function shouldGenerateIdFragment( + node: RelayQLField | RelayQLFragment, + ): boolean { + return ( + node.getType().mayImplement('Node') && + !node.getSelections().some( + selection => + selection instanceof RelayQLInlineFragment && + selection + .getFragment() + .getType() + .getName({ modifiers: false }) === 'Node', + ) + ); + } + + function validateField(field: RelayQLField, parentType: RelayQLType): void { + if (field.getName() === 'node') { + var argTypes = field.getDeclaredArguments(); + var argNames = Object.keys(argTypes); + if ( + !parentType.isQueryType() && + argNames.length === 1 && + argNames[0] === ID + ) { + throw new RelayTransformError( + util.format( + 'You defined a `node(%s: %s)` field on type `%s`, but Relay requires ' + + 'the `node` field to be defined on the root type. See the Object ' + + 'Identification Guide: \n' + + 'http://facebook.github.io/relay/docs/graphql-object-identification.html', + ID, + argNames[0] && argTypes[argNames[0]].getName({ modifiers: true }), + parentType.getName({ modifiers: false }), + ), + field.getLocation(), + ); + } + } + } + + function validateConnectionField(field: RelayQLField): void { + const [first, last, before, after] = [ + field.findArgument('first'), + field.findArgument('last'), + field.findArgument('before'), + field.findArgument('after'), + ]; + let condition = + !first || !last || (first.isVariable() && last.isVariable()); + if (!condition) { + throw new RelayTransformError( + util.format( + 'Connection arguments `%s(first: , last: )` are ' + + 'not supported unless both are variables. Use `(first: )`, ' + + '`(last: )`, or `(first: $, last: $)`.', + field.getName(), + ), + field.getLocation(), + ); + } + condition = + !first || !before || (first.isVariable() && before.isVariable()); + if (!condition) { + throw new RelayTransformError( + util.format( + 'Connection arguments `%s(before: , first: )` are ' + + 'not supported unless both are variables. Use `(first: )`, ' + + '`(after: , first: )`, `(before: , last: )`, ' + + 'or `(before: $, first: $)`.', + field.getName(), + ), + field.getLocation(), + ); + } + condition = !last || !after || (last.isVariable() && after.isVariable()); + if (!condition) { + throw new RelayTransformError( + util.format( + 'Connection arguments `%s(after: , last: )` are ' + + 'not supported unless both are variables. Use `(last: )`, ' + + '`(before: , last: )`, `(after: , first: )`, ' + + 'or `(after: $, last: $)`.', + field.getName(), + ), + field.getLocation(), + ); + } + + // Use `any` because we already check `isConnection` before validating. + const connectionNodeType = (field as any) + .getType() + .getFieldDefinition(FIELDS.edges) + .getType() + .getFieldDefinition(FIELDS.node) + .getType(); + + // NOTE: These checks are imperfect because we cannot trace fragment spreads. + forEachRecursiveField(field, subfield => { + if ( + subfield.getName() === FIELDS.edges || + subfield.getName() === FIELDS.pageInfo + ) { + const hasCondition = + field.isPattern() || + field.hasArgument('find') || + field.hasArgument('first') || + field.hasArgument('last'); + + if (!hasCondition) { + throw new RelayTransformError( + util.format( + 'You supplied the `%s` field on a connection named `%s`, but you did ' + + 'not supply an argument necessary for Relay to handle the connection. ' + + 'Please specify a limit argument like `first`, or `last` or ' + + 'fetch a specific item with a `find` argument.', + subfield.getName(), + field.getName(), + ), + field.getLocation(), + ); + } + } else { + // Suggest `edges{node{...}}` instead of `nodes{...}`. + const subfieldType = subfield.getType(); + const isNodesLikeField = + subfieldType.isList() && + subfieldType.getName({ modifiers: false }) === + connectionNodeType.getName({ modifiers: false }); + + if (isNodesLikeField) { + throw new RelayTransformError( + util.format( + 'You supplied a field named `%s` on a connection named `%s`, but ' + + 'pagination is not supported on connections without using `%s`. ' + + 'Use `%s{%s{%s{...}}}` instead.', + subfield.getName(), + field.getName(), + FIELDS.edges, + field.getName(), + FIELDS.edges, + FIELDS.node, + ), + field.getLocation(), + ); + } + } + }); + } + + function validateMutationField(rootField: RelayQLField): void { + const declaredArgs = rootField.getDeclaredArguments(); + const declaredArgNames = Object.keys(declaredArgs); + if (declaredArgNames.length !== 1) { + throw new RelayTransformError( + util.format( + 'Your schema defines a mutation field `%s` that takes %d arguments, ' + + 'but mutation fields must have exactly one argument named `%s`.', + rootField.getName(), + declaredArgNames.length, + INPUT_ARGUMENT_NAME, + ), + rootField.getLocation(), + ); + } + + if (declaredArgNames[0] !== INPUT_ARGUMENT_NAME) { + throw new RelayTransformError( + util.format( + 'Your schema defines a mutation field `%s` that takes an argument ' + + 'named `%s`, but mutation fields must have exactly one argument ' + + 'named `%s`.', + rootField.getName(), + declaredArgNames[0], + INPUT_ARGUMENT_NAME, + ), + rootField.getLocation(), + ); + } + + const rootFieldArgs = rootField.getArguments(); + if (rootFieldArgs.length > 1) { + throw new RelayTransformError( + util.format( + 'There are %d arguments supplied to the mutation field named `%s`, ' + + 'but mutation fields must have exactly one `%s` argument.', + rootFieldArgs.length, + rootField.getName(), + INPUT_ARGUMENT_NAME, + ), + rootField.getLocation(), + ); + } + } + + const forEachRecursiveField = function( + parentSelection: RelayQLField | RelayQLFragment, + callback: (field: RelayQLField) => void, + ): void { + parentSelection.getSelections().forEach(selection => { + if (selection instanceof RelayQLField) { + callback(selection); + } else if (selection instanceof RelayQLInlineFragment) { + forEachRecursiveField(selection.getFragment(), callback); + } + // Ignore `RelayQLFragmentSpread` selections. + }); + }; + + function codify(obj: { [key: string]: Printable }): Printable { + const properties: ts.PropertyAssignment[] = []; + Object.keys(obj).forEach(key => { + const value = obj[key]; + if (value !== NULL) { + properties.push(ts.createPropertyAssignment(ts.createIdentifier(key), value)); + } + }); + return ts.createObjectLiteral(properties, /* multiLine */ true); + } + + function identify(str: string): Printable { + return str.split('.').reduce((acc, name) => { + if (!acc) { + return ts.createIdentifier(name); + } + return ts.createPropertyAccess(acc, ts.createIdentifier(name)); + }, null as null | Printable) as Printable; + } + + function objectify(obj: { [key: string]: string | null | number | boolean }): Printable { + const properties: ts.PropertyAssignment[] = []; + Object.keys(obj).forEach(key => { + const value = obj[key]; + if (value) { + properties.push(ts.createPropertyAssignment(ts.createIdentifier(key), ts.createLiteral(value))); + } + }); + return ts.createObjectLiteral(properties, /* multiLine */ true); + } + + function printLiteralValue(value: any): Printable { + if (value == null) { + return NULL; + } else if (Array.isArray(value)) { + return ts.createArrayLiteral(value.map(printLiteralValue), /* multiLine */ true); + } else if (typeof value === 'object' && value != null) { + const objectValue = value; + return ts.createObjectLiteral( + Object.keys(objectValue).map(key => + ts.createPropertyAssignment(key, printLiteralValue(objectValue[key])), + ), + /* multiLine */ true, + ); + } else { + return ts.createLiteral(value); + } + } + + function shallowFlatten(arr: Printable): Printable { + return ts.createCall( + ts.createPropertyAccess( + ts.createPropertyAccess(EMPTY_ARRAY, ts.createIdentifier('concat')), + ts.createIdentifier('apply'), + ), + undefined, + [EMPTY_ARRAY, arr], + ); + } + + function findRelayDirective( + node: RelayQLField | RelayQLFragment, + ): RelayQLDirective | undefined { + return find( + node.getDirectives(), + directive => directive.getName() === 'relay', + ); + } + + return RelayQLPrinter; +}; diff --git a/transform/src/RelayQLTransformer.ts b/transform/src/RelayQLTransformer.ts new file mode 100644 index 00000000..b7e92e6b --- /dev/null +++ b/transform/src/RelayQLTransformer.ts @@ -0,0 +1,252 @@ +import { RelayQLPrinter } from './RelayQLPrinter'; + +import * as util from 'util'; +import * as path from 'path'; +import * as ts from 'typescript'; + +import { RelayQLFragment, RelayQLMutation, RelayQLQuery, RelayQLSubscription, RelayQLNodeType } from './RelayQLAST'; +import { + formatError, + parse, + Source, + validate, + FieldsOnCorrectTypeRule, + FragmentsOnCompositeTypesRule, + KnownArgumentNamesRule, + KnownTypeNamesRule, + PossibleFragmentSpreadsRule, + VariablesInAllowedPositionRule, +} from 'graphql'; +import * as gql from 'graphql'; + +const ValuesOfCorrectTypeRule: typeof PossibleFragmentSpreadsRule = (gql as any).ValuesOfCorrectTypeRule; + +import { RelayQLDefinition } from './RelayQLAST'; +import { Printable, Substitution } from './RelayQLPrinter'; +import { DocumentNode, GraphQLError, GraphQLFormattedError, GraphQLSchema } from 'graphql'; + +export type Validator = () => { + validate: (schema: GraphQLSchema, ast: T) => Array; +}; + +type TransformerOptions = { + inputArgumentName: string | null; + snakeCase: boolean; + substituteVariables: boolean; + validator: Validator | null; +}; +type TextTransformOptions = { + documentName: string; + enableValidation: boolean; + propName: string | null; + tagName: string; +}; + +function sanitizeDocumentName(str: string): string { + const basename = path.basename(str.replace(/-/g, '_')); + const firstDot = basename.indexOf('.'); + if (firstDot < 0) { + return basename; + } + return basename.substr(0, firstDot); +} + +/** + * Transforms a TemplateLiteral node into a RelayQLDefinition, which is then + * transformed into a TS AST via RelayQLPrinter. + */ +export class RelayQLTransformer { + schema: GraphQLSchema; + options: TransformerOptions; + + constructor(schema: GraphQLSchema, options: TransformerOptions) { + this.schema = schema; + this.options = options; + } + + transform(node: ts.TaggedTemplateExpression, options: TextTransformOptions): Printable { + const documentName = sanitizeDocumentName(options.documentName); + const opts = { + documentName, + propName: options.propName, + enableValidation: options.enableValidation, + tagName: options.tagName, + }; + const { substitutions, templateText, variableNames } = this.processTemplateLiteral(node, documentName); + const documentText = this.processTemplateText(templateText, opts); + const definition = this.processDocumentText(documentText, opts); + + const Printer = RelayQLPrinter(this.options); + return new Printer(options.tagName, variableNames).print(definition, substitutions, options.enableValidation); + } + + /** + * Convert TemplateLiteral into a single template string with substitution + * names, a matching array of substituted values, and a set of substituted + * variable names. + */ + processTemplateLiteral( + node: ts.TaggedTemplateExpression, + documentName: string, + ): { + substitutions: Array; + templateText: string; + variableNames: { [variableName: string]: void }; + } { + const chunks: string[] = []; + const variableNames: { [key: string]: undefined } = {}; + const substitutions: Substitution[] = []; + const template = node.template; + if (ts.isNoSubstitutionTemplateLiteral(template)) { + return { + substitutions, + templateText: template.text, + variableNames, + }; + } + chunks.push(template.head.text); + let previousChunk = template.head.text; + template.templateSpans.forEach((element, ii) => { + const literal = element.literal; + const chunk = literal.text; + const name = 'RQL_' + ii; + const value = element.expression; + substitutions.push({ name, value }); + if (/:\s*$/.test(previousChunk)) { + if (!this.options.substituteVariables) { + throw new Error( + util.format( + 'You supplied a GraphQL document named `%s` that uses template ' + + 'substitution for an argument value, but variable substitution ' + + 'has not been enabled.', + documentName, + ), + ); + } + chunks.push('$' + name); + variableNames[name] = undefined; + } else { + chunks.push('...' + name); + } + chunks.push(chunk); + previousChunk = chunk; + }); + return { substitutions, templateText: chunks.join('').trim(), variableNames }; + } + + /** + * Converts the template string into a valid GraphQL document string. + */ + processTemplateText(templateText: string, { documentName, propName }: TextTransformOptions): string { + const pattern = /^[\s\n]*(fragment|mutation|query|subscription)\s*(\w*)?([\s\S]*)/; + const matches = pattern.exec(templateText); + if (!matches) { + throw new Error( + util.format( + 'You supplied a GraphQL document named `%s` with invalid syntax. It ' + + 'must start with `fragment`, `mutation`, `query`, or `subscription`.', + documentName, + ), + ); + } + const type = matches[1]; + let name = matches[2] || documentName; + let rest = matches[3]; + // Allow `fragment on Type {...}`. + if (type === 'fragment' && name === 'on') { + name = documentName + (propName ? '_' + capitalize(propName) : '') + 'RelayQL'; + rest = 'on' + rest; + } + const definitionName = capitalize(name); + return type + ' ' + definitionName + ' ' + rest; + } + + /** + * Parses the GraphQL document string into a RelayQLDocument. + */ + processDocumentText( + documentText: string, + { documentName, enableValidation }: TextTransformOptions, + ): RelayQLDefinition { + const document = parse(new Source(documentText, documentName)); + const validationErrors = enableValidation ? this.validateDocument(document, documentName) : null; + if (validationErrors) { + const error = new Error( + util.format('You supplied a GraphQL document named `%s` with validation errors.', documentName), + ); + (error as any).validationErrors = validationErrors; + (error as any).sourceText = documentText; + throw error; + } + const definition = document.definitions[0]; + + const context = { + definitionName: capitalize(documentName), + isPattern: false, + generateID: createIDGenerator(), + schema: this.schema, + }; + if (definition.kind === 'FragmentDefinition') { + return new RelayQLFragment(context, definition as RelayQLNodeType); + } else if (definition.kind === 'OperationDefinition') { + if (definition.operation === 'mutation') { + return new RelayQLMutation(context, definition as RelayQLNodeType); + } else if (definition.operation === 'query') { + return new RelayQLQuery(context, definition as RelayQLNodeType); + } else if (definition.operation === 'subscription') { + return new RelayQLSubscription(context, definition as RelayQLNodeType); + } else { + throw new Error(util.format('Unsupported operation: %s', definition.operation)); + } + } else { + throw new Error(util.format('Unsupported definition: %s', definition.kind)); + } + } + + validateDocument(document: DocumentNode, documentName: string): Array | null { + if (document.definitions.length !== 1) { + throw new Error( + util.format( + 'You supplied a GraphQL document named `%s` with %d definitions, but ' + + 'it must have exactly one definition.', + documentName, + document.definitions.length, + ), + ); + } + + const validator = this.options.validator; + let validationErrors; + if (validator) { + validationErrors = validator().validate(this.schema, document); + } else { + const rules = [ + FieldsOnCorrectTypeRule, + FragmentsOnCompositeTypesRule, + KnownArgumentNamesRule, + KnownTypeNamesRule, + PossibleFragmentSpreadsRule, + ValuesOfCorrectTypeRule, + VariablesInAllowedPositionRule, + ]; + validationErrors = validate(this.schema, document, rules); + } + + if (validationErrors && validationErrors.length > 0) { + return validationErrors.map(formatError); + } + return null; + } +} + +function capitalize(string: string): string { + return string[0].toUpperCase() + string.slice(1); +} + +/** + * Utility to generate locally scoped auto-incrementing IDs. + */ +function createIDGenerator(): () => string { + let _id = 0; + return () => (_id++).toString(32); +} diff --git a/transform/src/RelayTransformError.ts b/transform/src/RelayTransformError.ts new file mode 100644 index 00000000..18bb0166 --- /dev/null +++ b/transform/src/RelayTransformError.ts @@ -0,0 +1,11 @@ +import { Location } from "graphql"; + +export class RelayTransformError extends Error { + loc: Location | null; + + constructor(message: string, loc: Location | undefined) { + super(message); + this.loc = loc || null; + Object.setPrototypeOf(this, RelayTransformError.prototype); + } +} diff --git a/transform/src/ScopeAnalyzer.ts b/transform/src/ScopeAnalyzer.ts new file mode 100644 index 00000000..9249b360 --- /dev/null +++ b/transform/src/ScopeAnalyzer.ts @@ -0,0 +1,212 @@ +import * as ts from 'typescript'; +import { isForInStatement, isFunctionDeclaration, isFunctionExpression } from 'typescript'; +const enum BindingScope { + FunctionScope, + LexicalScope +} + +export const enum BindingKind { + Variable = 1, + FunctionParameter = 2, + Class = 3, + Require = 4, + Import = 5, + Export = 6, +} + +class Binding { + bindingScope: BindingScope; + bindingKind: BindingKind; + node: ts.Node; + + public constructor(node: ts.Node, bindingScope: BindingScope, bindingKind: BindingKind) { + this.bindingScope = bindingScope; + this.bindingKind = bindingKind; + this.node = node; + } +} + +class Scope { + private scopeNode: ts.Node; + private bindings: Map; + private parentScope: Scope | null; + + public constructor(scopeNode: ts.Node, parentScope: Scope | null) { + this.scopeNode = scopeNode; + this.parentScope = parentScope; + this.bindings = new Map(); + } + + public addBinding(name: string, binding: Binding) { + if (binding.bindingKind === BindingKind.FunctionParameter && !ts.isFunctionLike(this.scopeNode)) { + throw new Error('Can only add function parameter bindings to a functionlike node'); + } + switch (binding.bindingScope) { + case BindingScope.LexicalScope: + this.bindings.set(name, binding); + return; + case BindingScope.FunctionScope: + // Find the nearest function or source file scope and add the var to that scope + let scope: Scope = this; + while (!ts.isFunctionLike(scope.scopeNode) && !ts.isSourceFile(scope.scopeNode)) { + if (scope.parentScope == null) { + throw new Error('Attempting to reach parent scope of root scope'); + } + scope = scope.parentScope; + } + scope.bindings.set(name, binding); + return; + default: + throw new Error('Unexpected case'); + } + } + + public addBindingName(name: ts.BindingName, binding: Binding) { + if (ts.isIdentifier(name)) { + this.addBinding(name.text, binding); + return; + } + if (ts.isObjectBindingPattern(name)) { + name.elements.forEach(element => { + this.addBindingName(element.name, new Binding(element, binding.bindingScope, binding.bindingKind)); + }); + return; + } + name.elements.forEach(element => { + if (ts.isOmittedExpression(element)) { + return; + } + this.addBindingName(element.name, new Binding(element, binding.bindingScope, binding.bindingKind)); + }); + } + + public getBindingInfo(name: string): BindingKind | null { + const bindingInfo = this.bindings.get(name); + + if (bindingInfo != null) { + return bindingInfo.bindingKind; + } + if (this.parentScope != null) { + return this.parentScope.getBindingInfo(name); + } + return null; + } +} + +type ScopeNode = ts.Block | ts.SourceFile | ts.FunctionLike; + +function isScopeNode(node: ts.Node): boolean { + return ( + ts.isBlock(node) || + ts.isSourceFile(node) || + ts.isFunctionLike(node) || + ts.isForInStatement(node) || + ts.isForOfStatement(node) || + ts.isForStatement(node) + ); +} + +function isRequireCall(node: ts.Node): boolean { + return ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'require'; +} + +export class ScopeAnalyzer { + private readonly scopes: Map; + private isAnalyzed: boolean = false; + private sourceFile: ts.SourceFile; + + public constructor(sourceFile: ts.SourceFile) { + this.scopes = new Map(); + this.sourceFile = sourceFile; + } + + private getScopeNode(node: ts.Node): ts.Node { + while (!isScopeNode(node)) { + if (node.parent == null) { + throw new Error('parent not set on node'); + } + node = node.parent; + } + return node; + } + + private visitScope(node: ts.Node, scope: Scope): void { + const visitNode = (child: ts.Node) => { + if (isFunctionDeclaration(child) || isFunctionExpression(child)) { + if (child.name != null) { + scope.addBinding(child.name.text, new Binding(child, BindingScope.FunctionScope, BindingKind.Variable)); + } + } + if (isScopeNode(child)) { + this.generateScope(child, scope); + return; + } + if (ts.isVariableDeclarationList(child)) { + const bindingScope = (child.flags & ts.NodeFlags.BlockScoped) != 0 ? BindingScope.LexicalScope : BindingScope.FunctionScope; + let bindingKind = child.parent != null && ts.isVariableStatement(child.parent) && child.parent.modifiers != null && child.parent.modifiers.find(x => x.kind === ts.SyntaxKind.ExportKeyword) != null ? BindingKind.Export : BindingKind.Variable; + child.declarations.forEach(decl => { + if (decl.initializer != null) { + if (isRequireCall(decl.initializer)) { + bindingKind = BindingKind.Require; + } + ts.forEachChild(decl.initializer, visitNode); + } + scope.addBindingName(decl.name, new Binding(decl, bindingScope, bindingKind)); + }); + return; + } + if (ts.isClassDeclaration(child) && child.name != null) { + scope.addBinding(child.name.text, new Binding(child, BindingScope.LexicalScope, BindingKind.Class)); + } + if (ts.isImportDeclaration(child) && child.importClause != null) { + const namedBindings = child.importClause.namedBindings; + if (namedBindings != null) { + if (ts.isNamespaceImport(namedBindings)) { + scope.addBinding(namedBindings.name.text, new Binding(namedBindings, BindingScope.LexicalScope, BindingKind.Import)); + } else { + namedBindings.elements.forEach(element => { + scope.addBinding((element.propertyName || element.name).text, new Binding(element, BindingScope.LexicalScope, BindingKind.Import)); + }); + } + } + return; + } + ts.forEachChild(child, visitNode); + }; + ts.forEachChild(node, visitNode); + } + + private generateScope(node: ts.Node, parentScope: Scope | null): Scope { + const scope = new Scope(node, parentScope); + this.scopes.set(node, scope); + + if (ts.isFunctionLike(node)) { + node.parameters.forEach(param => { + scope.addBindingName(param.name, new Binding(param, BindingScope.FunctionScope, BindingKind.FunctionParameter)); + }) + } + + this.visitScope(node, scope); + + return scope; + } + + public getScope(node: ts.Node): Scope { + if (!this.isAnalyzed) { + this.generateScope(this.sourceFile, null); + this.isAnalyzed = true; + } + const existingScope = this.scopes.get(this.getScopeNode(node)); + if (existingScope != null) { + return existingScope; + } + throw new Error('Unknown scope node'); + } + + public getBindingAtNode(node: ts.Node, name: string): BindingKind | null { + const scope = this.getScope(node); + + const binding = scope.getBindingInfo(name); + return binding; + } +} diff --git a/transform/src/compileGraphQLTag.ts b/transform/src/compileGraphQLTag.ts new file mode 100644 index 00000000..5b548df5 --- /dev/null +++ b/transform/src/compileGraphQLTag.ts @@ -0,0 +1,137 @@ +// const createClassicNode = require('./createClassicNode'); +// const createCompatNode = require('./createCompatNode'); +import { createModernNode } from "./createModernNode"; +import { getFragmentNameParts } from "./getFragmentNameParts"; +import { DocumentNode, FragmentDefinitionNode, OperationDefinitionNode } from "graphql"; +import * as ts from 'typescript'; +import { NormalizedOptions } from "./Options"; +import { createCompatNode } from "./createCompatNode"; +import { createClassicNode } from "./createClassicNode"; +import { ScopeAnalyzer } from "./ScopeAnalyzer"; +import { setSourceMapRange } from "typescript"; + +/** + * Given a graphql`` tagged template literal, replace it with the appropriate + * runtime artifact. + */ +export function compileGraphQLTag( + ctx: ts.TransformationContext, + opts: NormalizedOptions, + node: ts.TaggedTemplateExpression, + ast: DocumentNode, + scopeAnalyzer: ScopeAnalyzer, + fileName: string, +): ts.Expression { + const mainDefinition = ast.definitions[0]; + + if (mainDefinition.kind === 'FragmentDefinition') { + const objPropName = getAssignedObjectPropertyName(node); + if (objPropName) { + if (ast.definitions.length !== 1) { + throw new Error( + 'TSTransformRelay: Expected exactly one fragment in the ' + + `graphql tag referenced by the property ${objPropName}.`, + ); + } + return createAST(ctx, opts, node, mainDefinition, fileName, scopeAnalyzer, true); + } + + const nodeMap: { [key: string]: ts.Expression } = {}; + for (const definition of ast.definitions) { + if (definition.kind !== 'FragmentDefinition') { + throw new Error( + 'TSTransformRelay: Expected only fragments within this ' + + 'graphql tag.', + ); + } + + const [, propName] = getFragmentNameParts(definition.name.value); + nodeMap[propName] = createAST(ctx, opts, node, definition, fileName, scopeAnalyzer, false); + } + return createObject(nodeMap, node); + } + + if (mainDefinition.kind === 'OperationDefinition') { + if (ast.definitions.length !== 1) { + throw new Error( + 'TSTransformRelay: Expected exactly one operation ' + + '(query, mutation, or subscription) per graphql tag.', + ); + } + return createAST(ctx, opts, node, mainDefinition, fileName, scopeAnalyzer, true); + } + + throw new Error( + 'TSTransformRelay: Expected a fragment, mutation, query, or ' + + 'subscription, got `' + + mainDefinition.kind + + '`.', + ); +} + +function createAST( + ctx: ts.TransformationContext, + opts: NormalizedOptions, + node: ts.TaggedTemplateExpression, + graphqlDefinition: FragmentDefinitionNode | OperationDefinitionNode, + fileName: string, + scopeAnalyzer: ScopeAnalyzer, + setSoueceMapRange: boolean, +) { + const isCompatMode = Boolean(opts.compat); + const isDevVariable = opts.isDevVariable; + const artifactDirectory = opts.artifactDirectory; + const buildCommand = + (opts.buildCommand) || 'relay-compiler'; + + const modernNode = createModernNode(ctx, opts, graphqlDefinition, fileName); + if (isCompatMode) { + const result = createCompatNode( + modernNode, + createClassicNode(ctx, scopeAnalyzer, node, graphqlDefinition, opts), + ); + if (setSourceMapRange) { + ts.setSourceMapRange(result, ts.getSourceMapRange(node)); + } + return result; + } + if (setSourceMapRange) { + ts.setSourceMapRange(modernNode, ts.getSourceMapRange(node)); + } + return modernNode; +} + +const idRegex = /^[$a-zA-Z_][$a-z0-9A-Z_]*$/; + +function createObject(obj: { [propName: string]: ts.Expression }, originalNode: ts.Node) { + const propNames = Object.keys(obj); + + const assignments = propNames.map(propName => { + const name = idRegex.test(propName) ? ts.createIdentifier(propName) : ts.createLiteral(propName); + return ts.createPropertyAssignment(name, obj[propName]) + }); + + const objectLiteralNode = ts.createObjectLiteral(assignments, /* multiLine */ true); + ts.setSourceMapRange(objectLiteralNode, ts.getSourceMapRange(originalNode)); + return objectLiteralNode; +} + +function getAssignedObjectPropertyName(node: ts.Node): string | undefined { + if (node.parent == null) { + return undefined; + } + + if (!ts.isPropertyAssignment(node.parent)) { + return undefined; + } + + const propName = node.parent.name; + + if (ts.isIdentifier(propName)) { + return propName.text; + } + if (ts.isStringLiteral(propName)) { + return propName.text; + } + return undefined; +} diff --git a/transform/src/compileRelayQLTag.ts b/transform/src/compileRelayQLTag.ts new file mode 100644 index 00000000..b0850af7 --- /dev/null +++ b/transform/src/compileRelayQLTag.ts @@ -0,0 +1,30 @@ +import { createTransformError } from "./createTransformError"; +import * as ts from "typescript"; +import { NormalizedOptions } from "./Options"; +import { RelayQLTransformer } from "./RelayQLTransformer"; + +/** + * Given all the metadata about a found RelayQL tag, compile it and return + * the resulting TS AST. + */ +export function compileRelayQLTag( + ctx: ts.TransformationContext, + options: NormalizedOptions, + transformer: RelayQLTransformer, + node: ts.TaggedTemplateExpression, + documentName: string, + propName: string | null, + tagName: string, + enableValidation: boolean, +): ts.Expression { + try { + return transformer.transform(node, { + documentName, + propName, + tagName, + enableValidation, + }); + } catch (e) { + throw createTransformError(e); + } +} diff --git a/transform/src/createClassicNode.ts b/transform/src/createClassicNode.ts new file mode 100644 index 00000000..809add58 --- /dev/null +++ b/transform/src/createClassicNode.ts @@ -0,0 +1,552 @@ +import * as ts from "typescript"; +import * as util from "util"; + +import { compileRelayQLTag } from "./compileRelayQLTag"; +import { getFragmentNameParts } from "./getFragmentNameParts"; +import { + DefinitionNode, + FragmentDefinitionNode, + DirectiveNode, + ArgumentNode, + FragmentSpreadNode, + VariableDefinitionNode, + OperationDefinitionNode, + ValueNode, + BooleanValueNode, + VariableNode, + visit, + print +} from "graphql"; +import { NormalizedOptions } from "./Options"; +import { ScopeAnalyzer, BindingKind } from "./ScopeAnalyzer"; + +interface Fragment { + name: string; + isMasked: boolean; + args: ts.Expression | null; +} + +interface Fragments { + [key: string]: Fragment; +} + +/** + * Relay Classic transforms to inline generated content. + */ +export function createClassicNode( + ctx: ts.TransformationContext, + scopeAnalyzer: ScopeAnalyzer, + node: ts.TaggedTemplateExpression, + graphqlDefinition: DefinitionNode, + options: NormalizedOptions +): ts.Expression { + if (graphqlDefinition.kind === 'FragmentDefinition') { + return createFragmentConcreteNode(ctx, scopeAnalyzer, node, graphqlDefinition, options); + } + + if (graphqlDefinition.kind === 'OperationDefinition') { + return createOperationConcreteNode(ctx, scopeAnalyzer, node, graphqlDefinition, options); + } + + throw new Error( + 'BabelPluginRelay: Expected a fragment, mutation, query, or ' + + 'subscription, got `' + + graphqlDefinition.kind + + '`.', + ); +} + +function createFragmentConcreteNode( + ctx: ts.TransformationContext, + scopeAnalyzer: ScopeAnalyzer, + node: ts.TaggedTemplateExpression, + graphqlDefinition: FragmentDefinitionNode, + options: NormalizedOptions +) { + const { + classicAST, + fragments, + variables, + argumentDefinitions, + } = createClassicAST(ctx, graphqlDefinition); + const substitutions = createSubstitutionsForFragmentSpreads( + ctx, + scopeAnalyzer, + node, + fragments, + ); + + const transformedAST = createObject({ + kind: ts.createLiteral('FragmentDefinition'), + argumentDefinitions: createFragmentArguments( + argumentDefinitions, + variables, + ), + node: createRelayQLTemplate(ctx, scopeAnalyzer, node, classicAST, options), + }); + + return createConcreteNode(transformedAST, substitutions); +} + +function createOperationConcreteNode( + ctx: ts.TransformationContext, + scopeAnalyzer: ScopeAnalyzer, + node: ts.TaggedTemplateExpression, + definition: OperationDefinitionNode, + options: NormalizedOptions, +) { + const definitionName = definition.name; + if (!definitionName) { + throw new Error('GraphQL operations must contain names'); + } + const { classicAST, fragments } = createClassicAST(ctx, definition); + const substitutions = createSubstitutionsForFragmentSpreads( + ctx, + scopeAnalyzer, + node, + fragments, + ); + const nodeAST = + classicAST.operation === 'query' + ? createFragmentForOperation(ctx, scopeAnalyzer, node, classicAST, options) + : createRelayQLTemplate(ctx, scopeAnalyzer, node, classicAST, options); + const transformedAST = createObject({ + kind: ts.createLiteral('OperationDefinition'), + argumentDefinitions: createOperationArguments( + definition.variableDefinitions, + ), + name: ts.createLiteral(definitionName.value), + operation: ts.createLiteral(classicAST.operation), + node: nodeAST, + }); + + return createConcreteNode(transformedAST, substitutions); +} + +function createClassicAST(ctx: ts.TransformationContext, definition: DefinitionNode) { + let fragmentID = 0; + + const fragments: Fragments = {}; + const variables: { [key: string]: null } = {}; + let argumentDefinitions: ReadonlyArray | null = null; + + const visitors = { + Directive(node: DirectiveNode) { + switch (node.name.value) { + case 'argumentDefinitions': + if (argumentDefinitions) { + throw new Error( + 'BabelPluginRelay: Expected only one ' + + '@argumentDefinitions directive', + ); + } + argumentDefinitions = node.arguments || null; + return null; + case 'connection': + return null; + default: + return node; + } + }, + + FragmentSpread(node: FragmentSpreadNode) { + const directives = node.directives || []; + + const fragmentName = node.name.value; + let fragmentArgumentsAST: ts.ObjectLiteralExpression | null = null; + let substitutionName = null; + let isMasked = true; + + if (directives.length === 0) { + substitutionName = fragmentName; + } else { + // TODO: maybe add support when unmasked fragment has arguments. + // $FlowFixMe graphql 0.12.2 + const directive = directives[0]; + if (directives.length !== 1) { + throw new Error( + "BabelPluginRelay: Cannot use both `@arguments` and `@relay(mask: false)` on the " + + "same fragment spread when in compat mode.", + ); + } + switch (directive.name.value) { + case 'arguments': + const fragmentArgumentsObject: { [key: string]: ts.Expression } = {}; + // $FlowFixMe graphql 0.12.2 + directive.arguments && directive.arguments.forEach(argNode => { + const argValue = argNode.value; + if (argValue.kind === 'Variable') { + variables[argValue.name.value] = null; + } + const arg = convertArgument(argNode); + fragmentArgumentsObject[arg.name] = arg.ast; + }); + fragmentArgumentsAST = createObject(fragmentArgumentsObject); + fragmentID++; + substitutionName = fragmentName + '_args' + fragmentID; + break; + case 'relay': + const relayArguments = directive.arguments; + if (!relayArguments || relayArguments.length !== 1 || relayArguments[0].name.value !== 'mask') { + throw new Error(util.format( + "TSTransformRelay: Expected `@relay` directive to only have `mask` argument in " + + "compat mode, but get %s", + ((relayArguments || [{ name: { value: null } }])[0].name || { value: null }).value, + )) + } + substitutionName = fragmentName; + isMasked = (relayArguments[0].value as BooleanValueNode).value !== false; + break; + default: + throw new Error( + 'BabelPluginRelay: Unsupported directive `' + + directive.name.value + + '` on fragment spread `...' + + fragmentName + + '`.', + ); + } + } + + if (!substitutionName) { + throw new Error("TSTransformRelay: Expected `substitutionName` to be non-nul"); + } + fragments[substitutionName] = { + name: fragmentName, + args: fragmentArgumentsAST, + isMasked, + }; + return Object.assign({}, node, { + name: { kind: 'Name', value: substitutionName }, + directives: [], + }); + }, + + Variable(node: VariableNode) { + variables[node.name.value] = null; + return node; + }, + }; + const classicAST = visit(definition, visitors); + + return { + classicAST, + fragments, + variables, + argumentDefinitions: argumentDefinitions as ArgumentNode[] | null, + }; +} + +const RELAY_QL_GENERATED = 'RelayQL_GENERATED'; + +function createConcreteNode(transformedAST: ts.Expression, substitutions: ts.VariableDeclaration[]) { + const body: ts.Statement[] = [ts.createReturn(transformedAST)]; + if (substitutions.length > 0) { + body.unshift( + ts.createVariableStatement( + undefined, + ts.createVariableDeclarationList(substitutions, ts.NodeFlags.Const)) + ); + } + return ts.createFunctionExpression( + undefined, + undefined, + undefined, + undefined, + [ts.createParameter(undefined, undefined, undefined, ts.createIdentifier(RELAY_QL_GENERATED), undefined, undefined, undefined)], + undefined, + ts.createBlock(body, /* multiLine */ true), + ); +} + +function createOperationArguments(variableDefinitions: ReadonlyArray | undefined) { + if (!variableDefinitions) { + return ts.createArrayLiteral([], false); + } + return ts.createArrayLiteral( + variableDefinitions.map(definition => { + const name = definition.variable.name.value; + const defaultValue = definition.defaultValue + ? parseValue(definition.defaultValue) + : ts.createNull(); + return createLocalArgument(name, defaultValue); + }, true), + ); +} + +function createFragmentArguments(argumentDefinitions: ArgumentNode[] | null, variables: { [key: string]: null }) { + const concreteDefinitions: ts.Expression[] = []; + Object.keys(variables).forEach(name => { + const definition = (argumentDefinitions || []).find( + arg => arg.name.value === name, + ); + if (definition) { + const defaultValueField = (definition.value as any).fields.find( + (field: any) => field.name.value === 'defaultValue', + ); + const defaultValue = defaultValueField + ? parseValue(defaultValueField.value) + : ts.createNull(); + concreteDefinitions.push(createLocalArgument(name, defaultValue)); + } else { + concreteDefinitions.push(createRootArgument(name)); + } + }); + return ts.createArrayLiteral(concreteDefinitions, true); +} + +function createLocalArgument(variableName: string, defaultValue: ts.Expression) { + return createObject({ + defaultValue: defaultValue, + kind: ts.createLiteral('LocalArgument'), + name: ts.createLiteral(variableName), + }); +} + +function createRootArgument(variableName: string) { + return ts.createObjectLiteral([ + ts.createPropertyAssignment(ts.createIdentifier('kind'), ts.createLiteral('RootArgument')), + ts.createPropertyAssignment(ts.createIdentifier('name'), ts.createLiteral(variableName)), + ], true); +} + +function parseValue(value: any) { + switch (value.kind) { + case 'BooleanValue': + return ts.createLiteral(value.value); + case 'IntValue': + return ts.createLiteral(parseInt(value.value, 10)); + case 'FloatValue': + return ts.createLiteral(parseFloat(value.value)); + case 'StringValue': + return ts.createLiteral(value.value); + case 'EnumValue': + return ts.createLiteral(value.value); + case 'ListValue': + return ts.createArrayLiteral(value.values.map((item: any) => parseValue(item)), /* multiLine */ true); + default: + throw new Error( + 'TSTransformRelay: Unsupported literal type `' + value.kind + '`.', + ); + } +} + +function convertArgument(argNode: ArgumentNode): { name: string; ast: ts.Expression } { + const name = argNode.name.value; + const value = argNode.value; + let ast = null; + switch (value.kind) { + case 'Variable': + const paramName = value.name.value; + ast = createObject({ + kind: ts.createLiteral('CallVariable'), + callVariableName: ts.createLiteral(paramName), + }); + break; + default: + ast = parseValue(value); + } + return { name, ast }; +} + +function createObject(obj: { [key: string]: ts.Expression | null }) { + return ts.createObjectLiteral( + Object.keys(obj).map(key => { + const value = obj[key]; + return ts.createPropertyAssignment(ts.createIdentifier(key), value == null ? ts.createNull() : value); + }), + /* multiLine */ true, + ); +} + +function createFragmentForOperation( + ctx: ts.TransformationContext, + scopeAnalyzer: ScopeAnalyzer, + node: ts.TaggedTemplateExpression, + operation: OperationDefinitionNode, + options: NormalizedOptions, +) { + let type; + const transformer = options.relayQLTransformer; + if (transformer == null) { + throw new Error('relayQLTransformer is null'); + } + switch (operation.operation) { + case 'query': + const queryType = transformer.schema.getQueryType(); + if (!queryType) { + throw new Error('Schema does not contain a root query type.'); + } + type = queryType.name; + break; + case 'mutation': + const mutationType = transformer.schema.getMutationType(); + if (!mutationType) { + throw new Error('Schema does not contain a root mutation type.'); + } + type = mutationType.name; + break; + case 'subscription': + const subscriptionType = transformer.schema.getSubscriptionType(); + if (!subscriptionType) { + throw new Error('Schema does not contain a root subscription type.'); + } + type = subscriptionType.name; + break; + default: + throw new Error( + 'BabelPluginRelay: Unexpected operation type: `' + + operation.operation + + '`.', + ); + } + const fragmentNode = { + kind: 'FragmentDefinition', + loc: operation.loc, + name: { + kind: 'Name', + value: operation.name!.value, + }, + typeCondition: { + kind: 'NamedType', + name: { + kind: 'Name', + value: type, + }, + }, + directives: operation.directives, + selectionSet: operation.selectionSet, + }; + return createRelayQLTemplate(ctx, scopeAnalyzer, node, fragmentNode, options); +} + +function createRelayQLTemplate( + ctx: ts.TransformationContext, + scopeAnalyzer: ScopeAnalyzer, + node: ts.TaggedTemplateExpression, + ast: any, + options: NormalizedOptions +) { + const [documentName, propName] = getFragmentNameParts(ast.name.value); + const text = print(ast); + const taggedTemplateLiteral = ts.createTaggedTemplate( + ts.createPropertyAccess(ts.createIdentifier('Relay'), ts.createIdentifier('QL')), + ts.createNoSubstitutionTemplateLiteral(text), + ); + + // Disable classic validation rules inside of `graphql` tags which are + // validated by the RelayCompiler with less strict rules. + const enableValidation = false; + + if (options.relayQLTransformer == null) { + throw new Error('relayQLTransformer is null'); + } + return compileRelayQLTag( + ctx, + options, + options.relayQLTransformer, + taggedTemplateLiteral, + documentName, + propName, + RELAY_QL_GENERATED, + enableValidation, + ); +} + + +function createSubstitutionsForFragmentSpreads( + ctx: ts.TransformationContext, + scopeAnalyzer: ScopeAnalyzer, + node: ts.TaggedTemplateExpression, + fragments: Fragments, +): ts.VariableDeclaration[] { + return Object.keys(fragments).map(varName => { + const fragment = fragments[varName]; + const [module, propName] = getFragmentNameParts(fragment.name); + if (!fragment.isMasked) { + if (!scopeAnalyzer.getBindingAtNode(node, module) && !scopeAnalyzer.getBindingAtNode(node, propName)) { + throw new Error(`TSTransformRelay: Please make sure module '${module}' is imported and not renamed or the + fragment '${ + fragment.name + }' is defined and bound to local variable '${propName}'. `); + } + const fragmentProp = scopeAnalyzer.getBindingAtNode(node, propName) + ? ts.createPropertyAccess(ts.createIdentifier(propName), ts.createIdentifier(propName)) + : ts.createLogicalOr( + ts.createPropertyAccess( + ts.createPropertyAccess(ts.createIdentifier(module), ts.createIdentifier(propName)), + ts.createIdentifier(propName), + ), + ts.createPropertyAccess(ts.createIdentifier(module), ts.createIdentifier(propName)), + ); + + return ts.createVariableDeclaration( + ts.createIdentifier(varName), + undefined, + ts.createPropertyAccess( + ts.createCall( + ts.createPropertyAccess( + ts.createIdentifier(RELAY_QL_GENERATED), + ts.createIdentifier('__getClassicFragment'), + ), + undefined, + [fragmentProp, ts.createLiteral(true)], + ), + // Hack to extract 'ConcreteFragment' from 'ConcreteFragmentDefinition' + ts.createIdentifier('node'), + ), + ); + } else { + return ts.createVariableDeclaration( + ts.createIdentifier(varName), + undefined, + createGetFragmentCall(ctx, scopeAnalyzer, module, propName, node, fragment.args), + ); + } + }); +} + +function createGetFragmentCall( + ctx: ts.TransformationContext, + scopeAnalyzer: ScopeAnalyzer, + module: string, + propName: string, + node: ts.Node, + fragmentArguments: ts.Expression | null, +): ts.Expression { + const args = []; + if (propName) { + args.push(ts.createLiteral(propName)); + } + + if (fragmentArguments) { + args.push(fragmentArguments); + } + + // If "module" is defined locally, then it's unsafe to assume it's a + // container. It might be a bound reference to the React class itself. + // To be safe, when defined locally, always check the __container__ property + // first. + const container = isDefinedLocally(scopeAnalyzer, node, module) + ? ts.createLogicalOr( + // __container__ is defined via ReactRelayCompatContainerBuilder. + ts.createPropertyAccess(ts.createIdentifier(module), ts.createIdentifier('__container__')), + ts.createIdentifier(module), + ) + : ts.createIdentifier(module); + + return ts.createCall( + ts.createPropertyAccess(container, ts.createIdentifier('getFragment')), + undefined, + args, + ); +} + +function isDefinedLocally(scopeAnalyzer: ScopeAnalyzer, node: ts.Node, name: string): boolean { + const binding = scopeAnalyzer.getBindingAtNode(node, name); + if (binding === null) { + return false; + } + + return binding !== BindingKind.Import && binding !== BindingKind.Require; +} diff --git a/transform/src/createCompatNode.ts b/transform/src/createCompatNode.ts new file mode 100644 index 00000000..aa428ef4 --- /dev/null +++ b/transform/src/createCompatNode.ts @@ -0,0 +1,15 @@ +import * as ts from "typescript"; +/** + * Relay Compat transforms graphql definitions into objects with `modern` and + * `classic` keys, each containing the resulting transforms. + */ +export function createCompatNode( + modernNode: ts.Expression, + classicNode: ts.Expression +): ts.Expression { + return ts.createObjectLiteral([ + ts.createPropertyAssignment(ts.createIdentifier('modern'), modernNode), + ts.createPropertyAssignment(ts.createIdentifier('classic'), classicNode), + ], true); +} + diff --git a/transform/src/createModernNode.ts b/transform/src/createModernNode.ts new file mode 100644 index 00000000..614f2e51 --- /dev/null +++ b/transform/src/createModernNode.ts @@ -0,0 +1,112 @@ +import * as crypto from "crypto"; +import * as fs from "fs"; +import * as path from "path"; +import * as ts from 'typescript'; + +import { print } from "graphql"; + +const GENERATED = './__generated__/'; + +import { OperationDefinitionNode, FragmentDefinitionNode } from "graphql"; +import { NormalizedOptions } from "./Options"; + +function createVariableStatement(type: ts.NodeFlags.Const | ts.NodeFlags.Let | undefined, name: ts.Identifier, initializer: ts.Expression): ts.VariableStatement { + return ts.createVariableStatement( + undefined, + ts.createVariableDeclarationList( + [ + ts.createVariableDeclaration( + name, + undefined, + initializer + ), + ], + type, + ), + ); +} + +/** + * Relay Modern creates separate generated files, so TS transforms graphql + * definitions to lazy require function calls. + */ +export function createModernNode( + ctx: ts.TransformationContext, + opts: NormalizedOptions, + graphqlDefinition: OperationDefinitionNode | FragmentDefinitionNode, + fileName: string, +): ts.Expression { + const definitionName = graphqlDefinition.name && graphqlDefinition.name.value; + if (!definitionName) { + throw new Error('GraphQL operations and fragments must contain names'); + } + const requiredFile = definitionName + '.graphql.ts'; + const requiredPath = opts.artifactDirectory + ? getRelativeImportPath(fileName, opts.artifactDirectory, requiredFile) + : GENERATED + requiredFile; + + const hash = crypto + .createHash('md5') + .update(print(graphqlDefinition), 'utf8') + .digest('hex'); + + const requireGraphQLModule = ts.createPropertyAccess(ts.createCall(ts.createIdentifier('require'), undefined, [ + ts.createLiteral(requiredPath), + ]), ts.createIdentifier('default')); + + const bodyStatements: ts.Statement[] = [ts.createReturn(requireGraphQLModule)]; + if (opts.isDevVariable != null || opts.isDevelopment) { + const nodeVariable = ts.createIdentifier('node'); + const nodeDotHash = ts.createPropertyAccess(nodeVariable, ts.createIdentifier('hash')); + let checkStatements: ts.Statement[] = [ + createVariableStatement(ts.NodeFlags.Const, nodeVariable, requireGraphQLModule), + ts.createIf( + ts.createLogicalAnd( + nodeDotHash, + ts.createStrictInequality(nodeDotHash, ts.createLiteral(hash)), + ), + ts.createBlock([ + ts.createStatement( + warnNeedsRebuild(definitionName, opts.buildCommand), + ), + ], /* multiLine */ true), + ), + ]; + if (opts.isDevVariable != null) { + checkStatements = [ + ts.createIf( + ts.createIdentifier(opts.isDevVariable), + ts.createBlock(checkStatements, /* multiLine */ true), + ), + ]; + } + bodyStatements.unshift(...checkStatements); + } + return ts.createFunctionExpression(undefined, undefined, undefined, undefined, [], undefined, ts.createBlock(bodyStatements, /* multiLine */ true)); +} + +function warnNeedsRebuild( + definitionName: string, + buildCommand?: string, +): ts.Expression { + return ts.createCall( + ts.createPropertyAccess(ts.createIdentifier('console'), ts.createIdentifier('error')), + undefined, + [ + ts.createLiteral( + `The definition of '${definitionName}' appears to have changed. Run ` + + '`' + + (buildCommand || 'relay-compiler') + + '` to update the generated files to receive the expected data.', + ), + ], + ); +} + +function getRelativeImportPath( + fileName: string, + artifactDirectory: string, + fileToRequire: string, +): string { + return path.join(artifactDirectory, fileToRequire); +} diff --git a/transform/src/createTransformError.ts b/transform/src/createTransformError.ts new file mode 100644 index 00000000..367ff0b8 --- /dev/null +++ b/transform/src/createTransformError.ts @@ -0,0 +1,48 @@ +import { RelayTransformError } from "./RelayTransformError"; +import { GraphQLError } from "graphql"; + +import * as util from "util"; + +/** + * In case of an error during transform, determine if it should be logged + * to the console and/or printed in the source. + */ +export function createTransformError(error: any): string { + if (error instanceof RelayTransformError) { + return `Relay Transform Error: ${error.message}`; + } + + const { sourceText, validationErrors } = error; + if (validationErrors && sourceText) { + const sourceLines = sourceText.split('\n'); + return validationErrors + .map(({ message, locations }: any) => { + return ( + 'GraphQL Validation Error: ' + + message + + '\n' + + locations + .map((location: any) => { + const preview = sourceLines[location.line - 1]; + return ( + preview && + [ + '>', + '> ' + preview, + '> ' + (' ' as any as { repeat(n: number): string }).repeat(location.column - 1) + '^^^', + ].join('\n') + ); + }) + .filter(Boolean) + .join('\n') + ); + }) + .join('\n'); + } + + return util.format( + 'Relay Transform Error: %s\n\n%s', + error.message, + error.stack, + ); +} diff --git a/transform/src/find.ts b/transform/src/find.ts new file mode 100644 index 00000000..8edffd28 --- /dev/null +++ b/transform/src/find.ts @@ -0,0 +1,12 @@ +export function find( + array: ReadonlyArray, + predicate: (element: T, index: number, array: ReadonlyArray) => boolean, + context?: any, +): T | undefined { + for (var ii = 0; ii < array.length; ii++) { + if (predicate.call(context, array[ii], ii, array)) { + return array[ii]; + } + } + return undefined; +} diff --git a/transform/src/getFragmentNameParts.ts b/transform/src/getFragmentNameParts.ts new file mode 100644 index 00000000..239eac89 --- /dev/null +++ b/transform/src/getFragmentNameParts.ts @@ -0,0 +1,37 @@ +const DEFAULT_PROP_NAME = 'data'; + +/** + * Matches a GraphQL fragment name pattern, extracting the data property key + * from the name. + */ +export function getFragmentNameParts(fragmentName: string): [string, string] { + const match = fragmentName.match( + /^([a-zA-Z][a-zA-Z0-9]*)(?:_([a-zA-Z][_a-zA-Z0-9]*))?$/, + ); + if (!match) { + throw new Error( + 'TSTransformRelay: Fragments should be named ' + + '`ModuleName_fragmentName`, got `' + + fragmentName + + '`.', + ); + } + const module = match[1]; + const propName = match[2]; + if (propName === DEFAULT_PROP_NAME) { + throw new Error( + 'TSTransformRelay: Fragment `' + + fragmentName + + '` should not end in ' + + '`_data` to avoid conflict with a fragment named `' + + module + + '` ' + + 'which also provides resulting data via the React prop `data`. Either ' + + 'rename this fragment to `' + + module + + '` or choose a different ' + + 'prop name.', + ); + } + return [module, propName || DEFAULT_PROP_NAME]; +} diff --git a/transform/src/getValidGraphQLTag.ts b/transform/src/getValidGraphQLTag.ts new file mode 100644 index 00000000..9f6343e2 --- /dev/null +++ b/transform/src/getValidGraphQLTag.ts @@ -0,0 +1,38 @@ +import * as ts from 'typescript'; +import { DocumentNode, parse } from 'graphql'; + +export function getValidGraphQLTag(node: ts.TaggedTemplateExpression): DocumentNode | null { + if (!isGraphQLTag(node)) { + return null; + } + + if (!ts.isNoSubstitutionTemplateLiteral(node.template)) { + throw new Error("TSTransformerRelay: Substitutions are not allowed in graphql fragments. " + + "Included fragments should be referenced as `...MyModule_propName`.", + ); + } + + const text = node.template.text; + + const ast = parse(text); + + if (ast.definitions.length === 0) { + throw new Error("TSTransformerRelay: Unexpected empty graphql tag."); + } + + return ast; +} + +function isGraphQLTag(node: ts.TaggedTemplateExpression): boolean { + const tag = node.tag; + + if (!ts.isIdentifier(tag)) { + return false; + } + + if (tag.text !== 'graphql') { + return false; + } + + return true; +} diff --git a/transform/src/getValidRelayQLTag.ts b/transform/src/getValidRelayQLTag.ts new file mode 100644 index 00000000..203c7dae --- /dev/null +++ b/transform/src/getValidRelayQLTag.ts @@ -0,0 +1,45 @@ +import * as ts from "typescript"; + +/** + * Given a TemplateLiteral path, return the metadata about a RelayQL tag + * if one exists. + */ +export function getValidRelayQLTag( + expr: ts.TaggedTemplateExpression, +): [ts.TaggedTemplateExpression, string, string | null] | null { + const tag = expr.tag; + + const tagText = tag.getText() + + const tagName = tagText === 'Relay.QL' + ? 'Relay.QL' + : tagText === 'RelayClassic_DEPRECATED.QL' + ? 'RelayClassic_DEPRECATED.QL' + : tagText === 'RelayClassic.QL' + ? 'RelayClassic.QL' + : tagText === 'RelayQL' ? 'RelayQL' : null; + if (!tagName) { + return null; + } + + const parent = expr.parent; + if (parent == null) { + return [expr, tagName, null]; + } + if (!ts.isArrowFunction(parent) && !ts.isFunctionExpression(parent)) { + return [expr, tagName, null]; + } + + const grandParent = parent.parent; + if (grandParent == null) { + return [expr, tagName, null]; + } + if (!ts.isPropertyAssignment(grandParent)) { + return [expr, tagName, null]; + } + const name = grandParent.name; + if (ts.isIdentifier(name) || ts.isStringLiteral(name)) { + return [expr, tagName, name.text]; + } + return [expr, tagName, null]; +} diff --git a/transform/src/index.ts b/transform/src/index.ts new file mode 100644 index 00000000..5ab0e3f6 --- /dev/null +++ b/transform/src/index.ts @@ -0,0 +1,93 @@ +import * as ts from "typescript"; +import { getValidGraphQLTag } from "./getValidGraphQLTag"; +import { NormalizedOptions, normalizeOptions, Options } from "./Options"; +import { compileGraphQLTag } from "./compileGraphQLTag"; +import { getValidRelayQLTag } from "./getValidRelayQLTag"; +import { compileRelayQLTag } from "./compileRelayQLTag"; +import { ScopeAnalyzer } from "./ScopeAnalyzer"; + +// https://github.com/Microsoft/TypeScript/blob/cc6d18e4db924d05e55c2a22587ad47ba53e7989/src/compiler/types.ts#L4490 +const enum TransformFlags { + ContainsES2015 = 1 << 7 +} + +interface ExtraNode { + transformFlags: TransformFlags; +} + +function insertVarDecl(varDecl: ts.Statement, insertInto: ts.NodeArray): ts.Statement[] { + const useStrictIdx = insertInto.findIndex( + stmt => ts.isExpressionStatement(stmt) && ts.isLiteralExpression(stmt.expression) && stmt.expression.text == "use strict" + ); + if (useStrictIdx >= 0) { + const newStmts = insertInto.slice(0); + newStmts.splice(useStrictIdx + 1, 0, varDecl); + return newStmts; + } + return [varDecl, ...insertInto]; +} + +function visitor(ctx: ts.TransformationContext, sf: ts.SourceFile, opts: NormalizedOptions): ts.Visitor { + const fileName = sf.fileName; + let i = 0; + const scopeAnalyzer = new ScopeAnalyzer(sf); + const varDecls: ts.VariableDeclaration[] = []; + function declareVar(id: ts.Identifier): void { + varDecls.push(ts.createVariableDeclaration(id, undefined, undefined)); + } + let scopeLevel = 0; + const visit = (node: ts.Node): ts.Node => { + // Easy bailout if there are not ES2015 features used + if (((node as any as ExtraNode).transformFlags & TransformFlags.ContainsES2015) !== TransformFlags.ContainsES2015) { + return node; + } + if (ts.isBlock(node)) { + scopeLevel++; + } + + if (ts.isTaggedTemplateExpression(node)) { + const ast = getValidGraphQLTag(node); + if (ast) { + const res = compileGraphQLTag(ctx, opts, node, ast, scopeAnalyzer, fileName); + if (scopeLevel > 0) { + const id = ts.createIdentifier("__graphql$" + i++); + declareVar(id); + return ts.createLogicalOr(id, ts.createAssignment(id, res)); + } + return res; + } + + const relayQLTag = getValidRelayQLTag(node); + if (relayQLTag != null) { + if (opts.relayQLTransformer == null) { + throw new Error( + "typescript-transform-relay: Missing schema option. " + + "Check your configuration for TypeScript and ensure you've set a path for your GraphQL schema." + ); + } + const result = compileRelayQLTag(ctx, opts, opts.relayQLTransformer, node, sf.fileName, relayQLTag[2], relayQLTag[1], true); + ts.setSourceMapRange(result, ts.getSourceMapRange(node)); + return result; + } + } + const res = ts.visitEachChild(node, visit, ctx); + + if (ts.isSourceFile(res) && varDecls.length > 0) { + const varDecl = ts.createVariableStatement(undefined, ts.createVariableDeclarationList(varDecls)); + return ts.updateSourceFileNode(res, insertVarDecl(varDecl, res.statements)); + } + if (ts.isBlock(node)) { + scopeLevel--; + } + return res; + }; + + return visit; +} + +export function transformer(opts?: Options) { + const options = normalizeOptions(opts || {}); + return (context: ts.TransformationContext): ts.Transformer => { + return (sf: ts.SourceFile): ts.SourceFile => ts.visitNode(sf, visitor(context, sf, options)); + } +} diff --git a/transform/test/ScopeAnalysis-test.ts b/transform/test/ScopeAnalysis-test.ts new file mode 100644 index 00000000..721dfc96 --- /dev/null +++ b/transform/test/ScopeAnalysis-test.ts @@ -0,0 +1,59 @@ +import { ScopeAnalyzer, BindingKind } from "../src/ScopeAnalyzer"; +import * as ts from "typescript"; + +function createSourceFile(text: string): ts.SourceFile { + return ts.createSourceFile("test.ts", text, ts.ScriptTarget.ES2015, true); +} +describe("Scope analysis", () => { + test("Basic scope analysis", () => { + const sf = createSourceFile("const x = 5"); + const analyzer = new ScopeAnalyzer(sf); + + expect(analyzer.getBindingAtNode(sf, "x")).toBe(BindingKind.Variable); + expect(analyzer.getBindingAtNode(sf.statements[0], "x")).toBe(BindingKind.Variable); + }); + + test("Can understand multiple variables per statement", () => { + const sf = createSourceFile("const x = 5, y = 10"); + const analyzer = new ScopeAnalyzer(sf); + + expect(analyzer.getBindingAtNode(sf, "x")).toBe(BindingKind.Variable); + expect(analyzer.getBindingAtNode(sf, "y")).toBe(BindingKind.Variable); + }); + + test("Understands lexical scoping", () => { + const sf = createSourceFile("{const x = 5;}"); + const analyzer = new ScopeAnalyzer(sf); + + expect(analyzer.getBindingAtNode(sf, "x")).toBe(null); + expect(analyzer.getBindingAtNode(sf.statements[0], "x")).toBe(BindingKind.Variable); + }); + + test("Understands function scoping", () => { + const sf = createSourceFile("{var x = 5;}"); + const analyzer = new ScopeAnalyzer(sf); + + expect(analyzer.getBindingAtNode(sf, "x")).toBe(BindingKind.Variable); + expect(analyzer.getBindingAtNode(sf.statements[0], "x")).toBe(BindingKind.Variable); + }); + + test("Understands function scoping, wrt functions", () => { + const sf = createSourceFile("function test() {var x = 5;}"); + const analyzer = new ScopeAnalyzer(sf); + + expect(analyzer.getBindingAtNode(sf, "x")).toBe(null); + expect(analyzer.getBindingAtNode(sf, "test")).toBe(BindingKind.Variable); + expect(analyzer.getBindingAtNode(sf.statements[0], "x")).toBe(BindingKind.Variable); + expect(analyzer.getBindingAtNode(sf.statements[0], "test")).toBe(BindingKind.Variable); + }); + + test("Understands lexical scoping, wrt functions", () => { + const sf = createSourceFile("function test() {const x = 5;}"); + const analyzer = new ScopeAnalyzer(sf); + + expect(analyzer.getBindingAtNode(sf, "x")).toBe(null); + expect(analyzer.getBindingAtNode(sf, "test")).toBe(BindingKind.Variable); + expect(analyzer.getBindingAtNode((sf.statements[0] as ts.FunctionDeclaration).body, "x")).toBe(BindingKind.Variable); + expect(analyzer.getBindingAtNode(sf.statements[0], "test")).toBe(BindingKind.Variable); + }); +}); diff --git a/transform/test/TSTransform-test.ts b/transform/test/TSTransform-test.ts new file mode 100644 index 00000000..af812fce --- /dev/null +++ b/transform/test/TSTransform-test.ts @@ -0,0 +1,91 @@ +import { transformer } from '../src'; +import * as ts from 'typescript'; +import * as path from 'path'; +import { Options } from '../src/Options'; +import { generateTestsFromFixtures } from 'relay-test-utils/lib/RelayModernTestUtils' + +function transformWithOptions(options: Options, fileName: string) { + return (text, providedFileName?: string) => + ts.transpileModule(text, { + compilerOptions: { + target: ts.ScriptTarget.ES2017, + jsx: ts.JsxEmit.Preserve, + sourceMap: false, + }, + fileName: fileName, + transformers: { + before: [transformer(options)], + }, + }).outputText; +} + +const schemaPath = path.resolve(__dirname, 'testschema.graphql'); +const oldSchemaPath = path.resolve(__dirname, 'testschema.old.graphql'); + +describe('TSTransform', () => { + generateTestsFromFixtures(`${__dirname}/fixtures-modern`, transformWithOptions({}, '/test/MyComponent.tsx')); + + generateTestsFromFixtures( + `${__dirname}/fixtures-compat`, + transformWithOptions({ + compat: true, + schema: schemaPath, + substituteVariables: true, + }, '/test/MyComponent.tsx'), + ); + + generateTestsFromFixtures( + `${__dirname}/fixtures-compat`, + transformWithOptions({ + compat: true, + schema: schemaPath, + substituteVariables: true, + }, '/test/MyComponent.tsx'), + ); + + generateTestsFromFixtures( + `${__dirname}/fixtures-classic`, + transformWithOptions({ + schema: oldSchemaPath, + substituteVariables: true, + }, '/test/MyComponent.tsx'), + ); + + describe('`development` option', () => { + it('tests the hash when `development` is set', () => { + expect( + transformWithOptions({ isDevelopment: true }, '/test/TestFrag.ts')( + 'graphql`fragment TestFrag on Node { id }`', + ), + ).toMatchSnapshot(); + }); + + it('tests the hash when `isDevVariable` is set', () => { + expect( + transformWithOptions({ isDevVariable: 'IS_DEV' }, '/test/TestFrag.ts')( + 'graphql`fragment TestFrag on Node { id }`', + ), + ).toMatchSnapshot(); + }); + + it('uses a custom build command in message', () => { + expect( + transformWithOptions( + { + buildCommand: 'relay-build', + isDevelopment: true, + }, + '/test/TestFrag.ts', + )('graphql`fragment TestFrag on Node { id }`'), + ).toMatchSnapshot(); + }); + + it('does not test the hash when `development` is not set', () => { + expect( + transformWithOptions({}, '/test/TestFrag.ts')( + 'graphql`fragment TestFrag on Node { id }`', + ), + ).toMatchSnapshot(); + }); + }); +}); diff --git a/transform/test/__snapshots__/TSTransform-test.ts.snap b/transform/test/__snapshots__/TSTransform-test.ts.snap new file mode 100644 index 00000000..896745e9 --- /dev/null +++ b/transform/test/__snapshots__/TSTransform-test.ts.snap @@ -0,0 +1,13118 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TSTransform \`development\` option does not test the hash when \`development\` is not set 1`] = ` +"({ + data: function () { + return require(\\"./__generated__/TestFrag.graphql.ts\\").default; + } +}); +" +`; + +exports[`TSTransform \`development\` option tests the hash when \`development\` is set 1`] = ` +"({ + data: function () { + const node = require(\\"./__generated__/TestFrag.graphql.ts\\").default; + if (node.hash && node.hash !== \\"0bb6b7b29bc3e910921551c4ff5b6757\\") { + console.error(\\"The definition of 'TestFrag' appears to have changed. Run \`relay-compiler\` to update the generated files to receive the expected data.\\"); + } + return require(\\"./__generated__/TestFrag.graphql.ts\\").default; + } +}); +" +`; + +exports[`TSTransform \`development\` option tests the hash when \`isDevVariable\` is set 1`] = ` +"({ + data: function () { + if (IS_DEV) { + const node = require(\\"./__generated__/TestFrag.graphql.ts\\").default; + if (node.hash && node.hash !== \\"0bb6b7b29bc3e910921551c4ff5b6757\\") { + console.error(\\"The definition of 'TestFrag' appears to have changed. Run \`relay-compiler\` to update the generated files to receive the expected data.\\"); + } + } + return require(\\"./__generated__/TestFrag.graphql.ts\\").default; + } +}); +" +`; + +exports[`TSTransform \`development\` option uses a custom build command in message 1`] = ` +"({ + data: function () { + const node = require(\\"./__generated__/TestFrag.graphql.ts\\").default; + if (node.hash && node.hash !== \\"0bb6b7b29bc3e910921551c4ff5b6757\\") { + console.error(\\"The definition of 'TestFrag' appears to have changed. Run \`relay-build\` to update the generated files to receive the expected data.\\"); + } + return require(\\"./__generated__/TestFrag.graphql.ts\\").default; + } +}); +" +`; + +exports[`TSTransform matches expected output: argsInvalidValues.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var foo = Relay.QL\` + query Args { + node(id: 123) { + ... on User { + friends( + first: "10" + orderby: Name + find: cursor1 + isViewerFriend: "true" + gender: "MALE" + ) { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +GraphQL Validation Error: Expected type Int, found "10". +> +> first: "10" +> ^^^ +GraphQL Validation Error: Expected type [String], found Name. +> +> orderby: Name +> ^^^ +GraphQL Validation Error: Expected type String, found cursor1. +> +> find: cursor1 +> ^^^ +GraphQL Validation Error: Expected type Boolean, found "true". +> +> isViewerFriend: "true" +> ^^^ +GraphQL Validation Error: Expected type Gender, found "MALE"; Did you mean the enum value MALE or FEMALE? +> +> gender: "MALE" +> ^^^ +`; + +exports[`TSTransform matches expected output: argsSubstitution.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var foo = Relay.QL\` + query Args { + node(id: \${userID}) { + id + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var foo = function (RQL_0) { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: Relay.QL.__var(RQL_0) + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "Args", + type: "Node" + }; +}(userID); + +`; + +exports[`TSTransform matches expected output: argsValues.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var foo = Relay.QL\` + query Args { + node(id: 123) { + ... on User { + friends( + first: 10 + orderby: "Name" + find: "cursor1" + isViewerFriend: true + gender: MALE + ) { + edges { + node { + id + firstName(if: true, unless: false) + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var foo = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 10 + } + }, + { + kind: "Call", + metadata: {}, + name: "orderby", + value: { + kind: "CallValue", + callValue: "Name" + } + }, + { + kind: "Call", + metadata: {}, + name: "find", + value: { + kind: "CallValue", + callValue: "cursor1" + } + }, + { + kind: "Call", + metadata: {}, + name: "isViewerFriend", + value: { + kind: "CallValue", + callValue: true + } + }, + { + kind: "Call", + metadata: { + type: "Gender" + }, + name: "gender", + value: { + kind: "CallValue", + callValue: "MALE" + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + calls: [ + { + kind: "Call", + metadata: {}, + name: "if", + value: { + kind: "CallValue", + callValue: true + } + }, + { + kind: "Call", + metadata: {}, + name: "unless", + value: { + kind: "CallValue", + callValue: false + } + } + ], + fieldName: "firstName", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "Args", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: argsVariablesList.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var foo = Relay.QL\` + query Args { + nodes(ids: [$one, $two, 3]) { + id + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var foo = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "[ID!]" + }, + name: "ids", + value: [ + { + kind: "CallVariable", + callVariableName: "one" + }, + { + kind: "CallVariable", + callVariableName: "two" + }, + { + kind: "CallValue", + callValue: 3 + } + ] + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "nodes", + kind: "Query", + metadata: { + isPlural: true, + isAbstract: true, + identifyingArgName: "ids", + identifyingArgType: "[ID!]" + }, + name: "Args", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: arguments.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: graphql\` + fragment CompatProfile_passing on User { + ...ProfilePic_user @arguments(size: 40, scale: 1.5, title: "Photo") + ...ProfilePic_user @arguments(size: $pictureSize) + } + \`, + receiving: graphql\` + fragment CompatProfile_receiving on User @argumentDefinitions( + first: {type: "Int", defaultValue: 5} + named: {type: "String", defaultValue: "john"} + scale: {type: "Float", defaultValue: 1.5} + noDefault: {type: "Int"} + ) { + friends(first: $first, named: $named, scale: $scale) { + count + } + } + \`, + receivingGlobals: graphql\` + fragment CompatProfile_receivingGlobals on User { + friends(first: $friendsCount) { + count + } + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfilePic = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: function () { + return require("./__generated__/CompatProfile_passing.graphql.ts").default; + }, + receiving: function () { + return require("./__generated__/CompatProfile_receiving.graphql.ts").default; + }, + receivingGlobals: function () { + return require("./__generated__/CompatProfile_receivingGlobals.graphql.ts").default; + }, +}); + +`; + +exports[`TSTransform matches expected output: arguments.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: graphql\` + fragment CompatProfile_passing on User { + ...ProfilePic_user @arguments(size: 40, scale: 1.5, title: "Photo") + ...ProfilePic_user @arguments(size: $pictureSize) + } + \`, + receiving: graphql\` + fragment CompatProfile_receiving on User @argumentDefinitions( + first: {type: "Int", defaultValue: 5} + named: {type: "String", defaultValue: "john"} + scale: {type: "Float", defaultValue: 1.5} + noDefault: {type: "Int"} + ) { + friends(first: $first, named: $named, scale: $scale) { + count + } + } + \`, + passingWithDefault: graphql\` + fragment CompatProfile_passingWithDefault on User @argumentDefinitions( + withDefault: {type: "Int", defaultValue: 100} + noDefault: {type: "Int"} + ) { + ...ProfilePic_user @arguments(size: $withDefault, scale: $noDefault) + } + \`, + receivingGlobals: graphql\` + fragment CompatProfile_receivingGlobals on User { + friends(first: $friendsCount) { + count + } + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfilePic = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: { + modern: function () { + return require("./__generated__/CompatProfile_passing.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const ProfilePic_user_args1 = ProfilePic.getFragment("user", { + size: 40, + scale: 1.5, + title: "Photo" + }), ProfilePic_user_args2 = ProfilePic.getFragment("user", { + size: { + kind: "CallVariable", + callVariableName: "pictureSize" + } + }); + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + kind: "RootArgument", + name: "pictureSize" + } + ], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(ProfilePic_user_args1), + RelayQL_GENERATED.__frag(ProfilePic_user_args2) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_passing", + type: "User" + }; + }() + }; + } + }, + receiving: { + modern: function () { + return require("./__generated__/CompatProfile_receiving.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: 5, + kind: "LocalArgument", + name: "first" + }, + { + defaultValue: "john", + kind: "LocalArgument", + name: "named" + }, + { + defaultValue: 1.5, + kind: "LocalArgument", + name: "scale" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallVariable", + callVariableName: "first" + } + }, + { + kind: "Call", + metadata: {}, + name: "named", + value: { + kind: "CallVariable", + callVariableName: "named" + } + }, + { + kind: "Call", + metadata: { + type: "Float" + }, + name: "scale", + value: { + kind: "CallVariable", + callVariableName: "scale" + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "FriendsConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_receiving", + type: "User" + }; + }() + }; + } + }, + passingWithDefault: { + modern: function () { + return require("./__generated__/CompatProfile_passingWithDefault.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const ProfilePic_user_args1 = ProfilePic.getFragment("user", { + size: { + kind: "CallVariable", + callVariableName: "withDefault" + }, + scale: { + kind: "CallVariable", + callVariableName: "noDefault" + } + }); + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: 100, + kind: "LocalArgument", + name: "withDefault" + }, + { + defaultValue: null, + kind: "LocalArgument", + name: "noDefault" + } + ], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(ProfilePic_user_args1) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_passingWithDefault", + type: "User" + }; + }() + }; + } + }, + receivingGlobals: { + modern: function () { + return require("./__generated__/CompatProfile_receivingGlobals.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + kind: "RootArgument", + name: "friendsCount" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallVariable", + callVariableName: "friendsCount" + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "FriendsConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_receivingGlobals", + type: "User" + }; + }() + }; + } + }, +}); + +`; + +exports[`TSTransform matches expected output: arguments.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: graphql\` + fragment CompatProfile_passing on User { + ...ProfilePic_user @arguments(size: 40, scale: 1.5, title: "Photo") + ...ProfilePic_user @arguments(size: $pictureSize) + } + \`, + receiving: graphql\` + fragment CompatProfile_receiving on User @argumentDefinitions( + first: {type: "Int", defaultValue: 5} + named: {type: "String", defaultValue: "john"} + scale: {type: "Float", defaultValue: 1.5} + noDefault: {type: "Int"} + ) { + friends(first: $first, named: $named, scale: $scale) { + count + } + } + \`, + passingWithDefault: graphql\` + fragment CompatProfile_passingWithDefault on User @argumentDefinitions( + withDefault: {type: "Int", defaultValue: 100} + noDefault: {type: "Int"} + ) { + ...ProfilePic_user @arguments(size: $withDefault, scale: $noDefault) + } + \`, + receivingGlobals: graphql\` + fragment CompatProfile_receivingGlobals on User { + friends(first: $friendsCount) { + count + } + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfilePic = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: { + modern: function () { + return require("./__generated__/CompatProfile_passing.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const ProfilePic_user_args1 = ProfilePic.getFragment("user", { + size: 40, + scale: 1.5, + title: "Photo" + }), ProfilePic_user_args2 = ProfilePic.getFragment("user", { + size: { + kind: "CallVariable", + callVariableName: "pictureSize" + } + }); + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + kind: "RootArgument", + name: "pictureSize" + } + ], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(ProfilePic_user_args1), + RelayQL_GENERATED.__frag(ProfilePic_user_args2) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_passing", + type: "User" + }; + }() + }; + } + }, + receiving: { + modern: function () { + return require("./__generated__/CompatProfile_receiving.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: 5, + kind: "LocalArgument", + name: "first" + }, + { + defaultValue: "john", + kind: "LocalArgument", + name: "named" + }, + { + defaultValue: 1.5, + kind: "LocalArgument", + name: "scale" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallVariable", + callVariableName: "first" + } + }, + { + kind: "Call", + metadata: {}, + name: "named", + value: { + kind: "CallVariable", + callVariableName: "named" + } + }, + { + kind: "Call", + metadata: { + type: "Float" + }, + name: "scale", + value: { + kind: "CallVariable", + callVariableName: "scale" + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "FriendsConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_receiving", + type: "User" + }; + }() + }; + } + }, + passingWithDefault: { + modern: function () { + return require("./__generated__/CompatProfile_passingWithDefault.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const ProfilePic_user_args1 = ProfilePic.getFragment("user", { + size: { + kind: "CallVariable", + callVariableName: "withDefault" + }, + scale: { + kind: "CallVariable", + callVariableName: "noDefault" + } + }); + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: 100, + kind: "LocalArgument", + name: "withDefault" + }, + { + defaultValue: null, + kind: "LocalArgument", + name: "noDefault" + } + ], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(ProfilePic_user_args1) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_passingWithDefault", + type: "User" + }; + }() + }; + } + }, + receivingGlobals: { + modern: function () { + return require("./__generated__/CompatProfile_receivingGlobals.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + kind: "RootArgument", + name: "friendsCount" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallVariable", + callVariableName: "friendsCount" + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "FriendsConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_receivingGlobals", + type: "User" + }; + }() + }; + } + }, +}); + +`; + +exports[`TSTransform matches expected output: arguments-listvalue.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayClassic = require('RelayClassic'); + +const {graphql} = RelayClassic; + +const CompatProfile = () => null; + +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: graphql\` + fragment CompatProfile_viewer on Viewer @argumentDefinitions( + browserContext: {type: "MarketplaceBrowseContext", defaultValue: BROWSE_FEED} + priceRange: {type: "[Float]", defaultValue: [0, 50]} + ) { + marketplace_explore( + marketplace_browse_context: $browserContext, + with_price_between: $priceRange, + ) { + count + } + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ +'use strict'; +const RelayClassic = require('RelayClassic'); +const { graphql } = RelayClassic; +const CompatProfile = () => null; +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + } +}); + +`; + +exports[`TSTransform matches expected output: arguments-listvalue.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayClassic = require('RelayClassic'); + +const {graphql} = RelayClassic; + +const CompatProfile = () => null; + +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: graphql\` + fragment CompatProfile_viewer on Viewer @argumentDefinitions( + browserContext: {type: "MarketplaceBrowseContext", defaultValue: BROWSE_FEED} + priceRange: {type: "[Float]", defaultValue: [0, 50]} + ) { + marketplace_explore( + marketplace_browse_context: $browserContext, + with_price_between: $priceRange, + ) { + count + } + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ +'use strict'; +const RelayClassic = require('RelayClassic'); +const { graphql } = RelayClassic; +const CompatProfile = () => null; +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: "BROWSE_FEED", + kind: "LocalArgument", + name: "browserContext" + }, + { + defaultValue: [ + 0, + 50 + ], + kind: "LocalArgument", + name: "priceRange" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "MarketplaceBrowseContext" + }, + name: "marketplace_browse_context", + value: { + kind: "CallVariable", + callVariableName: "browserContext" + } + }, + { + kind: "Call", + metadata: { + type: "[Float]" + }, + name: "with_price_between", + value: { + kind: "CallVariable", + callVariableName: "priceRange" + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "marketplace_explore", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "MarketplaceExploreConnection" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "Viewer" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: arguments-listvalue.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayClassic = require('RelayClassic'); + +const {graphql} = RelayClassic; + +const CompatProfile = () => null; + +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: graphql\` + fragment CompatProfile_viewer on Viewer @argumentDefinitions( + browserContext: {type: "MarketplaceBrowseContext", defaultValue: BROWSE_FEED} + priceRange: {type: "[Float]", defaultValue: [0, 50]} + ) { + marketplace_explore( + marketplace_browse_context: $browserContext, + with_price_between: $priceRange, + ) { + count + } + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ +'use strict'; +const RelayClassic = require('RelayClassic'); +const { graphql } = RelayClassic; +const CompatProfile = () => null; +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: "BROWSE_FEED", + kind: "LocalArgument", + name: "browserContext" + }, + { + defaultValue: [ + 0, + 50 + ], + kind: "LocalArgument", + name: "priceRange" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "MarketplaceBrowseContext" + }, + name: "marketplace_browse_context", + value: { + kind: "CallVariable", + callVariableName: "browserContext" + } + }, + { + kind: "Call", + metadata: { + type: "[Float]" + }, + name: "with_price_between", + value: { + kind: "CallVariable", + callVariableName: "priceRange" + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "marketplace_explore", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "MarketplaceExploreConnection" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "Viewer" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: connectionPattern.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + fragment on User @relay(pattern: true) { + friends { + edges { + node { + id + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + pattern: true + }, + name: "MyComponentRelayQL", + type: "User" + }; +}(); + +`; + +exports[`TSTransform matches expected output: connectionWithAfterLastArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(last: 3, after: "foo") { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Connection arguments \`friends(after: , last: )\` are not supported unless both are variables. Use \`(last: )\`, \`(before: , last: )\`, \`(after: , first: )\`, or \`(after: $, last: $)\`. +`; + +exports[`TSTransform matches expected output: connectionWithAfterLastArgsWithInlineFragment.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(last: 3, after: "foo") { + ... on UserConnection { + edges { + node { + id + } + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Connection arguments \`friends(after: , last: )\` are not supported unless both are variables. Use \`(last: )\`, \`(before: , last: )\`, \`(after: , first: )\`, or \`(after: $, last: $)\`. +`; + +exports[`TSTransform matches expected output: connectionWithAfterLastOneVariableArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(last: $last, after: "foo") { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Connection arguments \`friends(after: , last: )\` are not supported unless both are variables. Use \`(last: )\`, \`(before: , last: )\`, \`(after: , first: )\`, or \`(after: $, last: $)\`. +`; + +exports[`TSTransform matches expected output: connectionWithAfterLastVariableArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(after: $after, last: $last) { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: {}, + name: "after", + value: { + kind: "CallVariable", + callVariableName: "after" + } + }, + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "last", + value: { + kind: "CallVariable", + callVariableName: "last" + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: connectionWithBeforeFirstArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3, before: "foo") { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Connection arguments \`friends(before: , first: )\` are not supported unless both are variables. Use \`(first: )\`, \`(after: , first: )\`, \`(before: , last: )\`, or \`(before: $, first: $)\`. +`; + +exports[`TSTransform matches expected output: connectionWithFirstLastArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3, last: 3) { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Connection arguments \`friends(first: , last: )\` are not supported unless both are variables. Use \`(first: )\`, \`(last: )\`, or \`(first: $, last: $)\`. +`; + +exports[`TSTransform matches expected output: connectionWithFirstLastVariableArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: $first, last: $last) { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallVariable", + callVariableName: "first" + } + }, + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "last", + value: { + kind: "CallVariable", + callVariableName: "last" + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: connectionWithNodesField.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + nodes { + id + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: You supplied a field named \`nodes\` on a connection named \`friends\`, but pagination is not supported on connections without using \`edges\`. Use \`friends{edges{node{...}}}\` instead. +`; + +exports[`TSTransform matches expected output: connectionWithPageInfoAlias.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + node { + name + } + } + myPageInfo: pageInfo { + hasPreviousPage + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 3 + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + alias: "myPageInfo", + children: [ + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: connectionWithPageInfoSubfields.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + node { + name + } + } + pageInfo + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 3 + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: connectionWithSelectVariables.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends1: friends(first: $limit) { + edges { + ... on UserConnectionEdge @relay(variables: []) { + node { + name + } + } + } + } + friends2: friends(first: $limit) { + edges { + ... on UserConnectionEdge @relay(variables: ["size"]) { + node { + name + profilePicture(size: $size) + } + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + alias: "friends1", + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallVariable", + callVariableName: "limit" + } + } + ], + children: [ + { + children: [ + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isGenerated: true, + isRequisite: true + }, + type: "User" + }, + Relay.QL.__createFragment({ + children: [ + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id" + }, + type: "User" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isTrackingEnabled: true + }, + name: "UserConnectionEdge", + type: "UserConnectionEdge" + }, {}) + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + alias: "friends2", + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallVariable", + callVariableName: "limit" + } + } + ], + children: [ + { + children: [ + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isGenerated: true, + isRequisite: true + }, + type: "User" + }, + Relay.QL.__createFragment({ + children: [ + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "size", + value: { + kind: "CallVariable", + callVariableName: "size" + } + } + ], + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id" + }, + type: "User" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isTrackingEnabled: true + }, + name: "UserConnectionEdge", + type: "UserConnectionEdge" + }, { + size: { + kind: "CallVariable", + callVariableName: "size" + } + }) + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: connectionWithoutArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: You supplied the \`edges\` field on a connection named \`friends\`, but you did not supply an argument necessary for Relay to handle the connection. Please specify a limit argument like \`first\`, or \`last\` or fetch a specific item with a \`find\` argument. +`; + +exports[`TSTransform matches expected output: connectionWithoutArgsWithInlineFragment.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends { + ... on UserConnection { + edges { + node { + id + } + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: You supplied the \`edges\` field on a connection named \`friends\`, but you did not supply an argument necessary for Relay to handle the connection. Please specify a limit argument like \`first\`, or \`last\` or fetch a specific item with a \`find\` argument. +`; + +exports[`TSTransform matches expected output: connectionWithoutNodeField.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + cursor + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 3 + } + } + ], + children: [ + { + children: [ + { + fieldName: "cursor", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isGenerated: true, + isRequisite: true + }, + type: "User" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: connectionWithoutNodeID.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3) @relay(isConnectionWithoutNodeID: true) { + edges { + cursor + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 3 + } + } + ], + children: [ + { + children: [ + { + fieldName: "cursor", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isGenerated: true, + isRequisite: true + }, + type: "User" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + isConnectionWithoutNodeID: true, + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: container.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +Relay.createContainer(Component, { + queries: { + viewer: () => Relay.QL\`fragment on Viewer { actor { id } }\` + } +}); +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +Relay.createContainer(Component, { + queries: { + viewer: () => function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id" + }, + type: "User" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "MyComponent_ViewerRelayQL", + type: "Viewer" + }; + }() + } +}); + +`; + +exports[`TSTransform matches expected output: duplicate-variables.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: graphql\` + fragment CompatProfile_user on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + \`, + user2: graphql\` + fragment CompatProfile_user2 on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfilePic = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + user2: function () { + return require("./__generated__/CompatProfile_user2.graphql.ts").default; + } +}); + +`; + +exports[`TSTransform matches expected output: duplicate-variables.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: graphql\` + fragment CompatProfile_user on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + \`, + user2: graphql\` + fragment CompatProfile_user2 on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfilePic = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: null, + kind: "LocalArgument", + name: "scale" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Float" + }, + name: "scale", + value: { + kind: "CallVariable", + callVariableName: "scale" + } + } + ], + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profile_picture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Image" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, + user2: { + modern: function () { + return require("./__generated__/CompatProfile_user2.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: null, + kind: "LocalArgument", + name: "scale" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Float" + }, + name: "scale", + value: { + kind: "CallVariable", + callVariableName: "scale" + } + } + ], + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profile_picture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Image" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user2", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: duplicate-variables.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: graphql\` + fragment CompatProfile_user on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + \`, + user2: graphql\` + fragment CompatProfile_user2 on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfilePic = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: null, + kind: "LocalArgument", + name: "scale" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Float" + }, + name: "scale", + value: { + kind: "CallVariable", + callVariableName: "scale" + } + } + ], + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profile_picture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Image" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, + user2: { + modern: function () { + return require("./__generated__/CompatProfile_user2.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [ + { + defaultValue: null, + kind: "LocalArgument", + name: "scale" + } + ], + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Float" + }, + name: "scale", + value: { + kind: "CallVariable", + callVariableName: "scale" + } + } + ], + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profile_picture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Image" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user2", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: error_confusing-fragment-name.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_data on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Fragment \`CompatProfile_data\` should not end in \`_data\` to avoid conflict with a fragment named \`CompatProfile\` which also provides resulting data via the React prop \`data\`. Either rename this fragment to \`CompatProfile\` or choose a different prop name. +`; + +exports[`TSTransform matches expected output: error_confusing-fragment-name.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_data on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Fragment \`CompatProfile_data\` should not end in \`_data\` to avoid conflict with a fragment named \`CompatProfile\` which also provides resulting data via the React prop \`data\`. Either rename this fragment to \`CompatProfile\` or choose a different prop name. +`; + +exports[`TSTransform matches expected output: error_confusing-fragment-name.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_data on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Fragment \`CompatProfile_data\` should not end in \`_data\` to avoid conflict with a fragment named \`CompatProfile\` which also provides resulting data via the React prop \`data\`. Either rename this fragment to \`CompatProfile\` or choose a different prop name. +`; + +exports[`TSTransform matches expected output: error_too-many-fragments.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected exactly one fragment in the graphql tag referenced by the property user. +`; + +exports[`TSTransform matches expected output: error_too-many-fragments.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected exactly one fragment in the graphql tag referenced by the property user. +`; + +exports[`TSTransform matches expected output: error_too-many-fragments.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected exactly one fragment in the graphql tag referenced by the property user. +`; + +exports[`TSTransform matches expected output: error_unexpected-fragment.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } + + fragment Whoopsie_key on User { + name + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected exactly one operation (query, mutation, or subscription) per graphql tag. +`; + +exports[`TSTransform matches expected output: error_unexpected-fragment.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } + + fragment Whoopsie_key on User { + name + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected exactly one operation (query, mutation, or subscription) per graphql tag. +`; + +exports[`TSTransform matches expected output: error_unexpected-fragment.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } + + fragment Whoopsie_key on User { + name + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected exactly one operation (query, mutation, or subscription) per graphql tag. +`; + +exports[`TSTransform matches expected output: error_unexpected-operation.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } + + query Whoopsie { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected only fragments within this graphql tag. +`; + +exports[`TSTransform matches expected output: error_unexpected-operation.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } + + query Whoopsie { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected only fragments within this graphql tag. +`; + +exports[`TSTransform matches expected output: error_unexpected-operation.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } + + query Whoopsie { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: TSTransformRelay: Expected only fragments within this graphql tag. +`; + +exports[`TSTransform matches expected output: export-refetch-container.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ + +const React = require('React'); +const {createRefetchContainer, graphql} = require('RelayClassic'); + +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} + +module.exports = createRefetchContainer( + RefetchExample, + graphql\` + fragment RefetchExample_user on User { + name + } + \`, + graphql\` + query RefetchExampleRefetchQuery { + viewer { + actor { + ...RefetchExample_user + } + } + } + \`, +); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ +const React = require('React'); +const { createRefetchContainer, graphql } = require('RelayClassic'); +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} +module.exports = createRefetchContainer(RefetchExample, { + user: function () { + return require("./__generated__/RefetchExample_user.graphql.ts").default; + } +}, function () { + return require("./__generated__/RefetchExampleRefetchQuery.graphql.ts").default; +}); + +`; + +exports[`TSTransform matches expected output: export-refetch-container.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ + +const React = require('React'); +const {createRefetchContainer, graphql} = require('RelayClassic'); + +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} + +module.exports = createRefetchContainer( + RefetchExample, + graphql\` + fragment RefetchExample_user on User { + name + } + \`, + graphql\` + query RefetchExampleRefetchQuery { + viewer { + actor { + ...RefetchExample_user + } + } + } + \`, +); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ +const React = require('React'); +const { createRefetchContainer, graphql } = require('RelayClassic'); +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} +module.exports = createRefetchContainer(RefetchExample, { + user: { + modern: function () { + return require("./__generated__/RefetchExample_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "RefetchExample_user", + type: "User" + }; + }() + }; + } + } +}, { + modern: function () { + return require("./__generated__/RefetchExampleRefetchQuery.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const RefetchExample_user = (RefetchExample.__container__ || RefetchExample).getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [], + name: "RefetchExampleRefetchQuery", + operation: "query", + node: function () { + return { + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(RefetchExample_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "RefetchExampleRefetchQuery", + type: "Query" + }; + }() + }; + } +}); + +`; + +exports[`TSTransform matches expected output: export-refetch-container.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ + +const React = require('React'); +const {createRefetchContainer, graphql} = require('RelayClassic'); + +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} + +module.exports = createRefetchContainer( + RefetchExample, + graphql\` + fragment RefetchExample_user on User { + name + } + \`, + graphql\` + query RefetchExampleRefetchQuery { + viewer { + actor { + ...RefetchExample_user + } + } + } + \`, +); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ +const React = require('React'); +const { createRefetchContainer, graphql } = require('RelayClassic'); +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} +module.exports = createRefetchContainer(RefetchExample, { + user: { + modern: function () { + return require("./__generated__/RefetchExample_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "RefetchExample_user", + type: "User" + }; + }() + }; + } + } +}, { + modern: function () { + return require("./__generated__/RefetchExampleRefetchQuery.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const RefetchExample_user = (RefetchExample.__container__ || RefetchExample).getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [], + name: "RefetchExampleRefetchQuery", + operation: "query", + node: function () { + return { + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(RefetchExample_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "RefetchExampleRefetchQuery", + type: "Query" + }; + }() + }; + } +}); + +`; + +exports[`TSTransform matches expected output: fieldForEnum.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + gender + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "gender", + kind: "Field", + metadata: {}, + type: "Gender" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithAlias.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + realName: name + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + alias: "realName", + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithAliasAndArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + mugShot: profilePicture(size: 100) { + uri + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + alias: "mugShot", + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "size", + value: { + kind: "CallValue", + callValue: 100 + } + } + ], + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + profilePicture(size: 100) { + uri + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "size", + value: { + kind: "CallValue", + callValue: 100 + } + } + ], + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithCustomScalarArg.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + customScalar(arg: {give: "relay"}) { + title + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "JSON" + }, + name: "arg", + value: { + kind: "CallValue", + callValue: { + give: "relay" + } + } + } + ], + children: [ + { + fieldName: "title", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "customScalar", + kind: "Query", + metadata: { + isPlural: true, + identifyingArgName: "arg", + identifyingArgType: "JSON" + }, + name: "MyComponent", + type: "SearchResult" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithEmptyArrayArg.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + fragment on User { + friends(isViewerFriend: false) { + count + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: {}, + name: "isViewerFriend", + value: { + kind: "CallValue", + callValue: false + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "MyComponentRelayQL", + type: "User" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithEnumArg.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 5, gender: MALE) { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 5 + } + }, + { + kind: "Call", + metadata: { + type: "Gender" + }, + name: "gender", + value: { + kind: "CallValue", + callValue: "MALE" + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithEnumQueryArg.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query($gender_0: Gender) { + node(id: 123) { + ... on User { + friends(first: 5, gender: $gender_0) { + edges { + node { + id + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 5 + } + }, + { + kind: "Call", + metadata: { + type: "Gender" + }, + name: "gender", + value: { + kind: "CallVariable", + callVariableName: "gender_0" + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithFakeConnection.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var foo = RelayClassic.QL\` + fragment on User { + fakeConnection { + edges { + node { + id + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var foo = function () { + return { + children: [ + { + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "FakeNode" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "FakeEdge" + } + ], + fieldName: "fakeConnection", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "FakeConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: RelayClassic.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "MyComponentRelayQL", + type: "User" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fieldWithParams.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + profilePicture(size: $size) { + uri + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "size", + value: { + kind: "CallVariable", + callVariableName: "size" + } + } + ], + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fragment.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\`fragment on Node { id }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "MyComponentRelayQL", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fragment-spread.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + ...CompatProfilePic_user + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, +}); + +`; + +exports[`TSTransform matches expected output: fragment-spread.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + ...CompatProfilePic_user + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, +}); + +`; + +exports[`TSTransform matches expected output: fragment-spread.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + ...CompatProfilePic_user + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, +}); + +`; + +exports[`TSTransform matches expected output: fragmentDirectives.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\`fragment on Node @relay(plural: true) { id }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + plural: true, + isAbstract: true + }, + name: "MyComponentRelayQL", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fragmentOnBadType.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\`fragment on NotAType { id }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +GraphQL Validation Error: Unknown type "NotAType". Did you mean "__Type"? +> +> fragment MyComponentRelayQL on NotAType { id } +> ^^^ +`; + +exports[`TSTransform matches expected output: fragmentWithModuleName.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** @providesModule Foo.react */ +var Relay = require('react-relay'); +var x = Relay.QL\`fragment Foo on Node { id }\`; +var y = Relay.QL\`fragment Bar on Node { id }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** @providesModule Foo.react */ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "Foo", + type: "Node" + }; +}(); +var y = function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "Bar", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fragmentWithName.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\`fragment FragmentNameHere on Node { id }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "FragmentNameHere", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fragmentWithPossibleId.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + fragment on Actor { + name + ... on User { id } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + }, + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "IdFragment", + type: "Node" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "MyComponentRelayQL", + type: "Actor" + }; +}(); + +`; + +exports[`TSTransform matches expected output: fragmentWithReference.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\`fragment on Node { \${reference} }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function (RQL_0) { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + Relay.QL.__frag(RQL_0) + ]), + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "MyComponentRelayQL", + type: "Node" + }; +}(reference); + +`; + +exports[`TSTransform matches expected output: fragmentWithoutCommas.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + fragment on Node { + \${reference} + id + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function (RQL_0) { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + Relay.QL.__frag(RQL_0) + ]), + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "MyComponentRelayQL", + type: "Node" + }; +}(reference); + +`; + +exports[`TSTransform matches expected output: inlineFragment.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + fragment on Node { + ... on User { + userOnlyField + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "userOnlyField", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "MyComponentRelayQL", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: inlineFragmentWithoutType.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +/* +TODO: Upgrade to graphql@0.4.7 and uncomment this. + +var x = Relay.QL\` + fragment on Node { + ... { + id + } + } +\`; +*/ +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +/* +TODO: Upgrade to graphql@0.4.7 and uncomment this. + +var x = Relay.QL\` + fragment on Node { + ... { + id + } + } +\`; +*/ + +`; + +exports[`TSTransform matches expected output: introspectionQueryForSchema.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var foo = Relay.QL\` + query IntrospectionQueryForSchema { + __schema { + types { + name + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var foo = function () { + return { + children: [ + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "types", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "__Type" + } + ], + fieldName: "__schema", + kind: "Query", + metadata: {}, + name: "IntrospectionQueryForSchema", + type: "__Schema" + }; +}(); + +`; + +exports[`TSTransform matches expected output: introspectionQueryForType.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var foo = Relay.QL\` + query IntrospectionQueryForType { + __type(name: "Root") { + name + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var foo = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "String!" + }, + name: "name", + value: { + kind: "CallValue", + callValue: "Root" + } + } + ], + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "__type", + kind: "Query", + metadata: { + identifyingArgName: "name", + identifyingArgType: "String!" + }, + name: "IntrospectionQueryForType", + type: "__Type" + }; +}(); + +`; + +exports[`TSTransform matches expected output: memoize-inner-scope.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ + +'use strict'; + +const ProfilePic = require('ProfilePic'); + +function SomeTopLevelView() { + let _graphql = 'unrelated'; + + return ( + + + + ); +} + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ +'use strict'; +var __graphql$0; +const ProfilePic = require('ProfilePic'); +function SomeTopLevelView() { + let _graphql = 'unrelated'; + return ( + + ); +} + +`; + +exports[`TSTransform matches expected output: memoize-inner-scope.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ + +'use strict'; + +const ProfilePic = require('ProfilePic'); + +function SomeTopLevelView() { + let _graphql = 'unrelated'; + + return ( + + + + ); +} + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ +'use strict'; +var __graphql$0; +const ProfilePic = require('ProfilePic'); +function SomeTopLevelView() { + let _graphql = 'unrelated'; + return ( + + ); +} + +`; + +exports[`TSTransform matches expected output: memoize-inner-scope.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ + +'use strict'; + +const ProfilePic = require('ProfilePic'); + +function SomeTopLevelView() { + let _graphql = 'unrelated'; + + return ( + + + + ); +} + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ +'use strict'; +var __graphql$0; +const ProfilePic = require('ProfilePic'); +function SomeTopLevelView() { + let _graphql = 'unrelated'; + return ( + + ); +} + +`; + +exports[`TSTransform matches expected output: metadataConnection.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + node { + name + } + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "first", + value: { + kind: "CallValue", + callValue: 3 + } + } + ], + children: [ + { + children: [ + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isRequisite: true + }, + type: "User" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "UserConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: metadataConnectionLimitable.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + viewer { + configs { + edges { + node { + name + } + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + children: [ + { + children: [ + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + isRequisite: true + }, + type: "Config" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "ConfigsConnectionEdge" + } + ], + fieldName: "configs", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ConfigsConnection" + } + ], + fieldName: "viewer", + kind: "Query", + metadata: {}, + name: "MyComponent", + type: "Viewer" + }; +}(); + +`; + +exports[`TSTransform matches expected output: metadataDynamic.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + fragment on NewsFeedConnection { + edges { + node { + id + ... on Story { + attachments + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "attachments", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true, + isPlural: true + }, + type: "Node" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "Story", + type: "Story" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true, + isRequisite: true + }, + type: "Node" + }, + { + fieldName: "cursor", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "edges", + kind: "Field", + metadata: { + canHaveSubselections: true, + isPlural: true + }, + type: "NewsFeedConnectionEdge" + }, + { + children: [ + { + fieldName: "hasNextPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + }, + { + fieldName: "hasPreviousPage", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "Boolean" + } + ], + fieldName: "pageInfo", + kind: "Field", + metadata: { + canHaveSubselections: true, + isGenerated: true, + isRequisite: true + }, + type: "PageInfo" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "MyComponentRelayQL", + type: "NewsFeedConnection" + }; +}(); + +`; + +exports[`TSTransform matches expected output: metadataGenerated.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: metadataNonFindable.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + viewer { + pendingPosts { + count + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "pendingPosts", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true + }, + type: "PendingPostsConnection" + } + ], + fieldName: "viewer", + kind: "Query", + metadata: {}, + name: "MyComponent", + type: "Viewer" + }; +}(); + +`; + +exports[`TSTransform matches expected output: metadataPlural.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + websites + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "websites", + kind: "Field", + metadata: { + isPlural: true + }, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: metadataRequisite.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\`fragment on Node { id }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "MyComponentRelayQL", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: metadataVarArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + fragment on User { + friends(orderby: $order) { + count + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: {}, + name: "orderby", + value: { + kind: "CallVariable", + callVariableName: "order" + } + } + ], + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "friends", + kind: "Field", + metadata: { + canHaveSubselections: true, + isConnection: true, + isFindable: true + }, + type: "UserConnection" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "MyComponentRelayQL", + type: "User" + }; +}(); + +`; + +exports[`TSTransform matches expected output: module-operation.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatCommentCreateMutation = function () { + return require("./__generated__/CompatCommentCreateMutation.graphql.ts").default; +}; + +`; + +exports[`TSTransform matches expected output: module-operation.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatCommentCreateMutation = { + modern: function () { + return require("./__generated__/CompatCommentCreateMutation.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "input" + }], + name: "CompatCommentCreateMutation", + operation: "mutation", + node: function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "commentCreate", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + }, + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "CommentCreateInput" + }, + name: "CompatCommentCreateMutation", + responseType: "CommentCreateResponsePayload" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: module-operation.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatCommentCreateMutation = { + modern: function () { + return require("./__generated__/CompatCommentCreateMutation.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "input" + }], + name: "CompatCommentCreateMutation", + operation: "mutation", + node: function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "commentCreate", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + }, + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "CommentCreateInput" + }, + name: "CompatCommentCreateMutation", + responseType: "CommentCreateResponsePayload" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: multiple-root-fields.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql\` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + user: node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatViewerQuery = function () { + return require("./__generated__/CompatViewerQuery.graphql.ts").default; +}; + +`; + +exports[`TSTransform matches expected output: multiple-root-fields.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql\` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + user: node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatViewerQuery = { + modern: function () { + return require("./__generated__/CompatViewerQuery.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "id" + }, { + defaultValue: 1.5, + kind: "LocalArgument", + name: "scale" + }], + name: "CompatViewerQuery", + operation: "query", + node: function () { + return { + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + }, + { + alias: "user", + calls: [ + { + kind: "Call", + metadata: {}, + name: "id", + value: { + kind: "CallVariable", + callVariableName: "id" + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Node" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatViewerQuery", + type: "Query" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: multiple-root-fields.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql\` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + user: node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatViewerQuery = { + modern: function () { + return require("./__generated__/CompatViewerQuery.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "id" + }, { + defaultValue: 1.5, + kind: "LocalArgument", + name: "scale" + }], + name: "CompatViewerQuery", + operation: "query", + node: function () { + return { + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + }, + { + alias: "user", + calls: [ + { + kind: "Call", + metadata: {}, + name: "id", + value: { + kind: "CallVariable", + callVariableName: "id" + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Node" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatViewerQuery", + type: "Query" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: mutation.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatCommentCreateMutation = function () { + return require("./__generated__/CompatCommentCreateMutation.graphql.ts").default; +}; + +`; + +exports[`TSTransform matches expected output: mutation.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatCommentCreateMutation = { + modern: function () { + return require("./__generated__/CompatCommentCreateMutation.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "input" + }], + name: "CompatCommentCreateMutation", + operation: "mutation", + node: function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "commentCreate", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + }, + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "CommentCreateInput" + }, + name: "CompatCommentCreateMutation", + responseType: "CommentCreateResponsePayload" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: mutation.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql\` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatCommentCreateMutation = { + modern: function () { + return require("./__generated__/CompatCommentCreateMutation.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "input" + }], + name: "CompatCommentCreateMutation", + operation: "mutation", + node: function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "commentCreate", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + fieldName: "viewer", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "Viewer" + }, + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "CommentCreateInput" + }, + name: "CompatCommentCreateMutation", + responseType: "CommentCreateResponsePayload" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: mutation.txt 4`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + mutation { + actorSubscribe(input: $input) { + actor { + profilePicture + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "actorSubscribe", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + children: [ + { + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id" + }, + type: "User" + }, + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "ActorSubscribeInput" + }, + name: "MyComponent", + responseType: "ActorSubscribeResponsePayload" + }; +}(); + +`; + +exports[`TSTransform matches expected output: mutationBadSchemaMissingArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + mutation { + mutationMissingArg + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Your schema defines a mutation field \`mutationMissingArg\` that takes 0 arguments, but mutation fields must have exactly one argument named \`input\`. +`; + +exports[`TSTransform matches expected output: mutationBadSchemaWrongArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + mutation { + mutationWrongArgs + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Your schema defines a mutation field \`mutationWrongArgs\` that takes an argument named \`foo\`, but mutation fields must have exactly one argument named \`input\`. +`; + +exports[`TSTransform matches expected output: mutationWithExtraArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + mutation MutationNameHere { + actorSubscribe(input: $input, extra: $extra) { + \${reference} + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +GraphQL Validation Error: Unknown argument "extra" on field "actorSubscribe" of type "Mutation". +> +> actorSubscribe(input: $input, extra: $extra) { +> ^^^ +`; + +exports[`TSTransform matches expected output: mutationWithName.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + mutation MutationNameHere { + actorSubscribe(input: $input) { + \${reference} + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function (RQL_0) { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "actorSubscribe", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [].concat.apply([], [ + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + Relay.QL.__frag(RQL_0) + ]), + kind: "Mutation", + metadata: { + inputType: "ActorSubscribeInput" + }, + name: "MutationNameHere", + responseType: "ActorSubscribeResponsePayload" + }; +}(reference); + +`; + +exports[`TSTransform matches expected output: mutationWithoutArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + mutation { + actorSubscribe + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "actorSubscribe", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "ActorSubscribeInput" + }, + name: "MyComponent", + responseType: "ActorSubscribeResponsePayload" + }; +}(); + +`; + +exports[`TSTransform matches expected output: no-fragment-spread.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, +}); + +`; + +exports[`TSTransform matches expected output: no-fragment-spread.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, +}); + +`; + +exports[`TSTransform matches expected output: no-fragment-spread.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql\` + fragment CompatProfile_user on User { + name + } + \`, +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, +}); + +`; + +exports[`TSTransform matches expected output: no-object.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + } +}); + +`; + +exports[`TSTransform matches expected output: no-object.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: no-object.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: no-object-many-fragments.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + viewer: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + } +}); + +`; + +exports[`TSTransform matches expected output: no-object-many-fragments.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: no-object-many-fragments.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: { + modern: function () { + return require("./__generated__/CompatProfile_user.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_user", + type: "User" + }; + }() + }; + } + }, + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: nonExistentMutation.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + mutation { + fakeMutation(input: $input) { + actor { + profilePicture + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +GraphQL Validation Error: Cannot query field "fakeMutation" on type "Mutation". +> +> fakeMutation(input: $input) { +> ^^^ +`; + +exports[`TSTransform matches expected output: nonRootNodeField.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var fragment = RelayClassic.QL\` + fragment on InvalidType { + node(id: 123) { + ... on User { + name + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: You defined a \`node(id: Int)\` field on type \`InvalidType\`, but Relay requires the \`node\` field to be defined on the root type. See the Object Identification Guide: +http://facebook.github.io/relay/docs/graphql-object-identification.html +`; + +exports[`TSTransform matches expected output: pluralField.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 456) { + ... on Story { + actors { + id + __typename + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 456 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "actors", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isPlural: true + }, + type: "User" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "Story", + type: "Story" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: query.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql\` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatViewerQuery = function () { + return require("./__generated__/CompatViewerQuery.graphql.ts").default; +}; + +`; + +exports[`TSTransform matches expected output: query.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql\` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatViewerQuery = { + modern: function () { + return require("./__generated__/CompatViewerQuery.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "id" + }, { + defaultValue: 1.5, + kind: "LocalArgument", + name: "scale" + }], + name: "CompatViewerQuery", + operation: "query", + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: {}, + name: "id", + value: { + kind: "CallVariable", + callVariableName: "id" + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Node" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatViewerQuery", + type: "Query" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: query.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql\` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ +'use strict'; +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); +const CompatViewerQuery = { + modern: function () { + return require("./__generated__/CompatViewerQuery.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "id" + }, { + defaultValue: 1.5, + kind: "LocalArgument", + name: "scale" + }], + name: "CompatViewerQuery", + operation: "query", + node: function () { + return { + children: [ + { + calls: [ + { + kind: "Call", + metadata: {}, + name: "id", + value: { + kind: "CallVariable", + callVariableName: "id" + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Node" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatViewerQuery", + type: "Query" + }; + }() + }; + } +}; + +`; + +exports[`TSTransform matches expected output: queryWithArrayObjectArg.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL\` + query { + searchAll(queries: [$query]) { + title + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "[SearchInput!]!" + }, + name: "queries", + value: [ + { + kind: "CallVariable", + callVariableName: "query" + } + ] + } + ], + children: [ + { + fieldName: "title", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "searchAll", + kind: "Query", + metadata: { + isPlural: true, + identifyingArgName: "queries", + identifyingArgType: "[SearchInput!]!" + }, + name: "MyComponent", + type: "SearchResult" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithArrayObjectNestedVariable.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL\` + query { + searchAll(queries: [{queryText: $query}]) { + title + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Unexpected nested variable \`query\`; variables are supported as top-level arguments - \`node(id: $id)\` - or directly within lists - \`nodes(ids: [$id])\`. +`; + +exports[`TSTransform matches expected output: queryWithArrayObjectValue.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL\` + query { + searchAll(queries: [{queryText: "RelayClassic"}]) { + title + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "[SearchInput!]!" + }, + name: "queries", + value: [ + { + kind: "CallValue", + callValue: { + queryText: "RelayClassic" + } + } + ] + } + ], + children: [ + { + fieldName: "title", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "searchAll", + kind: "Query", + metadata: { + isPlural: true, + identifyingArgName: "queries", + identifyingArgType: "[SearchInput!]!" + }, + name: "MyComponent", + type: "SearchResult" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithBadDirective.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) @bad(if: $foo) { + id + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: You supplied a directive named \`bad\`, but no such directive exists. +`; + +exports[`TSTransform matches expected output: queryWithBadDirectiveArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) @if(bad: $foo) { + id + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: You supplied a directive named \`if\`, but no such directive exists. +`; + +exports[`TSTransform matches expected output: queryWithDirectives.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) @include(if: $foo) { + ... on User @include(if: $bar) { + name @skip(if: $baz) + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + directives: [ + { + kind: "Directive", + name: "skip", + args: [ + { + name: "if", + value: { + kind: "CallVariable", + callVariableName: "baz" + } + } + ] + } + ], + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + directives: [ + { + kind: "Directive", + name: "include", + args: [ + { + name: "if", + value: { + kind: "CallVariable", + callVariableName: "bar" + } + } + ] + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + directives: [ + { + kind: "Directive", + name: "include", + args: [ + { + name: "if", + value: { + kind: "CallVariable", + callVariableName: "foo" + } + } + ] + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithFields.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + name + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithName.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query QueryNameHere { + node(id: 123) { + ... on User { + profilePicture { + uri + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "QueryNameHere", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithNestedFields.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + ... on User { + profilePicture { + uri + } + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + children: [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithNestedFragments.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + node(id: 123) { + \${frag1} + \${frag2} + \${frag3} + \${frag4} + ... on User { + profilePicture { + uri + \${frag5} + \${frag6} + \${frag7} + \${frag8} + } + } + \${frag9} + \${frag10} + \${frag11} + \${frag12} + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function (RQL_0, RQL_1, RQL_2, RQL_3, RQL_4, RQL_5, RQL_6, RQL_7, RQL_8, RQL_9, RQL_10, RQL_11) { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + Relay.QL.__frag(RQL_0), + Relay.QL.__frag(RQL_1), + Relay.QL.__frag(RQL_2), + Relay.QL.__frag(RQL_3), + { + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "uri", + kind: "Field", + metadata: {}, + type: "String" + }, + Relay.QL.__frag(RQL_4), + Relay.QL.__frag(RQL_5), + Relay.QL.__frag(RQL_6), + Relay.QL.__frag(RQL_7) + ]), + fieldName: "profilePicture", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "ProfilePicture" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "User", + type: "User" + }, + Relay.QL.__frag(RQL_8), + Relay.QL.__frag(RQL_9), + Relay.QL.__frag(RQL_10), + Relay.QL.__frag(RQL_11) + ]), + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(frag1, frag2, frag3, frag4, frag5, frag6, frag7, frag8, frag9, frag10, frag11, frag12); + +`; + +exports[`TSTransform matches expected output: queryWithNullLiteral.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query MediaQuery { + media(id: null) { + ... on Story { + id + } + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "id", + value: { + kind: "CallValue", + callValue: null + } + } + ], + children: [ + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + id: Relay.QL.__id(), + kind: "Fragment", + metadata: {}, + name: "Story", + type: "Story" + } + ], + fieldName: "media", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "Int" + }, + name: "MediaQuery", + type: "Media" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithObjectArg.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL\` + query { + search(query: $query) { + title + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "SearchInput!" + }, + name: "query", + value: { + kind: "CallVariable", + callVariableName: "query" + } + } + ], + children: [ + { + fieldName: "title", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "search", + kind: "Query", + metadata: { + isPlural: true, + identifyingArgName: "query", + identifyingArgType: "SearchInput!" + }, + name: "MyComponent", + type: "SearchResult" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithObjectArgNestedVariable.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL\` + query { + search(query: {queryText: $query}) { + title + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Relay Transform Error: Unexpected nested variable \`query\`; variables are supported as top-level arguments - \`node(id: $id)\` - or directly within lists - \`nodes(ids: [$id])\`. +`; + +exports[`TSTransform matches expected output: queryWithObjectArgValue.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL\` + query { + search(query: {queryText: "RelayClassic"}) { + title + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var RelayClassic = require('RelayClassic'); +var q = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "SearchInput!" + }, + name: "query", + value: { + kind: "CallValue", + callValue: { + queryText: "RelayClassic" + } + } + } + ], + children: [ + { + fieldName: "title", + kind: "Field", + metadata: {}, + type: "String" + } + ], + fieldName: "search", + kind: "Query", + metadata: { + isPlural: true, + identifyingArgName: "query", + identifyingArgType: "SearchInput!" + }, + name: "MyComponent", + type: "SearchResult" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithVarArgs.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + query { + nodes(ids: [123,456]) { + id + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "[ID!]" + }, + name: "ids", + value: [ + { + kind: "CallValue", + callValue: 123 + }, + { + kind: "CallValue", + callValue: 456 + } + ] + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "nodes", + kind: "Query", + metadata: { + isPlural: true, + isAbstract: true, + identifyingArgName: "ids", + identifyingArgType: "[ID!]" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: queryWithoutFields.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\`query { viewer }\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function () { + return { + fieldName: "viewer", + kind: "Query", + metadata: {}, + name: "MyComponent", + type: "Viewer" + }; +}(); + +`; + +exports[`TSTransform matches expected output: simple-named-fragment.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile on User { + name + ...SomeOtherContainer + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + data: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + } +}); + +`; + +exports[`TSTransform matches expected output: simple-named-fragment.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile on User { + name + ...SomeOtherContainer + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + data: { + modern: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const SomeOtherContainer = SomeOtherContainer.getFragment("data"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(SomeOtherContainer) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: simple-named-fragment.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile on User { + name + ...SomeOtherContainer + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + data: { + modern: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const SomeOtherContainer = SomeOtherContainer.getFragment("data"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(SomeOtherContainer) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: simple-named-with-many-fragments.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + data: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + }, + viewer: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + } +}); + +`; + +exports[`TSTransform matches expected output: simple-named-with-many-fragments.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + data: { + modern: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile", + type: "User" + }; + }() + }; + } + }, + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: simple-named-with-many-fragments.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql\` + fragment CompatProfile on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ +'use strict'; +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); +const CompatProfile = () => null; +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + data: { + modern: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile", + type: "User" + }; + }() + }; + } + }, + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "User" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: subscription.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = Relay.QL\` + subscription { + likeStory(input: $input) { + \${reference} + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = function (RQL_0) { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "likeStory", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [].concat.apply([], [ + { + fieldName: "clientSubscriptionId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + Relay.QL.__frag(RQL_0) + ]), + kind: "Subscription", + metadata: { + inputType: "LikeStorySubscriptionInput" + }, + name: "MyComponent", + responseType: "LikeStorySubscriptionPayload" + }; +}(reference); + +`; + +exports[`TSTransform matches expected output: tagRelayClassicQL.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayClassic = require('react-relay/classic'); +var x = RelayClassic.QL\` + query { + node(id: 123) { + id + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var RelayClassic = require('react-relay/classic'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: tagRelayQL.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var RelayQL = require('react-relay/RelayQL'); +var x = RelayQL\` + query { + node(id: 123) { + id + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var RelayQL = require('react-relay/RelayQL'); +var x = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "ID!" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "node", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "ID!" + }, + name: "MyComponent", + type: "Node" + }; +}(); + +`; + +exports[`TSTransform matches expected output: templateString.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = \`Just a template string.\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var Relay = require('react-relay'); +var x = \`Just a template string.\`; + +`; + +exports[`TSTransform matches expected output: unionWithTypename.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +var foo = Relay.QL\` + query UnionWithTypename { + media(id: 123) { + __typename + } + } +\`; +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +var foo = function () { + return { + calls: [ + { + kind: "Call", + metadata: { + type: "Int" + }, + name: "id", + value: { + kind: "CallValue", + callValue: 123 + } + } + ], + children: [ + { + fieldName: "__typename", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "String" + } + ], + fieldName: "media", + kind: "Query", + metadata: { + isAbstract: true, + identifyingArgName: "id", + identifyingArgType: "Int" + }, + name: "UnionWithTypename", + type: "Media" + }; +}(); + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveCaller.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatUtil = require('CompatUtil'); +const CompatPage = require('CompatPage'); + +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: graphql\` + fragment CompatProfile_viewer on Viewer { + marketplace_explore{ + count + } + ...CompatUtil_viewer1 @relay(mask: false) + } + \`, + + page: graphql\` + fragment CompatProfile_page on Page { + ...CompatPage_page + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +const CompatUtil = require('CompatUtil'); +const CompatPage = require('CompatPage'); +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatUtil_viewer1 = RelayQL_GENERATED.__getClassicFragment(CompatUtil.viewer1.viewer1 || CompatUtil.viewer1, true).node; + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "marketplace_explore", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "MarketplaceExploreConnection" + }, + RelayQL_GENERATED.__frag(CompatUtil_viewer1) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "Viewer" + }; + }() + }; + } + }, + page: { + modern: function () { + return require("./__generated__/CompatProfile_page.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatPage_page = CompatPage.getFragment("page"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatPage_page) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_page", + type: "Page" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveCaller.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatUtil = require('CompatUtil'); +const CompatPage = require('CompatPage'); + +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: graphql\` + fragment CompatProfile_viewer on Viewer { + marketplace_explore{ + count + } + ...CompatUtil_viewer1 @relay(mask: false) + } + \`, + + page: graphql\` + fragment CompatProfile_page on Page { + ...CompatPage_page + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +const CompatUtil = require('CompatUtil'); +const CompatPage = require('CompatPage'); +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: { + modern: function () { + return require("./__generated__/CompatProfile_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatUtil_viewer1 = RelayQL_GENERATED.__getClassicFragment(CompatUtil.viewer1.viewer1 || CompatUtil.viewer1, true).node; + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + children: [ + { + fieldName: "count", + kind: "Field", + metadata: {}, + type: "Int" + } + ], + fieldName: "marketplace_explore", + kind: "Field", + metadata: { + canHaveSubselections: true + }, + type: "MarketplaceExploreConnection" + }, + RelayQL_GENERATED.__frag(CompatUtil_viewer1) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_viewer", + type: "Viewer" + }; + }() + }; + } + }, + page: { + modern: function () { + return require("./__generated__/CompatProfile_page.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatPage_page = CompatPage.getFragment("page"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + RelayQL_GENERATED.__frag(CompatPage_page) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatProfile_page", + type: "Page" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveInTheSameModule.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +/* + * When unmasking fragment in the same module, you need to bind it to a + * local variable with the conventional naming. + */ +const actor = graphql\` + fragment CompatUtil_actor on Actor { + id + name + } +\`; + +module.exports = { + /* + * you could also export \`CompatUtil_actor\` for compat mode by commenting + * out the next line + */ + // actor, + viewer: graphql\` + fragment CompatUtil_viewer on Viewer { + ...CompatUtil_actor @relay(mask: false) + } + \`, +}; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +/* + * When unmasking fragment in the same module, you need to bind it to a + * local variable with the conventional naming. + */ +const actor = { + actor: { + modern: function () { + return require("./__generated__/CompatUtil_actor.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "CompatUtil_actor", + type: "Actor" + }; + }() + }; + } + } +}; +module.exports = { + /* + * you could also export \`CompatUtil_actor\` for compat mode by commenting + * out the next line + */ + // actor, + viewer: { + modern: function () { + return require("./__generated__/CompatUtil_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatUtil_actor = RelayQL_GENERATED.__getClassicFragment(actor.actor, true).node; + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + RelayQL_GENERATED.__frag(CompatUtil_actor) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer", + type: "Viewer" + }; + }() + }; + } + }, +}; + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveInTheSameModule.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +/* + * When unmasking fragment in the same module, you need to bind it to a + * local variable with the conventional naming. + */ +const actor = graphql\` + fragment CompatUtil_actor on Actor { + id + name + } +\`; + +module.exports = { + /* + * you could also export \`CompatUtil_actor\` for compat mode by commenting + * out the next line + */ + // actor, + viewer: graphql\` + fragment CompatUtil_viewer on Viewer { + ...CompatUtil_actor @relay(mask: false) + } + \`, +}; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +/* + * When unmasking fragment in the same module, you need to bind it to a + * local variable with the conventional naming. + */ +const actor = { + actor: { + modern: function () { + return require("./__generated__/CompatUtil_actor.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "CompatUtil_actor", + type: "Actor" + }; + }() + }; + } + } +}; +module.exports = { + /* + * you could also export \`CompatUtil_actor\` for compat mode by commenting + * out the next line + */ + // actor, + viewer: { + modern: function () { + return require("./__generated__/CompatUtil_viewer.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatUtil_actor = RelayQL_GENERATED.__getClassicFragment(actor.actor, true).node; + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + RelayQL_GENERATED.__frag(CompatUtil_actor) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer", + type: "Viewer" + }; + }() + }; + } + }, +}; + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveSharedModule.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +module.exports = { + viewer1: graphql\` + fragment CompatUtil_viewer1 on Viewer { + actor { + id + name + } + } + \`, + viewer2: graphql\` + fragment CompatUtil_viewer2 on Viewer { + actor { + id + } + } + \`, +}; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +module.exports = { + viewer1: { + modern: function () { + return require("./__generated__/CompatUtil_viewer1.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer1", + type: "Viewer" + }; + }() + }; + } + }, + viewer2: { + modern: function () { + return require("./__generated__/CompatUtil_viewer2.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer2", + type: "Viewer" + }; + }() + }; + } + }, +}; + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveSharedModule.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +module.exports = { + viewer1: graphql\` + fragment CompatUtil_viewer1 on Viewer { + actor { + id + name + } + } + \`, + viewer2: graphql\` + fragment CompatUtil_viewer2 on Viewer { + actor { + id + } + } + \`, +}; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +module.exports = { + viewer1: { + modern: function () { + return require("./__generated__/CompatUtil_viewer1.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer1", + type: "Viewer" + }; + }() + }; + } + }, + viewer2: { + modern: function () { + return require("./__generated__/CompatUtil_viewer2.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer2", + type: "Viewer" + }; + }() + }; + } + }, +}; + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveSharedModule-2.text 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +module.exports = graphql\` + fragment CompatUtil_viewer1 on Viewer { + actor { + id + name + } + } + + fragment CompatUtil_viewer2 on Viewer { + actor { + id + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +module.exports = { + viewer1: { + modern: function () { + return require("./__generated__/CompatUtil_viewer1.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer1", + type: "Viewer" + }; + }() + }; + } + }, + viewer2: { + modern: function () { + return require("./__generated__/CompatUtil_viewer2.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer2", + type: "Viewer" + }; + }() + }; + } + } +}; + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveSharedModule-2.text 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +module.exports = graphql\` + fragment CompatUtil_viewer1 on Viewer { + actor { + id + name + } + } + + fragment CompatUtil_viewer2 on Viewer { + actor { + id + } + } +\`; + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ +'use strict'; +const graphql = require('graphql'); +module.exports = { + viewer1: { + modern: function () { + return require("./__generated__/CompatUtil_viewer1.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer1", + type: "Viewer" + }; + }() + }; + } + }, + viewer2: { + modern: function () { + return require("./__generated__/CompatUtil_viewer2.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [ + { + children: [ + { + fieldName: "id", + kind: "Field", + metadata: { + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + fieldName: "actor", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + } + ], + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: {}, + name: "CompatUtil_viewer2", + type: "Viewer" + }; + }() + }; + } + } +}; + +`; + +exports[`TSTransform matches expected output: unmaskDirectiveWithArguments.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatPage = require('CompatPage'); +const CompatUtil = require('CompatUtil'); + +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: graphql\` + fragment CompatProfile_viewer on Viewer { + ...CompatUtil_viewer + @relay(mask: false) + @arguments(count: 10) + } + \`, + page: graphql\` + fragment CompatProfile_page on Page { + ...CompatPage_page + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: BabelPluginRelay: Cannot use both \`@arguments\` and \`@relay(mask: false)\` on the same fragment spread when in compat mode. +`; + +exports[`TSTransform matches expected output: unmaskDirectiveWithArguments.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatPage = require('CompatPage'); +const CompatUtil = require('CompatUtil'); + +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: graphql\` + fragment CompatProfile_viewer on Viewer { + ...CompatUtil_viewer + @relay(mask: false) + @arguments(count: 10) + } + \`, + page: graphql\` + fragment CompatProfile_page on Page { + ...CompatPage_page + } + \` +}); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +THROWN EXCEPTION: + +Error: BabelPluginRelay: Cannot use both \`@arguments\` and \`@relay(mask: false)\` on the same fragment spread when in compat mode. +`; + +exports[`TSTransform matches expected output: within-class-reference.txt 1`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ + +'use strict'; + +const {createFragmentContainer, graphql} = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); + +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + + doSomething() { + commitMutation( + this.props.relay, + graphql\` + mutation ActorSubscribe($input: ActorSubscribeInput!) { + actorSubscribe(input: $input) { + subscribee { + ...CompatProfile + } + } + } + \`, + { input: { subscribeeId: 123 } } + ) + } +} + +module.exports = createFragmentContainer(CompatProfile, graphql\` + fragment CompatProfile on Actor { + name + subscribeStatus + ...CompatProfilePic_user + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ +'use strict'; +var __graphql$0; +const { createFragmentContainer, graphql } = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + doSomething() { + commitMutation(this.props.relay, __graphql$0 || (__graphql$0 = function () { + return require("./__generated__/ActorSubscribe.graphql.ts").default; + }), { input: { subscribeeId: 123 } }); + } +} +module.exports = createFragmentContainer(CompatProfile, { + data: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + } +}); + +`; + +exports[`TSTransform matches expected output: within-class-reference.txt 2`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ + +'use strict'; + +const {createFragmentContainer, graphql} = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); + +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + + doSomething() { + commitMutation( + this.props.relay, + graphql\` + mutation ActorSubscribe($input: ActorSubscribeInput!) { + actorSubscribe(input: $input) { + subscribee { + ...CompatProfile + } + } + } + \`, + { input: { subscribeeId: 123 } } + ) + } +} + +module.exports = createFragmentContainer(CompatProfile, graphql\` + fragment CompatProfile on Actor { + name + subscribeStatus + ...CompatProfilePic_user + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ +'use strict'; +var __graphql$0; +const { createFragmentContainer, graphql } = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + doSomething() { + commitMutation(this.props.relay, __graphql$0 || (__graphql$0 = { + modern: function () { + return require("./__generated__/ActorSubscribe.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfile = (CompatProfile.__container__ || CompatProfile).getFragment("data"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "input" + }], + name: "ActorSubscribe", + operation: "mutation", + node: function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "actorSubscribe", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfile) + ]), + fieldName: "subscribee", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + }, + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "ActorSubscribeInput" + }, + name: "ActorSubscribe", + responseType: "ActorSubscribeResponsePayload" + }; + }() + }; + } + }), { input: { subscribeeId: 123 } }); + } +} +module.exports = createFragmentContainer(CompatProfile, { + data: { + modern: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "subscribeStatus", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "CompatProfile", + type: "Actor" + }; + }() + }; + } + } +}); + +`; + +exports[`TSTransform matches expected output: within-class-reference.txt 3`] = ` +~~~~~~~~~~ INPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ + +'use strict'; + +const {createFragmentContainer, graphql} = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); + +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + + doSomething() { + commitMutation( + this.props.relay, + graphql\` + mutation ActorSubscribe($input: ActorSubscribeInput!) { + actorSubscribe(input: $input) { + subscribee { + ...CompatProfile + } + } + } + \`, + { input: { subscribeeId: 123 } } + ) + } +} + +module.exports = createFragmentContainer(CompatProfile, graphql\` + fragment CompatProfile on Actor { + name + subscribeStatus + ...CompatProfilePic_user + } +\`); + +~~~~~~~~~~ OUTPUT ~~~~~~~~~~ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ +'use strict'; +var __graphql$0; +const { createFragmentContainer, graphql } = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + doSomething() { + commitMutation(this.props.relay, __graphql$0 || (__graphql$0 = { + modern: function () { + return require("./__generated__/ActorSubscribe.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfile = (CompatProfile.__container__ || CompatProfile).getFragment("data"); + return { + kind: "OperationDefinition", + argumentDefinitions: [{ + defaultValue: null, + kind: "LocalArgument", + name: "input" + }], + name: "ActorSubscribe", + operation: "mutation", + node: function () { + return { + calls: [ + { + kind: "Call", + metadata: {}, + name: "actorSubscribe", + value: { + kind: "CallVariable", + callVariableName: "input" + } + } + ], + children: [ + { + children: [].concat.apply([], [ + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfile) + ]), + fieldName: "subscribee", + kind: "Field", + metadata: { + canHaveSubselections: true, + inferredRootCallName: "node", + inferredPrimaryKey: "id", + isAbstract: true + }, + type: "Actor" + }, + { + fieldName: "clientMutationId", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + } + ], + kind: "Mutation", + metadata: { + inputType: "ActorSubscribeInput" + }, + name: "ActorSubscribe", + responseType: "ActorSubscribeResponsePayload" + }; + }() + }; + } + }), { input: { subscribeeId: 123 } }); + } +} +module.exports = createFragmentContainer(CompatProfile, { + data: { + modern: function () { + return require("./__generated__/CompatProfile.graphql.ts").default; + }, + classic: function (RelayQL_GENERATED) { + const CompatProfilePic_user = CompatProfilePic.getFragment("user"); + return { + kind: "FragmentDefinition", + argumentDefinitions: [], + node: function () { + return { + children: [].concat.apply([], [ + { + fieldName: "name", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "subscribeStatus", + kind: "Field", + metadata: {}, + type: "String" + }, + { + fieldName: "id", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "ID" + }, + { + fieldName: "__typename", + kind: "Field", + metadata: { + isGenerated: true, + isRequisite: true + }, + type: "String" + }, + RelayQL_GENERATED.__frag(CompatProfilePic_user) + ]), + id: RelayQL_GENERATED.__id(), + kind: "Fragment", + metadata: { + isAbstract: true + }, + name: "CompatProfile", + type: "Actor" + }; + }() + }; + } + } +}); + +`; diff --git a/transform/test/fixtures-classic/argsInvalidValues.txt b/transform/test/fixtures-classic/argsInvalidValues.txt new file mode 100644 index 00000000..3ba0b226 --- /dev/null +++ b/transform/test/fixtures-classic/argsInvalidValues.txt @@ -0,0 +1,21 @@ +var foo = Relay.QL` + query Args { + node(id: 123) { + ... on User { + friends( + first: "10" + orderby: Name + find: cursor1 + isViewerFriend: "true" + gender: "MALE" + ) { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/argsSubstitution.txt b/transform/test/fixtures-classic/argsSubstitution.txt new file mode 100644 index 00000000..7ca1cdf4 --- /dev/null +++ b/transform/test/fixtures-classic/argsSubstitution.txt @@ -0,0 +1,7 @@ +var foo = Relay.QL` + query Args { + node(id: ${userID}) { + id + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/argsValues.txt b/transform/test/fixtures-classic/argsValues.txt new file mode 100644 index 00000000..6865bb5a --- /dev/null +++ b/transform/test/fixtures-classic/argsValues.txt @@ -0,0 +1,22 @@ +var foo = Relay.QL` + query Args { + node(id: 123) { + ... on User { + friends( + first: 10 + orderby: "Name" + find: "cursor1" + isViewerFriend: true + gender: MALE + ) { + edges { + node { + id + firstName(if: true, unless: false) + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/argsVariablesList.txt b/transform/test/fixtures-classic/argsVariablesList.txt new file mode 100644 index 00000000..2f0a0b46 --- /dev/null +++ b/transform/test/fixtures-classic/argsVariablesList.txt @@ -0,0 +1,7 @@ +var foo = Relay.QL` + query Args { + nodes(ids: [$one, $two, 3]) { + id + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionPattern.txt b/transform/test/fixtures-classic/connectionPattern.txt new file mode 100644 index 00000000..d1cd2ca9 --- /dev/null +++ b/transform/test/fixtures-classic/connectionPattern.txt @@ -0,0 +1,12 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + fragment on User @relay(pattern: true) { + friends { + edges { + node { + id + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithAfterLastArgs.txt b/transform/test/fixtures-classic/connectionWithAfterLastArgs.txt new file mode 100644 index 00000000..aead097c --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithAfterLastArgs.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(last: 3, after: "foo") { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithAfterLastArgsWithInlineFragment.txt b/transform/test/fixtures-classic/connectionWithAfterLastArgsWithInlineFragment.txt new file mode 100644 index 00000000..530163f0 --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithAfterLastArgsWithInlineFragment.txt @@ -0,0 +1,18 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(last: 3, after: "foo") { + ... on UserConnection { + edges { + node { + id + } + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithAfterLastOneVariableArgs.txt b/transform/test/fixtures-classic/connectionWithAfterLastOneVariableArgs.txt new file mode 100644 index 00000000..229c13da --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithAfterLastOneVariableArgs.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(last: $last, after: "foo") { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithAfterLastVariableArgs.txt b/transform/test/fixtures-classic/connectionWithAfterLastVariableArgs.txt new file mode 100644 index 00000000..9fa2f926 --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithAfterLastVariableArgs.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(after: $after, last: $last) { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithBeforeFirstArgs.txt b/transform/test/fixtures-classic/connectionWithBeforeFirstArgs.txt new file mode 100644 index 00000000..86cb2ecc --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithBeforeFirstArgs.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3, before: "foo") { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithFirstLastArgs.txt b/transform/test/fixtures-classic/connectionWithFirstLastArgs.txt new file mode 100644 index 00000000..886e381b --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithFirstLastArgs.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3, last: 3) { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithFirstLastVariableArgs.txt b/transform/test/fixtures-classic/connectionWithFirstLastVariableArgs.txt new file mode 100644 index 00000000..98a6c68b --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithFirstLastVariableArgs.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: $first, last: $last) { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithNodesField.txt b/transform/test/fixtures-classic/connectionWithNodesField.txt new file mode 100644 index 00000000..494be7dc --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithNodesField.txt @@ -0,0 +1,14 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + nodes { + id + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithPageInfoAlias.txt b/transform/test/fixtures-classic/connectionWithPageInfoAlias.txt new file mode 100644 index 00000000..3fc14daa --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithPageInfoAlias.txt @@ -0,0 +1,19 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + node { + name + } + } + myPageInfo: pageInfo { + hasPreviousPage + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithPageInfoSubfields.txt b/transform/test/fixtures-classic/connectionWithPageInfoSubfields.txt new file mode 100644 index 00000000..5c9dce58 --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithPageInfoSubfields.txt @@ -0,0 +1,17 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + node { + name + } + } + pageInfo + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithSelectVariables.txt b/transform/test/fixtures-classic/connectionWithSelectVariables.txt new file mode 100644 index 00000000..0f907ba9 --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithSelectVariables.txt @@ -0,0 +1,28 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends1: friends(first: $limit) { + edges { + ... on UserConnectionEdge @relay(variables: []) { + node { + name + } + } + } + } + friends2: friends(first: $limit) { + edges { + ... on UserConnectionEdge @relay(variables: ["size"]) { + node { + name + profilePicture(size: $size) + } + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithoutArgs.txt b/transform/test/fixtures-classic/connectionWithoutArgs.txt new file mode 100644 index 00000000..3a467a13 --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithoutArgs.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithoutArgsWithInlineFragment.txt b/transform/test/fixtures-classic/connectionWithoutArgsWithInlineFragment.txt new file mode 100644 index 00000000..890ccd9b --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithoutArgsWithInlineFragment.txt @@ -0,0 +1,18 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends { + ... on UserConnection { + edges { + node { + id + } + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithoutNodeField.txt b/transform/test/fixtures-classic/connectionWithoutNodeField.txt new file mode 100644 index 00000000..744e6c69 --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithoutNodeField.txt @@ -0,0 +1,14 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + cursor + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/connectionWithoutNodeID.txt b/transform/test/fixtures-classic/connectionWithoutNodeID.txt new file mode 100644 index 00000000..2de7c30e --- /dev/null +++ b/transform/test/fixtures-classic/connectionWithoutNodeID.txt @@ -0,0 +1,14 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3) @relay(isConnectionWithoutNodeID: true) { + edges { + cursor + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/container.txt b/transform/test/fixtures-classic/container.txt new file mode 100644 index 00000000..045660b3 --- /dev/null +++ b/transform/test/fixtures-classic/container.txt @@ -0,0 +1,6 @@ +var Relay = require('react-relay'); +Relay.createContainer(Component, { + queries: { + viewer: () => Relay.QL`fragment on Viewer { actor { id } }` + } +}); \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldForEnum.txt b/transform/test/fixtures-classic/fieldForEnum.txt new file mode 100644 index 00000000..9bd60742 --- /dev/null +++ b/transform/test/fixtures-classic/fieldForEnum.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + gender + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithAlias.txt b/transform/test/fixtures-classic/fieldWithAlias.txt new file mode 100644 index 00000000..23b21a1b --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithAlias.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + realName: name + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithAliasAndArgs.txt b/transform/test/fixtures-classic/fieldWithAliasAndArgs.txt new file mode 100644 index 00000000..a23b8ed2 --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithAliasAndArgs.txt @@ -0,0 +1,12 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + mugShot: profilePicture(size: 100) { + uri + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithArgs.txt b/transform/test/fixtures-classic/fieldWithArgs.txt new file mode 100644 index 00000000..aa11f88e --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithArgs.txt @@ -0,0 +1,12 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + profilePicture(size: 100) { + uri + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithCustomScalarArg.txt b/transform/test/fixtures-classic/fieldWithCustomScalarArg.txt new file mode 100644 index 00000000..913c494d --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithCustomScalarArg.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + customScalar(arg: {give: "relay"}) { + title + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithEmptyArrayArg.txt b/transform/test/fixtures-classic/fieldWithEmptyArrayArg.txt new file mode 100644 index 00000000..8c291d93 --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithEmptyArrayArg.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + fragment on User { + friends(isViewerFriend: false) { + count + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithEnumArg.txt b/transform/test/fixtures-classic/fieldWithEnumArg.txt new file mode 100644 index 00000000..8234819a --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithEnumArg.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 5, gender: MALE) { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithEnumQueryArg.txt b/transform/test/fixtures-classic/fieldWithEnumQueryArg.txt new file mode 100644 index 00000000..074a5f3c --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithEnumQueryArg.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query($gender_0: Gender) { + node(id: 123) { + ... on User { + friends(first: 5, gender: $gender_0) { + edges { + node { + id + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithFakeConnection.txt b/transform/test/fixtures-classic/fieldWithFakeConnection.txt new file mode 100644 index 00000000..c01f4a0f --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithFakeConnection.txt @@ -0,0 +1,12 @@ +var RelayClassic = require('RelayClassic'); +var foo = RelayClassic.QL` + fragment on User { + fakeConnection { + edges { + node { + id + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fieldWithParams.txt b/transform/test/fixtures-classic/fieldWithParams.txt new file mode 100644 index 00000000..98fa1706 --- /dev/null +++ b/transform/test/fixtures-classic/fieldWithParams.txt @@ -0,0 +1,12 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + profilePicture(size: $size) { + uri + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragment.txt b/transform/test/fixtures-classic/fragment.txt new file mode 100644 index 00000000..e4fe5b39 --- /dev/null +++ b/transform/test/fixtures-classic/fragment.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = Relay.QL`fragment on Node { id }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragmentDirectives.txt b/transform/test/fixtures-classic/fragmentDirectives.txt new file mode 100644 index 00000000..2ed252c5 --- /dev/null +++ b/transform/test/fixtures-classic/fragmentDirectives.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = Relay.QL`fragment on Node @relay(plural: true) { id }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragmentOnBadType.txt b/transform/test/fixtures-classic/fragmentOnBadType.txt new file mode 100644 index 00000000..b2a4f2e2 --- /dev/null +++ b/transform/test/fixtures-classic/fragmentOnBadType.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = Relay.QL`fragment on NotAType { id }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragmentWithModuleName.txt b/transform/test/fixtures-classic/fragmentWithModuleName.txt new file mode 100644 index 00000000..1b035dcc --- /dev/null +++ b/transform/test/fixtures-classic/fragmentWithModuleName.txt @@ -0,0 +1,4 @@ +/** @providesModule Foo.react */ +var Relay = require('react-relay'); +var x = Relay.QL`fragment Foo on Node { id }`; +var y = Relay.QL`fragment Bar on Node { id }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragmentWithName.txt b/transform/test/fixtures-classic/fragmentWithName.txt new file mode 100644 index 00000000..23ac5c6f --- /dev/null +++ b/transform/test/fixtures-classic/fragmentWithName.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = Relay.QL`fragment FragmentNameHere on Node { id }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragmentWithPossibleId.txt b/transform/test/fixtures-classic/fragmentWithPossibleId.txt new file mode 100644 index 00000000..0ff8248f --- /dev/null +++ b/transform/test/fixtures-classic/fragmentWithPossibleId.txt @@ -0,0 +1,7 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + fragment on Actor { + name + ... on User { id } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragmentWithReference.txt b/transform/test/fixtures-classic/fragmentWithReference.txt new file mode 100644 index 00000000..f24a3826 --- /dev/null +++ b/transform/test/fixtures-classic/fragmentWithReference.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = Relay.QL`fragment on Node { ${reference} }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/fragmentWithoutCommas.txt b/transform/test/fixtures-classic/fragmentWithoutCommas.txt new file mode 100644 index 00000000..cdf09494 --- /dev/null +++ b/transform/test/fixtures-classic/fragmentWithoutCommas.txt @@ -0,0 +1,7 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + fragment on Node { + ${reference} + id + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/inlineFragment.txt b/transform/test/fixtures-classic/inlineFragment.txt new file mode 100644 index 00000000..6a168da6 --- /dev/null +++ b/transform/test/fixtures-classic/inlineFragment.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + fragment on Node { + ... on User { + userOnlyField + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/inlineFragmentWithoutType.txt b/transform/test/fixtures-classic/inlineFragmentWithoutType.txt new file mode 100644 index 00000000..07e29f40 --- /dev/null +++ b/transform/test/fixtures-classic/inlineFragmentWithoutType.txt @@ -0,0 +1,12 @@ +var Relay = require('react-relay'); +/* +TODO: Upgrade to graphql@0.4.7 and uncomment this. + +var x = Relay.QL` + fragment on Node { + ... { + id + } + } +`; +*/ \ No newline at end of file diff --git a/transform/test/fixtures-classic/introspectionQueryForSchema.txt b/transform/test/fixtures-classic/introspectionQueryForSchema.txt new file mode 100644 index 00000000..7d4cc9cf --- /dev/null +++ b/transform/test/fixtures-classic/introspectionQueryForSchema.txt @@ -0,0 +1,9 @@ +var foo = Relay.QL` + query IntrospectionQueryForSchema { + __schema { + types { + name + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/introspectionQueryForType.txt b/transform/test/fixtures-classic/introspectionQueryForType.txt new file mode 100644 index 00000000..48f89964 --- /dev/null +++ b/transform/test/fixtures-classic/introspectionQueryForType.txt @@ -0,0 +1,7 @@ +var foo = Relay.QL` + query IntrospectionQueryForType { + __type(name: "Root") { + name + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataConnection.txt b/transform/test/fixtures-classic/metadataConnection.txt new file mode 100644 index 00000000..311ec474 --- /dev/null +++ b/transform/test/fixtures-classic/metadataConnection.txt @@ -0,0 +1,16 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + friends(first: 3) { + edges { + node { + name + } + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataConnectionLimitable.txt b/transform/test/fixtures-classic/metadataConnectionLimitable.txt new file mode 100644 index 00000000..0b54018b --- /dev/null +++ b/transform/test/fixtures-classic/metadataConnectionLimitable.txt @@ -0,0 +1,14 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + viewer { + configs { + edges { + node { + name + } + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataDynamic.txt b/transform/test/fixtures-classic/metadataDynamic.txt new file mode 100644 index 00000000..880e5447 --- /dev/null +++ b/transform/test/fixtures-classic/metadataDynamic.txt @@ -0,0 +1,13 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + fragment on NewsFeedConnection { + edges { + node { + id + ... on Story { + attachments + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataGenerated.txt b/transform/test/fixtures-classic/metadataGenerated.txt new file mode 100644 index 00000000..c226a7b2 --- /dev/null +++ b/transform/test/fixtures-classic/metadataGenerated.txt @@ -0,0 +1,6 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataNonFindable.txt b/transform/test/fixtures-classic/metadataNonFindable.txt new file mode 100644 index 00000000..96370b7a --- /dev/null +++ b/transform/test/fixtures-classic/metadataNonFindable.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + viewer { + pendingPosts { + count + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataPlural.txt b/transform/test/fixtures-classic/metadataPlural.txt new file mode 100644 index 00000000..41eaf3fa --- /dev/null +++ b/transform/test/fixtures-classic/metadataPlural.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + websites + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataRequisite.txt b/transform/test/fixtures-classic/metadataRequisite.txt new file mode 100644 index 00000000..e4fe5b39 --- /dev/null +++ b/transform/test/fixtures-classic/metadataRequisite.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = Relay.QL`fragment on Node { id }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/metadataVarArgs.txt b/transform/test/fixtures-classic/metadataVarArgs.txt new file mode 100644 index 00000000..731a7786 --- /dev/null +++ b/transform/test/fixtures-classic/metadataVarArgs.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + fragment on User { + friends(orderby: $order) { + count + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/mutation.txt b/transform/test/fixtures-classic/mutation.txt new file mode 100644 index 00000000..b1580739 --- /dev/null +++ b/transform/test/fixtures-classic/mutation.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + mutation { + actorSubscribe(input: $input) { + actor { + profilePicture + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/mutationBadSchemaMissingArgs.txt b/transform/test/fixtures-classic/mutationBadSchemaMissingArgs.txt new file mode 100644 index 00000000..675839f3 --- /dev/null +++ b/transform/test/fixtures-classic/mutationBadSchemaMissingArgs.txt @@ -0,0 +1,6 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + mutation { + mutationMissingArg + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/mutationBadSchemaWrongArgs.txt b/transform/test/fixtures-classic/mutationBadSchemaWrongArgs.txt new file mode 100644 index 00000000..4180cbf7 --- /dev/null +++ b/transform/test/fixtures-classic/mutationBadSchemaWrongArgs.txt @@ -0,0 +1,6 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + mutation { + mutationWrongArgs + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/mutationWithExtraArgs.txt b/transform/test/fixtures-classic/mutationWithExtraArgs.txt new file mode 100644 index 00000000..b107f175 --- /dev/null +++ b/transform/test/fixtures-classic/mutationWithExtraArgs.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + mutation MutationNameHere { + actorSubscribe(input: $input, extra: $extra) { + ${reference} + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/mutationWithName.txt b/transform/test/fixtures-classic/mutationWithName.txt new file mode 100644 index 00000000..01d537b9 --- /dev/null +++ b/transform/test/fixtures-classic/mutationWithName.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + mutation MutationNameHere { + actorSubscribe(input: $input) { + ${reference} + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/mutationWithoutArgs.txt b/transform/test/fixtures-classic/mutationWithoutArgs.txt new file mode 100644 index 00000000..03d96a18 --- /dev/null +++ b/transform/test/fixtures-classic/mutationWithoutArgs.txt @@ -0,0 +1,6 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + mutation { + actorSubscribe + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/nonExistentMutation.txt b/transform/test/fixtures-classic/nonExistentMutation.txt new file mode 100644 index 00000000..9475657e --- /dev/null +++ b/transform/test/fixtures-classic/nonExistentMutation.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + mutation { + fakeMutation(input: $input) { + actor { + profilePicture + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/nonRootNodeField.txt b/transform/test/fixtures-classic/nonRootNodeField.txt new file mode 100644 index 00000000..60fc1206 --- /dev/null +++ b/transform/test/fixtures-classic/nonRootNodeField.txt @@ -0,0 +1,10 @@ +var RelayClassic = require('RelayClassic'); +var fragment = RelayClassic.QL` + fragment on InvalidType { + node(id: 123) { + ... on User { + name + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/pluralField.txt b/transform/test/fixtures-classic/pluralField.txt new file mode 100644 index 00000000..7921f75d --- /dev/null +++ b/transform/test/fixtures-classic/pluralField.txt @@ -0,0 +1,13 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 456) { + ... on Story { + actors { + id + __typename + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithArrayObjectArg.txt b/transform/test/fixtures-classic/queryWithArrayObjectArg.txt new file mode 100644 index 00000000..94c136a0 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithArrayObjectArg.txt @@ -0,0 +1,8 @@ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL` + query { + searchAll(queries: [$query]) { + title + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithArrayObjectNestedVariable.txt b/transform/test/fixtures-classic/queryWithArrayObjectNestedVariable.txt new file mode 100644 index 00000000..e98403c1 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithArrayObjectNestedVariable.txt @@ -0,0 +1,8 @@ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL` + query { + searchAll(queries: [{queryText: $query}]) { + title + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithArrayObjectValue.txt b/transform/test/fixtures-classic/queryWithArrayObjectValue.txt new file mode 100644 index 00000000..d520539b --- /dev/null +++ b/transform/test/fixtures-classic/queryWithArrayObjectValue.txt @@ -0,0 +1,8 @@ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL` + query { + searchAll(queries: [{queryText: "RelayClassic"}]) { + title + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithBadDirective.txt b/transform/test/fixtures-classic/queryWithBadDirective.txt new file mode 100644 index 00000000..4494d049 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithBadDirective.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) @bad(if: $foo) { + id + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithBadDirectiveArgs.txt b/transform/test/fixtures-classic/queryWithBadDirectiveArgs.txt new file mode 100644 index 00000000..24000b12 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithBadDirectiveArgs.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) @if(bad: $foo) { + id + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithDirectives.txt b/transform/test/fixtures-classic/queryWithDirectives.txt new file mode 100644 index 00000000..78c01678 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithDirectives.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) @include(if: $foo) { + ... on User @include(if: $bar) { + name @skip(if: $baz) + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithFields.txt b/transform/test/fixtures-classic/queryWithFields.txt new file mode 100644 index 00000000..29d2164b --- /dev/null +++ b/transform/test/fixtures-classic/queryWithFields.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + name + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithName.txt b/transform/test/fixtures-classic/queryWithName.txt new file mode 100644 index 00000000..9d3baf15 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithName.txt @@ -0,0 +1,12 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query QueryNameHere { + node(id: 123) { + ... on User { + profilePicture { + uri + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithNestedFields.txt b/transform/test/fixtures-classic/queryWithNestedFields.txt new file mode 100644 index 00000000..0f8b900b --- /dev/null +++ b/transform/test/fixtures-classic/queryWithNestedFields.txt @@ -0,0 +1,12 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ... on User { + profilePicture { + uri + } + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithNestedFragments.txt b/transform/test/fixtures-classic/queryWithNestedFragments.txt new file mode 100644 index 00000000..9a42ae9f --- /dev/null +++ b/transform/test/fixtures-classic/queryWithNestedFragments.txt @@ -0,0 +1,24 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + node(id: 123) { + ${frag1} + ${frag2} + ${frag3} + ${frag4} + ... on User { + profilePicture { + uri + ${frag5} + ${frag6} + ${frag7} + ${frag8} + } + } + ${frag9} + ${frag10} + ${frag11} + ${frag12} + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithNullLiteral.txt b/transform/test/fixtures-classic/queryWithNullLiteral.txt new file mode 100644 index 00000000..a2c5da6e --- /dev/null +++ b/transform/test/fixtures-classic/queryWithNullLiteral.txt @@ -0,0 +1,10 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query MediaQuery { + media(id: null) { + ... on Story { + id + } + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithObjectArg.txt b/transform/test/fixtures-classic/queryWithObjectArg.txt new file mode 100644 index 00000000..218a3d41 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithObjectArg.txt @@ -0,0 +1,8 @@ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL` + query { + search(query: $query) { + title + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithObjectArgNestedVariable.txt b/transform/test/fixtures-classic/queryWithObjectArgNestedVariable.txt new file mode 100644 index 00000000..a1ac1317 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithObjectArgNestedVariable.txt @@ -0,0 +1,8 @@ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL` + query { + search(query: {queryText: $query}) { + title + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithObjectArgValue.txt b/transform/test/fixtures-classic/queryWithObjectArgValue.txt new file mode 100644 index 00000000..bd5e82d9 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithObjectArgValue.txt @@ -0,0 +1,8 @@ +var RelayClassic = require('RelayClassic'); +var q = RelayClassic.QL` + query { + search(query: {queryText: "RelayClassic"}) { + title + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithVarArgs.txt b/transform/test/fixtures-classic/queryWithVarArgs.txt new file mode 100644 index 00000000..c1f21dfb --- /dev/null +++ b/transform/test/fixtures-classic/queryWithVarArgs.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + query { + nodes(ids: [123,456]) { + id + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/queryWithoutFields.txt b/transform/test/fixtures-classic/queryWithoutFields.txt new file mode 100644 index 00000000..d5e576b1 --- /dev/null +++ b/transform/test/fixtures-classic/queryWithoutFields.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = Relay.QL`query { viewer }`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/subscription.txt b/transform/test/fixtures-classic/subscription.txt new file mode 100644 index 00000000..96ce4a01 --- /dev/null +++ b/transform/test/fixtures-classic/subscription.txt @@ -0,0 +1,8 @@ +var Relay = require('react-relay'); +var x = Relay.QL` + subscription { + likeStory(input: $input) { + ${reference} + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/tagRelayClassicQL.txt b/transform/test/fixtures-classic/tagRelayClassicQL.txt new file mode 100644 index 00000000..ebc9c9be --- /dev/null +++ b/transform/test/fixtures-classic/tagRelayClassicQL.txt @@ -0,0 +1,8 @@ +var RelayClassic = require('react-relay/classic'); +var x = RelayClassic.QL` + query { + node(id: 123) { + id + } + } +`; diff --git a/transform/test/fixtures-classic/tagRelayQL.txt b/transform/test/fixtures-classic/tagRelayQL.txt new file mode 100644 index 00000000..67f8c0ea --- /dev/null +++ b/transform/test/fixtures-classic/tagRelayQL.txt @@ -0,0 +1,8 @@ +var RelayQL = require('react-relay/RelayQL'); +var x = RelayQL` + query { + node(id: 123) { + id + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/templateString.txt b/transform/test/fixtures-classic/templateString.txt new file mode 100644 index 00000000..fb6cab47 --- /dev/null +++ b/transform/test/fixtures-classic/templateString.txt @@ -0,0 +1,2 @@ +var Relay = require('react-relay'); +var x = `Just a template string.`; \ No newline at end of file diff --git a/transform/test/fixtures-classic/unionWithTypename.txt b/transform/test/fixtures-classic/unionWithTypename.txt new file mode 100644 index 00000000..74258298 --- /dev/null +++ b/transform/test/fixtures-classic/unionWithTypename.txt @@ -0,0 +1,7 @@ +var foo = Relay.QL` + query UnionWithTypename { + media(id: 123) { + __typename + } + } +`; \ No newline at end of file diff --git a/transform/test/fixtures-compat/arguments-listvalue.txt b/transform/test/fixtures-compat/arguments-listvalue.txt new file mode 100644 index 00000000..e0c689b4 --- /dev/null +++ b/transform/test/fixtures-compat/arguments-listvalue.txt @@ -0,0 +1,28 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayClassic = require('RelayClassic'); + +const {graphql} = RelayClassic; + +const CompatProfile = () => null; + +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: graphql` + fragment CompatProfile_viewer on Viewer @argumentDefinitions( + browserContext: {type: "MarketplaceBrowseContext", defaultValue: BROWSE_FEED} + priceRange: {type: "[Float]", defaultValue: [0, 50]} + ) { + marketplace_explore( + marketplace_browse_context: $browserContext, + with_price_between: $priceRange, + ) { + count + } + } + ` +}); diff --git a/transform/test/fixtures-compat/arguments.txt b/transform/test/fixtures-compat/arguments.txt new file mode 100644 index 00000000..f3ca26d8 --- /dev/null +++ b/transform/test/fixtures-compat/arguments.txt @@ -0,0 +1,48 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: graphql` + fragment CompatProfile_passing on User { + ...ProfilePic_user @arguments(size: 40, scale: 1.5, title: "Photo") + ...ProfilePic_user @arguments(size: $pictureSize) + } + `, + receiving: graphql` + fragment CompatProfile_receiving on User @argumentDefinitions( + first: {type: "Int", defaultValue: 5} + named: {type: "String", defaultValue: "john"} + scale: {type: "Float", defaultValue: 1.5} + noDefault: {type: "Int"} + ) { + friends(first: $first, named: $named, scale: $scale) { + count + } + } + `, + passingWithDefault: graphql` + fragment CompatProfile_passingWithDefault on User @argumentDefinitions( + withDefault: {type: "Int", defaultValue: 100} + noDefault: {type: "Int"} + ) { + ...ProfilePic_user @arguments(size: $withDefault, scale: $noDefault) + } + `, + receivingGlobals: graphql` + fragment CompatProfile_receivingGlobals on User { + friends(first: $friendsCount) { + count + } + } + `, +}); diff --git a/transform/test/fixtures-compat/duplicate-variables.txt b/transform/test/fixtures-compat/duplicate-variables.txt new file mode 100644 index 00000000..a638046a --- /dev/null +++ b/transform/test/fixtures-compat/duplicate-variables.txt @@ -0,0 +1,33 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: graphql` + fragment CompatProfile_user on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + `, + user2: graphql` + fragment CompatProfile_user2 on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + ` +}); diff --git a/transform/test/fixtures-compat/error_confusing-fragment-name.txt b/transform/test/fixtures-compat/error_confusing-fragment-name.txt new file mode 100644 index 00000000..fa6ed34c --- /dev/null +++ b/transform/test/fixtures-compat/error_confusing-fragment-name.txt @@ -0,0 +1,18 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_data on User { + name + } +`); diff --git a/transform/test/fixtures-compat/error_too-many-fragments.txt b/transform/test/fixtures-compat/error_too-many-fragments.txt new file mode 100644 index 00000000..b59d7a9d --- /dev/null +++ b/transform/test/fixtures-compat/error_too-many-fragments.txt @@ -0,0 +1,24 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } + `, +}); diff --git a/transform/test/fixtures-compat/error_unexpected-fragment.txt b/transform/test/fixtures-compat/error_unexpected-fragment.txt new file mode 100644 index 00000000..5ead95bb --- /dev/null +++ b/transform/test/fixtures-compat/error_unexpected-fragment.txt @@ -0,0 +1,27 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } + + fragment Whoopsie_key on User { + name + } +`; diff --git a/transform/test/fixtures-compat/error_unexpected-operation.txt b/transform/test/fixtures-compat/error_unexpected-operation.txt new file mode 100644 index 00000000..9248de68 --- /dev/null +++ b/transform/test/fixtures-compat/error_unexpected-operation.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_user on User { + name + } + + query Whoopsie { + name + } +`); diff --git a/transform/test/fixtures-compat/export-refetch-container.txt b/transform/test/fixtures-compat/export-refetch-container.txt new file mode 100644 index 00000000..8a66ea13 --- /dev/null +++ b/transform/test/fixtures-compat/export-refetch-container.txt @@ -0,0 +1,32 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ + +const React = require('React'); +const {createRefetchContainer, graphql} = require('RelayClassic'); + +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} + +module.exports = createRefetchContainer( + RefetchExample, + graphql` + fragment RefetchExample_user on User { + name + } + `, + graphql` + query RefetchExampleRefetchQuery { + viewer { + actor { + ...RefetchExample_user + } + } + } + `, +); diff --git a/transform/test/fixtures-compat/fragment-spread.txt b/transform/test/fixtures-compat/fragment-spread.txt new file mode 100644 index 00000000..dd0e2b32 --- /dev/null +++ b/transform/test/fixtures-compat/fragment-spread.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql` + fragment CompatProfile_user on User { + name + ...CompatProfilePic_user + } + `, +}); diff --git a/transform/test/fixtures-compat/memoize-inner-scope.txt b/transform/test/fixtures-compat/memoize-inner-scope.txt new file mode 100644 index 00000000..77833221 --- /dev/null +++ b/transform/test/fixtures-compat/memoize-inner-scope.txt @@ -0,0 +1,29 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ + +'use strict'; + +const ProfilePic = require('ProfilePic'); + +function SomeTopLevelView() { + let _graphql = 'unrelated'; + + return ( + + + + ); +} diff --git a/transform/test/fixtures-compat/module-operation.txt b/transform/test/fixtures-compat/module-operation.txt new file mode 100644 index 00000000..0e4dc2c7 --- /dev/null +++ b/transform/test/fixtures-compat/module-operation.txt @@ -0,0 +1,23 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +`; diff --git a/transform/test/fixtures-compat/multiple-root-fields.txt b/transform/test/fixtures-compat/multiple-root-fields.txt new file mode 100644 index 00000000..da500961 --- /dev/null +++ b/transform/test/fixtures-compat/multiple-root-fields.txt @@ -0,0 +1,27 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + user: node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +`; diff --git a/transform/test/fixtures-compat/mutation.txt b/transform/test/fixtures-compat/mutation.txt new file mode 100644 index 00000000..375d6376 --- /dev/null +++ b/transform/test/fixtures-compat/mutation.txt @@ -0,0 +1,23 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +`; diff --git a/transform/test/fixtures-compat/no-fragment-spread.txt b/transform/test/fixtures-compat/no-fragment-spread.txt new file mode 100644 index 00000000..4afb18bd --- /dev/null +++ b/transform/test/fixtures-compat/no-fragment-spread.txt @@ -0,0 +1,20 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql` + fragment CompatProfile_user on User { + name + } + `, +}); diff --git a/transform/test/fixtures-compat/no-object-many-fragments.txt b/transform/test/fixtures-compat/no-object-many-fragments.txt new file mode 100644 index 00000000..0659758e --- /dev/null +++ b/transform/test/fixtures-compat/no-object-many-fragments.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +`); diff --git a/transform/test/fixtures-compat/no-object.txt b/transform/test/fixtures-compat/no-object.txt new file mode 100644 index 00000000..915a37b1 --- /dev/null +++ b/transform/test/fixtures-compat/no-object.txt @@ -0,0 +1,18 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_user on User { + name + } +`); diff --git a/transform/test/fixtures-compat/query.txt b/transform/test/fixtures-compat/query.txt new file mode 100644 index 00000000..1ae3d3d8 --- /dev/null +++ b/transform/test/fixtures-compat/query.txt @@ -0,0 +1,21 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +`; diff --git a/transform/test/fixtures-compat/simple-named-fragment.txt b/transform/test/fixtures-compat/simple-named-fragment.txt new file mode 100644 index 00000000..ef37f6ce --- /dev/null +++ b/transform/test/fixtures-compat/simple-named-fragment.txt @@ -0,0 +1,19 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile on User { + name + ...SomeOtherContainer + } +`); diff --git a/transform/test/fixtures-compat/simple-named-with-many-fragments.txt b/transform/test/fixtures-compat/simple-named-with-many-fragments.txt new file mode 100644 index 00000000..cc808453 --- /dev/null +++ b/transform/test/fixtures-compat/simple-named-with-many-fragments.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +`); diff --git a/transform/test/fixtures-compat/unmaskDirectiveCaller.txt b/transform/test/fixtures-compat/unmaskDirectiveCaller.txt new file mode 100644 index 00000000..b38a47f4 --- /dev/null +++ b/transform/test/fixtures-compat/unmaskDirectiveCaller.txt @@ -0,0 +1,28 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatUtil = require('CompatUtil'); +const CompatPage = require('CompatPage'); + +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: graphql` + fragment CompatProfile_viewer on Viewer { + marketplace_explore{ + count + } + ...CompatUtil_viewer1 @relay(mask: false) + } + `, + + page: graphql` + fragment CompatProfile_page on Page { + ...CompatPage_page + } + ` +}); diff --git a/transform/test/fixtures-compat/unmaskDirectiveInTheSameModule.txt b/transform/test/fixtures-compat/unmaskDirectiveInTheSameModule.txt new file mode 100644 index 00000000..f2f62d76 --- /dev/null +++ b/transform/test/fixtures-compat/unmaskDirectiveInTheSameModule.txt @@ -0,0 +1,33 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +/* + * When unmasking fragment in the same module, you need to bind it to a + * local variable with the conventional naming. + */ +const actor = graphql` + fragment CompatUtil_actor on Actor { + id + name + } +`; + +module.exports = { + /* + * you could also export `CompatUtil_actor` for compat mode by commenting + * out the next line + */ + // actor, + viewer: graphql` + fragment CompatUtil_viewer on Viewer { + ...CompatUtil_actor @relay(mask: false) + } + `, +}; diff --git a/transform/test/fixtures-compat/unmaskDirectiveSharedModule-2.text b/transform/test/fixtures-compat/unmaskDirectiveSharedModule-2.text new file mode 100644 index 00000000..b3a559f1 --- /dev/null +++ b/transform/test/fixtures-compat/unmaskDirectiveSharedModule-2.text @@ -0,0 +1,24 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +module.exports = graphql` + fragment CompatUtil_viewer1 on Viewer { + actor { + id + name + } + } + + fragment CompatUtil_viewer2 on Viewer { + actor { + id + } + } +`; diff --git a/transform/test/fixtures-compat/unmaskDirectiveSharedModule.txt b/transform/test/fixtures-compat/unmaskDirectiveSharedModule.txt new file mode 100644 index 00000000..93d68b82 --- /dev/null +++ b/transform/test/fixtures-compat/unmaskDirectiveSharedModule.txt @@ -0,0 +1,27 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatUtil + */ + +'use strict'; + +const graphql = require('graphql'); + +module.exports = { + viewer1: graphql` + fragment CompatUtil_viewer1 on Viewer { + actor { + id + name + } + } + `, + viewer2: graphql` + fragment CompatUtil_viewer2 on Viewer { + actor { + id + } + } + `, +}; diff --git a/transform/test/fixtures-compat/unmaskDirectiveWithArguments.txt b/transform/test/fixtures-compat/unmaskDirectiveWithArguments.txt new file mode 100644 index 00000000..e89d108b --- /dev/null +++ b/transform/test/fixtures-compat/unmaskDirectiveWithArguments.txt @@ -0,0 +1,26 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatPage = require('CompatPage'); +const CompatUtil = require('CompatUtil'); + +module.exports = Relay.createFragmentContainer(CompatProfile, { + viewer: graphql` + fragment CompatProfile_viewer on Viewer { + ...CompatUtil_viewer + @relay(mask: false) + @arguments(count: 10) + } + `, + page: graphql` + fragment CompatProfile_page on Page { + ...CompatPage_page + } + ` +}); diff --git a/transform/test/fixtures-compat/within-class-reference.txt b/transform/test/fixtures-compat/within-class-reference.txt new file mode 100644 index 00000000..f314c5e4 --- /dev/null +++ b/transform/test/fixtures-compat/within-class-reference.txt @@ -0,0 +1,45 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ + +'use strict'; + +const {createFragmentContainer, graphql} = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); + +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + + doSomething() { + commitMutation( + this.props.relay, + graphql` + mutation ActorSubscribe($input: ActorSubscribeInput!) { + actorSubscribe(input: $input) { + subscribee { + ...CompatProfile + } + } + } + `, + { input: { subscribeeId: 123 } } + ) + } +} + +module.exports = createFragmentContainer(CompatProfile, graphql` + fragment CompatProfile on Actor { + name + subscribeStatus + ...CompatProfilePic_user + } +`); diff --git a/transform/test/fixtures-modern/arguments-listvalue.txt b/transform/test/fixtures-modern/arguments-listvalue.txt new file mode 100644 index 00000000..e0c689b4 --- /dev/null +++ b/transform/test/fixtures-modern/arguments-listvalue.txt @@ -0,0 +1,28 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayClassic = require('RelayClassic'); + +const {graphql} = RelayClassic; + +const CompatProfile = () => null; + +module.exports = RelayClassic.createFragmentContainer(CompatProfile, { + viewer: graphql` + fragment CompatProfile_viewer on Viewer @argumentDefinitions( + browserContext: {type: "MarketplaceBrowseContext", defaultValue: BROWSE_FEED} + priceRange: {type: "[Float]", defaultValue: [0, 50]} + ) { + marketplace_explore( + marketplace_browse_context: $browserContext, + with_price_between: $priceRange, + ) { + count + } + } + ` +}); diff --git a/transform/test/fixtures-modern/arguments.txt b/transform/test/fixtures-modern/arguments.txt new file mode 100644 index 00000000..d60ae2fd --- /dev/null +++ b/transform/test/fixtures-modern/arguments.txt @@ -0,0 +1,40 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + passing: graphql` + fragment CompatProfile_passing on User { + ...ProfilePic_user @arguments(size: 40, scale: 1.5, title: "Photo") + ...ProfilePic_user @arguments(size: $pictureSize) + } + `, + receiving: graphql` + fragment CompatProfile_receiving on User @argumentDefinitions( + first: {type: "Int", defaultValue: 5} + named: {type: "String", defaultValue: "john"} + scale: {type: "Float", defaultValue: 1.5} + noDefault: {type: "Int"} + ) { + friends(first: $first, named: $named, scale: $scale) { + count + } + } + `, + receivingGlobals: graphql` + fragment CompatProfile_receivingGlobals on User { + friends(first: $friendsCount) { + count + } + } + `, +}); diff --git a/transform/test/fixtures-modern/duplicate-variables.txt b/transform/test/fixtures-modern/duplicate-variables.txt new file mode 100644 index 00000000..a638046a --- /dev/null +++ b/transform/test/fixtures-modern/duplicate-variables.txt @@ -0,0 +1,33 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfilePic = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfilePic, { + user: graphql` + fragment CompatProfile_user on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + `, + user2: graphql` + fragment CompatProfile_user2 on User @argumentDefinitions( + scale: {type: "Float"} + ) { + profile_picture(scale: $scale) { + uri + } + } + ` +}); diff --git a/transform/test/fixtures-modern/error_confusing-fragment-name.txt b/transform/test/fixtures-modern/error_confusing-fragment-name.txt new file mode 100644 index 00000000..fa6ed34c --- /dev/null +++ b/transform/test/fixtures-modern/error_confusing-fragment-name.txt @@ -0,0 +1,18 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_data on User { + name + } +`); diff --git a/transform/test/fixtures-modern/error_too-many-fragments.txt b/transform/test/fixtures-modern/error_too-many-fragments.txt new file mode 100644 index 00000000..b59d7a9d --- /dev/null +++ b/transform/test/fixtures-modern/error_too-many-fragments.txt @@ -0,0 +1,24 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } + `, +}); diff --git a/transform/test/fixtures-modern/error_unexpected-fragment.txt b/transform/test/fixtures-modern/error_unexpected-fragment.txt new file mode 100644 index 00000000..5ead95bb --- /dev/null +++ b/transform/test/fixtures-modern/error_unexpected-fragment.txt @@ -0,0 +1,27 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } + + fragment Whoopsie_key on User { + name + } +`; diff --git a/transform/test/fixtures-modern/error_unexpected-operation.txt b/transform/test/fixtures-modern/error_unexpected-operation.txt new file mode 100644 index 00000000..9248de68 --- /dev/null +++ b/transform/test/fixtures-modern/error_unexpected-operation.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_user on User { + name + } + + query Whoopsie { + name + } +`); diff --git a/transform/test/fixtures-modern/export-refetch-container.txt b/transform/test/fixtures-modern/export-refetch-container.txt new file mode 100644 index 00000000..8a66ea13 --- /dev/null +++ b/transform/test/fixtures-modern/export-refetch-container.txt @@ -0,0 +1,32 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule RefetchExample + */ + +const React = require('React'); +const {createRefetchContainer, graphql} = require('RelayClassic'); + +class RefetchExample extends React.Component { + render() { + return
{this.props.user.name}
; + } +} + +module.exports = createRefetchContainer( + RefetchExample, + graphql` + fragment RefetchExample_user on User { + name + } + `, + graphql` + query RefetchExampleRefetchQuery { + viewer { + actor { + ...RefetchExample_user + } + } + } + `, +); diff --git a/transform/test/fixtures-modern/fragment-spread.txt b/transform/test/fixtures-modern/fragment-spread.txt new file mode 100644 index 00000000..dd0e2b32 --- /dev/null +++ b/transform/test/fixtures-modern/fragment-spread.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const CompatProfilePic = require('CompatProfilePic'); +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql` + fragment CompatProfile_user on User { + name + ...CompatProfilePic_user + } + `, +}); diff --git a/transform/test/fixtures-modern/memoize-inner-scope.txt b/transform/test/fixtures-modern/memoize-inner-scope.txt new file mode 100644 index 00000000..77833221 --- /dev/null +++ b/transform/test/fixtures-modern/memoize-inner-scope.txt @@ -0,0 +1,29 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule SomeTopLevelView + */ + +'use strict'; + +const ProfilePic = require('ProfilePic'); + +function SomeTopLevelView() { + let _graphql = 'unrelated'; + + return ( + + + + ); +} diff --git a/transform/test/fixtures-modern/module-operation.txt b/transform/test/fixtures-modern/module-operation.txt new file mode 100644 index 00000000..0e4dc2c7 --- /dev/null +++ b/transform/test/fixtures-modern/module-operation.txt @@ -0,0 +1,23 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatCommentCreateMutation + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +`; diff --git a/transform/test/fixtures-modern/multiple-root-fields.txt b/transform/test/fixtures-modern/multiple-root-fields.txt new file mode 100644 index 00000000..da500961 --- /dev/null +++ b/transform/test/fixtures-modern/multiple-root-fields.txt @@ -0,0 +1,27 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + user: node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +`; diff --git a/transform/test/fixtures-modern/mutation.txt b/transform/test/fixtures-modern/mutation.txt new file mode 100644 index 00000000..375d6376 --- /dev/null +++ b/transform/test/fixtures-modern/mutation.txt @@ -0,0 +1,23 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatCommentCreateMutation = graphql` + mutation CompatCommentCreateMutation($input: CommentCreateInput!) { + commentCreate(input: $input) { + viewer { + actor { + id + ...CompatProfilePic_user + } + } + } + } +`; diff --git a/transform/test/fixtures-modern/no-fragment-spread.txt b/transform/test/fixtures-modern/no-fragment-spread.txt new file mode 100644 index 00000000..4afb18bd --- /dev/null +++ b/transform/test/fixtures-modern/no-fragment-spread.txt @@ -0,0 +1,20 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, { + user: graphql` + fragment CompatProfile_user on User { + name + } + `, +}); diff --git a/transform/test/fixtures-modern/no-object-many-fragments.txt b/transform/test/fixtures-modern/no-object-many-fragments.txt new file mode 100644 index 00000000..0659758e --- /dev/null +++ b/transform/test/fixtures-modern/no-object-many-fragments.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_user on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +`); diff --git a/transform/test/fixtures-modern/no-object.txt b/transform/test/fixtures-modern/no-object.txt new file mode 100644 index 00000000..915a37b1 --- /dev/null +++ b/transform/test/fixtures-modern/no-object.txt @@ -0,0 +1,18 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile_user on User { + name + } +`); diff --git a/transform/test/fixtures-modern/query.txt b/transform/test/fixtures-modern/query.txt new file mode 100644 index 00000000..1ae3d3d8 --- /dev/null +++ b/transform/test/fixtures-modern/query.txt @@ -0,0 +1,21 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule Compat + */ + +'use strict'; + +const graphql = require('graphql'); +const CompatProfilePic = require('CompatProfilePic'); + +const CompatViewerQuery = graphql` + query CompatViewerQuery($id: ID!, $scale: Float = 1.5) { + node(id: $id) { + ... on User { + id + ...CompatProfilePic_user + } + } + } +`; diff --git a/transform/test/fixtures-modern/simple-named-fragment.txt b/transform/test/fixtures-modern/simple-named-fragment.txt new file mode 100644 index 00000000..ef37f6ce --- /dev/null +++ b/transform/test/fixtures-modern/simple-named-fragment.txt @@ -0,0 +1,19 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile on User { + name + ...SomeOtherContainer + } +`); diff --git a/transform/test/fixtures-modern/simple-named-with-many-fragments.txt b/transform/test/fixtures-modern/simple-named-with-many-fragments.txt new file mode 100644 index 00000000..cc808453 --- /dev/null +++ b/transform/test/fixtures-modern/simple-named-with-many-fragments.txt @@ -0,0 +1,22 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatProfile + */ + +'use strict'; + +const RelayCompatContainer = require('RelayCompatContainer'); +const graphql = require('graphql'); + +const CompatProfile = () => null; + +module.exports = RelayCompatContainer.createContainer(CompatProfile, graphql` + fragment CompatProfile on User { + name + } + + fragment CompatProfile_viewer on User { + name + } +`); diff --git a/transform/test/fixtures-modern/within-class-reference.txt b/transform/test/fixtures-modern/within-class-reference.txt new file mode 100644 index 00000000..f314c5e4 --- /dev/null +++ b/transform/test/fixtures-modern/within-class-reference.txt @@ -0,0 +1,45 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + * + * @providesModule CompatStory + */ + +'use strict'; + +const {createFragmentContainer, graphql} = require('RelayClassic'); +const React = require('React'); +const CompatProfilePic = require('CompatProfilePic'); + +class CompatProfile extends React.Component { + render() { + return
+ + {this.props.data.name} + {this.props.data.subscribeStatus} +
; + } + + doSomething() { + commitMutation( + this.props.relay, + graphql` + mutation ActorSubscribe($input: ActorSubscribeInput!) { + actorSubscribe(input: $input) { + subscribee { + ...CompatProfile + } + } + } + `, + { input: { subscribeeId: 123 } } + ) + } +} + +module.exports = createFragmentContainer(CompatProfile, graphql` + fragment CompatProfile on Actor { + name + subscribeStatus + ...CompatProfilePic_user + } +`); diff --git a/transform/test/testschema.graphql b/transform/test/testschema.graphql new file mode 100644 index 00000000..b1b4119d --- /dev/null +++ b/transform/test/testschema.graphql @@ -0,0 +1,773 @@ +schema { + query: Query + mutation: Mutation + subscription: Subscription +} + +type Query { + checkinSearchQuery(query: CheckinSearchInput): CheckinSearchResult + defaultSettings: Settings, + route(waypoints: [WayPoint!]!): Route + items(filter: ItemFilterInput): ItemFilterResult + maybeNode: MaybeNode + neverNode: NeverNode + named: Named + me: User + node(id: ID): Node + node_id_required(id: ID!): Node + nodes(ids: [ID!]): [Node] + settings(environment: Environment): Settings + story: Story + task(number: Int): Task + username(name: String!): Actor + usernames(names: [String!]!): [Actor] + viewer: Viewer + _mutation: Mutation +} + +union MaybeNode = Story | FakeNode | NonNode + +type FakeNode { + id: ID! +} + +type NonNode { + id: String + name: String +} + +union NeverNode = FakeNode | NonNode + +type Task { + title: String +} + +input WayPoint { + lat: String + lon: String +} + +type Route { + steps: [RouteStep] +} + +type RouteStep { + lat: String + lon: String + note: String +} + +type Mutation { + actorSubscribe(input: ActorSubscribeInput): ActorSubscribeResponsePayload + actorNameChange(input: ActorNameChangeInput): ActorNameChangePayload + applicationRequestDeleteAll(input: ApplicationRequestDeleteAllInput): ApplicationRequestDeleteAllResponsePayload + commentCreate(input: CommentCreateInput): CommentCreateResponsePayload + commentDelete(input: CommentDeleteInput): CommentDeleteResponsePayload + feedbackLike(input: FeedbackLikeInput): FeedbackLikeResponsePayload + feedbackLikeSubscribe(input: FeedbackLikeInput): FeedbackLikeResponsePayload + nodeSavedState(input: NodeSaveStateInput): NodeSavedStateResponsePayload + unfriend(input: UnfriendInput): UnfriendResponsePayload + viewerNotificationsUpdateAllSeenState(input: UpdateAllSeenStateInput): ViewerNotificationsUpdateAllSeenStateResponsePayload +} + +type Subscription { + feedbackLikeSubscribe(input: FeedbackLikeInput): FeedbackLikeResponsePayload + commentCreateSubscribe(input: CommentCreateSubscriptionInput): CommentCreateResponsePayload +} + +input ActorSubscribeInput { + clientMutationId: String + subscribeeId: ID +} + +input ActorNameChangeInput { + clientMutationId: String + newName: String +} + +input ApplicationRequestDeleteAllInput { + clientMutationId: String + deletedRequestIds: [ID] +} + +input CommentCreateInput { + clientMutationId: String + feedbackId: ID +} + +input CommentCreateSubscriptionInput { + clientSubscriptionId: String + feedbackId: ID + text: String +} + +input CommentDeleteInput { + clientMutationId: String + commentId: ID +} + +input FeedbackLikeInput { + clientMutationId: String + feedbackId: ID +} + +input NodeSaveStateInput { + clientMutationId: String + nodeId: ID +} + +input UpdateAllSeenStateInput { + clientMutationId: String + storyIds: [ID] +} + +type ActorSubscribeResponsePayload { + clientMutationId: String + subscribee: Actor +} + +type ActorNameChangePayload { + clientMutationId: String + actor: Actor +} + +type ApplicationRequestDeleteAllResponsePayload { + clientMutationId: String + deletedRequestIds: [ID] +} + +type CheckinSearchResult { + query: String +} + +input CheckinSearchInput { + query: String + inputs: [CheckinSearchInput] +} + +type Comment implements Node { + actor: Actor + actors: [Actor] + actorCount: Int + address: StreetAddress + allPhones: [Phone] + author: User + backgroundImage: Image + birthdate: Date + body: Text + canViewerComment: Boolean + canViewerLike: Boolean + comments(first: Int, last: Int, orderby: String): CommentsConnection + doesViewerLike: Boolean + emailAddresses: [String] + feedback: Feedback + firstName(if: Boolean, unless: Boolean): String + friends(after: ID, before: ID, first: Int, last: ID, orderby: [String], find: String, isViewerFriend: Boolean, if: Boolean, unless: Boolean, traits: [PersonalityTraits]): FriendsConnection + hometown: Page + id: ID! + lastName: String + likers(first: Int): LikersOfContentConnection + likeSentence: Text + message: Text + name: String + profilePicture(size: [Int], preset: PhotoSize): Image + segments(first: Int): Segments + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + topLevelComments(first: Int): TopLevelCommentsConnection + tracking: String + url(relative: Boolean, site: String): String + websites: [String] + username: String + viewerSavedState: String +} + +type CommentCreateResponsePayload { + clientMutationId: String + comment: Comment + feedback: Feedback + feedbackCommentEdge: CommentsEdge + viewer: Viewer +} + +type CommentDeleteResponsePayload { + clientMutationId: String + deletedCommentId: ID + feedback: Feedback +} + +type CommentsConnection { + count: Int + edges: [CommentsEdge] + pageInfo: PageInfo +} + +type CommentsEdge { + cursor: String + node: Comment + source: Feedback +} + +type ConfigsConnection { + edges: [ConfigsConnectionEdge] + pageInfo: PageInfo +} + +type ConfigsConnectionEdge { + node: Config +} + +type Config { + name: String + isEnabled: Boolean +} + +type Date { + day: Int + month: Int + year: Int +} + +type Feedback implements Node { + actor: Actor + actors: [Actor] + actorCount: Int + address: StreetAddress + allPhones: [Phone] + author: User + backgroundImage: Image + birthdate: Date + body: Text + canViewerComment: Boolean + canViewerLike: Boolean + comments(first: Int, last: Int, orderby: String): CommentsConnection + doesViewerLike: Boolean + emailAddresses: [String] + feedback: Feedback + firstName(if: Boolean, unless: Boolean): String + friends(after: ID, before: ID, first: Int, last: ID, orderby: [String], find: String, isViewerFriend: Boolean, if: Boolean, unless: Boolean, traits: [PersonalityTraits]): FriendsConnection + hometown: Page + id: ID! + lastName: String + likers(first: Int): LikersOfContentConnection + likeSentence: Text + message: Text + name: String + profilePicture(size: [Int], preset: PhotoSize): Image + segments(first: Int): Segments + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + topLevelComments(orderBy: [TopLevelCommentsOrdering], first: Int): TopLevelCommentsConnection + tracking: String + url(relative: Boolean, site: String): String + websites: [String] + username: String + viewerSavedState: String +} + +type FeedbackLikeResponsePayload { + clientMutationId: String + clientSubscriptionId: String + feedback: Feedback +} + +interface FeedUnit { + actor: Actor + actorCount: Int + feedback: Feedback + id: ID! + message: Text + tracking: String +} + +type FriendsConnection { + count: Int + edges: [FriendsEdge] + pageInfo: PageInfo +} + +type FriendsEdge { + cursor: String + node: User + source: User +} + +type Image { + uri: String + width: Int + height: Int +} + +type LikersOfContentConnection { + count: Int + edges: [LikersEdge] + pageInfo: PageInfo +} + +type LikersEdge { + cursor: String + node: Actor +} + +interface Named { + name: String +} + +type SimpleNamed implements Named { + name: String +} + +type NewsFeedConnection { + edges: [NewsFeedEdge] + pageInfo: PageInfo +} + +type NewsFeedEdge { + cursor: String + node: FeedUnit + sortKey: String + showBeeper: Boolean +} + +interface Node { + actor: Actor + actors: [Actor] + actorCount: Int + address: StreetAddress + allPhones: [Phone] + author: User + backgroundImage: Image + birthdate: Date + body: Text + canViewerComment: Boolean + canViewerLike: Boolean + comments(first: Int, last: Int, orderby: String): CommentsConnection + doesViewerLike: Boolean + emailAddresses: [String] + feedback: Feedback + firstName(if: Boolean, unless: Boolean): String + friends(after: ID, before: ID, first: Int, last: ID, orderby: [String], find: String, isViewerFriend: Boolean, if: Boolean, unless: Boolean, traits: [PersonalityTraits]): FriendsConnection + hometown: Page + id: ID! + lastName: String + likers(first: Int): LikersOfContentConnection + likeSentence: Text + message: Text + name: String + profilePicture(size: [Int], preset: PhotoSize): Image + segments(first: Int): Segments + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + topLevelComments(first: Int): TopLevelCommentsConnection + tracking: String + url(relative: Boolean, site: String): String + websites: [String] + username: String + viewerSavedState: String +} + +interface Actor { + address: StreetAddress + allPhones: [Phone] + birthdate: Date + emailAddresses: [String] + firstName(if: Boolean, unless: Boolean): String + friends(after: ID, before: ID, first: Int, last: ID, orderby: [String], find: String, isViewerFriend: Boolean, if: Boolean, unless: Boolean, traits: [PersonalityTraits]): FriendsConnection + hometown: Page + id: ID! + lastName: String + name: String + profilePicture(size: [Int], preset: PhotoSize): Image + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + url(relative: Boolean, site: String): String + websites: [String] + username: String +} + +type NodeSavedStateResponsePayload { + node: Node +} + +type Page implements Node Actor { + actor: Actor + actors: [Actor] + actorCount: Int + address: StreetAddress + allPhones: [Phone] + author: User + backgroundImage: Image + birthdate: Date + body: Text + canViewerComment: Boolean + canViewerLike: Boolean + comments(first: Int, last: Int, orderby: String): CommentsConnection + doesViewerLike: Boolean + emailAddresses: [String] + feedback: Feedback + firstName(if: Boolean, unless: Boolean): String + friends(after: ID, before: ID, first: Int, last: ID, orderby: [String], find: String, isViewerFriend: Boolean, if: Boolean, unless: Boolean, traits: [PersonalityTraits]): FriendsConnection + hometown: Page + id: ID! + lastName: String + likers(first: Int): LikersOfContentConnection + likeSentence: Text + message: Text + name: String + profilePicture(size: [Int], preset: PhotoSize): Image + segments(first: Int): Segments + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + topLevelComments(first: Int): TopLevelCommentsConnection + tracking: String + url(relative: Boolean, site: String): String + websites: [String] + username: String + viewerSavedState: String +} + +type PageInfo { + hasPreviousPage: Boolean + hasNextPage: Boolean + endCursor: String + startCursor: String +} + +type PendingPostsConnection { + count: Int + edges: [PendingPostsConnectionEdge] + pageInfo: PageInfo +} + +type PendingPostsConnectionEdge { + cursor: String + node: PendingPost +} + +type PendingPost { + text: String +} + +type Phone { + isVerified: Boolean + phoneNumber: PhoneNumber +} + +type PhoneNumber { + displayNumber: String + countryCode: String +} + +type Screenname { + name: String + service: String +} + +type Segments { + edges: SegmentsEdge +} + +type SegmentsEdge { + node: String +} + +type NonNodeStory implements FeedUnit { + actor: Actor + actorCount: Int + feedback: Feedback + id: ID! + message: Text + tracking: String +} + +type PhotoStory implements FeedUnit Node { + # PhotoStory + photo: Image + + # FeedUnit + canViewerDelete: Boolean + seenState: String + + # Node + actor: Actor + actors: [Actor] + actorCount: Int + address: StreetAddress + allPhones: [Phone] + author: User + backgroundImage: Image + birthdate: Date + body: Text + canViewerComment: Boolean + canViewerLike: Boolean + comments(first: Int, last: Int, orderby: String): CommentsConnection + doesViewerLike: Boolean + emailAddresses: [String] + feedback: Feedback + firstName(if: Boolean, unless: Boolean): String + friends(after: ID, before: ID, first: Int, last: ID, orderby: [String], find: String, isViewerFriend: Boolean, if: Boolean, unless: Boolean, traits: [PersonalityTraits]): FriendsConnection + hometown: Page + id: ID! + lastName: String + likers(first: Int): LikersOfContentConnection + likeSentence: Text + message: Text + name: String + profilePicture(size: [Int], preset: PhotoSize): Image + segments(first: Int): Segments + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + topLevelComments(first: Int): TopLevelCommentsConnection + tracking: String + url(relative: Boolean, site: String): String + websites: [String] + username: String + viewerSavedState: String +} + +type Story implements FeedUnit Node { + attachments: [StoryAttachment] + + # FeedUnit + canViewerDelete: Boolean + seenState: String + + # Node + actor: Actor + actors: [Actor] + actorCount: Int + address: StreetAddress + allPhones: [Phone] + author: User + backgroundImage: Image + birthdate: Date + body: Text + canViewerComment: Boolean + canViewerLike: Boolean + comments(first: Int, last: Int, orderby: String): CommentsConnection + doesViewerLike: Boolean + emailAddresses: [String] + feedback: Feedback + firstName(if: Boolean, unless: Boolean): String + friends(after: ID, before: ID, first: Int, last: ID, orderby: [String], find: String, isViewerFriend: Boolean, if: Boolean, unless: Boolean, traits: [PersonalityTraits]): FriendsConnection + hometown: Page + id: ID! + lastName: String + likers(first: Int): LikersOfContentConnection + likeSentence: Text + message: Text + name: String + profilePicture(size: [Int], preset: PhotoSize): Image + segments(first: Int): Segments + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + topLevelComments(first: Int): TopLevelCommentsConnection + tracking: String + url(relative: Boolean, site: String): String + websites: [String] + username: String + viewerSavedState: String +} + +type StoryAttachment { + cache_id: ID! + target: Story + styleList: [String] +} + +type StreetAddress { + city: String + country: String + postal_code: String + street: String +} + + +type SubscribersConnection { + count: Int + edges: [FriendsEdge] + pageInfo: PageInfo +} + +type SubscribersEdge { + cursor: String + node: User + source: User +} + +type Text { + text: String + ranges: [String] +} + +type TimezoneInfo { + timezone: String +} + +type TopLevelCommentsConnection { + count: Int + edges: [CommentsEdge] + pageInfo: PageInfo + totalCount: Int +} + +input UnfriendInput { + clientMutationId: String + friendId: ID +} + +type UnfriendResponsePayload { + actor: Actor + clientMutationId: String + formerFriend: User +} + +type User implements Named, Node, Actor { + actor: Actor + actors: [Actor] + actorCount: Int + address: StreetAddress + allPhones: [Phone] + author: User + backgroundImage: Image + birthdate: Date + body: Text + canViewerComment: Boolean + canViewerLike: Boolean + checkins(environments: [Environment!]!): CheckinSearchResult + comments(first: Int, last: Int, orderby: String): CommentsConnection + doesViewerLike: Boolean + emailAddresses: [String] + feedback: Feedback + firstName(if: Boolean, unless: Boolean): String + friends( + after: ID + before: ID + first: Int + last: ID + orderby: [String] + named: String + scale: Float + find: String + isViewerFriend: Boolean + if: Boolean + unless: Boolean + traits: [PersonalityTraits] + ): FriendsConnection + hometown: Page + id: ID! + lastName: String + likers(first: Int): LikersOfContentConnection + likeSentence: Text + message: Text + name: String + storySearch(query: StorySearchInput): [Story] + storyCommentSearch(query: StoryCommentSearchInput): [Comment] + profilePicture(size: [Int], preset: PhotoSize): Image + profile_picture(scale: Float): Image + segments(first: Int): Segments + screennames: [Screenname] + subscribeStatus: String + subscribers(first: Int): SubscribersConnection + topLevelComments(first: Int): TopLevelCommentsConnection + tracking: String + traits: [PersonalityTraits] + url(relative: Boolean, site: String): String + websites: [String] + username: String + viewerSavedState: String +} + +input StorySearchInput { + text: String + limit: Int + offset: Int + type: StoryType +} + +input StoryCommentSearchInput { + text: String + limit: Int + offset: Int +} + +type ItemFilterResult { + date: String +} + +input ItemFilterInput { + date: String +} + +type Viewer { + configs(named: [String]): ConfigsConnection + actor: Actor + allTimezones: [TimezoneInfo] + isFbEmployee: Boolean + newsFeed(after: ID, first: Int, find: ID): NewsFeedConnection + notificationStories(after: ID, first: Int): NewsFeedConnection + pendingPosts(first: Int): PendingPostsConnection + primaryEmail: String + timezoneEstimate: TimezoneInfo + marketplace_explore( + marketplace_browse_context: MarketplaceBrowseContext, + with_price_between: [Float], + ): MarketplaceExploreConnection +} + +type MarketplaceExploreConnection { + count: Int +} + +type ViewerNotificationsUpdateAllSeenStateResponsePayload { + stories: [Story] +} + +enum Environment { + WEB + MOBILE +} + +enum MarketplaceBrowseContext { + BROWSE_FEED + CATEGORY_FEED +} + +enum PhotoSize { + SMALL + LARGE +} + +enum PersonalityTraits { + CHEERFUL + DERISIVE + HELPFUL + SNARKY +} + +enum StoryType { + DIRECTED + UNDIRECTED +} + +enum TopLevelCommentsOrdering { + chronological + ranked_threaded + recent_activity + toplevel +} + +type Settings { + cache_id: ID + notificationSounds: Boolean + notifications(environment: Environment): Boolean +} + +directive @customDirective(level: Int!) on FIELD \ No newline at end of file diff --git a/transform/test/testschema.old.graphql b/transform/test/testschema.old.graphql new file mode 100644 index 00000000..5ac42117 --- /dev/null +++ b/transform/test/testschema.old.graphql @@ -0,0 +1,193 @@ +type Root { + customScalar(arg: JSON): [SearchResult] + node(id: ID!): Node + nodes(ids: [ID!]): [Node] + media(id: Int): Media + viewer: Viewer + search(query: SearchInput!): [SearchResult] + searchAll(queries: [SearchInput!]!): [SearchResult] + _invalid: InvalidType + actor: Actor +} + +scalar JSON + +interface Actor { + name: String +} + +type InvalidType { + node(id: Int): Node +} + +type SearchResult { + title: String +} + +input SearchInput { + queryText: String +} + +type Mutation { + actorSubscribe(input: ActorSubscribeInput): ActorSubscribeResponsePayload + actorSubscribeSubscribe(input: ActorSubscribeInput!): ActorSubscribeResponsePayload + mutationMissingArg: FakeResponsePayload + mutationWrongArgs(foo: String): FakeResponsePayload +} + +input ActorSubscribeInput { + clientMutationId: String + actorId: String +} + +type ActorSubscribeResponsePayload { + clientMutationId: String + actor: User +} + +type FakeResponsePayload { + clientMutationId: String +} + +type Subscription { + likeStory(input: LikeStorySubscriptionInput): LikeStorySubscriptionPayload +} + +input LikeStorySubscriptionInput { + clientSubscriptionId: String + story: String +} + +type LikeStorySubscriptionPayload { + clientSubscriptionId: String + doesViewerLike: Boolean +} + +type ActorSubscribeSubscription { + clientMutationId: String +} + +type Viewer { + configs: ConfigsConnection + newsFeed(first: Int): NewsFeedConnection + pendingPosts(first: Int): PendingPostsConnection + actor: User +} + +type ConfigsConnection { + edges: [ConfigsConnectionEdge] +} + +type ConfigsConnectionEdge { + cursor: String + node: Config +} + +type Config { + name: String +} + +type NewsFeedConnection { + edges: [NewsFeedConnectionEdge] + pageInfo: PageInfo +} + +type NewsFeedConnectionEdge { + cursor: String + node: Node +} + +type Story implements Node { + message: String + actors: [User] + attachments: [Node] + id: String +} + +type PendingPostsConnection { + count: Int + edges: [PendingPostsConnectionEdge] + pageInfo: PageInfo +} + +type PendingPostsConnectionEdge { + cursor: String + node: PendingPost +} + +type PendingPost { + text: String +} + +type UserConnection { + count: Int + edges: [UserConnectionEdge] + nodes: [User] + pageInfo: PageInfo +} + +type UserConnectionEdge { + cursor: String + node: User + source: User +} + +interface Node { + id: String +} + +type User implements Node Actor { + friends(first: Int, last: Int, orderby: [String], find: String, isViewerFriend: Boolean, gender: Gender, before: ID, after: ID): UserConnection + id: String + name: String + profilePicture(size: Int): ProfilePicture + websites: [String] + userOnlyField: String + gender: Gender + firstName(if: Boolean, unless: Boolean): String + fakeConnection: FakeConnection +} + +type Page implements Actor { + name: String +} + +type FakeConnection { + edges: [FakeEdge] +} + +type FakeEdge { + cursor: String + node: FakeNode +} + +type FakeNode implements Node { + id: String +} + +type ProfilePicture { + uri: String + width: Int + height: Int +} + +type PageInfo { + hasPreviousPage: Boolean + hasNextPage: Boolean + endCursor: String + startCursor: String +} + +enum Gender { + MALE, + FEMALE, + UNKNOWN +} + +union Media = Story | ProfilePicture + +schema { + query: Root + mutation: Mutation + subscription: Subscription +} \ No newline at end of file diff --git a/transform/tsconfig.json b/transform/tsconfig.json new file mode 100644 index 00000000..f9cea6aa --- /dev/null +++ b/transform/tsconfig.json @@ -0,0 +1,56 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "lib": [ + "es2015", + "esnext.asynciterable" + ], /* Specify library files to be included in the compilation: */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./lib", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + /* Source Map Options */ + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/transform/yarn.lock b/transform/yarn.lock new file mode 100644 index 00000000..27643f52 --- /dev/null +++ b/transform/yarn.lock @@ -0,0 +1,3884 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.38" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.38.tgz#c0af5930617e55e050336838e3a3670983b0b2b2" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@types/jest@^22.0.1": + version "22.0.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.0.1.tgz#6370a6d60cce3845e4cd5d00bf65f654264685bc" + +"@types/node@*", "@types/node@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" + +abab@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +acorn-globals@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.0.0" + +acorn@^5.0.0, acorn@^5.1.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0, ansi-styles@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + +async-each@^1.0.0, async-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.18.0, babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.1.0.tgz#7fae6f655fffe77e818a8c2868c754a42463fdfd" + dependencies: + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^22.1.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^4.1.4, babel-plugin-istanbul@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.5" + test-exclude "^4.1.1" + +babel-plugin-jest-hoist@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.1.0.tgz#c1281dd7887d77a1711dc760468c3b8285dde9ee" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-jsx@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-class-properties@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.8.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-for-of@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.8.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-object-super@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-template-literals@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es3-member-expression-literals@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz#733d3444f3ecc41bef8ed1a6a4e09657b8969ebb" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es3-property-literals@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz#b2078d5842e22abf40f73e8cde9cd3711abd5758" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.8.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-display-name@^6.8.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.20.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-fbjs@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.1.4.tgz#22f358e6654073acf61e47a052a777d7bccf03af" + dependencies: + babel-plugin-check-es2015-constants "^6.8.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-plugin-syntax-flow "^6.8.0" + babel-plugin-syntax-jsx "^6.8.0" + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-plugin-syntax-trailing-function-commas "^6.8.0" + babel-plugin-transform-class-properties "^6.8.0" + babel-plugin-transform-es2015-arrow-functions "^6.8.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.8.0" + babel-plugin-transform-es2015-block-scoping "^6.8.0" + babel-plugin-transform-es2015-classes "^6.8.0" + babel-plugin-transform-es2015-computed-properties "^6.8.0" + babel-plugin-transform-es2015-destructuring "^6.8.0" + babel-plugin-transform-es2015-for-of "^6.8.0" + babel-plugin-transform-es2015-function-name "^6.8.0" + babel-plugin-transform-es2015-literals "^6.8.0" + babel-plugin-transform-es2015-modules-commonjs "^6.8.0" + babel-plugin-transform-es2015-object-super "^6.8.0" + babel-plugin-transform-es2015-parameters "^6.8.0" + babel-plugin-transform-es2015-shorthand-properties "^6.8.0" + babel-plugin-transform-es2015-spread "^6.8.0" + babel-plugin-transform-es2015-template-literals "^6.8.0" + babel-plugin-transform-es3-member-expression-literals "^6.8.0" + babel-plugin-transform-es3-property-literals "^6.8.0" + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-plugin-transform-object-rest-spread "^6.8.0" + babel-plugin-transform-react-display-name "^6.8.0" + babel-plugin-transform-react-jsx "^6.8.0" + +babel-preset-jest@^22.0.1, babel-preset-jest@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.1.0.tgz#ff4e704102f9642765e2254226050561d8942ec9" + dependencies: + babel-plugin-jest-hoist "^22.1.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bash-glob@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bash-glob/-/bash-glob-1.0.2.tgz#95ac5631fdd7a8fc569f267167a84eb831979a1b" + dependencies: + async-each "^1.0.1" + bash-path "^1.0.1" + component-emitter "^1.2.1" + cross-spawn "^5.1.0" + extend-shallow "^2.0.1" + is-extglob "^2.1.1" + is-glob "^4.0.0" + +bash-path@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bash-path/-/bash-path-1.0.3.tgz#dbc9efbdf18b1c11413dcb59b960e6aa56c84258" + dependencies: + arr-union "^3.1.0" + is-windows "^1.0.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + 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" + +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type-parser@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + +convert-source-map@^1.4.0, convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cpx@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" + dependencies: + babel-runtime "^6.9.2" + chokidar "^1.6.0" + duplexer "^0.1.1" + glob "^7.0.5" + glob2base "^0.0.12" + minimatch "^3.0.2" + mkdirp "^0.5.1" + resolve "^1.1.7" + safe-buffer "^5.0.1" + shell-quote "^1.6.1" + subarg "^1.0.0" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +diff@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + +domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.5.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es6-promise@^4.1.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.2.tgz#f722d7769af88bd33bc13ec6605e1f92966b82d9" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expect@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.1.0.tgz#f8f9b019ab275d859cbefed531fbaefe8972431d" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.1.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^22.1.0" + jest-message-util "^22.1.0" + jest-regex-util "^22.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-glob@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-1.0.1.tgz#30f9b1120fd57a7f172364a6458fbdbd98187b3c" + dependencies: + bash-glob "^1.0.1" + glob-parent "^3.1.0" + micromatch "^3.0.3" + readdir-enhanced "^1.5.2" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +fbjs@^0.8.14, fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fs-extra@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0, fsevents@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graphql@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.12.3.tgz#11668458bbe28261c0dcb6e265f515ba79f6ce07" + dependencies: + iterall "1.1.3" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +html-encoding-sniffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.19, iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-ci@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + dependencies: + ci-info "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-odd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + dependencies: + is-number "^3.0.0" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.14: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-hook "^1.1.0" + istanbul-lib-instrument "^1.9.1" + istanbul-lib-report "^1.1.2" + istanbul-lib-source-maps "^1.2.2" + istanbul-reports "^1.1.3" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + +istanbul-lib-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.1.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425" + dependencies: + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10" + dependencies: + handlebars "^4.0.3" + +iterall@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.3.tgz#1cbbff96204056dde6656e2ed2e2226d0e6d72c9" + +jest-changed-files@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.1.4.tgz#1f7844bcb739dec07e5899a633c0cb6d5069834e" + dependencies: + throat "^4.0.0" + +jest-cli@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.1.4.tgz#0fe9f3ac881b0cdc00227114c58583a2ebefcc04" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.1.14" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-instrument "^1.8.0" + istanbul-lib-source-maps "^1.2.1" + jest-changed-files "^22.1.4" + jest-config "^22.1.4" + jest-environment-jsdom "^22.1.4" + jest-get-type "^22.1.0" + jest-haste-map "^22.1.0" + jest-message-util "^22.1.0" + jest-regex-util "^22.1.0" + jest-resolve-dependencies "^22.1.0" + jest-runner "^22.1.4" + jest-runtime "^22.1.4" + jest-snapshot "^22.1.2" + jest-util "^22.1.4" + jest-worker "^22.1.0" + micromatch "^2.3.11" + node-notifier "^5.1.2" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^10.0.3" + +jest-config@^22.0.1, jest-config@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.1.4.tgz#075ffacce83c3e38cf85b1b9ba0d21bd3ee27ad0" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^22.1.4" + jest-environment-node "^22.1.4" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.1.4" + jest-regex-util "^22.1.0" + jest-resolve "^22.1.4" + jest-util "^22.1.4" + jest-validate "^22.1.2" + pretty-format "^22.1.0" + +jest-diff@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.1.0.tgz#0fad9d96c87b453896bf939df3dc8aac6919ac38" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^22.1.0" + +jest-docblock@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.1.0.tgz#3fe5986d5444cbcb149746eb4b07c57c5a464dfd" + dependencies: + detect-newline "^2.1.0" + +jest-environment-jsdom@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.1.4.tgz#704518ce8375f7ec5de048d1e9c4268b08a03e00" + dependencies: + jest-mock "^22.1.0" + jest-util "^22.1.4" + jsdom "^11.5.1" + +jest-environment-node@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.1.4.tgz#0f2946e8f8686ce6c5d8fa280ce1cd8d58e869eb" + dependencies: + jest-mock "^22.1.0" + jest-util "^22.1.4" + +jest-get-type@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9" + +jest-haste-map@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.1.0.tgz#1174c6ff393f9818ebf1163710d8868b5370da2a" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^22.1.0" + jest-worker "^22.1.0" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.1.4.tgz#cada0baf50a220c616a9575728b80d4ddedebe8b" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^22.1.0" + graceful-fs "^4.1.11" + is-generator-fn "^1.0.0" + jest-diff "^22.1.0" + jest-matcher-utils "^22.1.0" + jest-message-util "^22.1.0" + jest-snapshot "^22.1.2" + source-map-support "^0.5.0" + +jest-leak-detector@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.1.0.tgz#08376644cee07103da069baac19adb0299b772c2" + dependencies: + pretty-format "^22.1.0" + +jest-matcher-utils@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.1.0.tgz#e164665b5d313636ac29f7f6fe9ef0a6ce04febc" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^22.1.0" + +jest-message-util@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.1.0.tgz#51ba0794cb6e579bfc4e9adfac452f9f1a0293fc" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.1.0.tgz#87ec21c0599325671c9a23ad0e05c86fb5879b61" + +jest-regex-util@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53" + +jest-resolve-dependencies@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31" + dependencies: + jest-regex-util "^22.1.0" + +jest-resolve@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.1.4.tgz#72b9b371eaac48f84aad4ad732222ffe37692602" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + +jest-runner@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.1.4.tgz#e039039110cb1b31febc0f99e349bf7c94304a2f" + dependencies: + exit "^0.1.2" + jest-config "^22.1.4" + jest-docblock "^22.1.0" + jest-haste-map "^22.1.0" + jest-jasmine2 "^22.1.4" + jest-leak-detector "^22.1.0" + jest-message-util "^22.1.0" + jest-runtime "^22.1.4" + jest-util "^22.1.4" + jest-worker "^22.1.0" + throat "^4.0.0" + +jest-runtime@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.1.4.tgz#1474d9f5cda518b702e0b25a17d4ef3fc563a20c" + dependencies: + babel-core "^6.0.0" + babel-jest "^22.1.0" + babel-plugin-istanbul "^4.1.5" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^22.1.4" + jest-haste-map "^22.1.0" + jest-regex-util "^22.1.0" + jest-resolve "^22.1.4" + jest-util "^22.1.4" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^10.0.3" + +jest-snapshot@^22.1.2: + version "22.1.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.1.2.tgz#b270cf6e3098f33aceeafda02b13eb0933dc6139" + dependencies: + chalk "^2.0.1" + jest-diff "^22.1.0" + jest-matcher-utils "^22.1.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^22.1.0" + +jest-util@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.1.4.tgz#ac8cbd43ee654102f1941f3f0e9d1d789a8b6a9b" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^22.1.0" + jest-validate "^22.1.2" + mkdirp "^0.5.1" + +jest-validate@^22.1.2: + version "22.1.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.1.2.tgz#c3b06bcba7bd9a850919fe336b5f2a8c3a239404" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^22.1.0" + +jest-worker@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.1.0.tgz#0987832fe58fbdc205357f4c19b992446368cafb" + dependencies: + merge-stream "^1.0.1" + +jest@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-22.1.4.tgz#9ec71373a38f40ff92a3e5e96ae85687c181bb72" + dependencies: + jest-cli "^22.1.4" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.7.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^11.5.1: + version "11.5.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929" + dependencies: + abab "^1.0.3" + acorn "^5.1.2" + acorn-globals "^4.0.0" + array-equal "^1.0.0" + browser-process-hrtime "^0.1.2" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.1" + left-pad "^1.2.0" + nwmatcher "^1.4.3" + parse5 "^3.0.2" + pn "^1.0.0" + request "^2.83.0" + request-promise-native "^1.0.3" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.3" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.1" + whatwg-url "^6.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + dependencies: + set-getter "^0.1.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +left-pad@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, loose-envify@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.0.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.0" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^2.0.2" + fragment-cache "^0.2.1" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mixin-deep@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +nan@^2.3.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + +nanomatch@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + is-odd "^1.0.0" + kind-of "^5.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +nwmatcher@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + dependencies: + "@types/node" "*" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.1.0.tgz#2277605b40ed4529ae4db51ff62f4be817647914" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.5.8: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +rc@^1.1.7: + version "1.2.4" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.4.tgz#a0f606caae2a3b862bbd0ef85482c0125b315fa3" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readdir-enhanced@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz#61463048690ac6a455b75b62fa78a88f8dc85e53" + dependencies: + call-me-maybe "^1.0.1" + es6-promise "^4.1.0" + glob-to-regexp "^0.3.0" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +realpath-native@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" + dependencies: + util.promisify "^1.0.0" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + dependencies: + extend-shallow "^2.0.1" + +relay-compiler@1.5.0-rc.1: + version "1.5.0-rc.1" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-1.5.0-rc.1.tgz#609d38ff7a817a9df508be62cfe376b4619c1093" + dependencies: + babel-generator "^6.26.0" + babel-polyfill "^6.20.0" + babel-preset-fbjs "^2.1.4" + babel-runtime "^6.23.0" + babel-traverse "^6.26.0" + babel-types "^6.24.1" + babylon "^6.18.0" + chalk "^1.1.1" + fast-glob "^1.0.1" + fb-watchman "^2.0.0" + fbjs "^0.8.14" + graphql "^0.12.3" + immutable "~3.7.6" + relay-runtime "1.5.0-rc.1" + signedsource "^1.0.0" + yargs "^9.0.0" + +relay-runtime@1.5.0-rc.1: + version "1.5.0-rc.1" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-1.5.0-rc.1.tgz#9f2b31f59ef7d2b42028237df1aa1182b54b0c78" + dependencies: + babel-runtime "^6.23.0" + fbjs "^0.8.14" + +relay-test-utils@^1.5.0-rc.1: + version "1.5.0-rc.1" + resolved "https://registry.yarnpkg.com/relay-test-utils/-/relay-test-utils-1.5.0-rc.1.tgz#6d14ccdf48a8a58e3e7aca507913c79954c8cfad" + dependencies: + babel-runtime "^6.23.0" + fbjs "^0.8.14" + prop-types "^15.5.8" + relay-compiler "1.5.0-rc.1" + relay-runtime "1.5.0-rc.1" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@^2.83.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.7: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +sane@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.1.1" + +sax@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + dependencies: + to-object-path "^0.3.0" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^2.0.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.2.tgz#1a6297fd5b2e762b39688c7fc91233b60984f0a5" + dependencies: + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^1.0.0" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +tr46@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +ts-jest@^22.0.1: + version "22.0.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.0.1.tgz#48942936a466c2e76e259b02e2f1356f1839afc3" + dependencies: + babel-core "^6.24.1" + babel-plugin-istanbul "^4.1.4" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-preset-jest "^22.0.1" + cpx "^1.5.0" + fs-extra "4.0.3" + jest-config "^22.0.1" + pkg-dir "^2.0.0" + source-map-support "^0.5.0" + yargs "^10.0.3" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +typescript@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" + +ua-parser-js@^0.7.9: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +whatwg-encoding@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + +whatwg-url@^6.3.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.0" + webidl-conversions "^4.0.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@^1.2.12, which@^1.2.9, which@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.1.tgz#5fe1ea306985a099b33492001fa19a1e61efe285" + dependencies: + 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@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^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 "^7.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0"