@khanacademy/graphql-flow 0.2.1 → 0.2.4

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/.babelrc CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "presets": [
3
3
  "@babel/preset-flow",
4
- ["@babel/preset-env", { "targets": { "node": "16" } }]
4
+ ["@babel/preset-env", { "targets": { "node": "12" } }]
5
5
  ]
6
6
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @khanacademy/graphql-flow
2
2
 
3
+ ## 0.2.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 843839c: Add 'dumpOperations' config option, to enable safelisting
8
+
9
+ ## 0.2.3
10
+
11
+ ### Patch Changes
12
+
13
+ - f5ea353: Add 'typeFileName' config option to fit the mobile repo's expectations
14
+
15
+ ## 0.2.2
16
+
17
+ ### Patch Changes
18
+
19
+ - 31dd235: Compile for node 12 instead of 16
20
+
3
21
  ## 0.2.1
4
22
 
5
23
  ### Patch Changes
package/Readme.md CHANGED
@@ -70,6 +70,10 @@ type Options = {
70
70
  // Names are generated by concatenating the attribute names
71
71
  // of the path to the object type, separated by underscores.
72
72
  exportAllObjectTypes?: boolean,
73
+
74
+ // A template for the name of generated files
75
+ // default: [operationName].js
76
+ typeFileName?: string,
73
77
  }
