@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.
Files changed (54) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/Readme.md +67 -67
  3. package/dist/cli/config.js +73 -0
  4. package/dist/cli/config.js.flow +104 -0
  5. package/dist/cli/config.js.map +1 -0
  6. package/dist/cli/run.js +157 -0
  7. package/dist/cli/run.js.flow +164 -0
  8. package/dist/cli/run.js.map +1 -0
  9. package/dist/enums.js +2 -1
  10. package/dist/enums.js.map +1 -0
  11. package/dist/generateResponseType.js +170 -60
  12. package/dist/generateResponseType.js.flow +248 -82
  13. package/dist/generateResponseType.js.map +1 -0
  14. package/dist/generateTypeFiles.js +141 -0
  15. package/dist/generateTypeFiles.js.flow +167 -0
  16. package/dist/generateTypeFiles.js.map +1 -0
  17. package/dist/generateVariablesType.js +8 -1
  18. package/dist/generateVariablesType.js.flow +6 -0
  19. package/dist/generateVariablesType.js.map +1 -0
  20. package/dist/index.js +45 -4
  21. package/dist/index.js.flow +54 -4
  22. package/dist/index.js.map +1 -0
  23. package/dist/jest-mock-graphql-tag.js +42 -123
  24. package/dist/jest-mock-graphql-tag.js.flow +50 -145
  25. package/dist/jest-mock-graphql-tag.js.map +1 -0
  26. package/dist/parser/parse.js +349 -0
  27. package/dist/parser/parse.js.flow +403 -0
  28. package/dist/parser/parse.js.map +1 -0
  29. package/dist/parser/resolve.js +111 -0
  30. package/dist/parser/resolve.js.flow +117 -0
  31. package/dist/parser/resolve.js.map +1 -0
  32. package/dist/schemaFromIntrospectionData.js +2 -1
  33. package/dist/schemaFromIntrospectionData.js.map +1 -0
  34. package/dist/types.js +2 -1
  35. package/dist/types.js.flow +7 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/utils.js +2 -1
  38. package/dist/utils.js.map +1 -0
  39. package/package.json +13 -9
  40. package/src/__test__/example-schema.graphql +3 -1
  41. package/src/__test__/generateTypeFileContents.test.js +61 -0
  42. package/src/__test__/graphql-flow.test.js +329 -54
  43. package/src/__test__/{jest-mock-graphql-tag.test.js → processPragmas.test.js} +13 -1
  44. package/src/cli/config.js +104 -0
  45. package/src/cli/run.js +164 -0
  46. package/src/generateResponseType.js +248 -82
  47. package/src/generateTypeFiles.js +167 -0
  48. package/src/generateVariablesType.js +6 -0
  49. package/src/index.js +54 -4
  50. package/src/jest-mock-graphql-tag.js +50 -145
  51. package/src/parser/__test__/parse.test.js +247 -0
  52. package/src/parser/parse.js +403 -0
  53. package/src/parser/resolve.js +117 -0
  54. 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
@@ -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
@@ -50,4 +50,5 @@ const transferLeadingComments = (source, dest) => {
50
50
  return dest;
51
51
  };
52
52
 
53
- exports.transferLeadingComments = transferLeadingComments;
53
+ exports.transferLeadingComments = transferLeadingComments;
54
+ //# sourceMappingURL=utils.js.map
@@ -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.1",
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/polyfill": "^7.0.0",
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
- "babel-jest": "23.4.2",
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
+ });