{"version":3,"sources":["/home/runner/work/turf/turf/packages/turf-clean-coords/dist/cjs/index.cjs","../../index.ts"],"names":[],"mappings":"AAAA;ACCA,wCAAwB;AACxB,4CAAmC;AACnC,iEAAmC;AACnC;AAsBA,SAAS,WAAA,CACP,OAAA,EACA,QAAA,EAEI,CAAC,CAAA,EACL;AAEA,EAAA,IAAI,OAAA,EAAS,OAAO,QAAA,IAAY,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAS,OAAA;AAC5D,EAAA,GAAA,CAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,qBAAqB,CAAA;AACnD,EAAA,IAAI,KAAA,EAAO,gCAAA,OAAe,CAAA;AAG1B,EAAA,IAAI,UAAA,EAAY,CAAC,CAAA;AAEjB,EAAA,OAAA,CAAQ,IAAA,EAAM;AAAA,IACZ,KAAK,YAAA;AACH,MAAA,UAAA,EAAY,SAAA,CAAU,OAAA,EAAS,IAAI,CAAA;AACnC,MAAA,KAAA;AAAA,IACF,KAAK,iBAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,kCAAA,OAAiB,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAU,IAAA,EAAM;AACzC,QAAA,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,MACtC,CAAC,CAAA;AACD,MAAA,KAAA;AAAA,IACF,KAAK,cAAA;AACH,MAAA,kCAAA,OAAiB,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAU,QAAA,EAAe;AAClD,QAAA,IAAI,WAAA,EAAyB,CAAC,CAAA;AAC9B,QAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAU,IAAA,EAAkB;AAC3C,UAAA,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,QACvC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAAA,MAC3B,CAAC,CAAA;AACD,MAAA,KAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,IAAI,SAAA,EAAiC,CAAC,CAAA;AACtC,MAAA,kCAAA,OAAiB,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAU,KAAA,EAAY;AAC/C,QAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACxB,QAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,GAAG,CAAA,EAAG;AACxD,UAAA,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACpB,UAAA,QAAA,CAAS,GAAG,EAAA,EAAI,IAAA;AAAA,QAClB;AAAA,MACF,CAAC,CAAA;AACD,MAAA,KAAA;AAAA,IACF,OAAA;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,EAAO,yBAAyB,CAAA;AAAA,EACpD;AAGA,EAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa;AACvB,IAAA,GAAA,CAAI,OAAA,IAAW,IAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,YAAA,EAAc,SAAA;AACtB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAE,IAAA,EAAY,WAAA,EAAa,UAAU,CAAA;AAAA,EAC9C,EAAA,KAAO;AACL,IAAA,GAAA,CAAI,OAAA,IAAW,IAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,QAAA,CAAS,YAAA,EAAc,SAAA;AAC/B,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,8BAAA,EAAU,IAAA,EAAY,WAAA,EAAa,UAAU,CAAA,EAAG,OAAA,CAAQ,UAAA,EAAY;AAAA,MACzE,IAAA,EAAM,OAAA,CAAQ,IAAA;AAAA,MACd,EAAA,EAAI,OAAA,CAAQ;AAAA,IACd,CAAC,CAAA;AAAA,EACH;AACF;AAUA,SAAS,SAAA,CAAU,IAAA,EAAkB,IAAA,EAAc;AACjD,EAAA,MAAM,OAAA,EAAS,kCAAA,IAAc,CAAA;AAE7B,EAAA,GAAA,CAAI,MAAA,CAAO,OAAA,IAAW,EAAA,GAAK,CAAC,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,OAAO,MAAA;AAEjE,EAAA,MAAM,UAAA,EAAY,CAAC,CAAA;AAKnB,EAAA,IAAI,EAAA,EAAI,CAAA,EACN,EAAA,EAAI,CAAA,EACJ,EAAA,EAAI,CAAA;AAGN,EAAA,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAExB,EAAA,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,MAAA,EAAQ;AACxB,IAAA,GAAA,CAAI,oDAAA,MAAmB,CAAO,CAAC,CAAA,EAAG,iCAAA,CAAY,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG;AAGrE,MAAA,EAAA,EAAI,CAAA;AAAA,IACN,EAAA,KAAO;AAGL,MAAA,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAIxB,MAAA,EAAA,EAAI,CAAA;AACJ,MAAA,CAAA,EAAA;AACA,MAAA,EAAA,EAAI,CAAA;AAAA,IACN;AAEA,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAExB,EAAA,GAAA,CAAI,KAAA,IAAS,UAAA,GAAa,KAAA,IAAS,cAAA,EAAgB;AAOjD,IAAA,GAAA,CACE,oDAAA;AAAA,MACE,SAAA,CAAU,CAAC,CAAA;AAAA,MACX,iCAAA,CAAY,SAAA,CAAU,CAAC,CAAA,EAAG,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,CAAC,CAAC,CAAC;AAAA,IAC5D,CAAA,EACA;AACA,MAAA,SAAA,CAAU,KAAA,CAAM,CAAA;AAChB,MAAA,SAAA,CAAU,GAAA,CAAI,CAAA;AACd,MAAA,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,IAC7B;AAGA,IAAA,GAAA,CAAI,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA;AAAA,IACxD;AACA,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,CAAC,CAAC,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA;AAAA,IACpE;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAUA,SAAS,MAAA,CAAO,GAAA,EAAe,GAAA,EAAe;AAC5C,EAAA,OAAO,GAAA,CAAI,CAAC,EAAA,IAAM,GAAA,CAAI,CAAC,EAAA,GAAK,GAAA,CAAI,CAAC,EAAA,IAAM,GAAA,CAAI,CAAC,CAAA;AAC9C;AAGA,IAAO,cAAA,EAAQ,WAAA;ADnFf;AACE;AACA;AACF,mEAAC","file":"/home/runner/work/turf/turf/packages/turf-clean-coords/dist/cjs/index.cjs","sourcesContent":[null,"import { Position } from \"geojson\";\nimport { feature } from \"@turf/helpers\";\nimport { getCoords, getType } from \"@turf/invariant\";\nimport { booleanPointOnLine } from \"@turf/boolean-point-on-line\";\nimport { lineString } from \"@turf/helpers\";\n\n// To-Do => Improve Typescript GeoJSON handling\n\n/**\n * Removes redundant coordinates from any GeoJSON Geometry.\n *\n * @function\n * @param {Geometry|Feature} geojson Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated\n * @returns {Geometry|Feature} the cleaned input Feature/Geometry\n * @example\n * var line = turf.lineString([[0, 0], [0, 2], [0, 5], [0, 8], [0, 8], [0, 10]]);\n * var multiPoint = turf.multiPoint([[0, 0], [0, 0], [2, 2]]);\n *\n * turf.cleanCoords(line).geometry.coordinates;\n * //= [[0, 0], [0, 10]]\n *\n * turf.cleanCoords(multiPoint).geometry.coordinates;\n * //= [[0, 0], [2, 2]]\n */\nfunction cleanCoords(\n  geojson: any,\n  options: {\n    mutate?: boolean;\n  } = {}\n) {\n  // Backwards compatible with v4.0\n  var mutate = typeof options === \"object\" ? options.mutate : options;\n  if (!geojson) throw new Error(\"geojson is required\");\n  var type = getType(geojson);\n\n  // Store new \"clean\" points in this Array\n  var newCoords = [];\n\n  switch (type) {\n    case \"LineString\":\n      newCoords = cleanLine(geojson, type);\n      break;\n    case \"MultiLineString\":\n    case \"Polygon\":\n      getCoords(geojson).forEach(function (line) {\n        newCoords.push(cleanLine(line, type));\n      });\n      break;\n    case \"MultiPolygon\":\n      getCoords(geojson).forEach(function (polygons: any) {\n        var polyPoints: Position[] = [];\n        polygons.forEach(function (ring: Position[]) {\n          polyPoints.push(cleanLine(ring, type));\n        });\n        newCoords.push(polyPoints);\n      });\n      break;\n    case \"Point\":\n      return geojson;\n    case \"MultiPoint\":\n      var existing: Record<string, true> = {};\n      getCoords(geojson).forEach(function (coord: any) {\n        var key = coord.join(\"-\");\n        if (!Object.prototype.hasOwnProperty.call(existing, key)) {\n          newCoords.push(coord);\n          existing[key] = true;\n        }\n      });\n      break;\n    default:\n      throw new Error(type + \" geometry not supported\");\n  }\n\n  // Support input mutation\n  if (geojson.coordinates) {\n    if (mutate === true) {\n      geojson.coordinates = newCoords;\n      return geojson;\n    }\n    return { type: type, coordinates: newCoords };\n  } else {\n    if (mutate === true) {\n      geojson.geometry.coordinates = newCoords;\n      return geojson;\n    }\n    return feature({ type: type, coordinates: newCoords }, geojson.properties, {\n      bbox: geojson.bbox,\n      id: geojson.id,\n    });\n  }\n}\n\n/**\n * Clean Coords\n *\n * @private\n * @param {Array<number>|LineString} line Line\n * @param {string} type Type of geometry\n * @returns {Array<number>} Cleaned coordinates\n */\nfunction cleanLine(line: Position[], type: string) {\n  const points = getCoords(line);\n  // handle \"clean\" segment\n  if (points.length === 2 && !equals(points[0], points[1])) return points;\n\n  const newPoints = [];\n\n  // Segments based approach. With initial segment a-b, keep comparing to a\n  // longer segment a-c and as long as b is still on a-c, b is a redundant\n  // point.\n  let a = 0,\n    b = 1,\n    c = 2;\n\n  // Guaranteed we'll use the first point.\n  newPoints.push(points[a]);\n  // While there is still room to extend the segment ...\n  while (c < points.length) {\n    if (booleanPointOnLine(points[b], lineString([points[a], points[c]]))) {\n      // b is on a-c, so we can discard point b, and extend a-b to be the same\n      // as a-c as the basis for comparison during the next iteration.\n      b = c;\n    } else {\n      // b is NOT on a-c, suggesting a-c is not an extension of a-b. Commit a-b\n      // as a necessary segment.\n      newPoints.push(points[b]);\n\n      // Make our a-b for the next iteration start from the end of the segment\n      // that was just locked in i.e. next a-b should be the current b-(b+1).\n      a = b;\n      b++;\n      c = b;\n    }\n    // Plan to look at the next point during the next iteration.\n    c++;\n  }\n  // No remaining points, so commit the current a-b segment.\n  newPoints.push(points[b]);\n\n  if (type === \"Polygon\" || type === \"MultiPolygon\") {\n    // For polygons need to make sure the start / end point wasn't one of the\n    // points that needed to be cleaned.\n    // https://github.com/Turfjs/turf/issues/2406\n    // For points [a, b, c, ..., z, a]\n    // if a is on line b-z, it too can be removed. New array becomes\n    // [b, c, ..., z, b]\n    if (\n      booleanPointOnLine(\n        newPoints[0],\n        lineString([newPoints[1], newPoints[newPoints.length - 2]])\n      )\n    ) {\n      newPoints.shift(); // Discard starting point.\n      newPoints.pop(); // Discard closing point.\n      newPoints.push(newPoints[0]); // Duplicate the new closing point to end of array.\n    }\n\n    // (Multi)Polygons must have at least 4 points and be closed.\n    if (newPoints.length < 4) {\n      throw new Error(\"invalid polygon, fewer than 4 points\");\n    }\n    if (!equals(newPoints[0], newPoints[newPoints.length - 1])) {\n      throw new Error(\"invalid polygon, first and last points not equal\");\n    }\n  }\n\n  return newPoints;\n}\n\n/**\n * Compares two points and returns if they are equals\n *\n * @private\n * @param {Position} pt1 point\n * @param {Position} pt2 point\n * @returns {boolean} true if they are equals\n */\nfunction equals(pt1: Position, pt2: Position) {\n  return pt1[0] === pt2[0] && pt1[1] === pt2[1];\n}\n\nexport { cleanCoords };\nexport default cleanCoords;\n"]}