@khanacademy/graphql-flow 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/Readme.md +67 -67
- package/dist/cli/config.js +73 -0
- package/dist/cli/config.js.flow +104 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/run.js +157 -0
- package/dist/cli/run.js.flow +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/enums.js +2 -1
- package/dist/enums.js.map +1 -0
- package/dist/generateResponseType.js +170 -60
- package/dist/generateResponseType.js.flow +248 -82
- package/dist/generateResponseType.js.map +1 -0
- package/dist/generateTypeFiles.js +141 -0
- package/dist/generateTypeFiles.js.flow +167 -0
- package/dist/generateTypeFiles.js.map +1 -0
- package/dist/generateVariablesType.js +8 -1
- package/dist/generateVariablesType.js.flow +6 -0
- package/dist/generateVariablesType.js.map +1 -0
- package/dist/index.js +45 -4
- package/dist/index.js.flow +54 -4
- package/dist/index.js.map +1 -0
- package/dist/jest-mock-graphql-tag.js +42 -123
- package/dist/jest-mock-graphql-tag.js.flow +50 -145
- package/dist/jest-mock-graphql-tag.js.map +1 -0
- package/dist/parser/parse.js +349 -0
- package/dist/parser/parse.js.flow +403 -0
- package/dist/parser/parse.js.map +1 -0
- package/dist/parser/resolve.js +111 -0
- package/dist/parser/resolve.js.flow +117 -0
- package/dist/parser/resolve.js.map +1 -0
- package/dist/schemaFromIntrospectionData.js +2 -1
- package/dist/schemaFromIntrospectionData.js.map +1 -0
- package/dist/types.js +2 -1
- package/dist/types.js.flow +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.js +2 -1
- package/dist/utils.js.map +1 -0
- package/package.json +13 -9
- package/src/__test__/example-schema.graphql +3 -1
- package/src/__test__/generateTypeFileContents.test.js +61 -0
- package/src/__test__/graphql-flow.test.js +329 -54
- package/src/__test__/{jest-mock-graphql-tag.test.js → processPragmas.test.js} +13 -1
- package/src/cli/config.js +104 -0
- package/src/cli/run.js +164 -0
- package/src/generateResponseType.js +248 -82
- package/src/generateTypeFiles.js +167 -0
- package/src/generateVariablesType.js +6 -0
- package/src/index.js +54 -4
- package/src/jest-mock-graphql-tag.js +50 -145
- package/src/parser/__test__/parse.test.js +247 -0
- package/src/parser/parse.js +403 -0
- package/src/parser/resolve.js +117 -0
- package/src/types.js +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/parser/resolve.js"],"names":["resolveDocuments","files","resolved","errors","Object","keys","forEach","path","file","operations","op","resolveGqlTemplate","source","locals","k","local","type","resolveImport","expr","seen","push","loc","message","join","res","exports","name","value","template","key","line","map","expressions","length","literals","document","includes","raw"],"mappings":"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","sourcesContent":["// @flow\nimport gql from 'graphql-tag';\nimport type {DocumentNode} from 'graphql/language/ast';\nimport type {FileResult, Files, Import, Template, Document} from './parse';\n\nexport type Resolved = {\n [key: string]: {\n document: DocumentNode,\n raw: Template,\n },\n};\n\nexport const resolveDocuments = (\n files: Files,\n): {resolved: Resolved, errors: FileResult['errors']} => {\n const resolved: Resolved = {};\n const errors: FileResult['errors'] = [];\n Object.keys(files).forEach((path) => {\n const file = files[path];\n file.operations.forEach((op) => {\n resolveGqlTemplate(op.source, files, errors, resolved, {});\n });\n Object.keys(file.locals).forEach((k) => {\n const local = file.locals[k];\n if (local.type === 'document') {\n resolveGqlTemplate(local.source, files, errors, resolved, {});\n }\n });\n });\n return {resolved, errors};\n};\n\nconst resolveImport = (\n expr: Import,\n files: Files,\n errors: FileResult['errors'],\n seen: {[key: string]: true},\n): ?Document => {\n if (seen[expr.path]) {\n errors.push({\n loc: expr.loc,\n message: `Circular import ${Object.keys(seen).join(' -> ')} -> ${\n expr.path\n }`,\n });\n return null;\n }\n seen[expr.path] = true;\n const res = files[expr.path];\n if (!res) {\n errors.push({loc: expr.loc, message: `No file ${expr.path}`});\n return null;\n }\n if (!res.exports[expr.name]) {\n errors.push({\n loc: expr.loc,\n message: `${expr.path} has no valid gql export ${expr.name}`,\n });\n return null;\n }\n const value = res.exports[expr.name];\n if (value.type === 'import') {\n return resolveImport(value, files, errors, seen);\n }\n return value;\n};\n\nconst resolveGqlTemplate = (\n template: Template,\n files: Files,\n errors: FileResult['errors'],\n resolved: Resolved,\n seen: {[key: string]: Template},\n): ?DocumentNode => {\n const key = template.loc.path + ':' + template.loc.line;\n if (seen[key]) {\n errors.push({\n loc: template.loc,\n message: `Recursive template dependency! ${Object.keys(seen)\n .map(\n (k) =>\n k +\n ' ~ ' +\n seen[k].expressions.length +\n ',' +\n seen[k].literals.length,\n )\n .join(' -> ')} -> ${key}`,\n });\n return null;\n }\n seen[key] = template;\n if (resolved[key]) {\n return resolved[key].document;\n }\n const expressions = template.expressions.map((expr) => {\n if (expr.type === 'import') {\n const document = resolveImport(expr, files, errors, {});\n return document\n ? resolveGqlTemplate(document.source, files, errors, resolved, {\n ...seen,\n })\n : null;\n }\n return resolveGqlTemplate(expr.source, files, errors, resolved, {\n ...seen,\n });\n });\n if (expressions.includes(null)) {\n return null;\n }\n resolved[key] = {\n document: gql(template.literals, ...expressions),\n raw: template,\n };\n return resolved[key].document;\n};\n"],"file":"resolve.js"}
|
|
@@ -66,4 +66,5 @@ const schemaFromIntrospectionData = schema => {
|
|
|
66
66
|
return result;
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
-
exports.schemaFromIntrospectionData = schemaFromIntrospectionData;
|
|
69
|
+
exports.schemaFromIntrospectionData = schemaFromIntrospectionData;
|
|
70
|
+
//# sourceMappingURL=schemaFromIntrospectionData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemaFromIntrospectionData.js"],"names":["schemaFromIntrospectionData","schema","result","interfacesByName","typesByName","inputObjectsByName","unionsByName","enumsByName","__schema","types","forEach","type","kind","name","possibleTypesByName","fieldsByName","possibleTypes","p","fields","field"],"mappings":";;;;;;;AACA;AACA;AACA;AACA;AAIO,MAAMA,2BAA2B,GACpCC,MADuC,IAE9B;AACT,QAAMC,MAAc,GAAG;AACnBC,IAAAA,gBAAgB,EAAE,EADC;AAEnBC,IAAAA,WAAW,EAAE,EAFM;AAGnBC,IAAAA,kBAAkB,EAAE,EAHD;AAInBC,IAAAA,YAAY,EAAE,EAJK;AAKnBC,IAAAA,WAAW,EAAE;AALM,GAAvB;;AAQAN,EAAAA,MAAM,CAACO,QAAP,CAAgBC,KAAhB,CAAsBC,OAAtB,CAA+BC,IAAD,IAAU;AACpC,QAAIA,IAAI,CAACC,IAAL,KAAc,MAAlB,EAA0B;AACtBV,MAAAA,MAAM,CAACK,WAAP,CAAmBI,IAAI,CAACE,IAAxB,IAAgCF,IAAhC;AACA;AACH;;AACD,QAAIA,IAAI,CAACC,IAAL,KAAc,OAAlB,EAA2B;AACvBV,MAAAA,MAAM,CAACI,YAAP,CAAoBK,IAAI,CAACE,IAAzB,IAAiCF,IAAjC;AACA;AACH;;AACD,QAAIA,IAAI,CAACC,IAAL,KAAc,WAAlB,EAA+B;AAC3BV,MAAAA,MAAM,CAACC,gBAAP,CAAwBQ,IAAI,CAACE,IAA7B,IAAqC,EACjC,GAAGF,IAD8B;AAEjCG,QAAAA,mBAAmB,EAAE,EAFY;AAGjCC,QAAAA,YAAY,EAAE;AAHmB,OAArC;AAKAJ,MAAAA,IAAI,CAACK,aAAL,CAAmBN,OAAnB,CACKO,CAAD,IACKf,MAAM,CAACC,gBAAP,CAAwBQ,IAAI,CAACE,IAA7B,EAAmCC,mBAAnC,CACGG,CAAC,CAACJ,IADL,IAEG,IAJZ;AAMAF,MAAAA,IAAI,CAACO,MAAL,CAAYR,OAAZ,CAAqBS,KAAD,IAAW;AAC3BjB,QAAAA,MAAM,CAACC,gBAAP,CAAwBQ,IAAI,CAACE,IAA7B,EAAmCE,YAAnC,CAAgDI,KAAK,CAACN,IAAtD,IACIM,KADJ;AAEH,OAHD;AAIA;AACH;;AACD,QAAIR,IAAI,CAACC,IAAL,KAAc,cAAlB,EAAkC;AAC9BV,MAAAA,MAAM,CAACG,kBAAP,CAA0BM,IAAI,CAACE,IAA/B,IAAuCF,IAAvC;AACA;AACH;;AACD,QAAIA,IAAI,CAACC,IAAL,KAAc,QAAlB,EAA4B;AACxB;AACH;;AACDV,IAAAA,MAAM,CAACE,WAAP,CAAmBO,IAAI,CAACE,IAAxB,IAAgC,EAC5B,GAAGF,IADyB;AAE5BI,MAAAA,YAAY,EAAE;AAFc,KAAhC;;AAIA,QAAI,CAACJ,IAAI,CAACO,MAAV,EAAkB;AACd;AACH;;AAEDP,IAAAA,IAAI,CAACO,MAAL,CAAYR,OAAZ,CAAqBS,KAAD,IAAW;AAC3BjB,MAAAA,MAAM,CAACE,WAAP,CAAmBO,IAAI,CAACE,IAAxB,EAA8BE,YAA9B,CAA2CI,KAAK,CAACN,IAAjD,IAAyDM,KAAzD;AACH,KAFD;AAGH,GA7CD;;AA+CA,SAAOjB,MAAP;AACH,CA3DM","sourcesContent":["// @flow\n/**\n * Takes the introspectionQuery response and parses it into the \"Schema\"\n * type that we use to look up types, interfaces, etc.\n */\nimport type {IntrospectionQuery} from 'graphql';\nimport type {Schema} from './types';\n\nexport const schemaFromIntrospectionData = (\n schema: IntrospectionQuery,\n): Schema => {\n const result: Schema = {\n interfacesByName: {},\n typesByName: {},\n inputObjectsByName: {},\n unionsByName: {},\n enumsByName: {},\n };\n\n schema.__schema.types.forEach((type) => {\n if (type.kind === 'ENUM') {\n result.enumsByName[type.name] = type;\n return;\n }\n if (type.kind === 'UNION') {\n result.unionsByName[type.name] = type;\n return;\n }\n if (type.kind === 'INTERFACE') {\n result.interfacesByName[type.name] = {\n ...type,\n possibleTypesByName: {},\n fieldsByName: {},\n };\n type.possibleTypes.forEach(\n (p) =>\n (result.interfacesByName[type.name].possibleTypesByName[\n p.name\n ] = true),\n );\n type.fields.forEach((field) => {\n result.interfacesByName[type.name].fieldsByName[field.name] =\n field;\n });\n return;\n }\n if (type.kind === 'INPUT_OBJECT') {\n result.inputObjectsByName[type.name] = type;\n return;\n }\n if (type.kind === 'SCALAR') {\n return;\n }\n result.typesByName[type.name] = {\n ...type,\n fieldsByName: {},\n };\n if (!type.fields) {\n return;\n }\n\n type.fields.forEach((field) => {\n result.typesByName[type.name].fieldsByName[field.name] = field;\n });\n });\n\n return result;\n};\n"],"file":"schemaFromIntrospectionData.js"}
|
package/dist/types.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
package/dist/types.js.flow
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
+
import type {BabelNode} from '@babel/types';
|
|
3
4
|
import type {
|
|
4
5
|
FragmentDefinitionNode,
|
|
5
6
|
IntrospectionEnumType,
|
|
@@ -14,9 +15,13 @@ import type {
|
|
|
14
15
|
export type Selections = $ReadOnlyArray<SelectionNode>;
|
|
15
16
|
|
|
16
17
|
export type Options = {|
|
|
18
|
+
regenerateCommand?: string,
|
|
17
19
|
strictNullability?: boolean, // default true
|
|
18
20
|
readOnlyArray?: boolean, // default true
|
|
19
21
|
scalars?: Scalars,
|
|
22
|
+
splitTypes?: boolean,
|
|
23
|
+
generatedDirectory?: string,
|
|
24
|
+
exportAllObjectTypes?: boolean,
|
|
20
25
|
|};
|
|
21
26
|
|
|
22
27
|
export type Schema = {
|
|
@@ -43,6 +48,7 @@ export type Schema = {
|
|
|
43
48
|
};
|
|
44
49
|
|
|
45
50
|
export type Config = {
|
|
51
|
+
path: Array<string>,
|
|
46
52
|
strictNullability: boolean,
|
|
47
53
|
readOnlyArray: boolean,
|
|
48
54
|
fragments: {[key: string]: FragmentDefinitionNode},
|
|
@@ -50,5 +56,6 @@ export type Config = {
|
|
|
50
56
|
schema: Schema,
|
|
51
57
|
scalars: Scalars,
|
|
52
58
|
errors: Array<string>,
|
|
59
|
+
allObjectTypes: null | {[key: string]: BabelNode},
|
|
53
60
|
};
|
|
54
61
|
export type Scalars = {[key: string]: 'string' | 'number' | 'boolean'};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"types.js"}
|
package/dist/utils.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.js"],"names":["liftLeadingPropertyComments","property","transferLeadingComments","value","maybeAddDescriptionComment","description","node","addCommentAsLineComments","res","leadingComments","length","babelTypes","addComment","source","dest"],"mappings":";;;;;;;;AAEA;;;;;;AAGO,MAAMA,2BAA2B,GACpCC,QADuC,IAET;AAC9B,SAAOC,uBAAuB,CAACD,QAAQ,CAACE,KAAV,EAAiBF,QAAjB,CAA9B;AACH,CAJM;;;;AAMA,MAAMG,0BAA0B,GAAG,CACtCC,WADsC,EAEtCC,IAFsC,KAGlC;AACJ,MAAID,WAAJ,EAAiB;AACbE,IAAAA,wBAAwB,CAACF,WAAD,EAAcC,IAAd,CAAxB;AACH;;AACD,SAAOA,IAAP;AACH,CARM;;;;AAUA,SAASC,wBAAT,CACHF,WADG,EAEHG,GAFG,EAGL;AAAA;;AACE,8BAAIA,GAAG,CAACC,eAAR,iDAAI,qBAAqBC,MAAzB,EAAiC;AAC7BF,IAAAA,GAAG,CAACC,eAAJ,CAAoB,CAApB,EAAuBN,KAAvB,IAAgC,gBAAgBE,WAAhD;AACH,GAFD,MAEO;AACHM,IAAAA,UAAU,CAACC,UAAX,CACIJ,GADJ,EAEI,SAFJ,EAGI,OAAOH,WAHX,EAII,KAJJ,CAIW;AAJX;AAMH;AACJ;;AAEM,MAAMH,uBAAuB,GAAG,CACnCW,MADmC,EAEnCC,IAFmC,KAG/B;AAAA;;AACJ,+BAAID,MAAM,CAACJ,eAAX,kDAAI,sBAAwBC,MAA5B,EAAoC;AAChCI,IAAAA,IAAI,CAACL,eAAL,GAAuB,CACnB,IAAIK,IAAI,CAACL,eAAL,IAAwB,EAA5B,CADmB,EAEnB,GAAGI,MAAM,CAACJ,eAFS,CAAvB;AAIAI,IAAAA,MAAM,CAACJ,eAAP,GAAyB,EAAzB;AACH;;AACD,SAAOK,IAAP;AACH,CAZM","sourcesContent":["// @flow\n\nimport * as babelTypes from '@babel/types';\nimport {BabelNodeObjectTypeProperty} from '@babel/types';\n\nexport const liftLeadingPropertyComments = (\n property: BabelNodeObjectTypeProperty,\n): BabelNodeObjectTypeProperty => {\n return transferLeadingComments(property.value, property);\n};\n\nexport const maybeAddDescriptionComment = <T: babelTypes.BabelNode>(\n description: ?string,\n node: T,\n): T => {\n if (description) {\n addCommentAsLineComments(description, node);\n }\n return node;\n};\n\nexport function addCommentAsLineComments(\n description: string,\n res: babelTypes.BabelNode,\n) {\n if (res.leadingComments?.length) {\n res.leadingComments[0].value += '\\n\\n---\\n\\n' + description;\n } else {\n babelTypes.addComment(\n res,\n 'leading',\n '* ' + description,\n false, // this specifies that it's a block comment, not a line comment\n );\n }\n}\n\nexport const transferLeadingComments = <T: babelTypes.BabelNode>(\n source: babelTypes.BabelNode,\n dest: T,\n): T => {\n if (source.leadingComments?.length) {\n dest.leadingComments = [\n ...(dest.leadingComments || []),\n ...source.leadingComments,\n ];\n source.leadingComments = [];\n }\n return dest;\n};\n"],"file":"utils.js"}
|
package/package.json
CHANGED
|
@@ -1,40 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@khanacademy/graphql-flow",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"bin": {
|
|
5
|
+
"graphql-flow": "./dist/cli/run.js"
|
|
6
|
+
},
|
|
4
7
|
"scripts": {
|
|
5
8
|
"test": "jest",
|
|
6
9
|
"publish:ci": "yarn run build && yarn run copy-flow && changeset publish",
|
|
7
|
-
"build": "babel src --out-dir dist --ignore 'src/**/*.spec.js','src/**/*.test.js'",
|
|
10
|
+
"build": "babel src --out-dir dist --source-maps --ignore 'src/**/*.spec.js','src/**/*.test.js'",
|
|
8
11
|
"copy-flow": "node ./build-copy-source.js"
|
|
9
12
|
},
|
|
10
13
|
"main": "dist/index.js",
|
|
11
14
|
"devDependencies": {
|
|
12
15
|
"@babel/cli": "^7.17.6",
|
|
13
16
|
"@babel/eslint-parser": "^7.17.0",
|
|
17
|
+
"@babel/polyfill": "^7.0.0",
|
|
18
|
+
"@babel/preset-env": "^7.16.11",
|
|
19
|
+
"@babel/preset-flow": "^7.16.7",
|
|
14
20
|
"@changesets/cli": "^2.21.1",
|
|
15
21
|
"@khanacademy/eslint-config": "^0.1.0",
|
|
22
|
+
"babel-jest": "23.4.2",
|
|
16
23
|
"eslint": "8.7.0",
|
|
17
24
|
"eslint-config-prettier": "7.0.0",
|
|
25
|
+
"eslint-plugin-flowtype": "^8.0.3",
|
|
18
26
|
"eslint-plugin-flowtype-errors": "^4.5.0",
|
|
19
27
|
"eslint-plugin-jsx-a11y": "^6.5.1",
|
|
20
28
|
"eslint-plugin-prettier": "^4.0.0",
|
|
21
29
|
"eslint-plugin-react": "^7.29.2",
|
|
22
30
|
"eslint-plugin-react-hooks": "^4.3.0",
|
|
23
31
|
"flow-bin": "^0.172.0",
|
|
32
|
+
"graphql-tag": "2.10.1",
|
|
24
33
|
"jest": "^27.5.1"
|
|
25
34
|
},
|
|
26
35
|
"dependencies": {
|
|
27
36
|
"@babel/core": "^7.6.2",
|
|
28
37
|
"@babel/generator": "^7.17.3",
|
|
29
|
-
"@babel/
|
|
30
|
-
"@babel/preset-env": "^7.16.11",
|
|
31
|
-
"@babel/preset-flow": "^7.16.7",
|
|
38
|
+
"@babel/traverse": "^7.17.3",
|
|
32
39
|
"@babel/types": "^7.17.0",
|
|
33
40
|
"apollo-utilities": "^1.3.4",
|
|
34
|
-
"
|
|
35
|
-
"eslint-plugin-flowtype": "^8.0.3",
|
|
36
|
-
"graphql": "14.2.1",
|
|
37
|
-
"graphql-tag": "2.10.1",
|
|
41
|
+
"graphql": "14.5.8",
|
|
38
42
|
"prettier": "^2.5.1",
|
|
39
43
|
"prettier-eslint": "^13.0.0"
|
|
40
44
|
}
|
|
@@ -35,7 +35,7 @@ type Droid implements Character {
|
|
|
35
35
|
friends: [Character]
|
|
36
36
|
appearsIn: [Episode]
|
|
37
37
|
"""The robot's primary function"""
|
|
38
|
-
primaryFunction: String
|
|
38
|
+
primaryFunction: String!
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
type Animal {
|
|
@@ -49,6 +49,7 @@ type Query {
|
|
|
49
49
|
human(id: String!): Human
|
|
50
50
|
droid(id: String!): Droid
|
|
51
51
|
friend(id: String!): Friendable
|
|
52
|
+
candies(number: PositiveNumber!): String
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
"""A character to add"""
|
|
@@ -58,6 +59,7 @@ input CharacterInput {
|
|
|
58
59
|
"""The character's friends"""
|
|
59
60
|
friends: [ID!]
|
|
60
61
|
appearsIn: [Episode!]
|
|
62
|
+
candies: PositiveNumber!
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
type Mutation {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
// Test the generate the type file contents
|
|
3
|
+
|
|
4
|
+
import {getSchemas} from '../cli/config';
|
|
5
|
+
import {generateTypeFileContents, indexPrelude} from '../generateTypeFiles';
|
|
6
|
+
import gql from 'graphql-tag';
|
|
7
|
+
|
|
8
|
+
const [_, exampleSchema] = getSchemas(__dirname + '/example-schema.graphql');
|
|
9
|
+
|
|
10
|
+
describe('generateTypeFileContents', () => {
|
|
11
|
+
it('split types should export response & variables types', () => {
|
|
12
|
+
const {indexContents, files} = generateTypeFileContents(
|
|
13
|
+
'hello.js',
|
|
14
|
+
exampleSchema,
|
|
15
|
+
gql`
|
|
16
|
+
query Hello {
|
|
17
|
+
human(id: "Han") {
|
|
18
|
+
id
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
{splitTypes: true},
|
|
23
|
+
'__generated__',
|
|
24
|
+
indexPrelude('yarn queries'),
|
|
25
|
+
);
|
|
26
|
+
expect(indexContents).toMatchInlineSnapshot(`
|
|
27
|
+
"// @flow
|
|
28
|
+
//
|
|
29
|
+
// AUTOGENERATED
|
|
30
|
+
// NOTE: New response types are added to this file automatically.
|
|
31
|
+
// Outdated response types can be removed manually as they are deprecated.
|
|
32
|
+
// To regenerate, run yarn queries
|
|
33
|
+
//
|
|
34
|
+
|
|
35
|
+
export type {HelloType} from './Hello.js';
|
|
36
|
+
"
|
|
37
|
+
`);
|
|
38
|
+
expect(
|
|
39
|
+
Object.keys(files)
|
|
40
|
+
.map((k) => `// ${k}\n${files[k]}`)
|
|
41
|
+
.join('\n\n'),
|
|
42
|
+
).toMatchInlineSnapshot(`
|
|
43
|
+
"// __generated__/Hello.js
|
|
44
|
+
// @flow
|
|
45
|
+
// AUTOGENERATED -- DO NOT EDIT
|
|
46
|
+
// Generated for operation 'Hello' in file '../hello.js'
|
|
47
|
+
export type HelloType = {|
|
|
48
|
+
variables: {||},
|
|
49
|
+
response: {|
|
|
50
|
+
/** A human character*/
|
|
51
|
+
human: ?{|
|
|
52
|
+
id: string
|
|
53
|
+
|}
|
|
54
|
+
|}
|
|
55
|
+
|};
|
|
56
|
+
export type Hello = HelloType['response'];
|
|
57
|
+
export type HelloVariables = HelloType['variables'];
|
|
58
|
+
"
|
|
59
|
+
`);
|
|
60
|
+
});
|
|
61
|
+
});
|