@khanacademy/graphql-flow 1.0.0 → 1.1.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/CHANGELOG.md +6 -0
- package/dist/cli/run.js +1 -1
- package/dist/cli/run.js.flow +1 -1
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/schema.json +3 -0
- package/dist/generateTypeFiles.js +16 -2
- package/dist/generateTypeFiles.js.flow +15 -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/parse.js +1 -1
- package/dist/parser/parse.js.flow +3 -1
- package/dist/parser/parse.js.map +1 -1
- package/dist/types.js.flow +2 -0
- package/package.json +2 -1
- package/src/cli/run.js +1 -1
- package/src/cli/schema.json +3 -0
- package/src/generateTypeFiles.js +15 -2
- package/src/index.js +1 -0
- package/src/parser/parse.js +3 -1
- package/src/types.js +2 -0
package/CHANGELOG.md
CHANGED
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
|
});
|
package/dist/cli/run.js.flow
CHANGED
|
@@ -32,7 +32,7 @@ import type {GenerateConfig} from '../types';
|
|
|
32
32
|
|
|
33
33
|
const findGraphqlTagReferences = (root: string): Array<string> => {
|
|
34
34
|
const response = execSync(
|
|
35
|
-
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx'",
|
|
35
|
+
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx' '*.ts' '*.tsx'",
|
|
36
36
|
{
|
|
37
37
|
encoding: 'utf8',
|
|
38
38
|
cwd: root,
|
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":"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","sourcesContent":["#!/usr/bin/env node\n// @flow\n/* eslint-disable no-console */\nimport {generateTypeFiles, processPragmas} from '../generateTypeFiles';\nimport {processFiles} from '../parser/parse';\nimport {resolveDocuments} from '../parser/resolve';\nimport {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","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 {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' '*.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 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"}
|
package/dist/cli/schema.json
CHANGED
|
@@ -11,6 +11,8 @@ 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
|
|
|
16
18
|
const indexPrelude = regenerateCommand => `// @flow
|
|
@@ -29,6 +31,11 @@ const generateTypeFileContents = (fileName, schema, document, options, generated
|
|
|
29
31
|
const files = {}; /// Write export for __generated__/index.js if it doesn't exist
|
|
30
32
|
|
|
31
33
|
const addToIndex = (filePath, typeName) => {
|
|
34
|
+
if (options.typeScript) {
|
|
35
|
+
// Typescript doesn't like file extensions
|
|
36
|
+
filePath = filePath.replace(/\.js$/, '');
|
|
37
|
+
}
|
|
38
|
+
|
|
32
39
|
const newLine = `export type {${typeName}} from './${_path.default.basename(filePath)}';`;
|
|
33
40
|
|
|
34
41
|
if (indexContents.indexOf('./' + _path.default.basename(filePath)) === -1) {
|
|
@@ -108,7 +115,7 @@ const getGeneratedDir = (fileName, options) => {
|
|
|
108
115
|
const generateTypeFiles = (fileName, schema, document, options) => {
|
|
109
116
|
const generatedDir = getGeneratedDir(fileName, options);
|
|
110
117
|
|
|
111
|
-
const indexFile = _path.default.join(generatedDir, 'index.js');
|
|
118
|
+
const indexFile = _path.default.join(generatedDir, 'index' + (options.typeScript ? '.ts' : '.js'));
|
|
112
119
|
|
|
113
120
|
if (!_fs.default.existsSync(generatedDir)) {
|
|
114
121
|
_fs.default.mkdirSync(generatedDir, {
|
|
@@ -128,7 +135,14 @@ const generateTypeFiles = (fileName, schema, document, options) => {
|
|
|
128
135
|
_fs.default.writeFileSync(indexFile, indexContents);
|
|
129
136
|
|
|
130
137
|
Object.keys(files).forEach(key => {
|
|
131
|
-
|
|
138
|
+
let fname = key;
|
|
139
|
+
|
|
140
|
+
if (options.typeScript) {
|
|
141
|
+
files[key] = (0, _convert.convert)(files[key]);
|
|
142
|
+
fname = key.replace(/\.js$/, '.ts');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
_fs.default.writeFileSync(fname, files[key]);
|
|
132
146
|
});
|
|
133
147
|
|
|
134
148
|
_fs.default.writeFileSync(indexFile, indexContents);
|
|
@@ -4,6 +4,7 @@ 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
|
+
import {convert} from '@khanacademy/flow-to-ts/dist/convert.bundle';
|
|
7
8
|
|
|
8
9
|
export const indexPrelude = (regenerateCommand?: string): string => `// @flow
|
|
9
10
|
//
|
|
@@ -27,6 +28,10 @@ export const generateTypeFileContents = (
|
|
|
27
28
|
|
|
28
29
|
/// Write export for __generated__/index.js if it doesn't exist
|
|
29
30
|
const addToIndex = (filePath, typeName) => {
|
|
31
|
+
if (options.typeScript) {
|
|
32
|
+
// Typescript doesn't like file extensions
|
|
33
|
+
filePath = filePath.replace(/\.js$/, '');
|
|
34
|
+
}
|
|
30
35
|
const newLine = `export type {${typeName}} from './${path.basename(
|
|
31
36
|
filePath,
|
|
32
37
|
)}';`;
|
|
@@ -120,7 +125,10 @@ export const generateTypeFiles = (
|
|
|
120
125
|
options: GenerateConfig,
|
|
121
126
|
) => {
|
|
122
127
|
const generatedDir = getGeneratedDir(fileName, options);
|
|
123
|
-
const indexFile = path.join(
|
|
128
|
+
const indexFile = path.join(
|
|
129
|
+
generatedDir,
|
|
130
|
+
'index' + (options.typeScript ? '.ts' : '.js'),
|
|
131
|
+
);
|
|
124
132
|
|
|
125
133
|
if (!fs.existsSync(generatedDir)) {
|
|
126
134
|
fs.mkdirSync(generatedDir, {recursive: true});
|
|
@@ -140,7 +148,12 @@ export const generateTypeFiles = (
|
|
|
140
148
|
|
|
141
149
|
fs.writeFileSync(indexFile, indexContents);
|
|
142
150
|
Object.keys(files).forEach((key) => {
|
|
143
|
-
|
|
151
|
+
let fname = key;
|
|
152
|
+
if (options.typeScript) {
|
|
153
|
+
files[key] = convert(files[key]);
|
|
154
|
+
fname = key.replace(/\.js$/, '.ts');
|
|
155
|
+
}
|
|
156
|
+
fs.writeFileSync(fname, files[key]);
|
|
144
157
|
});
|
|
145
158
|
|
|
146
159
|
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":"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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 '.';\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 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":"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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 };\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"}
|
package/dist/parser/parse.js
CHANGED
|
@@ -62,7 +62,7 @@ const processFile = (filePath, contents) => {
|
|
|
62
62
|
const ast = (0, _parser.parse)(contents, {
|
|
63
63
|
sourceType: 'module',
|
|
64
64
|
allowImportExportEverywhere: true,
|
|
65
|
-
plugins: [['flow', {
|
|
65
|
+
plugins: filePath.match(/\.tsx?$/) ? ['typescript', 'jsx'] : [['flow', {
|
|
66
66
|
enums: true
|
|
67
67
|
}], 'jsx']
|
|
68
68
|
});
|
|
@@ -134,7 +134,9 @@ export const processFile = (filePath: string, contents: string): FileResult => {
|
|
|
134
134
|
const ast: BabelNodeFile = parse(contents, {
|
|
135
135
|
sourceType: 'module',
|
|
136
136
|
allowImportExportEverywhere: true,
|
|
137
|
-
plugins:
|
|
137
|
+
plugins: filePath.match(/\.tsx?$/)
|
|
138
|
+
? ['typescript', 'jsx']
|
|
139
|
+
: [['flow', {enums: true}], 'jsx'],
|
|
138
140
|
});
|
|
139
141
|
/* eslint-enable flowtype-errors/uncovered */
|
|
140
142
|
const gqlTagNames = [];
|
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","ast","sourceType","allowImportExportEverywhere","plugins","match","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: filePath.match(/\\.tsx?$/)\n ? ['typescript', 'jsx']\n : [['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"}
|
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.0",
|
|
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/run.js
CHANGED
|
@@ -32,7 +32,7 @@ import type {GenerateConfig} from '../types';
|
|
|
32
32
|
|
|
33
33
|
const findGraphqlTagReferences = (root: string): Array<string> => {
|
|
34
34
|
const response = execSync(
|
|
35
|
-
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx'",
|
|
35
|
+
"git grep -I --word-regexp --name-only --fixed-strings 'graphql-tag' -- '*.js' '*.jsx' '*.ts' '*.tsx'",
|
|
36
36
|
{
|
|
37
37
|
encoding: 'utf8',
|
|
38
38
|
cwd: root,
|
package/src/cli/schema.json
CHANGED
package/src/generateTypeFiles.js
CHANGED
|
@@ -4,6 +4,7 @@ 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
|
+
import {convert} from '@khanacademy/flow-to-ts/dist/convert.bundle';
|
|
7
8
|
|
|
8
9
|
export const indexPrelude = (regenerateCommand?: string): string => `// @flow
|
|
9
10
|
//
|
|
@@ -27,6 +28,10 @@ export const generateTypeFileContents = (
|
|
|
27
28
|
|
|
28
29
|
/// Write export for __generated__/index.js if it doesn't exist
|
|
29
30
|
const addToIndex = (filePath, typeName) => {
|
|
31
|
+
if (options.typeScript) {
|
|
32
|
+
// Typescript doesn't like file extensions
|
|
33
|
+
filePath = filePath.replace(/\.js$/, '');
|
|
34
|
+
}
|
|
30
35
|
const newLine = `export type {${typeName}} from './${path.basename(
|
|
31
36
|
filePath,
|
|
32
37
|
)}';`;
|
|
@@ -120,7 +125,10 @@ export const generateTypeFiles = (
|
|
|
120
125
|
options: GenerateConfig,
|
|
121
126
|
) => {
|
|
122
127
|
const generatedDir = getGeneratedDir(fileName, options);
|
|
123
|
-
const indexFile = path.join(
|
|
128
|
+
const indexFile = path.join(
|
|
129
|
+
generatedDir,
|
|
130
|
+
'index' + (options.typeScript ? '.ts' : '.js'),
|
|
131
|
+
);
|
|
124
132
|
|
|
125
133
|
if (!fs.existsSync(generatedDir)) {
|
|
126
134
|
fs.mkdirSync(generatedDir, {recursive: true});
|
|
@@ -140,7 +148,12 @@ export const generateTypeFiles = (
|
|
|
140
148
|
|
|
141
149
|
fs.writeFileSync(indexFile, indexContents);
|
|
142
150
|
Object.keys(files).forEach((key) => {
|
|
143
|
-
|
|
151
|
+
let fname = key;
|
|
152
|
+
if (options.typeScript) {
|
|
153
|
+
files[key] = convert(files[key]);
|
|
154
|
+
fname = key.replace(/\.js$/, '.ts');
|
|
155
|
+
}
|
|
156
|
+
fs.writeFileSync(fname, files[key]);
|
|
144
157
|
});
|
|
145
158
|
|
|
146
159
|
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) => {
|
package/src/parser/parse.js
CHANGED
|
@@ -134,7 +134,9 @@ export const processFile = (filePath: string, contents: string): FileResult => {
|
|
|
134
134
|
const ast: BabelNodeFile = parse(contents, {
|
|
135
135
|
sourceType: 'module',
|
|
136
136
|
allowImportExportEverywhere: true,
|
|
137
|
-
plugins:
|
|
137
|
+
plugins: filePath.match(/\.tsx?$/)
|
|
138
|
+
? ['typescript', 'jsx']
|
|
139
|
+
: [['flow', {enums: true}], 'jsx'],
|
|
138
140
|
});
|
|
139
141
|
/* eslint-enable flowtype-errors/uncovered */
|
|
140
142
|
const gqlTagNames = [];
|
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
|
};
|