{"version":3,"file":"errors-BygUk_jU.mjs","names":[],"sources":["../src/types.ts","../src/errors.ts"],"sourcesContent":["// Branded types for improved type safety\nexport type ClueNumber = number & { __brand: \"ClueNumber\" };\nexport type GridCoordinate = number & { __brand: \"GridCoordinate\" };\nexport type RebusId = number & { __brand: \"RebusId\" };\n\n// Helper functions to create branded types\nexport const asClueNumber = (n: number): ClueNumber => n as ClueNumber;\nexport const asGridCoordinate = (n: number): GridCoordinate =>\n  n as GridCoordinate;\nexport const asRebusId = (n: number): RebusId => n as RebusId;\n\n// Stricter type for direction\nexport type Direction = \"across\" | \"down\";\n\nexport interface Puzzle {\n  title?: string;\n  author?: string;\n  copyright?: string;\n  notes?: string;\n  date?: string;\n  grid: Grid;\n  clues: Clues;\n  rebusTable?: Map<number, string>;\n  additionalProperties?: Record<string, unknown>;\n}\n\nexport interface Grid {\n  width: number;\n  height: number;\n  cells: Cell[][];\n  additionalProperties?: Record<string, unknown>;\n}\n\nexport interface Cell {\n  solution?: string;\n  number?: number;\n  isBlack: boolean;\n  isCircled?: boolean;\n  hasRebus?: boolean;\n  rebusKey?: number;\n  additionalProperties?: Record<string, unknown>;\n}\n\nexport interface Clues {\n  across: Clue[];\n  down: Clue[];\n  additionalProperties?: Record<string, unknown>;\n}\n\nexport interface Clue {\n  number: number;\n  text: string;\n  additionalProperties?: Record<string, unknown>;\n}\n\nexport interface ParseOptions {\n  filename?: string;\n  encoding?: BufferEncoding;\n  maxGridSize?: { width: number; height: number };\n}\n\nexport enum ErrorCode {\n  FORMAT_DETECTION_FAILED = \"FORMAT_DETECTION_FAILED\",\n  INVALID_FILE = \"INVALID_FILE\",\n  UNSUPPORTED_PUZZLE_TYPE = \"UNSUPPORTED_PUZZLE_TYPE\",\n  BINARY_PARSE_ERROR = \"BINARY_PARSE_ERROR\",\n\n  IPUZ_PARSE_ERROR = \"IPUZ_PARSE_ERROR\",\n  IPUZ_INVALID_JSON = \"IPUZ_INVALID_JSON\",\n  IPUZ_MISSING_VERSION = \"IPUZ_MISSING_VERSION\",\n  IPUZ_MISSING_KIND = \"IPUZ_MISSING_KIND\",\n  IPUZ_MISSING_REQUIRED_FIELD = \"IPUZ_MISSING_REQUIRED_FIELD\",\n  IPUZ_INVALID_DATA_TYPE = \"IPUZ_INVALID_DATA_TYPE\",\n  IPUZ_INVALID_GRID_SIZE = \"IPUZ_INVALID_GRID_SIZE\",\n\n  PUZ_PARSE_ERROR = \"PUZ_PARSE_ERROR\",\n  PUZ_INVALID_HEADER = \"PUZ_INVALID_HEADER\",\n  PUZ_INVALID_GRID = \"PUZ_INVALID_GRID\",\n  PUZ_CHECKSUM_MISMATCH = \"PUZ_CHECKSUM_MISMATCH\",\n\n  JPZ_PARSE_ERROR = \"JPZ_PARSE_ERROR\",\n  JPZ_INVALID_XML = \"JPZ_INVALID_XML\",\n  JPZ_MISSING_GRID = \"JPZ_MISSING_GRID\",\n  JPZ_INVALID_GRID = \"JPZ_INVALID_GRID\",\n\n  XD_PARSE_ERROR = \"XD_PARSE_ERROR\",\n  XD_FORMAT_ERROR = \"XD_FORMAT_ERROR\",\n  XD_INVALID_GRID = \"XD_INVALID_GRID\",\n  XD_MISSING_CLUES = \"XD_MISSING_CLUES\",\n}\n\nexport interface ErrorContext {\n  line?: number;\n  column?: number;\n  field?: string;\n  offset?: number;\n  details?: Record<string, unknown>;\n}\n","/**\n * Custom error classes for xword-parser\n */\n\nimport { ErrorCode, ErrorContext } from \"./types\";\n\n/**\n * Base error class for all parsing errors\n */\nexport class ParseError extends Error {\n  public readonly code: ErrorCode;\n  public readonly context?: ErrorContext;\n\n  constructor(\n    message: string,\n    code: ErrorCode = ErrorCode.FORMAT_DETECTION_FAILED,\n    context?: ErrorContext,\n    cause?: unknown,\n  ) {\n    super(message, { cause });\n    this.code = code;\n    this.context = context;\n  }\n\n  /**\n   * Determines if this error indicates a format mismatch (file is valid but wrong format)\n   * vs a real parsing error (file is corrupted or has other issues)\n   */\n  isFormatMismatch(): boolean {\n    return (\n      this.code === ErrorCode.UNSUPPORTED_PUZZLE_TYPE ||\n      this.code === ErrorCode.FORMAT_DETECTION_FAILED\n    );\n  }\n}\n\n/**\n * Error thrown when the input format cannot be detected\n */\nexport class FormatDetectionError extends ParseError {\n  constructor(\n    message: string = \"Unable to detect puzzle format\",\n    context?: ErrorContext,\n    cause?: unknown,\n  ) {\n    super(message, ErrorCode.FORMAT_DETECTION_FAILED, context, cause);\n  }\n}\n\n/**\n * Error thrown when a file is corrupted or invalid\n */\nexport class InvalidFileError extends ParseError {\n  constructor(\n    format: string,\n    message: string,\n    context?: ErrorContext,\n    cause?: unknown,\n  ) {\n    super(\n      `Invalid ${format} file: ${message}`,\n      ErrorCode.INVALID_FILE,\n      context,\n      cause,\n    );\n  }\n}\n\n/**\n * Error thrown when a puzzle type is not supported\n */\nexport class UnsupportedPuzzleTypeError extends ParseError {\n  constructor(puzzleType: string, context?: ErrorContext, cause?: unknown) {\n    super(\n      `${puzzleType} puzzles are not supported`,\n      ErrorCode.UNSUPPORTED_PUZZLE_TYPE,\n      context,\n      cause,\n    );\n  }\n}\n\n/**\n * Format-specific error classes\n */\nexport class IpuzParseError extends ParseError {\n  constructor(\n    message: string,\n    code: ErrorCode = ErrorCode.IPUZ_PARSE_ERROR,\n    context?: ErrorContext,\n    cause?: unknown,\n  ) {\n    super(message, code, context, cause);\n  }\n\n  override isFormatMismatch(): boolean {\n    // IPUZ_INVALID_JSON means it's not valid JSON, so likely not an iPUZ file\n    // IPUZ_MISSING_VERSION and IPUZ_MISSING_KIND mean it's JSON but not iPUZ format\n    return (\n      super.isFormatMismatch() ||\n      this.code === ErrorCode.IPUZ_INVALID_JSON ||\n      this.code === ErrorCode.IPUZ_MISSING_VERSION ||\n      this.code === ErrorCode.IPUZ_MISSING_KIND\n    );\n  }\n}\n\nexport class PuzParseError extends ParseError {\n  constructor(\n    message: string,\n    code: ErrorCode = ErrorCode.PUZ_PARSE_ERROR,\n    context?: ErrorContext,\n    cause?: unknown,\n  ) {\n    super(message, code, context, cause);\n  }\n\n  override isFormatMismatch(): boolean {\n    // PUZ_INVALID_HEADER means the file doesn't appear to be a PUZ file at all\n    // PUZ_CHECKSUM_MISMATCH is a real error - the file is corrupted\n    return (\n      super.isFormatMismatch() || this.code === ErrorCode.PUZ_INVALID_HEADER\n    );\n  }\n}\n\nexport class JpzParseError extends ParseError {\n  constructor(\n    message: string,\n    code: ErrorCode = ErrorCode.JPZ_PARSE_ERROR,\n    context?: ErrorContext,\n    cause?: unknown,\n  ) {\n    super(message, code, context, cause);\n  }\n\n  override isFormatMismatch(): boolean {\n    // JPZ_INVALID_XML means it's not valid XML, so likely not a JPZ file\n    // JPZ_MISSING_GRID could be a corrupted JPZ file, not a format mismatch\n    return super.isFormatMismatch() || this.code === ErrorCode.JPZ_INVALID_XML;\n  }\n}\n\nexport class XdParseError extends ParseError {\n  constructor(\n    message: string,\n    code: ErrorCode = ErrorCode.XD_PARSE_ERROR,\n    context?: ErrorContext,\n    cause?: unknown,\n  ) {\n    super(message, code, context, cause);\n  }\n\n  override isFormatMismatch(): boolean {\n    // XD_FORMAT_ERROR indicates the content doesn't look like XD format\n    return super.isFormatMismatch() || this.code === ErrorCode.XD_FORMAT_ERROR;\n  }\n}\n\n/**\n * Error thrown when binary data cannot be read or parsed correctly.\n * This is used by the BinaryReader class for low-level binary parsing errors.\n */\nexport class BinaryParseError extends ParseError {\n  constructor(message: string, context?: ErrorContext) {\n    super(message, ErrorCode.BINARY_PARSE_ERROR, context);\n    this.name = \"BinaryParseError\";\n  }\n}\n"],"mappings":";AAMA,MAAa,gBAAgB,MAA0B;AACvD,MAAa,oBAAoB,MAC/B;AACF,MAAa,aAAa,MAAuB;AAoDjD,IAAY,YAAL;AACL;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;KACD;;;;;;;;;;AChFD,IAAa,aAAb,cAAgC,MAAM;CACpC,AAAgB;CAChB,AAAgB;CAEhB,YACE,SACA,OAAkB,UAAU,yBAC5B,SACA,OACA;AACA,QAAM,SAAS,EAAE,OAAO,CAAC;AACzB,OAAK,OAAO;AACZ,OAAK,UAAU;;;;;;CAOjB,mBAA4B;AAC1B,SACE,KAAK,SAAS,UAAU,2BACxB,KAAK,SAAS,UAAU;;;;;;AAQ9B,IAAa,uBAAb,cAA0C,WAAW;CACnD,YACE,UAAkB,kCAClB,SACA,OACA;AACA,QAAM,SAAS,UAAU,yBAAyB,SAAS,MAAM;;;;;;AAOrE,IAAa,mBAAb,cAAsC,WAAW;CAC/C,YACE,QACA,SACA,SACA,OACA;AACA,QACE,WAAW,OAAO,SAAS,WAC3B,UAAU,cACV,SACA,MACD;;;;;;AAOL,IAAa,6BAAb,cAAgD,WAAW;CACzD,YAAY,YAAoB,SAAwB,OAAiB;AACvE,QACE,GAAG,WAAW,6BACd,UAAU,yBACV,SACA,MACD;;;;;;AAOL,IAAa,iBAAb,cAAoC,WAAW;CAC7C,YACE,SACA,OAAkB,UAAU,kBAC5B,SACA,OACA;AACA,QAAM,SAAS,MAAM,SAAS,MAAM;;CAGtC,AAAS,mBAA4B;AAGnC,SACE,MAAM,kBAAkB,IACxB,KAAK,SAAS,UAAU,qBACxB,KAAK,SAAS,UAAU,wBACxB,KAAK,SAAS,UAAU;;;AAK9B,IAAa,gBAAb,cAAmC,WAAW;CAC5C,YACE,SACA,OAAkB,UAAU,iBAC5B,SACA,OACA;AACA,QAAM,SAAS,MAAM,SAAS,MAAM;;CAGtC,AAAS,mBAA4B;AAGnC,SACE,MAAM,kBAAkB,IAAI,KAAK,SAAS,UAAU;;;AAK1D,IAAa,gBAAb,cAAmC,WAAW;CAC5C,YACE,SACA,OAAkB,UAAU,iBAC5B,SACA,OACA;AACA,QAAM,SAAS,MAAM,SAAS,MAAM;;CAGtC,AAAS,mBAA4B;AAGnC,SAAO,MAAM,kBAAkB,IAAI,KAAK,SAAS,UAAU;;;AAI/D,IAAa,eAAb,cAAkC,WAAW;CAC3C,YACE,SACA,OAAkB,UAAU,gBAC5B,SACA,OACA;AACA,QAAM,SAAS,MAAM,SAAS,MAAM;;CAGtC,AAAS,mBAA4B;AAEnC,SAAO,MAAM,kBAAkB,IAAI,KAAK,SAAS,UAAU;;;;;;;AAQ/D,IAAa,mBAAb,cAAsC,WAAW;CAC/C,YAAY,SAAiB,SAAwB;AACnD,QAAM,SAAS,UAAU,oBAAoB,QAAQ;AACrD,OAAK,OAAO"}