From 2f579b31ad75646aef431aa011cefea0b11a0e31 Mon Sep 17 00:00:00 2001 From: Matthew Fedderly <24275386+mfedderly@users.noreply.github.com> Date: Mon, 5 Jan 2026 08:52:57 -0500 Subject: [PATCH] Migrate @turf/buffer to TypeScript, ignoring errors --- packages/turf-buffer/index.d.ts | 42 ---------------- packages/turf-buffer/{index.js => index.ts} | 56 +++++++++++++++------ packages/turf-buffer/package.json | 5 +- pnpm-lock.yaml | 44 ++++++++++++---- 4 files changed, 79 insertions(+), 68 deletions(-) delete mode 100644 packages/turf-buffer/index.d.ts rename packages/turf-buffer/{index.js => index.ts} (78%) diff --git a/packages/turf-buffer/index.d.ts b/packages/turf-buffer/index.d.ts deleted file mode 100644 index 0141860184..0000000000 --- a/packages/turf-buffer/index.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - Point, - LineString, - Polygon, - MultiPoint, - MultiLineString, - MultiPolygon, - GeometryObject, - GeometryCollection, - Feature, - FeatureCollection, -} from "geojson"; -import { Units } from "@turf/helpers"; - -interface Options { - units?: Units; - steps?: number; -} - -/** - * http://turfjs.org/docs/#buffer - */ -declare function buffer( - feature: - | Feature - | Point - | LineString - | Polygon - | MultiPoint - | MultiLineString - | MultiPolygon, - radius?: number, - options?: Options -): Feature | undefined; -declare function buffer( - feature: FeatureCollection | GeometryCollection, - radius?: number, - options?: Options -): FeatureCollection | undefined; - -export { buffer }; -export default buffer; diff --git a/packages/turf-buffer/index.js b/packages/turf-buffer/index.ts similarity index 78% rename from packages/turf-buffer/index.js rename to packages/turf-buffer/index.ts index c059be84b8..075e79ba74 100644 --- a/packages/turf-buffer/index.js +++ b/packages/turf-buffer/index.ts @@ -1,14 +1,23 @@ import { center } from "@turf/center"; +// @ts-expect-error We're hopefully dropping @turf/jsts entirely soon, so lets just go without types for now import jsts from "@turf/jsts"; import { geomEach, featureEach } from "@turf/meta"; -import { geoAzimuthalEquidistant } from "d3-geo"; +import { geoAzimuthalEquidistant, GeoProjection } from "d3-geo"; import { feature, featureCollection, radiansToLength, lengthToRadians, earthRadius, + Units, } from "@turf/helpers"; +import { + Feature, + FeatureCollection, + GeometryCollection, + MultiPolygon, + Polygon, +} from "geojson"; const { BufferOp, GeoJSONReader, GeoJSONWriter } = jsts; @@ -35,7 +44,13 @@ const { BufferOp, GeoJSONReader, GeoJSONWriter } = jsts; * //addToMap * var addToMap = [point, buffered] */ -function buffer(geojson, radius, options) { +function buffer( + geojson: T, + radius?: number, + options?: { units?: Units; steps?: number } +): T extends FeatureCollection | GeometryCollection + ? FeatureCollection | undefined + : Feature | undefined { // Optional params options = options || {}; @@ -52,26 +67,26 @@ function buffer(geojson, radius, options) { if (radius === undefined) throw new Error("radius is required"); if (steps <= 0) throw new Error("steps must be greater than 0"); - var results = []; + var results: any[] = []; switch (geojson.type) { case "GeometryCollection": geomEach(geojson, function (geometry) { var buffered = bufferFeature(geometry, radius, units, steps); if (buffered) results.push(buffered); }); - return featureCollection(results); + return featureCollection(results) as any; case "FeatureCollection": featureEach(geojson, function (feature) { var multiBuffered = bufferFeature(feature, radius, units, steps); if (multiBuffered) { - featureEach(multiBuffered, function (buffered) { + featureEach(multiBuffered as Feature, function (buffered) { if (buffered) results.push(buffered); }); } }); - return featureCollection(results); + return featureCollection(results) as any; } - return bufferFeature(geojson, radius, units, steps); + return bufferFeature(geojson, radius, units, steps) as any; } /** @@ -84,13 +99,18 @@ function buffer(geojson, radius, options) { * @param {number} [steps=8] number of steps * @returns {Feature} buffered feature */ -function bufferFeature(geojson, radius, units, steps) { +function bufferFeature( + geojson: any, + radius: number, + units: Units, + steps: number +) { var properties = geojson.properties || {}; var geometry = geojson.type === "Feature" ? geojson.geometry : geojson; // Geometry Types faster than jsts if (geometry.type === "GeometryCollection") { - var results = []; + var results: any[] = []; geomEach(geojson, function (geometry) { var buffered = bufferFeature(geometry, radius, units, steps); if (buffered) results.push(buffered); @@ -132,7 +152,7 @@ function bufferFeature(geojson, radius, units, steps) { * @param {Array} coords GeoJSON Coordinates * @returns {boolean} if NaN exists */ -function coordsIsNaN(coords) { +function coordsIsNaN(coords: any[]) { if (Array.isArray(coords[0])) return coordsIsNaN(coords[0]); return isNaN(coords[0]); } @@ -145,8 +165,10 @@ function coordsIsNaN(coords) { * @param {GeoProjection} proj D3 Geo Projection * @returns {Array} projected coordinates */ -function projectCoords(coords, proj) { - if (typeof coords[0] !== "object") return proj(coords); +function projectCoords(coords: any[], proj: GeoProjection): any[] { + if (typeof coords[0] !== "object") { + return proj(coords as [number, number])!; + } return coords.map(function (coord) { return projectCoords(coord, proj); }); @@ -160,8 +182,10 @@ function projectCoords(coords, proj) { * @param {GeoProjection} proj D3 Geo Projection * @returns {Array} un-projected coordinates */ -function unprojectCoords(coords, proj) { - if (typeof coords[0] !== "object") return proj.invert(coords); +function unprojectCoords(coords: any[], proj: GeoProjection): any[] { + if (typeof coords[0] !== "object") { + return proj.invert!(coords as [number, number])!; + } return coords.map(function (coord) { return unprojectCoords(coord, proj); }); @@ -174,9 +198,9 @@ function unprojectCoords(coords, proj) { * @param {Geometry|Feature} geojson Base projection on center of GeoJSON * @returns {GeoProjection} D3 Geo Azimuthal Equidistant Projection */ -function defineProjection(geojson) { +function defineProjection(geojson: GeoJSON.GeoJSON) { var coords = center(geojson).geometry.coordinates; - var rotation = [-coords[0], -coords[1]]; + var rotation: [number, number] = [-coords[0], -coords[1]]; return geoAzimuthalEquidistant().rotate(rotation).scale(earthRadius); } diff --git a/packages/turf-buffer/package.json b/packages/turf-buffer/package.json index ab142ce44a..c012d20b89 100644 --- a/packages/turf-buffer/package.json +++ b/packages/turf-buffer/package.json @@ -62,12 +62,14 @@ "devDependencies": { "@turf/truncate": "workspace:*", "@types/benchmark": "^2.1.5", + "@types/d3-geo": "^3.1.0", "@types/tape": "^5.8.1", "benchmark": "^2.1.4", "load-json-file": "^7.0.1", "tape": "^5.9.0", "tsup": "^8.4.0", "tsx": "^4.19.4", + "typescript": "^5.8.3", "write-json-file": "^6.0.0" }, "dependencies": { @@ -78,6 +80,7 @@ "@turf/meta": "workspace:*", "@turf/projection": "workspace:*", "@types/geojson": "^7946.0.10", - "d3-geo": "1.7.1" + "d3-geo": "^3.1.1", + "tslib": "^2.8.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa28541de7..bfae4eb81a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1622,8 +1622,11 @@ importers: specifier: ^7946.0.10 version: 7946.0.14 d3-geo: - specifier: 1.7.1 - version: 1.7.1 + specifier: ^3.1.1 + version: 3.1.1 + tslib: + specifier: ^2.8.1 + version: 2.8.1 devDependencies: '@turf/truncate': specifier: workspace:* @@ -1631,6 +1634,9 @@ importers: '@types/benchmark': specifier: ^2.1.5 version: 2.1.5 + '@types/d3-geo': + specifier: ^3.1.0 + version: 3.1.0 '@types/tape': specifier: ^5.8.1 version: 5.8.1 @@ -1649,6 +1655,9 @@ importers: tsx: specifier: ^4.19.4 version: 4.19.4 + typescript: + specifier: ^5.8.3 + version: 5.8.3 write-json-file: specifier: ^6.0.0 version: 6.0.0 @@ -7760,6 +7769,9 @@ packages: '@types/concaveman@1.1.6': resolution: {integrity: sha512-3shTHRmSStvc+91qrFlQv2UmrOB0sZ6biDQo7YzY+9tV1mNLpdzuZal4D3hTYXYWig49K01lCvYDpnh+txToXw==} + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + '@types/d3-voronoi@1.1.12': resolution: {integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==} @@ -8445,11 +8457,13 @@ packages: engines: {node: '>=4'} hasBin: true - d3-array@1.2.4: - resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} - d3-geo@1.7.1: - resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==} + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} d3-queue@3.0.7: resolution: {integrity: sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==} @@ -9417,6 +9431,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + ip@2.0.1: resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} @@ -13538,6 +13556,10 @@ snapshots: '@types/concaveman@1.1.6': {} + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.14 + '@types/d3-voronoi@1.1.12': {} '@types/debug@4.1.12': @@ -14306,11 +14328,13 @@ snapshots: cssesc@3.0.0: {} - d3-array@1.2.4: {} + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 - d3-geo@1.7.1: + d3-geo@3.1.1: dependencies: - d3-array: 1.2.4 + d3-array: 3.2.4 d3-queue@3.0.7: {} @@ -15478,6 +15502,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internmap@2.0.3: {} + ip@2.0.1: {} is-absolute@1.0.0: