Type signatures for json-merge gem

Smart merge for JSON files using tree-sitter AST analysis

module Json
module Merge
VERSION: String

# Base error class for json-merge errors
class Error < StandardError
end

# Error raised when template JSON file has syntax errors
class TemplateParseError < Error
  attr_reader errors: Array[untyped]
  attr_reader content: String?

  def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
end

# Error raised when destination JSON file has syntax errors
class DestinationParseError < Error
  attr_reader errors: Array[untyped]
  attr_reader content: String?

  def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
end

# Debug logging utility for Json::Merge
module DebugLogger
  extend Ast::Merge::DebugLogger

  def self.env_var_name: () -> String
  def self.env_var_name=: (String name) -> String
  def self.log_prefix: () -> String
  def self.log_prefix=: (String prefix) -> String
  def self.enabled?: () -> bool
  def self.debug: (String message, ?Hash[Symbol, untyped] context) -> void
  def self.info: (String message) -> void
  def self.warning: (String message) -> void
  def self.time: [T] (String operation) { () -> T } -> T
  def self.extract_node_info: (untyped node) -> Hash[Symbol, untyped]
end

# Wrapper for tree-sitter JSON nodes
class NodeWrapper
  attr_reader node: untyped
  attr_reader start_line: Integer
  attr_reader end_line: Integer
  attr_reader analysis: FileAnalysis?

  def initialize: (
    untyped node,
    String source,
    ?analysis: FileAnalysis?
  ) -> void

  def location: () -> Ast::Merge::FreezeNode::Location
  def signature: () -> Array[untyped]
  def object?: () -> bool
  def array?: () -> bool
  def pair?: () -> bool
  def key: () -> String?
  def value: () -> untyped
  def slice: () -> String?
  def text: () -> String
  def inspect: () -> String
end

# File analysis for JSON files
class FileAnalysis
  include Ast::Merge::FileAnalysisBase

  PARSER_SEARCH_PATHS: Array[String]

  attr_reader source: String
  attr_reader lines: Array[String]
  attr_reader ast: untyped
  attr_reader statements: Array[NodeWrapper]
  attr_reader signature_generator: (^(untyped) -> Array[untyped]?)?
  attr_reader errors: Array[untyped]

  def self.find_parser_path: () -> String?

  def initialize: (
    String source,
    ?signature_generator: (^(untyped) -> Array[untyped]?)?,
    ?parser_path: String?
  ) -> void

  def valid?: () -> bool
  def line_at: (Integer line_num) -> String?
  def normalized_line: (Integer line_num) -> String?
  def signature_at: (Integer index) -> Array[untyped]?
  def generate_signature: (untyped statement) -> Array[untyped]?
  def compute_node_signature: (untyped statement) -> Array[untyped]?

  private

  def parse_json: () -> void
  def extract_nodes: (untyped tree_node) -> Array[NodeWrapper]
  def integrate_nodes: () -> Array[NodeWrapper]
end

# Result of a JSON merge operation
class MergeResult < Ast::Merge::MergeResult
  DECISION_KEPT_TEMPLATE: Symbol
  DECISION_KEPT_DEST: Symbol
  DECISION_MERGED: Symbol
  DECISION_ADDED: Symbol

  attr_reader lines: Array[Hash[Symbol, untyped]]
  attr_reader decisions: Array[Hash[Symbol, untyped]]
  attr_reader statistics: Hash[Symbol, Integer]

  def initialize: (
    ?template_analysis: FileAnalysis?,
    ?dest_analysis: FileAnalysis?,
    ?conflicts: Array[Hash[Symbol, untyped]],
    ?stats: Hash[Symbol, untyped]
  ) -> void

  def add_line: (
    String line,
    decision: Symbol,
    source: Symbol,
    ?original_line: Integer?
  ) -> void

  def add_lines: (
    Array[String] lines,
    decision: Symbol,
    source: Symbol,
    ?start_line: Integer?
  ) -> void

  def add_blank_line: (?decision: Symbol, ?source: Symbol) -> void
  def to_json: () -> String
  def content: () -> Array[Hash[Symbol, untyped]]
  def content_string: () -> String
  def empty?: () -> bool

  private

  def track_statistics: (Symbol decision, Symbol source) -> void
end

# Smart merger for JSON files
class SmartMerger
  include Ast::Merge::MergerConfig

  attr_reader template_analysis: FileAnalysis
  attr_reader dest_analysis: FileAnalysis
  attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
  attr_reader add_template_only_nodes: bool

  def initialize: (
    String template_content,
    String dest_content,
    ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
    ?add_template_only_nodes: bool,
    ?signature_generator: (^(untyped) -> Array[untyped]?)?,
    ?node_splitter: Hash[Symbol, untyped]?,
    ?parser_path: String?
  ) -> void

  def merge: () -> MergeResult

  private

  def perform_merge: () -> MergeResult
  def merge_nodes: (MergeResult result) -> void
end

# Conflict resolver for JSON merges
class ConflictResolver
  attr_reader template_analysis: FileAnalysis
  attr_reader dest_analysis: FileAnalysis
  attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
  attr_reader add_template_only_nodes: bool

  def initialize: (
    FileAnalysis template_analysis,
    FileAnalysis dest_analysis,
    ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
    ?add_template_only_nodes: bool
  ) -> void

  def resolve: (untyped boundary, MergeResult result) -> void
end

# Emitter for reconstructing JSON output
class Emitter
  attr_reader result: MergeResult
  attr_reader indent: Integer

  def initialize: (MergeResult result, ?indent: Integer) -> void

  def emit: () -> String
end   end end