@khanacademy/graphql-flow 1.0.0 → 1.1.1
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/.flowconfig +2 -0
- package/CHANGELOG.md +12 -0
- package/dist/cli/config.js +4 -3
- package/dist/cli/config.js.flow +3 -4
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/run.js +19 -2
- package/dist/cli/run.js.flow +15 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/schema.json +3 -0
- package/dist/generateTypeFiles.js +18 -2
- package/dist/generateTypeFiles.js.flow +17 -2
- package/dist/generateTypeFiles.js.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.flow +1 -0
- package/dist/index.js.map +1 -1
- package/dist/parser/__test__/parse.test.js +3 -1
- package/dist/parser/parse.js +7 -4
- package/dist/parser/parse.js.flow +15 -4
- package/dist/parser/parse.js.map +1 -1
- package/dist/types.js.flow +2 -0
- package/package.json +2 -1
- package/src/cli/config.js +3 -4
- package/src/cli/run.js +15 -4
- package/src/cli/schema.json +3 -0
- package/src/generateTypeFiles.js +17 -2
- package/src/index.js +1 -0
- package/src/parser/__test__/parse.test.js +3 -1
- package/src/parser/parse.js +15 -4
- package/src/types.js +2 -0
package/.flowconfig
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @khanacademy/graphql-flow
|
|
2
2
|
|
|
3
|
+
## 1.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a581359: Fix processing of typescript imports that don't use an extension
|
|
8
|
+
|
|
9
|
+
## 1.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- c7367a1: Basic TypeScript support!
|
|
14
|
+
|
|
3
15
|
## 1.0.0
|
|
4
16
|
|
|
5
17
|
### Major Changes
|
package/dist/cli/config.js
CHANGED
|
@@ -33,11 +33,12 @@ const validateOrThrow = (value, jsonSchema) => {
|
|
|
33
33
|
exports.validateOrThrow = validateOrThrow;
|
|
34
34
|
|
|
35
35
|
const loadConfigFile = configFile => {
|
|
36
|
-
// $FlowIgnore
|
|
37
|
-
const data = require(configFile); // eslint-disable-
|
|
36
|
+
// $FlowIgnore
|
|
37
|
+
const data = require(configFile); // eslint-disable-line flowtype-errors/uncovered
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
validateOrThrow(data, _schema.default);
|
|
40
|
+
validateOrThrow(data, _schema.default); // eslint-disable-line flowtype-errors/uncovered
|
|
41
|
+
|
|
41
42
|
return data;
|
|
42
43
|
};
|
|
43
44
|
/**
|
package/dist/cli/config.js.flow
CHANGED
|
@@ -28,10 +28,9 @@ export const validateOrThrow = (value: mixed, jsonSchema: mixed) => {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
export const loadConfigFile = (configFile: string): Config => {
|
|
31
|
-
// $FlowIgnore
|
|
32
|
-
const data: Config = require(configFile);
|
|
33
|
-
// eslint-disable-
|
|
34
|
-
validateOrThrow(data, configSchema);
|
|
31
|
+
// $FlowIgnore
|
|
32
|
+
const data: Config = require(configFile); // eslint-disable-line flowtype-errors/uncovered
|
|
33
|
+
validateOrThrow(data, configSchema); // eslint-disable-line flowtype-errors/uncovered
|
|
35
34
|
return data;
|
|
36
35
|
};
|
|
37
36
|
|
package/dist/cli/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/config.js"],"names":["validateOrThrow","value","jsonSchema","result","valid","Error","errors","map","error","toString","join","loadConfigFile","configFile","data","require","configSchema","getSchemas","schemaFilePath","raw","fs","readFileSync","endsWith","schemaForValidation","queryResponse","descriptions","schemaForTypeGeneration","introspectionData","JSON","parse","findApplicableConfig","path","configs","Array","isArray","find","config","exclude","some","RegExp","test","match","matcher"],"mappings":";;;;;;;AAIA;;AACA;;AAEA;;AACA;;AAQA;;;;AAX0C;AAWL;AAE9B,MAAMA,eAAe,GAAG,CAACC,KAAD,EAAeC,UAAf,KAAqC;AAChE;AACA,QAAMC,MAAM,GAAG,0BAASF,KAAT,EAAgBC,UAAhB,CAAf;;AACA,MAAI,CAACC,MAAM,CAACC,KAAZ,EAAmB;AACf,UAAM,IAAIC,KAAJ,CACFF,MAAM,CAACG,MAAP,CAAcC,GAAd,CAAmBC,KAAD,IAAWA,KAAK,CAACC,QAAN,EAA7B,EAA+CC,IAA/C,CAAoD,IAApD,CADE,CAAN;AAGH;AACD;;AACH,CATM;;;;AAWA,MAAMC,cAAc,GAAIC,UAAD,IAAgC;AAC1D;AACA,QAAMC,IAAY,GAAGC,OAAO,CAACF,UAAD,CAA5B,CAF0D,
|
|
1
|
+
{"version":3,"sources":["../../src/cli/config.js"],"names":["validateOrThrow","value","jsonSchema","result","valid","Error","errors","map","error","toString","join","loadConfigFile","configFile","data","require","configSchema","getSchemas","schemaFilePath","raw","fs","readFileSync","endsWith","schemaForValidation","queryResponse","descriptions","schemaForTypeGeneration","introspectionData","JSON","parse","findApplicableConfig","path","configs","Array","isArray","find","config","exclude","some","RegExp","test","match","matcher"],"mappings":";;;;;;;AAIA;;AACA;;AAEA;;AACA;;AAQA;;;;AAX0C;AAWL;AAE9B,MAAMA,eAAe,GAAG,CAACC,KAAD,EAAeC,UAAf,KAAqC;AAChE;AACA,QAAMC,MAAM,GAAG,0BAASF,KAAT,EAAgBC,UAAhB,CAAf;;AACA,MAAI,CAACC,MAAM,CAACC,KAAZ,EAAmB;AACf,UAAM,IAAIC,KAAJ,CACFF,MAAM,CAACG,MAAP,CAAcC,GAAd,CAAmBC,KAAD,IAAWA,KAAK,CAACC,QAAN,EAA7B,EAA+CC,IAA/C,CAAoD,IAApD,CADE,CAAN;AAGH;AACD;;AACH,CATM;;;;AAWA,MAAMC,cAAc,GAAIC,UAAD,IAAgC;AAC1D;AACA,QAAMC,IAAY,GAAGC,OAAO,CAACF,UAAD,CAA5B,CAF0D,CAEhB;;;AAC1CZ,EAAAA,eAAe,CAACa,IAAD,EAAOE,eAAP,CAAf,CAH0D,CAGrB;;AACrC,SAAOF,IAAP;AACH,CALM;AAOP;AACA;AACA;;;;;AACO,MAAMG,UAAU,GAAIC,cAAD,IAAqD;AAC3E,QAAMC,GAAG,GAAGC,YAAGC,YAAH,CAAgBH,cAAhB,EAAgC,MAAhC,CAAZ;;AACA,MAAIA,cAAc,CAACI,QAAf,CAAwB,UAAxB,CAAJ,EAAyC;AACrC,UAAMC,mBAAmB,GAAG,0BAAYJ,GAAZ,CAA5B;AACA,UAAMK,aAAa,GAAG,0BAClBD,mBADkB,EAElB,oCAAsB;AAACE,MAAAA,YAAY,EAAE;AAAf,KAAtB,CAFkB,CAAtB;AAIA,UAAMC,uBAAuB,GAAG,+DAC5B;AACEF,IAAAA,aAAa,CAACV,IAFY,CAAhC;AAIA,WAAO,CAACS,mBAAD,EAAsBG,uBAAtB,CAAP;AACH,GAXD,MAWO;AACH;AACA,UAAMC,iBAAqC,GAAGC,IAAI,CAACC,KAAL,CAAWV,GAAX,CAA9C;AACA,UAAMI,mBAAmB,GAAG,gCAAkBI,iBAAlB,CAA5B;AACA,UAAMD,uBAAuB,GACzB,8DAA4BC,iBAA5B,CADJ;AAEA,WAAO,CAACJ,mBAAD,EAAsBG,uBAAtB,CAAP;AACH;AACJ,CArBM;AAuBP;AACA;AACA;AACA;AACA;;;;;AACO,MAAMI,oBAAoB,GAAG,CAChCC,IADgC,EAEhCC,OAFgC,KAGd;AAClB,MAAI,CAACC,KAAK,CAACC,OAAN,CAAcF,OAAd,CAAL,EAA6B;AACzBA,IAAAA,OAAO,GAAG,CAACA,OAAD,CAAV;AACH;;AACD,SAAOA,OAAO,CAACG,IAAR,CAAcC,MAAD,IAAY;AAAA;;AAC5B,2BAAIA,MAAM,CAACC,OAAX,4CAAI,gBAAgBC,IAAhB,CAAsBD,OAAD,IAAa,IAAIE,MAAJ,CAAWF,OAAX,EAAoBG,IAApB,CAAyBT,IAAzB,CAAlC,CAAJ,EAAuE;AACnE,aAAO,KAAP;AACH;;AACD,QAAI,CAACK,MAAM,CAACK,KAAZ,EAAmB;AACf,aAAO,IAAP;AACH;;AACD,WAAOL,MAAM,CAACK,KAAP,CAAaH,IAAb,CAAmBI,OAAD,IAAa,IAAIH,MAAJ,CAAWG,OAAX,EAAoBF,IAApB,CAAyBT,IAAzB,CAA/B,CAAP;AACH,GARM,CAAP;AASH,CAhBM","sourcesContent":["// @flow\nimport type {Schema} from '../types';\nimport type {GraphQLSchema} from 'graphql/type/schema';\n\nimport {schemaFromIntrospectionData} from '../schemaFromIntrospectionData';\nimport configSchema from './schema.json'; // eslint-disable-line flowtype-errors/uncovered\n\nimport fs from 'fs';\nimport {\n buildClientSchema,\n buildSchema,\n getIntrospectionQuery,\n graphqlSync,\n type IntrospectionQuery,\n} from 'graphql';\nimport type {Config, GenerateConfig} from '../types';\nimport {validate} from 'jsonschema'; // eslint-disable-line flowtype-errors/uncovered\n\nexport const validateOrThrow = (value: mixed, jsonSchema: mixed) => {\n /* eslint-disable flowtype-errors/uncovered */\n const result = validate(value, jsonSchema);\n if (!result.valid) {\n throw new Error(\n result.errors.map((error) => error.toString()).join('\\n'),\n );\n }\n /* eslint-enable flowtype-errors/uncovered */\n};\n\nexport const loadConfigFile = (configFile: string): Config => {\n // $FlowIgnore\n const data: Config = require(configFile); // eslint-disable-line flowtype-errors/uncovered\n validateOrThrow(data, configSchema); // eslint-disable-line flowtype-errors/uncovered\n return data;\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\n/**\n * Find the first item of the `config.generate` array where both:\n * - no item of `exclude` matches\n * - at least one item of `match` matches\n */\nexport const findApplicableConfig = (\n path: string,\n configs: Array<GenerateConfig> | GenerateConfig,\n): ?GenerateConfig => {\n if (!Array.isArray(configs)) {\n configs = [configs];\n }\n return configs.find((config) => {\n if (config.exclude?.some((exclude) => new RegExp(exclude).test(path))) {\n return false;\n }\n if (!config.match) {\n return true;\n }\n return config.match.some((matcher) => new RegExp(matcher).test(path));\n });\n};\n"],"file":"config.js"}
|
package/dist/cli/run.js
CHANGED
|
@@ -42,7 +42,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
42
42
|
|
|
43
43
|
/** Step (1) */
|
|
44
44
|
const findGraphqlTagReferences = root => {
|
|
45
|
-
const response = (0, _child_process.execSync)("git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx'", {
|
|
45
|
+
const response = (0, _child_process.execSync)("git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx' '*.ts' '*.tsx'", {
|
|
46
46
|
encoding: 'utf8',
|
|
47
47
|
cwd: root
|
|
48
48
|
});
|
|
@@ -73,7 +73,24 @@ const files = (0, _parse.processFiles)(inputFiles, f => {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
if ((0, _fs.existsSync)(f + '.js')) {
|
|
76
|
-
return
|
|
76
|
+
return {
|
|
77
|
+
text: (0, _fs.readFileSync)(f + '.js', 'utf8'),
|
|
78
|
+
resolvedPath: f + '.js'
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if ((0, _fs.existsSync)(f + '.ts')) {
|
|
83
|
+
return {
|
|
84
|
+
text: (0, _fs.readFileSync)(f + '.ts', 'utf8'),
|
|
85
|
+
resolvedPath: f + '.ts'
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if ((0, _fs.existsSync)(f + '.tsx')) {
|
|
90
|
+
return {
|
|
91
|
+
text: (0, _fs.readFileSync)(f + '.tsx', 'utf8'),
|
|
92
|
+
resolvedPath: f + '.tsx'
|
|
93
|
+
};
|
|
77
94
|
}
|
|
78
95
|
|
|
79
96
|
throw new Error(`Unable to find ${f}`);
|
package/dist/cli/run.js.flow
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// @flow
|
|
3
3
|
/* eslint-disable no-console */
|
|
4
|
+
import type {Schema} from '../types';
|
|
5
|
+
import type {GraphQLSchema} from 'graphql/type/schema';
|
|
6
|
+
|
|
4
7
|
import {generateTypeFiles, processPragmas} from '../generateTypeFiles';
|
|
5
8
|
import {processFiles} from '../parser/parse';
|
|
6
9
|
import {resolveDocuments} from '../parser/resolve';
|
|
@@ -15,7 +18,6 @@ import {print} from 'graphql/language/printer';
|
|
|
15
18
|
import {validate} from 'graphql/validation';
|
|
16
19
|
import path from 'path';
|
|
17
20
|
import {dirname} from 'path';
|
|
18
|
-
import type {GenerateConfig} from '../types';
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
23
|
* This CLI tool executes the following steps:
|
|
@@ -32,7 +34,7 @@ import type {GenerateConfig} from '../types';
|
|
|
32
34
|
|
|
33
35
|
const findGraphqlTagReferences = (root: string): Array<string> => {
|
|
34
36
|
const response = execSync(
|
|
35
|
-
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx'",
|
|
37
|
+
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx' '*.ts' '*.tsx'",
|
|
36
38
|
{
|
|
37
39
|
encoding: 'utf8',
|
|
38
40
|
cwd: root,
|
|
@@ -81,7 +83,16 @@ const files = processFiles(inputFiles, (f) => {
|
|
|
81
83
|
return readFileSync(f, 'utf8');
|
|
82
84
|
}
|
|
83
85
|
if (existsSync(f + '.js')) {
|
|
84
|
-
return readFileSync(f + '.js', 'utf8');
|
|
86
|
+
return {text: readFileSync(f + '.js', 'utf8'), resolvedPath: f + '.js'};
|
|
87
|
+
}
|
|
88
|
+
if (existsSync(f + '.ts')) {
|
|
89
|
+
return {text: readFileSync(f + '.ts', 'utf8'), resolvedPath: f + '.ts'};
|
|
90
|
+
}
|
|
91
|
+
if (existsSync(f + '.tsx')) {
|
|
92
|
+
return {
|
|
93
|
+
text: readFileSync(f + '.tsx', 'utf8'),
|
|
94
|
+
resolvedPath: f + '.tsx',
|
|
95
|
+
};
|
|
85
96
|
}
|
|
86
97
|
throw new Error(`Unable to find ${f}`);
|
|
87
98
|
});
|
|
@@ -118,7 +129,7 @@ console.log(Object.keys(resolved).length, 'resolved queries');
|
|
|
118
129
|
|
|
119
130
|
/** Step (4) */
|
|
120
131
|
|
|
121
|
-
const schemaCache = {};
|
|
132
|
+
const schemaCache: {[key: string]: [GraphQLSchema, Schema]} = {};
|
|
122
133
|
const getCachedSchemas = (schemaFilePath: string) => {
|
|
123
134
|
if (!schemaCache[schemaFilePath]) {
|
|
124
135
|
schemaCache[schemaFilePath] = getSchemas(
|
package/dist/cli/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/run.js"],"names":["findGraphqlTagReferences","root","response","encoding","cwd","trim","split","map","relative","path","join","_","__","configFilePath","cliFiles","process","argv","console","log","exit","makeAbsPath","maybeRelativePath","basePath","isAbsolute","absConfigPath","config","inputFiles","length","crawl","dirname","files","f","Error","filesHadErrors","Object","keys","forEach","key","file","errors","error","message","resolved","loc","schemaCache","getCachedSchemas","schemaFilePath","validationFailures","printedOperations","filePathAndLine","document","raw","hasNonFragments","definitions","some","kind","rawSource","literals","generateConfig","generate","withTypeNames","printed","includes","push","pragmaResult","strict","strictNullability","schemaForValidation","schemaForTypeGeneration","err","dumpOperations","parent","recursive","JSON","stringify","sort"],"mappings":"AAAA;;AAEA;;;AACA;;AACA;;AACA;;AACA;;AAEA;;AAEA;;AACA;;AAEA;;AACA;;AACA;;;;;;AAPwD;;AAWxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAEA,MAAMA,wBAAwB,GAAIC,IAAD,IAAiC;AAC9D,QAAMC,QAAQ,GAAG,6BACb,uFADa,EAEb;AACIC,IAAAA,QAAQ,EAAE,MADd;AAEIC,IAAAA,GAAG,EAAEH;AAFT,GAFa,CAAjB;AAOA,SAAOC,QAAQ,CACVG,IADE,GAEFC,KAFE,CAEI,IAFJ,EAGFC,GAHE,CAGGC,QAAD,IAAcC,cAAKC,IAAL,CAAUT,IAAV,EAAgBO,QAAhB,CAHhB,CAAP;AAIH,CAZD;;AAcA,MAAM,CAACG,CAAD,EAAIC,EAAJ,EAAQC,cAAR,EAAwB,GAAGC,QAA3B,IAAuCC,OAAO,CAACC,IAArD;;AAEA,IACIH,cAAc,KAAK,IAAnB,IACAA,cAAc,KAAK,QADnB,IAEAA,cAAc,KAAK,MAFnB,IAGA,CAACA,cAJL,EAKE;AACEI,EAAAA,OAAO,CAACC,GAAR,CAAa;AACjB;AACA,wDAFI;AAGAH,EAAAA,OAAO,CAACI,IAAR,CAAa,CAAb,EAJF,CAImB;AACpB;;AAED,MAAMC,WAAW,GAAG,CAACC,iBAAD,EAA4BC,QAA5B,KAAiD;AACjE,SAAOb,cAAKc,UAAL,CAAgBF,iBAAhB,IACDA,iBADC,GAEDZ,cAAKC,IAAL,CAAUY,QAAV,EAAoBD,iBAApB,CAFN;AAGH,CAJD;;AAMA,MAAMG,aAAa,GAAGJ,WAAW,CAACP,cAAD,EAAiBE,OAAO,CAACX,GAAR,EAAjB,CAAjC;AAEA,MAAMqB,MAAM,GAAG,4BAAeD,aAAf,CAAf;AAEA,MAAME,UAAU,GAAGZ,QAAQ,CAACa,MAAT,GACbb,QADa,GAEbd,wBAAwB,CACpBoB,WAAW,CAACK,MAAM,CAACG,KAAP,CAAa3B,IAAd,EAAoBQ,cAAKoB,OAAL,CAAaL,aAAb,CAApB,CADS,CAF9B;AAMA;;AAEA,MAAMM,KAAK,GAAG,yBAAaJ,UAAb,EAA0BK,CAAD,IAAO;AAC1C,MAAI,oBAAWA,CAAX,CAAJ,EAAmB;AACf,WAAO,sBAAaA,CAAb,EAAgB,MAAhB,CAAP;AACH;;AACD,MAAI,oBAAWA,CAAC,GAAG,KAAf,CAAJ,EAA2B;AACvB,WAAO,sBAAaA,CAAC,GAAG,KAAjB,EAAwB,MAAxB,CAAP;AACH;;AACD,QAAM,IAAIC,KAAJ,CAAW,kBAAiBD,CAAE,EAA9B,CAAN;AACH,CARa,CAAd;AAUA,IAAIE,cAAc,GAAG,KAArB;AACAC,MAAM,CAACC,IAAP,CAAYL,KAAZ,EAAmBM,OAAnB,CAA4BC,GAAD,IAAS;AAChC,QAAMC,IAAI,GAAGR,KAAK,CAACO,GAAD,CAAlB;;AACA,MAAIC,IAAI,CAACC,MAAL,CAAYZ,MAAhB,EAAwB;AACpBM,IAAAA,cAAc,GAAG,IAAjB;AACAhB,IAAAA,OAAO,CAACuB,KAAR,CAAe,aAAYF,IAAI,CAAC7B,IAAK,EAArC;AACA6B,IAAAA,IAAI,CAACC,MAAL,CAAYH,OAAZ,CAAqBI,KAAD,IAAW;AAC3BvB,MAAAA,OAAO,CAACuB,KAAR,CAAe,MAAKA,KAAK,CAACC,OAAQ,EAAlC;AACH,KAFD;AAGH;AACJ,CATD;;AAWA,IAAIR,cAAJ,EAAoB;AAChBhB,EAAAA,OAAO,CAACuB,KAAR,CAAc,UAAd;AACAzB,EAAAA,OAAO,CAACI,IAAR,CAAa,CAAb,EAFgB,CAEC;AACpB;AAED;;;AAEA,MAAM;AAACuB,EAAAA,QAAD;AAAWH,EAAAA;AAAX,IAAqB,+BAAiBT,KAAjB,CAA3B;;AACA,IAAIS,MAAM,CAACZ,MAAX,EAAmB;AACfY,EAAAA,MAAM,CAACH,OAAP,CAAgBI,KAAD,IAAW;AACtBvB,IAAAA,OAAO,CAACuB,KAAR,CAAe,oBAAmBA,KAAK,CAACC,OAAQ,OAAMD,KAAK,CAACG,GAAN,CAAUlC,IAAK,EAArE;AACH,GAFD;AAGAQ,EAAAA,OAAO,CAACuB,KAAR,CAAc,UAAd;AACAzB,EAAAA,OAAO,CAACI,IAAR,CAAa,CAAb,EALe,CAKE;AACpB;;AAEDF,OAAO,CAACC,GAAR,CAAYgB,MAAM,CAACC,IAAP,CAAYO,QAAZ,EAAsBf,MAAlC,EAA0C,kBAA1C;AAEA;;AAEA,MAAMiB,WAAW,GAAG,EAApB;;AACA,MAAMC,gBAAgB,GAAIC,cAAD,IAA4B;AACjD,MAAI,CAACF,WAAW,CAACE,cAAD,CAAhB,EAAkC;AAC9BF,IAAAA,WAAW,CAACE,cAAD,CAAX,GAA8B,wBAC1B1B,WAAW,CAAC0B,cAAD,EAAiBrC,cAAKoB,OAAL,CAAaL,aAAb,CAAjB,CADe,CAA9B;AAGH;;AAED,SAAOoB,WAAW,CAACE,cAAD,CAAlB;AACH,CARD;;AAUA,IAAIC,kBAA0B,GAAG,CAAjC;AACA,MAAMC,iBAAgC,GAAG,EAAzC;AAEAd,MAAM,CAACC,IAAP,CAAYO,QAAZ,EAAsBN,OAAtB,CAA+Ba,eAAD,IAAqB;AAC/C,QAAM;AAACC,IAAAA,QAAD;AAAWC,IAAAA;AAAX,MAAkBT,QAAQ,CAACO,eAAD,CAAhC;AAEA,QAAMG,eAAe,GAAGF,QAAQ,CAACG,WAAT,CAAqBC,IAArB,CACpB,CAAC;AAACC,IAAAA;AAAD,GAAD,KAAYA,IAAI,KAAK,oBADD,CAAxB;AAGA,QAAMC,SAAiB,GAAGL,GAAG,CAACM,QAAJ,CAAa,CAAb,CAA1B;AAEA,QAAMC,cAAc,GAAG,mCACnB;AACAT,EAAAA,eAAe,CAAC3C,KAAhB,CAAsB,GAAtB,EAA2B,CAA3B,CAFmB,EAGnBmB,MAAM,CAACkC,QAHY,CAAvB;;AAKA,MAAI,CAACD,cAAL,EAAqB;AACjB,WADiB,CACT;AACX,GAf8C,CAiB/C;;;AACA,QAAME,aAA2B,GAAG,4CAAsBV,QAAtB,CAApC;AACA,QAAMW,OAAO,GAAG,oBAAMD,aAAN,CAAhB;;AACA,MAAIR,eAAe,IAAI,CAACJ,iBAAiB,CAACc,QAAlB,CAA2BD,OAA3B,CAAxB,EAA6D;AACzDb,IAAAA,iBAAiB,CAACe,IAAlB,CAAuBF,OAAvB;AACH;;AAED,QAAMG,YAAY,GAAG,uCACjBN,cADiB,EAEjBjC,MAAM,CAACG,KAFU,EAGjB4B,SAHiB,CAArB;;AAKA,MAAI,CAACQ,YAAY,CAACL,QAAlB,EAA4B;AACxB;AACH;;AACD,MAAIK,YAAY,CAACC,MAAb,IAAuB,IAA3B,EAAiC;AAC7BP,IAAAA,cAAc,CAACQ,iBAAf,GAAmCF,YAAY,CAACC,MAAhD;AACH;;AAED,QAAM,CAACE,mBAAD,EAAsBC,uBAAtB,IAAiDvB,gBAAgB,CACnEa,cAAc,CAACZ,cADoD,CAAvE;;AAIA,MAAIM,eAAJ,EAAqB;AACjB;AACA,UAAMb,MAAM,GAAG,0BAAS4B,mBAAT,EAA8BP,aAA9B,CAAf;AACA;;AACA,QAAIrB,MAAM,CAACZ,MAAX,EAAmB;AACfY,MAAAA,MAAM,CAACH,OAAP,CAAgBI,KAAD,IAAW;AACtBvB,QAAAA,OAAO,CAACuB,KAAR,CACK,sCAAqCW,GAAG,CAACR,GAAJ,CAAQlC,IAAK,GADvD;AAGAQ,QAAAA,OAAO,CAACuB,KAAR,CAAcqB,OAAd;AACA5C,QAAAA,OAAO,CAACuB,KAAR,CAAcA,KAAd;AACAO,QAAAA,kBAAkB;AACrB,OAPD;AAQH;AACD;;AACH;;AAED,MAAI;AACA,8CACII,GAAG,CAACR,GAAJ,CAAQlC,IADZ,EAEI2D,uBAFJ,EAGIR,aAHJ,EAIIF,cAJJ,EADA,CAOA;AACH,GARD,CAQE,OAAOW,GAAP,EAAY;AACVpD,IAAAA,OAAO,CAACuB,KAAR,CAAe,yCAAwCW,GAAG,CAACR,GAAJ,CAAQlC,IAAK,EAApE;AACAQ,IAAAA,OAAO,CAACuB,KAAR,CAAcqB,OAAd,EAFU,CAGV;;AACA5C,IAAAA,OAAO,CAACuB,KAAR,CAAc6B,GAAd;AACAtB,IAAAA,kBAAkB;AACrB;AACJ,CAxED;;AA0EA,IAAIA,kBAAJ,EAAwB;AACpB9B,EAAAA,OAAO,CAACuB,KAAR,CACK,eAAcO,kBAAmB,4CADtC,EADoB,CAIpB;;AACAhC,EAAAA,OAAO,CAACI,IAAR,CAAa,CAAb;AACH;;AAED,IAAIM,MAAM,CAACG,KAAP,CAAa0C,cAAjB,EAAiC;AAC7B,QAAMA,cAAc,GAAG7C,MAAM,CAACG,KAAP,CAAa0C,cAApC;AACA,QAAMC,MAAM,GAAG,mBAAQD,cAAR,CAAf;AACA,qBAAUC,MAAV,EAAkB;AAACC,IAAAA,SAAS,EAAE;AAAZ,GAAlB;AACA,yBACIF,cADJ,EAEIG,IAAI,CAACC,SAAL,CAAe1B,iBAAiB,CAAC2B,IAAlB,EAAf,EAAyC,IAAzC,EAA+C,CAA/C,CAFJ;AAIH","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 {findApplicableConfig, 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';\nimport type {GenerateConfig} from '../types';\n\n/**\n * This CLI tool executes the following steps:\n * 1) parse & validate config file\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 [_, __, configFilePath, ...cliFiles] = process.argv;\n\nif (\n configFilePath === '-h' ||\n configFilePath === '--help' ||\n configFilePath === 'help' ||\n !configFilePath\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 makeAbsPath = (maybeRelativePath: string, basePath: string) => {\n return path.isAbsolute(maybeRelativePath)\n ? maybeRelativePath\n : path.join(basePath, maybeRelativePath);\n};\n\nconst absConfigPath = makeAbsPath(configFilePath, process.cwd());\n\nconst config = loadConfigFile(absConfigPath);\n\nconst inputFiles = cliFiles.length\n ? cliFiles\n : findGraphqlTagReferences(\n makeAbsPath(config.crawl.root, path.dirname(absConfigPath)),\n );\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\nconst schemaCache = {};\nconst getCachedSchemas = (schemaFilePath: string) => {\n if (!schemaCache[schemaFilePath]) {\n schemaCache[schemaFilePath] = getSchemas(\n makeAbsPath(schemaFilePath, path.dirname(absConfigPath)),\n );\n }\n\n return schemaCache[schemaFilePath];\n};\n\nlet validationFailures: number = 0;\nconst printedOperations: Array<string> = [];\n\nObject.keys(resolved).forEach((filePathAndLine) => {\n const {document, raw} = resolved[filePathAndLine];\n\n const hasNonFragments = document.definitions.some(\n ({kind}) => kind !== 'FragmentDefinition',\n );\n const rawSource: string = raw.literals[0];\n\n const generateConfig = findApplicableConfig(\n // strip off the trailing line number, e.g. `:23`\n filePathAndLine.split(':')[0],\n config.generate,\n );\n if (!generateConfig) {\n return; // no generate config matches, bail\n }\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 pragmaResult = processPragmas(\n generateConfig,\n config.crawl,\n rawSource,\n );\n if (!pragmaResult.generate) {\n return;\n }\n if (pragmaResult.strict != null) {\n generateConfig.strictNullability = pragmaResult.strict;\n }\n\n const [schemaForValidation, schemaForTypeGeneration] = getCachedSchemas(\n generateConfig.schemaFilePath,\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 generateConfig,\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.crawl.dumpOperations) {\n const dumpOperations = config.crawl.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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/run.js"],"names":["findGraphqlTagReferences","root","response","encoding","cwd","trim","split","map","relative","path","join","_","__","configFilePath","cliFiles","process","argv","console","log","exit","makeAbsPath","maybeRelativePath","basePath","isAbsolute","absConfigPath","config","inputFiles","length","crawl","dirname","files","f","text","resolvedPath","Error","filesHadErrors","Object","keys","forEach","key","file","errors","error","message","resolved","loc","schemaCache","getCachedSchemas","schemaFilePath","validationFailures","printedOperations","filePathAndLine","document","raw","hasNonFragments","definitions","some","kind","rawSource","literals","generateConfig","generate","withTypeNames","printed","includes","push","pragmaResult","strict","strictNullability","schemaForValidation","schemaForTypeGeneration","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 type {Schema} from '../types';\nimport type {GraphQLSchema} from 'graphql/type/schema';\n\nimport {generateTypeFiles, processPragmas} from '../generateTypeFiles';\nimport {processFiles} from '../parser/parse';\nimport {resolveDocuments} from '../parser/resolve';\nimport {findApplicableConfig, 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) parse & validate config file\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' '*.ts' '*.tsx'\",\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 [_, __, configFilePath, ...cliFiles] = process.argv;\n\nif (\n configFilePath === '-h' ||\n configFilePath === '--help' ||\n configFilePath === 'help' ||\n !configFilePath\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 makeAbsPath = (maybeRelativePath: string, basePath: string) => {\n return path.isAbsolute(maybeRelativePath)\n ? maybeRelativePath\n : path.join(basePath, maybeRelativePath);\n};\n\nconst absConfigPath = makeAbsPath(configFilePath, process.cwd());\n\nconst config = loadConfigFile(absConfigPath);\n\nconst inputFiles = cliFiles.length\n ? cliFiles\n : findGraphqlTagReferences(\n makeAbsPath(config.crawl.root, path.dirname(absConfigPath)),\n );\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 {text: readFileSync(f + '.js', 'utf8'), resolvedPath: f + '.js'};\n }\n if (existsSync(f + '.ts')) {\n return {text: readFileSync(f + '.ts', 'utf8'), resolvedPath: f + '.ts'};\n }\n if (existsSync(f + '.tsx')) {\n return {\n text: readFileSync(f + '.tsx', 'utf8'),\n resolvedPath: f + '.tsx',\n };\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\nconst schemaCache: {[key: string]: [GraphQLSchema, Schema]} = {};\nconst getCachedSchemas = (schemaFilePath: string) => {\n if (!schemaCache[schemaFilePath]) {\n schemaCache[schemaFilePath] = getSchemas(\n makeAbsPath(schemaFilePath, path.dirname(absConfigPath)),\n );\n }\n\n return schemaCache[schemaFilePath];\n};\n\nlet validationFailures: number = 0;\nconst printedOperations: Array<string> = [];\n\nObject.keys(resolved).forEach((filePathAndLine) => {\n const {document, raw} = resolved[filePathAndLine];\n\n const hasNonFragments = document.definitions.some(\n ({kind}) => kind !== 'FragmentDefinition',\n );\n const rawSource: string = raw.literals[0];\n\n const generateConfig = findApplicableConfig(\n // strip off the trailing line number, e.g. `:23`\n filePathAndLine.split(':')[0],\n config.generate,\n );\n if (!generateConfig) {\n return; // no generate config matches, bail\n }\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 pragmaResult = processPragmas(\n generateConfig,\n config.crawl,\n rawSource,\n );\n if (!pragmaResult.generate) {\n return;\n }\n if (pragmaResult.strict != null) {\n generateConfig.strictNullability = pragmaResult.strict;\n }\n\n const [schemaForValidation, schemaForTypeGeneration] = getCachedSchemas(\n generateConfig.schemaFilePath,\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 generateConfig,\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.crawl.dumpOperations) {\n const dumpOperations = config.crawl.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"}
|
package/dist/cli/schema.json
CHANGED
|
@@ -11,8 +11,11 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
11
11
|
|
|
12
12
|
var _ = require(".");
|
|
13
13
|
|
|
14
|
+
var _convert = require("@khanacademy/flow-to-ts/dist/convert.bundle");
|
|
15
|
+
|
|
14
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
17
|
|
|
18
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
16
19
|
const indexPrelude = regenerateCommand => `// @flow
|
|
17
20
|
//
|
|
18
21
|
// AUTOGENERATED
|
|
@@ -29,6 +32,11 @@ const generateTypeFileContents = (fileName, schema, document, options, generated
|
|
|
29
32
|
const files = {}; /// Write export for __generated__/index.js if it doesn't exist
|
|
30
33
|
|
|
31
34
|
const addToIndex = (filePath, typeName) => {
|
|
35
|
+
if (options.typeScript) {
|
|
36
|
+
// Typescript doesn't like file extensions
|
|
37
|
+
filePath = filePath.replace(/\.js$/, '');
|
|
38
|
+
}
|
|
39
|
+
|
|
32
40
|
const newLine = `export type {${typeName}} from './${_path.default.basename(filePath)}';`;
|
|
33
41
|
|
|
34
42
|
if (indexContents.indexOf('./' + _path.default.basename(filePath)) === -1) {
|
|
@@ -108,7 +116,7 @@ const getGeneratedDir = (fileName, options) => {
|
|
|
108
116
|
const generateTypeFiles = (fileName, schema, document, options) => {
|
|
109
117
|
const generatedDir = getGeneratedDir(fileName, options);
|
|
110
118
|
|
|
111
|
-
const indexFile = _path.default.join(generatedDir, 'index.js');
|
|
119
|
+
const indexFile = _path.default.join(generatedDir, 'index' + (options.typeScript ? '.ts' : '.js'));
|
|
112
120
|
|
|
113
121
|
if (!_fs.default.existsSync(generatedDir)) {
|
|
114
122
|
_fs.default.mkdirSync(generatedDir, {
|
|
@@ -128,7 +136,15 @@ const generateTypeFiles = (fileName, schema, document, options) => {
|
|
|
128
136
|
_fs.default.writeFileSync(indexFile, indexContents);
|
|
129
137
|
|
|
130
138
|
Object.keys(files).forEach(key => {
|
|
131
|
-
|
|
139
|
+
let fname = key;
|
|
140
|
+
|
|
141
|
+
if (options.typeScript) {
|
|
142
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
143
|
+
files[key] = (0, _convert.convert)(files[key]);
|
|
144
|
+
fname = key.replace(/\.js$/, '.ts');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
_fs.default.writeFileSync(fname, files[key]);
|
|
132
148
|
});
|
|
133
149
|
|
|
134
150
|
_fs.default.writeFileSync(indexFile, indexContents);
|
|
@@ -4,6 +4,8 @@ import type {GenerateConfig, CrawlConfig, Schema} from './types';
|
|
|
4
4
|
import fs from 'fs';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import {documentToFlowTypes} from '.';
|
|
7
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
8
|
+
import {convert} from '@khanacademy/flow-to-ts/dist/convert.bundle';
|
|
7
9
|
|
|
8
10
|
export const indexPrelude = (regenerateCommand?: string): string => `// @flow
|
|
9
11
|
//
|
|
@@ -27,6 +29,10 @@ export const generateTypeFileContents = (
|
|
|
27
29
|
|
|
28
30
|
/// Write export for __generated__/index.js if it doesn't exist
|
|
29
31
|
const addToIndex = (filePath, typeName) => {
|
|
32
|
+
if (options.typeScript) {
|
|
33
|
+
// Typescript doesn't like file extensions
|
|
34
|
+
filePath = filePath.replace(/\.js$/, '');
|
|
35
|
+
}
|
|
30
36
|
const newLine = `export type {${typeName}} from './${path.basename(
|
|
31
37
|
filePath,
|
|
32
38
|
)}';`;
|
|
@@ -120,7 +126,10 @@ export const generateTypeFiles = (
|
|
|
120
126
|
options: GenerateConfig,
|
|
121
127
|
) => {
|
|
122
128
|
const generatedDir = getGeneratedDir(fileName, options);
|
|
123
|
-
const indexFile = path.join(
|
|
129
|
+
const indexFile = path.join(
|
|
130
|
+
generatedDir,
|
|
131
|
+
'index' + (options.typeScript ? '.ts' : '.js'),
|
|
132
|
+
);
|
|
124
133
|
|
|
125
134
|
if (!fs.existsSync(generatedDir)) {
|
|
126
135
|
fs.mkdirSync(generatedDir, {recursive: true});
|
|
@@ -140,7 +149,13 @@ export const generateTypeFiles = (
|
|
|
140
149
|
|
|
141
150
|
fs.writeFileSync(indexFile, indexContents);
|
|
142
151
|
Object.keys(files).forEach((key) => {
|
|
143
|
-
|
|
152
|
+
let fname = key;
|
|
153
|
+
if (options.typeScript) {
|
|
154
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
155
|
+
files[key] = convert(files[key]);
|
|
156
|
+
fname = key.replace(/\.js$/, '.ts');
|
|
157
|
+
}
|
|
158
|
+
fs.writeFileSync(fname, files[key]);
|
|
144
159
|
});
|
|
145
160
|
|
|
146
161
|
fs.writeFileSync(indexFile, indexContents);
|
|
@@ -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","experimentalEnums","targetFileName","typeFileName","replace","targetPath","fileContents","splitTypes","Object","keys","enumNames","length","getGeneratedDir","generatedDirectory","isAbsolute","relative","process","cwd","dirname","generateTypeFiles","indexFile","fs","existsSync","mkdirSync","recursive","writeFileSync","readFileSync","key","processPragmas","generateConfig","crawlConfig","rawSource","ignorePragma","generate","autogen","loosePragma","autogenStrict","pragma","noPragmas","strict","strictNullability"],"mappings":"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","sourcesContent":["// @flow\nimport type {DocumentNode} from 'graphql';\nimport type {GenerateConfig, CrawlConfig, Schema} from './types';\nimport fs from 'fs';\nimport path from 'path';\nimport {documentToFlowTypes} from '.';\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: GenerateConfig,\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(\n ({name, typeName, code, isFragment, extraTypes, experimentalEnums}) => {\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(\n (name) =>\n (fileContents += `\\n\\nexport type ${name} = ${extraTypes[name]};`),\n );\n const enumNames = Object.keys(experimentalEnums);\n if (options.experimentalEnums && enumNames.length) {\n // TODO(somewhatabstract, FEI-4172): Update to fixed eslint-plugin-flowtype\n // and remove this disable.\n fileContents += `\\n\\n/* eslint-disable no-undef */`;\n enumNames.forEach(\n (name) =>\n (fileContents += `\\nexport ${experimentalEnums[name]};\\n`),\n );\n fileContents += `/* eslint-enable no-undef */`;\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\n return {files, indexContents};\n};\n\nconst getGeneratedDir = (fileName: string, options: GenerateConfig) => {\n const generatedDirectory = options.generatedDirectory ?? '__generated__';\n if (path.isAbsolute(generatedDirectory)) {\n // fileName is absolute here, so we make it relative to cwd\n // for more reasonable filenames. We convert leading ..'s\n // to `__` so this doesn't escape the output directory.\n return path.join(\n generatedDirectory,\n path\n .relative(process.cwd(), path.dirname(fileName))\n .replace(/\\.\\.\\//g, '__/'),\n );\n } else {\n return path.join(path.dirname(fileName), generatedDirectory);\n }\n};\n\nexport const generateTypeFiles = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: GenerateConfig,\n) => {\n const generatedDir = getGeneratedDir(fileName, options);\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 generateConfig: GenerateConfig,\n crawlConfig: CrawlConfig,\n rawSource: string,\n): {generate: boolean, strict?: boolean} => {\n if (\n crawlConfig.ignorePragma &&\n rawSource.includes(crawlConfig.ignorePragma)\n ) {\n return {generate: false};\n }\n\n const autogen = crawlConfig.loosePragma\n ? rawSource.includes(crawlConfig.loosePragma)\n : false;\n const autogenStrict = crawlConfig.pragma\n ? rawSource.includes(crawlConfig.pragma)\n : false;\n const noPragmas = !crawlConfig.loosePragma && !crawlConfig.pragma;\n\n if (autogen || autogenStrict || noPragmas) {\n return {\n generate: true,\n strict: noPragmas\n ? generateConfig.strictNullability\n : autogenStrict || !autogen,\n };\n } else {\n return {generate: false};\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","typeScript","replace","newLine","path","basename","indexOf","lines","split","map","line","includes","join","generated","forEach","name","code","isFragment","extraTypes","experimentalEnums","targetFileName","typeFileName","targetPath","fileContents","splitTypes","Object","keys","enumNames","length","getGeneratedDir","generatedDirectory","isAbsolute","relative","process","cwd","dirname","generateTypeFiles","indexFile","fs","existsSync","mkdirSync","recursive","writeFileSync","readFileSync","key","fname","processPragmas","generateConfig","crawlConfig","rawSource","ignorePragma","generate","autogen","loosePragma","autogenStrict","pragma","noPragmas","strict","strictNullability"],"mappings":";;;;;;;AAGA;;AACA;;AACA;;AAEA;;;;AADA;AAGO,MAAMA,YAAY,GAAIC,iBAAD,IAAyC;AACrE;AACA;AACA;AACA;AACA,IAAIA,iBAAiB,GAAG,8BAA8BA,iBAAjC,GAAqD,EAAG;AAC7E;AACA;AACA,CARO;;;;AAUA,MAAMC,wBAAwB,GAAG,CACpCC,QADoC,EAEpCC,MAFoC,EAGpCC,QAHoC,EAIpCC,OAJoC,EAKpCC,YALoC,EAMpCC,aANoC,KAOsB;AAC1D,QAAMC,KAAK,GAAG,EAAd,CAD0D,CAG1D;;AACA,QAAMC,UAAU,GAAG,CAACC,QAAD,EAAWC,QAAX,KAAwB;AACvC,QAAIN,OAAO,CAACO,UAAZ,EAAwB;AACpB;AACAF,MAAAA,QAAQ,GAAGA,QAAQ,CAACG,OAAT,CAAiB,OAAjB,EAA0B,EAA1B,CAAX;AACH;;AACD,UAAMC,OAAO,GAAI,gBAAeH,QAAS,aAAYI,cAAKC,QAAL,CACjDN,QADiD,CAEnD,IAFF;;AAGA,QAAIH,aAAa,CAACU,OAAd,CAAsB,OAAOF,cAAKC,QAAL,CAAcN,QAAd,CAA7B,MAA0D,CAAC,CAA/D,EAAkE;AAC9DH,MAAAA,aAAa,IAAIO,OAAO,GAAG,IAA3B;AACH,KAFD,MAEO;AACH,YAAMI,KAAK,GAAGX,aAAa,CAACY,KAAd,CAAoB,IAApB,EAA0BC,GAA1B,CAA+BC,IAAD,IAAU;AAClD,YAAIA,IAAI,CAACC,QAAL,CAAc,OAAOP,cAAKC,QAAL,CAAcN,QAAd,CAArB,CAAJ,EAAmD;AAC/C,iBAAOI,OAAP;AACH;;AACD,eAAOO,IAAP;AACH,OALa,CAAd;AAMAd,MAAAA,aAAa,GAAGW,KAAK,CAACK,IAAN,CAAW,IAAX,CAAhB;AACH;AACJ,GAnBD;;AAqBA,QAAMC,SAAS,GAAG,2BAAoBpB,QAApB,EAA8BD,MAA9B,EAAsCE,OAAtC,CAAlB;AACAmB,EAAAA,SAAS,CAACC,OAAV,CACI,CAAC;AAACC,IAAAA,IAAD;AAAOf,IAAAA,QAAP;AAAiBgB,IAAAA,IAAjB;AAAuBC,IAAAA,UAAvB;AAAmCC,IAAAA,UAAnC;AAA+CC,IAAAA;AAA/C,GAAD,KAAuE;AACnE;AACA;AACA,UAAMC,cAAc,GAAG1B,OAAO,CAAC2B,YAAR,GACjB3B,OAAO,CAAC2B,YAAR,CAAqBnB,OAArB,CAA6B,iBAA7B,EAAgDa,IAAhD,CADiB,GAEhB,GAAEA,IAAK,KAFd;;AAGA,UAAMO,UAAU,GAAGlB,cAAKQ,IAAL,CAAUjB,YAAV,EAAwByB,cAAxB,CAAnB;;AAEA,QAAIG,YAAY,GACZ,SACC,yCADD,GAEC,+BAA8BR,IAAK,iBAAgBX,cAAKC,QAAL,CAChDd,QADgD,CAElD,KAJF,IAKCG,OAAO,CAACL,iBAAR,GACM,0BAAyBK,OAAO,CAACL,iBAAkB,MADzD,GAEK,EAPN,IAQA2B,IATJ;;AAUA,QAAItB,OAAO,CAAC8B,UAAR,IAAsB,CAACP,UAA3B,EAAuC;AACnCM,MAAAA,YAAY,IACP,iBAAgBR,IAAK,MAAKf,QAAS,iBAApC,GACC,eAAce,IAAK,eAAcf,QAAS,kBAF/C;AAGH;;AACDyB,IAAAA,MAAM,CAACC,IAAP,CAAYR,UAAZ,EAAwBJ,OAAxB,CACKC,IAAD,IACKQ,YAAY,IAAK,mBAAkBR,IAAK,MAAKG,UAAU,CAACH,IAAD,CAAO,GAFvE;AAIA,UAAMY,SAAS,GAAGF,MAAM,CAACC,IAAP,CAAYP,iBAAZ,CAAlB;;AACA,QAAIzB,OAAO,CAACyB,iBAAR,IAA6BQ,SAAS,CAACC,MAA3C,EAAmD;AAC/C;AACA;AACAL,MAAAA,YAAY,IAAK,mCAAjB;AACAI,MAAAA,SAAS,CAACb,OAAV,CACKC,IAAD,IACKQ,YAAY,IAAK,YAAWJ,iBAAiB,CAACJ,IAAD,CAAO,KAF7D;AAIAQ,MAAAA,YAAY,IAAK,8BAAjB;AACH;;AAEDzB,IAAAA,UAAU,CAACwB,UAAD,EAAatB,QAAb,CAAV;AACAH,IAAAA,KAAK,CAACyB,UAAD,CAAL,GACIC,YAAY,CACR;AACA;AAFQ,KAGPrB,OAHL,CAGa,QAHb,EAGuB,EAHvB,IAG6B,IAJjC;AAKH,GA9CL;AAiDA,SAAO;AAACL,IAAAA,KAAD;AAAQD,IAAAA;AAAR,GAAP;AACH,CAnFM;;;;AAqFP,MAAMiC,eAAe,GAAG,CAACtC,QAAD,EAAmBG,OAAnB,KAA+C;AAAA;;AACnE,QAAMoC,kBAAkB,4BAAGpC,OAAO,CAACoC,kBAAX,yEAAiC,eAAzD;;AACA,MAAI1B,cAAK2B,UAAL,CAAgBD,kBAAhB,CAAJ,EAAyC;AACrC;AACA;AACA;AACA,WAAO1B,cAAKQ,IAAL,CACHkB,kBADG,EAEH1B,cACK4B,QADL,CACcC,OAAO,CAACC,GAAR,EADd,EAC6B9B,cAAK+B,OAAL,CAAa5C,QAAb,CAD7B,EAEKW,OAFL,CAEa,SAFb,EAEwB,KAFxB,CAFG,CAAP;AAMH,GAVD,MAUO;AACH,WAAOE,cAAKQ,IAAL,CAAUR,cAAK+B,OAAL,CAAa5C,QAAb,CAAV,EAAkCuC,kBAAlC,CAAP;AACH;AACJ,CAfD;;AAiBO,MAAMM,iBAAiB,GAAG,CAC7B7C,QAD6B,EAE7BC,MAF6B,EAG7BC,QAH6B,EAI7BC,OAJ6B,KAK5B;AACD,QAAMC,YAAY,GAAGkC,eAAe,CAACtC,QAAD,EAAWG,OAAX,CAApC;;AACA,QAAM2C,SAAS,GAAGjC,cAAKQ,IAAL,CACdjB,YADc,EAEd,WAAWD,OAAO,CAACO,UAAR,GAAqB,KAArB,GAA6B,KAAxC,CAFc,CAAlB;;AAKA,MAAI,CAACqC,YAAGC,UAAH,CAAc5C,YAAd,CAAL,EAAkC;AAC9B2C,gBAAGE,SAAH,CAAa7C,YAAb,EAA2B;AAAC8C,MAAAA,SAAS,EAAE;AAAZ,KAA3B;AACH;;AACD,MAAI,CAACH,YAAGC,UAAH,CAAcF,SAAd,CAAL,EAA+B;AAC3BC,gBAAGI,aAAH,CAAiBL,SAAjB,EAA4BjD,YAAY,CAACM,OAAO,CAACL,iBAAT,CAAxC;AACH;;AAED,QAAM;AAACO,IAAAA,aAAD;AAAgBC,IAAAA;AAAhB,MAAyBP,wBAAwB,CACnDC,QADmD,EAEnDC,MAFmD,EAGnDC,QAHmD,EAInDC,OAJmD,EAKnDC,YALmD,EAMnD2C,YAAGK,YAAH,CAAgBN,SAAhB,EAA2B,MAA3B,CANmD,CAAvD;;AASAC,cAAGI,aAAH,CAAiBL,SAAjB,EAA4BzC,aAA5B;;AACA6B,EAAAA,MAAM,CAACC,IAAP,CAAY7B,KAAZ,EAAmBiB,OAAnB,CAA4B8B,GAAD,IAAS;AAChC,QAAIC,KAAK,GAAGD,GAAZ;;AACA,QAAIlD,OAAO,CAACO,UAAZ,EAAwB;AACpB;AACAJ,MAAAA,KAAK,CAAC+C,GAAD,CAAL,GAAa,sBAAQ/C,KAAK,CAAC+C,GAAD,CAAb,CAAb;AACAC,MAAAA,KAAK,GAAGD,GAAG,CAAC1C,OAAJ,CAAY,OAAZ,EAAqB,KAArB,CAAR;AACH;;AACDoC,gBAAGI,aAAH,CAAiBG,KAAjB,EAAwBhD,KAAK,CAAC+C,GAAD,CAA7B;AACH,GARD;;AAUAN,cAAGI,aAAH,CAAiBL,SAAjB,EAA4BzC,aAA5B;AACH,CAxCM;;;;AA0CA,MAAMkD,cAAc,GAAG,CAC1BC,cAD0B,EAE1BC,WAF0B,EAG1BC,SAH0B,KAIc;AACxC,MACID,WAAW,CAACE,YAAZ,IACAD,SAAS,CAACtC,QAAV,CAAmBqC,WAAW,CAACE,YAA/B,CAFJ,EAGE;AACE,WAAO;AAACC,MAAAA,QAAQ,EAAE;AAAX,KAAP;AACH;;AAED,QAAMC,OAAO,GAAGJ,WAAW,CAACK,WAAZ,GACVJ,SAAS,CAACtC,QAAV,CAAmBqC,WAAW,CAACK,WAA/B,CADU,GAEV,KAFN;AAGA,QAAMC,aAAa,GAAGN,WAAW,CAACO,MAAZ,GAChBN,SAAS,CAACtC,QAAV,CAAmBqC,WAAW,CAACO,MAA/B,CADgB,GAEhB,KAFN;AAGA,QAAMC,SAAS,GAAG,CAACR,WAAW,CAACK,WAAb,IAA4B,CAACL,WAAW,CAACO,MAA3D;;AAEA,MAAIH,OAAO,IAAIE,aAAX,IAA4BE,SAAhC,EAA2C;AACvC,WAAO;AACHL,MAAAA,QAAQ,EAAE,IADP;AAEHM,MAAAA,MAAM,EAAED,SAAS,GACXT,cAAc,CAACW,iBADJ,GAEXJ,aAAa,IAAI,CAACF;AAJrB,KAAP;AAMH,GAPD,MAOO;AACH,WAAO;AAACD,MAAAA,QAAQ,EAAE;AAAX,KAAP;AACH;AACJ,CA9BM","sourcesContent":["// @flow\nimport type {DocumentNode} from 'graphql';\nimport type {GenerateConfig, CrawlConfig, Schema} from './types';\nimport fs from 'fs';\nimport path from 'path';\nimport {documentToFlowTypes} from '.';\n// eslint-disable-next-line flowtype-errors/uncovered\nimport {convert} from '@khanacademy/flow-to-ts/dist/convert.bundle';\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: GenerateConfig,\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 if (options.typeScript) {\n // Typescript doesn't like file extensions\n filePath = filePath.replace(/\\.js$/, '');\n }\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(\n ({name, typeName, code, isFragment, extraTypes, experimentalEnums}) => {\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(\n (name) =>\n (fileContents += `\\n\\nexport type ${name} = ${extraTypes[name]};`),\n );\n const enumNames = Object.keys(experimentalEnums);\n if (options.experimentalEnums && enumNames.length) {\n // TODO(somewhatabstract, FEI-4172): Update to fixed eslint-plugin-flowtype\n // and remove this disable.\n fileContents += `\\n\\n/* eslint-disable no-undef */`;\n enumNames.forEach(\n (name) =>\n (fileContents += `\\nexport ${experimentalEnums[name]};\\n`),\n );\n fileContents += `/* eslint-enable no-undef */`;\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\n return {files, indexContents};\n};\n\nconst getGeneratedDir = (fileName: string, options: GenerateConfig) => {\n const generatedDirectory = options.generatedDirectory ?? '__generated__';\n if (path.isAbsolute(generatedDirectory)) {\n // fileName is absolute here, so we make it relative to cwd\n // for more reasonable filenames. We convert leading ..'s\n // to `__` so this doesn't escape the output directory.\n return path.join(\n generatedDirectory,\n path\n .relative(process.cwd(), path.dirname(fileName))\n .replace(/\\.\\.\\//g, '__/'),\n );\n } else {\n return path.join(path.dirname(fileName), generatedDirectory);\n }\n};\n\nexport const generateTypeFiles = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: GenerateConfig,\n) => {\n const generatedDir = getGeneratedDir(fileName, options);\n const indexFile = path.join(\n generatedDir,\n 'index' + (options.typeScript ? '.ts' : '.js'),\n );\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 let fname = key;\n if (options.typeScript) {\n // eslint-disable-next-line flowtype-errors/uncovered\n files[key] = convert(files[key]);\n fname = key.replace(/\\.js$/, '.ts');\n }\n fs.writeFileSync(fname, files[key]);\n });\n\n fs.writeFileSync(indexFile, indexContents);\n};\n\nexport const processPragmas = (\n generateConfig: GenerateConfig,\n crawlConfig: CrawlConfig,\n rawSource: string,\n): {generate: boolean, strict?: boolean} => {\n if (\n crawlConfig.ignorePragma &&\n rawSource.includes(crawlConfig.ignorePragma)\n ) {\n return {generate: false};\n }\n\n const autogen = crawlConfig.loosePragma\n ? rawSource.includes(crawlConfig.loosePragma)\n : false;\n const autogenStrict = crawlConfig.pragma\n ? rawSource.includes(crawlConfig.pragma)\n : false;\n const noPragmas = !crawlConfig.loosePragma && !crawlConfig.pragma;\n\n if (autogen || autogenStrict || noPragmas) {\n return {\n generate: true,\n strict: noPragmas\n ? generateConfig.strictNullability\n : autogenStrict || !autogen,\n };\n } else {\n return {generate: false};\n }\n};\n"],"file":"generateTypeFiles.js"}
|
package/dist/index.js
CHANGED
|
@@ -25,12 +25,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
25
25
|
*/
|
|
26
26
|
// eslint-disable-line flowtype-errors/uncovered
|
|
27
27
|
const optionsToConfig = (schema, definitions, options, errors = []) => {
|
|
28
|
-
var _options$strictNullab, _options$readOnlyArra, _options$scalars;
|
|
28
|
+
var _options$strictNullab, _options$readOnlyArra, _options$scalars, _options$typeScript;
|
|
29
29
|
|
|
30
30
|
const internalOptions = {
|
|
31
31
|
strictNullability: (_options$strictNullab = options === null || options === void 0 ? void 0 : options.strictNullability) !== null && _options$strictNullab !== void 0 ? _options$strictNullab : true,
|
|
32
32
|
readOnlyArray: (_options$readOnlyArra = options === null || options === void 0 ? void 0 : options.readOnlyArray) !== null && _options$readOnlyArra !== void 0 ? _options$readOnlyArra : true,
|
|
33
|
-
scalars: (_options$scalars = options === null || options === void 0 ? void 0 : options.scalars) !== null && _options$scalars !== void 0 ? _options$scalars : {}
|
|
33
|
+
scalars: (_options$scalars = options === null || options === void 0 ? void 0 : options.scalars) !== null && _options$scalars !== void 0 ? _options$scalars : {},
|
|
34
|
+
typeScript: (_options$typeScript = options === null || options === void 0 ? void 0 : options.typeScript) !== null && _options$typeScript !== void 0 ? _options$typeScript : false
|
|
34
35
|
};
|
|
35
36
|
const fragments = {};
|
|
36
37
|
definitions.forEach(def => {
|
package/dist/index.js.flow
CHANGED
|
@@ -29,6 +29,7 @@ const optionsToConfig = (
|
|
|
29
29
|
strictNullability: options?.strictNullability ?? true,
|
|
30
30
|
readOnlyArray: options?.readOnlyArray ?? true,
|
|
31
31
|
scalars: options?.scalars ?? {},
|
|
32
|
+
typeScript: options?.typeScript ?? false,
|
|
32
33
|
};
|
|
33
34
|
const fragments = {};
|
|
34
35
|
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","experimentalEnumsMap","experimentalEnums","undefined","FlowGenerationError","Error","constructor","join","messages","documentToFlowTypes","document","result","map","item","types","code","exportAllObjectTypes","extraTypes","codegenExtraTypes","typeName","isFragment","operation","response","variables","filter","Boolean","length","Object","keys","k"],"mappings":";;;;;;;AAWA;;AACA;;AAIA;;;;AAhBA;;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAGyC;AAUzC,MAAMA,eAAe,GAAG,CACpBC,MADoB,EAEpBC,WAFoB,EAGpBC,OAHoB,EAIpBC,MAAqB,GAAG,EAJJ,KAKV;AAAA;;AACV,QAAMC,eAAe,GAAG;AACpBC,IAAAA,iBAAiB,2BAAEH,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG,iBAAX,yEAAgC,IAD7B;AAEpBC,IAAAA,aAAa,2BAAEJ,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEI,aAAX,yEAA4B,IAFrB;AAGpBC,IAAAA,OAAO,sBAAEL,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEK,OAAX,+DAAsB;
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["optionsToConfig","schema","definitions","options","errors","internalOptions","strictNullability","readOnlyArray","scalars","typeScript","fragments","forEach","def","kind","name","value","config","allObjectTypes","path","experimentalEnumsMap","experimentalEnums","undefined","FlowGenerationError","Error","constructor","join","messages","documentToFlowTypes","document","result","map","item","types","code","exportAllObjectTypes","extraTypes","codegenExtraTypes","typeName","isFragment","operation","response","variables","filter","Boolean","length","Object","keys","k"],"mappings":";;;;;;;AAWA;;AACA;;AAIA;;;;AAhBA;;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAGyC;AAUzC,MAAMA,eAAe,GAAG,CACpBC,MADoB,EAEpBC,WAFoB,EAGpBC,OAHoB,EAIpBC,MAAqB,GAAG,EAJJ,KAKV;AAAA;;AACV,QAAMC,eAAe,GAAG;AACpBC,IAAAA,iBAAiB,2BAAEH,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG,iBAAX,yEAAgC,IAD7B;AAEpBC,IAAAA,aAAa,2BAAEJ,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEI,aAAX,yEAA4B,IAFrB;AAGpBC,IAAAA,OAAO,sBAAEL,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEK,OAAX,+DAAsB,EAHT;AAIpBC,IAAAA,UAAU,yBAAEN,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEM,UAAX,qEAAyB;AAJf,GAAxB;AAMA,QAAMC,SAAS,GAAG,EAAlB;AACAR,EAAAA,WAAW,CAACS,OAAZ,CAAqBC,GAAD,IAAS;AACzB,QAAIA,GAAG,CAACC,IAAJ,KAAa,oBAAjB,EAAuC;AACnCH,MAAAA,SAAS,CAACE,GAAG,CAACE,IAAJ,CAASC,KAAV,CAAT,GAA4BH,GAA5B;AACH;AACJ,GAJD;AAKA,QAAMI,MAAM,GAAG;AACXN,IAAAA,SADW;AAEXT,IAAAA,MAFW;AAGXG,IAAAA,MAHW;AAIXa,IAAAA,cAAc,EAAE,IAJL;AAKXC,IAAAA,IAAI,EAAE,EALK;AAMXC,IAAAA,oBAAoB,EAAEhB,OAAO,SAAP,IAAAA,OAAO,WAAP,IAAAA,OAAO,CAAEiB,iBAAT,GAA6B,EAA7B,GAAkCC,SAN7C;AAOX,OAAGhB;AAPQ,GAAf;AAUA,SAAOW,MAAP;AACH,CA7BD;;AA+BO,MAAMM,mBAAN,SAAkCC,KAAlC,CAAwC;AAE3CC,EAAAA,WAAW,CAACpB,MAAD,EAAwB;AAC/B,UAAO,wCAAuCA,MAAM,CAACqB,IAAP,CAAY,IAAZ,CAAkB,EAAhE;AACA,SAAKC,QAAL,GAAgBtB,MAAhB;AACH;;AAL0C;;;;AAQxC,MAAMuB,mBAAmB,GAAG,CAC/BC,QAD+B,EAE/B3B,MAF+B,EAG/BE,OAH+B,KAW7B;AACF,QAAMC,MAAqB,GAAG,EAA9B;AACA,QAAMY,MAAM,GAAGhB,eAAe,CAC1BC,MAD0B,EAE1B2B,QAAQ,CAAC1B,WAFiB,EAG1BC,OAH0B,EAI1BC,MAJ0B,CAA9B;AAMA,QAAMyB,MAAM,GAAGD,QAAQ,CAAC1B,WAAT,CACV4B,GADU,CACLC,IAAD,IAAU;AACX,QAAIA,IAAI,CAAClB,IAAL,KAAc,oBAAlB,EAAwC;AACpC,YAAMC,IAAI,GAAGiB,IAAI,CAACjB,IAAL,CAAUC,KAAvB;AACA,YAAMiB,KAAK,GAAG,EAAd;AACA,YAAMC,IAAI,GAAI,eAAcnB,IAAK,MAAK,gDAClCb,MADkC,EAElC8B,IAFkC,EAGlC,EACI,GAAGf,MADP;AAEIE,QAAAA,IAAI,EAAE,CAACJ,IAAD,CAFV;AAGIG,QAAAA,cAAc,EAAEd,OAAO,SAAP,IAAAA,OAAO,WAAP,IAAAA,OAAO,CAAE+B,oBAAT,GACVF,KADU,GAEV;AALV,OAHkC,CAUpC,GAVF;AAYA,YAAMG,UAAU,GAAGC,iBAAiB,CAACJ,KAAD,CAApC;AACA,YAAMZ,iBAAiB,GAAGgB,iBAAiB,CACvCpB,MAAM,CAACG,oBAAP,IAA+B,EADQ,CAA3C;AAIA,aAAO;AACHL,QAAAA,IADG;AAEHuB,QAAAA,QAAQ,EAAEvB,IAFP;AAGHmB,QAAAA,IAHG;AAIHK,QAAAA,UAAU,EAAE,IAJT;AAKHH,QAAAA,UALG;AAMHf,QAAAA;AANG,OAAP;AAQH;;AACD,QACIW,IAAI,CAAClB,IAAL,KAAc,qBAAd,KACCkB,IAAI,CAACQ,SAAL,KAAmB,OAAnB,IAA8BR,IAAI,CAACQ,SAAL,KAAmB,UADlD,KAEAR,IAAI,CAACjB,IAHT,EAIE;AACE,YAAMkB,KAAK,GAAG,EAAd;AACA,YAAMlB,IAAI,GAAGiB,IAAI,CAACjB,IAAL,CAAUC,KAAvB;AACA,YAAMyB,QAAQ,GAAG,gDAAqBvC,MAArB,EAA6B8B,IAA7B,EAAmC,EAChD,GAAGf,MAD6C;AAEhDE,QAAAA,IAAI,EAAE,CAACJ,IAAD,CAF0C;AAGhDG,QAAAA,cAAc,EAAEd,OAAO,SAAP,IAAAA,OAAO,WAAP,IAAAA,OAAO,CAAE+B,oBAAT,GACVF,KADU,GAEV;AAL0C,OAAnC,CAAjB;AAOA,YAAMS,SAAS,GAAG,kDAAsBxC,MAAtB,EAA8B8B,IAA9B,EAAoC,EAClD,GAAGf,MAD+C;AAElDE,QAAAA,IAAI,EAAE,CAACJ,IAAD;AAF4C,OAApC,CAAlB;AAKA,YAAMuB,QAAQ,GAAI,GAAEvB,IAAK,MAAzB,CAfF,CAgBE;AACA;;AACA,YAAMmB,IAAI,GAAI,eAAcI,QAAS,yBAAwBI,SAAU,oBAAmBD,QAAS,OAAnG;AAEA,YAAML,UAAU,GAAGC,iBAAiB,CAACJ,KAAD,CAApC;AACA,YAAMZ,iBAAiB,GAAGgB,iBAAiB,CACvCpB,MAAM,CAACG,oBAAP,IAA+B,EADQ,CAA3C;AAIA,aAAO;AAACL,QAAAA,IAAD;AAAOuB,QAAAA,QAAP;AAAiBJ,QAAAA,IAAjB;AAAuBE,QAAAA,UAAvB;AAAmCf,QAAAA;AAAnC,OAAP;AACH;AACJ,GA9DU,EA+DVsB,MA/DU,CA+DHC,OA/DG,CAAf;;AAgEA,MAAIvC,MAAM,CAACwC,MAAX,EAAmB;AACf,UAAM,IAAItB,mBAAJ,CAAwBlB,MAAxB,CAAN;AACH;;AACD,SAAOyB,MAAP;AACH,CAvFM;;;;AAyFP,SAASO,iBAAT,CAA2BJ,KAA3B,EAEE;AACE,QAAMG,UAAmC,GAAG,EAA5C;AACAU,EAAAA,MAAM,CAACC,IAAP,CAAYd,KAAZ,EAAmBrB,OAAnB,CAA4BoC,CAAD,IAAe;AACtC;AACAZ,IAAAA,UAAU,CAACY,CAAD,CAAV,GAAgB,wBAASf,KAAK,CAACe,CAAD,CAAd,EAAmBd,IAAnC;AACH,GAHD;AAIA,SAAOE,UAAP;AACH","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';\nimport type {BabelNode} from '@babel/types';\n\nimport type {Context, Schema, GenerateConfig} from './types';\n\nconst optionsToConfig = (\n schema: Schema,\n definitions: $ReadOnlyArray<DefinitionNode>,\n options?: GenerateConfig,\n errors: Array<string> = [],\n): Context => {\n const internalOptions = {\n strictNullability: options?.strictNullability ?? true,\n readOnlyArray: options?.readOnlyArray ?? true,\n scalars: options?.scalars ?? {},\n typeScript: options?.typeScript ?? false,\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 experimentalEnumsMap: options?.experimentalEnums ? {} : undefined,\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?: GenerateConfig,\n): $ReadOnlyArray<{\n name: string,\n typeName: string,\n code: string,\n isFragment?: boolean,\n extraTypes: {[key: string]: string},\n experimentalEnums: {[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\n const extraTypes = codegenExtraTypes(types);\n const experimentalEnums = codegenExtraTypes(\n config.experimentalEnumsMap || {},\n );\n\n return {\n name,\n typeName: name,\n code,\n isFragment: true,\n extraTypes,\n experimentalEnums,\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 = codegenExtraTypes(types);\n const experimentalEnums = codegenExtraTypes(\n config.experimentalEnumsMap || {},\n );\n\n return {name, typeName, code, extraTypes, experimentalEnums};\n }\n })\n .filter(Boolean);\n if (errors.length) {\n throw new FlowGenerationError(errors);\n }\n return result;\n};\n\nfunction codegenExtraTypes(types: {[key: string]: BabelNode}): {\n [key: string]: string,\n} {\n const extraTypes: {[key: string]: string} = {};\n Object.keys(types).forEach((k: string) => {\n // eslint-disable-next-line flowtype-errors/uncovered\n extraTypes[k] = generate(types[k]).code;\n });\n return extraTypes;\n}\n"],"file":"index.js"}
|
|
@@ -5,7 +5,9 @@ import {resolveDocuments} from '../resolve';
|
|
|
5
5
|
|
|
6
6
|
import {print} from 'graphql/language/printer';
|
|
7
7
|
|
|
8
|
-
const fixtureFiles: {
|
|
8
|
+
const fixtureFiles: {
|
|
9
|
+
[key: string]: string | {text: string, resolvedPath: string},
|
|
10
|
+
} = {
|
|
9
11
|
'/firstFile.js': `
|
|
10
12
|
// Note that you can import graphql-tag as
|
|
11
13
|
// something other than gql.
|
package/dist/parser/parse.js
CHANGED
|
@@ -57,14 +57,17 @@ const processFile = (filePath, contents) => {
|
|
|
57
57
|
locals: {},
|
|
58
58
|
errors: []
|
|
59
59
|
};
|
|
60
|
+
const resolved = typeof contents === 'string' ? filePath : contents.resolvedPath;
|
|
61
|
+
const text = typeof contents === 'string' ? contents : contents.text;
|
|
62
|
+
const plugins = resolved.match(/\.tsx?$/) ? ['typescript', filePath.endsWith('x') ? 'jsx' : null].filter(Boolean) : [['flow', {
|
|
63
|
+
enums: true
|
|
64
|
+
}], 'jsx'];
|
|
60
65
|
/* eslint-disable flowtype-errors/uncovered */
|
|
61
66
|
|
|
62
|
-
const ast = (0, _parser.parse)(
|
|
67
|
+
const ast = (0, _parser.parse)(text, {
|
|
63
68
|
sourceType: 'module',
|
|
64
69
|
allowImportExportEverywhere: true,
|
|
65
|
-
plugins:
|
|
66
|
-
enums: true
|
|
67
|
-
}], 'jsx']
|
|
70
|
+
plugins: plugins
|
|
68
71
|
});
|
|
69
72
|
/* eslint-enable flowtype-errors/uncovered */
|
|
70
73
|
|
|
@@ -121,7 +121,10 @@ const listExternalReferences = (file: FileResult): Array<string> => {
|
|
|
121
121
|
return Object.keys(paths);
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
-
export const processFile = (
|
|
124
|
+
export const processFile = (
|
|
125
|
+
filePath: string,
|
|
126
|
+
contents: string | {text: string, resolvedPath: string},
|
|
127
|
+
): FileResult => {
|
|
125
128
|
const dir = path.dirname(filePath);
|
|
126
129
|
const result: FileResult = {
|
|
127
130
|
path: filePath,
|
|
@@ -130,11 +133,17 @@ export const processFile = (filePath: string, contents: string): FileResult => {
|
|
|
130
133
|
locals: {},
|
|
131
134
|
errors: [],
|
|
132
135
|
};
|
|
136
|
+
const resolved =
|
|
137
|
+
typeof contents === 'string' ? filePath : contents.resolvedPath;
|
|
138
|
+
const text = typeof contents === 'string' ? contents : contents.text;
|
|
139
|
+
const plugins = resolved.match(/\.tsx?$/)
|
|
140
|
+
? ['typescript', filePath.endsWith('x') ? 'jsx' : null].filter(Boolean)
|
|
141
|
+
: [['flow', {enums: true}], 'jsx'];
|
|
133
142
|
/* eslint-disable flowtype-errors/uncovered */
|
|
134
|
-
const ast: BabelNodeFile = parse(
|
|
143
|
+
const ast: BabelNodeFile = parse(text, {
|
|
135
144
|
sourceType: 'module',
|
|
136
145
|
allowImportExportEverywhere: true,
|
|
137
|
-
plugins:
|
|
146
|
+
plugins: plugins,
|
|
138
147
|
});
|
|
139
148
|
/* eslint-enable flowtype-errors/uncovered */
|
|
140
149
|
const gqlTagNames = [];
|
|
@@ -382,7 +391,9 @@ const getLocals = (
|
|
|
382
391
|
|
|
383
392
|
export const processFiles = (
|
|
384
393
|
filePaths: Array<string>,
|
|
385
|
-
getFileSource: (
|
|
394
|
+
getFileSource: (
|
|
395
|
+
path: string,
|
|
396
|
+
) => string | {text: string, resolvedPath: string},
|
|
386
397
|
): Files => {
|
|
387
398
|
const files: Files = {};
|
|
388
399
|
const toProcess = filePaths.slice();
|
package/dist/parser/parse.js.map
CHANGED
|
@@ -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","resolved","resolvedPath","text","plugins","match","endsWith","filter","Boolean","enums","ast","sourceType","allowImportExportEverywhere","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","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 = (\n filePath: string,\n contents: string | {text: string, resolvedPath: string},\n): FileResult => {\n const dir = path.dirname(filePath);\n const result: FileResult = {\n path: filePath,\n operations: [],\n exports: {},\n locals: {},\n errors: [],\n };\n const resolved =\n typeof contents === 'string' ? filePath : contents.resolvedPath;\n const text = typeof contents === 'string' ? contents : contents.text;\n const plugins = resolved.match(/\\.tsx?$/)\n ? ['typescript', filePath.endsWith('x') ? 'jsx' : null].filter(Boolean)\n : [['flow', {enums: true}], 'jsx'];\n /* eslint-disable flowtype-errors/uncovered */\n const ast: BabelNodeFile = parse(text, {\n sourceType: 'module',\n allowImportExportEverywhere: true,\n plugins: plugins,\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: (\n path: string,\n ) => string | {text: string, resolvedPath: 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"}
|
package/dist/types.js.flow
CHANGED
|
@@ -19,6 +19,7 @@ export type GenerateConfig = {|
|
|
|
19
19
|
match?: Array<RegExp | string>,
|
|
20
20
|
exclude?: Array<RegExp | string>,
|
|
21
21
|
|
|
22
|
+
typeScript?: boolean,
|
|
22
23
|
scalars?: Scalars,
|
|
23
24
|
strictNullability?: boolean,
|
|
24
25
|
/**
|
|
@@ -79,6 +80,7 @@ export type Context = {
|
|
|
79
80
|
scalars: Scalars,
|
|
80
81
|
errors: Array<string>,
|
|
81
82
|
allObjectTypes: null | {[key: string]: BabelNode},
|
|
83
|
+
typeScript: boolean,
|
|
82
84
|
|
|
83
85
|
experimentalEnumsMap?: {[key: string]: BabelNode}, // index signature that is populated with declarations
|
|
84
86
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@khanacademy/graphql-flow",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"bin": {
|
|
5
5
|
"graphql-flow": "./dist/cli/run.js"
|
|
6
6
|
},
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"@babel/generator": "^7.17.3",
|
|
38
38
|
"@babel/traverse": "^7.17.3",
|
|
39
39
|
"@babel/types": "^7.17.0",
|
|
40
|
+
"@khanacademy/flow-to-ts": "^0.5.2",
|
|
40
41
|
"apollo-utilities": "^1.3.4",
|
|
41
42
|
"graphql": "14.5.8",
|
|
42
43
|
"jsonschema": "^1.4.1",
|
package/src/cli/config.js
CHANGED
|
@@ -28,10 +28,9 @@ export const validateOrThrow = (value: mixed, jsonSchema: mixed) => {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
export const loadConfigFile = (configFile: string): Config => {
|
|
31
|
-
// $FlowIgnore
|
|
32
|
-
const data: Config = require(configFile);
|
|
33
|
-
// eslint-disable-
|
|
34
|
-
validateOrThrow(data, configSchema);
|
|
31
|
+
// $FlowIgnore
|
|
32
|
+
const data: Config = require(configFile); // eslint-disable-line flowtype-errors/uncovered
|
|
33
|
+
validateOrThrow(data, configSchema); // eslint-disable-line flowtype-errors/uncovered
|
|
35
34
|
return data;
|
|
36
35
|
};
|
|
37
36
|
|
package/src/cli/run.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// @flow
|
|
3
3
|
/* eslint-disable no-console */
|
|
4
|
+
import type {Schema} from '../types';
|
|
5
|
+
import type {GraphQLSchema} from 'graphql/type/schema';
|
|
6
|
+
|
|
4
7
|
import {generateTypeFiles, processPragmas} from '../generateTypeFiles';
|
|
5
8
|
import {processFiles} from '../parser/parse';
|
|
6
9
|
import {resolveDocuments} from '../parser/resolve';
|
|
@@ -15,7 +18,6 @@ import {print} from 'graphql/language/printer';
|
|
|
15
18
|
import {validate} from 'graphql/validation';
|
|
16
19
|
import path from 'path';
|
|
17
20
|
import {dirname} from 'path';
|
|
18
|
-
import type {GenerateConfig} from '../types';
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
23
|
* This CLI tool executes the following steps:
|
|
@@ -32,7 +34,7 @@ import type {GenerateConfig} from '../types';
|
|
|
32
34
|
|
|
33
35
|
const findGraphqlTagReferences = (root: string): Array<string> => {
|
|
34
36
|
const response = execSync(
|
|
35
|
-
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx'",
|
|
37
|
+
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx' '*.ts' '*.tsx'",
|
|
36
38
|
{
|
|
37
39
|
encoding: 'utf8',
|
|
38
40
|
cwd: root,
|
|
@@ -81,7 +83,16 @@ const files = processFiles(inputFiles, (f) => {
|
|
|
81
83
|
return readFileSync(f, 'utf8');
|
|
82
84
|
}
|
|
83
85
|
if (existsSync(f + '.js')) {
|
|
84
|
-
return readFileSync(f + '.js', 'utf8');
|
|
86
|
+
return {text: readFileSync(f + '.js', 'utf8'), resolvedPath: f + '.js'};
|
|
87
|
+
}
|
|
88
|
+
if (existsSync(f + '.ts')) {
|
|
89
|
+
return {text: readFileSync(f + '.ts', 'utf8'), resolvedPath: f + '.ts'};
|
|
90
|
+
}
|
|
91
|
+
if (existsSync(f + '.tsx')) {
|
|
92
|
+
return {
|
|
93
|
+
text: readFileSync(f + '.tsx', 'utf8'),
|
|
94
|
+
resolvedPath: f + '.tsx',
|
|
95
|
+
};
|
|
85
96
|
}
|
|
86
97
|
throw new Error(`Unable to find ${f}`);
|
|
87
98
|
});
|
|
@@ -118,7 +129,7 @@ console.log(Object.keys(resolved).length, 'resolved queries');
|
|
|
118
129
|
|
|
119
130
|
/** Step (4) */
|
|
120
131
|
|
|
121
|
-
const schemaCache = {};
|
|
132
|
+
const schemaCache: {[key: string]: [GraphQLSchema, Schema]} = {};
|
|
122
133
|
const getCachedSchemas = (schemaFilePath: string) => {
|
|
123
134
|
if (!schemaCache[schemaFilePath]) {
|
|
124
135
|
schemaCache[schemaFilePath] = getSchemas(
|
package/src/cli/schema.json
CHANGED
package/src/generateTypeFiles.js
CHANGED
|
@@ -4,6 +4,8 @@ import type {GenerateConfig, CrawlConfig, Schema} from './types';
|
|
|
4
4
|
import fs from 'fs';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import {documentToFlowTypes} from '.';
|
|
7
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
8
|
+
import {convert} from '@khanacademy/flow-to-ts/dist/convert.bundle';
|
|
7
9
|
|
|
8
10
|
export const indexPrelude = (regenerateCommand?: string): string => `// @flow
|
|
9
11
|
//
|
|
@@ -27,6 +29,10 @@ export const generateTypeFileContents = (
|
|
|
27
29
|
|
|
28
30
|
/// Write export for __generated__/index.js if it doesn't exist
|
|
29
31
|
const addToIndex = (filePath, typeName) => {
|
|
32
|
+
if (options.typeScript) {
|
|
33
|
+
// Typescript doesn't like file extensions
|
|
34
|
+
filePath = filePath.replace(/\.js$/, '');
|
|
35
|
+
}
|
|
30
36
|
const newLine = `export type {${typeName}} from './${path.basename(
|
|
31
37
|
filePath,
|
|
32
38
|
)}';`;
|
|
@@ -120,7 +126,10 @@ export const generateTypeFiles = (
|
|
|
120
126
|
options: GenerateConfig,
|
|
121
127
|
) => {
|
|
122
128
|
const generatedDir = getGeneratedDir(fileName, options);
|
|
123
|
-
const indexFile = path.join(
|
|
129
|
+
const indexFile = path.join(
|
|
130
|
+
generatedDir,
|
|
131
|
+
'index' + (options.typeScript ? '.ts' : '.js'),
|
|
132
|
+
);
|
|
124
133
|
|
|
125
134
|
if (!fs.existsSync(generatedDir)) {
|
|
126
135
|
fs.mkdirSync(generatedDir, {recursive: true});
|
|
@@ -140,7 +149,13 @@ export const generateTypeFiles = (
|
|
|
140
149
|
|
|
141
150
|
fs.writeFileSync(indexFile, indexContents);
|
|
142
151
|
Object.keys(files).forEach((key) => {
|
|
143
|
-
|
|
152
|
+
let fname = key;
|
|
153
|
+
if (options.typeScript) {
|
|
154
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
155
|
+
files[key] = convert(files[key]);
|
|
156
|
+
fname = key.replace(/\.js$/, '.ts');
|
|
157
|
+
}
|
|
158
|
+
fs.writeFileSync(fname, files[key]);
|
|
144
159
|
});
|
|
145
160
|
|
|
146
161
|
fs.writeFileSync(indexFile, indexContents);
|
package/src/index.js
CHANGED
|
@@ -29,6 +29,7 @@ const optionsToConfig = (
|
|
|
29
29
|
strictNullability: options?.strictNullability ?? true,
|
|
30
30
|
readOnlyArray: options?.readOnlyArray ?? true,
|
|
31
31
|
scalars: options?.scalars ?? {},
|
|
32
|
+
typeScript: options?.typeScript ?? false,
|
|
32
33
|
};
|
|
33
34
|
const fragments = {};
|
|
34
35
|
definitions.forEach((def) => {
|
|
@@ -5,7 +5,9 @@ import {resolveDocuments} from '../resolve';
|
|
|
5
5
|
|
|
6
6
|
import {print} from 'graphql/language/printer';
|
|
7
7
|
|
|
8
|
-
const fixtureFiles: {
|
|
8
|
+
const fixtureFiles: {
|
|
9
|
+
[key: string]: string | {text: string, resolvedPath: string},
|
|
10
|
+
} = {
|
|
9
11
|
'/firstFile.js': `
|
|
10
12
|
// Note that you can import graphql-tag as
|
|
11
13
|
// something other than gql.
|
package/src/parser/parse.js
CHANGED
|
@@ -121,7 +121,10 @@ const listExternalReferences = (file: FileResult): Array<string> => {
|
|
|
121
121
|
return Object.keys(paths);
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
-
export const processFile = (
|
|
124
|
+
export const processFile = (
|
|
125
|
+
filePath: string,
|
|
126
|
+
contents: string | {text: string, resolvedPath: string},
|
|
127
|
+
): FileResult => {
|
|
125
128
|
const dir = path.dirname(filePath);
|
|
126
129
|
const result: FileResult = {
|
|
127
130
|
path: filePath,
|
|
@@ -130,11 +133,17 @@ export const processFile = (filePath: string, contents: string): FileResult => {
|
|
|
130
133
|
locals: {},
|
|
131
134
|
errors: [],
|
|
132
135
|
};
|
|
136
|
+
const resolved =
|
|
137
|
+
typeof contents === 'string' ? filePath : contents.resolvedPath;
|
|
138
|
+
const text = typeof contents === 'string' ? contents : contents.text;
|
|
139
|
+
const plugins = resolved.match(/\.tsx?$/)
|
|
140
|
+
? ['typescript', filePath.endsWith('x') ? 'jsx' : null].filter(Boolean)
|
|
141
|
+
: [['flow', {enums: true}], 'jsx'];
|
|
133
142
|
/* eslint-disable flowtype-errors/uncovered */
|
|
134
|
-
const ast: BabelNodeFile = parse(
|
|
143
|
+
const ast: BabelNodeFile = parse(text, {
|
|
135
144
|
sourceType: 'module',
|
|
136
145
|
allowImportExportEverywhere: true,
|
|
137
|
-
plugins:
|
|
146
|
+
plugins: plugins,
|
|
138
147
|
});
|
|
139
148
|
/* eslint-enable flowtype-errors/uncovered */
|
|
140
149
|
const gqlTagNames = [];
|
|
@@ -382,7 +391,9 @@ const getLocals = (
|
|
|
382
391
|
|
|
383
392
|
export const processFiles = (
|
|
384
393
|
filePaths: Array<string>,
|
|
385
|
-
getFileSource: (
|
|
394
|
+
getFileSource: (
|
|
395
|
+
path: string,
|
|
396
|
+
) => string | {text: string, resolvedPath: string},
|
|
386
397
|
): Files => {
|
|
387
398
|
const files: Files = {};
|
|
388
399
|
const toProcess = filePaths.slice();
|
package/src/types.js
CHANGED
|
@@ -19,6 +19,7 @@ export type GenerateConfig = {|
|
|
|
19
19
|
match?: Array<RegExp | string>,
|
|
20
20
|
exclude?: Array<RegExp | string>,
|
|
21
21
|
|
|
22
|
+
typeScript?: boolean,
|
|
22
23
|
scalars?: Scalars,
|
|
23
24
|
strictNullability?: boolean,
|
|
24
25
|
/**
|
|
@@ -79,6 +80,7 @@ export type Context = {
|
|
|
79
80
|
scalars: Scalars,
|
|
80
81
|
errors: Array<string>,
|
|
81
82
|
allObjectTypes: null | {[key: string]: BabelNode},
|
|
83
|
+
typeScript: boolean,
|
|
82
84
|
|
|
83
85
|
experimentalEnumsMap?: {[key: string]: BabelNode}, // index signature that is populated with declarations
|
|
84
86
|
};
|