74
78
  ```
75
79
 
@@ -16,11 +16,11 @@ var _path = _interopRequireDefault(require("path"));
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
18
  const loadConfigFile = configFile => {
19
- var _data$excludes;
19
+ var _data$options, _data$excludes$map, _data$excludes;
20
20
 
21
21
  // eslint-disable-next-line flowtype-errors/uncovered
22
22
  const data = JSON.parse(_fs.default.readFileSync(configFile, 'utf8'));
23
- const toplevelKeys = ['excludes', 'schemaFilePath', 'options'];
23
+ const toplevelKeys = ['excludes', 'schemaFilePath', 'options', 'dumpOperations'];
24
24
  Object.keys(data).forEach(k => {
25
25
  if (!toplevelKeys.includes(k)) {
26
26
  throw new Error(`Invalid attribute in config file ${configFile}: ${k}. Allowed attributes: ${toplevelKeys.join(', ')}`);
@@ -28,7 +28,7 @@ const loadConfigFile = configFile => {
28
28
  });
29
29
 
30
30
  if (data.options) {
31
- const externalOptionsKeys = ['pragma', 'loosePragma', 'ignorePragma', 'scalars', 'strictNullability', 'regenerateCommand', 'readOnlyArray', 'splitTypes', 'generatedDirectory', 'exportAllObjectTypes'];
31
+ const externalOptionsKeys = ['pragma', 'loosePragma', 'ignorePragma', 'scalars', 'strictNullability', 'regenerateCommand', 'readOnlyArray', 'splitTypes', 'generatedDirectory', 'exportAllObjectTypes', 'typeFileName'];
32
32
  Object.keys(data.options).forEach(k => {
33
33
  if (!externalOptionsKeys.includes(k)) {
34
34
  throw new Error(`Invalid option in config file ${configFile}: ${k}. Allowed options: ${externalOptionsKeys.join(', ')}`);
@@ -37,9 +37,10 @@ const loadConfigFile = configFile => {
37
37
  }
38
38
 
39
39
  return {
40
- options: data.options ?? {},
41
- excludes: ((_data$excludes = data.excludes) === null || _data$excludes === void 0 ? void 0 : _data$excludes.map(string => new RegExp(string))) ?? [],
42
- schemaFilePath: _path.default.join(_path.default.dirname(configFile), data.schemaFilePath)
40
+ options: (_data$options = data.options) !== null && _data$options !== void 0 ? _data$options : {},
41
+ excludes: (_data$excludes$map = (_data$excludes = data.excludes) === null || _data$excludes === void 0 ? void 0 : _data$excludes.map(string => new RegExp(string))) !== null && _data$excludes$map !== void 0 ? _data$excludes$map : [],
42
+ schemaFilePath: _path.default.join(_path.default.dirname(configFile), data.schemaFilePath),
43
+ dumpOperations: data.dumpOperations
43
44
  };
44
45
  };
45
46
  /**
@@ -18,6 +18,7 @@ import path from 'path';
18
18
  export type CliConfig = {
19
19
  excludes: Array<RegExp>,
20
20
  schemaFilePath: string,
21
+ dumpOperations?: string,
21
22
  options: ExternalOptions,
22
23
  };
23
24
 
@@ -29,12 +30,18 @@ type JSONConfig = {
29
30
  excludes?: Array<string>,
30
31
  schemaFilePath: string,
31
32
  options?: ExternalOptions,
33
+ dumpOperations?: string,
32
34
  };
33
35
 
34
36
  export const loadConfigFile = (configFile: string): CliConfig => {
35
37
  // eslint-disable-next-line flowtype-errors/uncovered
36
38
  const data: JSONConfig = JSON.parse(fs.readFileSync(configFile, 'utf8'));
37
- const toplevelKeys = ['excludes', 'schemaFilePath', 'options'];
39
+ const toplevelKeys = [
40
+ 'excludes',
41
+ 'schemaFilePath',
42
+ 'options',
43
+ 'dumpOperations',
44
+ ];
38
45
  Object.keys(data).forEach((k) => {
39
46
  if (!toplevelKeys.includes(k)) {
40
47
  throw new Error(
@@ -56,6 +63,7 @@ export const loadConfigFile = (configFile: string): CliConfig => {
56
63
  'splitTypes',
57
64
  'generatedDirectory',
58
65
  'exportAllObjectTypes',
66
+ 'typeFileName',
59
67
  ];
60
68
  Object.keys(data.options).forEach((k) => {
61
69
  if (!externalOptionsKeys.includes(k)) {
@@ -74,6 +82,7 @@ export const loadConfigFile = (configFile: string): CliConfig => {
74
82
  path.dirname(configFile),
75
83
  data.schemaFilePath,
76
84
  ),
85
+ dumpOperations: data.dumpOperations,
77
86
  };
78
87
  };
79
88
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/config.js"],"names":["loadConfigFile","configFile","data","JSON","parse","fs","readFileSync","toplevelKeys","Object","keys","forEach","k","includes","Error","join","options","externalOptionsKeys","excludes","map","string","RegExp","schemaFilePath","path","dirname","getSchemas","raw","endsWith","schemaForValidation","queryResponse","descriptions","schemaForTypeGeneration","introspectionData"],"mappings":";;;;;;;AAKA;;AAEA;;AACA;;AAOA;;;;AAkBO,MAAMA,cAAc,GAAIC,UAAD,IAAmC;AAAA;;AAC7D;AACA,QAAMC,IAAgB,GAAGC,IAAI,CAACC,KAAL,CAAWC,YAAGC,YAAH,CAAgBL,UAAhB,EAA4B,MAA5B,CAAX,CAAzB;AACA,QAAMM,YAAY,GAAG,CAAC,UAAD,EAAa,gBAAb,EAA+B,SAA/B,CAArB;AACAC,EAAAA,MAAM,CAACC,IAAP,CAAYP,IAAZ,EAAkBQ,OAAlB,CAA2BC,CAAD,IAAO;AAC7B,QAAI,CAACJ,YAAY,CAACK,QAAb,CAAsBD,CAAtB,CAAL,EAA+B;AAC3B,YAAM,IAAIE,KAAJ,CACD,oCAAmCZ,UAAW,KAAIU,CAAE,yBAAwBJ,YAAY,CAACO,IAAb,CACzE,IADyE,CAE3E,EAHA,CAAN;AAKH;AACJ,GARD;;AASA,MAAIZ,IAAI,CAACa,OAAT,EAAkB;AACd,UAAMC,mBAAmB,GAAG,CACxB,QADwB,EAExB,aAFwB,EAGxB,cAHwB,EAIxB,SAJwB,EAKxB,mBALwB,EAMxB,mBANwB,EAOxB,eAPwB,EAQxB,YARwB,EASxB,oBATwB,EAUxB,sBAVwB,CAA5B;AAYAR,IAAAA,MAAM,CAACC,IAAP,CAAYP,IAAI,CAACa,OAAjB,EAA0BL,OAA1B,CAAmCC,CAAD,IAAO;AACrC,UAAI,CAACK,mBAAmB,CAACJ,QAApB,CAA6BD,CAA7B,CAAL,EAAsC;AAClC,cAAM,IAAIE,KAAJ,CACD,iCAAgCZ,UAAW,KAAIU,CAAE,sBAAqBK,mBAAmB,CAACF,IAApB,CACnE,IADmE,CAErE,EAHA,CAAN;AAKH;AACJ,KARD;AASH;;AACD,SAAO;AACHC,IAAAA,OAAO,EAAEb,IAAI,CAACa,OAAL,IAAgB,EADtB;AAEHE,IAAAA,QAAQ,EAAE,mBAAAf,IAAI,CAACe,QAAL,kEAAeC,GAAf,CAAoBC,MAAD,IAAY,IAAIC,MAAJ,CAAWD,MAAX,CAA/B,MAAsD,EAF7D;AAGHE,IAAAA,cAAc,EAAEC,cAAKR,IAAL,CACZQ,cAAKC,OAAL,CAAatB,UAAb,CADY,EAEZC,IAAI,CAACmB,cAFO;AAHb,GAAP;AAQH,CA5CM;AA8CP;AACA;AACA;;;;;AACO,MAAMG,UAAU,GAAIH,cAAD,IAAqD;AAC3E,QAAMI,GAAG,GAAGpB,YAAGC,YAAH,CAAgBe,cAAhB,EAAgC,MAAhC,CAAZ;;AACA,MAAIA,cAAc,CAACK,QAAf,CAAwB,UAAxB,CAAJ,EAAyC;AACrC,UAAMC,mBAAmB,GAAG,0BAAYF,GAAZ,CAA5B;AACA,UAAMG,aAAa,GAAG,0BAClBD,mBADkB,EAElB,oCAAsB;AAACE,MAAAA,YAAY,EAAE;AAAf,KAAtB,CAFkB,CAAtB;AAIA,UAAMC,uBAAuB,GAAG,+DAC5B;AACEF,IAAAA,aAAa,CAAC1B,IAFY,CAAhC;AAIA,WAAO,CAACyB,mBAAD,EAAsBG,uBAAtB,CAAP;AACH,GAXD,MAWO;AACH;AACA,UAAMC,iBAAqC,GAAG5B,IAAI,CAACC,KAAL,CAAWqB,GAAX,CAA9C;AACA,UAAME,mBAAmB,GAAG,gCAAkBI,iBAAlB,CAA5B;AACA,UAAMD,uBAAuB,GACzB,8DAA4BC,iBAA5B,CADJ;AAEA,WAAO,CAACJ,mBAAD,EAAsBG,uBAAtB,CAAP;AACH;AACJ,CArBM","sourcesContent":["// @flow\nimport type {ExternalOptions} from '../generateTypeFiles';\nimport type {Schema} from '../types';\nimport type {GraphQLSchema} from 'graphql/type/schema';\n\nimport {schemaFromIntrospectionData} from '../schemaFromIntrospectionData';\n\nimport fs from 'fs';\nimport {\n buildClientSchema,\n buildSchema,\n getIntrospectionQuery,\n graphqlSync,\n type IntrospectionQuery,\n} from 'graphql';\nimport path from 'path';\n\nexport type CliConfig = {\n excludes: Array<RegExp>,\n schemaFilePath: string,\n options: ExternalOptions,\n};\n\n/**\n * This is the json-compatible form of the config\n * object.\n */\ntype JSONConfig = {\n excludes?: Array<string>,\n schemaFilePath: string,\n options?: ExternalOptions,\n};\n\nexport const loadConfigFile = (configFile: string): CliConfig => {\n // eslint-disable-next-line flowtype-errors/uncovered\n const data: JSONConfig = JSON.parse(fs.readFileSync(configFile, 'utf8'));\n const toplevelKeys = ['excludes', 'schemaFilePath', 'options'];\n Object.keys(data).forEach((k) => {\n if (!toplevelKeys.includes(k)) {\n throw new Error(\n `Invalid attribute in config file ${configFile}: ${k}. Allowed attributes: ${toplevelKeys.join(\n ', ',\n )}`,\n );\n }\n });\n if (data.options) {\n const externalOptionsKeys = [\n 'pragma',\n 'loosePragma',\n 'ignorePragma',\n 'scalars',\n 'strictNullability',\n 'regenerateCommand',\n 'readOnlyArray',\n 'splitTypes',\n 'generatedDirectory',\n 'exportAllObjectTypes',\n ];\n Object.keys(data.options).forEach((k) => {\n if (!externalOptionsKeys.includes(k)) {\n throw new Error(\n `Invalid option in config file ${configFile}: ${k}. Allowed options: ${externalOptionsKeys.join(\n ', ',\n )}`,\n );\n }\n });\n }\n return {\n options: data.options ?? {},\n excludes: data.excludes?.map((string) => new RegExp(string)) ?? [],\n schemaFilePath: path.join(\n path.dirname(configFile),\n data.schemaFilePath,\n ),\n };\n};\n\n/**\n * Loads a .json 'introspection query response', or a .graphql schema definition.\n */\nexport const getSchemas = (schemaFilePath: string): [GraphQLSchema, Schema] => {\n const raw = fs.readFileSync(schemaFilePath, 'utf8');\n if (schemaFilePath.endsWith('.graphql')) {\n const schemaForValidation = buildSchema(raw);\n const queryResponse = graphqlSync(\n schemaForValidation,\n getIntrospectionQuery({descriptions: true}),\n );\n const schemaForTypeGeneration = schemaFromIntrospectionData(\n // eslint-disable-next-line flowtype-errors/uncovered\n ((queryResponse.data: any): IntrospectionQuery),\n );\n return [schemaForValidation, schemaForTypeGeneration];\n } else {\n // eslint-disable-next-line flowtype-errors/uncovered\n const introspectionData: IntrospectionQuery = JSON.parse(raw);\n const schemaForValidation = buildClientSchema(introspectionData);\n const schemaForTypeGeneration =\n schemaFromIntrospectionData(introspectionData);\n return [schemaForValidation, schemaForTypeGeneration];\n }\n};\n"],"file":"config.js"}
1
+ {"version":3,"sources":["../../src/cli/config.js"],"names":["loadConfigFile","configFile","data","JSON","parse","fs","readFileSync","toplevelKeys","Object","keys","forEach","k","includes","Error","join","options","externalOptionsKeys","excludes","map","string","RegExp","schemaFilePath","path","dirname","dumpOperations","getSchemas","raw","endsWith","schemaForValidation","queryResponse","descriptions","schemaForTypeGeneration","introspectionData"],"mappings":";;;;;;;AAKA;;AAEA;;AACA;;AAOA;;;;AAoBO,MAAMA,cAAc,GAAIC,UAAD,IAAmC;AAAA;;AAC7D;AACA,QAAMC,IAAgB,GAAGC,IAAI,CAACC,KAAL,CAAWC,YAAGC,YAAH,CAAgBL,UAAhB,EAA4B,MAA5B,CAAX,CAAzB;AACA,QAAMM,YAAY,GAAG,CACjB,UADiB,EAEjB,gBAFiB,EAGjB,SAHiB,EAIjB,gBAJiB,CAArB;AAMAC,EAAAA,MAAM,CAACC,IAAP,CAAYP,IAAZ,EAAkBQ,OAAlB,CAA2BC,CAAD,IAAO;AAC7B,QAAI,CAACJ,YAAY,CAACK,QAAb,CAAsBD,CAAtB,CAAL,EAA+B;AAC3B,YAAM,IAAIE,KAAJ,CACD,oCAAmCZ,UAAW,KAAIU,CAAE,yBAAwBJ,YAAY,CAACO,IAAb,CACzE,IADyE,CAE3E,EAHA,CAAN;AAKH;AACJ,GARD;;AASA,MAAIZ,IAAI,CAACa,OAAT,EAAkB;AACd,UAAMC,mBAAmB,GAAG,CACxB,QADwB,EAExB,aAFwB,EAGxB,cAHwB,EAIxB,SAJwB,EAKxB,mBALwB,EAMxB,mBANwB,EAOxB,eAPwB,EAQxB,YARwB,EASxB,oBATwB,EAUxB,sBAVwB,EAWxB,cAXwB,CAA5B;AAaAR,IAAAA,MAAM,CAACC,IAAP,CAAYP,IAAI,CAACa,OAAjB,EAA0BL,OAA1B,CAAmCC,CAAD,IAAO;AACrC,UAAI,CAACK,mBAAmB,CAACJ,QAApB,CAA6BD,CAA7B,CAAL,EAAsC;AAClC,cAAM,IAAIE,KAAJ,CACD,iCAAgCZ,UAAW,KAAIU,CAAE,sBAAqBK,mBAAmB,CAACF,IAApB,CACnE,IADmE,CAErE,EAHA,CAAN;AAKH;AACJ,KARD;AASH;;AACD,SAAO;AACHC,IAAAA,OAAO,mBAAEb,IAAI,CAACa,OAAP,yDAAkB,EADtB;AAEHE,IAAAA,QAAQ,0CAAEf,IAAI,CAACe,QAAP,mDAAE,eAAeC,GAAf,CAAoBC,MAAD,IAAY,IAAIC,MAAJ,CAAWD,MAAX,CAA/B,CAAF,mEAAwD,EAF7D;AAGHE,IAAAA,cAAc,EAAEC,cAAKR,IAAL,CACZQ,cAAKC,OAAL,CAAatB,UAAb,CADY,EAEZC,IAAI,CAACmB,cAFO,CAHb;AAOHG,IAAAA,cAAc,EAAEtB,IAAI,CAACsB;AAPlB,GAAP;AASH,CAnDM;AAqDP;AACA;AACA;;;;;AACO,MAAMC,UAAU,GAAIJ,cAAD,IAAqD;AAC3E,QAAMK,GAAG,GAAGrB,YAAGC,YAAH,CAAgBe,cAAhB,EAAgC,MAAhC,CAAZ;;AACA,MAAIA,cAAc,CAACM,QAAf,CAAwB,UAAxB,CAAJ,EAAyC;AACrC,UAAMC,mBAAmB,GAAG,0BAAYF,GAAZ,CAA5B;AACA,UAAMG,aAAa,GAAG,0BAClBD,mBADkB,EAElB,oCAAsB;AAACE,MAAAA,YAAY,EAAE;AAAf,KAAtB,CAFkB,CAAtB;AAIA,UAAMC,uBAAuB,GAAG,+DAC5B;AACEF,IAAAA,aAAa,CAAC3B,IAFY,CAAhC;AAIA,WAAO,CAAC0B,mBAAD,EAAsBG,uBAAtB,CAAP;AACH,GAXD,MAWO;AACH;AACA,UAAMC,iBAAqC,GAAG7B,IAAI,CAACC,KAAL,CAAWsB,GAAX,CAA9C;AACA,UAAME,mBAAmB,GAAG,gCAAkBI,iBAAlB,CAA5B;AACA,UAAMD,uBAAuB,GACzB,8DAA4BC,iBAA5B,CADJ;AAEA,WAAO,CAACJ,mBAAD,EAAsBG,uBAAtB,CAAP;AACH;AACJ,CArBM","sourcesContent":["// @flow\nimport type {ExternalOptions} from '../generateTypeFiles';\nimport type {Schema} from '../types';\nimport type {GraphQLSchema} from 'graphql/type/schema';\n\nimport {schemaFromIntrospectionData} from '../schemaFromIntrospectionData';\n\nimport fs from 'fs';\nimport {\n buildClientSchema,\n buildSchema,\n getIntrospectionQuery,\n graphqlSync,\n type IntrospectionQuery,\n} from 'graphql';\nimport path from 'path';\n\nexport type CliConfig = {\n excludes: Array<RegExp>,\n schemaFilePath: string,\n dumpOperations?: string,\n options: ExternalOptions,\n};\n\n/**\n * This is the json-compatible form of the config\n * object.\n */\ntype JSONConfig = {\n excludes?: Array<string>,\n schemaFilePath: string,\n options?: ExternalOptions,\n dumpOperations?: string,\n};\n\nexport const loadConfigFile = (configFile: string): CliConfig => {\n // eslint-disable-next-line flowtype-errors/uncovered\n const data: JSONConfig = JSON.parse(fs.readFileSync(configFile, 'utf8'));\n const toplevelKeys = [\n 'excludes',\n 'schemaFilePath',\n 'options',\n 'dumpOperations',\n ];\n Object.keys(data).forEach((k) => {\n if (!toplevelKeys.includes(k)) {\n throw new Error(\n `Invalid attribute in config file ${configFile}: ${k}. Allowed attributes: ${toplevelKeys.join(\n ', ',\n )}`,\n );\n }\n });\n if (data.options) {\n const externalOptionsKeys = [\n 'pragma',\n 'loosePragma',\n 'ignorePragma',\n 'scalars',\n 'strictNullability',\n 'regenerateCommand',\n 'readOnlyArray',\n 'splitTypes',\n 'generatedDirectory',\n 'exportAllObjectTypes',\n 'typeFileName',\n ];\n Object.keys(data.options).forEach((k) => {\n if (!externalOptionsKeys.includes(k)) {\n throw new Error(\n `Invalid option in config file ${configFile}: ${k}. Allowed options: ${externalOptionsKeys.join(\n ', ',\n )}`,\n );\n }\n });\n }\n return {\n options: data.options ?? {},\n excludes: data.excludes?.map((string) => new RegExp(string)) ?? [],\n schemaFilePath: path.join(\n path.dirname(configFile),\n data.schemaFilePath,\n ),\n dumpOperations: data.dumpOperations,\n };\n};\n\n/**\n * Loads a .json 'introspection query response', or a .graphql schema definition.\n */\nexport const getSchemas = (schemaFilePath: string): [GraphQLSchema, Schema] => {\n const raw = fs.readFileSync(schemaFilePath, 'utf8');\n if (schemaFilePath.endsWith('.graphql')) {\n const schemaForValidation = buildSchema(raw);\n const queryResponse = graphqlSync(\n schemaForValidation,\n getIntrospectionQuery({descriptions: true}),\n );\n const schemaForTypeGeneration = schemaFromIntrospectionData(\n // eslint-disable-next-line flowtype-errors/uncovered\n ((queryResponse.data: any): IntrospectionQuery),\n );\n return [schemaForValidation, schemaForTypeGeneration];\n } else {\n // eslint-disable-next-line flowtype-errors/uncovered\n const introspectionData: IntrospectionQuery = JSON.parse(raw);\n const schemaForValidation = buildClientSchema(introspectionData);\n const schemaForTypeGeneration =\n schemaFromIntrospectionData(introspectionData);\n return [schemaForValidation, schemaForTypeGeneration];\n }\n};\n"],"file":"config.js"}
package/dist/cli/run.js CHANGED
@@ -21,9 +21,11 @@ var _printer = require("graphql/language/printer");
21
21
 
22
22
  var _validation = require("graphql/validation");
23
23
 
24
- var _path = _interopRequireDefault(require("path"));
24
+ var _path = _interopRequireWildcard(require("path"));
25
25
 
26
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
29
 
28
30
  // eslint-disable-line flowtype-errors/uncovered
29
31
 
@@ -61,7 +63,17 @@ const [schemaForValidation, schemaForTypeGeneration] = (0, _config.getSchemas)(c
61
63
  const inputFiles = cliFiles.length ? cliFiles : findGraphqlTagReferences(process.cwd());
62
64
  /** Step (2) */
63
65
 
64
- const files = (0, _parse.processFiles)(inputFiles, f => (0, _fs.readFileSync)(f, 'utf8'));
66
+ const files = (0, _parse.processFiles)(inputFiles, f => {
67
+ if ((0, _fs.existsSync)(f)) {
68
+ return (0, _fs.readFileSync)(f, 'utf8');
69
+ }
70
+
71
+ if ((0, _fs.existsSync)(f + '.js')) {
72
+ return (0, _fs.readFileSync)(f + '.js', 'utf8');
73
+ }
74
+
75
+ throw new Error(`Unable to find ${f}`);
76
+ });
65
77
  let filesHadErrors = false;
66
78
  Object.keys(files).forEach(key => {
67
79
  const file = files[key];
@@ -99,6 +111,7 @@ console.log(Object.keys(resolved).length, 'resolved queries');
99
111
  /** Step (4) */
100
112
 
101
113
  let validationFailures = 0;
114
+ const printedOperations = [];
102
115
  Object.keys(resolved).forEach(k => {
103
116
  const {
104
117
  document,
@@ -112,16 +125,20 @@ Object.keys(resolved).forEach(k => {
112
125
  const hasNonFragments = document.definitions.some(({
113
126
  kind
114
127
  }) => kind !== 'FragmentDefinition');
115
- const rawSource = raw.literals[0];
128
+ const rawSource = raw.literals[0]; // eslint-disable-next-line flowtype-errors/uncovered
129
+
130
+ const withTypeNames = (0, _apolloUtilities.addTypenameToDocument)(document);
131
+ const printed = (0, _printer.print)(withTypeNames);
132
+
133
+ if (hasNonFragments && !printedOperations.includes(printed)) {
134
+ printedOperations.push(printed);
135
+ }
136
+
116
137
  const processedOptions = (0, _generateTypeFiles.processPragmas)(config.options, rawSource);
117
138
 
118
139
  if (!processedOptions) {
119
140
  return;
120
- } // eslint-disable-next-line flowtype-errors/uncovered
121
-
122
-
123
- const withTypeNames = (0, _apolloUtilities.addTypenameToDocument)(document);
124
- const printed = (0, _printer.print)(withTypeNames);
141
+ }
125
142
 
126
143
  if (hasNonFragments) {
127
144
  /* eslint-disable flowtype-errors/uncovered */
@@ -156,4 +173,13 @@ if (validationFailures) {
156
173
 
157
174
  process.exit(1);
158
175
  }
176
+
177
+ if (config.dumpOperations) {
178
+ const dumpOperations = config.dumpOperations;
179
+ const parent = (0, _path.dirname)(dumpOperations);
180
+ (0, _fs.mkdirSync)(parent, {
181
+ recursive: true
182
+ });
183
+ (0, _fs.writeFileSync)(dumpOperations, JSON.stringify(printedOperations.sort(), null, 2));
184
+ }
159
185
  //# sourceMappingURL=run.js.map
@@ -9,11 +9,12 @@ import {getSchemas, loadConfigFile} from './config';
9
9
  import {addTypenameToDocument} from 'apollo-utilities'; // eslint-disable-line flowtype-errors/uncovered
10
10
 
11
11
  import {execSync} from 'child_process';
12
- import {readFileSync} from 'fs';
12
+ import {existsSync, mkdirSync, readFileSync, writeFileSync} from 'fs';
13
13
  import {type DocumentNode} from 'graphql';
14
14
  import {print} from 'graphql/language/printer';
15
15
  import {validate} from 'graphql/validation';
16
16
  import path from 'path';
17
+ import {dirname} from 'path';
17
18
 
18
19
  /**
19
20
  * This CLI tool executes the following steps:
@@ -68,7 +69,15 @@ const inputFiles = cliFiles.length
68
69
 
69
70
  /** Step (2) */
70
71
 
71
- const files = processFiles(inputFiles, (f) => readFileSync(f, 'utf8'));
72
+ const files = processFiles(inputFiles, (f) => {
73
+ if (existsSync(f)) {
74
+ return readFileSync(f, 'utf8');
75
+ }
76
+ if (existsSync(f + '.js')) {
77
+ return readFileSync(f + '.js', 'utf8');
78
+ }
79
+ throw new Error(`Unable to find ${f}`);
80
+ });
72
81
 
73
82
  let filesHadErrors = false;
74
83
  Object.keys(files).forEach((key) => {
@@ -103,6 +112,7 @@ console.log(Object.keys(resolved).length, 'resolved queries');
103
112
  /** Step (4) */
104
113
 
105
114
  let validationFailures: number = 0;
115
+ const printedOperations: Array<string> = [];
106
116
 
107
117
  Object.keys(resolved).forEach((k) => {
108
118
  const {document, raw} = resolved[k];
@@ -113,14 +123,18 @@ Object.keys(resolved).forEach((k) => {
113
123
  ({kind}) => kind !== 'FragmentDefinition',
114
124
  );
115
125
  const rawSource: string = raw.literals[0];
116
- const processedOptions = processPragmas(config.options, rawSource);
117
- if (!processedOptions) {
118
- return;
119
- }
120
126
 
121
127
  // eslint-disable-next-line flowtype-errors/uncovered
122
128
  const withTypeNames: DocumentNode = addTypenameToDocument(document);
123
129
  const printed = print(withTypeNames);
130
+ if (hasNonFragments && !printedOperations.includes(printed)) {
131
+ printedOperations.push(printed);
132
+ }
133
+
134
+ const processedOptions = processPragmas(config.options, rawSource);
135
+ if (!processedOptions) {
136
+ return;
137
+ }
124
138
 
125
139
  if (hasNonFragments) {
126
140
  /* eslint-disable flowtype-errors/uncovered */
@@ -163,3 +177,13 @@ if (validationFailures) {
163
177
  // eslint-disable-next-line flowtype-errors/uncovered
164
178
  process.exit(1);
165
179
  }
180
+
181
+ if (config.dumpOperations) {
182
+ const dumpOperations = config.dumpOperations;
183
+ const parent = dirname(dumpOperations);
184
+ mkdirSync(parent, {recursive: true});
185
+ writeFileSync(
186
+ dumpOperations,
187
+ JSON.stringify(printedOperations.sort(), null, 2),
188
+ );
189
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/run.js"],"names":["findGraphqlTagReferences","root","response","encoding","cwd","trim","split","map","relative","path","join","_","__","configFile","cliFiles","process","argv","console","log","exit","config","schemaForValidation","schemaForTypeGeneration","schemaFilePath","inputFiles","length","files","f","filesHadErrors","Object","keys","forEach","key","file","errors","error","message","resolved","loc","validationFailures","k","document","raw","excludes","some","rx","test","hasNonFragments","definitions","kind","rawSource","literals","processedOptions","options","withTypeNames","printed","err"],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// @flow\n/* eslint-disable no-console */\nimport {generateTypeFiles, processPragmas} from '../generateTypeFiles';\nimport {processFiles} from '../parser/parse';\nimport {resolveDocuments} from '../parser/resolve';\nimport {getSchemas, loadConfigFile} from './config';\n\nimport {addTypenameToDocument} from 'apollo-utilities'; // eslint-disable-line flowtype-errors/uncovered\n\nimport {execSync} from 'child_process';\nimport {readFileSync} from 'fs';\nimport {type DocumentNode} from 'graphql';\nimport {print} from 'graphql/language/printer';\nimport {validate} from 'graphql/validation';\nimport path from 'path';\n\n/**\n * This CLI tool executes the following steps:\n * 1) process options\n * 2) crawl files to find all operations and fragments, with\n * tagged template literals and expressions.\n * 3) resolve the found operations, passing the literals and\n * fragments into the `graphql-tag` function to produce\n * the DocumentNodes.\n * 4) generate types for all resolved Queries & Mutations\n */\n\n/** Step (1) */\n\nconst findGraphqlTagReferences = (root: string): Array<string> => {\n const response = execSync(\n \"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx'\",\n {\n encoding: 'utf8',\n cwd: root,\n },\n );\n return response\n .trim()\n .split('\\n')\n .map((relative) => path.join(root, relative));\n};\n\nconst [_, __, configFile, ...cliFiles] = process.argv;\n\nif (\n configFile === '-h' ||\n configFile === '--help' ||\n configFile === 'help' ||\n !configFile\n) {\n console.log(`graphql-flow\n\nUsage: graphql-flow [configFile.json] [filesToCrawl...]`);\n process.exit(1); // eslint-disable-line flowtype-errors/uncovered\n}\n\nconst config = loadConfigFile(configFile);\n\nconst [schemaForValidation, schemaForTypeGeneration] = getSchemas(\n config.schemaFilePath,\n);\n\nconst inputFiles = cliFiles.length\n ? cliFiles\n : findGraphqlTagReferences(process.cwd());\n\n/** Step (2) */\n\nconst files = processFiles(inputFiles, (f) => readFileSync(f, 'utf8'));\n\nlet filesHadErrors = false;\nObject.keys(files).forEach((key) => {\n const file = files[key];\n if (file.errors.length) {\n filesHadErrors = true;\n console.error(`Errors in ${file.path}`);\n file.errors.forEach((error) => {\n console.error(` - ${error.message}`);\n });\n }\n});\n\nif (filesHadErrors) {\n console.error('Aborting');\n process.exit(1); // eslint-disable-line flowtype-errors/uncovered\n}\n\n/** Step (3) */\n\nconst {resolved, errors} = resolveDocuments(files);\nif (errors.length) {\n errors.forEach((error) => {\n console.error(`Resolution error ${error.message} in ${error.loc.path}`);\n });\n console.error('Aborting');\n process.exit(1); // eslint-disable-line flowtype-errors/uncovered\n}\n\nconsole.log(Object.keys(resolved).length, 'resolved queries');\n\n/** Step (4) */\n\nlet validationFailures: number = 0;\n\nObject.keys(resolved).forEach((k) => {\n const {document, raw} = resolved[k];\n if (config.excludes.some((rx) => rx.test(raw.loc.path))) {\n return; // skip\n }\n const hasNonFragments = document.definitions.some(\n ({kind}) => kind !== 'FragmentDefinition',\n );\n const rawSource: string = raw.literals[0];\n const processedOptions = processPragmas(config.options, rawSource);\n if (!processedOptions) {\n return;\n }\n\n // eslint-disable-next-line flowtype-errors/uncovered\n const withTypeNames: DocumentNode = addTypenameToDocument(document);\n const printed = print(withTypeNames);\n\n if (hasNonFragments) {\n /* eslint-disable flowtype-errors/uncovered */\n const errors = validate(schemaForValidation, withTypeNames);\n /* eslint-disable flowtype-errors/uncovered */\n if (errors.length) {\n errors.forEach((error) => {\n console.error(\n `Schema validation found errors for ${raw.loc.path}!`,\n );\n console.error(printed);\n console.error(error);\n validationFailures++;\n });\n }\n /* eslint-enable flowtype-errors/uncovered */\n }\n\n try {\n generateTypeFiles(\n raw.loc.path,\n schemaForTypeGeneration,\n withTypeNames,\n processedOptions,\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n } catch (err) {\n console.error(`Error while generating operation from ${raw.loc.path}`);\n console.error(printed);\n // eslint-disable-next-line flowtype-errors/uncovered\n console.error(err);\n validationFailures++;\n }\n});\n\nif (validationFailures) {\n console.error(\n `Encountered ${validationFailures} validation failures while printing types.`,\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n process.exit(1);\n}\n"],"file":"run.js"}
1
+ {"version":3,"sources":["../../src/cli/run.js"],"names":["findGraphqlTagReferences","root","response","encoding","cwd","trim","split","map","relative","path","join","_","__","configFile","cliFiles","process","argv","console","log","exit","config","schemaForValidation","schemaForTypeGeneration","schemaFilePath","inputFiles","length","files","f","Error","filesHadErrors","Object","keys","forEach","key","file","errors","error","message","resolved","loc","validationFailures","printedOperations","k","document","raw","excludes","some","rx","test","hasNonFragments","definitions","kind","rawSource","literals","withTypeNames","printed","includes","push","processedOptions","options","err","dumpOperations","parent","recursive","JSON","stringify","sort"],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// @flow\n/* eslint-disable no-console */\nimport {generateTypeFiles, processPragmas} from '../generateTypeFiles';\nimport {processFiles} from '../parser/parse';\nimport {resolveDocuments} from '../parser/resolve';\nimport {getSchemas, loadConfigFile} from './config';\n\nimport {addTypenameToDocument} from 'apollo-utilities'; // eslint-disable-line flowtype-errors/uncovered\n\nimport {execSync} from 'child_process';\nimport {existsSync, mkdirSync, readFileSync, writeFileSync} from 'fs';\nimport {type DocumentNode} from 'graphql';\nimport {print} from 'graphql/language/printer';\nimport {validate} from 'graphql/validation';\nimport path from 'path';\nimport {dirname} from 'path';\n\n/**\n * This CLI tool executes the following steps:\n * 1) process options\n * 2) crawl files to find all operations and fragments, with\n * tagged template literals and expressions.\n * 3) resolve the found operations, passing the literals and\n * fragments into the `graphql-tag` function to produce\n * the DocumentNodes.\n * 4) generate types for all resolved Queries & Mutations\n */\n\n/** Step (1) */\n\nconst findGraphqlTagReferences = (root: string): Array<string> => {\n const response = execSync(\n \"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx'\",\n {\n encoding: 'utf8',\n cwd: root,\n },\n );\n return response\n .trim()\n .split('\\n')\n .map((relative) => path.join(root, relative));\n};\n\nconst [_, __, configFile, ...cliFiles] = process.argv;\n\nif (\n configFile === '-h' ||\n configFile === '--help' ||\n configFile === 'help' ||\n !configFile\n) {\n console.log(`graphql-flow\n\nUsage: graphql-flow [configFile.json] [filesToCrawl...]`);\n process.exit(1); // eslint-disable-line flowtype-errors/uncovered\n}\n\nconst config = loadConfigFile(configFile);\n\nconst [schemaForValidation, schemaForTypeGeneration] = getSchemas(\n config.schemaFilePath,\n);\n\nconst inputFiles = cliFiles.length\n ? cliFiles\n : findGraphqlTagReferences(process.cwd());\n\n/** Step (2) */\n\nconst files = processFiles(inputFiles, (f) => {\n if (existsSync(f)) {\n return readFileSync(f, 'utf8');\n }\n if (existsSync(f + '.js')) {\n return readFileSync(f + '.js', 'utf8');\n }\n throw new Error(`Unable to find ${f}`);\n});\n\nlet filesHadErrors = false;\nObject.keys(files).forEach((key) => {\n const file = files[key];\n if (file.errors.length) {\n filesHadErrors = true;\n console.error(`Errors in ${file.path}`);\n file.errors.forEach((error) => {\n console.error(` - ${error.message}`);\n });\n }\n});\n\nif (filesHadErrors) {\n console.error('Aborting');\n process.exit(1); // eslint-disable-line flowtype-errors/uncovered\n}\n\n/** Step (3) */\n\nconst {resolved, errors} = resolveDocuments(files);\nif (errors.length) {\n errors.forEach((error) => {\n console.error(`Resolution error ${error.message} in ${error.loc.path}`);\n });\n console.error('Aborting');\n process.exit(1); // eslint-disable-line flowtype-errors/uncovered\n}\n\nconsole.log(Object.keys(resolved).length, 'resolved queries');\n\n/** Step (4) */\n\nlet validationFailures: number = 0;\nconst printedOperations: Array<string> = [];\n\nObject.keys(resolved).forEach((k) => {\n const {document, raw} = resolved[k];\n if (config.excludes.some((rx) => rx.test(raw.loc.path))) {\n return; // skip\n }\n const hasNonFragments = document.definitions.some(\n ({kind}) => kind !== 'FragmentDefinition',\n );\n const rawSource: string = raw.literals[0];\n\n // eslint-disable-next-line flowtype-errors/uncovered\n const withTypeNames: DocumentNode = addTypenameToDocument(document);\n const printed = print(withTypeNames);\n if (hasNonFragments && !printedOperations.includes(printed)) {\n printedOperations.push(printed);\n }\n\n const processedOptions = processPragmas(config.options, rawSource);\n if (!processedOptions) {\n return;\n }\n\n if (hasNonFragments) {\n /* eslint-disable flowtype-errors/uncovered */\n const errors = validate(schemaForValidation, withTypeNames);\n /* eslint-disable flowtype-errors/uncovered */\n if (errors.length) {\n errors.forEach((error) => {\n console.error(\n `Schema validation found errors for ${raw.loc.path}!`,\n );\n console.error(printed);\n console.error(error);\n validationFailures++;\n });\n }\n /* eslint-enable flowtype-errors/uncovered */\n }\n\n try {\n generateTypeFiles(\n raw.loc.path,\n schemaForTypeGeneration,\n withTypeNames,\n processedOptions,\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n } catch (err) {\n console.error(`Error while generating operation from ${raw.loc.path}`);\n console.error(printed);\n // eslint-disable-next-line flowtype-errors/uncovered\n console.error(err);\n validationFailures++;\n }\n});\n\nif (validationFailures) {\n console.error(\n `Encountered ${validationFailures} validation failures while printing types.`,\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n process.exit(1);\n}\n\nif (config.dumpOperations) {\n const dumpOperations = config.dumpOperations;\n const parent = dirname(dumpOperations);\n mkdirSync(parent, {recursive: true});\n writeFileSync(\n dumpOperations,\n JSON.stringify(printedOperations.sort(), null, 2),\n );\n}\n"],"file":"run.js"}
@@ -185,9 +185,9 @@ const objectPropertiesToFlow = (config, type, typeName, selections) => {
185
185
  switch (selection.kind) {
186
186
  case 'InlineFragment':
187
187
  {
188
- var _selection$typeCondit;
188
+ var _selection$typeCondit, _selection$typeCondit2;
189
189
 
190
- const newTypeName = ((_selection$typeCondit = selection.typeCondition) === null || _selection$typeCondit === void 0 ? void 0 : _selection$typeCondit.name.value) ?? typeName;
190
+ const newTypeName = (_selection$typeCondit = (_selection$typeCondit2 = selection.typeCondition) === null || _selection$typeCondit2 === void 0 ? void 0 : _selection$typeCondit2.name.value) !== null && _selection$typeCondit !== void 0 ? _selection$typeCondit : typeName;
191
191
 
192
192
  if (newTypeName !== typeName) {
193
193
  return [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/generateResponseType.js"],"names":["generateResponseType","schema","query","config","ast","querySelectionToObjectType","selectionSet","selections","operation","typesByName","Mutation","Query","code","sortedObjectTypeAnnotation","properties","obj","babelTypes","objectTypeAnnotation","sort","a","b","type","aName","key","name","bName","undefined","path","join","isTopLevelType","length","allObjectTypes","genericTypeAnnotation","identifier","generateFragmentType","fragment","onType","typeCondition","value","objectPropertiesToFlow","interfacesByName","unionOrInterfaceToFlow","unionsByName","Error","_typeToFlow","selection","kind","readOnlyArray","typeParameterInstantiation","typeToFlow","ofType","union","console","log","anyTypeAnnotation","tname","childType","description","strictNullability","inner","result","nullableTypeAnnotation","ensureOnlyOneTypenameProperty","seenTypeName","filter","typeName","concat","map","newTypeName","fragments","errors","push","objectTypeProperty","alias","stringLiteralTypeAnnotation","fieldsByName","typeField","allFields","every","selectedAttributes","possibleTypes","slice","possible","configWithUpdatedPath","attributes","unionOrInterfaceSelection","flat","sharedAttributes","typeNameIndex","findIndex","x","unionTypeAnnotation","attrs","possibleTypesByName","indirectMatch"],"mappings":"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","sourcesContent":["// @flow\n/* eslint-disable no-console */\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport * as babelTypes from '@babel/types';\nimport {type BabelNodeFlowType} from '@babel/types';\nimport type {\n FieldNode,\n IntrospectionOutputTypeRef,\n OperationDefinitionNode,\n FragmentDefinitionNode,\n} from 'graphql';\nimport type {Config, Schema, Selections} from './types';\nimport {\n liftLeadingPropertyComments,\n maybeAddDescriptionComment,\n transferLeadingComments,\n} from './utils';\nimport {enumTypeToFlow, scalarTypeToFlow} from './enums';\nimport type {\n IntrospectionField,\n IntrospectionInterfaceType,\n IntrospectionObjectType,\n IntrospectionUnionType,\n} from 'graphql/utilities/introspectionQuery';\nimport {\n BabelNodeObjectTypeProperty,\n BabelNodeObjectTypeSpreadProperty,\n} from '@babel/types';\n\nexport const generateResponseType = (\n schema: Schema,\n query: OperationDefinitionNode,\n config: Config,\n): string => {\n const ast = querySelectionToObjectType(\n config,\n query.selectionSet.selections,\n query.operation === 'mutation'\n ? schema.typesByName.Mutation\n : schema.typesByName.Query,\n query.operation === 'mutation' ? 'mutation' : 'query',\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n return generate(ast).code;\n};\n\nconst sortedObjectTypeAnnotation = (\n config: Config,\n properties: Array<\n BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,\n >,\n) => {\n const obj = babelTypes.objectTypeAnnotation(\n properties.sort((a, b) => {\n if (\n a.type === 'ObjectTypeProperty' &&\n b.type === 'ObjectTypeProperty'\n ) {\n const aName = a.key.type === 'Identifier' ? a.key.name : '';\n const bName = b.key.type === 'Identifier' ? b.key.name : '';\n return aName < bName ? -1 : 1;\n }\n return 0;\n }),\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n );\n const name = config.path.join('_');\n const isTopLevelType = config.path.length <= 1;\n if (config.allObjectTypes != null && !isTopLevelType) {\n config.allObjectTypes[name] = obj;\n return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));\n } else {\n return obj;\n }\n};\n\nexport const generateFragmentType = (\n schema: Schema,\n fragment: FragmentDefinitionNode,\n config: Config,\n): string => {\n const onType = fragment.typeCondition.name.value;\n let ast;\n\n if (schema.typesByName[onType]) {\n ast = sortedObjectTypeAnnotation(\n config,\n objectPropertiesToFlow(\n config,\n schema.typesByName[onType],\n onType,\n fragment.selectionSet.selections,\n ),\n );\n } else if (schema.interfacesByName[onType]) {\n ast = unionOrInterfaceToFlow(\n config,\n config.schema.interfacesByName[onType],\n fragment.selectionSet.selections,\n );\n } else if (schema.unionsByName[onType]) {\n ast = unionOrInterfaceToFlow(\n config,\n config.schema.unionsByName[onType],\n fragment.selectionSet.selections,\n );\n } else {\n throw new Error(`Unknown ${onType}`);\n }\n\n // eslint-disable-next-line flowtype-errors/uncovered\n return generate(ast).code;\n};\n\nconst _typeToFlow = (\n config: Config,\n type,\n selection,\n): babelTypes.BabelNodeFlowType => {\n if (type.kind === 'SCALAR') {\n return scalarTypeToFlow(config, type.name);\n }\n if (type.kind === 'LIST') {\n return babelTypes.genericTypeAnnotation(\n config.readOnlyArray\n ? babelTypes.identifier('$ReadOnlyArray')\n : babelTypes.identifier('Array'),\n babelTypes.typeParameterInstantiation([\n typeToFlow(config, type.ofType, selection),\n ]),\n );\n }\n if (type.kind === 'UNION') {\n const union = config.schema.unionsByName[type.name];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n union,\n selection.selectionSet.selections,\n );\n }\n\n if (type.kind === 'INTERFACE') {\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n config.schema.interfacesByName[type.name],\n selection.selectionSet.selections,\n );\n }\n if (type.kind === 'ENUM') {\n return enumTypeToFlow(config, type.name);\n }\n if (type.kind !== 'OBJECT') {\n console.log('not object', type);\n return babelTypes.anyTypeAnnotation();\n }\n\n const tname = type.name;\n if (!config.schema.typesByName[tname]) {\n console.log('unknown referenced type', tname);\n return babelTypes.anyTypeAnnotation();\n }\n const childType = config.schema.typesByName[tname];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return maybeAddDescriptionComment(\n childType.description,\n querySelectionToObjectType(\n config,\n selection.selectionSet.selections,\n childType,\n tname,\n ),\n );\n};\n\nexport const typeToFlow = (\n config: Config,\n type: IntrospectionOutputTypeRef,\n selection: FieldNode,\n): babelTypes.BabelNodeFlowType => {\n // throw new Error('npoe');\n if (type.kind === 'NON_NULL') {\n return _typeToFlow(config, type.ofType, selection);\n }\n // If we don'babelTypes care about strict nullability checking, then pretend everything is non-null\n if (!config.strictNullability) {\n return _typeToFlow(config, type, selection);\n }\n const inner = _typeToFlow(config, type, selection);\n const result = babelTypes.nullableTypeAnnotation(inner);\n return transferLeadingComments(inner, result);\n};\n\nconst ensureOnlyOneTypenameProperty = (properties) => {\n let seenTypeName: false | string = false;\n return properties.filter((type) => {\n // The apollo-utilities \"addTypeName\" utility will add it\n // even if it's already specified :( so we have to filter out\n // the extra one here.\n if (\n type.type === 'ObjectTypeProperty' &&\n type.key.name === '__typename'\n ) {\n const name =\n type.value.type === 'StringLiteralTypeAnnotation'\n ? type.value.value\n : 'INVALID';\n if (seenTypeName) {\n if (name !== seenTypeName) {\n throw new Error(\n `Got two different type names ${name}, ${seenTypeName}`,\n );\n }\n return false;\n }\n seenTypeName = name;\n }\n return true;\n });\n};\n\nconst querySelectionToObjectType = (\n config: Config,\n selections,\n type,\n typeName: string,\n): BabelNodeFlowType => {\n return sortedObjectTypeAnnotation(\n config,\n ensureOnlyOneTypenameProperty(\n objectPropertiesToFlow(config, type, typeName, selections),\n ),\n );\n};\n\nexport const objectPropertiesToFlow = (\n config: Config,\n type: IntrospectionObjectType & {\n fieldsByName: {[name: string]: IntrospectionField},\n },\n typeName: string,\n selections: Selections,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n return [].concat(\n ...selections.map((selection) => {\n switch (selection.kind) {\n case 'InlineFragment': {\n const newTypeName =\n selection.typeCondition?.name.value ?? typeName;\n if (newTypeName !== typeName) {\n return [];\n }\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[newTypeName],\n newTypeName,\n selection.selectionSet.selections,\n );\n }\n case 'FragmentSpread':\n if (!config.fragments[selection.name.value]) {\n config.errors.push(\n `No fragment named '${selection.name.value}'. Did you forget to include it in the template literal?`,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(selection.name.value),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FRAGMENT`),\n ),\n ),\n ];\n }\n\n return objectPropertiesToFlow(\n config,\n type,\n typeName,\n config.fragments[selection.name.value].selectionSet\n .selections,\n );\n\n case 'Field':\n const name = selection.name.value;\n const alias: string = selection.alias\n ? selection.alias.value\n : name;\n if (name === '__typename') {\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(\n typeName,\n ),\n ),\n ];\n }\n if (!type.fieldsByName[name]) {\n config.errors.push(\n `Unknown field '${name}' for type '${typeName}'`,\n );\n return babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(\n `UNKNOWN_FIELD[\"${name}\"]`,\n ),\n ),\n );\n }\n const typeField = type.fieldsByName[name];\n\n return [\n maybeAddDescriptionComment(\n typeField.description,\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(\n {\n ...config,\n path: config.path.concat([alias]),\n },\n typeField.type,\n selection,\n ),\n ),\n ),\n ),\n ];\n\n default:\n config.errors.push(\n // eslint-disable-next-line flowtype-errors/uncovered\n `Unsupported selection kind '${selection.kind}'`,\n );\n return [];\n }\n }),\n );\n};\n\nexport const unionOrInterfaceToFlow = (\n config: Config,\n type:\n | IntrospectionUnionType\n | (IntrospectionInterfaceType & {\n fieldsByName: {[key: string]: IntrospectionField},\n }),\n selections: Selections,\n): BabelNodeFlowType => {\n const allFields = selections.every(\n (selection) => selection.kind === 'Field',\n );\n const selectedAttributes: Array<{\n attributes: Array<\n BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,\n >,\n typeName: string,\n }> = type.possibleTypes\n .slice()\n .sort((a, b) => {\n return a.name < b.name ? -1 : 1;\n })\n .map((possible) => {\n const configWithUpdatedPath = {\n ...config,\n path: allFields\n ? config.path\n : config.path.concat([possible.name]),\n };\n return {\n typeName: possible.name,\n attributes: ensureOnlyOneTypenameProperty(\n selections\n .map((selection) =>\n unionOrInterfaceSelection(\n configWithUpdatedPath,\n type,\n possible,\n selection,\n ),\n )\n .flat(),\n ),\n };\n });\n // If they're all fields, the only selection that could be different is __typename\n if (allFields) {\n const sharedAttributes = selectedAttributes[0].attributes.slice();\n const typeNameIndex = selectedAttributes[0].attributes.findIndex(\n (x) =>\n x.type === 'ObjectTypeProperty' &&\n x.key.type === 'Identifier' &&\n x.key.name === '__typename',\n );\n if (typeNameIndex !== -1) {\n sharedAttributes[typeNameIndex] = babelTypes.objectTypeProperty(\n babelTypes.identifier('__typename'),\n babelTypes.unionTypeAnnotation(\n selectedAttributes.map(\n (attrs) =>\n // eslint-disable-next-line flowtype-errors/uncovered\n ((attrs.attributes[\n typeNameIndex\n ]: any): BabelNodeObjectTypeProperty).value,\n ),\n ),\n );\n }\n return sortedObjectTypeAnnotation(config, sharedAttributes);\n }\n if (selectedAttributes.length === 1) {\n return sortedObjectTypeAnnotation(\n config,\n selectedAttributes[0].attributes,\n );\n }\n /**\n * When generating the objects for the sub-options of a union, the path needs\n * to include the name of the object type.\n * ```\n * query getFriend {\n * friend {\n * ... on Human { id }\n * ... on Droid { arms }\n * }\n * }\n * ```\n * produces\n * ```\n * type getFriend = {friend: getFriend_friend_Human | getFriend_friend_Droid }\n * type getFriend_friend_Human = {id: string}\n * type getFriend_friend_Droid = {arms: number}\n * ```\n * Note that this is different from when an attribute has a plain object type.\n * ```\n * query getHuman {\n * me: human(id: \"me\") { id }\n * }\n * ```\n * produces\n * ```\n * type getHuman = {me: getHuman_me}\n * type getHuman_me = {id: string}\n * ```\n * instead of e.g. `getHuman_me_Human`.\n */\n const result = babelTypes.unionTypeAnnotation(\n selectedAttributes.map(({typeName, attributes}) =>\n sortedObjectTypeAnnotation(\n {...config, path: config.path.concat([typeName])},\n attributes,\n ),\n ),\n );\n const name = config.path.join('_');\n if (config.allObjectTypes && config.path.length > 1) {\n config.allObjectTypes[name] = result;\n return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));\n }\n return result;\n};\nconst unionOrInterfaceSelection = (\n config,\n type,\n possible,\n selection,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n if (selection.kind === 'Field' && selection.name.value === '__typename') {\n const alias = selection.alias\n ? selection.alias.value\n : selection.name.value;\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(possible.name),\n ),\n ];\n }\n if (selection.kind === 'Field' && type.kind !== 'UNION') {\n // this is an interface\n const name = selection.name.value;\n const alias = selection.alias ? selection.alias.value : name;\n if (!type.fieldsByName[name]) {\n config.errors.push(\n 'Unknown field: ' +\n name +\n ' on type ' +\n type.name +\n ' for possible ' +\n possible.name,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FIELD`),\n ),\n ),\n ];\n }\n const typeField = type.fieldsByName[name];\n return [\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(\n {...config, path: config.path.concat([name])},\n typeField.type,\n selection,\n ),\n ),\n ),\n ];\n }\n if (selection.kind === 'FragmentSpread') {\n const fragment = config.fragments[selection.name.value];\n if (!fragment) {\n throw new Error(`Unknown fragment ${selection.name.value}`);\n }\n const typeName = fragment.typeCondition.name.value;\n if (\n (config.schema.interfacesByName[typeName] &&\n config.schema.interfacesByName[typeName].possibleTypesByName[\n possible.name\n ]) ||\n typeName === possible.name\n ) {\n return [].concat(\n ...fragment.selectionSet.selections.map((selection) =>\n unionOrInterfaceSelection(\n config,\n config.schema.typesByName[possible.name],\n possible,\n selection,\n ),\n ),\n );\n } else {\n return [];\n }\n }\n if (selection.kind !== 'InlineFragment') {\n config.errors.push(\n `union selectors must be inline fragment: found ${selection.kind}`,\n );\n if (type.kind === 'UNION') {\n config.errors\n .push(`You're trying to select a field from the union ${type.name},\nbut the only field you're allowed to select is \"__typename\".\nTry using an inline fragment \"... on SomeType {}\".`);\n }\n return [];\n }\n if (selection.typeCondition) {\n const typeName = selection.typeCondition.name.value;\n const indirectMatch =\n config.schema.interfacesByName[typeName]?.possibleTypesByName[\n possible.name\n ];\n if (typeName !== possible.name && !indirectMatch) {\n return [];\n }\n }\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[possible.name],\n possible.name,\n selection.selectionSet.selections,\n );\n};\n"],"file":"generateResponseType.js"}
1
+ {"version":3,"sources":["../src/generateResponseType.js"],"names":["generateResponseType","schema","query","config","ast","querySelectionToObjectType","selectionSet","selections","operation","typesByName","Mutation","Query","code","sortedObjectTypeAnnotation","properties","obj","babelTypes","objectTypeAnnotation","sort","a","b","type","aName","key","name","bName","undefined","path","join","isTopLevelType","length","allObjectTypes","genericTypeAnnotation","identifier","generateFragmentType","fragment","onType","typeCondition","value","objectPropertiesToFlow","interfacesByName","unionOrInterfaceToFlow","unionsByName","Error","_typeToFlow","selection","kind","readOnlyArray","typeParameterInstantiation","typeToFlow","ofType","union","console","log","anyTypeAnnotation","tname","childType","description","strictNullability","inner","result","nullableTypeAnnotation","ensureOnlyOneTypenameProperty","seenTypeName","filter","typeName","concat","map","newTypeName","fragments","errors","push","objectTypeProperty","alias","stringLiteralTypeAnnotation","fieldsByName","typeField","allFields","every","selectedAttributes","possibleTypes","slice","possible","configWithUpdatedPath","attributes","unionOrInterfaceSelection","flat","sharedAttributes","typeNameIndex","findIndex","x","unionTypeAnnotation","attrs","possibleTypesByName","indirectMatch"],"mappings":"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","sourcesContent":["// @flow\n/* eslint-disable no-console */\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport * as babelTypes from '@babel/types';\nimport {type BabelNodeFlowType} from '@babel/types';\nimport type {\n FieldNode,\n IntrospectionOutputTypeRef,\n OperationDefinitionNode,\n FragmentDefinitionNode,\n} from 'graphql';\nimport type {Config, Schema, Selections} from './types';\nimport {\n liftLeadingPropertyComments,\n maybeAddDescriptionComment,\n transferLeadingComments,\n} from './utils';\nimport {enumTypeToFlow, scalarTypeToFlow} from './enums';\nimport type {\n IntrospectionField,\n IntrospectionInterfaceType,\n IntrospectionObjectType,\n IntrospectionUnionType,\n} from 'graphql/utilities/introspectionQuery';\nimport {\n BabelNodeObjectTypeProperty,\n BabelNodeObjectTypeSpreadProperty,\n} from '@babel/types';\n\nexport const generateResponseType = (\n schema: Schema,\n query: OperationDefinitionNode,\n config: Config,\n): string => {\n const ast = querySelectionToObjectType(\n config,\n query.selectionSet.selections,\n query.operation === 'mutation'\n ? schema.typesByName.Mutation\n : schema.typesByName.Query,\n query.operation === 'mutation' ? 'mutation' : 'query',\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n return generate(ast).code;\n};\n\nconst sortedObjectTypeAnnotation = (\n config: Config,\n properties: Array<\n BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,\n >,\n) => {\n const obj = babelTypes.objectTypeAnnotation(\n properties.sort((a, b) => {\n if (\n a.type === 'ObjectTypeProperty' &&\n b.type === 'ObjectTypeProperty'\n ) {\n const aName = a.key.type === 'Identifier' ? a.key.name : '';\n const bName = b.key.type === 'Identifier' ? b.key.name : '';\n return aName < bName ? -1 : 1;\n }\n return 0;\n }),\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n );\n const name = config.path.join('_');\n const isTopLevelType = config.path.length <= 1;\n if (config.allObjectTypes != null && !isTopLevelType) {\n config.allObjectTypes[name] = obj;\n return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));\n } else {\n return obj;\n }\n};\n\nexport const generateFragmentType = (\n schema: Schema,\n fragment: FragmentDefinitionNode,\n config: Config,\n): string => {\n const onType = fragment.typeCondition.name.value;\n let ast;\n\n if (schema.typesByName[onType]) {\n ast = sortedObjectTypeAnnotation(\n config,\n objectPropertiesToFlow(\n config,\n schema.typesByName[onType],\n onType,\n fragment.selectionSet.selections,\n ),\n );\n } else if (schema.interfacesByName[onType]) {\n ast = unionOrInterfaceToFlow(\n config,\n config.schema.interfacesByName[onType],\n fragment.selectionSet.selections,\n );\n } else if (schema.unionsByName[onType]) {\n ast = unionOrInterfaceToFlow(\n config,\n config.schema.unionsByName[onType],\n fragment.selectionSet.selections,\n );\n } else {\n throw new Error(`Unknown ${onType}`);\n }\n\n // eslint-disable-next-line flowtype-errors/uncovered\n return generate(ast).code;\n};\n\nconst _typeToFlow = (\n config: Config,\n type,\n selection,\n): babelTypes.BabelNodeFlowType => {\n if (type.kind === 'SCALAR') {\n return scalarTypeToFlow(config, type.name);\n }\n if (type.kind === 'LIST') {\n return babelTypes.genericTypeAnnotation(\n config.readOnlyArray\n ? babelTypes.identifier('$ReadOnlyArray')\n : babelTypes.identifier('Array'),\n babelTypes.typeParameterInstantiation([\n typeToFlow(config, type.ofType, selection),\n ]),\n );\n }\n if (type.kind === 'UNION') {\n const union = config.schema.unionsByName[type.name];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n union,\n selection.selectionSet.selections,\n );\n }\n\n if (type.kind === 'INTERFACE') {\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n config.schema.interfacesByName[type.name],\n selection.selectionSet.selections,\n );\n }\n if (type.kind === 'ENUM') {\n return enumTypeToFlow(config, type.name);\n }\n if (type.kind !== 'OBJECT') {\n console.log('not object', type);\n return babelTypes.anyTypeAnnotation();\n }\n\n const tname = type.name;\n if (!config.schema.typesByName[tname]) {\n console.log('unknown referenced type', tname);\n return babelTypes.anyTypeAnnotation();\n }\n const childType = config.schema.typesByName[tname];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return maybeAddDescriptionComment(\n childType.description,\n querySelectionToObjectType(\n config,\n selection.selectionSet.selections,\n childType,\n tname,\n ),\n );\n};\n\nexport const typeToFlow = (\n config: Config,\n type: IntrospectionOutputTypeRef,\n selection: FieldNode,\n): babelTypes.BabelNodeFlowType => {\n // throw new Error('npoe');\n if (type.kind === 'NON_NULL') {\n return _typeToFlow(config, type.ofType, selection);\n }\n // If we don'babelTypes care about strict nullability checking, then pretend everything is non-null\n if (!config.strictNullability) {\n return _typeToFlow(config, type, selection);\n }\n const inner = _typeToFlow(config, type, selection);\n const result = babelTypes.nullableTypeAnnotation(inner);\n return transferLeadingComments(inner, result);\n};\n\nconst ensureOnlyOneTypenameProperty = (properties) => {\n let seenTypeName: false | string = false;\n return properties.filter((type) => {\n // The apollo-utilities \"addTypeName\" utility will add it\n // even if it's already specified :( so we have to filter out\n // the extra one here.\n if (\n type.type === 'ObjectTypeProperty' &&\n type.key.name === '__typename'\n ) {\n const name =\n type.value.type === 'StringLiteralTypeAnnotation'\n ? type.value.value\n : 'INVALID';\n if (seenTypeName) {\n if (name !== seenTypeName) {\n throw new Error(\n `Got two different type names ${name}, ${seenTypeName}`,\n );\n }\n return false;\n }\n seenTypeName = name;\n }\n return true;\n });\n};\n\nconst querySelectionToObjectType = (\n config: Config,\n selections,\n type,\n typeName: string,\n): BabelNodeFlowType => {\n return sortedObjectTypeAnnotation(\n config,\n ensureOnlyOneTypenameProperty(\n objectPropertiesToFlow(config, type, typeName, selections),\n ),\n );\n};\n\nexport const objectPropertiesToFlow = (\n config: Config,\n type: IntrospectionObjectType & {\n fieldsByName: {[name: string]: IntrospectionField},\n },\n typeName: string,\n selections: Selections,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n return [].concat(\n ...selections.map((selection) => {\n switch (selection.kind) {\n case 'InlineFragment': {\n const newTypeName =\n selection.typeCondition?.name.value ?? typeName;\n if (newTypeName !== typeName) {\n return [];\n }\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[newTypeName],\n newTypeName,\n selection.selectionSet.selections,\n );\n }\n case 'FragmentSpread':\n if (!config.fragments[selection.name.value]) {\n config.errors.push(\n `No fragment named '${selection.name.value}'. Did you forget to include it in the template literal?`,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(selection.name.value),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FRAGMENT`),\n ),\n ),\n ];\n }\n\n return objectPropertiesToFlow(\n config,\n type,\n typeName,\n config.fragments[selection.name.value].selectionSet\n .selections,\n );\n\n case 'Field':\n const name = selection.name.value;\n const alias: string = selection.alias\n ? selection.alias.value\n : name;\n if (name === '__typename') {\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(\n typeName,\n ),\n ),\n ];\n }\n if (!type.fieldsByName[name]) {\n config.errors.push(\n `Unknown field '${name}' for type '${typeName}'`,\n );\n return babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(\n `UNKNOWN_FIELD[\"${name}\"]`,\n ),\n ),\n );\n }\n const typeField = type.fieldsByName[name];\n\n return [\n maybeAddDescriptionComment(\n typeField.description,\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(\n {\n ...config,\n path: config.path.concat([alias]),\n },\n typeField.type,\n selection,\n ),\n ),\n ),\n ),\n ];\n\n default:\n config.errors.push(\n // eslint-disable-next-line flowtype-errors/uncovered\n `Unsupported selection kind '${selection.kind}'`,\n );\n return [];\n }\n }),\n );\n};\n\nexport const unionOrInterfaceToFlow = (\n config: Config,\n type:\n | IntrospectionUnionType\n | (IntrospectionInterfaceType & {\n fieldsByName: {[key: string]: IntrospectionField},\n }),\n selections: Selections,\n): BabelNodeFlowType => {\n const allFields = selections.every(\n (selection) => selection.kind === 'Field',\n );\n const selectedAttributes: Array<{\n attributes: Array<\n BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,\n >,\n typeName: string,\n }> = type.possibleTypes\n .slice()\n .sort((a, b) => {\n return a.name < b.name ? -1 : 1;\n })\n .map((possible) => {\n const configWithUpdatedPath = {\n ...config,\n path: allFields\n ? config.path\n : config.path.concat([possible.name]),\n };\n return {\n typeName: possible.name,\n attributes: ensureOnlyOneTypenameProperty(\n selections\n .map((selection) =>\n unionOrInterfaceSelection(\n configWithUpdatedPath,\n type,\n possible,\n selection,\n ),\n )\n .flat(),\n ),\n };\n });\n // If they're all fields, the only selection that could be different is __typename\n if (allFields) {\n const sharedAttributes = selectedAttributes[0].attributes.slice();\n const typeNameIndex = selectedAttributes[0].attributes.findIndex(\n (x) =>\n x.type === 'ObjectTypeProperty' &&\n x.key.type === 'Identifier' &&\n x.key.name === '__typename',\n );\n if (typeNameIndex !== -1) {\n sharedAttributes[typeNameIndex] = babelTypes.objectTypeProperty(\n babelTypes.identifier('__typename'),\n babelTypes.unionTypeAnnotation(\n selectedAttributes.map(\n (attrs) =>\n // eslint-disable-next-line flowtype-errors/uncovered\n ((attrs.attributes[\n typeNameIndex\n ]: any): BabelNodeObjectTypeProperty).value,\n ),\n ),\n );\n }\n return sortedObjectTypeAnnotation(config, sharedAttributes);\n }\n if (selectedAttributes.length === 1) {\n return sortedObjectTypeAnnotation(\n config,\n selectedAttributes[0].attributes,\n );\n }\n /**\n * When generating the objects for the sub-options of a union, the path needs\n * to include the name of the object type.\n * ```\n * query getFriend {\n * friend {\n * ... on Human { id }\n * ... on Droid { arms }\n * }\n * }\n * ```\n * produces\n * ```\n * type getFriend = {friend: getFriend_friend_Human | getFriend_friend_Droid }\n * type getFriend_friend_Human = {id: string}\n * type getFriend_friend_Droid = {arms: number}\n * ```\n * Note that this is different from when an attribute has a plain object type.\n * ```\n * query getHuman {\n * me: human(id: \"me\") { id }\n * }\n * ```\n * produces\n * ```\n * type getHuman = {me: getHuman_me}\n * type getHuman_me = {id: string}\n * ```\n * instead of e.g. `getHuman_me_Human`.\n */\n const result = babelTypes.unionTypeAnnotation(\n selectedAttributes.map(({typeName, attributes}) =>\n sortedObjectTypeAnnotation(\n {...config, path: config.path.concat([typeName])},\n attributes,\n ),\n ),\n );\n const name = config.path.join('_');\n if (config.allObjectTypes && config.path.length > 1) {\n config.allObjectTypes[name] = result;\n return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));\n }\n return result;\n};\nconst unionOrInterfaceSelection = (\n config,\n type,\n possible,\n selection,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n if (selection.kind === 'Field' && selection.name.value === '__typename') {\n const alias = selection.alias\n ? selection.alias.value\n : selection.name.value;\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(possible.name),\n ),\n ];\n }\n if (selection.kind === 'Field' && type.kind !== 'UNION') {\n // this is an interface\n const name = selection.name.value;\n const alias = selection.alias ? selection.alias.value : name;\n if (!type.fieldsByName[name]) {\n config.errors.push(\n 'Unknown field: ' +\n name +\n ' on type ' +\n type.name +\n ' for possible ' +\n possible.name,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FIELD`),\n ),\n ),\n ];\n }\n const typeField = type.fieldsByName[name];\n return [\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(\n {...config, path: config.path.concat([name])},\n typeField.type,\n selection,\n ),\n ),\n ),\n ];\n }\n if (selection.kind === 'FragmentSpread') {\n const fragment = config.fragments[selection.name.value];\n if (!fragment) {\n throw new Error(`Unknown fragment ${selection.name.value}`);\n }\n const typeName = fragment.typeCondition.name.value;\n if (\n (config.schema.interfacesByName[typeName] &&\n config.schema.interfacesByName[typeName].possibleTypesByName[\n possible.name\n ]) ||\n typeName === possible.name\n ) {\n return [].concat(\n ...fragment.selectionSet.selections.map((selection) =>\n unionOrInterfaceSelection(\n config,\n config.schema.typesByName[possible.name],\n possible,\n selection,\n ),\n ),\n );\n } else {\n return [];\n }\n }\n if (selection.kind !== 'InlineFragment') {\n config.errors.push(\n `union selectors must be inline fragment: found ${selection.kind}`,\n );\n if (type.kind === 'UNION') {\n config.errors\n .push(`You're trying to select a field from the union ${type.name},\nbut the only field you're allowed to select is \"__typename\".\nTry using an inline fragment \"... on SomeType {}\".`);\n }\n return [];\n }\n if (selection.typeCondition) {\n const typeName = selection.typeCondition.name.value;\n const indirectMatch =\n config.schema.interfacesByName[typeName]?.possibleTypesByName[\n possible.name\n ];\n if (typeName !== possible.name && !indirectMatch) {\n return [];\n }\n }\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[possible.name],\n possible.name,\n selection.selectionSet.selections,\n );\n};\n"],"file":"generateResponseType.js"}
@@ -56,7 +56,7 @@ const generateTypeFileContents = (fileName, schema, document, options, generated
56
56
  }) => {
57
57
  // We write all generated files to a `__generated__` subdir to keep
58
58
  // things tidy.
59
- const targetFileName = `${name}.js`;
59
+ const targetFileName = options.typeFileName ? options.typeFileName.replace('[operationName]', name) : `${name}.js`;
60
60
 
61
61
  const targetPath = _path.default.join(generatedDir, targetFileName);
62
62
 
@@ -83,7 +83,9 @@ const generateTypeFileContents = (fileName, schema, document, options, generated
83
83
  exports.generateTypeFileContents = generateTypeFileContents;
84
84
 
85
85
  const generateTypeFiles = (fileName, schema, document, options) => {
86
- const generatedDir = _path.default.join(_path.default.dirname(fileName), options.generatedDirectory ?? '__generated__');
86
+ var _options$generatedDir;
87
+
88
+ const generatedDir = _path.default.join(_path.default.dirname(fileName), (_options$generatedDir = options.generatedDirectory) !== null && _options$generatedDir !== void 0 ? _options$generatedDir : '__generated__');
87
89
 
88
90
  const indexFile = _path.default.join(generatedDir, 'index.js');
89
91
 
@@ -130,7 +132,8 @@ const processPragmas = (options, rawSource) => {
130
132
  scalars: options.scalars,
131
133
  splitTypes: options.splitTypes,
132
134
  generatedDirectory: options.generatedDirectory,
133
- exportAllObjectTypes: options.exportAllObjectTypes
135
+ exportAllObjectTypes: options.exportAllObjectTypes,
136
+ typeFileName: options.typeFileName
134
137
  };
135
138
  } else {
136
139
  return null;
@@ -20,6 +20,7 @@ export type ExternalOptions = {
20
20
  splitTypes?: boolean,
21
21
  generatedDirectory?: string,
22
22
  exportAllObjectTypes?: boolean,
23
+ typeFileName?: string,
23
24
  };
24
25
 
25
26
  export const indexPrelude = (regenerateCommand?: string): string => `// @flow
@@ -64,7 +65,9 @@ export const generateTypeFileContents = (
64
65
  generated.forEach(({name, typeName, code, isFragment, extraTypes}) => {
65
66
  // We write all generated files to a `__generated__` subdir to keep
66
67
  // things tidy.
67
- const targetFileName = `${name}.js`;
68
+ const targetFileName = options.typeFileName
69
+ ? options.typeFileName.replace('[operationName]', name)
70
+ : `${name}.js`;
68
71
  const targetPath = path.join(generatedDir, targetFileName);
69
72
 
70
73
  let fileContents =
@@ -160,6 +163,7 @@ export const processPragmas = (
160
163
  splitTypes: options.splitTypes,
161
164
  generatedDirectory: options.generatedDirectory,
162
165
  exportAllObjectTypes: options.exportAllObjectTypes,
166
+ typeFileName: options.typeFileName,
163
167
  };
164
168
  } else {
165
169
  return null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/generateTypeFiles.js"],"names":["indexPrelude","regenerateCommand","generateTypeFileContents","fileName","schema","document","options","generatedDir","indexContents","files","addToIndex","filePath","typeName","newLine","path","basename","indexOf","lines","split","map","line","includes","join","generated","forEach","name","code","isFragment","extraTypes","targetFileName","targetPath","fileContents","splitTypes","Object","keys","replace","generateTypeFiles","dirname","generatedDirectory","indexFile","fs","existsSync","mkdirSync","recursive","writeFileSync","readFileSync","key","processPragmas","rawSource","ignorePragma","autogen","loosePragma","autogenStrict","pragma","noPragmas","strictNullability","readOnlyArray","scalars","exportAllObjectTypes"],"mappings":"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","sourcesContent":["// @flow\n// Import this in your jest setup, to mock out graphql-tag!\nimport type {DocumentNode} from 'graphql';\nimport type {Options, Schema, Scalars} from './types';\nimport fs from 'fs';\nimport path from 'path';\nimport {documentToFlowTypes} from '.';\n\nexport type ExternalOptions = {\n pragma?: string,\n loosePragma?: string,\n ignorePragma?: string,\n scalars?: Scalars,\n strictNullability?: boolean,\n /**\n * The command that users should run to regenerate the types files.\n */\n regenerateCommand?: string,\n readOnlyArray?: boolean,\n splitTypes?: boolean,\n generatedDirectory?: string,\n exportAllObjectTypes?: boolean,\n};\n\nexport const indexPrelude = (regenerateCommand?: string): string => `// @flow\n//\n// AUTOGENERATED\n// NOTE: New response types are added to this file automatically.\n// Outdated response types can be removed manually as they are deprecated.\n//${regenerateCommand ? ' To regenerate, run ' + regenerateCommand : ''}\n//\n\n`;\n\nexport const generateTypeFileContents = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: Options,\n generatedDir: string,\n indexContents: string,\n): {indexContents: string, files: {[key: string]: string}} => {\n const files = {};\n\n /// Write export for __generated__/index.js if it doesn't exist\n const addToIndex = (filePath, typeName) => {\n const newLine = `export type {${typeName}} from './${path.basename(\n filePath,\n )}';`;\n if (indexContents.indexOf('./' + path.basename(filePath)) === -1) {\n indexContents += newLine + '\\n';\n } else {\n const lines = indexContents.split('\\n').map((line) => {\n if (line.includes('./' + path.basename(filePath))) {\n return newLine;\n }\n return line;\n });\n indexContents = lines.join('\\n');\n }\n };\n\n const generated = documentToFlowTypes(document, schema, options);\n generated.forEach(({name, typeName, code, isFragment, extraTypes}) => {\n // We write all generated files to a `__generated__` subdir to keep\n // things tidy.\n const targetFileName = `${name}.js`;\n const targetPath = path.join(generatedDir, targetFileName);\n\n let fileContents =\n '// @' +\n `flow\\n// AUTOGENERATED -- DO NOT EDIT\\n` +\n `// Generated for operation '${name}' in file '../${path.basename(\n fileName,\n )}'\\n` +\n (options.regenerateCommand\n ? `// To regenerate, run '${options.regenerateCommand}'.\\n`\n : '') +\n code;\n if (options.splitTypes && !isFragment) {\n fileContents +=\n `\\nexport type ${name} = ${typeName}['response'];\\n` +\n `export type ${name}Variables = ${typeName}['variables'];\\n`;\n }\n Object.keys(extraTypes).forEach((name) => {\n fileContents += `\\n\\nexport type ${name} = ${extraTypes[name]};`;\n });\n\n addToIndex(targetPath, typeName);\n files[targetPath] =\n fileContents\n // Remove whitespace from the ends of lines; babel's generate sometimes\n // leaves them hanging around.\n .replace(/\\s+$/gm, '') + '\\n';\n });\n\n return {files, indexContents};\n};\n\nexport const generateTypeFiles = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: Options,\n) => {\n const generatedDir = path.join(\n path.dirname(fileName),\n options.generatedDirectory ?? '__generated__',\n );\n const indexFile = path.join(generatedDir, 'index.js');\n\n if (!fs.existsSync(generatedDir)) {\n fs.mkdirSync(generatedDir, {recursive: true});\n }\n if (!fs.existsSync(indexFile)) {\n fs.writeFileSync(indexFile, indexPrelude(options.regenerateCommand));\n }\n\n const {indexContents, files} = generateTypeFileContents(\n fileName,\n schema,\n document,\n options,\n generatedDir,\n fs.readFileSync(indexFile, 'utf8'),\n );\n\n fs.writeFileSync(indexFile, indexContents);\n Object.keys(files).forEach((key) => {\n fs.writeFileSync(key, files[key]);\n });\n\n fs.writeFileSync(indexFile, indexContents);\n};\n\nexport const processPragmas = (\n options: ExternalOptions,\n rawSource: string,\n): null | Options => {\n if (options.ignorePragma && rawSource.includes(options.ignorePragma)) {\n return null;\n }\n\n const autogen = options.loosePragma\n ? rawSource.includes(options.loosePragma)\n : false;\n const autogenStrict = options.pragma\n ? rawSource.includes(options.pragma)\n : false;\n const noPragmas = !options.loosePragma && !options.pragma;\n\n if (autogen || autogenStrict || noPragmas) {\n return {\n regenerateCommand: options.regenerateCommand,\n strictNullability: noPragmas\n ? options.strictNullability\n : autogenStrict || !autogen,\n readOnlyArray: options.readOnlyArray,\n scalars: options.scalars,\n splitTypes: options.splitTypes,\n generatedDirectory: options.generatedDirectory,\n exportAllObjectTypes: options.exportAllObjectTypes,\n };\n } else {\n return null;\n }\n};\n"],"file":"generateTypeFiles.js"}
1
+ {"version":3,"sources":["../src/generateTypeFiles.js"],"names":["indexPrelude","regenerateCommand","generateTypeFileContents","fileName","schema","document","options","generatedDir","indexContents","files","addToIndex","filePath","typeName","newLine","path","basename","indexOf","lines","split","map","line","includes","join","generated","forEach","name","code","isFragment","extraTypes","targetFileName","typeFileName","replace","targetPath","fileContents","splitTypes","Object","keys","generateTypeFiles","dirname","generatedDirectory","indexFile","fs","existsSync","mkdirSync","recursive","writeFileSync","readFileSync","key","processPragmas","rawSource","ignorePragma","autogen","loosePragma","autogenStrict","pragma","noPragmas","strictNullability","readOnlyArray","scalars","exportAllObjectTypes"],"mappings":"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","sourcesContent":["// @flow\n// Import this in your jest setup, to mock out graphql-tag!\nimport type {DocumentNode} from 'graphql';\nimport type {Options, Schema, Scalars} from './types';\nimport fs from 'fs';\nimport path from 'path';\nimport {documentToFlowTypes} from '.';\n\nexport type ExternalOptions = {\n pragma?: string,\n loosePragma?: string,\n ignorePragma?: string,\n scalars?: Scalars,\n strictNullability?: boolean,\n /**\n * The command that users should run to regenerate the types files.\n */\n regenerateCommand?: string,\n readOnlyArray?: boolean,\n splitTypes?: boolean,\n generatedDirectory?: string,\n exportAllObjectTypes?: boolean,\n typeFileName?: string,\n};\n\nexport const indexPrelude = (regenerateCommand?: string): string => `// @flow\n//\n// AUTOGENERATED\n// NOTE: New response types are added to this file automatically.\n// Outdated response types can be removed manually as they are deprecated.\n//${regenerateCommand ? ' To regenerate, run ' + regenerateCommand : ''}\n//\n\n`;\n\nexport const generateTypeFileContents = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: Options,\n generatedDir: string,\n indexContents: string,\n): {indexContents: string, files: {[key: string]: string}} => {\n const files = {};\n\n /// Write export for __generated__/index.js if it doesn't exist\n const addToIndex = (filePath, typeName) => {\n const newLine = `export type {${typeName}} from './${path.basename(\n filePath,\n )}';`;\n if (indexContents.indexOf('./' + path.basename(filePath)) === -1) {\n indexContents += newLine + '\\n';\n } else {\n const lines = indexContents.split('\\n').map((line) => {\n if (line.includes('./' + path.basename(filePath))) {\n return newLine;\n }\n return line;\n });\n indexContents = lines.join('\\n');\n }\n };\n\n const generated = documentToFlowTypes(document, schema, options);\n generated.forEach(({name, typeName, code, isFragment, extraTypes}) => {\n // We write all generated files to a `__generated__` subdir to keep\n // things tidy.\n const targetFileName = options.typeFileName\n ? options.typeFileName.replace('[operationName]', name)\n : `${name}.js`;\n const targetPath = path.join(generatedDir, targetFileName);\n\n let fileContents =\n '// @' +\n `flow\\n// AUTOGENERATED -- DO NOT EDIT\\n` +\n `// Generated for operation '${name}' in file '../${path.basename(\n fileName,\n )}'\\n` +\n (options.regenerateCommand\n ? `// To regenerate, run '${options.regenerateCommand}'.\\n`\n : '') +\n code;\n if (options.splitTypes && !isFragment) {\n fileContents +=\n `\\nexport type ${name} = ${typeName}['response'];\\n` +\n `export type ${name}Variables = ${typeName}['variables'];\\n`;\n }\n Object.keys(extraTypes).forEach((name) => {\n fileContents += `\\n\\nexport type ${name} = ${extraTypes[name]};`;\n });\n\n addToIndex(targetPath, typeName);\n files[targetPath] =\n fileContents\n // Remove whitespace from the ends of lines; babel's generate sometimes\n // leaves them hanging around.\n .replace(/\\s+$/gm, '') + '\\n';\n });\n\n return {files, indexContents};\n};\n\nexport const generateTypeFiles = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: Options,\n) => {\n const generatedDir = path.join(\n path.dirname(fileName),\n options.generatedDirectory ?? '__generated__',\n );\n const indexFile = path.join(generatedDir, 'index.js');\n\n if (!fs.existsSync(generatedDir)) {\n fs.mkdirSync(generatedDir, {recursive: true});\n }\n if (!fs.existsSync(indexFile)) {\n fs.writeFileSync(indexFile, indexPrelude(options.regenerateCommand));\n }\n\n const {indexContents, files} = generateTypeFileContents(\n fileName,\n schema,\n document,\n options,\n generatedDir,\n fs.readFileSync(indexFile, 'utf8'),\n );\n\n fs.writeFileSync(indexFile, indexContents);\n Object.keys(files).forEach((key) => {\n fs.writeFileSync(key, files[key]);\n });\n\n fs.writeFileSync(indexFile, indexContents);\n};\n\nexport const processPragmas = (\n options: ExternalOptions,\n rawSource: string,\n): null | Options => {\n if (options.ignorePragma && rawSource.includes(options.ignorePragma)) {\n return null;\n }\n\n const autogen = options.loosePragma\n ? rawSource.includes(options.loosePragma)\n : false;\n const autogenStrict = options.pragma\n ? rawSource.includes(options.pragma)\n : false;\n const noPragmas = !options.loosePragma && !options.pragma;\n\n if (autogen || autogenStrict || noPragmas) {\n return {\n regenerateCommand: options.regenerateCommand,\n strictNullability: noPragmas\n ? options.strictNullability\n : autogenStrict || !autogen,\n readOnlyArray: options.readOnlyArray,\n scalars: options.scalars,\n splitTypes: options.splitTypes,\n generatedDirectory: options.generatedDirectory,\n exportAllObjectTypes: options.exportAllObjectTypes,\n typeFileName: options.typeFileName,\n };\n } else {\n return null;\n }\n};\n"],"file":"generateTypeFiles.js"}
package/dist/index.js CHANGED
@@ -33,10 +33,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
33
33
  */
34
34
  // eslint-disable-line flowtype-errors/uncovered
35
35
  const optionsToConfig = (schema, definitions, options, errors = []) => {
36
+ var _options$strictNullab, _options$readOnlyArra, _options$scalars;
37
+
36
38
  const internalOptions = {
37
- strictNullability: (options === null || options === void 0 ? void 0 : options.strictNullability) ?? true,
38
- readOnlyArray: (options === null || options === void 0 ? void 0 : options.readOnlyArray) ?? true,
39
- scalars: (options === null || options === void 0 ? void 0 : options.scalars) ?? {}
39
+ strictNullability: (_options$strictNullab = options === null || options === void 0 ? void 0 : options.strictNullability) !== null && _options$strictNullab !== void 0 ? _options$strictNullab : true,
40
+ readOnlyArray: (_options$readOnlyArra = options === null || options === void 0 ? void 0 : options.readOnlyArray) !== null && _options$readOnlyArra !== void 0 ? _options$readOnlyArra : true,
41
+ scalars: (_options$scalars = options === null || options === void 0 ? void 0 : options.scalars) !== null && _options$scalars !== void 0 ? _options$scalars : {}
40
42
  };
41
43
  const fragments = {};
42
44
  definitions.forEach(def => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["optionsToConfig","schema","definitions","options","errors","internalOptions","strictNullability","readOnlyArray","scalars","fragments","forEach","def","kind","name","value","config","allObjectTypes","path","FlowGenerationError","Error","constructor","join","messages","documentToFlowTypes","document","result","map","item","types","code","exportAllObjectTypes","extraTypes","Object","keys","k","typeName","isFragment","operation","response","variables","filter","Boolean","length"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\n/* flow-uncovered-file */\n// @flow\n/**\n * This tool generates flowtype definitions from graphql queries.\n *\n * It relies on `introspection-query.json` existing in this directory,\n * which is produced by running `./tools/graphql-flow/sendIntrospection.js`.\n */\nimport type {DefinitionNode, DocumentNode} from 'graphql';\n\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport {\n generateFragmentType,\n generateResponseType,\n} from './generateResponseType';\nimport {generateVariablesType} from './generateVariablesType';\nexport {spyOnGraphqlTagToCollectQueries} from './jest-mock-graphql-tag';\n\nimport type {Config, Options, Schema} from './types';\n\nconst optionsToConfig = (\n schema: Schema,\n definitions: $ReadOnlyArray<DefinitionNode>,\n options?: Options,\n errors: Array<string> = [],\n): Config => {\n const internalOptions = {\n strictNullability: options?.strictNullability ?? true,\n readOnlyArray: options?.readOnlyArray ?? true,\n scalars: options?.scalars ?? {},\n };\n const fragments = {};\n definitions.forEach((def) => {\n if (def.kind === 'FragmentDefinition') {\n fragments[def.name.value] = def;\n }\n });\n const config = {\n fragments,\n schema,\n errors,\n allObjectTypes: null,\n path: [],\n ...internalOptions,\n };\n\n return config;\n};\n\nexport class FlowGenerationError extends Error {\n messages: Array<string>;\n constructor(errors: Array<string>) {\n super(`Graphql-flow type generation failed! ${errors.join('; ')}`);\n this.messages = errors;\n }\n}\n\nexport const documentToFlowTypes = (\n document: DocumentNode,\n schema: Schema,\n options?: Options,\n): $ReadOnlyArray<{\n name: string,\n typeName: string,\n code: string,\n isFragment?: boolean,\n extraTypes: {[key: string]: string},\n}> => {\n const errors: Array<string> = [];\n const config = optionsToConfig(\n schema,\n document.definitions,\n options,\n errors,\n );\n const result = document.definitions\n .map((item) => {\n if (item.kind === 'FragmentDefinition') {\n const name = item.name.value;\n const types = {};\n const code = `export type ${name} = ${generateFragmentType(\n schema,\n item,\n {\n ...config,\n path: [name],\n allObjectTypes: options?.exportAllObjectTypes\n ? types\n : null,\n },\n )};`;\n const extraTypes: {[key: string]: string} = {};\n Object.keys(types).forEach((k) => {\n // eslint-disable-next-line flowtype-errors/uncovered\n extraTypes[k] = generate(types[k]).code;\n });\n return {\n name,\n typeName: name,\n code,\n isFragment: true,\n extraTypes,\n };\n }\n if (\n item.kind === 'OperationDefinition' &&\n (item.operation === 'query' || item.operation === 'mutation') &&\n item.name\n ) {\n const types = {};\n const name = item.name.value;\n const response = generateResponseType(schema, item, {\n ...config,\n path: [name],\n allObjectTypes: options?.exportAllObjectTypes\n ? types\n : null,\n });\n const variables = generateVariablesType(schema, item, {\n ...config,\n path: [name],\n });\n\n const typeName = `${name}Type`;\n // TODO(jared): Maybe make this template configurable?\n // We'll see what's required to get webapp on board.\n const code = `export type ${typeName} = {|\\n variables: ${variables},\\n response: ${response}\\n|};`;\n\n const extraTypes: {[key: string]: string} = {};\n Object.keys(types).forEach((k) => {\n // eslint-disable-next-line flowtype-errors/uncovered\n extraTypes[k] = generate(types[k]).code;\n });\n return {name, typeName, code, extraTypes};\n }\n })\n .filter(Boolean);\n if (errors.length) {\n throw new FlowGenerationError(errors);\n }\n return result;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["optionsToConfig","schema","definitions","options","errors","internalOptions","strictNullability","readOnlyArray","scalars","fragments","forEach","def","kind","name","value","config","allObjectTypes","path","FlowGenerationError","Error","constructor","join","messages","documentToFlowTypes","document","result","map","item","types","code","exportAllObjectTypes","extraTypes","Object","keys","k","typeName","isFragment","operation","response","variables","filter","Boolean","length"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\n/* flow-uncovered-file */\n// @flow\n/**\n * This tool generates flowtype definitions from graphql queries.\n *\n * It relies on `introspection-query.json` existing in this directory,\n * which is produced by running `./tools/graphql-flow/sendIntrospection.js`.\n */\nimport type {DefinitionNode, DocumentNode} from 'graphql';\n\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport {\n generateFragmentType,\n generateResponseType,\n} from './generateResponseType';\nimport {generateVariablesType} from './generateVariablesType';\nexport {spyOnGraphqlTagToCollectQueries} from './jest-mock-graphql-tag';\n\nimport type {Config, Options, Schema} from './types';\n\nconst optionsToConfig = (\n schema: Schema,\n definitions: $ReadOnlyArray<DefinitionNode>,\n options?: Options,\n errors: Array<string> = [],\n): Config => {\n const internalOptions = {\n strictNullability: options?.strictNullability ?? true,\n readOnlyArray: options?.readOnlyArray ?? true,\n scalars: options?.scalars ?? {},\n };\n const fragments = {};\n definitions.forEach((def) => {\n if (def.kind === 'FragmentDefinition') {\n fragments[def.name.value] = def;\n }\n });\n const config = {\n fragments,\n schema,\n errors,\n allObjectTypes: null,\n path: [],\n ...internalOptions,\n };\n\n return config;\n};\n\nexport class FlowGenerationError extends Error {\n messages: Array<string>;\n constructor(errors: Array<string>) {\n super(`Graphql-flow type generation failed! ${errors.join('; ')}`);\n this.messages = errors;\n }\n}\n\nexport const documentToFlowTypes = (\n document: DocumentNode,\n schema: Schema,\n options?: Options,\n): $ReadOnlyArray<{\n name: string,\n typeName: string,\n code: string,\n isFragment?: boolean,\n extraTypes: {[key: string]: string},\n}> => {\n const errors: Array<string> = [];\n const config = optionsToConfig(\n schema,\n document.definitions,\n options,\n errors,\n );\n const result = document.definitions\n .map((item) => {\n if (item.kind === 'FragmentDefinition') {\n const name = item.name.value;\n const types = {};\n const code = `export type ${name} = ${generateFragmentType(\n schema,\n item,\n {\n ...config,\n path: [name],\n allObjectTypes: options?.exportAllObjectTypes\n ? types\n : null,\n },\n )};`;\n const extraTypes: {[key: string]: string} = {};\n Object.keys(types).forEach((k) => {\n // eslint-disable-next-line flowtype-errors/uncovered\n extraTypes[k] = generate(types[k]).code;\n });\n return {\n name,\n typeName: name,\n code,\n isFragment: true,\n extraTypes,\n };\n }\n if (\n item.kind === 'OperationDefinition' &&\n (item.operation === 'query' || item.operation === 'mutation') &&\n item.name\n ) {\n const types = {};\n const name = item.name.value;\n const response = generateResponseType(schema, item, {\n ...config,\n path: [name],\n allObjectTypes: options?.exportAllObjectTypes\n ? types\n : null,\n });\n const variables = generateVariablesType(schema, item, {\n ...config,\n path: [name],\n });\n\n const typeName = `${name}Type`;\n // TODO(jared): Maybe make this template configurable?\n // We'll see what's required to get webapp on board.\n const code = `export type ${typeName} = {|\\n variables: ${variables},\\n response: ${response}\\n|};`;\n\n const extraTypes: {[key: string]: string} = {};\n Object.keys(types).forEach((k) => {\n // eslint-disable-next-line flowtype-errors/uncovered\n extraTypes[k] = generate(types[k]).code;\n });\n return {name, typeName, code, extraTypes};\n }\n })\n .filter(Boolean);\n if (errors.length) {\n throw new FlowGenerationError(errors);\n }\n return result;\n};\n"],"file":"index.js"}
@@ -99,16 +99,16 @@ const processFile = (filePath, contents) => {
99
99
  const importPath = source.value.startsWith('.') ? _path.default.resolve(_path.default.join(dir, source.value)) : source.value;
100
100
  (_toplevel$specifiers = toplevel.specifiers) === null || _toplevel$specifiers === void 0 ? void 0 : _toplevel$specifiers.forEach(spec => {
101
101
  if (spec.type === 'ExportSpecifier' && spec.exported.type === 'Identifier') {
102
- var _spec$loc;
102
+ var _spec$start, _spec$end, _spec$loc$start$line, _spec$loc;
103
103
 
104
104
  result.exports[spec.exported.name] = {
105
105
  type: 'import',
106
106
  name: spec.local.name,
107
107
  path: importPath,
108
108
  loc: {
109
- start: spec.start ?? -1,
110
- end: spec.end ?? -1,
111
- line: ((_spec$loc = spec.loc) === null || _spec$loc === void 0 ? void 0 : _spec$loc.start.line) ?? -1,
109
+ start: (_spec$start = spec.start) !== null && _spec$start !== void 0 ? _spec$start : -1,
110
+ end: (_spec$end = spec.end) !== null && _spec$end !== void 0 ? _spec$end : -1,
111
+ line: (_spec$loc$start$line = (_spec$loc = spec.loc) === null || _spec$loc === void 0 ? void 0 : _spec$loc.start.line) !== null && _spec$loc$start$line !== void 0 ? _spec$loc$start$line : -1,
112
112
  path: filePath
113
113
  }
114
114
  };
@@ -144,17 +144,21 @@ const processFile = (filePath, contents) => {
144
144
  const tpl = processTemplate(init, result);
145
145
 
146
146
  if (tpl) {
147
+ var _init$start;
148
+
147
149
  const document = result.locals[id] = {
148
150
  type: 'document',
149
151
  source: tpl
150
152
  };
151
- seenTemplates[init.start ?? -1] = document;
153
+ seenTemplates[(_init$start = init.start) !== null && _init$start !== void 0 ? _init$start : -1] = document;
152
154
 
153
155
  if (isExported) {
154
156
  result.exports[id] = document;
155
157
  }
156
158
  } else {
157
- seenTemplates[init.start ?? -1] = false;
159
+ var _init$start2;
160
+
161
+ seenTemplates[(_init$start2 = init.start) !== null && _init$start2 !== void 0 ? _init$start2 : -1] = false;
158
162
  }
159
163
  }
160
164
  }
@@ -182,7 +186,9 @@ const processFile = (filePath, contents) => {
182
186
  });
183
187
 
184
188
  const visitTpl = (node, getBinding) => {
185
- if (seenTemplates[node.start ?? -1] != null) {
189
+ var _node$start;
190
+
191
+ if (seenTemplates[(_node$start = node.start) !== null && _node$start !== void 0 ? _node$start : -1] != null) {
186
192
  return;
187
193
  }
188
194
 
@@ -193,7 +199,9 @@ const processFile = (filePath, contents) => {
193
199
  const tpl = processTemplate(node, result, getBinding);
194
200
 
195
201
  if (tpl) {
196
- seenTemplates[node.start ?? -1] = {
202
+ var _node$start2;
203
+
204
+ seenTemplates[(_node$start2 = node.start) !== null && _node$start2 !== void 0 ? _node$start2 : -1] = {
197
205
  type: 'document',
198
206
  source: tpl
199
207
  };
@@ -201,7 +209,9 @@ const processFile = (filePath, contents) => {
201
209
  source: tpl
202
210
  });
203
211
  } else {
204
- seenTemplates[node.start ?? -1] = false;
212
+ var _node$start3;
213
+
214
+ seenTemplates[(_node$start3 = node.start) !== null && _node$start3 !== void 0 ? _node$start3 : -1] = false;
205
215
  }
206
216
  };
207
217
  /* eslint-disable flowtype-errors/uncovered */
@@ -232,17 +242,17 @@ exports.processFile = processFile;
232
242
  const processTemplate = (tpl, result, getTemplate // getBinding?: (name: string) => Binding,
233
243
  // seenTemplates,
234
244
  ) => {
235
- var _tpl$loc;
245
+ var _tpl$loc$start$line, _tpl$loc, _tpl$start, _tpl$end;
236
246
 
237
247
  // 'cooked' is the string as runtime javascript will see it.
238
248
  const literals = tpl.quasi.quasis.map(q => q.value.cooked || '');
239
249
  const expressions = tpl.quasi.expressions.map(expr => {
240
- var _expr$loc;
250
+ var _expr$start, _expr$end, _expr$loc$start$line, _expr$loc;
241
251
 
242
252
  const loc = {
243
- start: expr.start ?? -1,
244
- end: expr.end ?? -1,
245
- line: ((_expr$loc = expr.loc) === null || _expr$loc === void 0 ? void 0 : _expr$loc.start.line) ?? -1,
253
+ start: (_expr$start = expr.start) !== null && _expr$start !== void 0 ? _expr$start : -1,
254
+ end: (_expr$end = expr.end) !== null && _expr$end !== void 0 ? _expr$end : -1,
255
+ line: (_expr$loc$start$line = (_expr$loc = expr.loc) === null || _expr$loc === void 0 ? void 0 : _expr$loc.start.line) !== null && _expr$loc$start$line !== void 0 ? _expr$loc$start$line : -1,
246
256
  path: result.path
247
257
  };
248
258
 
@@ -279,9 +289,9 @@ const processTemplate = (tpl, result, getTemplate // getBinding?: (name: string)
279
289
  literals,
280
290
  expressions: expressions.filter(Boolean),
281
291
  loc: {
282
- line: ((_tpl$loc = tpl.loc) === null || _tpl$loc === void 0 ? void 0 : _tpl$loc.start.line) ?? -1,
283
- start: tpl.start ?? -1,
284
- end: tpl.end ?? -1,
292
+ line: (_tpl$loc$start$line = (_tpl$loc = tpl.loc) === null || _tpl$loc === void 0 ? void 0 : _tpl$loc.start.line) !== null && _tpl$loc$start$line !== void 0 ? _tpl$loc$start$line : -1,
293
+ start: (_tpl$start = tpl.start) !== null && _tpl$start !== void 0 ? _tpl$start : -1,
294
+ end: (_tpl$end = tpl.end) !== null && _tpl$end !== void 0 ? _tpl$end : -1,
285
295
  path: result.path
286
296
  }
287
297
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/parser/parse.js"],"names":["listExternalReferences","file","paths","add","v","followImports","type","path","source","expressions","forEach","expr","Object","keys","exports","k","locals","operations","op","processFile","filePath","contents","dir","dirname","result","errors","ast","sourceType","allowImportExportEverywhere","plugins","enums","gqlTagNames","seenTemplates","program","body","toplevel","newLocals","getLocals","local","startsWith","name","push","importPath","value","resolve","join","specifiers","spec","exported","loc","start","end","line","processDeclarator","decl","isExported","id","init","tag","includes","tpl","processTemplate","document","declarations","declaration","visitTpl","node","getBinding","TaggedTemplateExpression","binding","scope","getTemplate","literals","quasi","quasis","map","q","cooked","message","found","filter","Boolean","myPath","importKind","imported","processFiles","filePaths","getFileSource","files","toProcess","slice","length","next","shift"],"mappings":"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","sourcesContent":["// @flow\nimport type {\n BabelNodeImportDeclaration,\n BabelNodeVariableDeclarator,\n BabelNodeTaggedTemplateExpression,\n BabelNodeFile,\n} from '@babel/types';\n\nimport {parse} from '@babel/parser'; // eslint-disable-line flowtype-errors/uncovered\nimport traverse from '@babel/traverse'; // eslint-disable-line flowtype-errors/uncovered\n\nimport path from 'path';\n\n/**\n * This file is responsible for finding all gql`-annotated\n * template strings in a set of provided files, and for resolving\n * all fragment references to their eventual sources.\n *\n * Things that are supported:\n * - importing fragments from other files\n * - re-exporting fragments that were imported\n * - using locally-defined fragments, even if they're\n * not at the top level (scope is honored correctly)\n * - importing the gql tag as some other name\n * \t (e.g. 'import blah from \"graphql-tag\"')\n * - renaming fragments at the top level\n *\n * Things that are *not* supported:\n * - doing anything other than 'const x = gql`my template`'\n * \t e.g. const x = someCond ? one fragment literal : another fragment literal\n * or const x = someFragmentPreprocessor(fragment literal)\n * - importing the graphql tag fn from anywhere other than \"graphql-tag\"\n * - anything else fancy with the graphql tag fn, e.g. 'const blah = gql; blah`xyz`'\n * - including a fragment in an operation by anything other than a bare identifier,\n * e.g. 'const myQuery = gql`query xyz {...} ${cond ? someFrag : otherFrag}`.\n * - getting fragments from e.g. function arguments, or renaming non-toplevel fragments\n *\n * Things that could be supported, but are not yet:\n * - tracking whether a given graphql operation has already been wrapped\n * in `gqlOp<Type>()` or not (to inform an auto-wrapper of the future)\n */\n\nexport type Template = {|\n literals: Array<string>,\n expressions: Array<Document | Import>,\n loc: Loc,\n|};\nexport type Loc = {start: number, end: number, path: string, line: number};\n\nexport type Document = {|\n type: 'document',\n source: Template,\n|};\nexport type Import = {|\n type: 'import',\n name: string,\n path: string,\n loc: Loc,\n|};\n\nexport type Operation = {|\n source: Template,\n // TODO: Determine if an operation is already wrapped\n // in `gqlOp` so we can automatically wrap if needed.\n // needsWrapping: boolean,\n|};\n\nexport type FileResult = {|\n path: string,\n operations: Array<Operation>,\n exports: {[key: string]: Document | Import},\n locals: {[key: string]: Document | Import},\n errors: Array<{loc: Loc, message: string}>,\n|};\n\nexport type Files = {[path: string]: FileResult};\n\n/**\n * Finds all referenced imports that might possibly be relevant\n * graphql fragments.\n *\n * Importantly, any values that are re-exported are treated as\n * potentially relevant, and of course any values referenced\n * from a graphql template are treated as relevant.\n */\nconst listExternalReferences = (file: FileResult): Array<string> => {\n const paths = {};\n const add = (v: Document | Import, followImports: boolean) => {\n if (v.type === 'import') {\n if (followImports) {\n paths[v.path] = true;\n }\n } else {\n v.source.expressions.forEach((expr) => add(expr, true));\n }\n };\n Object.keys(file.exports).forEach((k) =>\n add(\n file.exports[k],\n // If we're re-exporting something, we need to follow that import.\n true,\n ),\n );\n Object.keys(file.locals).forEach((k) =>\n add(\n file.locals[k],\n // If we've imported something but haven't used it or exported it,\n // we don't need to follow the import.\n false,\n ),\n );\n file.operations.forEach((op) =>\n op.source.expressions.forEach((expr) =>\n add(\n expr,\n // Imports that are used in graphql expressions definitely need to be followed.\n true,\n ),\n ),\n );\n return Object.keys(paths);\n};\n\nexport const processFile = (filePath: string, contents: string): FileResult => {\n const dir = path.dirname(filePath);\n const result: FileResult = {\n path: filePath,\n operations: [],\n exports: {},\n locals: {},\n errors: [],\n };\n /* eslint-disable flowtype-errors/uncovered */\n const ast: BabelNodeFile = parse(contents, {\n sourceType: 'module',\n allowImportExportEverywhere: true,\n plugins: [['flow', {enums: true}], 'jsx'],\n });\n /* eslint-enable flowtype-errors/uncovered */\n const gqlTagNames = [];\n const seenTemplates: {[key: number]: Document | false} = {};\n\n ast.program.body.forEach((toplevel) => {\n if (toplevel.type === 'ImportDeclaration') {\n const newLocals = getLocals(dir, toplevel, filePath);\n if (newLocals) {\n Object.keys(newLocals).forEach((k) => {\n const local = newLocals[k];\n if (local.path.startsWith('/')) {\n result.locals[k] = local;\n }\n if (\n local.path === 'graphql-tag' &&\n local.name === 'default'\n ) {\n gqlTagNames.push(k);\n }\n });\n }\n }\n if (toplevel.type === 'ExportNamedDeclaration') {\n if (toplevel.source) {\n const source = toplevel.source;\n const importPath = source.value.startsWith('.')\n ? path.resolve(path.join(dir, source.value))\n : source.value;\n toplevel.specifiers?.forEach((spec) => {\n if (\n spec.type === 'ExportSpecifier' &&\n spec.exported.type === 'Identifier'\n ) {\n result.exports[spec.exported.name] = {\n type: 'import',\n name: spec.local.name,\n path: importPath,\n loc: {\n start: spec.start ?? -1,\n end: spec.end ?? -1,\n line: spec.loc?.start.line ?? -1,\n path: filePath,\n },\n };\n }\n });\n } else {\n toplevel.specifiers?.forEach((spec) => {\n if (spec.type === 'ExportSpecifier') {\n const local = result.locals[spec.local.name];\n if (local && spec.exported.type === 'Identifier') {\n result.exports[spec.exported.name] = local;\n }\n }\n });\n }\n }\n\n const processDeclarator = (\n decl: BabelNodeVariableDeclarator,\n isExported: boolean,\n ) => {\n if (decl.id.type !== 'Identifier' || !decl.init) {\n return;\n }\n const {init} = decl;\n const id = decl.id.name;\n if (\n init.type === 'TaggedTemplateExpression' &&\n init.tag.type === 'Identifier'\n ) {\n if (gqlTagNames.includes(init.tag.name)) {\n const tpl = processTemplate(init, result);\n if (tpl) {\n const document = (result.locals[id] = {\n type: 'document',\n source: tpl,\n });\n seenTemplates[init.start ?? -1] = document;\n if (isExported) {\n result.exports[id] = document;\n }\n } else {\n seenTemplates[init.start ?? -1] = false;\n }\n }\n }\n if (init.type === 'Identifier' && result.locals[init.name]) {\n result.locals[id] = result.locals[init.name];\n if (isExported) {\n result.exports[id] = result.locals[init.name];\n }\n }\n };\n\n if (toplevel.type === 'VariableDeclaration') {\n toplevel.declarations.forEach((decl) => {\n processDeclarator(decl, false);\n });\n }\n\n if (\n toplevel.type === 'ExportNamedDeclaration' &&\n toplevel.declaration?.type === 'VariableDeclaration'\n ) {\n toplevel.declaration.declarations.forEach((decl) => {\n processDeclarator(decl, true);\n });\n }\n });\n\n const visitTpl = (\n node: BabelNodeTaggedTemplateExpression,\n getBinding: (name: string) => Document | null,\n ) => {\n if (seenTemplates[node.start ?? -1] != null) {\n return;\n }\n if (\n node.tag.type !== 'Identifier' ||\n !gqlTagNames.includes(node.tag.name)\n ) {\n return;\n }\n const tpl = processTemplate(node, result, getBinding);\n if (tpl) {\n seenTemplates[node.start ?? -1] = {type: 'document', source: tpl};\n result.operations.push({\n source: tpl,\n });\n } else {\n seenTemplates[node.start ?? -1] = false;\n }\n };\n\n /* eslint-disable flowtype-errors/uncovered */\n traverse(ast, {\n TaggedTemplateExpression(path) {\n visitTpl(path.node, (name) => {\n const binding = path.scope.getBinding(name);\n const start = binding.path.node.init\n ? binding.path.node.init.start\n : null;\n if (start && seenTemplates[start]) {\n return seenTemplates[start];\n }\n return null;\n });\n },\n });\n /* eslint-enable flowtype-errors/uncovered */\n\n return result;\n};\n\nconst processTemplate = (\n tpl: BabelNodeTaggedTemplateExpression,\n result: FileResult,\n getTemplate?: (name: string) => Document | null,\n // getBinding?: (name: string) => Binding,\n // seenTemplates,\n): ?Template => {\n // 'cooked' is the string as runtime javascript will see it.\n const literals = tpl.quasi.quasis.map((q) => q.value.cooked || '');\n const expressions = tpl.quasi.expressions.map(\n (expr): null | Document | Import => {\n const loc: Loc = {\n start: expr.start ?? -1,\n end: expr.end ?? -1,\n line: expr.loc?.start.line ?? -1,\n path: result.path,\n };\n if (expr.type !== 'Identifier') {\n result.errors.push({\n loc,\n message: `Template literal interpolation must be an identifier`,\n });\n return null;\n }\n if (!result.locals[expr.name]) {\n if (getTemplate) {\n const found = getTemplate(expr.name);\n return found;\n }\n result.errors.push({\n loc,\n message: `Unable to resolve ${expr.name}`,\n });\n return null;\n }\n return result.locals[expr.name];\n },\n );\n if (expressions.includes(null)) {\n // bail, stop processing.\n return;\n }\n return {\n literals,\n expressions: expressions.filter(Boolean),\n loc: {\n line: tpl.loc?.start.line ?? -1,\n start: tpl.start ?? -1,\n end: tpl.end ?? -1,\n path: result.path,\n },\n };\n};\n\nconst getLocals = (\n dir,\n toplevel: BabelNodeImportDeclaration,\n myPath: string,\n): ?{[key: string]: Import} => {\n if (toplevel.importKind === 'type') {\n return null;\n }\n const importPath = toplevel.source.value.startsWith('.')\n ? path.resolve(path.join(dir, toplevel.source.value))\n : toplevel.source.value;\n const locals = {};\n toplevel.specifiers.forEach((spec) => {\n if (spec.type === 'ImportDefaultSpecifier') {\n locals[spec.local.name] = {\n type: 'import',\n name: 'default',\n path: importPath,\n loc: {start: spec.start, end: spec.end, path: myPath},\n };\n } else if (spec.type === 'ImportSpecifier') {\n locals[spec.local.name] = {\n type: 'import',\n name:\n spec.imported.type === 'Identifier'\n ? spec.imported.name\n : spec.imported.value,\n path: importPath,\n loc: {start: spec.start, end: spec.end, path: myPath},\n };\n }\n });\n return locals;\n};\n\nexport const processFiles = (\n filePaths: Array<string>,\n getFileSource: (path: string) => string,\n): Files => {\n const files: Files = {};\n const toProcess = filePaths.slice();\n while (toProcess.length) {\n const next = toProcess.shift();\n if (files[next]) {\n continue;\n }\n const result = processFile(next, getFileSource(next));\n files[next] = result;\n listExternalReferences(result).forEach((path) => {\n if (!files[path] && !toProcess.includes(path)) {\n toProcess.push(path);\n }\n });\n }\n return files;\n};\n"],"file":"parse.js"}
1
+ {"version":3,"sources":["../../src/parser/parse.js"],"names":["listExternalReferences","file","paths","add","v","followImports","type","path","source","expressions","forEach","expr","Object","keys","exports","k","locals","operations","op","processFile","filePath","contents","dir","dirname","result","errors","ast","sourceType","allowImportExportEverywhere","plugins","enums","gqlTagNames","seenTemplates","program","body","toplevel","newLocals","getLocals","local","startsWith","name","push","importPath","value","resolve","join","specifiers","spec","exported","loc","start","end","line","processDeclarator","decl","isExported","id","init","tag","includes","tpl","processTemplate","document","declarations","declaration","visitTpl","node","getBinding","TaggedTemplateExpression","binding","scope","getTemplate","literals","quasi","quasis","map","q","cooked","message","found","filter","Boolean","myPath","importKind","imported","processFiles","filePaths","getFileSource","files","toProcess","slice","length","next","shift"],"mappings":"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","sourcesContent":["// @flow\nimport type {\n BabelNodeImportDeclaration,\n BabelNodeVariableDeclarator,\n BabelNodeTaggedTemplateExpression,\n BabelNodeFile,\n} from '@babel/types';\n\nimport {parse} from '@babel/parser'; // eslint-disable-line flowtype-errors/uncovered\nimport traverse from '@babel/traverse'; // eslint-disable-line flowtype-errors/uncovered\n\nimport path from 'path';\n\n/**\n * This file is responsible for finding all gql`-annotated\n * template strings in a set of provided files, and for resolving\n * all fragment references to their eventual sources.\n *\n * Things that are supported:\n * - importing fragments from other files\n * - re-exporting fragments that were imported\n * - using locally-defined fragments, even if they're\n * not at the top level (scope is honored correctly)\n * - importing the gql tag as some other name\n * \t (e.g. 'import blah from \"graphql-tag\"')\n * - renaming fragments at the top level\n *\n * Things that are *not* supported:\n * - doing anything other than 'const x = gql`my template`'\n * \t e.g. const x = someCond ? one fragment literal : another fragment literal\n * or const x = someFragmentPreprocessor(fragment literal)\n * - importing the graphql tag fn from anywhere other than \"graphql-tag\"\n * - anything else fancy with the graphql tag fn, e.g. 'const blah = gql; blah`xyz`'\n * - including a fragment in an operation by anything other than a bare identifier,\n * e.g. 'const myQuery = gql`query xyz {...} ${cond ? someFrag : otherFrag}`.\n * - getting fragments from e.g. function arguments, or renaming non-toplevel fragments\n *\n * Things that could be supported, but are not yet:\n * - tracking whether a given graphql operation has already been wrapped\n * in `gqlOp<Type>()` or not (to inform an auto-wrapper of the future)\n */\n\nexport type Template = {|\n literals: Array<string>,\n expressions: Array<Document | Import>,\n loc: Loc,\n|};\nexport type Loc = {start: number, end: number, path: string, line: number};\n\nexport type Document = {|\n type: 'document',\n source: Template,\n|};\nexport type Import = {|\n type: 'import',\n name: string,\n path: string,\n loc: Loc,\n|};\n\nexport type Operation = {|\n source: Template,\n // TODO: Determine if an operation is already wrapped\n // in `gqlOp` so we can automatically wrap if needed.\n // needsWrapping: boolean,\n|};\n\nexport type FileResult = {|\n path: string,\n operations: Array<Operation>,\n exports: {[key: string]: Document | Import},\n locals: {[key: string]: Document | Import},\n errors: Array<{loc: Loc, message: string}>,\n|};\n\nexport type Files = {[path: string]: FileResult};\n\n/**\n * Finds all referenced imports that might possibly be relevant\n * graphql fragments.\n *\n * Importantly, any values that are re-exported are treated as\n * potentially relevant, and of course any values referenced\n * from a graphql template are treated as relevant.\n */\nconst listExternalReferences = (file: FileResult): Array<string> => {\n const paths = {};\n const add = (v: Document | Import, followImports: boolean) => {\n if (v.type === 'import') {\n if (followImports) {\n paths[v.path] = true;\n }\n } else {\n v.source.expressions.forEach((expr) => add(expr, true));\n }\n };\n Object.keys(file.exports).forEach((k) =>\n add(\n file.exports[k],\n // If we're re-exporting something, we need to follow that import.\n true,\n ),\n );\n Object.keys(file.locals).forEach((k) =>\n add(\n file.locals[k],\n // If we've imported something but haven't used it or exported it,\n // we don't need to follow the import.\n false,\n ),\n );\n file.operations.forEach((op) =>\n op.source.expressions.forEach((expr) =>\n add(\n expr,\n // Imports that are used in graphql expressions definitely need to be followed.\n true,\n ),\n ),\n );\n return Object.keys(paths);\n};\n\nexport const processFile = (filePath: string, contents: string): FileResult => {\n const dir = path.dirname(filePath);\n const result: FileResult = {\n path: filePath,\n operations: [],\n exports: {},\n locals: {},\n errors: [],\n };\n /* eslint-disable flowtype-errors/uncovered */\n const ast: BabelNodeFile = parse(contents, {\n sourceType: 'module',\n allowImportExportEverywhere: true,\n plugins: [['flow', {enums: true}], 'jsx'],\n });\n /* eslint-enable flowtype-errors/uncovered */\n const gqlTagNames = [];\n const seenTemplates: {[key: number]: Document | false} = {};\n\n ast.program.body.forEach((toplevel) => {\n if (toplevel.type === 'ImportDeclaration') {\n const newLocals = getLocals(dir, toplevel, filePath);\n if (newLocals) {\n Object.keys(newLocals).forEach((k) => {\n const local = newLocals[k];\n if (local.path.startsWith('/')) {\n result.locals[k] = local;\n }\n if (\n local.path === 'graphql-tag' &&\n local.name === 'default'\n ) {\n gqlTagNames.push(k);\n }\n });\n }\n }\n if (toplevel.type === 'ExportNamedDeclaration') {\n if (toplevel.source) {\n const source = toplevel.source;\n const importPath = source.value.startsWith('.')\n ? path.resolve(path.join(dir, source.value))\n : source.value;\n toplevel.specifiers?.forEach((spec) => {\n if (\n spec.type === 'ExportSpecifier' &&\n spec.exported.type === 'Identifier'\n ) {\n result.exports[spec.exported.name] = {\n type: 'import',\n name: spec.local.name,\n path: importPath,\n loc: {\n start: spec.start ?? -1,\n end: spec.end ?? -1,\n line: spec.loc?.start.line ?? -1,\n path: filePath,\n },\n };\n }\n });\n } else {\n toplevel.specifiers?.forEach((spec) => {\n if (spec.type === 'ExportSpecifier') {\n const local = result.locals[spec.local.name];\n if (local && spec.exported.type === 'Identifier') {\n result.exports[spec.exported.name] = local;\n }\n }\n });\n }\n }\n\n const processDeclarator = (\n decl: BabelNodeVariableDeclarator,\n isExported: boolean,\n ) => {\n if (decl.id.type !== 'Identifier' || !decl.init) {\n return;\n }\n const {init} = decl;\n const id = decl.id.name;\n if (\n init.type === 'TaggedTemplateExpression' &&\n init.tag.type === 'Identifier'\n ) {\n if (gqlTagNames.includes(init.tag.name)) {\n const tpl = processTemplate(init, result);\n if (tpl) {\n const document = (result.locals[id] = {\n type: 'document',\n source: tpl,\n });\n seenTemplates[init.start ?? -1] = document;\n if (isExported) {\n result.exports[id] = document;\n }\n } else {\n seenTemplates[init.start ?? -1] = false;\n }\n }\n }\n if (init.type === 'Identifier' && result.locals[init.name]) {\n result.locals[id] = result.locals[init.name];\n if (isExported) {\n result.exports[id] = result.locals[init.name];\n }\n }\n };\n\n if (toplevel.type === 'VariableDeclaration') {\n toplevel.declarations.forEach((decl) => {\n processDeclarator(decl, false);\n });\n }\n\n if (\n toplevel.type === 'ExportNamedDeclaration' &&\n toplevel.declaration?.type === 'VariableDeclaration'\n ) {\n toplevel.declaration.declarations.forEach((decl) => {\n processDeclarator(decl, true);\n });\n }\n });\n\n const visitTpl = (\n node: BabelNodeTaggedTemplateExpression,\n getBinding: (name: string) => Document | null,\n ) => {\n if (seenTemplates[node.start ?? -1] != null) {\n return;\n }\n if (\n node.tag.type !== 'Identifier' ||\n !gqlTagNames.includes(node.tag.name)\n ) {\n return;\n }\n const tpl = processTemplate(node, result, getBinding);\n if (tpl) {\n seenTemplates[node.start ?? -1] = {type: 'document', source: tpl};\n result.operations.push({\n source: tpl,\n });\n } else {\n seenTemplates[node.start ?? -1] = false;\n }\n };\n\n /* eslint-disable flowtype-errors/uncovered */\n traverse(ast, {\n TaggedTemplateExpression(path) {\n visitTpl(path.node, (name) => {\n const binding = path.scope.getBinding(name);\n const start = binding.path.node.init\n ? binding.path.node.init.start\n : null;\n if (start && seenTemplates[start]) {\n return seenTemplates[start];\n }\n return null;\n });\n },\n });\n /* eslint-enable flowtype-errors/uncovered */\n\n return result;\n};\n\nconst processTemplate = (\n tpl: BabelNodeTaggedTemplateExpression,\n result: FileResult,\n getTemplate?: (name: string) => Document | null,\n // getBinding?: (name: string) => Binding,\n // seenTemplates,\n): ?Template => {\n // 'cooked' is the string as runtime javascript will see it.\n const literals = tpl.quasi.quasis.map((q) => q.value.cooked || '');\n const expressions = tpl.quasi.expressions.map(\n (expr): null | Document | Import => {\n const loc: Loc = {\n start: expr.start ?? -1,\n end: expr.end ?? -1,\n line: expr.loc?.start.line ?? -1,\n path: result.path,\n };\n if (expr.type !== 'Identifier') {\n result.errors.push({\n loc,\n message: `Template literal interpolation must be an identifier`,\n });\n return null;\n }\n if (!result.locals[expr.name]) {\n if (getTemplate) {\n const found = getTemplate(expr.name);\n return found;\n }\n result.errors.push({\n loc,\n message: `Unable to resolve ${expr.name}`,\n });\n return null;\n }\n return result.locals[expr.name];\n },\n );\n if (expressions.includes(null)) {\n // bail, stop processing.\n return;\n }\n return {\n literals,\n expressions: expressions.filter(Boolean),\n loc: {\n line: tpl.loc?.start.line ?? -1,\n start: tpl.start ?? -1,\n end: tpl.end ?? -1,\n path: result.path,\n },\n };\n};\n\nconst getLocals = (\n dir,\n toplevel: BabelNodeImportDeclaration,\n myPath: string,\n): ?{[key: string]: Import} => {\n if (toplevel.importKind === 'type') {\n return null;\n }\n const importPath = toplevel.source.value.startsWith('.')\n ? path.resolve(path.join(dir, toplevel.source.value))\n : toplevel.source.value;\n const locals = {};\n toplevel.specifiers.forEach((spec) => {\n if (spec.type === 'ImportDefaultSpecifier') {\n locals[spec.local.name] = {\n type: 'import',\n name: 'default',\n path: importPath,\n loc: {start: spec.start, end: spec.end, path: myPath},\n };\n } else if (spec.type === 'ImportSpecifier') {\n locals[spec.local.name] = {\n type: 'import',\n name:\n spec.imported.type === 'Identifier'\n ? spec.imported.name\n : spec.imported.value,\n path: importPath,\n loc: {start: spec.start, end: spec.end, path: myPath},\n };\n }\n });\n return locals;\n};\n\nexport const processFiles = (\n filePaths: Array<string>,\n getFileSource: (path: string) => string,\n): Files => {\n const files: Files = {};\n const toProcess = filePaths.slice();\n while (toProcess.length) {\n const next = toProcess.shift();\n if (files[next]) {\n continue;\n }\n const result = processFile(next, getFileSource(next));\n files[next] = result;\n listExternalReferences(result).forEach((path) => {\n if (!files[path] && !toProcess.includes(path)) {\n toProcess.push(path);\n }\n });\n }\n return files;\n};\n"],"file":"parse.js"}
@@ -22,6 +22,7 @@ export type Options = {|
22
22
  splitTypes?: boolean,
23
23
  generatedDirectory?: string,
24
24
  exportAllObjectTypes?: boolean,
25
+ typeFileName?: string,
25
26
  |};
26
27
 
27
28
  export type Schema = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@khanacademy/graphql-flow",
3
- "version": "0.2.1",
3
+ "version": "0.2.4",
4
4
  "bin": {
5
5
  "graphql-flow": "./dist/cli/run.js"
6
6
  },
@@ -58,4 +58,46 @@ describe('generateTypeFileContents', () => {
58
58
  "
59
59
  `);
60
60
  });
61
+
62
+ it('should respect the typeFileName option', () => {
63
+ const {files} = generateTypeFileContents(
64
+ 'hello.js',
65
+ exampleSchema,
66
+ gql`
67
+ query Hello {
68
+ human(id: "Han") {
69
+ id
70
+ }
71
+ }
72
+ `,
73
+ {
74
+ splitTypes: true,
75
+ typeFileName: 'prefix-[operationName]-suffix.js',
76
+ },
77
+ '__generated__',
78
+ indexPrelude('yarn queries'),
79
+ );
80
+ expect(
81
+ Object.keys(files)
82
+ .map((k) => `// ${k}\n${files[k]}`)
83
+ .join('\n\n'),
84
+ ).toMatchInlineSnapshot(`
85
+ "// __generated__/prefix-Hello-suffix.js
86
+ // @flow
87
+ // AUTOGENERATED -- DO NOT EDIT
88
+ // Generated for operation 'Hello' in file '../hello.js'
89
+ export type HelloType = {|
90
+ variables: {||},
91
+ response: {|
92
+ /** A human character*/
93
+ human: ?{|
94
+ id: string
95
+ |}
96
+ |}
97
+ |};
98
+ export type Hello = HelloType['response'];
99
+ export type HelloVariables = HelloType['variables'];
100
+ "
101
+ `);
102
+ });
61
103
  });
package/src/cli/config.js CHANGED
@@ -18,6 +18,7 @@ import path from 'path';
18
18
  export type CliConfig = {
19
19
  excludes: Array<RegExp>,
20
20
  schemaFilePath: string,
21
+ dumpOperations?: string,
21
22
  options: ExternalOptions,
22
23
  };
23
24
 
@@ -29,12 +30,18 @@ type JSONConfig = {
29
30
  excludes?: Array<string>,
30
31
  schemaFilePath: string,
31
32
  options?: ExternalOptions,
33
+ dumpOperations?: string,
32
34
  };
33
35
 
34
36
  export const loadConfigFile = (configFile: string): CliConfig => {
35
37
  // eslint-disable-next-line flowtype-errors/uncovered
36
38
  const data: JSONConfig = JSON.parse(fs.readFileSync(configFile, 'utf8'));
37
- const toplevelKeys = ['excludes', 'schemaFilePath', 'options'];
39
+ const toplevelKeys = [
40
+ 'excludes',
41
+ 'schemaFilePath',
42
+ 'options',
43
+ 'dumpOperations',
44
+ ];
38
45
  Object.keys(data).forEach((k) => {
39
46
  if (!toplevelKeys.includes(k)) {
40
47
  throw new Error(
@@ -56,6 +63,7 @@ export const loadConfigFile = (configFile: string): CliConfig => {
56
63
  'splitTypes',
57
64
  'generatedDirectory',
58
65
  'exportAllObjectTypes',
66
+ 'typeFileName',
59
67
  ];
60
68
  Object.keys(data.options).forEach((k) => {
61
69
  if (!externalOptionsKeys.includes(k)) {
@@ -74,6 +82,7 @@ export const loadConfigFile = (configFile: string): CliConfig => {
74
82
  path.dirname(configFile),
75
83
  data.schemaFilePath,
76
84
  ),
85
+ dumpOperations: data.dumpOperations,
77
86
  };
78
87
  };
79
88
 
package/src/cli/run.js CHANGED
@@ -9,11 +9,12 @@ import {getSchemas, loadConfigFile} from './config';
9
9
  import {addTypenameToDocument} from 'apollo-utilities'; // eslint-disable-line flowtype-errors/uncovered
10
10
 
11
11
  import {execSync} from 'child_process';
12
- import {readFileSync} from 'fs';
12
+ import {existsSync, mkdirSync, readFileSync, writeFileSync} from 'fs';
13
13
  import {type DocumentNode} from 'graphql';
14
14
  import {print} from 'graphql/language/printer';
15
15
  import {validate} from 'graphql/validation';
16
16
  import path from 'path';
17
+ import {dirname} from 'path';
17
18
 
18
19
  /**
19
20
  * This CLI tool executes the following steps:
@@ -68,7 +69,15 @@ const inputFiles = cliFiles.length
68
69
 
69
70
  /** Step (2) */
70
71
 
71
- const files = processFiles(inputFiles, (f) => readFileSync(f, 'utf8'));
72
+ const files = processFiles(inputFiles, (f) => {
73
+ if (existsSync(f)) {
74
+ return readFileSync(f, 'utf8');
75
+ }
76
+ if (existsSync(f + '.js')) {
77
+ return readFileSync(f + '.js', 'utf8');
78
+ }
79
+ throw new Error(`Unable to find ${f}`);
80
+ });
72
81
 
73
82
  let filesHadErrors = false;
74
83
  Object.keys(files).forEach((key) => {
@@ -103,6 +112,7 @@ console.log(Object.keys(resolved).length, 'resolved queries');
103
112
  /** Step (4) */
104
113
 
105
114
  let validationFailures: number = 0;
115
+ const printedOperations: Array<string> = [];
106
116
 
107
117
  Object.keys(resolved).forEach((k) => {
108
118
  const {document, raw} = resolved[k];
@@ -113,14 +123,18 @@ Object.keys(resolved).forEach((k) => {
113
123
  ({kind}) => kind !== 'FragmentDefinition',
114
124
  );
115
125
  const rawSource: string = raw.literals[0];
116
- const processedOptions = processPragmas(config.options, rawSource);
117
- if (!processedOptions) {
118
- return;
119
- }
120
126
 
121
127
  // eslint-disable-next-line flowtype-errors/uncovered
122
128
  const withTypeNames: DocumentNode = addTypenameToDocument(document);
123
129
  const printed = print(withTypeNames);
130
+ if (hasNonFragments && !printedOperations.includes(printed)) {
131
+ printedOperations.push(printed);
132
+ }
133
+
134
+ const processedOptions = processPragmas(config.options, rawSource);
135
+ if (!processedOptions) {
136
+ return;
137
+ }
124
138
 
125
139
  if (hasNonFragments) {
126
140
  /* eslint-disable flowtype-errors/uncovered */
@@ -163,3 +177,13 @@ if (validationFailures) {
163
177
  // eslint-disable-next-line flowtype-errors/uncovered
164
178
  process.exit(1);
165
179
  }
180
+
181
+ if (config.dumpOperations) {
182
+ const dumpOperations = config.dumpOperations;
183
+ const parent = dirname(dumpOperations);
184
+ mkdirSync(parent, {recursive: true});
185
+ writeFileSync(
186
+ dumpOperations,
187
+ JSON.stringify(printedOperations.sort(), null, 2),
188
+ );
189
+ }
@@ -20,6 +20,7 @@ export type ExternalOptions = {
20
20
  splitTypes?: boolean,
21
21
  generatedDirectory?: string,
22
22
  exportAllObjectTypes?: boolean,
23
+ typeFileName?: string,
23
24
  };
24
25
 
25
26
  export const indexPrelude = (regenerateCommand?: string): string => `// @flow
@@ -64,7 +65,9 @@ export const generateTypeFileContents = (
64
65
  generated.forEach(({name, typeName, code, isFragment, extraTypes}) => {
65
66
  // We write all generated files to a `__generated__` subdir to keep
66
67
  // things tidy.
67
- const targetFileName = `${name}.js`;
68
+ const targetFileName = options.typeFileName
69
+ ? options.typeFileName.replace('[operationName]', name)
70
+ : `${name}.js`;
68
71
  const targetPath = path.join(generatedDir, targetFileName);
69
72
 
70
73
  let fileContents =
@@ -160,6 +163,7 @@ export const processPragmas = (
160
163
  splitTypes: options.splitTypes,
161
164
  generatedDirectory: options.generatedDirectory,
162
165
  exportAllObjectTypes: options.exportAllObjectTypes,
166
+ typeFileName: options.typeFileName,
163
167
  };
164
168
  } else {
165
169
  return null;
package/src/types.js CHANGED
@@ -22,6 +22,7 @@ export type Options = {|
22
22
  splitTypes?: boolean,
23
23
  generatedDirectory?: string,
24
24
  exportAllObjectTypes?: boolean,
25
+ typeFileName?: string,
25
26
  |};
26
27
 
27
28
  export type Schema = {