Source: helpers/project.js

import { geoPath } from "d3-geo";

/**
 * @function project
 * @description Projects a GeoJSON FeatureCollection using a D3 projection.
 * @param {object} data - GeoJSON FeatureCollection
 * @param {object} options
 * @property {function} options.projection - D3 projection function (e.g., d3.geoOrthographic(), d3.geoMercator())
 * @returns {object} - new GeoJSON FeatureCollection with projected coordinates
 *
 * @example
 * import { geoOrthographic } from "d3-geo-projection";
 * const projected = geoproject(world, { projection: geoOrthographic() });
 */
export function project(data, { projection = null } = {}) {
  if (!projection) return data; // if no projection, return original

  function projectCoords(coords) {
    if (typeof coords[0] === "number") {
      // [lon, lat] => [x, y]
      return projection(coords);
    } else {
      // Array of coordinates (nested for LineString, Polygon, MultiPolygon)
      return coords.map(projectCoords);
    }
  }

  const projectedFeatures = data.features.map((feat) => ({
    ...feat,
    geometry: {
      ...feat.geometry,
      coordinates: projectCoords(feat.geometry.coordinates),
    },
  }));

  return { ...data, features: projectedFeatures };
}