{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["import { IDmc } from \"./types\";\n\nexport function coordinateToDmc(coordinate: number): IDmc {\n\tconst degreesFloat = Math.abs(coordinate);\n\tconst degreesInt = Math.floor(degreesFloat);\n\n\tconst minutesFloat = (degreesFloat - degreesInt) * 60;\n\tconst minutesInt = Math.floor(minutesFloat);\n\n\tconst centiminutesFloat = (minutesFloat - minutesInt) * 100;\n\tconst centiminutesInt = Math.floor(centiminutesFloat);\n\n\treturn {\n\t\tdegrees: degreesInt,\n\t\tminutes: minutesInt,\n\t\tcentiminutes: centiminutesInt,\n\t};\n}\n\nexport function dmcToString(dmc: IDmc): string {\n\tconst { degrees, minutes, centiminutes } = dmc;\n\treturn `${degrees}° ${minutes}.${centiminutes}'`;\n}\n\n\nexport function dmcToDecimal(dmcParts: RegExpMatchArray) {\n\tconst degrees = parseInt(dmcParts[1], 10);\n\tconst minutes = parseInt(dmcParts[2], 10);\n\tconst centiminutes = parseInt(dmcParts[3], 10);\n  const hemisphere = dmcParts[4];\n  \n\tif (!isInRange(degrees, 0, 180)) {\n\t\tthrow new Error(\"degrees are not in range [0, 180]\");\n\t}\n\n\tif (!isInRange(minutes, 0, 60)) {\n\t\tthrow new Error(\"minutes are not in range [0, 60]\");\n\t}\n\n\tif (!isInRange(centiminutes, 0, 100)) {\n\t\tthrow new Error(\"centiminutes are not in range [0, 100]\");\n\t}\n\n\tlet decimal = degrees + minutes / 60 + centiminutes / 60 / 100;\n\t// keep 3 decimal, after that we loose precision\n\tdecimal = Math.floor(decimal * 1000) / 1000;\n\treturn hemisphere === \"N\" || hemisphere === \"E\" ? decimal : -decimal;\n}\n\nfunction isInRange(value: number, start: number, stop: number) {\n\treturn value >= start && value <= stop;\n}\n","import { coordinateToDmc, dmcToString, dmcToDecimal } from \"./utils\"\nimport { ICoordinates } from \"./types\";\n\n/**\n * Convert lat, lng coordinates into DMC string.\n * Return an empty string if lat, lng object is not valid.\n * @param coordinates {lat, lng} coordinates object\n * @return DMC string\n */\nexport function toDMC(coordinates: ICoordinates) {\n\tif (!coordinates || !(coordinates.lat && coordinates.lng)) {\n\t\tthrow new Error(\"You should provide a coordinates object {lat, lng}\");\n\t}\n\n\tconst { lat, lng } = coordinates;\n\n\tconst north = lat > 0;\n\tconst east = lng > 0;\n\n\tconst lngDMC = coordinateToDmc(lng);\n\tconst latDMC = coordinateToDmc(lat);\n\n\tconst lngString = dmcToString(lngDMC);\n\tconst latString = dmcToString(latDMC);\n\n\treturn `${latString} ${north ? \"N\" : \"S\"} ${lngString} ${east ? \"E\" : \"W\"}`;\n}\n\n/**\n * Convert a DMC string (e.g.: 24° 30' 21cmin N 35° 10' 72cmin E) into a lat, lng object.\n * @param dmc DMC (degree, minute, centiminute) string\n * @return Promise<LatLng>\n */\nexport function toLatLng(dmc: string) {\n\tconst regex: RegExp = /(\\d+)[°\\s]?\\s?(\\d+)[.\\s]?\\s?(\\d+)['\\s]?\\s?([NSEW])?/i;\n\tconst dmcLat = dmc.match(regex);\n\n  if (!dmcLat) {\n    throw new Error(\"Could not parse dmc string. Latitude part is invalid...\")\n  }\n\n  // remove lat part from dmc string\n\tconst dmcLngString = dmc.substring(dmcLat[0].length - 1).trim();\n\tconst dmcLng = dmcLngString.match(regex);\n\n  if (!dmcLng) {\n    throw new Error(\"Could not parse dmc string. Longitude part is invalid...\");\n  }\n\n\treturn {\n    lat: dmcToDecimal(dmcLat),\n    lng: dmcToDecimal(dmcLng),\n  }\n}"],"mappings":";AAEO,SAAS,gBAAgB,YAA0B;AACzD,QAAM,eAAe,KAAK,IAAI,UAAU;AACxC,QAAM,aAAa,KAAK,MAAM,YAAY;AAE1C,QAAM,gBAAgB,eAAe,cAAc;AACnD,QAAM,aAAa,KAAK,MAAM,YAAY;AAE1C,QAAM,qBAAqB,eAAe,cAAc;AACxD,QAAM,kBAAkB,KAAK,MAAM,iBAAiB;AAEpD,SAAO;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,cAAc;AAAA,EACf;AACD;AAEO,SAAS,YAAY,KAAmB;AAC9C,QAAM,EAAE,SAAS,SAAS,aAAa,IAAI;AAC3C,SAAO,GAAG,OAAO,QAAK,OAAO,IAAI,YAAY;AAC9C;AAGO,SAAS,aAAa,UAA4B;AACxD,QAAM,UAAU,SAAS,SAAS,CAAC,GAAG,EAAE;AACxC,QAAM,UAAU,SAAS,SAAS,CAAC,GAAG,EAAE;AACxC,QAAM,eAAe,SAAS,SAAS,CAAC,GAAG,EAAE;AAC5C,QAAM,aAAa,SAAS,CAAC;AAE9B,MAAI,CAAC,UAAU,SAAS,GAAG,GAAG,GAAG;AAChC,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACpD;AAEA,MAAI,CAAC,UAAU,SAAS,GAAG,EAAE,GAAG;AAC/B,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACnD;AAEA,MAAI,CAAC,UAAU,cAAc,GAAG,GAAG,GAAG;AACrC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EACzD;AAEA,MAAI,UAAU,UAAU,UAAU,KAAK,eAAe,KAAK;AAE3D,YAAU,KAAK,MAAM,UAAU,GAAI,IAAI;AACvC,SAAO,eAAe,OAAO,eAAe,MAAM,UAAU,CAAC;AAC9D;AAEA,SAAS,UAAU,OAAe,OAAe,MAAc;AAC9D,SAAO,SAAS,SAAS,SAAS;AACnC;;;AC1CO,SAAS,MAAM,aAA2B;AAChD,MAAI,CAAC,eAAe,EAAE,YAAY,OAAO,YAAY,MAAM;AAC1D,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACrE;AAEA,QAAM,EAAE,KAAK,IAAI,IAAI;AAErB,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,MAAM;AAEnB,QAAM,SAAS,gBAAgB,GAAG;AAClC,QAAM,SAAS,gBAAgB,GAAG;AAElC,QAAM,YAAY,YAAY,MAAM;AACpC,QAAM,YAAY,YAAY,MAAM;AAEpC,SAAO,GAAG,SAAS,IAAI,QAAQ,MAAM,GAAG,IAAI,SAAS,IAAI,OAAO,MAAM,GAAG;AAC1E;AAOO,SAAS,SAAS,KAAa;AACrC,QAAM,QAAgB;AACtB,QAAM,SAAS,IAAI,MAAM,KAAK;AAE7B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAGD,QAAM,eAAe,IAAI,UAAU,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,KAAK;AAC9D,QAAM,SAAS,aAAa,MAAM,KAAK;AAEtC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAED,SAAO;AAAA,IACJ,KAAK,aAAa,MAAM;AAAA,IACxB,KAAK,aAAa,MAAM;AAAA,EAC1B;AACF;","names":[]}