From 0ce6ecca05829690270fec6d6bed2003495fe0ea Mon Sep 17 00:00:00 2001 From: James Beard Date: Tue, 25 Jun 2024 22:57:25 +1000 Subject: [PATCH] Reduce bundle size of apps that import @turf/helpers (#2623) * Remove GeojsonEquality library from turf-helpers/lib/ in favour of the third party geojson-equality-ts (which is essentially a copy of the code we're removing from turf-helpers/lib/). This allows us to remove the dependency on deep-equal which was causing an unintended increase in bundle size for users of turf-helpers. Updated boolean-equal and boolean-overlap to use geojson-equality-ts directly. * Removing keepNames from tsup config. --------- Co-authored-by: Tim Welch --- packages/turf-boolean-equal/index.ts | 7 +- packages/turf-boolean-equal/package.json | 1 + packages/turf-boolean-overlap/index.ts | 6 +- packages/turf-boolean-overlap/package.json | 1 + packages/turf-helpers/index.ts | 1 - packages/turf-helpers/lib/geojson-equality.ts | 198 --- packages/turf-helpers/package.json | 2 - packages/turf-helpers/test.ts | 1112 ----------------- pnpm-lock.yaml | 22 +- tsup.config.ts | 1 - 10 files changed, 25 insertions(+), 1326 deletions(-) delete mode 100644 packages/turf-helpers/lib/geojson-equality.ts diff --git a/packages/turf-boolean-equal/index.ts b/packages/turf-boolean-equal/index.ts index 7936205d0d..9e009bfa24 100644 --- a/packages/turf-boolean-equal/index.ts +++ b/packages/turf-boolean-equal/index.ts @@ -1,5 +1,5 @@ import { Feature, Geometry } from "geojson"; -import { GeojsonEquality } from "@turf/helpers"; +import { geojsonEquality } from "geojson-equality-ts"; import { cleanCoords } from "@turf/clean-coords"; import { getGeom } from "@turf/invariant"; @@ -45,8 +45,9 @@ function booleanEqual( const type2 = getGeom(feature2).type; if (type1 !== type2) return false; - const equality = new GeojsonEquality({ precision: precision }); - return equality.compare(cleanCoords(feature1), cleanCoords(feature2)); + return geojsonEquality(cleanCoords(feature1), cleanCoords(feature2), { + precision, + }); } export { booleanEqual }; diff --git a/packages/turf-boolean-equal/package.json b/packages/turf-boolean-equal/package.json index 8d1ad6b47a..f00bfceb2b 100644 --- a/packages/turf-boolean-equal/package.json +++ b/packages/turf-boolean-equal/package.json @@ -74,6 +74,7 @@ "@turf/clean-coords": "workspace:^", "@turf/helpers": "workspace:^", "@turf/invariant": "workspace:^", + "geojson-equality-ts": "^1.0.2", "tslib": "^2.6.2" } } diff --git a/packages/turf-boolean-overlap/index.ts b/packages/turf-boolean-overlap/index.ts index 2527179437..fc989ace7c 100644 --- a/packages/turf-boolean-overlap/index.ts +++ b/packages/turf-boolean-overlap/index.ts @@ -3,7 +3,7 @@ import { segmentEach } from "@turf/meta"; import { getGeom } from "@turf/invariant"; import { lineOverlap } from "@turf/line-overlap"; import { lineIntersect } from "@turf/line-intersect"; -import { GeojsonEquality } from "@turf/helpers"; +import { geojsonEquality } from "geojson-equality-ts"; /** * Compares two geometries of the same dimension and returns true if their intersection set results in a geometry @@ -49,8 +49,8 @@ function booleanOverlap( if (type1 === "Point") throw new Error("Point geometry not supported"); // features must be not equal - const equality = new GeojsonEquality({ precision: 6 }); - if (equality.compare(feature1 as any, feature2 as any)) return false; + if (geojsonEquality(feature1 as any, feature2 as any, { precision: 6 })) + return false; let overlap = 0; diff --git a/packages/turf-boolean-overlap/package.json b/packages/turf-boolean-overlap/package.json index 54a2864a05..6fe580cdc2 100755 --- a/packages/turf-boolean-overlap/package.json +++ b/packages/turf-boolean-overlap/package.json @@ -75,6 +75,7 @@ "@turf/line-intersect": "workspace:^", "@turf/line-overlap": "workspace:^", "@turf/meta": "workspace:^", + "geojson-equality-ts": "^1.0.2", "tslib": "^2.6.2" } } diff --git a/packages/turf-helpers/index.ts b/packages/turf-helpers/index.ts index 6b1c479834..3b8403ad85 100644 --- a/packages/turf-helpers/index.ts +++ b/packages/turf-helpers/index.ts @@ -17,7 +17,6 @@ import { import { Id } from "./lib/geojson.js"; export * from "./lib/geojson.js"; -export * from "./lib/geojson-equality.js"; // TurfJS Combined Types export type Coord = Feature | Point | Position; diff --git a/packages/turf-helpers/lib/geojson-equality.ts b/packages/turf-helpers/lib/geojson-equality.ts deleted file mode 100644 index cdbedd152e..0000000000 --- a/packages/turf-helpers/lib/geojson-equality.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { - Feature, - LineString, - Position, - GeoJSON, - Point, - Polygon, - GeometryCollection, - FeatureCollection, - MultiLineString, - MultiPoint, - MultiPolygon, -} from "geojson"; -import equal from "deep-equal"; - -/** - - * GeoJSON equality checking utility. - * Adapted from https://github.com/geosquare/geojson-equality - * - * @memberof helpers - * @type {Class} - */ -export class GeojsonEquality { - private precision: number; - private direction = false; - private compareProperties = true; - - constructor(opts?: { - precision?: number; - direction?: boolean; - compareProperties?: boolean; - }) { - this.precision = 10 ** -(opts?.precision ?? 17); - this.direction = opts?.direction ?? false; - this.compareProperties = opts?.compareProperties ?? true; - } - - compare(g1: GeoJSON, g2: GeoJSON): boolean { - if (g1.type !== g2.type) { - return false; - } - - if (!sameLength(g1, g2)) { - return false; - } - - switch (g1.type) { - case "Point": - return this.compareCoord(g1.coordinates, (g2 as Point).coordinates); - case "LineString": - return this.compareLine(g1.coordinates, (g2 as LineString).coordinates); - case "Polygon": - return this.comparePolygon(g1, g2 as Polygon); - case "GeometryCollection": - return this.compareGeometryCollection(g1, g2 as GeometryCollection); - case "Feature": - return this.compareFeature(g1, g2 as Feature); - case "FeatureCollection": - return this.compareFeatureCollection(g1, g2 as FeatureCollection); - default: - if (g1.type.startsWith("Multi")) { - const g1s = explode(g1); - const g2s = explode( - g2 as MultiLineString | MultiPoint | MultiPolygon - ); - return g1s.every((g1part) => - g2s.some((g2part) => this.compare(g1part as any, g2part as any)) - ); - } - } - return false; - } - - private compareCoord(c1: Position, c2: Position) { - return ( - c1.length === c2.length && - c1.every((c, i) => Math.abs(c - c2[i]) < this.precision) - ); - } - - private compareLine( - path1: Position[], - path2: Position[], - ind = 0, - isPoly = false - ): boolean { - if (!sameLength(path1, path2)) { - return false; - } - const p1 = path1; - let p2 = path2; - if (isPoly && !this.compareCoord(p1[0], p2[0])) { - // fix start index of both to same point - const startIndex = this.fixStartIndex(p2, p1); - if (!startIndex) { - return false; - } else { - p2 = startIndex; - } - } - // for linestring ind =0 and for polygon ind =1 - const sameDirection = this.compareCoord(p1[ind], p2[ind]); - if (this.direction || sameDirection) { - return this.comparePath(p1, p2); - } else { - if (this.compareCoord(p1[ind], p2[p2.length - (1 + ind)])) { - return this.comparePath(p1.slice().reverse(), p2); - } - return false; - } - } - - private fixStartIndex(sourcePath: Position[], targetPath: Position[]) { - //make sourcePath first point same as of targetPath - let correctPath, - ind = -1; - for (let i = 0; i < sourcePath.length; i++) { - if (this.compareCoord(sourcePath[i], targetPath[0])) { - ind = i; - break; - } - } - if (ind >= 0) { - correctPath = ([] as Position[]).concat( - sourcePath.slice(ind, sourcePath.length), - sourcePath.slice(1, ind + 1) - ); - } - return correctPath; - } - - private comparePath(p1: Position[], p2: Position[]) { - return p1.every((c, i) => this.compareCoord(c, p2[i])); - } - - private comparePolygon(g1: Polygon, g2: Polygon) { - if (this.compareLine(g1.coordinates[0], g2.coordinates[0], 1, true)) { - const holes1 = g1.coordinates.slice(1, g1.coordinates.length); - const holes2 = g2.coordinates.slice(1, g2.coordinates.length); - return holes1.every((h1) => - holes2.some((h2) => this.compareLine(h1, h2, 1, true)) - ); - } - return false; - } - - private compareGeometryCollection( - g1: GeometryCollection, - g2: GeometryCollection - ) { - return ( - sameLength(g1.geometries, g2.geometries) && - this.compareBBox(g1, g2) && - g1.geometries.every((g, i) => this.compare(g, g2.geometries[i])) - ); - } - - private compareFeature(g1: Feature, g2: Feature) { - return ( - g1.id === g2.id && - (this.compareProperties ? equal(g1.properties, g2.properties) : true) && - this.compareBBox(g1, g2) && - this.compare(g1.geometry, g2.geometry) - ); - } - - private compareFeatureCollection( - g1: FeatureCollection, - g2: FeatureCollection - ) { - return ( - sameLength(g1.features, g2.features) && - this.compareBBox(g1, g2) && - g1.features.every((f, i) => this.compare(f, g2.features[i])) - ); - } - - private compareBBox(g1: GeoJSON, g2: GeoJSON): boolean { - return ( - Boolean(!g1.bbox && !g2.bbox) || - (g1.bbox && g2.bbox ? this.compareCoord(g1.bbox, g2.bbox) : false) - ); - } -} - -function sameLength(g1: any, g2: any) { - return g1.coordinates - ? g1.coordinates.length === g2.coordinates.length - : g1.length === g2.length; -} - -function explode(g: MultiLineString | MultiPoint | MultiPolygon) { - return g.coordinates.map((part) => ({ - type: g.type.replace("Multi", ""), - coordinates: part, - })); -} diff --git a/packages/turf-helpers/package.json b/packages/turf-helpers/package.json index e13b8787e9..631db8e22b 100644 --- a/packages/turf-helpers/package.json +++ b/packages/turf-helpers/package.json @@ -59,7 +59,6 @@ }, "devDependencies": { "@types/benchmark": "^2.1.5", - "@types/deep-equal": "^1.0.4", "@types/tape": "^4.2.32", "benchmark": "^2.1.4", "npm-run-all": "^4.1.5", @@ -69,7 +68,6 @@ "typescript": "^5.2.2" }, "dependencies": { - "deep-equal": "^2.2.3", "tslib": "^2.6.2" } } diff --git a/packages/turf-helpers/test.ts b/packages/turf-helpers/test.ts index 7c912b8dc9..0bda74b4ac 100644 --- a/packages/turf-helpers/test.ts +++ b/packages/turf-helpers/test.ts @@ -21,7 +21,6 @@ import { isObject, isNumber, earthRadius, - GeojsonEquality, } from "./index.js"; import * as turf from "./index.js"; @@ -793,1114 +792,3 @@ test("turf-helpers -- Issue #1284 - Prevent mutating Properties", (t) => { t.deepEqual(feature(coord).properties, {}); t.end(); }); - -test("turf-helpers -- GeojsonEquality for Point", (t) => { - const eq = new GeojsonEquality(); - const g1 = { type: "Point", coordinates: [30, 10] }, - g2 = { type: "Point", coordinates: [30, 10] }, - g3 = { type: "Point", coordinates: [30, 11] }, - g4 = { type: "Point", coordinates: [30, 10, 5] }, - g5 = { type: "Point", coordinates: [30, 10, 5] }; - - t.true(eq.compare(g1, g2)); - t.false(eq.compare(g1, g3)); - t.false(eq.compare(g1, g4)); - t.true(eq.compare(g4, g5)); - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for LineString", (t) => { - const eq = new GeojsonEquality(); - const g1 = { - type: "LineString", - coordinates: [ - [30, 10], - [10, 30], - [40, 40], - ], - }, - g2 = { - type: "LineString", - coordinates: [ - [30, 10], - [10, 30], - [40, 40], - ], - }, - g3 = { - type: "LineString", - coordinates: [ - [31, 10], - [10, 30], - [40, 40], - ], - }, - g4 = { - type: "LineString", - coordinates: [ - [40, 40], - [10, 30], - [30, 10], - ], - }; - - t.true(eq.compare(g1, g2)); - t.false(eq.compare(g1, g3)); - t.true(eq.compare(g1, g4)); // reverse direction, direction is not matched - - const eqWithDirection = new GeojsonEquality({ direction: true }); - t.false(eqWithDirection.compare(g1, g4)); // reverse direction, direction is matched - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for Polygon", (t) => { - const eq = new GeojsonEquality(), - eqWithDirection = new GeojsonEquality({ direction: true }); - const g1 = { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [40, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - g2 = { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [40, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - g3 = { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - g4 = { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [10, 20], - [20, 40], - [40, 40], - [30, 10], - ], - ], - }, - g5 = { - type: "Polygon", - coordinates: [ - [ - [10, 20], - [20, 40], - [40, 40], - [30, 10], - [10, 20], - ], - ], - }, - gh1 = { - type: "Polygon", - coordinates: [ - [ - [45, 45], - [15, 40], - [10, 20], - [35, 10], - [45, 45], - ], - [ - [20, 30], - [35, 35], - [30, 20], - [20, 30], - ], - ], - }, - gh2 = { - type: "Polygon", - coordinates: [ - [ - [35, 10], - [45, 45], - [15, 40], - [10, 20], - [35, 10], - ], - [ - [20, 30], - [35, 35], - [30, 20], - [20, 30], - ], - ], - }, - gprecision1 = { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [40.12345, 40.12345], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - gprecision2 = { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [40.123389, 40.123378], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }; - - t.true(eq.compare(g1, g2)); - t.false(eq.compare(g1, g3)); - - t.true(eq.compare(g1, g4)); // reverse direction, direction is not matched - t.false(eqWithDirection.compare(g1, g4)); // reverse direction, direction is matched - - t.true(eq.compare(g1, g5)); // reverse direction, diff start index, direction is not matched - t.false(eqWithDirection.compare(g1, g5)); // reverse direction, diff start index, direction is matched - - t.true(eq.compare(gh1, gh2)); // with holes, diff start ind, direction is not matched - - const lowPrecisioneq = new GeojsonEquality({ precision: 3 }); - - t.true(lowPrecisioneq.compare(gprecision1, gprecision2)); - - const highPrecisioneq = new GeojsonEquality({ precision: 10 }); - - t.false(highPrecisioneq.compare(gprecision1, gprecision2)); - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for Feature", (t) => { - const eq = new GeojsonEquality(); - - t.false( - eq.compare({ type: "Feature", id: "id1" }, { type: "Feature", id: "id2" }) - ); - - t.false( - eq.compare( - { type: "Feature", id: "id1", properties: { foo: "bar" } }, - { type: "Feature", id: "id1", properties: { foo1: "bar", foo2: "bar" } } - ) - ); - - t.false( - eq.compare( - { type: "Feature", id: "id1", properties: { foo1: "bar" } }, - { type: "Feature", id: "id1", properties: { foo2: "bar" } } - ) - ); - - t.false( - eq.compare( - { type: "Feature", id: "id1", properties: { foo: "bar1" } }, - { type: "Feature", id: "id1", properties: { foo: "bar2" } } - ) - ); - - t.false( - eq.compare( - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - }, - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [40, 20], - [31, 10], - [30, 20], - [30, 10], - [10, 40], - ], - ], - }, - } - ) - ); - - t.true( - eq.compare( - { - type: "Feature", - id: "id1", - properties: { foo: { bar: "baz" } }, - geometry: { type: "Point", coordinates: [0, 1] }, - }, - { - type: "Feature", - id: "id1", - properties: { foo: { bar: "baz" } }, - geometry: { type: "Point", coordinates: [0, 1] }, - } - ) - ); - - t.false( - eq.compare( - { - type: "Feature", - id: "id1", - properties: { foo: { bar: "baz" } }, - geometry: { type: "Point", coordinates: [0, 1] }, - }, - { - type: "Feature", - id: "id1", - properties: { foo: { bar: "baz2" } }, - geometry: { type: "Point", coordinates: [0, 1] }, - } - ) - ); - - t.false( - eq.compare( - { type: "Feature", id: "id1", bbox: [1, 2, 3, 4] }, - { type: "Feature", id: "id1" } - ) - ); - - t.false( - eq.compare( - { type: "Feature", id: "id1", bbox: [1, 2, 3, 4] }, - { type: "Feature", id: "id1", bbox: [1, 2, 3, 5] } - ) - ); - - t.true( - eq.compare( - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - bbox: [10, 10, 41, 40], - }, - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - bbox: [10, 10, 41, 40], - } - ) - ); - - t.false( - eq.compare( - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - bbox: [10, 10, 41, 40], - }, - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 1], - ], - ], - }, - bbox: [10, 10, 41, 40], - } - ) - ); - - const eqNoCompareProperties = new GeojsonEquality({ - compareProperties: false, - }); - t.true( - eqNoCompareProperties.compare( - { - type: "Feature", - id: "id1", - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - properties: { foo: "bar" }, - }, - { - type: "Feature", - id: "id1", - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - properties: { foo1: "bar", foo2: "bar" }, - } - ) - ); - - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for FeatureCollection", (t) => { - const eq = new GeojsonEquality(); - - t.false( - eq.compare( - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [0, 0] }, - }, - ], - }, - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [0, 0] }, - }, - { - type: "Feature", - geometry: { type: "Point", coordinates: [0, 0] }, - }, - ], - } - ) - ); - - t.false( - eq.compare( - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [0, 0] }, - }, - ], - }, - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [1, 1] }, - }, - ], - } - ) - ); - - t.false( - eq.compare( - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [0, 0] }, - }, - { - type: "Feature", - geometry: { type: "Point", coordinates: [1, 1] }, - }, - ], - }, - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [1, 1] }, - }, - { - type: "Feature", - geometry: { type: "Point", coordinates: [0, 0] }, - }, - ], - } - ) - ); - - t.true( - eq.compare( - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [1, 1] }, - }, - ], - }, - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - geometry: { type: "Point", coordinates: [1, 1] }, - }, - ], - } - ) - ); - - t.true( - eq.compare( - { - type: "FeatureCollection", - features: [], - }, - { - type: "FeatureCollection", - features: [], - } - ) - ); - - t.false( - eq.compare( - { type: "FeatureCollection", features: [], bbox: [1, 2, 3, 4] }, - { type: "FeatureCollection", features: "[]" } - ) - ); - - t.false( - eq.compare( - { type: "FeatureCollection", features: [], bbox: [1, 2, 3, 4] }, - { type: "FeatureCollection", features: [], bbox: [1, 2, 3, 5] } - ) - ); - - t.true( - eq.compare( - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - }, - ], - bbox: [10, 10, 41, 40], - }, - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - }, - ], - bbox: [10, 10, 41, 40], - } - ) - ); - - t.false( - eq.compare( - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - }, - ], - bbox: [10, 10, 41, 40], - }, - { - type: "FeatureCollection", - features: [ - { - type: "Feature", - id: "id1", - properties: { foo: "bar1" }, - geometry: { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 1], - ], - ], - }, - }, - ], - bbox: [10, 10, 41, 40], - } - ) - ); - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for MultiPoint", (t) => { - const eq = new GeojsonEquality(); - - const g1 = { - type: "MultiPoint", - coordinates: [ - [0, 40], - [40, 30], - [20, 20], - [30, 10], - ], - }, - g2 = { - type: "MultiPoint", - coordinates: [ - [0, 40], - [20, 20], - [40, 30], - [30, 10], - ], - }, - g3 = { - type: "MultiPoint", - coordinates: [ - [10, 40], - [20, 20], - [40, 30], - [30, 10], - ], - }; - - t.true(eq.compare(g1, g2)); - t.false(eq.compare(g1, g3)); - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for MultiLineString", (t) => { - const eq = new GeojsonEquality(); - const eqWithDirection = new GeojsonEquality({ direction: true }); - const g1 = { - type: "MultiLineString", - coordinates: [ - [ - [30, 10], - [10, 30], - [40, 40], - ], - [ - [0, 10], - [10, 0], - [40, 40], - ], - ], - }, - g2 = { - type: "MultiLineString", - coordinates: [ - [ - [40, 40], - [10, 30], - [30, 10], - ], - [ - [0, 10], - [10, 0], - [40, 40], - ], - ], - }, - g3 = { - type: "MultiLineString", - coordinates: [ - [ - [10, 10], - [20, 20], - [10, 40], - ], - [ - [40, 40], - [30, 30], - [40, 20], - [30, 10], - ], - ], - }; - - t.true(eq.compare(g1, g2)); - t.false(eqWithDirection.compare(g1, g2)); - t.false(eq.compare(g1, g3)); - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for MultiPolygon", (t) => { - const eq = new GeojsonEquality(); - const g1 = { - type: "MultiPolygon", - coordinates: [ - [ - [ - [30, 20], - [45, 40], - [10, 40], - [30, 20], - ], - ], - [ - [ - [15, 5], - [40, 10], - [10, 20], - [5, 10], - [15, 5], - ], - ], - ], - }, - g2 = { - type: "MultiPolygon", - coordinates: [ - [ - [ - [30, 20], - [45, 40], - [10, 40], - [30, 20], - ], - ], - [ - [ - [15, 5], - [40, 10], - [10, 20], - [5, 10], - [15, 5], - ], - ], - ], - }, - g3 = { - type: "MultiPolygon", - coordinates: [ - [ - [ - [30, 20], - [45, 40], - [10, 40], - [30, 20], - ], - ], - [ - [ - [15, 5], - [400, 10], - [10, 20], - [5, 10], - [15, 5], - ], - ], - ], - }, - gh1 = { - type: "MultiPolygon", - coordinates: [ - [ - [ - [40, 40], - [20, 45], - [45, 30], - [40, 40], - ], - ], - [ - [ - [20, 35], - [10, 30], - [10, 10], - [30, 5], - [45, 20], - [20, 35], - ], - [ - [30, 20], - [20, 15], - [20, 25], - [30, 20], - ], - [ - [20, 10], - [30, 10], - [30, 15], - [20, 10], - ], - ], - ], - }, - gh2 = { - type: "MultiPolygon", - coordinates: [ - [ - [ - [20, 35], - [10, 30], - [10, 10], - [30, 5], - [45, 20], - [20, 35], - ], - [ - [20, 10], - [30, 10], - [30, 15], - [20, 10], - ], - [ - [30, 20], - [20, 15], - [20, 25], - [30, 20], - ], - ], - [ - [ - [40, 40], - [20, 45], - [45, 30], - [40, 40], - ], - ], - ], - }; - - t.true(eq.compare(g1, g2)); - t.false(eq.compare(g1, g3)); - - t.true(eq.compare(gh1, gh2)); - t.end(); -}); - -test("turf-helpers -- GeojsonEquality for GeometryCollection", (t) => { - const eq = new GeojsonEquality(); - - t.false( - eq.compare( - { - type: "GeometryCollection", - geometries: [{ type: "Point", coordinates: [0, 0] }], - }, - { - type: "GeometryCollection", - geometries: [ - { type: "Point", coordinates: [0, 0] }, - { type: "Point", coordinates: [0, 0] }, - ], - } - ) - ); - - t.false( - eq.compare( - { - type: "GeometryCollection", - geometries: [{ type: "Point", coordinates: [0, 0] }], - }, - { - type: "GeometryCollection", - geometries: [{ type: "Point", coordinates: [1, 1] }], - } - ) - ); - - t.false( - eq.compare( - { - type: "GeometryCollection", - geometries: [ - { type: "Point", coordinates: [0, 0] }, - { type: "Point", coordinates: [1, 1] }, - ], - }, - { - type: "GeometryCollection", - geometries: [ - { type: "Point", coordinates: [1, 1] }, - { type: "Point", coordinates: [0, 0] }, - ], - } - ) - ); - - t.true( - eq.compare( - { - type: "GeometryCollection", - geometries: [{ type: "Point", coordinates: [0, 0] }], - }, - { - type: "GeometryCollection", - geometries: [{ type: "Point", coordinates: [0, 0] }], - } - ) - ); - - t.true( - eq.compare( - { - type: "GeometryCollection", - geometries: [], - }, - { - type: "GeometryCollection", - geometries: [], - } - ) - ); - - t.false( - eq.compare( - { type: "GeometryCollection", geometries: [], bbox: [1, 2, 3, 4] }, - { type: "GeometryCollection", geometries: [] } - ) - ); - - t.false( - eq.compare( - { type: "GeometryCollection", geometries: [], bbox: [1, 2, 3, 4] }, - { type: "GeometryCollection", geometries: [], bbox: [1, 2, 3, 5] } - ) - ); - - t.true( - eq.compare( - { - type: "GeometryCollection", - geometries: [ - { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - ], - bbox: [10, 10, 41, 40], - }, - { - type: "GeometryCollection", - geometries: [ - { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - ], - bbox: [10, 10, 41, 40], - } - ) - ); - - t.false( - eq.compare( - { - type: "GeometryCollection", - geometries: [ - { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 10], - ], - ], - }, - ], - bbox: [10, 10, 41, 40], - }, - { - type: "GeometryCollection", - geometries: [ - { - type: "Polygon", - coordinates: [ - [ - [30, 10], - [41, 40], - [20, 40], - [10, 20], - [30, 1], - ], - ], - }, - ], - bbox: [10, 10, 41, 40], - } - ) - ); - t.end(); -}); - -test("turf-helpers -- GeojsonEquality precision", (t) => { - const eq6 = new GeojsonEquality({ precision: 6 }); - const eq7 = new GeojsonEquality({ precision: 7 }); - const eq10 = new GeojsonEquality({ precision: 10 }); - - const g1 = { type: "Point", coordinates: [100.55719328, 23.0365925] }; - const g2 = { type: "Point", coordinates: [100.5571932792, 23.0365924999] }; - - t.true(eq6.compare(g1, g2)); - t.true(eq7.compare(g1, g2)); - t.false(eq10.compare(g1, g2)); - t.end(); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 372c573d2e..8e5496913d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1146,6 +1146,9 @@ importers: '@turf/invariant': specifier: workspace:^ version: link:../turf-invariant + geojson-equality-ts: + specifier: ^1.0.2 + version: 1.0.2 tslib: specifier: ^2.6.2 version: 2.6.2 @@ -1251,6 +1254,9 @@ importers: '@turf/meta': specifier: workspace:^ version: link:../turf-meta + geojson-equality-ts: + specifier: ^1.0.2 + version: 1.0.2 tslib: specifier: ^2.6.2 version: 2.6.2 @@ -3154,9 +3160,6 @@ importers: packages/turf-helpers: dependencies: - deep-equal: - specifier: ^2.2.3 - version: 2.2.3 tslib: specifier: ^2.6.2 version: 2.6.2 @@ -3164,9 +3167,6 @@ importers: '@types/benchmark': specifier: ^2.1.5 version: 2.1.5 - '@types/deep-equal': - specifier: ^1.0.4 - version: 1.0.4 '@types/tape': specifier: ^4.2.32 version: 4.13.4 @@ -9064,6 +9064,10 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true + /@types/geojson@7946.0.14: + resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + dev: false + /@types/geojson@7946.0.8: resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==} @@ -12086,6 +12090,12 @@ packages: engines: {node: '>=6.9.0'} dev: true + /geojson-equality-ts@1.0.2: + resolution: {integrity: sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==} + dependencies: + '@types/geojson': 7946.0.14 + dev: false + /geojson-polygon-self-intersections@1.2.1: resolution: {integrity: sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==} dependencies: diff --git a/tsup.config.ts b/tsup.config.ts index 9ff2aa452b..283f087732 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -9,7 +9,6 @@ const baseOptions: Options = { sourcemap: true, target: "es2017", tsconfig: "./tsconfig.json", - keepNames: true, // treeshake: true, causes "chunk.default" warning, breaks CJS exports? cjsInterop: true, splitting: true,