{"version":3,"sources":["../../../src/adapters/prisma/adapter.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Prisma Adapter for GQP\n * Introspects Prisma schema and translates GQP queries to Prisma operations\n */\n\nimport type {\n  GQPAdapter,\n  GQPNode,\n  GQPField,\n  GQPEdge,\n  GQPCapability,\n  GQPDirective,\n  FieldType,\n  RelationType,\n  QueryFilters,\n  QueryOptions,\n} from \"../../core/types.js\";\n\n/**\n * Prisma DMMF types (internal to Prisma client)\n */\ninterface PrismaDMMF {\n  datamodel: {\n    models: PrismaModel[];\n    enums: PrismaEnum[];\n  };\n}\n\ninterface PrismaModel {\n  name: string;\n  fields: PrismaField[];\n  documentation?: string;\n}\n\ninterface PrismaField {\n  name: string;\n  kind: \"scalar\" | \"object\" | \"enum\" | \"unsupported\";\n  type: string;\n  isList: boolean;\n  isRequired: boolean;\n  isId: boolean;\n  isUnique: boolean;\n  isReadOnly: boolean;\n  hasDefaultValue: boolean;\n  relationName?: string;\n  relationFromFields?: string[];\n  relationToFields?: string[];\n  documentation?: string;\n}\n\ninterface PrismaEnum {\n  name: string;\n  values: Array<{ name: string }>;\n}\n\n/**\n * Prisma adapter configuration\n */\nexport interface PrismaAdapterConfig {\n  /** Models to include (if not specified, all models are included) */\n  include?: string[];\n  /** Models to exclude */\n  exclude?: string[];\n  /** Custom descriptions for models */\n  descriptions?: Record<string, string>;\n  /** Models to treat as root nodes (entry points) */\n  rootNodes?: string[];\n}\n\n/**\n * Prisma Adapter Implementation\n */\nexport class PrismaAdapter implements GQPAdapter {\n  name = \"prisma\";\n  private client: unknown;\n  private config: PrismaAdapterConfig;\n  private dmmf: PrismaDMMF | null = null;\n  private enumMap: Map<string, string[]> = new Map();\n\n  constructor(prismaClient: unknown, config: PrismaAdapterConfig = {}) {\n    this.client = prismaClient;\n    this.config = config;\n  }\n\n  /**\n   * Introspect Prisma schema and return GQP nodes\n   */\n  async introspect(): Promise<GQPNode[]> {\n    this.dmmf = this.getDMMF();\n    if (!this.dmmf) {\n      throw new Error(\n        \"Could not access Prisma DMMF. Make sure you are passing a valid Prisma client.\",\n      );\n    }\n\n    // Build enum map for reference\n    for (const en of this.dmmf.datamodel.enums) {\n      this.enumMap.set(\n        en.name,\n        en.values.map((v) => v.name),\n      );\n    }\n\n    const nodes: GQPNode[] = [];\n\n    for (const model of this.dmmf.datamodel.models) {\n      // Check include/exclude filters\n      if (this.config.include && !this.config.include.includes(model.name)) {\n        continue;\n      }\n      if (this.config.exclude && this.config.exclude.includes(model.name)) {\n        continue;\n      }\n\n      const node = this.modelToNode(model);\n      nodes.push(node);\n    }\n\n    return nodes;\n  }\n\n  /**\n   * Execute a query against Prisma\n   */\n  async execute(\n    nodeName: string,\n    filters: QueryFilters,\n    options: QueryOptions,\n  ): Promise<unknown[]> {\n    const modelName = this.getModelName(nodeName);\n    const model = this.getModel(modelName);\n\n    if (!model) {\n      throw new Error(`Model \"${nodeName}\" not found in Prisma client`);\n    }\n\n    const prismaQuery: Record<string, unknown> = {\n      where: this.translateFilters(filters),\n      take: Math.min(Math.max(1, options.limit || 10), 100),\n      skip: Math.max(0, options.offset || 0),\n    };\n\n    if (options.orderBy && typeof options.orderBy.field === \"string\") {\n      if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(options.orderBy.field)) {\n        prismaQuery.orderBy = {\n          [options.orderBy.field]:\n            options.orderBy.direction === \"desc\" ? \"desc\" : \"asc\",\n        };\n      }\n    }\n\n    if (options.include && options.include.length > 0) {\n      prismaQuery.include = this.buildSafeIncludes(options.include, 3);\n    }\n\n    return model.findMany(prismaQuery);\n  }\n\n  /**\n   * Build safe includes with depth limiting\n   */\n  private buildSafeIncludes(\n    includes: string[],\n    maxDepth: number,\n  ): Record<string, unknown> {\n    const result: Record<string, unknown> = {};\n\n    for (const inc of includes) {\n      if (!/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(inc)) {\n        continue;\n      }\n\n      const parts = inc.split(\".\");\n      if (parts.length > maxDepth) {\n        continue;\n      }\n\n      let current = result;\n      for (let i = 0; i < parts.length; i++) {\n        const part = parts[i];\n        if (i === parts.length - 1) {\n          current[part] = true;\n        } else {\n          if (!current[part] || current[part] === true) {\n            current[part] = { include: {} };\n          }\n          current = (current[part] as { include: Record<string, unknown> })\n            .include;\n        }\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Get total count for a query\n   */\n  async count(nodeName: string, filters: QueryFilters): Promise<number> {\n    const modelName = this.getModelName(nodeName);\n    const model = this.getModel(modelName);\n\n    if (!model) {\n      throw new Error(`Model \"${nodeName}\" not found in Prisma client`);\n    }\n\n    return model.count({\n      where: this.translateFilters(filters),\n    });\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  /**\n   * Get Prisma DMMF (Data Model Meta Format)\n   */\n  private getDMMF(): PrismaDMMF | null {\n    const client = this.client as Record<string, unknown>;\n\n    // Try different ways to access DMMF\n    if (client._dmmf) {\n      return client._dmmf as PrismaDMMF;\n    }\n    if (client._baseDmmf) {\n      return client._baseDmmf as PrismaDMMF;\n    }\n    // Prisma v5+\n    if (\n      client._runtimeDataModel &&\n      (client._runtimeDataModel as Record<string, unknown>).models\n    ) {\n      return {\n        datamodel: client._runtimeDataModel as PrismaDMMF[\"datamodel\"],\n      };\n    }\n\n    return null;\n  }\n\n  /**\n   * Get Prisma model accessor\n   */\n  private getModel(modelName: string): {\n    findMany: (args: unknown) => Promise<unknown[]>;\n    count: (args: unknown) => Promise<number>;\n  } | null {\n    const client = this.client as Record<string, unknown>;\n    const lowerName = modelName.charAt(0).toLowerCase() + modelName.slice(1);\n\n    const model = client[lowerName] as {\n      findMany: (args: unknown) => Promise<unknown[]>;\n      count: (args: unknown) => Promise<number>;\n    };\n\n    return model || null;\n  }\n\n  /**\n   * Convert model name to Prisma accessor name\n   */\n  private getModelName(nodeName: string): string {\n    // GQP uses PascalCase, Prisma uses camelCase for accessors\n    return nodeName;\n  }\n\n  /**\n   * Convert Prisma model to GQP node\n   */\n  private modelToNode(model: PrismaModel): GQPNode {\n    const fields: GQPField[] = [];\n    const edges: GQPEdge[] = [];\n    const capabilities: GQPCapability[] = [];\n\n    for (const field of model.fields) {\n      if (field.kind === \"object\") {\n        // This is a relation - create an edge\n        edges.push(this.fieldToEdge(field));\n      } else {\n        // This is a regular field\n        const gqpField = this.fieldToGQPField(field);\n        fields.push(gqpField);\n\n        // Infer capabilities from field type\n        this.addCapabilitiesForField(gqpField, capabilities);\n      }\n    }\n\n    return {\n      name: model.name,\n      description:\n        this.config.descriptions?.[model.name] || model.documentation,\n      fields,\n      edges,\n      capabilities: [...new Set(capabilities)],\n      source: this.name,\n    };\n  }\n\n  /**\n   * Convert Prisma field to GQP field\n   */\n  private fieldToGQPField(field: PrismaField): GQPField {\n    const directives: GQPDirective[] = [];\n\n    // Auto-apply @search directive for text fields\n    if (field.type === \"String\" && !field.isId) {\n      directives.push({\n        name: \"@search\",\n        args: { type: \"fuzzy\" },\n      });\n    }\n\n    // Auto-apply @reasoning directive for date fields\n    if (field.type === \"DateTime\") {\n      directives.push({\n        name: \"@reasoning\",\n        args: { type: \"temporal\" },\n      });\n    }\n\n    return {\n      name: field.name,\n      type: this.mapPrismaType(field.type, field.kind),\n      nullable: !field.isRequired,\n      isList: field.isList,\n      description: field.documentation,\n      directives,\n      enumValues:\n        field.kind === \"enum\" ? this.enumMap.get(field.type) : undefined,\n    };\n  }\n\n  /**\n   * Convert Prisma relation to GQP edge\n   */\n  private fieldToEdge(field: PrismaField): GQPEdge {\n    let relation: RelationType = \"hasMany\";\n\n    if (field.isList) {\n      relation = \"hasMany\";\n    } else if (\n      field.relationFromFields &&\n      field.relationFromFields.length > 0\n    ) {\n      relation = \"belongsTo\";\n    } else {\n      relation = \"hasOne\";\n    }\n\n    return {\n      name: field.name,\n      to: field.type,\n      relation,\n      foreignKey: field.relationFromFields?.[0],\n      description: field.documentation,\n    };\n  }\n\n  /**\n   * Map Prisma type to GQP FieldType\n   */\n  private mapPrismaType(\n    prismaType: string,\n    kind: PrismaField[\"kind\"],\n  ): FieldType {\n    if (kind === \"enum\") {\n      return \"Enum\";\n    }\n\n    const typeMap: Record<string, FieldType> = {\n      String: \"String\",\n      Int: \"Int\",\n      Float: \"Float\",\n      Boolean: \"Boolean\",\n      DateTime: \"DateTime\",\n      Json: \"Json\",\n      BigInt: \"Int\",\n      Decimal: \"Float\",\n      Bytes: \"String\",\n    };\n\n    return typeMap[prismaType] || \"String\";\n  }\n\n  /**\n   * Add capabilities based on field type\n   */\n  private addCapabilitiesForField(\n    field: GQPField,\n    capabilities: GQPCapability[],\n  ): void {\n    if (field.type === \"String\" && !field.name.endsWith(\"Id\")) {\n      capabilities.push(\"fuzzy_search\");\n      capabilities.push(\"full_text\");\n    }\n\n    if (field.type === \"DateTime\") {\n      capabilities.push(\"temporal_filter\");\n    }\n\n    if (field.type === \"Enum\") {\n      capabilities.push(\"enum_filter\");\n    }\n\n    if (field.type === \"Json\") {\n      capabilities.push(\"json_query\");\n    }\n  }\n\n  private static SAFE_OPERATORS = new Set([\n    \"equals\",\n    \"not\",\n    \"in\",\n    \"notIn\",\n    \"lt\",\n    \"lte\",\n    \"gt\",\n    \"gte\",\n    \"contains\",\n    \"startsWith\",\n    \"endsWith\",\n    \"mode\",\n    \"search\",\n    \"AND\",\n    \"OR\",\n    \"NOT\",\n  ]);\n\n  /**\n   * Translate GQP filters to Prisma where clause\n   */\n  private translateFilters(filters: QueryFilters): Record<string, unknown> {\n    const where: Record<string, unknown> = {};\n\n    for (const [key, value] of Object.entries(filters)) {\n      if (value === undefined || value === null) {\n        continue;\n      }\n\n      if (\n        !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key) &&\n        ![\"AND\", \"OR\", \"NOT\"].includes(key)\n      ) {\n        continue;\n      }\n\n      if ([\"AND\", \"OR\"].includes(key) && Array.isArray(value)) {\n        where[key] = value.map((v) =>\n          typeof v === \"object\" && v !== null\n            ? this.translateFilters(v as QueryFilters)\n            : {},\n        );\n        continue;\n      }\n\n      if (key === \"NOT\" && typeof value === \"object\" && value !== null) {\n        where[key] = this.translateFilters(value as QueryFilters);\n        continue;\n      }\n\n      if (\n        typeof value === \"object\" &&\n        value !== null &&\n        !Array.isArray(value)\n      ) {\n        const valueObj = value as Record<string, unknown>;\n        const safeValue: Record<string, unknown> = {};\n\n        for (const [op, opValue] of Object.entries(valueObj)) {\n          if (!PrismaAdapter.SAFE_OPERATORS.has(op)) {\n            continue;\n          }\n\n          if (op === \"in\" || op === \"notIn\") {\n            if (Array.isArray(opValue) && opValue.length <= 100) {\n              safeValue[op] = opValue;\n            }\n          } else if (\n            op === \"contains\" ||\n            op === \"startsWith\" ||\n            op === \"endsWith\"\n          ) {\n            if (typeof opValue === \"string\") {\n              safeValue[op] = opValue;\n              safeValue[\"mode\"] = \"insensitive\";\n            }\n          } else {\n            safeValue[op] = opValue;\n          }\n        }\n\n        if (Object.keys(safeValue).length > 0) {\n          where[key] = safeValue;\n        }\n        continue;\n      }\n\n      where[key] = value;\n    }\n\n    return where;\n  }\n}\n\n/**\n * Factory function to create Prisma adapter\n *\n * @example\n * ```typescript\n * import { GQP } from '@mzhub/gqp';\n * import { fromPrisma } from '@mzhub/gqp/prisma';\n * import { prisma } from './db';\n *\n * const graph = new GQP({\n *   sources: {\n *     database: fromPrisma(prisma, {\n *       include: ['User', 'Order', 'Product'],\n *       exclude: ['_migrations']\n *     })\n *   }\n * });\n * ```\n */\nexport function fromPrisma(\n  prismaClient: unknown,\n  config: PrismaAdapterConfig = {},\n): GQPAdapter {\n  return new PrismaAdapter(prismaClient, config);\n}\n"]}