{
  "version": 3,
  "sources": ["../../src/typescriptTransforms/TypeScriptTypeTransformers.ts"],
  "sourcesContent": ["/**\n * Taken from https://github.com/relay-tools/relay-compiler-language-typescript/blob/3231ea09205cc341be704c00e78db0d8ff78b34a/src/TypeScriptTypeTransformers.ts\n * License: MIT\n * Copyright 2018 Kaare Hoff Skovgaard kaare@kaareskovgaard.net, Eloy Dur\u00E1n eloy.de.enige@gmail.com\n */\n\nimport { EnumTypeID, FieldID, Schema, TypeID } from \"relay-compiler\";\nimport { TypeGeneratorOptions } from \"relay-compiler/lib/language/RelayLanguagePluginInterface\";\nimport * as ts from \"typescript\";\n\nexport type ScalarTypeMapping = {\n  [type: string]: string;\n};\n\nexport type State = {\n  generatedFragments: Set<string>;\n  generatedInputObjectTypes: {\n    [name: string]: ts.TypeLiteralNode | \"pending\";\n  };\n  matchFields: Map<string, ts.TypeNode>;\n  runtimeImports: Set<string>;\n  usedEnums: { [name: string]: TypeID };\n  usedFragments: Set<string>;\n} & TypeGeneratorOptions;\n\nfunction getInputObjectTypeIdentifier(schema: Schema, typeID: TypeID): string {\n  return schema.getTypeString(typeID);\n}\n\nexport function transformScalarType(\n  schema: Schema,\n  type: TypeID,\n  state: State,\n  objectProps?: ts.TypeNode,\n): ts.TypeNode {\n  if (schema.isNonNull(type)) {\n    return transformNonNullableScalarType(\n      schema,\n      schema.getNullableType(type),\n      state,\n      objectProps,\n    );\n  } else {\n    return ts.factory.createUnionTypeNode([\n      transformNonNullableScalarType(schema, type, state, objectProps),\n      ts.factory.createLiteralTypeNode(ts.factory.createNull()),\n    ]);\n  }\n}\n\nfunction transformNonNullableScalarType(\n  schema: Schema,\n  type: TypeID,\n  state: State,\n  objectProps?: ts.TypeNode,\n): ts.TypeNode {\n  if (schema.isList(type)) {\n    return ts.factory.createTypeReferenceNode(\n      ts.factory.createIdentifier(\"ReadonlyArray\"),\n      [\n        transformScalarType(\n          schema,\n          schema.getListItemType(type),\n          state,\n          objectProps,\n        ),\n      ],\n    );\n  } else if (\n    schema.isObject(type) ||\n    schema.isUnion(type) ||\n    schema.isInterface(type)\n  ) {\n    return objectProps!;\n  } else if (schema.isScalar(type)) {\n    return transformGraphQLScalarType(schema.getTypeString(type), state);\n  } else if (schema.isEnum(type)) {\n    return transformGraphQLEnumType(schema, schema.assertEnumType(type), state);\n  } else {\n    throw new Error(`Could not convert from GraphQL type ${type.toString()}`);\n  }\n}\n\nfunction transformGraphQLScalarType(\n  typeName: string,\n  state: State,\n): ts.TypeNode {\n  const customType = state.customScalars[typeName];\n  switch (customType || typeName) {\n    case \"ID\":\n    case \"String\":\n    case \"Url\":\n    case \"DateTime\":\n      return ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);\n    case \"Float\":\n    case \"Int\":\n      return ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword);\n    case \"Boolean\":\n      return ts.factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword);\n\n    default:\n      return customType\n        ? ts.factory.createTypeReferenceNode(customType, undefined)\n        : ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);\n  }\n}\n\nfunction transformGraphQLEnumType(\n  schema: Schema,\n  type: EnumTypeID,\n  state: State,\n): ts.TypeNode {\n  state.usedEnums[schema.getTypeString(type)] = type;\n  return ts.factory.createTypeReferenceNode(\n    ts.factory.createIdentifier(schema.getTypeString(type)),\n    [],\n  );\n}\n\nexport function transformInputType(\n  schema: Schema,\n  type: TypeID,\n  state: State,\n  options: {\n    inputObjectProperty?: boolean | undefined;\n  } = {},\n): ts.TypeNode {\n  const { inputObjectProperty } = options;\n  if (schema.isNonNull(type)) {\n    return transformNonNullableInputType(\n      schema,\n      schema.getNullableType(type),\n      state,\n    );\n  } else if (inputObjectProperty) {\n    return ts.factory.createUnionTypeNode([\n      transformNonNullableInputType(schema, type, state),\n      ts.factory.createLiteralTypeNode(ts.factory.createNull()),\n      // add undefined to support exactOptionalPropertyTypes\n      ts.factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),\n    ]);\n  } else {\n    return ts.factory.createUnionTypeNode([\n      transformNonNullableInputType(schema, type, state),\n      ts.factory.createLiteralTypeNode(ts.factory.createNull()),\n    ]);\n  }\n}\n\nfunction transformNonNullableInputType(\n  schema: Schema,\n  type: TypeID,\n  state: State,\n) {\n  if (schema.isList(type)) {\n    return ts.factory.createTypeReferenceNode(\n      ts.factory.createIdentifier(\"Array\"),\n      [transformInputType(schema, schema.getListItemType(type), state)],\n    );\n  } else if (schema.isScalar(type)) {\n    return transformGraphQLScalarType(schema.getTypeString(type), state);\n  } else if (schema.isEnum(type)) {\n    return transformGraphQLEnumType(schema, schema.assertEnumType(type), state);\n  } else if (schema.isInputObject(type)) {\n    const typeIdentifier = getInputObjectTypeIdentifier(schema, type);\n    if (state.generatedInputObjectTypes[typeIdentifier]) {\n      return ts.factory.createTypeReferenceNode(\n        ts.factory.createIdentifier(typeIdentifier),\n        [],\n      );\n    }\n    state.generatedInputObjectTypes[typeIdentifier] = \"pending\";\n\n    const fields = schema.getFields(schema.assertInputObjectType(type));\n\n    const props = fields.map((fieldID: FieldID) => {\n      const fieldType = schema.getFieldType(fieldID);\n      const fieldName = schema.getFieldName(fieldID);\n      const property = ts.factory.createPropertySignature(\n        undefined,\n        ts.factory.createIdentifier(fieldName),\n        state.optionalInputFields.indexOf(fieldName) >= 0 ||\n          !schema.isNonNull(fieldType)\n          ? ts.factory.createToken(ts.SyntaxKind.QuestionToken)\n          : undefined,\n        transformInputType(schema, fieldType, state, {\n          inputObjectProperty: true,\n        }),\n      );\n\n      return property;\n    });\n    state.generatedInputObjectTypes[typeIdentifier] =\n      ts.factory.createTypeLiteralNode(props);\n    return ts.factory.createTypeReferenceNode(\n      ts.factory.createIdentifier(typeIdentifier),\n      [],\n    );\n  } else {\n    throw new Error(`Could not convert from GraphQL type ${type.toString()}`);\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
