{"version":3,"sources":["../../index.ts"],"sourcesContent":["import type {\n Feature,\n Position,\n GeometryCollection,\n Geometry,\n LineString,\n MultiLineString,\n MultiPolygon,\n Polygon,\n FeatureCollection,\n} from \"geojson\";\nimport { clone } from \"@turf/clone\";\nimport { booleanClockwise } from \"@turf/boolean-clockwise\";\nimport { geomEach, featureEach } from \"@turf/meta\";\nimport { getCoords } from \"@turf/invariant\";\nimport { featureCollection, isObject } from \"@turf/helpers\";\nimport type { AllGeoJSON } from \"@turf/helpers\";\n\n/**\n * Rewind {@link LineString|(Multi)LineString} or {@link Polygon|(Multi)Polygon} outer ring counterclockwise and inner rings clockwise (Uses {@link http://en.wikipedia.org/wiki/Shoelace_formula|Shoelace Formula}).\n *\n * @function\n * @param {GeoJSON} geojson input GeoJSON Polygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.reverse=false] enable reverse winding\n * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)\n * @returns {GeoJSON} rewind Polygon\n * @example\n * var polygon = turf.polygon([[[121, -29], [138, -29], [138, -18], [121, -18], [121, -29]]]);\n *\n * var rewind = turf.rewind(polygon);\n *\n * //addToMap\n * var addToMap = [rewind];\n */\nfunction rewind(\n geojson: T,\n options: {\n reverse?: boolean;\n mutate?: boolean;\n } = {}\n): Geometry | Feature | FeatureCollection {\n // Optional parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n const mutate = options.mutate ?? false;\n const reverse = options.reverse ?? false;\n\n // validation\n if (!geojson) throw new Error(\" is required\");\n if (typeof reverse !== \"boolean\")\n throw new Error(\" must be a boolean\");\n if (typeof mutate !== \"boolean\")\n throw new Error(\" must be a boolean\");\n\n // Prevent input mutation if requested and necessary.\n if (!mutate && geojson.type !== \"Point\" && geojson.type !== \"MultiPoint\") {\n geojson = clone(geojson);\n }\n\n // Support Feature Collection or Geometry Collection\n const results: Feature[] = [];\n switch (geojson.type) {\n case \"GeometryCollection\":\n geomEach(geojson, function (geometry) {\n rewindFeature(geometry, reverse);\n });\n return geojson;\n case \"FeatureCollection\":\n featureEach(geojson, function (feature) {\n const rewoundFeature = rewindFeature(feature, reverse) as Feature;\n featureEach(rewoundFeature, function (result) {\n results.push(result);\n });\n });\n return featureCollection(results);\n }\n // Support Feature or Geometry Objects\n return rewindFeature(geojson, reverse);\n}\n\n/**\n * Rewind\n *\n * @private\n * @param {Geometry|Feature} geojson Geometry or Feature\n * @param {Boolean} [reverse=false] enable reverse winding\n * @returns {Geometry|Feature} rewind Geometry or Feature\n */\nfunction rewindFeature(\n geojson: Geometry | GeometryCollection | Feature,\n reverse: boolean\n) {\n const type =\n geojson.type === \"Feature\" ? geojson.geometry.type : geojson.type;\n\n // Support all GeoJSON Geometry Objects\n switch (type) {\n case \"GeometryCollection\":\n geomEach(geojson, function (geometry) {\n rewindFeature(geometry, reverse);\n });\n return geojson;\n case \"LineString\":\n rewindLineString(getCoords(geojson as LineString), reverse);\n return geojson;\n case \"Polygon\":\n rewindPolygon(getCoords(geojson as Polygon), reverse);\n return geojson;\n case \"MultiLineString\":\n getCoords(geojson as MultiLineString).forEach(function (lineCoords) {\n rewindLineString(lineCoords, reverse);\n });\n return geojson;\n case \"MultiPolygon\":\n getCoords(geojson as MultiPolygon).forEach(function (lineCoords) {\n rewindPolygon(lineCoords, reverse);\n });\n return geojson;\n case \"Point\":\n case \"MultiPoint\":\n // noop\n return geojson;\n }\n}\n\n/**\n * Rewind LineString - outer ring clockwise\n *\n * @private\n * @param {Array>} coords GeoJSON LineString geometry coordinates\n * @param {Boolean} [reverse=false] enable reverse winding\n * @returns {void} mutates coordinates\n */\nfunction rewindLineString(coords: Position[], reverse: boolean) {\n if (booleanClockwise(coords) === reverse) coords.reverse();\n}\n\n/**\n * Rewind Polygon - outer ring counterclockwise and inner rings clockwise.\n *\n * @private\n * @param {Array>>} coords GeoJSON Polygon geometry coordinates\n * @param {Boolean} [reverse=false] enable reverse winding\n * @returns {void} mutates coordinates\n */\nfunction rewindPolygon(coords: Position[][], reverse: boolean) {\n // outer ring\n if (booleanClockwise(coords[0]) !== reverse) {\n coords[0].reverse();\n }\n // inner rings\n for (let i = 1; i < coords.length; i++) {\n if (booleanClockwise(coords[i]) === reverse) {\n coords[i].reverse();\n }\n }\n}\n\nexport { rewind };\nexport default rewind;\n"],"mappings":";AAWA,SAAS,aAAa;AACtB,SAAS,wBAAwB;AACjC,SAAS,UAAU,mBAAmB;AACtC,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB,gBAAgB;AAoB5C,SAAS,OACP,SACA,UAGI,CAAC,GACmC;AAzC1C;AA2CE,YAAU,WAAW,CAAC;AACtB,MAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAC5D,QAAM,UAAS,aAAQ,WAAR,YAAkB;AACjC,QAAM,WAAU,aAAQ,YAAR,YAAmB;AAGnC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,uBAAuB;AACrD,MAAI,OAAO,YAAY;AACrB,UAAM,IAAI,MAAM,6BAA6B;AAC/C,MAAI,OAAO,WAAW;AACpB,UAAM,IAAI,MAAM,4BAA4B;AAG9C,MAAI,CAAC,UAAU,QAAQ,SAAS,WAAW,QAAQ,SAAS,cAAc;AACxE,cAAU,MAAM,OAAO;AAAA,EACzB;AAGA,QAAM,UAAqB,CAAC;AAC5B,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,eAAS,SAAS,SAAU,UAAU;AACpC,sBAAc,UAAU,OAAO;AAAA,MACjC,CAAC;AACD,aAAO;AAAA,IACT,KAAK;AACH,kBAAY,SAAS,SAAU,SAAS;AACtC,cAAM,iBAAiB,cAAc,SAAS,OAAO;AACrD,oBAAY,gBAAgB,SAAU,QAAQ;AAC5C,kBAAQ,KAAK,MAAM;AAAA,QACrB,CAAC;AAAA,MACH,CAAC;AACD,aAAO,kBAAkB,OAAO;AAAA,EACpC;AAEA,SAAO,cAAc,SAAS,OAAO;AACvC;AAUA,SAAS,cACP,SACA,SACA;AACA,QAAM,OACJ,QAAQ,SAAS,YAAY,QAAQ,SAAS,OAAO,QAAQ;AAG/D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,eAAS,SAAS,SAAU,UAAU;AACpC,sBAAc,UAAU,OAAO;AAAA,MACjC,CAAC;AACD,aAAO;AAAA,IACT,KAAK;AACH,uBAAiB,UAAU,OAAqB,GAAG,OAAO;AAC1D,aAAO;AAAA,IACT,KAAK;AACH,oBAAc,UAAU,OAAkB,GAAG,OAAO;AACpD,aAAO;AAAA,IACT,KAAK;AACH,gBAAU,OAA0B,EAAE,QAAQ,SAAU,YAAY;AAClE,yBAAiB,YAAY,OAAO;AAAA,MACtC,CAAC;AACD,aAAO;AAAA,IACT,KAAK;AACH,gBAAU,OAAuB,EAAE,QAAQ,SAAU,YAAY;AAC/D,sBAAc,YAAY,OAAO;AAAA,MACnC,CAAC;AACD,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAEH,aAAO;AAAA,EACX;AACF;AAUA,SAAS,iBAAiB,QAAoB,SAAkB;AAC9D,MAAI,iBAAiB,MAAM,MAAM,QAAS,QAAO,QAAQ;AAC3D;AAUA,SAAS,cAAc,QAAsB,SAAkB;AAE7D,MAAI,iBAAiB,OAAO,CAAC,CAAC,MAAM,SAAS;AAC3C,WAAO,CAAC,EAAE,QAAQ;AAAA,EACpB;AAEA,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,iBAAiB,OAAO,CAAC,CAAC,MAAM,SAAS;AAC3C,aAAO,CAAC,EAAE,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AAGA,IAAO,sBAAQ;","names":[]}