{"version":3,"file":"index.cjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["import {\n  buildASTSchema,\n  buildSchema,\n  extendSchema,\n  GraphQLDirective,\n  GraphQLInterfaceType,\n  GraphQLList,\n  GraphQLNonNull,\n  GraphQLObjectType,\n  GraphQLSchema,\n  isScalarType,\n  isSpecifiedDirective,\n  isSpecifiedScalarType,\n  parse,\n  parseType,\n  print,\n  type DocumentNode,\n  type GraphQLField,\n  type GraphQLNamedType,\n  type GraphQLOutputType,\n} from 'graphql'\nimport type { GeneContext } from 'graphql-gene/context'\nimport type { AnyObject, FieldLines, GraphQLVarType, TypeDefLines, TypeOrFunction } from '../types'\nimport type { GeneConfig, GeneTypeConfig } from '../defineConfig'\n\nexport * from './extend'\n\ntype GraphQLOutputObjectType = GraphQLObjectType | GraphQLInterfaceType\n\nexport function parseSchemaOption(\n  schema: GraphQLSchema | DocumentNode | string | undefined,\n  scalars?: string[]\n): GraphQLSchema | undefined {\n  if (!schema && (!scalars || !scalars.length)) return undefined\n\n  let parsedSchema: GraphQLSchema | undefined = undefined\n\n  if (schema) {\n    parsedSchema =\n      typeof schema === 'string'\n        ? buildSchema(schema)\n        : schema instanceof GraphQLSchema\n          ? schema\n          : buildASTSchema(schema)\n  }\n  if (scalars?.length) {\n    const undefinedScalars = scalars.filter(scalar => !parsedSchema?.getType(scalar))\n    const scalarsDef = undefinedScalars.map(scalar => `scalar ${scalar}`).join('\\n')\n\n    parsedSchema = parsedSchema\n      ? extendSchema(parsedSchema, parse(scalarsDef))\n      : buildSchema(scalarsDef)\n  }\n  return parsedSchema\n}\n\nexport function lookDeepInSchema<TState>(options: {\n  each: (details: {\n    field: string\n    fieldDef: GraphQLField<\n      Record<string, unknown> | undefined,\n      GeneContext,\n      Record<string, unknown> | undefined\n    >\n    isList: boolean\n    isNonNullable: boolean\n    parentType: string\n    parentTypeDef: GraphQLOutputObjectType\n    state: TState\n    type: string\n    typeDef: GraphQLNamedType\n  }) => TState | undefined\n  schema: GraphQLSchema\n  state?: TState\n}) {\n  const queryType = options.schema.getQueryType()\n  const mutationType = options.schema.getMutationType()\n  if (!queryType && !mutationType) return\n\n  const typesChecked = new Set<string>([])\n\n  const lookDeeper = (parentTypeDef: GraphQLOutputObjectType, state: TState) => {\n    if (typesChecked.has(parentTypeDef.name)) return\n\n    typesChecked.add(parentTypeDef.name)\n    const childFields = parentTypeDef.getFields()\n\n    Object.entries(childFields).forEach(([field, fieldDefinition]) => {\n      const fieldDef = fieldDefinition\n      const typeDefWrap = fieldDefinition.type\n      if (!fieldDef || !typeDefWrap) return\n\n      const typeDef = findAccurateTypeDef(typeDefWrap)\n      if (!typeDef) return\n\n      const newState = options.each({\n        field,\n        fieldDef,\n\n        get isList(): boolean {\n          return (\n            fieldDef instanceof GraphQLList ||\n            ('ofType' in typeDefWrap && typeDefWrap.ofType instanceof GraphQLList)\n          )\n        },\n        get isNonNullable(): boolean {\n          return fieldDef instanceof GraphQLNonNull\n        },\n        parentType: parentTypeDef.name,\n        parentTypeDef,\n        state,\n        type: typeDef.name,\n\n        get typeDef() {\n          const type = options.schema.getType(typeDef.name)\n          return type as NonNullable<typeof type>\n        },\n      })\n\n      // Look deeper if the type has child fields\n      if ('getFields' in typeDef) lookDeeper(typeDef, newState || state)\n    })\n  }\n  if (queryType) lookDeeper(queryType, options.state || ({} as TState))\n  if (mutationType) lookDeeper(mutationType, options.state || ({} as TState))\n}\n\nexport function findAccurateTypeDef(type: GraphQLOutputType) {\n  const typeDefinition = ('ofType' in type ? findAccurateTypeDef(type.ofType) : type) as\n    | GraphQLOutputType\n    | undefined\n\n  if (typeDefinition && 'name' in typeDefinition) return typeDefinition\n}\n\nexport function getGraphqlType(\n  variable: string | number | boolean | string[] | number[] | boolean[]\n) {\n  const isArray = Array.isArray(variable)\n  const varType = isArray ? typeof variable[0] : typeof variable\n\n  const typeMap: Record<string, 'String' | 'Int' | 'Boolean'> = {\n    string: 'String',\n    number: 'Int',\n    boolean: 'Boolean',\n  }\n  return isArray ? `[${typeMap[varType]}!]` : typeMap[varType]\n}\n\n/**\n * Inspired by\n * @see https://github.com/graphql/graphql-js/issues/869#issuecomment-374351118\n */\nexport function printSchemaWithDirectives(schema: GraphQLSchema) {\n  let schemaString = ''\n\n  const printAst = (type: GraphQLDirective | GraphQLNamedType) => {\n    if (isScalarType(type)) schemaString += `scalar ${type.name}\\n\\n`\n    if (type && 'astNode' in type && type.astNode) schemaString += `${print(type.astNode)}\\n\\n`\n  }\n\n  schema.getDirectives().forEach(type => {\n    if (!isSpecifiedDirective(type)) printAst(type)\n  })\n\n  const typeEntries = Object.entries(schema.getTypeMap())\n\n  // Print Query and Mutation types before the other types that are alphabetically sorted\n  typeEntries.sort(([aTypeName], [bTypeName]) => {\n    if (aTypeName === 'Query') return -1\n    if (aTypeName === 'Mutation') return bTypeName === 'Query' ? 1 : -1\n\n    if (bTypeName === 'Query') return 1\n    if (bTypeName === 'Mutation') return aTypeName === 'Query' ? -1 : 1\n\n    return aTypeName.localeCompare(bTypeName)\n  })\n\n  typeEntries\n    // Filter out internal type definition like __Directive, __Field, __InputValue\n    .filter(([typeName]) => !/^__/.test(typeName))\n    .forEach(([, type]) => {\n      if (!isSpecifiedScalarType(type)) printAst(type)\n    })\n\n  return schemaString.replace(/\\n$/, '')\n}\n\n/** is using default Gene resolver if `resolver` or `args` option is set to \"default\" */\nexport function isUsingDefaultResolver(fieldConfig: AnyObject): boolean {\n  return (['resolver', 'args'] as const).some(\n    prop => prop in fieldConfig && fieldConfig[prop] === 'default'\n  )\n}\n\nexport function getDefaultTypeDefLinesObject(): TypeDefLines[0] {\n  return { varType: 'type', directives: new Set<string>([]), lines: {} }\n}\n\nexport function getDefaultFieldLinesObject(): FieldLines[0] {\n  return { directives: new Set<string>([]), typeDef: '', argsDef: {} }\n}\n\nexport function isObject<T>(variable: T) {\n  return variable !== null && typeof variable === 'object'\n}\n\nexport function isEmptyObject<T extends object>(obj: T) {\n  for (const _prop in obj) return false\n\n  return true\n}\n\nexport function isArrayFieldConfig<T>(\n  fieldConfigs: T\n): fieldConfigs is Extract<T, readonly string[]> {\n  return Array.isArray(fieldConfigs)\n}\n\nexport function isObjectFieldConfig<T>(\n  fieldConfigs: T\n): fieldConfigs is Exclude<T, readonly string[]> {\n  return isObject(fieldConfigs)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalizeFieldConfig<TConfig extends string | GeneTypeConfig<any, any, any, any>>(\n  fieldConfig: TConfig\n): GeneTypeConfig {\n  return typeof fieldConfig === 'string'\n    ? ({ returnType: fieldConfig } as GeneTypeConfig)\n    : fieldConfig\n}\n\nexport function isListType(type: ReturnType<typeof parseType>) {\n  const typeToCheck = type.kind === 'NonNullType' ? type.type : type\n  return typeToCheck.kind === 'ListType'\n}\n\nexport function findTypeNameFromTypeNode(type: ReturnType<typeof parseType>): string {\n  return 'type' in type ? findTypeNameFromTypeNode(type.type) : type.name.value\n}\n\nexport function getFieldDefinition(options: {\n  schema: GraphQLSchema\n  parent: string\n  field: string\n}) {\n  const typeDefinition = options.schema.getType(options.parent)\n\n  // // This should only happen if the provided parent type is invalid\n  if (!typeDefinition) return\n\n  const fields = 'getFields' in typeDefinition ? typeDefinition.getFields() : undefined\n  const fieldDef = fields?.[options.field]\n\n  return fieldDef && 'resolve' in fieldDef ? fieldDef : undefined\n}\n\n/**\n * Receives the full GraphQL return type and returns the type name as string.\n *\n * @example\n * const returnTypeName = getReturnTypeName('[Foo!]!') // => 'Foo'\n */\nexport function getReturnTypeName(returnType: string) {\n  return findTypeNameFromTypeNode(parseType(returnType))\n}\n\nexport function getGeneConfigFromOptions<M>(options: {\n  model: M\n  geneConfig?: GeneConfig<M>\n}): GeneConfig<M> | undefined {\n  return (\n    options.geneConfig ||\n    (options.model &&\n      (typeof options.model === 'object' || typeof options.model === 'function') &&\n      'geneConfig' in options.model &&\n      options.model.geneConfig) ||\n    undefined\n  )\n}\n\nexport function parseGetterConfig<T>(config: TypeOrFunction<T>): T {\n  return config instanceof Function ? config() : config\n}\n\nexport function isFieldIncluded<M>(\n  geneConfig: GeneConfig<M> | undefined,\n  fieldKey: string\n): boolean {\n  const config = geneConfig || {}\n\n  const check = (filters: unknown[]) => {\n    for (const keyOrRegex of filters) {\n      if (typeof keyOrRegex === 'string' && keyOrRegex === fieldKey) return true\n      if (keyOrRegex instanceof RegExp && keyOrRegex.test(fieldKey)) return true\n    }\n  }\n  if (config.include && !check(config.include)) return false\n\n  let extraExclude = new Set(['createdAt' as const, 'updatedAt' as const])\n\n  if (Array.isArray(config.includeTimestamps)) {\n    config.includeTimestamps.forEach(timestamp => extraExclude.delete(timestamp))\n  } else if (config.includeTimestamps === true) {\n    extraExclude = new Set([])\n  }\n\n  const exclude = [...(config.exclude || []), ...extraExclude]\n  if (check(exclude)) return false\n\n  return true\n}\n\nexport function createTypeDefLines(\n  typeDefLines: TypeDefLines,\n  varType: GraphQLVarType,\n  varName: string\n) {\n  typeDefLines[varName] = { ...getDefaultTypeDefLinesObject(), ...typeDefLines[varName] }\n  typeDefLines[varName].varType = varType\n}\n"],"mappings":"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"}