diff --git a/packages/turf-line-offset/index.d.ts b/packages/turf-line-offset/index.d.ts deleted file mode 100644 index 7ea33fe2ad..0000000000 --- a/packages/turf-line-offset/index.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Feature, LineString, MultiLineString } from "geojson"; -import { Units } from "@turf/helpers"; - -/** - * http://turfjs.org/docs/#lineoffset - */ -declare function lineOffset( - line: Feature | T, - distance: number, - options?: { - units?: Units; - } -): Feature; - -export { lineOffset }; -export default lineOffset; diff --git a/packages/turf-line-offset/index.js b/packages/turf-line-offset/index.ts similarity index 81% rename from packages/turf-line-offset/index.js rename to packages/turf-line-offset/index.ts index 36c8671739..6b12831138 100644 --- a/packages/turf-line-offset/index.js +++ b/packages/turf-line-offset/index.ts @@ -5,8 +5,10 @@ import { lineString, multiLineString, lengthToDegrees, + Units, } from "@turf/helpers"; import { intersection } from "./lib/intersection.js"; +import { Feature, LineString, MultiLineString, Position } from "geojson"; /** * Takes a {@link LineString|line} and returns a {@link LineString|line} at offset by the specified distance. @@ -26,11 +28,15 @@ import { intersection } from "./lib/intersection.js"; * var addToMap = [offsetLine, line] * offsetLine.properties.stroke = "#00F" */ -function lineOffset(geojson, distance, options) { +function lineOffset( + geojson: Feature | T, + distance: number, + options: { units?: Units } = {} +) { // Optional parameters options = options || {}; if (!isObject(options)) throw new Error("options is invalid"); - var units = options.units; + const { units = "kilometers" } = options; // Valdiation if (!geojson) throw new Error("geojson is required"); @@ -38,13 +44,13 @@ function lineOffset(geojson, distance, options) { throw new Error("distance is required"); var type = getType(geojson); - var properties = geojson.properties; + var properties = geojson.type === "Feature" ? geojson.properties : {}; switch (type) { case "LineString": return lineOffsetFeature(geojson, distance, units); case "MultiLineString": - var coords = []; + var coords: Position[][] = []; flattenEach(geojson, function (feature) { coords.push( lineOffsetFeature(feature, distance, units).geometry.coordinates @@ -65,11 +71,15 @@ function lineOffset(geojson, distance, options) { * @param {string} [units=kilometers] units * @returns {Feature} Line offset from the input line */ -function lineOffsetFeature(line, distance, units) { - var segments = []; +function lineOffsetFeature( + line: Feature | LineString | MultiLineString, + distance: number, + units: Units +) { + var segments: [[number, number], [number, number]][] = []; var offsetDegrees = lengthToDegrees(distance, units); var coords = getCoords(line); - var finalCoords = []; + var finalCoords: [number, number][] = []; coords.forEach(function (currentCoords, index) { if (index !== coords.length - 1) { var segment = processSegment( @@ -101,7 +111,10 @@ function lineOffsetFeature(line, distance, units) { } } }); - return lineString(finalCoords, line.properties); + return lineString( + finalCoords, + line.type === "Feature" ? line.properties : {} + ); } /** @@ -114,7 +127,11 @@ function lineOffsetFeature(line, distance, units) { * @param {number} offset Offset * @returns {Array>} offset points */ -function processSegment(point1, point2, offset) { +function processSegment( + point1: [number, number], + point2: [number, number], + offset: number +): [[number, number], [number, number]] { var L = Math.sqrt( (point1[0] - point2[0]) * (point1[0] - point2[0]) + (point1[1] - point2[1]) * (point1[1] - point2[1]) diff --git a/packages/turf-line-offset/lib/intersection.js b/packages/turf-line-offset/lib/intersection.ts similarity index 76% rename from packages/turf-line-offset/lib/intersection.js rename to packages/turf-line-offset/lib/intersection.ts index ee673d966c..543b37beed 100644 --- a/packages/turf-line-offset/lib/intersection.js +++ b/packages/turf-line-offset/lib/intersection.ts @@ -11,7 +11,7 @@ * @param {Array>} segment - 2 vertex line segment * @returns {Array} coordinates [x, y] */ -function ab(segment) { +function ab(segment: [number, number][]): [number, number] { var start = segment[0]; var end = segment[1]; return [end[0] - start[0], end[1] - start[1]]; @@ -25,7 +25,7 @@ function ab(segment) { * @param {Array} v2 coordinates [x, y] * @returns {Array} Cross Product */ -function crossProduct(v1, v2) { +function crossProduct(v1: [number, number], v2: [number, number]) { return v1[0] * v2[1] - v2[0] * v1[1]; } @@ -37,7 +37,7 @@ function crossProduct(v1, v2) { * @param {Array} v2 coordinates [x, y] * @returns {Array} Add */ -function add(v1, v2) { +function add(v1: [number, number], v2: [number, number]): [number, number] { return [v1[0] + v2[0], v1[1] + v2[1]]; } @@ -49,7 +49,7 @@ function add(v1, v2) { * @param {Array} v2 coordinates [x, y] * @returns {Array} Sub */ -function sub(v1, v2) { +function sub(v1: [number, number], v2: [number, number]): [number, number] { return [v1[0] - v2[0], v1[1] - v2[1]]; } @@ -61,7 +61,7 @@ function sub(v1, v2) { * @param {Array} v coordinates [x, y] * @returns {Array} scalarMult */ -function scalarMult(s, v) { +function scalarMult(s: number, v: [number, number]): [number, number] { return [s * v[0], s * v[1]]; } @@ -73,7 +73,10 @@ function scalarMult(s, v) { * @param {Array} b coordinates [x, y] * @returns {Array} intersection */ -function intersectSegments(a, b) { +function intersectSegments( + a: [number, number][], + b: [number, number][] +): [number, number] { var p = a[0]; var r = ab(a); var q = b[0]; @@ -95,7 +98,7 @@ function intersectSegments(a, b) { * @param {Array} b coordinates [x, y] * @returns {boolean} true if a and b are parallel (or co-linear) */ -function isParallel(a, b) { +function isParallel(a: [number, number][], b: [number, number][]): boolean { var r = ab(a); var s = ab(b); return crossProduct(r, s) === 0; @@ -109,10 +112,10 @@ function isParallel(a, b) { * @param {Array} b coordinates [x, y] * @returns {Array|boolean} true if a and b are parallel (or co-linear) */ -function intersection(a, b) { +export function intersection( + a: [number, number][], + b: [number, number][] +): [number, number] | false { if (isParallel(a, b)) return false; return intersectSegments(a, b); } - -export { intersection }; -export default intersection; diff --git a/packages/turf-line-offset/package.json b/packages/turf-line-offset/package.json index 0a3ae03b22..b9fc322209 100644 --- a/packages/turf-line-offset/package.json +++ b/packages/turf-line-offset/package.json @@ -65,12 +65,14 @@ "tape": "^5.9.0", "tsup": "^8.4.0", "tsx": "^4.19.4", + "typescript": "^5.8.3", "write-json-file": "^6.0.0" }, "dependencies": { "@turf/helpers": "workspace:*", "@turf/invariant": "workspace:*", "@turf/meta": "workspace:*", - "@types/geojson": "^7946.0.10" + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" } } diff --git a/packages/turf-line-offset/test.ts b/packages/turf-line-offset/test.ts index 2ba7e84bf2..780f242795 100644 --- a/packages/turf-line-offset/test.ts +++ b/packages/turf-line-offset/test.ts @@ -27,7 +27,7 @@ let fixtures = fs.readdirSync(directories.in).map((filename) => { test("turf-line-offset", (t) => { fixtures.forEach((fixture) => { const name = fixture.name; - const geojson = fixture.geojson; + const geojson = fixture.geojson as any; const properties = geojson.properties || {}; const distance = properties.distance || 50; const units = properties.units; @@ -35,7 +35,7 @@ test("turf-line-offset", (t) => { const output = truncate(lineOffset(geojson, distance, { units: units }), { precision: 4, }); - output.properties.stroke = "#00F"; + output.properties!.stroke = "#00F"; const results = featureCollection([output, geojson]); if (process.env.REGEN) @@ -54,8 +54,8 @@ test("turf-line-offset - Throws Errors", (t) => { [10, 10], [0, 0], ]); - t.throws(() => lineOffset(), /geojson is required/); - t.throws(() => lineOffset(line), /distance is required/); + t.throws(() => (lineOffset as any)(), /geojson is required/); + t.throws(() => (lineOffset as any)(line), /distance is required/); t.end(); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c2f7fb676..88bcdd7ea8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3720,6 +3720,9 @@ importers: '@types/geojson': specifier: ^7946.0.10 version: 7946.0.14 + tslib: + specifier: ^2.8.1 + version: 2.8.1 devDependencies: '@turf/truncate': specifier: workspace:* @@ -3745,6 +3748,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