function parseImportString()

in modules/editor/src/lib/importer.ts [103:192]


function parseImportString(data: string): Promise<ImportData> {
  data = data.trim();
  let validData: ValidImportData | null | undefined;
  const validationErrors: string[] = [];
  if (shouldTryGeoJson(data)) {
    // Parse as GeoJSON
    try {
      const parsed = JSON.parse(data);
      validData = {
        valid: true,
        type: 'GeoJSON',
        features: getCleanedFeatures(parsed),
      };
    } catch (err) {
      validationErrors.push('Error parsing GeoJSON');
      validationErrors.push(err.toString());
    }
  } else if (shouldTryKml(data)) {
    // Parse as KML
    const xml = new DOMParser().parseFromString(data, 'text/xml');

    try {
      const parsed = kml(xml);

      /*
      TODO: Revisit using loaders.gl/kml for this later
      const parsed_ = parseSync(data, KMLasGeoJsonLoader);
      // This is changing the coordinates to floats, because in loaders.gl/kml 2.1.1 they are returned as strings.
      const parsed = {
        ...parsed_,
        features: parsed_.features.map(f => ({
          ...f,
          geometry: {
            ...f.geometry,
            coordinates: f.geometry.coordinates.map(coords => coords.map(triple => triple.map(s => Number.parseFloat(s))))
          }
        }))
      };
      */
      const isFeature = parsed && parsed.type === 'Feature';
      const isFeatureCollectionWithFeatures =
        parsed && parsed.type === 'FeatureCollection' && parsed.features.length > 0;
      const isValid = isFeature || isFeatureCollectionWithFeatures;
      if (isValid) {
        validData = {
          valid: true,
          type: 'KML',
          features: getCleanedFeatures(parsed),
        };
      } else {
        validationErrors.push('Invalid KML');
      }
    } catch (err) {
      validationErrors.push('Error parsing KML');
      validationErrors.push(err.toString());
    }
  } else if (shouldTryWkt(data)) {
    try {
      const parsed = parseSync(data, WKTLoader);
      if (parsed) {
        validData = {
          valid: true,
          type: 'WKT',
          features: [
            {
              type: 'Feature',
              properties: {},
              geometry: parsed,
            },
          ],
        };
      } else {
        validationErrors.push('Invalid WKT');
      }
    } catch (err) {
      validationErrors.push('Error parsing WKT');
      validationErrors.push(err.toString());
    }
  } else {
    validationErrors.push('Unknown data format');
  }

  if (validData) {
    return Promise.resolve(validData);
  }
  return Promise.resolve({
    valid: false,
    validationErrors,
  });
}