{"version":3,"sources":["../../index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n  Feature,\n  LineString,\n  Position,\n  GeoJSON,\n  Point,\n  Polygon,\n  GeometryCollection,\n  FeatureCollection,\n  MultiLineString,\n  MultiPoint,\n  MultiPolygon,\n  GeoJsonProperties,\n} from \"geojson\";\n\n/**\n\n * GeoJSON equality checking utility.\n * Adapted from https://github.com/geosquare/geojson-equality\n *\n * @memberof helpers\n * @type {Class}\n */\nclass GeojsonEquality {\n  private precision: number;\n  private direction = false;\n  private compareProperties = true;\n\n  constructor(opts?: {\n    precision?: number;\n    direction?: boolean;\n    compareProperties?: boolean;\n  }) {\n    this.precision = 10 ** -(opts?.precision ?? 17);\n    this.direction = opts?.direction ?? false;\n    this.compareProperties = opts?.compareProperties ?? true;\n  }\n\n  compare(g1: GeoJSON, g2: GeoJSON): boolean {\n    if (g1.type !== g2.type) {\n      return false;\n    }\n\n    if (!sameLength(g1, g2)) {\n      return false;\n    }\n\n    switch (g1.type) {\n      case \"Point\":\n        return this.compareCoord(g1.coordinates, (g2 as Point).coordinates);\n      case \"LineString\":\n        return this.compareLine(g1.coordinates, (g2 as LineString).coordinates);\n      case \"Polygon\":\n        return this.comparePolygon(g1, g2 as Polygon);\n      case \"GeometryCollection\":\n        return this.compareGeometryCollection(g1, g2 as GeometryCollection);\n      case \"Feature\":\n        return this.compareFeature(g1, g2 as Feature);\n      case \"FeatureCollection\":\n        return this.compareFeatureCollection(g1, g2 as FeatureCollection);\n      default:\n        if (g1.type.startsWith(\"Multi\")) {\n          const g1s = explode(g1);\n          const g2s = explode(\n            g2 as MultiLineString | MultiPoint | MultiPolygon\n          );\n          return g1s.every((g1part) =>\n            g2s.some((g2part) => this.compare(g1part as any, g2part as any))\n          );\n        }\n    }\n    return false;\n  }\n\n  private compareCoord(c1: Position, c2: Position) {\n    return (\n      c1.length === c2.length &&\n      c1.every((c, i) => Math.abs(c - c2[i]) < this.precision)\n    );\n  }\n\n  private compareLine(\n    path1: Position[],\n    path2: Position[],\n    ind = 0,\n    isPoly = false\n  ): boolean {\n    if (!sameLength(path1, path2)) {\n      return false;\n    }\n    const p1 = path1;\n    let p2 = path2;\n    if (isPoly && !this.compareCoord(p1[0], p2[0])) {\n      // fix start index of both to same point\n      const startIndex = this.fixStartIndex(p2, p1);\n      if (!startIndex) {\n        return false;\n      } else {\n        p2 = startIndex;\n      }\n    }\n    // for linestring ind =0 and for polygon ind =1\n    const sameDirection = this.compareCoord(p1[ind], p2[ind]);\n    if (this.direction || sameDirection) {\n      return this.comparePath(p1, p2);\n    } else {\n      if (this.compareCoord(p1[ind], p2[p2.length - (1 + ind)])) {\n        return this.comparePath(p1.slice().reverse(), p2);\n      }\n      return false;\n    }\n  }\n\n  private fixStartIndex(sourcePath: Position[], targetPath: Position[]) {\n    //make sourcePath first point same as of targetPath\n    let correctPath,\n      ind = -1;\n    for (let i = 0; i < sourcePath.length; i++) {\n      if (this.compareCoord(sourcePath[i], targetPath[0])) {\n        ind = i;\n        break;\n      }\n    }\n    if (ind >= 0) {\n      correctPath = ([] as Position[]).concat(\n        sourcePath.slice(ind, sourcePath.length),\n        sourcePath.slice(1, ind + 1)\n      );\n    }\n    return correctPath;\n  }\n\n  private comparePath(p1: Position[], p2: Position[]) {\n    return p1.every((c, i) => this.compareCoord(c, p2[i]));\n  }\n\n  private comparePolygon(g1: Polygon, g2: Polygon) {\n    if (this.compareLine(g1.coordinates[0], g2.coordinates[0], 1, true)) {\n      const holes1 = g1.coordinates.slice(1, g1.coordinates.length);\n      const holes2 = g2.coordinates.slice(1, g2.coordinates.length);\n      return holes1.every((h1) =>\n        holes2.some((h2) => this.compareLine(h1, h2, 1, true))\n      );\n    }\n    return false;\n  }\n\n  private compareGeometryCollection(\n    g1: GeometryCollection,\n    g2: GeometryCollection\n  ) {\n    return (\n      sameLength(g1.geometries, g2.geometries) &&\n      this.compareBBox(g1, g2) &&\n      g1.geometries.every((g, i) => this.compare(g, g2.geometries[i]))\n    );\n  }\n\n  private compareFeature(g1: Feature, g2: Feature) {\n    return (\n      g1.id === g2.id &&\n      (this.compareProperties ? equal(g1.properties, g2.properties) : true) &&\n      this.compareBBox(g1, g2) &&\n      this.compare(g1.geometry, g2.geometry)\n    );\n  }\n\n  private compareFeatureCollection(\n    g1: FeatureCollection,\n    g2: FeatureCollection\n  ) {\n    return (\n      sameLength(g1.features, g2.features) &&\n      this.compareBBox(g1, g2) &&\n      g1.features.every((f, i) => this.compare(f, g2.features[i]))\n    );\n  }\n\n  private compareBBox(g1: GeoJSON, g2: GeoJSON): boolean {\n    return (\n      Boolean(!g1.bbox && !g2.bbox) ||\n      (g1.bbox && g2.bbox ? this.compareCoord(g1.bbox, g2.bbox) : false)\n    );\n  }\n}\n\nfunction sameLength(g1: any, g2: any) {\n  return g1.coordinates\n    ? g1.coordinates.length === g2.coordinates.length\n    : g1.length === g2.length;\n}\n\nfunction explode(g: MultiLineString | MultiPoint | MultiPolygon) {\n  return g.coordinates.map((part) => ({\n    type: g.type.replace(\"Multi\", \"\"),\n    coordinates: part,\n  }));\n}\n\nfunction geojsonEquality(\n  g1: GeoJSON,\n  g2: GeoJSON,\n  opts?: {\n    precision?: number;\n    direction?: boolean;\n    compareProperties?: boolean;\n  }\n): boolean {\n  const eq = new GeojsonEquality(opts);\n\n  return eq.compare(g1, g2);\n}\n\n// Adapted from https://medium.com/syncfusion/5-different-ways-to-deep-compare-javascript-objects-6708a0da9f05\nfunction equal(object1: GeoJsonProperties, object2: GeoJsonProperties) {\n  if (object1 === null && object2 === null) {\n    return true;\n  }\n\n  if (object1 === null || object2 === null) {\n    return false;\n  }\n\n  const objKeys1 = Object.keys(object1);\n  const objKeys2 = Object.keys(object2);\n\n  if (objKeys1.length !== objKeys2.length) return false;\n\n  for (var key of objKeys1) {\n    const value1 = object1[key];\n    const value2 = object2[key];\n\n    const isObjects = isObject(value1) && isObject(value2);\n\n    if (\n      (isObjects && !equal(value1, value2)) ||\n      (!isObjects && value1 !== value2)\n    ) {\n      return false;\n    }\n  }\n  return true;\n}\n\nconst isObject = (object: any) => {\n  return object != null && typeof object === \"object\";\n};\n\nexport { GeojsonEquality, geojsonEquality };\nexport default GeojsonEquality;\n"]}