Skip to content

Instantly share code, notes, and snippets.

@janicduplessis
Last active October 24, 2019 22:18
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save janicduplessis/6c134b4c21168aa28b81e3fd818ec9bd to your computer and use it in GitHub Desktop.
Save janicduplessis/6c134b4c21168aa28b81e3fd818ec9bd to your computer and use it in GitHub Desktop.
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
var __values = (this && this.__values) || function (o) {
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
if (m) return m.call(o);
return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
};
Object.defineProperty(exports, "__esModule", { value: true });
var relay_compiler_1 = require("relay-compiler");
var ConnectionFieldTransform = require("relay-compiler/lib/transforms/ConnectionFieldTransform");
var FlattenTransform = require("relay-compiler/lib/transforms/FlattenTransform");
var RelayMaskTransform = require("relay-compiler/lib/transforms/MaskTransform");
var RelayMatchTransform = require("relay-compiler/lib/transforms/MatchTransform");
var RelayRefetchableFragmentTransform = require("relay-compiler/lib/transforms/RefetchableFragmentTransform");
var RelayRelayDirectiveTransform = require("relay-compiler/lib/transforms/RelayDirectiveTransform");
var graphql_1 = require("graphql");
var ts = require("typescript");
var TypeScriptTypeTransformers_1 = require("./TypeScriptTypeTransformers");
var isAbstractType = relay_compiler_1.SchemaUtils.isAbstractType;
var REF_TYPE = " $refType";
var FRAGMENT_REFS = " $fragmentRefs";
var FRAGMENT_REFS_TYPE_NAME = "FragmentRefs";
var MODULE_IMPORT_FIELD = "MODULE_IMPORT_FIELD";
var DIRECTIVE_NAME = "raw_response_type";
exports.generate = function (schema, node, options) {
var ast = relay_compiler_1.IRVisitor.visit(node, createVisitor(schema, options));
var printer = ts.createPrinter({
newLine: ts.NewLineKind.LineFeed
});
var resultFile = ts.createSourceFile("grapghql-def.ts", "", ts.ScriptTarget.Latest,
/*setParentNodes*/ false, ts.ScriptKind.TS);
var fullProgramAst = ts.updateSourceFileNode(resultFile, ast);
return printer.printNode(ts.EmitHint.SourceFile, fullProgramAst, resultFile);
};
function nullthrows(obj) {
if (obj == null) {
throw new Error("Obj is null");
}
return obj;
}
function makeProp(schema, selection, state, unmasked, concreteType) {
var value = selection.value;
var key = selection.key, schemaName = selection.schemaName, conditional = selection.conditional, nodeType = selection.nodeType, nodeSelections = selection.nodeSelections;
if (nodeType) {
value = TypeScriptTypeTransformers_1.transformScalarType(schema, nodeType, state, selectionsToAST(schema, [Array.from(nullthrows(nodeSelections).values())], state, unmasked));
}
if (schemaName === "__typename" && concreteType) {
value = ts.createLiteralTypeNode(ts.createLiteral(concreteType));
}
return objectTypeProperty(key, value, { optional: conditional });
}
var isTypenameSelection = function (selection) {
return selection.schemaName === "__typename";
};
var hasTypenameSelection = function (selections) {
return selections.some(isTypenameSelection);
};
var onlySelectsTypename = function (selections) {
return selections.every(isTypenameSelection);
};
function selectionsToAST(schema, selections, state, unmasked, fragmentTypeName) {
var baseFields = new Map();
var byConcreteType = {};
flattenArray(selections).forEach(function (selection) {
var concreteType = selection.concreteType;
if (concreteType) {
byConcreteType[concreteType] = byConcreteType[concreteType] || [];
byConcreteType[concreteType].push(selection);
}
else {
var previousSel = baseFields.get(selection.key);
baseFields.set(selection.key, previousSel ? mergeSelection(selection, previousSel) : selection);
}
});
var types = [];
if (Object.keys(byConcreteType).length > 0 &&
onlySelectsTypename(Array.from(baseFields.values())) &&
(hasTypenameSelection(Array.from(baseFields.values())) ||
Object.keys(byConcreteType).every(function (type) {
return hasTypenameSelection(byConcreteType[type]);
}))) {
var typenameAliases_1 = new Set();
var _loop_1 = function (concreteType) {
types.push(groupRefs(__spread(Array.from(baseFields.values()), byConcreteType[concreteType])).map(function (selection) {
if (selection.schemaName === "__typename") {
typenameAliases_1.add(selection.key);
}
return makeProp(schema, selection, state, unmasked, concreteType);
}));
};
for (var concreteType in byConcreteType) {
_loop_1(concreteType);
}
// It might be some other type then the listed concrete types. Ideally, we
// would set the type to diff(string, set of listed concrete types), but
// this doesn't exist in Flow at the time.
types.push(Array.from(typenameAliases_1).map(function (typenameAlias) {
var otherProp = objectTypeProperty(typenameAlias, ts.createLiteralTypeNode(ts.createLiteral("%other")));
var otherPropWithComment = ts.addSyntheticLeadingComment(otherProp, ts.SyntaxKind.MultiLineCommentTrivia, "This will never be '%other', but we need some\n" +
"value in case none of the concrete values match.", true);
return otherPropWithComment;
}));
}
else {
var selectionMap = selectionsToMap(Array.from(baseFields.values()));
for (var concreteType in byConcreteType) {
selectionMap = mergeSelections(selectionMap, selectionsToMap(byConcreteType[concreteType].map(function (sel) { return (__assign({}, sel, { conditional: true })); })));
}
var selectionMapValues = groupRefs(Array.from(selectionMap.values())).map(function (sel) {
return isTypenameSelection(sel) && sel.concreteType
? makeProp(schema, __assign({}, sel, { conditional: false }), state, unmasked, sel.concreteType)
: makeProp(schema, sel, state, unmasked);
});
types.push(selectionMapValues);
}
var typeElements = types.map(function (props) {
if (fragmentTypeName) {
props.push(objectTypeProperty(REF_TYPE, ts.createLiteralTypeNode(ts.createStringLiteral(fragmentTypeName))));
}
return unmasked
? ts.createTypeLiteralNode(props)
: exactObjectTypeAnnotation(props);
});
if (typeElements.length === 1) {
return typeElements[0];
}
return ts.createUnionTypeNode(typeElements);
}
// We don't have exact object types in typescript.
function exactObjectTypeAnnotation(properties) {
return ts.createTypeLiteralNode(properties);
}
var idRegex = /^[$a-zA-Z_][$a-z0-9A-Z_]*$/;
function objectTypeProperty(propertyName, type, options) {
if (options === void 0) { options = {}; }
var optional = options.optional, _a = options.readonly, readonly = _a === void 0 ? true : _a;
var modifiers = readonly
? [ts.createToken(ts.SyntaxKind.ReadonlyKeyword)]
: undefined;
return ts.createPropertySignature(modifiers, idRegex.test(propertyName)
? ts.createIdentifier(propertyName)
: ts.createLiteral(propertyName), optional ? ts.createToken(ts.SyntaxKind.QuestionToken) : undefined, type, undefined);
}
function mergeSelection(a, b, shouldSetConditional) {
if (shouldSetConditional === void 0) { shouldSetConditional = true; }
if (!a) {
if (shouldSetConditional) {
return __assign({}, b, { conditional: true });
}
return b;
}
return __assign({}, a, { nodeSelections: a.nodeSelections
? mergeSelections(a.nodeSelections, nullthrows(b.nodeSelections), shouldSetConditional)
: null, conditional: a.conditional && b.conditional });
}
function mergeSelections(a, b, shouldSetConditional) {
var e_1, _a, e_2, _b;
if (shouldSetConditional === void 0) { shouldSetConditional = true; }
var merged = new Map();
try {
for (var _c = __values(Array.from(a.entries())), _d = _c.next(); !_d.done; _d = _c.next()) {
var _e = __read(_d.value, 2), key = _e[0], value = _e[1];
merged.set(key, value);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
}
finally { if (e_1) throw e_1.error; }
}
try {
for (var _f = __values(Array.from(b.entries())), _g = _f.next(); !_g.done; _g = _f.next()) {
var _h = __read(_g.value, 2), key = _h[0], value = _h[1];
merged.set(key, mergeSelection(a.get(key), value, shouldSetConditional));
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
}
finally { if (e_2) throw e_2.error; }
}
return merged;
}
function isPlural(node) {
return Boolean(node.metadata && node.metadata.plural);
}
function exportType(name, type) {
return ts.createTypeAliasDeclaration(undefined, [ts.createToken(ts.SyntaxKind.ExportKeyword)], ts.createIdentifier(name), undefined, type);
}
function importTypes(names, fromModule) {
return ts.createImportDeclaration(undefined, undefined, ts.createImportClause(undefined, ts.createNamedImports(names.map(function (name) {
return ts.createImportSpecifier(undefined, ts.createIdentifier(name));
}))), ts.createLiteral(fromModule));
}
function createVisitor(schema, options) {
var state = {
customScalars: options.customScalars,
enumsHasteModule: options.enumsHasteModule,
existingFragmentNames: options.existingFragmentNames,
generatedInputObjectTypes: {},
generatedFragments: new Set(),
optionalInputFields: options.optionalInputFields,
usedEnums: {},
usedFragments: new Set(),
useHaste: options.useHaste,
useSingleArtifactDirectory: options.useSingleArtifactDirectory,
noFutureProofEnums: options.noFutureProofEnums,
matchFields: new Map()
};
return {
leave: {
Root: function (node) {
var e_3, _a;
var inputVariablesType = generateInputVariablesType(schema, node, state);
var inputObjectTypes = generateInputObjectTypes(state);
var responseType = exportType(node.name + "Response", selectionsToAST(
schema,
/* $FlowFixMe: selections have already been transformed */
node.selections, state, false));
var operationTypes = [
objectTypeProperty("response", ts.createTypeReferenceNode(responseType.name, undefined)),
objectTypeProperty("variables", ts.createTypeReferenceNode(inputVariablesType.name, undefined))
];
// Generate raw response type
var rawResponseType;
var normalizationIR = options.normalizationIR;
if (normalizationIR &&
node.directives.some(function (d) { return d.name === DIRECTIVE_NAME; })) {
rawResponseType = relay_compiler_1.IRVisitor.visit(normalizationIR, createRawResponseTypeVisitor(state));
}
var nodes = __spread(getFragmentRefsTypeImport(state), getEnumDefinitions(schema, state), inputObjectTypes, [
inputVariablesType,
responseType
]);
if (rawResponseType) {
try {
for (var _b = __values(state.matchFields), _c = _b.next(); !_c.done; _c = _b.next()) {
var _d = __read(_c.value, 2), key = _d[0], ast = _d[1];
nodes.push(ts.createTypeAliasDeclaration(undefined, undefined, key, undefined, ast));
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_3) throw e_3.error; }
}
operationTypes.push(objectTypeProperty("rawResponse", ts.createTypeReferenceNode(node.name + "RawResponse", undefined)));
nodes.push(rawResponseType);
}
nodes.push(exportType(node.name, exactObjectTypeAnnotation(operationTypes)));
return nodes;
},
Fragment: function (node) {
var flattenedSelections = flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections);
var numConcreteSelections = flattenedSelections.filter(function (s) { return s.concreteType; }).length;
var selections = flattenedSelections.map(function (selection) {
if (numConcreteSelections <= 1 &&
isTypenameSelection(selection) &&
!isAbstractType(node.type)) {
return [
__assign({}, selection, { concreteType: node.type.toString() })
];
}
return [selection];
});
state.generatedFragments.add(node.name);
var unmasked = node.metadata != null && node.metadata.mask === false;
var baseType = selectionsToAST(schema, selections, state, unmasked, unmasked ? undefined : node.name);
var type = isPlural(node)
? ts.createTypeReferenceNode(ts.createIdentifier("ReadonlyArray"), [
baseType
])
: baseType;
return __spread(getFragmentRefsTypeImport(state), getEnumDefinitions(schema, state), [
exportType(node.name, type)
]);
},
InlineFragment: function (node) {
var typeCondition = node.typeCondition;
return flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections).map(function (typeSelection) {
return isAbstractType(typeCondition)
? __assign({}, typeSelection, { conditional: true }) : __assign({}, typeSelection, { concreteType: typeCondition.toString() });
});
},
Condition: visitCondition,
// TODO: Why not inline it like others?
ScalarField: function (node) {
return visitScalarField(schema, node, state);
},
LinkedField: visitLinkedField,
ConnectionField: visitConnectionField,
ModuleImport: function (node) {
return [
{
key: "__fragmentPropName",
conditional: true,
value: TypeScriptTypeTransformers_1.transformScalarType(schema, graphql_1.GraphQLString, state)
},
{
key: "__module_component",
conditional: true,
value: TypeScriptTypeTransformers_1.transformScalarType(schema, graphql_1.GraphQLString, state)
},
{
key: "__fragments_" + node.name,
ref: node.name
}
];
},
FragmentSpread: function (node) {
state.usedFragments.add(node.name);
return [
{
key: "__fragments_" + node.name,
ref: node.name
}
];
}
}
};
}
function visitCondition(node) {
return flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections).map(function (selection) {
return __assign({}, selection, { conditional: true });
});
}
function visitScalarField(schema, node, state) {
return [
{
key: node.alias || node.name,
schemaName: node.name,
value: TypeScriptTypeTransformers_1.transformScalarType(schema, node.type, state)
}
];
}
function visitLinkedField(node) {
return [
{
key: node.alias || node.name,
schemaName: node.name,
nodeType: node.type,
nodeSelections: selectionsToMap(flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections),
/*
* append concreteType to key so overlapping fields with different
* concreteTypes don't get overwritten by each other
*/
true)
}
];
}
function visitConnectionField(node) {
return [
{
key: node.alias,
schemaName: node.name,
nodeType: node.type,
nodeSelections: selectionsToMap(flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections),
/*
* append concreteType to key so overlapping fields with different
* concreteTypes don't get overwritten by each other
*/
true)
}
];
}
function makeRawResponseProp(schema, _a, state, concreteType) {
var key = _a.key, schemaName = _a.schemaName, value = _a.value, conditional = _a.conditional, nodeType = _a.nodeType, nodeSelections = _a.nodeSelections;
if (nodeType) {
if (nodeType === MODULE_IMPORT_FIELD) {
// TODO: In flow one can extend an object type with spread, with TS we need an intersection (&)
// return ts.createSpread(ts.createIdentifier(key));
throw new Error("TODO!");
}
value = TypeScriptTypeTransformers_1.transformScalarType(schema, nodeType, state, selectionsToRawResponseBabel([Array.from(nullthrows(nodeSelections).values())], state, isAbstractType(nodeType) ? null : nodeType.name));
}
if (schemaName === "__typename" && concreteType) {
value = ts.createLiteralTypeNode(ts.createLiteral(concreteType));
}
var typeProperty = objectTypeProperty(key, value);
if (conditional) {
typeProperty.questionToken = ts.createToken(ts.SyntaxKind.QuestionToken);
}
return typeProperty;
}
function selectionsToMap(selections, appendType) {
var map = new Map();
selections.forEach(function (selection) {
var key = appendType && selection.concreteType
? selection.key + "::" + selection.concreteType
: selection.key;
var previousSel = map.get(key);
map.set(key, previousSel ? mergeSelection(previousSel, selection) : selection);
});
return map;
}
// Transform the codegen IR selections into TS types
function selectionsToRawResponseBabel(selections, state, nodeTypeName) {
var baseFields = [];
var byConcreteType = {};
flattenArray(selections).forEach(function (selection) {
var concreteType = selection.concreteType;
if (concreteType) {
byConcreteType[concreteType] = byConcreteType[concreteType] || [];
byConcreteType[concreteType].push(selection);
}
else {
baseFields.push(selection);
}
});
var types = [];
if (Object.keys(byConcreteType).length) {
var baseFieldsMap = selectionsToMap(baseFields);
var _loop_2 = function (concreteType) {
types.push(Array.from(mergeSelections(baseFieldsMap, selectionsToMap(byConcreteType[concreteType]), false).values()).map(function (selection) {
if (isTypenameSelection(selection)) {
return makeRawResponseProp(schema, __assign({}, selection, { conditional: false }), state, concreteType);
}
return makeRawResponseProp(schema, selection, state, concreteType);
}));
};
for (var concreteType in byConcreteType) {
_loop_2(concreteType);
}
}
if (baseFields.length) {
types.push(baseFields.map(function (selection) {
if (isTypenameSelection(selection)) {
return makeRawResponseProp(schema, __assign({}, selection, { conditional: false }), state, nodeTypeName);
}
return makeRawResponseProp(schema, selection, state, null);
}));
}
return ts.createUnionTypeNode(types.map(function (props) { return exactObjectTypeAnnotation(props); }));
}
// Visitor for generating raw response type
function createRawResponseTypeVisitor(state) {
return {
leave: {
Root: function (node) {
return exportType(node.name + "RawResponse", selectionsToRawResponseBabel(
/* $FlowFixMe: selections have already been transformed */
node.selections, state, null));
},
InlineFragment: function (node) {
var typeCondition = node.typeCondition;
return flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections).map(function (typeSelection) {
return isAbstractType(typeCondition)
? typeSelection
: __assign({}, typeSelection, { concreteType: typeCondition.toString() });
});
},
Condition: visitCondition,
ScalarField: function (node) {
return visitScalarField(schema, node, state);
},
ConnectionField: visitConnectionField,
LinkedField: visitLinkedField,
ClientExtension: function (node) {
return flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections).map(function (sel) { return (__assign({}, sel, { conditional: true })); });
},
Defer: function (node) {
return flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections);
},
Stream: function (node) {
return flattenArray(
/* $FlowFixMe: selections have already been transformed */
node.selections);
},
ModuleImport: function (node) {
return visitRawResponseModuleImport(node, state);
},
FragmentSpread: function (_node) {
throw new Error("A fragment spread is found when traversing the AST, " +
"make sure you are passing the codegen IR");
}
}
};
}
// Dedupe the generated type of module selections to reduce file size
function visitRawResponseModuleImport(node, state) {
var selections = node.selections, key = node.name;
var moduleSelections = selections
.filter(function (sel) { return sel.length && sel[0].schemaName === "js"; })
.map(function (arr) { return arr[0]; });
if (!state.matchFields.has(key)) {
var ast = selectionsToRawResponseBabel(node.selections.filter(function (sel) { return sel.length > 1 || sel[0].schemaName !== "js"; }), state, null);
state.matchFields.set(key, ast);
}
return __spread(moduleSelections, [
{
key: key,
nodeType: MODULE_IMPORT_FIELD
}
]);
}
function flattenArray(arrayOfArrays) {
var result = [];
arrayOfArrays.forEach(function (array) { return result.push.apply(result, __spread(array)); });
return result;
}
function generateInputObjectTypes(state) {
return Object.keys(state.generatedInputObjectTypes).map(function (typeIdentifier) {
var inputObjectType = state.generatedInputObjectTypes[typeIdentifier];
if (inputObjectType === "pending") {
throw new Error("TypeScriptGenerator: Expected input object type to have been" +
" defined before calling `generateInputObjectTypes`");
}
else {
return exportType(typeIdentifier, inputObjectType);
}
});
}
function generateInputVariablesType(schema, node, state) {
return exportType(node.name + "Variables", exactObjectTypeAnnotation(node.argumentDefinitions.map(function (arg) {
return objectTypeProperty(arg.name, TypeScriptTypeTransformers_1.transformInputType(schema, arg.type, state), { readonly: false, optional: !(arg.type instanceof graphql_1.GraphQLNonNull) });
})));
}
function groupRefs(props) {
var result = [];
var refs = [];
props.forEach(function (prop) {
if (prop.ref) {
refs.push(prop.ref);
}
else {
result.push(prop);
}
});
if (refs.length > 0) {
var refTypes = ts.createUnionTypeNode(refs.map(function (ref) { return ts.createLiteralTypeNode(ts.createStringLiteral(ref)); }));
result.push({
key: FRAGMENT_REFS,
conditional: false,
value: ts.createTypeReferenceNode(FRAGMENT_REFS_TYPE_NAME, [refTypes])
});
}
return result;
}
function getFragmentRefsTypeImport(state) {
if (state.usedFragments.size > 0) {
return [
ts.createImportDeclaration(undefined, undefined, ts.createImportClause(undefined, ts.createNamedImports([
ts.createImportSpecifier(undefined, ts.createIdentifier("FragmentRefs"))
])), ts.createStringLiteral("relay-runtime"))
];
}
return [];
}
function getEnumDefinitions(schema, _a) {
var enumsHasteModule = _a.enumsHasteModule, usedEnums = _a.usedEnums, noFutureProofEnums = _a.noFutureProofEnums;
var enumNames = Object.keys(usedEnums).sort();
if (enumNames.length === 0) {
return [];
}
if (typeof enumsHasteModule === "string") {
return [importTypes(enumNames, enumsHasteModule)];
}
if (typeof enumsHasteModule === "function") {
return enumNames.map(function (enumName) {
return importTypes([enumName], enumsHasteModule(enumName));
});
}
return enumNames.map(function (name) {
var values = schema.getEnumValues(usedEnums[name]);
values.sort();
if (!noFutureProofEnums) {
values.push("%future added value");
}
return exportType(name, ts.createUnionTypeNode(values.map(function (value) { return stringLiteralTypeAnnotation(value); })));
});
}
function stringLiteralTypeAnnotation(name) {
return ts.createLiteralTypeNode(ts.createLiteral(name));
}
// Should match FLOW_TRANSFORMS array
// https://github.com/facebook/relay/blob/v6.0.0/packages/relay-compiler/language/javascript/RelayFlowGenerator.js#L621-L627
exports.transforms = [
RelayRelayDirectiveTransform.transform,
RelayMaskTransform.transform,
ConnectionFieldTransform.transform,
RelayMatchTransform.transform,
FlattenTransform.transformWithOptions({}),
RelayRefetchableFragmentTransform.transform
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZVNjcmlwdEdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9UeXBlU2NyaXB0R2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFTd0I7QUFJeEIsaUdBQW1HO0FBQ25HLGlGQUFtRjtBQUNuRixxRkFBdUY7QUFDdkYsdUZBQXlGO0FBQ3pGLG1IQUFxSDtBQUNySCx5R0FBMkc7QUFFM0csbUNBQXdEO0FBQ3hELCtCQUFpQztBQUNqQywyRUFJc0M7QUFFOUIsSUFBQSw0REFBYyxDQUFpQjtBQUV2QyxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUM7QUFDN0IsSUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7QUFDdkMsSUFBTSx1QkFBdUIsR0FBRyxjQUFjLENBQUM7QUFDL0MsSUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztBQUNsRCxJQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztBQUU5QixRQUFBLFFBQVEsR0FBOEIsVUFBQyxJQUFJLEVBQUUsT0FBTztJQUMvRCxJQUFNLEdBQUcsR0FBbUIsMEJBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFFLElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDL0IsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUTtLQUNqQyxDQUFDLENBQUM7SUFDSCxJQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQ3BDLGlCQUFpQixFQUNqQixFQUFFLEVBQ0YsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNO0lBQ3RCLGtCQUFrQixDQUFDLEtBQUssRUFDeEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ2pCLENBQUM7SUFDRixJQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsb0JB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
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var graphql_1 = require("graphql");
var ts = require("typescript");
function getInputObjectTypeIdentifier(type) {
return type.name;
}
function transformScalarType(schema, type, state, objectProps) {
if (schema.isNonNull(type)) {
return transformNonNullableScalarType(schema, type.ofType, state, objectProps);
}
else {
return ts.createUnionTypeNode([
transformNonNullableScalarType(schema, type, state, objectProps),
ts.createKeywordTypeNode(ts.SyntaxKind.NullKeyword)
]);
}
}
exports.transformScalarType = transformScalarType;
function transformNonNullableScalarType(schema, type, state, objectProps) {
if (schema.isList(type)) {
return ts.createTypeReferenceNode(ts.createIdentifier("ReadonlyArray"), [
transformScalarType(schema, type.ofType, state, objectProps)
]);
}
else if (schema.isObject(type) ||
schema.isUnion(type) ||
schema.isInterface(type)) {
return objectProps;
}
else if (schema.isScalar(type)) {
return transformGraphQLScalarType(type, state);
}
else if (schema.isEnum(type)) {
return transformGraphQLEnumType(type, state);
}
else {
throw new Error("Could not convert from GraphQL type " + type.toString());
}
}
function transformGraphQLScalarType(type, state) {
var customType = state.customScalars[type.name];
switch (customType || type.name) {
case "ID":
case "String":
case "Url":
return ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
case "Float":
case "Int":
return ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword);
case "Boolean":
return ts.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword);
default:
return customType
? ts.createTypeReferenceNode(customType, undefined)
: ts.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);
}
}
function transformGraphQLEnumType(type, state) {
state.usedEnums[type.name] = type;
return ts.createTypeReferenceNode(ts.createIdentifier(type.name), []);
}
function transformInputType(schema, type, state) {
if (schema.isNonNull(type)) {
return transformNonNullableInputType(schema, type.ofType, state);
}
else {
return ts.createUnionTypeNode([
transformNonNullableInputType(schema, type, state),
ts.createKeywordTypeNode(ts.SyntaxKind.NullKeyword)
]);
}
}
exports.transformInputType = transformInputType;
function transformNonNullableInputType(schema, type, state) {
if (schema.isList(type)) {
return ts.createTypeReferenceNode(ts.createIdentifier("ReadonlyArray"), [
transformInputType(schema, type.ofType, state)
]);
}
else if (schema.isScalar(type)) {
return transformGraphQLScalarType(type, state);
}
else if (schema.isEnum(type)) {
return transformGraphQLEnumType(type, state);
}
else if (schema.isInputObject(type)) {
var typeIdentifier = getInputObjectTypeIdentifier(type);
if (state.generatedInputObjectTypes[typeIdentifier]) {
return ts.createTypeReferenceNode(ts.createIdentifier(typeIdentifier), []);
}
state.generatedInputObjectTypes[typeIdentifier] = "pending";
var fields_1 = schema.getFields(type);
var props = Object.keys(fields_1)
.map(function (key) { return fields_1[key]; })
.filter(function (field) {
return state.optionalInputFields &&
state.optionalInputFields.indexOf(field.name) < 0;
})
.map(function (field) {
var property = ts.createPropertySignature([ts.createToken(ts.SyntaxKind.ReadonlyKeyword)], ts.createIdentifier(field.name), !(field.type instanceof graphql_1.GraphQLNonNull)
? ts.createToken(ts.SyntaxKind.QuestionToken)
: undefined, transformInputType(schema, field.type, state), undefined);
return property;
});
state.generatedInputObjectTypes[typeIdentifier] = ts.createTypeLiteralNode(props);
return ts.createTypeReferenceNode(ts.createIdentifier(typeIdentifier), []);
}
else {
throw new Error("Could not convert from GraphQL type " + type.toString());
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZVNjcmlwdFR5cGVUcmFuc2Zvcm1lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvVHlwZVNjcmlwdFR5cGVUcmFuc2Zvcm1lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FXaUI7QUFFakIsK0JBQWlDO0FBZ0JqQyxTQUFTLDRCQUE0QixDQUFDLElBQTRCO0lBQ2hFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQ2pDLElBQWlCLEVBQ2pCLEtBQVksRUFDWixXQUF5QjtJQUV6QixJQUFJLElBQUksWUFBWSx3QkFBYyxFQUFFO1FBQ2xDLE9BQU8sOEJBQThCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDeEU7U0FBTTtRQUNMLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO1lBQzVCLDhCQUE4QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDO1lBQ3hELEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztTQUNwRCxDQUFDLENBQUM7S0FDSjtBQUNILENBQUM7QUFiRCxrREFhQztBQUVELFNBQVMsOEJBQThCLENBQ3JDLElBQWlCLEVBQ2pCLEtBQVksRUFDWixXQUF5QjtJQUV6QixJQUFJLElBQUksWUFBWSxxQkFBVyxFQUFFO1FBQy9CLE9BQU8sRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUN0RSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUM7U0FDckQsQ0FBQyxDQUFDO0tBQ0o7U0FBTSxJQUNMLElBQUksWUFBWSwyQkFBaUI7UUFDakMsSUFBSSxZQUFZLDBCQUFnQjtRQUNoQyxJQUFJLFlBQVksOEJBQW9CLEVBQ3BDO1FBQ0Es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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment