{"version":3,"file":"schema.cjs","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import {\n  parse,\n  buildSchema,\n  extendSchema,\n  GraphQLSchema,\n  GraphQLObjectType,\n  parseType,\n  isScalarType,\n} from 'graphql'\nimport type { DocumentNode } from 'graphql'\nimport { type GeneConfig, type GeneConfigTypes, type GeneDirectiveConfig } from './defineConfig'\nimport type { AnyObject, Mutable } from './types/typeUtils'\nimport {\n  getGraphqlType,\n  lookDeepInSchema,\n  parseSchemaOption,\n  printSchemaWithDirectives,\n  isUsingDefaultResolver,\n  normalizeFieldConfig,\n  isListType,\n  isArrayFieldConfig,\n  isObjectFieldConfig,\n  getDefaultTypeDefLinesObject,\n  getDefaultFieldLinesObject,\n  getGeneConfigFromOptions,\n  isFieldIncluded,\n  isObject,\n  getGloballyExtendedTypes,\n  getReturnTypeName,\n  getFieldDefinition,\n  setGeneConfigByType,\n  parseGetterConfig,\n} from './utils'\nimport { addResolversToSchema } from './resolvers'\nimport SCHEMA_TEMPLATE_HTML from './schema.html?raw'\nimport type {\n  BasicGraphqlType,\n  DirectiveDefs,\n  GenePlugin,\n  Resolvers,\n  ResolversOrScalars,\n  TypeDefLines,\n} from './types'\nimport {\n  generateDefaultQueryFilterTypeDefs,\n  populateArgsDefForDefaultResolver,\n} from './defaultResolver'\n\nexport function generateSchema<\n  SchemaTypes extends AnyObject,\n  DataTypes extends AnyObject,\n>(options: {\n  schema?: GraphQLSchema | DocumentNode | string\n  resolvers?: ResolversOrScalars\n  plugins?: GenePlugin[]\n  types: SchemaTypes\n  dataTypeMap?: DataTypes\n}) {\n  const providedScalars = options.resolvers\n    ? Object.values(options.resolvers)\n        .filter(typeConfig => isScalarType(typeConfig))\n        .map(({ name }) => name)\n    : []\n\n  const initialSchema = parseSchemaOption(options.schema, providedScalars)\n  const { typeDefsString, typeDefLines } = generateGeneTypeDefs({\n    ...options,\n    schema: initialSchema,\n  })\n\n  const schema = initialSchema\n    ? extendSchema(initialSchema, parse(typeDefsString))\n    : buildSchema(typeDefsString)\n\n  const queryType = schema.getType('Query')\n  const mutationType = schema.getType('Mutation')\n\n  if (!queryType) {\n    throw new Error('Query root type must be provided.')\n  }\n  if (!(queryType instanceof GraphQLObjectType)) {\n    throw new Error('Query type is not a GraphQLObjectType.')\n  }\n  const schemaOptions: Mutable<ConstructorParameters<typeof GraphQLSchema>[0]> = {\n    query: queryType,\n  }\n  const schemaTypeMap = schema.getTypeMap()\n\n  if (mutationType) {\n    if (!(mutationType instanceof GraphQLObjectType)) {\n      throw new Error('Mutation type is not a GraphQLObjectType.')\n    }\n    schemaOptions.mutation = mutationType\n  }\n\n  if (options.resolvers) {\n    Object.entries(options.resolvers).forEach(([parentType, typeConfig]) => {\n      if (isScalarType(typeConfig)) {\n        Object.assign(schemaTypeMap[parentType], typeConfig)\n        return\n      }\n      Object.entries(typeConfig).forEach(([field, resolver]) => {\n        const fieldDef = getFieldDefinition({ schema, parent: parentType, field })\n        if (fieldDef) fieldDef.resolve = resolver\n        else throw new Error(`No field definition found for \"${field}\" of type \"${parentType}.`)\n      })\n    })\n  }\n\n  let executableSchema = new GraphQLSchema({\n    ...schema.toConfig(),\n    ...schemaOptions,\n    types: Object.values(schemaTypeMap),\n  })\n\n  executableSchema = addResolversToSchema({\n    typeDefLines,\n    schema: executableSchema,\n    plugins: options.plugins || [],\n    types: options.types,\n  })\n\n  return {\n    schema: executableSchema,\n\n    get schemaString() {\n      return printSchemaWithDirectives(executableSchema)\n    },\n    get typeDefs() {\n      return parse(this.schemaString)\n    },\n    get resolvers() {\n      const resolvers: Resolvers = {}\n\n      lookDeepInSchema({\n        schema: executableSchema,\n        each({ field, fieldDef, parentType }) {\n          if (!fieldDef.resolve) return\n\n          resolvers[parentType] = resolvers[parentType] || {}\n          resolvers[parentType][field] = fieldDef.resolve\n        },\n      })\n      return resolvers\n    },\n    get schemaHtml() {\n      return SCHEMA_TEMPLATE_HTML.replace('<%= code %>', this.schemaString)\n    },\n  }\n}\n\nfunction generateGeneTypeDefs<SchemaTypes extends AnyObject, DataTypes extends AnyObject>(options: {\n  schema?: GraphQLSchema\n  resolvers?: ResolversOrScalars\n  plugins?: GenePlugin[]\n  types: SchemaTypes\n  dataTypeMap?: DataTypes\n}) {\n  const directiveDefs: DirectiveDefs = {}\n  const typeDefLines: TypeDefLines = {}\n  const afterTypeDefHooks: (() => void)[] = []\n\n  Object.entries(options.types).forEach(([graphqlType, fieldConfigs]) => {\n    let hasUsedPlugin = false\n\n    for (const plugin of options.plugins || []) {\n      const isMatching = plugin.isMatching(fieldConfigs)\n      if (!isMatching) continue\n\n      const { afterTypeDefHooks: hooks } = forEachModel({\n        directiveDefs,\n        typeDefLines,\n        types: options.types,\n        schema: options.schema,\n        resolvers: options.resolvers,\n        plugin,\n        modelKey: graphqlType,\n        model: fieldConfigs,\n        dataTypeMap: options.dataTypeMap,\n      })\n      afterTypeDefHooks.push(...hooks)\n\n      forEachModelOnTypeDefCompleted({\n        typeDefLines,\n        modelKey: graphqlType,\n        model: fieldConfigs,\n      })\n\n      hasUsedPlugin = true\n      break\n    }\n\n    if (!hasUsedPlugin && (isArrayFieldConfig(fieldConfigs) || isObjectFieldConfig(fieldConfigs))) {\n      generateTypeDefLines({\n        directiveDefs,\n        typeDefLines,\n        graphqlType,\n        fieldConfigs: fieldConfigs,\n      })\n    }\n  })\n  const globallyExtendedTypes = getGloballyExtendedTypes()\n\n  Object.entries(globallyExtendedTypes.config).forEach(([graphqlType, fieldConfigs]) => {\n    generateTypeDefLines({\n      directiveDefs,\n      typeDefLines,\n      graphqlType,\n      fieldConfigs: fieldConfigs as GeneConfigTypes,\n    })\n\n    Object.entries(fieldConfigs).forEach(([fieldKey, fieldConfig]) => {\n      const normalizedFieldConfig = normalizeFieldConfig(fieldConfig)\n      if (!isUsingDefaultResolver(normalizedFieldConfig)) return\n\n      generateDefaultQueryFilterTypeDefs({\n        typeDefLines,\n        graphqlType,\n        fieldKey,\n        fieldType: getReturnTypeName(normalizedFieldConfig.returnType),\n      })\n    })\n  })\n\n  afterTypeDefHooks.forEach(hook => hook())\n\n  const typeDefs: string[] = []\n  let sortedTypeDefLines = typeDefLines\n\n  // Put type Query at the top\n  if ('Query' in typeDefLines) {\n    const { Query, ...restTypeDefLines } = typeDefLines\n    sortedTypeDefLines = { Query, ...restTypeDefLines }\n  }\n\n  Object.entries(sortedTypeDefLines).forEach(([type, fieldLines]) => {\n    const line = stringifyFieldLines(type, fieldLines)\n    if (line) typeDefs.push(line)\n  })\n  let typeDefsString = typeDefs.join('\\n\\n')\n\n  Object.entries(directiveDefs).forEach(([directiveName, directiveConfig]) => {\n    let directiveDef = `directive @${directiveName}`\n\n    const rawArgsDefEntries = Object.entries(directiveConfig.argsDef)\n    const argsDefEntries = rawArgsDefEntries.filter(([, types]) => [...types].some(t => t !== null))\n\n    const printTypes = (types: Set<string | string[] | null>) => {\n      const typeDefs = [...types]\n      return [\n        typeDefs.filter(t => t !== null),\n        types.has(null) || typeDefs.some(type => /^\\[/.test(String(type))) ? '' : '!',\n      ].join('')\n    }\n\n    if (argsDefEntries.length) {\n      directiveDef += '(\\n'\n      directiveDef += argsDefEntries.map(([k, types]) => `  ${k}: ${printTypes(types)}`).join('\\n')\n      directiveDef += '\\n)'\n    }\n    directiveDef += ' on OBJECT | FIELD_DEFINITION'\n\n    typeDefsString = `${directiveDef}\\n\\n${typeDefsString}`\n  })\n\n  return { typeDefsString, typeDefLines }\n}\n\nfunction forEachModel<M, SchemaTypes extends AnyObject>(options: {\n  directiveDefs: DirectiveDefs\n  typeDefLines: TypeDefLines\n  types: SchemaTypes\n  schema?: GraphQLSchema\n  resolvers?: ResolversOrScalars\n  plugin: GenePlugin<M>\n  modelKey: string\n  model: M\n  dataTypeMap?: { [k: string | symbol]: BasicGraphqlType }\n}) {\n  const afterTypeDefHooks: (() => void)[] = []\n\n  const { afterTypeDefHooks: hooks } = generateTypeDefs(options)\n  afterTypeDefHooks.push(...hooks)\n\n  generateAdditionalTypeDefs(options)\n\n  const geneConfig = getGeneConfigFromOptions(options)\n\n  Object.entries(geneConfig?.aliases || {}).forEach(([aliasKey, geneConfig]) => {\n    const { afterTypeDefHooks: hooks } = generateTypeDefs({\n      ...options,\n      geneConfig,\n      modelKey: aliasKey,\n    })\n    afterTypeDefHooks.push(...hooks)\n\n    generateAdditionalTypeDefs({ ...options, geneConfig })\n  })\n  return { afterTypeDefHooks }\n}\n\nfunction forEachModelOnTypeDefCompleted<M>(options: {\n  typeDefLines: TypeDefLines\n  modelKey: string\n  model: M\n}) {\n  generateQueryFilterTypeDefs(options)\n\n  const geneConfig = getGeneConfigFromOptions(options)\n  if (!geneConfig?.types) return\n\n  Object.entries(geneConfig?.aliases || {}).forEach(([, geneConfig]) => {\n    generateQueryFilterTypeDefs({ ...options, geneConfig })\n  })\n}\n\nfunction generateTypeDefs<M, SchemaTypes extends AnyObject>(options: {\n  directiveDefs: DirectiveDefs\n  typeDefLines: TypeDefLines\n  types: SchemaTypes\n  schema?: GraphQLSchema\n  resolvers?: ResolversOrScalars\n  modelKey: string\n  model: M\n  plugin: GenePlugin<M>\n  geneConfig?: GeneConfig<M>\n  dataTypeMap?: { [k: string | symbol]: BasicGraphqlType }\n}) {\n  const geneConfig = getGeneConfigFromOptions(options)\n  const afterTypeDefHooks: (() => void)[] = []\n\n  setGeneConfigByType(options.modelKey, geneConfig)\n\n  const optionsForPopulateTypeDefs = {\n    typeDefLines: options.typeDefLines,\n    model: options.model,\n    typeName: options.modelKey,\n    isFieldIncluded: (fieldKey: string) => isFieldIncluded(geneConfig, fieldKey),\n    schemaOptions: options,\n  }\n\n  if (options.plugin.populateTypeDefs) {\n    const { afterTypeDefHooks: hooks } = options.plugin.populateTypeDefs(optionsForPopulateTypeDefs)\n    afterTypeDefHooks.push(...hooks)\n  } else {\n    const typeDef = options.plugin.getTypeDef(optionsForPopulateTypeDefs)\n    options.typeDefLines[options.modelKey] = typeDef\n  }\n\n  registerDirectives({\n    // @ts-expect-error Fix type issue raised by incompatible TSource\n    configs: parseGetterConfig(geneConfig?.directives),\n    defs: options.directiveDefs,\n    each: ({ directiveDef }) => {\n      options.typeDefLines[options.modelKey].directives.add(directiveDef)\n    },\n  })\n  return { afterTypeDefHooks }\n}\n\n/**\n * Generate type definition object from `geneConfig.types`\n */\nfunction generateAdditionalTypeDefs<M>(options: {\n  directiveDefs: DirectiveDefs\n  typeDefLines: TypeDefLines\n  modelKey: string\n  model: M\n  geneConfig?: GeneConfig<M>\n}) {\n  const geneConfig = getGeneConfigFromOptions(options)\n  if (!geneConfig?.types) return\n\n  Object.entries(geneConfig.types).forEach(([graphqlType, fieldConfigs]) => {\n    generateTypeDefLines({ ...options, graphqlType, fieldConfigs: fieldConfigs as GeneConfigTypes })\n  })\n}\n\nfunction generateTypeDefLines(options: {\n  directiveDefs: DirectiveDefs\n  typeDefLines: TypeDefLines\n  graphqlType: string\n  fieldConfigs: GeneConfigTypes\n}) {\n  let objFieldConfigs = options.fieldConfigs\n\n  options.typeDefLines[options.graphqlType] = {\n    ...getDefaultTypeDefLinesObject(),\n    ...options.typeDefLines[options.graphqlType],\n  }\n\n  if (\n    isObject(objFieldConfigs) &&\n    'geneConfig' in objFieldConfigs &&\n    objFieldConfigs.geneConfig?.varType\n  ) {\n    const varType = objFieldConfigs.geneConfig.varType\n    options.typeDefLines[options.graphqlType].varType = varType\n\n    if (varType === 'union') {\n      const objConfigs: Record<string, ''> = {}\n\n      Object.keys(objFieldConfigs)\n        .filter(field => field !== 'geneConfig')\n        .forEach(field => (objConfigs[field] = ''))\n\n      objFieldConfigs = objConfigs\n    }\n  }\n\n  // If options.fieldConfigs is an array, we should treat it as an enum\n  if (isArrayFieldConfig(options.fieldConfigs)) {\n    options.typeDefLines[options.graphqlType].varType = 'enum'\n\n    const objConfigs: Record<string, ''> = {}\n    options.fieldConfigs.forEach(field => (objConfigs[field] = ''))\n\n    objFieldConfigs = objConfigs\n  } else {\n    const geneConfig = options.fieldConfigs.geneConfig\n    if (geneConfig?.varType) options.typeDefLines[options.graphqlType].varType = geneConfig.varType\n  }\n\n  Object.entries(objFieldConfigs).forEach(([fieldKey, fieldConfig]) => {\n    if (fieldKey === 'geneConfig') return\n\n    const normalizedFieldConfig = normalizeFieldConfig(fieldConfig)\n\n    options.typeDefLines[options.graphqlType].lines[fieldKey] = {\n      ...getDefaultFieldLinesObject(),\n      ...options.typeDefLines[options.graphqlType].lines[fieldKey],\n    }\n\n    const fieldLineConfig = options.typeDefLines[options.graphqlType].lines[fieldKey]\n\n    if (normalizedFieldConfig.returnType) {\n      fieldLineConfig.typeDef = normalizedFieldConfig.returnType\n    }\n\n    if (isUsingDefaultResolver(normalizedFieldConfig)) {\n      populateArgsDefForDefaultResolver({\n        fieldLineConfig,\n        graphqlType: options.graphqlType,\n        fieldKey,\n        isList: isListType(parseType(fieldLineConfig.typeDef)),\n      })\n    } else if (normalizedFieldConfig.args) {\n      Object.entries(normalizedFieldConfig.args).forEach(([argKey, argDef]) => {\n        if (typeof argDef !== 'string') return\n\n        fieldLineConfig.argsDef[argKey] = fieldLineConfig.argsDef[argKey] || new Set<string>([])\n        fieldLineConfig.argsDef[argKey].add(argDef)\n      })\n    }\n    if (normalizedFieldConfig.directives) {\n      registerDirectives({\n        configs: parseGetterConfig(normalizedFieldConfig.directives),\n        defs: options.directiveDefs,\n        each: ({ directiveDef }) => {\n          options.typeDefLines[options.graphqlType].lines[fieldKey].directives.add(directiveDef)\n        },\n      })\n    }\n  })\n}\n\nfunction generateQueryFilterTypeDefs<M>(options: {\n  typeDefLines: TypeDefLines\n  // modelKey: string\n  model?: M\n  geneConfig?: GeneConfig<M>\n  extendedTypes?: GeneConfigTypes\n}) {\n  const model = options.model\n  const geneConfig = model ? getGeneConfigFromOptions({ model, ...options }) : undefined\n  if (!geneConfig?.types) return\n\n  Object.entries(geneConfig.types).forEach(([graphqlType, fieldConfigs]) => {\n    Object.entries(fieldConfigs).forEach(([fieldKey, fieldConfig]) => {\n      const normalizedFieldConfig = normalizeFieldConfig(fieldConfig)\n      if (!isUsingDefaultResolver(normalizedFieldConfig)) return\n\n      generateDefaultQueryFilterTypeDefs({\n        typeDefLines: options.typeDefLines,\n        graphqlType,\n        fieldKey,\n        fieldType: getReturnTypeName(normalizedFieldConfig.returnType),\n      })\n    })\n  })\n}\n\nfunction registerDirectives(options: {\n  defs: DirectiveDefs\n  configs: GeneDirectiveConfig[] | undefined\n  each: (details: { directiveDef: string; directive: GeneDirectiveConfig }) => void\n}) {\n  options.configs?.forEach(directive => {\n    // Define or extend the directive in the schema\n    options.defs[directive.name] = options.defs[directive.name] || { argsDef: {} }\n\n    if (directive.args) {\n      Object.entries(directive.args).forEach(([key, value]) => {\n        if (Array.isArray(value) && !value.length) return\n\n        options.defs[directive.name].argsDef = options.defs[directive.name].argsDef || {}\n\n        options.defs[directive.name].argsDef[key] =\n          options.defs[directive.name].argsDef[key] || new Set([])\n\n        options.defs[directive.name].argsDef[key].add(\n          value === null ? null : Array.isArray(value) && !value.length ? [] : getGraphqlType(value)\n        )\n      })\n    }\n\n    const directiveDef = stringifyDirectiveConfig(directive)\n    options.each({ directiveDef, directive })\n  })\n}\n\nfunction stringifyFieldLines(typeKey: string, fieldLines: TypeDefLines[0]) {\n  const printDirectives = (directives: Set<string>) =>\n    directives.size ? ` ${[...directives].join(' ')}` : ''\n\n  const fieldLinesArray = Object.entries(fieldLines.lines).map(([attr, type]) => {\n    let argsDef = ''\n    const argsDefEntries = Object.entries(type.argsDef)\n    // Add the parentheses if the field has arguments\n    if (argsDefEntries.length) {\n      argsDef += '('\n      argsDef += argsDefEntries.map(([k, v]) => `${k}: ${[...v].join(' | ')}`).join(', ')\n      argsDef += ')'\n    }\n    let line = `${attr}${argsDef}`\n    if (type.typeDef) line += `: ${type.typeDef}${printDirectives(type.directives)}`\n\n    return line\n  })\n  if (!fieldLinesArray.length) return ''\n\n  const getVarDef = (indent = '  ', join = '\\n') =>\n    fieldLinesArray.map(line => `${indent}${line}`).join(join)\n\n  if (fieldLines.varType === 'union') {\n    return `union ${typeKey} = ${getVarDef('', ' | ')}`\n  }\n\n  return [\n    `${fieldLines.varType} ${typeKey}${printDirectives(fieldLines.directives)} {`,\n    getVarDef(),\n    `}`,\n  ].join('\\n')\n}\n\nfunction stringifyDirectiveConfig(directive: GeneDirectiveConfig) {\n  let directiveDef = `@${directive.name}`\n\n  if (directive.args) {\n    // Null is not valid in GraphQL Language so we remove it from the possible argument types\n    const entries = Object.entries(directive.args).filter(([, value]) => {\n      return Array.isArray(value) ? !!value.length : value !== null\n    })\n\n    // Add the parentheses only if the directive has possible argument types\n    if (entries.length) {\n      directiveDef += '('\n      directiveDef += entries\n        .map(([argKey, value]) => {\n          const formatted = Array.isArray(value)\n            ? `[${value\n                .filter(v => v !== null)\n                .map(v => JSON.stringify(v))\n                .join(', ')}]`\n            : JSON.stringify(value)\n\n          return `${argKey}: ${formatted}`\n        })\n        .join(', ')\n      directiveDef += ')'\n    }\n  }\n  return directiveDef\n}\n"],"mappings":"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"}