From 5d66ab13215e865d6172925d6853bdfe23c69fa6 Mon Sep 17 00:00:00 2001 From: Matthew Fedderly <24275386+mfedderly@users.noreply.github.com> Date: Wed, 17 Dec 2025 08:31:09 -0500 Subject: [PATCH 1/2] @turf/line-slice-along to TypeScript --- packages/turf-line-slice-along/bench.ts | 37 ++++++++++--------- packages/turf-line-slice-along/index.d.ts | 17 --------- .../{index.js => index.ts} | 25 ++++++++----- packages/turf-line-slice-along/package.json | 6 ++- packages/turf-line-slice-along/test.ts | 19 +++++----- pnpm-lock.yaml | 6 +++ 6 files changed, 55 insertions(+), 55 deletions(-) delete mode 100644 packages/turf-line-slice-along/index.d.ts rename packages/turf-line-slice-along/{index.js => index.ts} (82%) diff --git a/packages/turf-line-slice-along/bench.ts b/packages/turf-line-slice-along/bench.ts index b10c7b0916..5d276a3dad 100644 --- a/packages/turf-line-slice-along/bench.ts +++ b/packages/turf-line-slice-along/bench.ts @@ -1,51 +1,54 @@ -import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; import Benchmark from "benchmark"; import { lineSliceAlong } from "./index.js"; +import { loadJsonFileSync } from "load-json-file"; +import { Feature, LineString } from "geojson"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -var line1 = JSON.parse( - fs.readFileSync(__dirname + "/test/fixtures/line1.geojson") +var line1: Feature = loadJsonFileSync( + path.join(__dirname, "test", "fixtures", "line1.geojson") ); -var route1 = JSON.parse( - fs.readFileSync(__dirname + "/test/fixtures/route1.geojson") +var route1: Feature = loadJsonFileSync( + path.join(__dirname, "test", "fixtures", "route1.geojson") ); -var route2 = JSON.parse( - fs.readFileSync(__dirname + "/test/fixtures/route2.geojson") +var route2: Feature = loadJsonFileSync( + path.join(__dirname, "test", "fixtures", "route2.geojson") ); +const options = { units: "miles" } as const; + var suite = new Benchmark.Suite("turf-line-slice-along"); suite .add("turf-line-slice-along#line1 5-15 miles", function () { - lineSliceAlong(line1, 5, 15, "miles"); + lineSliceAlong(line1, 5, 15, options); }) .add("turf-line-slice-along#line1 50-250 miles", function () { - lineSliceAlong(line1, 50, 250, "miles"); + lineSliceAlong(line1, 50, 250, options); }) .add("turf-line-slice-along#line1 250-500 miles", function () { - lineSliceAlong(line1, 250, 500, "miles"); + lineSliceAlong(line1, 250, 500, options); }) .add("turf-line-slice-along#route1 5-15 miles", function () { - lineSliceAlong(route1, 5, 15, "miles"); + lineSliceAlong(route1, 5, 15, options); }) .add("turf-line-slice-along#route1 50-250 miles", function () { - lineSliceAlong(route1, 50, 250, "miles"); + lineSliceAlong(route1, 50, 250, options); }) .add("turf-line-slice-along#route1 250-500 miles", function () { - lineSliceAlong(route1, 250, 500, "miles"); + lineSliceAlong(route1, 250, 500, options); }) .add("turf-line-slice-along#route2 5-15 miles", function () { - lineSliceAlong(route2, 5, 15, "miles"); + lineSliceAlong(route2, 5, 15, options); }) .add("turf-line-slice-along#route2 15-25 miles", function () { - lineSliceAlong(route2, 15, 25, "miles"); + lineSliceAlong(route2, 15, 25, options); }) .add("turf-line-slice-along#route2 25-35 miles", function () { - lineSliceAlong(route2, 25, 35, "miles"); + lineSliceAlong(route2, 25, 35, options); }) - .on("cycle", function (event) { + .on("cycle", function (event: any) { console.log(String(event.target)); }) .run(); diff --git a/packages/turf-line-slice-along/index.d.ts b/packages/turf-line-slice-along/index.d.ts deleted file mode 100644 index 5ced1a8b65..0000000000 --- a/packages/turf-line-slice-along/index.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { LineString, Feature } from "geojson"; -import { Units } from "@turf/helpers"; - -/** - * http://turfjs.org/docs/ - */ -declare function lineSliceAlong( - line: Feature | LineString, - startDist: number, - stopDist: number, - options?: { - units?: Units; - } -): Feature; - -export { lineSliceAlong }; -export default lineSliceAlong; diff --git a/packages/turf-line-slice-along/index.js b/packages/turf-line-slice-along/index.ts similarity index 82% rename from packages/turf-line-slice-along/index.js rename to packages/turf-line-slice-along/index.ts index f5dc885b77..54260b9a99 100644 --- a/packages/turf-line-slice-along/index.js +++ b/packages/turf-line-slice-along/index.ts @@ -1,7 +1,8 @@ import { bearing } from "@turf/bearing"; import { distance } from "@turf/distance"; import { destination } from "@turf/destination"; -import { lineString, isObject } from "@turf/helpers"; +import { lineString, isObject, Units } from "@turf/helpers"; +import { Feature, LineString, Point, Position } from "geojson"; /** * Takes a {@link LineString|line}, a specified distance along the line to a start {@link Point}, @@ -26,25 +27,29 @@ import { lineString, isObject } from "@turf/helpers"; * //addToMap * var addToMap = [line, start, stop, sliced] */ -function lineSliceAlong(line, startDist, stopDist, options) { +function lineSliceAlong( + line: Feature | LineString, + startDist: number, + stopDist: number, + options: { units?: Units } = {} +): Feature { // Optional parameters - options = options || {}; if (!isObject(options)) throw new Error("options is invalid"); - var coords; - var slice = []; + var coords: Position[]; + var slice: Position[] = []; // Validation if (line.type === "Feature") coords = line.geometry.coordinates; else if (line.type === "LineString") coords = line.coordinates; else throw new Error("input must be a LineString Feature or Geometry"); - var origCoordsLength = coords.length; - var travelled = 0; - var overshot, direction, interpolated; - for (var i = 0; i < coords.length; i++) { + const origCoordsLength = coords.length; + let travelled = 0; + let overshot: number, direction: number, interpolated: Feature; + for (let i = 0; i < coords.length; i++) { if (startDist >= travelled && i === coords.length - 1) break; else if (travelled > startDist && slice.length === 0) { - overshot = startDist - travelled; + let overshot = startDist - travelled; if (!overshot) { slice.push(coords[i]); return lineString(slice); diff --git a/packages/turf-line-slice-along/package.json b/packages/turf-line-slice-along/package.json index e60677a0b2..bf72739576 100644 --- a/packages/turf-line-slice-along/package.json +++ b/packages/turf-line-slice-along/package.json @@ -58,13 +58,15 @@ "load-json-file": "^7.0.1", "tape": "^5.9.0", "tsup": "^8.4.0", - "tsx": "^4.19.4" + "tsx": "^4.19.4", + "typescript": "^5.8.3" }, "dependencies": { "@turf/bearing": "workspace:*", "@turf/destination": "workspace:*", "@turf/distance": "workspace:*", "@turf/helpers": "workspace:*", - "@types/geojson": "^7946.0.10" + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" } } diff --git a/packages/turf-line-slice-along/test.ts b/packages/turf-line-slice-along/test.ts index 196c3a4820..1a09851490 100644 --- a/packages/turf-line-slice-along/test.ts +++ b/packages/turf-line-slice-along/test.ts @@ -5,23 +5,24 @@ import { loadJsonFileSync } from "load-json-file"; import { along } from "@turf/along"; import { length } from "@turf/length"; import { lineSliceAlong } from "./index.js"; +import { Feature, LineString } from "geojson"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -var line1 = loadJsonFileSync( +var line1: Feature = loadJsonFileSync( path.join(__dirname, "test", "fixtures", "line1.geojson") ); -var route1 = loadJsonFileSync( +var route1: Feature = loadJsonFileSync( path.join(__dirname, "test", "fixtures", "route1.geojson") ); -var route2 = loadJsonFileSync( +var route2: Feature = loadJsonFileSync( path.join(__dirname, "test", "fixtures", "route2.geojson") ); test("turf-line-slice-along -- line1", function (t) { var start = 500; var stop = 750; - var options = { units: "miles" }; + var options = { units: "miles" } as const; var start_point = along(line1, start, options); var end_point = along(line1, stop, options); @@ -39,7 +40,7 @@ test("turf-line-slice-along -- line1", function (t) { test("turf-line-slice-along -- line1 overshoot", function (t) { var start = 500; var stop = 1500; - var options = { units: "miles" }; + var options = { units: "miles" } as const; var start_point = along(line1, start, options); var end_point = along(line1, stop, options); @@ -57,7 +58,7 @@ test("turf-line-slice-along -- line1 overshoot", function (t) { test("turf-line-slice-along -- route1", function (t) { var start = 500; var stop = 750; - var options = { units: "miles" }; + var options = { units: "miles" } as const; var start_point = along(route1, start, options); var end_point = along(route1, stop, options); @@ -75,7 +76,7 @@ test("turf-line-slice-along -- route1", function (t) { test("turf-line-slice-along -- route2", function (t) { var start = 25; var stop = 50; - var options = { units: "miles" }; + var options = { units: "miles" } as const; var start_point = along(route2, start, options); var end_point = along(route2, stop, options); @@ -93,7 +94,7 @@ test("turf-line-slice-along -- route2", function (t) { test("turf-line-slice-along -- start longer than line length", function (t) { var start = 500000; var stop = 800000; - var options = { units: "miles" }; + var options = { units: "miles" } as const; t.throws( () => lineSliceAlong(line1, start, stop, options), @@ -103,7 +104,7 @@ test("turf-line-slice-along -- start longer than line length", function (t) { }); test("turf-line-slice-along -- start equal to line length", function (t) { - var options = { units: "miles" }; + var options = { units: "miles" } as const; var start = length(line1, options); var stop = start + 100; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88bcdd7ea8..ff913c392e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3922,6 +3922,9 @@ importers: '@types/geojson': specifier: ^7946.0.10 version: 7946.0.14 + tslib: + specifier: ^2.8.1 + version: 2.8.1 devDependencies: '@turf/along': specifier: workspace:* @@ -3950,6 +3953,9 @@ importers: tsx: specifier: ^4.19.4 version: 4.19.4 + typescript: + specifier: ^5.8.3 + version: 5.8.3 packages/turf-line-split: dependencies: From 74a821019797270ec0583eb54d11d64f8ac46f64 Mon Sep 17 00:00:00 2001 From: Matthew Fedderly <24275386+mfedderly@users.noreply.github.com> Date: Thu, 18 Dec 2025 07:51:42 -0500 Subject: [PATCH 2/2] Specify units option more robustly --- packages/turf-line-slice-along/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/turf-line-slice-along/index.ts b/packages/turf-line-slice-along/index.ts index 54260b9a99..6880d7c6c7 100644 --- a/packages/turf-line-slice-along/index.ts +++ b/packages/turf-line-slice-along/index.ts @@ -35,6 +35,7 @@ function lineSliceAlong( ): Feature { // Optional parameters if (!isObject(options)) throw new Error("options is invalid"); + const { units = "kilometers" } = options; var coords: Position[]; var slice: Position[] = []; @@ -55,7 +56,7 @@ function lineSliceAlong( return lineString(slice); } direction = bearing(coords[i], coords[i - 1]) - 180; - interpolated = destination(coords[i], overshot, direction, options); + interpolated = destination(coords[i], overshot, direction, { units }); slice.push(interpolated.geometry.coordinates); } @@ -66,7 +67,7 @@ function lineSliceAlong( return lineString(slice); } direction = bearing(coords[i], coords[i - 1]) - 180; - interpolated = destination(coords[i], overshot, direction, options); + interpolated = destination(coords[i], overshot, direction, { units }); slice.push(interpolated.geometry.coordinates); return lineString(slice); } @@ -79,7 +80,7 @@ function lineSliceAlong( return lineString(slice); } - travelled += distance(coords[i], coords[i + 1], options); + travelled += distance(coords[i], coords[i + 1], { units }); } if (travelled < startDist && coords.length === origCoordsLength)