@khanacademy/graphql-flow 1.2.0 → 2.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/.babelrc +1 -1
- package/.eslintrc.js +0 -1
- package/.github/workflows/changeset-release.yml +1 -1
- package/CHANGELOG.md +10 -0
- package/dist/cli/config.js +2 -4
- package/dist/cli/run.js +1 -2
- package/dist/enums.js +8 -9
- package/dist/generateResponseType.js +33 -41
- package/dist/generateTypeFiles.js +9 -23
- package/dist/generateVariablesType.js +15 -31
- package/dist/index.js +8 -15
- package/dist/parser/parse.js +6 -7
- package/dist/parser/resolve.js +1 -2
- package/dist/parser/utils.js +1 -2
- package/dist/schemaFromIntrospectionData.js +1 -2
- package/dist/types.js +1 -2
- package/dist/utils.js +43 -3
- package/package.json +8 -7
- package/{dist/__test__/generateTypeFileContents.test.js → src/__test__/generateTypeFileContents.test.ts} +38 -41
- package/{dist/__test__/graphql-flow.test.js → src/__test__/graphql-flow.test.ts} +232 -235
- package/src/__test__/{processPragmas.test.js → processPragmas.test.ts} +0 -1
- package/{dist/cli/__test__/config.test.js → src/cli/__test__/config.test.ts} +5 -6
- package/{dist/cli/config.js.flow → src/cli/config.ts} +6 -11
- package/src/cli/{run.js → run.ts} +5 -4
- package/src/{enums.js → enums.ts} +20 -22
- package/src/{generateResponseType.js → generateResponseType.ts} +167 -182
- package/src/{generateTypeFiles.js → generateTypeFiles.ts} +20 -30
- package/src/{generateVariablesType.js → generateVariablesType.ts} +34 -44
- package/{dist/index.js.flow → src/index.ts} +32 -24
- package/{dist/parser/__test__/parse.test.js → src/parser/__test__/parse.test.ts} +12 -11
- package/src/parser/{parse.js → parse.ts} +65 -47
- package/{dist/parser/resolve.js.flow → src/parser/resolve.ts} +15 -11
- package/{dist/parser/utils.js.flow → src/parser/utils.ts} +0 -1
- package/{dist/schemaFromIntrospectionData.js.flow → src/schemaFromIntrospectionData.ts} +1 -4
- package/src/types.ts +97 -0
- package/src/utils.ts +73 -0
- package/tools/{find-files-with-gql.js → find-files-with-gql.ts} +2 -3
- package/tsconfig.json +110 -0
- package/types/flow-to-ts.d.ts +1 -0
- package/dist/__test__/example-schema.graphql +0 -67
- package/dist/__test__/processPragmas.test.js +0 -76
- package/dist/cli/config.js.map +0 -1
- package/dist/cli/run.js.flow +0 -236
- package/dist/cli/run.js.map +0 -1
- package/dist/enums.js.flow +0 -98
- package/dist/enums.js.map +0 -1
- package/dist/generateResponseType.js.flow +0 -583
- package/dist/generateResponseType.js.map +0 -1
- package/dist/generateTypeFiles.js.flow +0 -191
- package/dist/generateTypeFiles.js.map +0 -1
- package/dist/generateVariablesType.js.flow +0 -156
- package/dist/generateVariablesType.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/parser/parse.js.flow +0 -417
- package/dist/parser/parse.js.map +0 -1
- package/dist/parser/resolve.js.map +0 -1
- package/dist/parser/utils.js.map +0 -1
- package/dist/schemaFromIntrospectionData.js.map +0 -1
- package/dist/types.js.flow +0 -88
- package/dist/types.js.map +0 -1
- package/dist/utils.js.flow +0 -50
- package/dist/utils.js.map +0 -1
- package/flow-typed/npm/@babel/types_vx.x.x.js +0 -5331
- package/flow-typed/npm/jest_v23.x.x.js +0 -1155
- package/flow-typed/overrides.js +0 -435
- package/src/__test__/generateTypeFileContents.test.js +0 -157
- package/src/__test__/graphql-flow.test.js +0 -639
- package/src/cli/__test__/config.test.js +0 -120
- package/src/cli/config.js +0 -84
- package/src/cli/schema.json +0 -97
- package/src/index.js +0 -160
- package/src/parser/__test__/parse.test.js +0 -249
- package/src/parser/resolve.js +0 -119
- package/src/parser/utils.js +0 -25
- package/src/schemaFromIntrospectionData.js +0 -68
- package/src/types.js +0 -88
- package/src/utils.js +0 -50
- /package/{dist/cli/schema.json → schema.json} +0 -0
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
import type {DocumentNode} from 'graphql';
|
|
3
|
-
import type {GenerateConfig, CrawlConfig, Schema} from './types';
|
|
4
|
-
import fs from 'fs';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import {documentToFlowTypes} from '.';
|
|
7
|
-
// eslint-disable-next-line flowtype-errors/uncovered
|
|
8
|
-
import {convert} from '@khanacademy/flow-to-ts/dist/convert.bundle';
|
|
9
|
-
|
|
10
|
-
export const indexPrelude = (regenerateCommand?: string): string => `// @flow
|
|
11
|
-
//
|
|
12
|
-
// AUTOGENERATED
|
|
13
|
-
// NOTE: New response types are added to this file automatically.
|
|
14
|
-
// Outdated response types can be removed manually as they are deprecated.
|
|
15
|
-
//${regenerateCommand ? ' To regenerate, run ' + regenerateCommand : ''}
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
`;
|
|
19
|
-
|
|
20
|
-
export const generateTypeFileContents = (
|
|
21
|
-
fileName: string,
|
|
22
|
-
schema: Schema,
|
|
23
|
-
document: DocumentNode,
|
|
24
|
-
options: GenerateConfig,
|
|
25
|
-
generatedDir: string,
|
|
26
|
-
indexContents: string,
|
|
27
|
-
): {indexContents: string, files: {[key: string]: string}} => {
|
|
28
|
-
const files = {};
|
|
29
|
-
|
|
30
|
-
/// Write export for __generated__/index.js if it doesn't exist
|
|
31
|
-
const addToIndex = (filePath, typeName) => {
|
|
32
|
-
if (options.typeScript || options.omitFileExtensions) {
|
|
33
|
-
// Typescript doesn't like file extensions
|
|
34
|
-
filePath = filePath.replace(/\.js$/, '');
|
|
35
|
-
}
|
|
36
|
-
const newLine = `export type {${typeName}} from './${path.basename(
|
|
37
|
-
filePath,
|
|
38
|
-
)}';`;
|
|
39
|
-
// We match the entire new line to avoid issues that can arise from
|
|
40
|
-
// prefix matches.
|
|
41
|
-
if (indexContents.indexOf(newLine) === -1) {
|
|
42
|
-
indexContents += newLine + '\n';
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const generated = documentToFlowTypes(document, schema, options);
|
|
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
|
-
);
|
|
95
|
-
|
|
96
|
-
return {files, indexContents};
|
|
97
|
-
};
|
|
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
|
-
|
|
116
|
-
export const generateTypeFiles = (
|
|
117
|
-
fileName: string,
|
|
118
|
-
schema: Schema,
|
|
119
|
-
document: DocumentNode,
|
|
120
|
-
options: GenerateConfig,
|
|
121
|
-
) => {
|
|
122
|
-
const generatedDir = getGeneratedDir(fileName, options);
|
|
123
|
-
const indexFile = path.join(
|
|
124
|
-
generatedDir,
|
|
125
|
-
'index' + (options.typeScript ? '.ts' : '.js'),
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
if (!fs.existsSync(generatedDir)) {
|
|
129
|
-
fs.mkdirSync(generatedDir, {recursive: true});
|
|
130
|
-
}
|
|
131
|
-
if (!fs.existsSync(indexFile)) {
|
|
132
|
-
fs.writeFileSync(indexFile, indexPrelude(options.regenerateCommand));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const {indexContents, files} = generateTypeFileContents(
|
|
136
|
-
fileName,
|
|
137
|
-
schema,
|
|
138
|
-
document,
|
|
139
|
-
options,
|
|
140
|
-
generatedDir,
|
|
141
|
-
fs.readFileSync(indexFile, 'utf8'),
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
fs.writeFileSync(indexFile, indexContents);
|
|
145
|
-
Object.keys(files).forEach((key) => {
|
|
146
|
-
let fname = key;
|
|
147
|
-
if (options.typeScript) {
|
|
148
|
-
// eslint-disable-next-line flowtype-errors/uncovered
|
|
149
|
-
files[key] = convert(files[key]).replace(
|
|
150
|
-
`variables: {}`,
|
|
151
|
-
`variables: Record<never, never>`,
|
|
152
|
-
);
|
|
153
|
-
fname = key.replace(/\.js$/, '.ts');
|
|
154
|
-
}
|
|
155
|
-
fs.writeFileSync(fname, files[key]);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
fs.writeFileSync(indexFile, indexContents);
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
export const processPragmas = (
|
|
162
|
-
generateConfig: GenerateConfig,
|
|
163
|
-
crawlConfig: CrawlConfig,
|
|
164
|
-
rawSource: string,
|
|
165
|
-
): {generate: boolean, strict?: boolean} => {
|
|
166
|
-
if (
|
|
167
|
-
crawlConfig.ignorePragma &&
|
|
168
|
-
rawSource.includes(crawlConfig.ignorePragma)
|
|
169
|
-
) {
|
|
170
|
-
return {generate: false};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const autogen = crawlConfig.loosePragma
|
|
174
|
-
? rawSource.includes(crawlConfig.loosePragma)
|
|
175
|
-
: false;
|
|
176
|
-
const autogenStrict = crawlConfig.pragma
|
|
177
|
-
? rawSource.includes(crawlConfig.pragma)
|
|
178
|
-
: false;
|
|
179
|
-
const noPragmas = !crawlConfig.loosePragma && !crawlConfig.pragma;
|
|
180
|
-
|
|
181
|
-
if (autogen || autogenStrict || noPragmas) {
|
|
182
|
-
return {
|
|
183
|
-
generate: true,
|
|
184
|
-
strict: noPragmas
|
|
185
|
-
? generateConfig.strictNullability
|
|
186
|
-
: autogenStrict || !autogen,
|
|
187
|
-
};
|
|
188
|
-
} else {
|
|
189
|
-
return {generate: false};
|
|
190
|
-
}
|
|
191
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generateTypeFiles.js"],"names":["indexPrelude","regenerateCommand","generateTypeFileContents","fileName","schema","document","options","generatedDir","indexContents","files","addToIndex","filePath","typeName","typeScript","omitFileExtensions","replace","newLine","path","basename","indexOf","generated","forEach","name","code","isFragment","extraTypes","experimentalEnums","targetFileName","typeFileName","targetPath","join","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","includes","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// 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 || options.omitFileExtensions) {\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 // We match the entire new line to avoid issues that can arise from\n // prefix matches.\n if (indexContents.indexOf(newLine) === -1) {\n indexContents += newLine + '\\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]).replace(\n `variables: {}`,\n `variables: Record<never, never>`,\n );\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"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
import generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered
|
|
3
|
-
import type {
|
|
4
|
-
BabelNodeFlowType,
|
|
5
|
-
BabelNodeObjectTypeProperty,
|
|
6
|
-
} from '@babel/types';
|
|
7
|
-
import * as babelTypes from '@babel/types';
|
|
8
|
-
import type {OperationDefinitionNode, TypeNode} from 'graphql/language/ast';
|
|
9
|
-
import type {IntrospectionInputTypeRef} from 'graphql/utilities/introspectionQuery';
|
|
10
|
-
import {builtinScalars, enumTypeToFlow, scalarTypeToFlow} from './enums';
|
|
11
|
-
import type {Context, Schema} from './types';
|
|
12
|
-
import {
|
|
13
|
-
liftLeadingPropertyComments,
|
|
14
|
-
maybeAddDescriptionComment,
|
|
15
|
-
transferLeadingComments,
|
|
16
|
-
} from './utils';
|
|
17
|
-
|
|
18
|
-
export const inputObjectToFlow = (
|
|
19
|
-
ctx: Context,
|
|
20
|
-
name: string,
|
|
21
|
-
): BabelNodeFlowType => {
|
|
22
|
-
const inputObject = ctx.schema.inputObjectsByName[name];
|
|
23
|
-
if (!inputObject) {
|
|
24
|
-
ctx.errors.push(`Unknown input object ${name}`);
|
|
25
|
-
return babelTypes.stringLiteralTypeAnnotation(
|
|
26
|
-
`Unknown input object ${name}`,
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return maybeAddDescriptionComment(
|
|
31
|
-
inputObject.description,
|
|
32
|
-
babelTypes.objectTypeAnnotation(
|
|
33
|
-
inputObject.inputFields.map((vbl) =>
|
|
34
|
-
maybeAddDescriptionComment(
|
|
35
|
-
vbl.description,
|
|
36
|
-
maybeOptionalObjectTypeProperty(
|
|
37
|
-
vbl.name,
|
|
38
|
-
inputRefToFlow(ctx, vbl.type),
|
|
39
|
-
),
|
|
40
|
-
),
|
|
41
|
-
),
|
|
42
|
-
undefined /* indexers */,
|
|
43
|
-
undefined /* callProperties */,
|
|
44
|
-
undefined /* internalSlots */,
|
|
45
|
-
true /* exact */,
|
|
46
|
-
),
|
|
47
|
-
);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
export const maybeOptionalObjectTypeProperty = (
|
|
51
|
-
name: string,
|
|
52
|
-
type: babelTypes.BabelNodeFlowType,
|
|
53
|
-
): BabelNodeObjectTypeProperty => {
|
|
54
|
-
const prop = liftLeadingPropertyComments(
|
|
55
|
-
babelTypes.objectTypeProperty(babelTypes.identifier(name), type),
|
|
56
|
-
);
|
|
57
|
-
if (type.type === 'NullableTypeAnnotation') {
|
|
58
|
-
prop.optional = true;
|
|
59
|
-
}
|
|
60
|
-
return prop;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
export const inputRefToFlow = (
|
|
64
|
-
ctx: Context,
|
|
65
|
-
inputRef: IntrospectionInputTypeRef,
|
|
66
|
-
): BabelNodeFlowType => {
|
|
67
|
-
if (inputRef.kind === 'NON_NULL') {
|
|
68
|
-
return _inputRefToFlow(ctx, inputRef.ofType);
|
|
69
|
-
}
|
|
70
|
-
const result = _inputRefToFlow(ctx, inputRef);
|
|
71
|
-
return transferLeadingComments(
|
|
72
|
-
result,
|
|
73
|
-
babelTypes.nullableTypeAnnotation(result),
|
|
74
|
-
);
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const _inputRefToFlow = (ctx: Context, inputRef: IntrospectionInputTypeRef) => {
|
|
78
|
-
if (inputRef.kind === 'SCALAR') {
|
|
79
|
-
return scalarTypeToFlow(ctx, inputRef.name);
|
|
80
|
-
}
|
|
81
|
-
if (inputRef.kind === 'ENUM') {
|
|
82
|
-
return enumTypeToFlow(ctx, inputRef.name);
|
|
83
|
-
}
|
|
84
|
-
if (inputRef.kind === 'INPUT_OBJECT') {
|
|
85
|
-
return inputObjectToFlow(ctx, inputRef.name);
|
|
86
|
-
}
|
|
87
|
-
if (inputRef.kind === 'LIST') {
|
|
88
|
-
return babelTypes.genericTypeAnnotation(
|
|
89
|
-
babelTypes.identifier('$ReadOnlyArray'),
|
|
90
|
-
babelTypes.typeParameterInstantiation([
|
|
91
|
-
inputRefToFlow(ctx, inputRef.ofType),
|
|
92
|
-
]),
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
return babelTypes.stringLiteralTypeAnnotation(JSON.stringify(inputRef));
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
const variableToFlow = (ctx: Context, type: TypeNode) => {
|
|
99
|
-
if (type.kind === 'NonNullType') {
|
|
100
|
-
return _variableToFlow(ctx, type.type);
|
|
101
|
-
}
|
|
102
|
-
const result = _variableToFlow(ctx, type);
|
|
103
|
-
return transferLeadingComments(
|
|
104
|
-
result,
|
|
105
|
-
babelTypes.nullableTypeAnnotation(result),
|
|
106
|
-
);
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
const _variableToFlow = (ctx: Context, type: TypeNode) => {
|
|
110
|
-
if (type.kind === 'NamedType') {
|
|
111
|
-
if (builtinScalars[type.name.value]) {
|
|
112
|
-
return scalarTypeToFlow(ctx, type.name.value);
|
|
113
|
-
}
|
|
114
|
-
if (ctx.schema.enumsByName[type.name.value]) {
|
|
115
|
-
return enumTypeToFlow(ctx, type.name.value);
|
|
116
|
-
}
|
|
117
|
-
const customScalarType = ctx.scalars[type.name.value];
|
|
118
|
-
if (customScalarType) {
|
|
119
|
-
return babelTypes.genericTypeAnnotation(
|
|
120
|
-
babelTypes.identifier(customScalarType),
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
return inputObjectToFlow(ctx, type.name.value);
|
|
124
|
-
}
|
|
125
|
-
if (type.kind === 'ListType') {
|
|
126
|
-
return babelTypes.genericTypeAnnotation(
|
|
127
|
-
babelTypes.identifier('$ReadOnlyArray'),
|
|
128
|
-
babelTypes.typeParameterInstantiation([
|
|
129
|
-
variableToFlow(ctx, type.type),
|
|
130
|
-
]),
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
return babelTypes.stringLiteralTypeAnnotation(
|
|
134
|
-
'UNKNOWN' + JSON.stringify(type),
|
|
135
|
-
);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
export const generateVariablesType = (
|
|
139
|
-
schema: Schema,
|
|
140
|
-
item: OperationDefinitionNode,
|
|
141
|
-
ctx: Context,
|
|
142
|
-
): string => {
|
|
143
|
-
const variableObject = babelTypes.objectTypeAnnotation(
|
|
144
|
-
(item.variableDefinitions || []).map((vbl) => {
|
|
145
|
-
return maybeOptionalObjectTypeProperty(
|
|
146
|
-
vbl.variable.name.value,
|
|
147
|
-
variableToFlow(ctx, vbl.type),
|
|
148
|
-
);
|
|
149
|
-
}),
|
|
150
|
-
undefined /* indexers */,
|
|
151
|
-
undefined /* callProperties */,
|
|
152
|
-
undefined /* internalSlots */,
|
|
153
|
-
true /* exact */,
|
|
154
|
-
);
|
|
155
|
-
return generate(variableObject).code; // eslint-disable-line flowtype-errors/uncovered
|
|
156
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["optionsToConfig","schema","definitions","options","errors","internalOptions","strictNullability","readOnlyArray","scalars","typeScript","omitFileExtensions","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":"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","sourcesContent":["/* eslint-disable no-console */\n/* flow-uncovered-file */\n// @flow\n/**\n * This tool generates flowtype definitions from graphql queries.\n *\n * It relies on `introspection-query.json` existing in this directory,\n * which is produced by running `./tools/graphql-flow/sendIntrospection.js`.\n */\nimport type {DefinitionNode, DocumentNode} from 'graphql';\n\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport {\n generateFragmentType,\n generateResponseType,\n} from './generateResponseType';\nimport {generateVariablesType} from './generateVariablesType';\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 omitFileExtensions: options?.omitFileExtensions ?? 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"}
|