@khanacademy/graphql-flow 0.2.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.flowconfig +1 -0
- package/.github/workflows/changeset-release.yml +3 -17
- package/.github/workflows/pr-checks.yml +13 -10
- package/CHANGELOG.md +35 -0
- package/Readme.md +41 -132
- package/dist/__test__/example-schema.graphql +67 -0
- package/dist/__test__/generateTypeFileContents.test.js +157 -0
- package/dist/__test__/graphql-flow.test.js +639 -0
- package/dist/__test__/processPragmas.test.js +76 -0
- package/dist/cli/__test__/config.test.js +120 -0
- package/dist/cli/config.js +51 -26
- package/dist/cli/config.js.flow +40 -68
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/run.js +41 -19
- package/dist/cli/run.js.flow +58 -22
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/schema.json +91 -0
- package/dist/enums.js +20 -7
- package/dist/enums.js.flow +44 -15
- package/dist/enums.js.map +1 -1
- package/dist/generateResponseType.js +47 -47
- package/dist/generateResponseType.js.flow +55 -57
- package/dist/generateResponseType.js.map +1 -1
- package/dist/generateTypeFiles.js +41 -22
- package/dist/generateTypeFiles.js.flow +86 -78
- package/dist/generateTypeFiles.js.map +1 -1
- package/dist/generateVariablesType.js +24 -24
- package/dist/generateVariablesType.js.flow +25 -28
- package/dist/generateVariablesType.js.map +1 -1
- package/dist/index.js +18 -20
- package/dist/index.js.flow +31 -16
- package/dist/index.js.map +1 -1
- package/dist/parser/__test__/parse.test.js +247 -0
- package/dist/types.js.flow +28 -5
- package/flow-typed/npm/@babel/types_vx.x.x.js +17 -3
- package/package.json +3 -2
- package/src/__test__/generateTypeFileContents.test.js +55 -1
- package/src/__test__/graphql-flow.test.js +7 -7
- package/src/__test__/processPragmas.test.js +28 -15
- package/src/cli/__test__/config.test.js +120 -0
- package/src/cli/config.js +40 -68
- package/src/cli/run.js +58 -22
- package/src/cli/schema.json +91 -0
- package/src/enums.js +44 -15
- package/src/generateResponseType.js +55 -57
- package/src/generateTypeFiles.js +86 -78
- package/src/generateVariablesType.js +25 -28
- package/src/index.js +31 -16
- package/src/types.js +28 -5
- package/.github/actions/filter-files/action.yml +0 -37
- package/.github/actions/full-or-limited/action.yml +0 -27
- package/.github/actions/json-args/action.yml +0 -32
- package/.github/actions/setup/action.yml +0 -28
- package/dist/jest-mock-graphql-tag.js +0 -88
- package/dist/jest-mock-graphql-tag.js.flow +0 -96
- package/dist/jest-mock-graphql-tag.js.map +0 -1
- package/src/jest-mock-graphql-tag.js +0 -96
|
@@ -1,28 +1,10 @@
|
|
|
1
1
|
// @flow
|
|
2
|
-
// Import this in your jest setup, to mock out graphql-tag!
|
|
3
2
|
import type {DocumentNode} from 'graphql';
|
|
4
|
-
import type {
|
|
3
|
+
import type {GenerateConfig, CrawlConfig, Schema} from './types';
|
|
5
4
|
import fs from 'fs';
|
|
6
5
|
import path from 'path';
|
|
7
6
|
import {documentToFlowTypes} from '.';
|
|
8
7
|
|
|
9
|
-
export type ExternalOptions = {
|
|
10
|
-
pragma?: string,
|
|
11
|
-
loosePragma?: string,
|
|
12
|
-
ignorePragma?: string,
|
|
13
|
-
scalars?: Scalars,
|
|
14
|
-
strictNullability?: boolean,
|
|
15
|
-
/**
|
|
16
|
-
* The command that users should run to regenerate the types files.
|
|
17
|
-
*/
|
|
18
|
-
regenerateCommand?: string,
|
|
19
|
-
readOnlyArray?: boolean,
|
|
20
|
-
splitTypes?: boolean,
|
|
21
|
-
generatedDirectory?: string,
|
|
22
|
-
exportAllObjectTypes?: boolean,
|
|
23
|
-
typeFileName?: string,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
8
|
export const indexPrelude = (regenerateCommand?: string): string => `// @flow
|
|
27
9
|
//
|
|
28
10
|
// AUTOGENERATED
|
|
@@ -37,7 +19,7 @@ export const generateTypeFileContents = (
|
|
|
37
19
|
fileName: string,
|
|
38
20
|
schema: Schema,
|
|
39
21
|
document: DocumentNode,
|
|
40
|
-
options:
|
|
22
|
+
options: GenerateConfig,
|
|
41
23
|
generatedDir: string,
|
|
42
24
|
indexContents: string,
|
|
43
25
|
): {indexContents: string, files: {[key: string]: string}} => {
|
|
@@ -62,54 +44,82 @@ export const generateTypeFileContents = (
|
|
|
62
44
|
};
|
|
63
45
|
|
|
64
46
|
const generated = documentToFlowTypes(document, schema, options);
|
|
65
|
-
generated.forEach(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
47
|
+
generated.forEach(
|
|
48
|
+
({name, typeName, code, isFragment, extraTypes, experimentalEnums}) => {
|
|
49
|
+
// We write all generated files to a `__generated__` subdir to keep
|
|
50
|
+
// things tidy.
|
|
51
|
+
const targetFileName = options.typeFileName
|
|
52
|
+
? options.typeFileName.replace('[operationName]', name)
|
|
53
|
+
: `${name}.js`;
|
|
54
|
+
const targetPath = path.join(generatedDir, targetFileName);
|
|
55
|
+
|
|
56
|
+
let fileContents =
|
|
57
|
+
'// @' +
|
|
58
|
+
`flow\n// AUTOGENERATED -- DO NOT EDIT\n` +
|
|
59
|
+
`// Generated for operation '${name}' in file '../${path.basename(
|
|
60
|
+
fileName,
|
|
61
|
+
)}'\n` +
|
|
62
|
+
(options.regenerateCommand
|
|
63
|
+
? `// To regenerate, run '${options.regenerateCommand}'.\n`
|
|
64
|
+
: '') +
|
|
65
|
+
code;
|
|
66
|
+
if (options.splitTypes && !isFragment) {
|
|
67
|
+
fileContents +=
|
|
68
|
+
`\nexport type ${name} = ${typeName}['response'];\n` +
|
|
69
|
+
`export type ${name}Variables = ${typeName}['variables'];\n`;
|
|
70
|
+
}
|
|
71
|
+
Object.keys(extraTypes).forEach(
|
|
72
|
+
(name) =>
|
|
73
|
+
(fileContents += `\n\nexport type ${name} = ${extraTypes[name]};`),
|
|
74
|
+
);
|
|
75
|
+
const enumNames = Object.keys(experimentalEnums);
|
|
76
|
+
if (options.experimentalEnums && enumNames.length) {
|
|
77
|
+
// TODO(somewhatabstract, FEI-4172): Update to fixed eslint-plugin-flowtype
|
|
78
|
+
// and remove this disable.
|
|
79
|
+
fileContents += `\n\n/* eslint-disable no-undef */`;
|
|
80
|
+
enumNames.forEach(
|
|
81
|
+
(name) =>
|
|
82
|
+
(fileContents += `\nexport ${experimentalEnums[name]};\n`),
|
|
83
|
+
);
|
|
84
|
+
fileContents += `/* eslint-enable no-undef */`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
addToIndex(targetPath, typeName);
|
|
88
|
+
files[targetPath] =
|
|
89
|
+
fileContents
|
|
90
|
+
// Remove whitespace from the ends of lines; babel's generate sometimes
|
|
91
|
+
// leaves them hanging around.
|
|
92
|
+
.replace(/\s+$/gm, '') + '\n';
|
|
93
|
+
},
|
|
94
|
+
);
|
|
99
95
|
|
|
100
96
|
return {files, indexContents};
|
|
101
97
|
};
|
|
102
98
|
|
|
99
|
+
const getGeneratedDir = (fileName: string, options: GenerateConfig) => {
|
|
100
|
+
const generatedDirectory = options.generatedDirectory ?? '__generated__';
|
|
101
|
+
if (path.isAbsolute(generatedDirectory)) {
|
|
102
|
+
// fileName is absolute here, so we make it relative to cwd
|
|
103
|
+
// for more reasonable filenames. We convert leading ..'s
|
|
104
|
+
// to `__` so this doesn't escape the output directory.
|
|
105
|
+
return path.join(
|
|
106
|
+
generatedDirectory,
|
|
107
|
+
path
|
|
108
|
+
.relative(process.cwd(), path.dirname(fileName))
|
|
109
|
+
.replace(/\.\.\//g, '__/'),
|
|
110
|
+
);
|
|
111
|
+
} else {
|
|
112
|
+
return path.join(path.dirname(fileName), generatedDirectory);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
103
116
|
export const generateTypeFiles = (
|
|
104
117
|
fileName: string,
|
|
105
118
|
schema: Schema,
|
|
106
119
|
document: DocumentNode,
|
|
107
|
-
options:
|
|
120
|
+
options: GenerateConfig,
|
|
108
121
|
) => {
|
|
109
|
-
const generatedDir =
|
|
110
|
-
path.dirname(fileName),
|
|
111
|
-
options.generatedDirectory ?? '__generated__',
|
|
112
|
-
);
|
|
122
|
+
const generatedDir = getGeneratedDir(fileName, options);
|
|
113
123
|
const indexFile = path.join(generatedDir, 'index.js');
|
|
114
124
|
|
|
115
125
|
if (!fs.existsSync(generatedDir)) {
|
|
@@ -137,35 +147,33 @@ export const generateTypeFiles = (
|
|
|
137
147
|
};
|
|
138
148
|
|
|
139
149
|
export const processPragmas = (
|
|
140
|
-
|
|
150
|
+
generateConfig: GenerateConfig,
|
|
151
|
+
crawlConfig: CrawlConfig,
|
|
141
152
|
rawSource: string,
|
|
142
|
-
):
|
|
143
|
-
if (
|
|
144
|
-
|
|
153
|
+
): {generate: boolean, strict?: boolean} => {
|
|
154
|
+
if (
|
|
155
|
+
crawlConfig.ignorePragma &&
|
|
156
|
+
rawSource.includes(crawlConfig.ignorePragma)
|
|
157
|
+
) {
|
|
158
|
+
return {generate: false};
|
|
145
159
|
}
|
|
146
160
|
|
|
147
|
-
const autogen =
|
|
148
|
-
? rawSource.includes(
|
|
161
|
+
const autogen = crawlConfig.loosePragma
|
|
162
|
+
? rawSource.includes(crawlConfig.loosePragma)
|
|
149
163
|
: false;
|
|
150
|
-
const autogenStrict =
|
|
151
|
-
? rawSource.includes(
|
|
164
|
+
const autogenStrict = crawlConfig.pragma
|
|
165
|
+
? rawSource.includes(crawlConfig.pragma)
|
|
152
166
|
: false;
|
|
153
|
-
const noPragmas = !
|
|
167
|
+
const noPragmas = !crawlConfig.loosePragma && !crawlConfig.pragma;
|
|
154
168
|
|
|
155
169
|
if (autogen || autogenStrict || noPragmas) {
|
|
156
170
|
return {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
?
|
|
171
|
+
generate: true,
|
|
172
|
+
strict: noPragmas
|
|
173
|
+
? generateConfig.strictNullability
|
|
160
174
|
: autogenStrict || !autogen,
|
|
161
|
-
readOnlyArray: options.readOnlyArray,
|
|
162
|
-
scalars: options.scalars,
|
|
163
|
-
splitTypes: options.splitTypes,
|
|
164
|
-
generatedDirectory: options.generatedDirectory,
|
|
165
|
-
exportAllObjectTypes: options.exportAllObjectTypes,
|
|
166
|
-
typeFileName: options.typeFileName,
|
|
167
175
|
};
|
|
168
176
|
} else {
|
|
169
|
-
return
|
|
177
|
+
return {generate: false};
|
|
170
178
|
}
|
|
171
179
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generateTypeFiles.js"],"names":["indexPrelude","regenerateCommand","generateTypeFileContents","fileName","schema","document","options","generatedDir","indexContents","files","addToIndex","filePath","typeName","newLine","path","basename","indexOf","lines","split","map","line","includes","join","generated","forEach","name","code","isFragment","extraTypes","targetFileName","typeFileName","replace","targetPath","fileContents","splitTypes","Object","keys","generateTypeFiles","dirname","generatedDirectory","indexFile","fs","existsSync","mkdirSync","recursive","writeFileSync","readFileSync","key","processPragmas","rawSource","ignorePragma","autogen","loosePragma","autogenStrict","pragma","noPragmas","strictNullability","readOnlyArray","scalars","exportAllObjectTypes"],"mappings":"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","sourcesContent":["// @flow\n// Import this in your jest setup, to mock out graphql-tag!\nimport type {DocumentNode} from 'graphql';\nimport type {Options, Schema, Scalars} from './types';\nimport fs from 'fs';\nimport path from 'path';\nimport {documentToFlowTypes} from '.';\n\nexport type ExternalOptions = {\n pragma?: string,\n loosePragma?: string,\n ignorePragma?: string,\n scalars?: Scalars,\n strictNullability?: boolean,\n /**\n * The command that users should run to regenerate the types files.\n */\n regenerateCommand?: string,\n readOnlyArray?: boolean,\n splitTypes?: boolean,\n generatedDirectory?: string,\n exportAllObjectTypes?: boolean,\n typeFileName?: string,\n};\n\nexport const indexPrelude = (regenerateCommand?: string): string => `// @flow\n//\n// AUTOGENERATED\n// NOTE: New response types are added to this file automatically.\n// Outdated response types can be removed manually as they are deprecated.\n//${regenerateCommand ? ' To regenerate, run ' + regenerateCommand : ''}\n//\n\n`;\n\nexport const generateTypeFileContents = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: Options,\n generatedDir: string,\n indexContents: string,\n): {indexContents: string, files: {[key: string]: string}} => {\n const files = {};\n\n /// Write export for __generated__/index.js if it doesn't exist\n const addToIndex = (filePath, typeName) => {\n const newLine = `export type {${typeName}} from './${path.basename(\n filePath,\n )}';`;\n if (indexContents.indexOf('./' + path.basename(filePath)) === -1) {\n indexContents += newLine + '\\n';\n } else {\n const lines = indexContents.split('\\n').map((line) => {\n if (line.includes('./' + path.basename(filePath))) {\n return newLine;\n }\n return line;\n });\n indexContents = lines.join('\\n');\n }\n };\n\n const generated = documentToFlowTypes(document, schema, options);\n generated.forEach(({name, typeName, code, isFragment, extraTypes}) => {\n // We write all generated files to a `__generated__` subdir to keep\n // things tidy.\n const targetFileName = options.typeFileName\n ? options.typeFileName.replace('[operationName]', name)\n : `${name}.js`;\n const targetPath = path.join(generatedDir, targetFileName);\n\n let fileContents =\n '// @' +\n `flow\\n// AUTOGENERATED -- DO NOT EDIT\\n` +\n `// Generated for operation '${name}' in file '../${path.basename(\n fileName,\n )}'\\n` +\n (options.regenerateCommand\n ? `// To regenerate, run '${options.regenerateCommand}'.\\n`\n : '') +\n code;\n if (options.splitTypes && !isFragment) {\n fileContents +=\n `\\nexport type ${name} = ${typeName}['response'];\\n` +\n `export type ${name}Variables = ${typeName}['variables'];\\n`;\n }\n Object.keys(extraTypes).forEach((name) => {\n fileContents += `\\n\\nexport type ${name} = ${extraTypes[name]};`;\n });\n\n addToIndex(targetPath, typeName);\n files[targetPath] =\n fileContents\n // Remove whitespace from the ends of lines; babel's generate sometimes\n // leaves them hanging around.\n .replace(/\\s+$/gm, '') + '\\n';\n });\n\n return {files, indexContents};\n};\n\nexport const generateTypeFiles = (\n fileName: string,\n schema: Schema,\n document: DocumentNode,\n options: Options,\n) => {\n const generatedDir = path.join(\n path.dirname(fileName),\n options.generatedDirectory ?? '__generated__',\n );\n const indexFile = path.join(generatedDir, 'index.js');\n\n if (!fs.existsSync(generatedDir)) {\n fs.mkdirSync(generatedDir, {recursive: true});\n }\n if (!fs.existsSync(indexFile)) {\n fs.writeFileSync(indexFile, indexPrelude(options.regenerateCommand));\n }\n\n const {indexContents, files} = generateTypeFileContents(\n fileName,\n schema,\n document,\n options,\n generatedDir,\n fs.readFileSync(indexFile, 'utf8'),\n );\n\n fs.writeFileSync(indexFile, indexContents);\n Object.keys(files).forEach((key) => {\n fs.writeFileSync(key, files[key]);\n });\n\n fs.writeFileSync(indexFile, indexContents);\n};\n\nexport const processPragmas = (\n options: ExternalOptions,\n rawSource: string,\n): null | Options => {\n if (options.ignorePragma && rawSource.includes(options.ignorePragma)) {\n return null;\n }\n\n const autogen = options.loosePragma\n ? rawSource.includes(options.loosePragma)\n : false;\n const autogenStrict = options.pragma\n ? rawSource.includes(options.pragma)\n : false;\n const noPragmas = !options.loosePragma && !options.pragma;\n\n if (autogen || autogenStrict || noPragmas) {\n return {\n regenerateCommand: options.regenerateCommand,\n strictNullability: noPragmas\n ? options.strictNullability\n : autogenStrict || !autogen,\n readOnlyArray: options.readOnlyArray,\n scalars: options.scalars,\n splitTypes: options.splitTypes,\n generatedDirectory: options.generatedDirectory,\n exportAllObjectTypes: options.exportAllObjectTypes,\n typeFileName: options.typeFileName,\n };\n } else {\n return null;\n }\n};\n"],"file":"generateTypeFiles.js"}
|
|
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"}
|
|
@@ -19,15 +19,15 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
19
19
|
|
|
20
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
21
|
|
|
22
|
-
const inputObjectToFlow = (
|
|
23
|
-
const inputObject =
|
|
22
|
+
const inputObjectToFlow = (ctx, name) => {
|
|
23
|
+
const inputObject = ctx.schema.inputObjectsByName[name];
|
|
24
24
|
|
|
25
25
|
if (!inputObject) {
|
|
26
|
-
|
|
26
|
+
ctx.errors.push(`Unknown input object ${name}`);
|
|
27
27
|
return babelTypes.stringLiteralTypeAnnotation(`Unknown input object ${name}`);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
return (0, _utils.maybeAddDescriptionComment)(inputObject.description, babelTypes.objectTypeAnnotation(inputObject.inputFields.map(vbl => (0, _utils.maybeAddDescriptionComment)(vbl.description, maybeOptionalObjectTypeProperty(vbl.name, inputRefToFlow(
|
|
30
|
+
return (0, _utils.maybeAddDescriptionComment)(inputObject.description, babelTypes.objectTypeAnnotation(inputObject.inputFields.map(vbl => (0, _utils.maybeAddDescriptionComment)(vbl.description, maybeOptionalObjectTypeProperty(vbl.name, inputRefToFlow(ctx, vbl.type)))), undefined
|
|
31
31
|
/* indexers */
|
|
32
32
|
, undefined
|
|
33
33
|
/* callProperties */
|
|
@@ -52,77 +52,77 @@ const maybeOptionalObjectTypeProperty = (name, type) => {
|
|
|
52
52
|
|
|
53
53
|
exports.maybeOptionalObjectTypeProperty = maybeOptionalObjectTypeProperty;
|
|
54
54
|
|
|
55
|
-
const inputRefToFlow = (
|
|
55
|
+
const inputRefToFlow = (ctx, inputRef) => {
|
|
56
56
|
if (inputRef.kind === 'NON_NULL') {
|
|
57
|
-
return _inputRefToFlow(
|
|
57
|
+
return _inputRefToFlow(ctx, inputRef.ofType);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
const result = _inputRefToFlow(
|
|
60
|
+
const result = _inputRefToFlow(ctx, inputRef);
|
|
61
61
|
|
|
62
62
|
return (0, _utils.transferLeadingComments)(result, babelTypes.nullableTypeAnnotation(result));
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
exports.inputRefToFlow = inputRefToFlow;
|
|
66
66
|
|
|
67
|
-
const _inputRefToFlow = (
|
|
67
|
+
const _inputRefToFlow = (ctx, inputRef) => {
|
|
68
68
|
if (inputRef.kind === 'SCALAR') {
|
|
69
|
-
return (0, _enums.scalarTypeToFlow)(
|
|
69
|
+
return (0, _enums.scalarTypeToFlow)(ctx, inputRef.name);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
if (inputRef.kind === 'ENUM') {
|
|
73
|
-
return (0, _enums.enumTypeToFlow)(
|
|
73
|
+
return (0, _enums.enumTypeToFlow)(ctx, inputRef.name);
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
if (inputRef.kind === 'INPUT_OBJECT') {
|
|
77
|
-
return inputObjectToFlow(
|
|
77
|
+
return inputObjectToFlow(ctx, inputRef.name);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
if (inputRef.kind === 'LIST') {
|
|
81
|
-
return babelTypes.genericTypeAnnotation(babelTypes.identifier('$ReadOnlyArray'), babelTypes.typeParameterInstantiation([inputRefToFlow(
|
|
81
|
+
return babelTypes.genericTypeAnnotation(babelTypes.identifier('$ReadOnlyArray'), babelTypes.typeParameterInstantiation([inputRefToFlow(ctx, inputRef.ofType)]));
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
return babelTypes.stringLiteralTypeAnnotation(JSON.stringify(inputRef));
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
-
const variableToFlow = (
|
|
87
|
+
const variableToFlow = (ctx, type) => {
|
|
88
88
|
if (type.kind === 'NonNullType') {
|
|
89
|
-
return _variableToFlow(
|
|
89
|
+
return _variableToFlow(ctx, type.type);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
const result = _variableToFlow(
|
|
92
|
+
const result = _variableToFlow(ctx, type);
|
|
93
93
|
|
|
94
94
|
return (0, _utils.transferLeadingComments)(result, babelTypes.nullableTypeAnnotation(result));
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
-
const _variableToFlow = (
|
|
97
|
+
const _variableToFlow = (ctx, type) => {
|
|
98
98
|
if (type.kind === 'NamedType') {
|
|
99
99
|
if (_enums.builtinScalars[type.name.value]) {
|
|
100
|
-
return (0, _enums.scalarTypeToFlow)(
|
|
100
|
+
return (0, _enums.scalarTypeToFlow)(ctx, type.name.value);
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
if (
|
|
104
|
-
return (0, _enums.enumTypeToFlow)(
|
|
103
|
+
if (ctx.schema.enumsByName[type.name.value]) {
|
|
104
|
+
return (0, _enums.enumTypeToFlow)(ctx, type.name.value);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
const customScalarType =
|
|
107
|
+
const customScalarType = ctx.scalars[type.name.value];
|
|
108
108
|
|
|
109
109
|
if (customScalarType) {
|
|
110
110
|
return babelTypes.genericTypeAnnotation(babelTypes.identifier(customScalarType));
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
return inputObjectToFlow(
|
|
113
|
+
return inputObjectToFlow(ctx, type.name.value);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
if (type.kind === 'ListType') {
|
|
117
|
-
return babelTypes.genericTypeAnnotation(babelTypes.identifier('$ReadOnlyArray'), babelTypes.typeParameterInstantiation([variableToFlow(
|
|
117
|
+
return babelTypes.genericTypeAnnotation(babelTypes.identifier('$ReadOnlyArray'), babelTypes.typeParameterInstantiation([variableToFlow(ctx, type.type)]));
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
return babelTypes.stringLiteralTypeAnnotation('UNKNOWN' + JSON.stringify(type));
|
|
121
121
|
};
|
|
122
122
|
|
|
123
|
-
const generateVariablesType = (schema, item,
|
|
123
|
+
const generateVariablesType = (schema, item, ctx) => {
|
|
124
124
|
const variableObject = babelTypes.objectTypeAnnotation((item.variableDefinitions || []).map(vbl => {
|
|
125
|
-
return maybeOptionalObjectTypeProperty(vbl.variable.name.value, variableToFlow(
|
|
125
|
+
return maybeOptionalObjectTypeProperty(vbl.variable.name.value, variableToFlow(ctx, vbl.type));
|
|
126
126
|
}), undefined
|
|
127
127
|
/* indexers */
|
|
128
128
|
, undefined
|
|
@@ -8,7 +8,7 @@ import * as babelTypes from '@babel/types';
|
|
|
8
8
|
import type {OperationDefinitionNode, TypeNode} from 'graphql/language/ast';
|
|
9
9
|
import type {IntrospectionInputTypeRef} from 'graphql/utilities/introspectionQuery';
|
|
10
10
|
import {builtinScalars, enumTypeToFlow, scalarTypeToFlow} from './enums';
|
|
11
|
-
import type {
|
|
11
|
+
import type {Context, Schema} from './types';
|
|
12
12
|
import {
|
|
13
13
|
liftLeadingPropertyComments,
|
|
14
14
|
maybeAddDescriptionComment,
|
|
@@ -16,12 +16,12 @@ import {
|
|
|
16
16
|
} from './utils';
|
|
17
17
|
|
|
18
18
|
export const inputObjectToFlow = (
|
|
19
|
-
|
|
19
|
+
ctx: Context,
|
|
20
20
|
name: string,
|
|
21
21
|
): BabelNodeFlowType => {
|
|
22
|
-
const inputObject =
|
|
22
|
+
const inputObject = ctx.schema.inputObjectsByName[name];
|
|
23
23
|
if (!inputObject) {
|
|
24
|
-
|
|
24
|
+
ctx.errors.push(`Unknown input object ${name}`);
|
|
25
25
|
return babelTypes.stringLiteralTypeAnnotation(
|
|
26
26
|
`Unknown input object ${name}`,
|
|
27
27
|
);
|
|
@@ -35,7 +35,7 @@ export const inputObjectToFlow = (
|
|
|
35
35
|
vbl.description,
|
|
36
36
|
maybeOptionalObjectTypeProperty(
|
|
37
37
|
vbl.name,
|
|
38
|
-
inputRefToFlow(
|
|
38
|
+
inputRefToFlow(ctx, vbl.type),
|
|
39
39
|
),
|
|
40
40
|
),
|
|
41
41
|
),
|
|
@@ -61,75 +61,72 @@ export const maybeOptionalObjectTypeProperty = (
|
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
export const inputRefToFlow = (
|
|
64
|
-
|
|
64
|
+
ctx: Context,
|
|
65
65
|
inputRef: IntrospectionInputTypeRef,
|
|
66
66
|
): BabelNodeFlowType => {
|
|
67
67
|
if (inputRef.kind === 'NON_NULL') {
|
|
68
|
-
return _inputRefToFlow(
|
|
68
|
+
return _inputRefToFlow(ctx, inputRef.ofType);
|
|
69
69
|
}
|
|
70
|
-
const result = _inputRefToFlow(
|
|
70
|
+
const result = _inputRefToFlow(ctx, inputRef);
|
|
71
71
|
return transferLeadingComments(
|
|
72
72
|
result,
|
|
73
73
|
babelTypes.nullableTypeAnnotation(result),
|
|
74
74
|
);
|
|
75
75
|
};
|
|
76
76
|
|
|
77
|
-
const _inputRefToFlow = (
|
|
78
|
-
config: Config,
|
|
79
|
-
inputRef: IntrospectionInputTypeRef,
|
|
80
|
-
) => {
|
|
77
|
+
const _inputRefToFlow = (ctx: Context, inputRef: IntrospectionInputTypeRef) => {
|
|
81
78
|
if (inputRef.kind === 'SCALAR') {
|
|
82
|
-
return scalarTypeToFlow(
|
|
79
|
+
return scalarTypeToFlow(ctx, inputRef.name);
|
|
83
80
|
}
|
|
84
81
|
if (inputRef.kind === 'ENUM') {
|
|
85
|
-
return enumTypeToFlow(
|
|
82
|
+
return enumTypeToFlow(ctx, inputRef.name);
|
|
86
83
|
}
|
|
87
84
|
if (inputRef.kind === 'INPUT_OBJECT') {
|
|
88
|
-
return inputObjectToFlow(
|
|
85
|
+
return inputObjectToFlow(ctx, inputRef.name);
|
|
89
86
|
}
|
|
90
87
|
if (inputRef.kind === 'LIST') {
|
|
91
88
|
return babelTypes.genericTypeAnnotation(
|
|
92
89
|
babelTypes.identifier('$ReadOnlyArray'),
|
|
93
90
|
babelTypes.typeParameterInstantiation([
|
|
94
|
-
inputRefToFlow(
|
|
91
|
+
inputRefToFlow(ctx, inputRef.ofType),
|
|
95
92
|
]),
|
|
96
93
|
);
|
|
97
94
|
}
|
|
98
95
|
return babelTypes.stringLiteralTypeAnnotation(JSON.stringify(inputRef));
|
|
99
96
|
};
|
|
100
97
|
|
|
101
|
-
const variableToFlow = (
|
|
98
|
+
const variableToFlow = (ctx: Context, type: TypeNode) => {
|
|
102
99
|
if (type.kind === 'NonNullType') {
|
|
103
|
-
return _variableToFlow(
|
|
100
|
+
return _variableToFlow(ctx, type.type);
|
|
104
101
|
}
|
|
105
|
-
const result = _variableToFlow(
|
|
102
|
+
const result = _variableToFlow(ctx, type);
|
|
106
103
|
return transferLeadingComments(
|
|
107
104
|
result,
|
|
108
105
|
babelTypes.nullableTypeAnnotation(result),
|
|
109
106
|
);
|
|
110
107
|
};
|
|
111
108
|
|
|
112
|
-
const _variableToFlow = (
|
|
109
|
+
const _variableToFlow = (ctx: Context, type: TypeNode) => {
|
|
113
110
|
if (type.kind === 'NamedType') {
|
|
114
111
|
if (builtinScalars[type.name.value]) {
|
|
115
|
-
return scalarTypeToFlow(
|
|
112
|
+
return scalarTypeToFlow(ctx, type.name.value);
|
|
116
113
|
}
|
|
117
|
-
if (
|
|
118
|
-
return enumTypeToFlow(
|
|
114
|
+
if (ctx.schema.enumsByName[type.name.value]) {
|
|
115
|
+
return enumTypeToFlow(ctx, type.name.value);
|
|
119
116
|
}
|
|
120
|
-
const customScalarType =
|
|
117
|
+
const customScalarType = ctx.scalars[type.name.value];
|
|
121
118
|
if (customScalarType) {
|
|
122
119
|
return babelTypes.genericTypeAnnotation(
|
|
123
120
|
babelTypes.identifier(customScalarType),
|
|
124
121
|
);
|
|
125
122
|
}
|
|
126
|
-
return inputObjectToFlow(
|
|
123
|
+
return inputObjectToFlow(ctx, type.name.value);
|
|
127
124
|
}
|
|
128
125
|
if (type.kind === 'ListType') {
|
|
129
126
|
return babelTypes.genericTypeAnnotation(
|
|
130
127
|
babelTypes.identifier('$ReadOnlyArray'),
|
|
131
128
|
babelTypes.typeParameterInstantiation([
|
|
132
|
-
variableToFlow(
|
|
129
|
+
variableToFlow(ctx, type.type),
|
|
133
130
|
]),
|
|
134
131
|
);
|
|
135
132
|
}
|
|
@@ -141,13 +138,13 @@ const _variableToFlow = (config: Config, type: TypeNode) => {
|
|
|
141
138
|
export const generateVariablesType = (
|
|
142
139
|
schema: Schema,
|
|
143
140
|
item: OperationDefinitionNode,
|
|
144
|
-
|
|
141
|
+
ctx: Context,
|
|
145
142
|
): string => {
|
|
146
143
|
const variableObject = babelTypes.objectTypeAnnotation(
|
|
147
144
|
(item.variableDefinitions || []).map((vbl) => {
|
|
148
145
|
return maybeOptionalObjectTypeProperty(
|
|
149
146
|
vbl.variable.name.value,
|
|
150
|
-
variableToFlow(
|
|
147
|
+
variableToFlow(ctx, vbl.type),
|
|
151
148
|
);
|
|
152
149
|
}),
|
|
153
150
|
undefined /* indexers */,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generateVariablesType.js"],"names":["inputObjectToFlow","
|
|
1
|
+
{"version":3,"sources":["../src/generateVariablesType.js"],"names":["inputObjectToFlow","ctx","name","inputObject","schema","inputObjectsByName","errors","push","babelTypes","stringLiteralTypeAnnotation","description","objectTypeAnnotation","inputFields","map","vbl","maybeOptionalObjectTypeProperty","inputRefToFlow","type","undefined","prop","objectTypeProperty","identifier","optional","inputRef","kind","_inputRefToFlow","ofType","result","nullableTypeAnnotation","genericTypeAnnotation","typeParameterInstantiation","JSON","stringify","variableToFlow","_variableToFlow","builtinScalars","value","enumsByName","customScalarType","scalars","generateVariablesType","item","variableObject","variableDefinitions","variable","code"],"mappings":"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","sourcesContent":["// @flow\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport type {\n BabelNodeFlowType,\n BabelNodeObjectTypeProperty,\n} from '@babel/types';\nimport * as babelTypes from '@babel/types';\nimport type {OperationDefinitionNode, TypeNode} from 'graphql/language/ast';\nimport type {IntrospectionInputTypeRef} from 'graphql/utilities/introspectionQuery';\nimport {builtinScalars, enumTypeToFlow, scalarTypeToFlow} from './enums';\nimport type {Context, Schema} from './types';\nimport {\n liftLeadingPropertyComments,\n maybeAddDescriptionComment,\n transferLeadingComments,\n} from './utils';\n\nexport const inputObjectToFlow = (\n ctx: Context,\n name: string,\n): BabelNodeFlowType => {\n const inputObject = ctx.schema.inputObjectsByName[name];\n if (!inputObject) {\n ctx.errors.push(`Unknown input object ${name}`);\n return babelTypes.stringLiteralTypeAnnotation(\n `Unknown input object ${name}`,\n );\n }\n\n return maybeAddDescriptionComment(\n inputObject.description,\n babelTypes.objectTypeAnnotation(\n inputObject.inputFields.map((vbl) =>\n maybeAddDescriptionComment(\n vbl.description,\n maybeOptionalObjectTypeProperty(\n vbl.name,\n inputRefToFlow(ctx, vbl.type),\n ),\n ),\n ),\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n ),\n );\n};\n\nexport const maybeOptionalObjectTypeProperty = (\n name: string,\n type: babelTypes.BabelNodeFlowType,\n): BabelNodeObjectTypeProperty => {\n const prop = liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(babelTypes.identifier(name), type),\n );\n if (type.type === 'NullableTypeAnnotation') {\n prop.optional = true;\n }\n return prop;\n};\n\nexport const inputRefToFlow = (\n ctx: Context,\n inputRef: IntrospectionInputTypeRef,\n): BabelNodeFlowType => {\n if (inputRef.kind === 'NON_NULL') {\n return _inputRefToFlow(ctx, inputRef.ofType);\n }\n const result = _inputRefToFlow(ctx, inputRef);\n return transferLeadingComments(\n result,\n babelTypes.nullableTypeAnnotation(result),\n );\n};\n\nconst _inputRefToFlow = (ctx: Context, inputRef: IntrospectionInputTypeRef) => {\n if (inputRef.kind === 'SCALAR') {\n return scalarTypeToFlow(ctx, inputRef.name);\n }\n if (inputRef.kind === 'ENUM') {\n return enumTypeToFlow(ctx, inputRef.name);\n }\n if (inputRef.kind === 'INPUT_OBJECT') {\n return inputObjectToFlow(ctx, inputRef.name);\n }\n if (inputRef.kind === 'LIST') {\n return babelTypes.genericTypeAnnotation(\n babelTypes.identifier('$ReadOnlyArray'),\n babelTypes.typeParameterInstantiation([\n inputRefToFlow(ctx, inputRef.ofType),\n ]),\n );\n }\n return babelTypes.stringLiteralTypeAnnotation(JSON.stringify(inputRef));\n};\n\nconst variableToFlow = (ctx: Context, type: TypeNode) => {\n if (type.kind === 'NonNullType') {\n return _variableToFlow(ctx, type.type);\n }\n const result = _variableToFlow(ctx, type);\n return transferLeadingComments(\n result,\n babelTypes.nullableTypeAnnotation(result),\n );\n};\n\nconst _variableToFlow = (ctx: Context, type: TypeNode) => {\n if (type.kind === 'NamedType') {\n if (builtinScalars[type.name.value]) {\n return scalarTypeToFlow(ctx, type.name.value);\n }\n if (ctx.schema.enumsByName[type.name.value]) {\n return enumTypeToFlow(ctx, type.name.value);\n }\n const customScalarType = ctx.scalars[type.name.value];\n if (customScalarType) {\n return babelTypes.genericTypeAnnotation(\n babelTypes.identifier(customScalarType),\n );\n }\n return inputObjectToFlow(ctx, type.name.value);\n }\n if (type.kind === 'ListType') {\n return babelTypes.genericTypeAnnotation(\n babelTypes.identifier('$ReadOnlyArray'),\n babelTypes.typeParameterInstantiation([\n variableToFlow(ctx, type.type),\n ]),\n );\n }\n return babelTypes.stringLiteralTypeAnnotation(\n 'UNKNOWN' + JSON.stringify(type),\n );\n};\n\nexport const generateVariablesType = (\n schema: Schema,\n item: OperationDefinitionNode,\n ctx: Context,\n): string => {\n const variableObject = babelTypes.objectTypeAnnotation(\n (item.variableDefinitions || []).map((vbl) => {\n return maybeOptionalObjectTypeProperty(\n vbl.variable.name.value,\n variableToFlow(ctx, vbl.type),\n );\n }),\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n );\n return generate(variableObject).code; // eslint-disable-line flowtype-errors/uncovered\n};\n"],"file":"generateVariablesType.js"}
|