@osmix/shared 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/dist/bbox-intersects.d.ts +1 -1
  3. package/dist/bbox-intersects.d.ts.map +1 -1
  4. package/dist/color.d.ts +1 -1
  5. package/dist/color.d.ts.map +1 -1
  6. package/dist/coordinates.d.ts +1 -1
  7. package/dist/coordinates.d.ts.map +1 -1
  8. package/dist/relation-kind.d.ts +1 -1
  9. package/dist/relation-kind.d.ts.map +1 -1
  10. package/dist/relation-multipolygon.d.ts +1 -1
  11. package/dist/relation-multipolygon.d.ts.map +1 -1
  12. package/dist/stream-to-bytes.js +1 -1
  13. package/dist/stream-to-bytes.js.map +1 -1
  14. package/dist/tile.d.ts +13 -1
  15. package/dist/tile.d.ts.map +1 -1
  16. package/dist/tile.js +15 -0
  17. package/dist/tile.js.map +1 -1
  18. package/dist/transform-bytes.js +2 -2
  19. package/dist/transform-bytes.js.map +1 -1
  20. package/dist/utils.d.ts +1 -1
  21. package/dist/utils.d.ts.map +1 -1
  22. package/dist/way-is-area.d.ts +1 -1
  23. package/dist/way-is-area.d.ts.map +1 -1
  24. package/package.json +12 -47
  25. package/src/bbox-intersects.ts +1 -1
  26. package/src/color.ts +1 -1
  27. package/src/coordinates.ts +1 -1
  28. package/src/relation-kind.ts +1 -1
  29. package/src/relation-multipolygon.ts +1 -1
  30. package/src/stream-to-bytes.ts +1 -1
  31. package/src/tile.ts +18 -1
  32. package/src/transform-bytes.ts +2 -2
  33. package/src/utils.ts +1 -1
  34. package/src/way-is-area.ts +1 -1
  35. package/test/csv-parse-stream.test.ts +67 -0
  36. package/test/haversine-distance.test.ts +8 -0
  37. package/test/relation-kind.test.ts +426 -0
  38. package/test/relation-multipolygon.test.ts +265 -0
  39. package/test/utils.test.ts +103 -0
  40. package/test/way-is-area.test.ts +42 -0
  41. package/tsconfig/base.json +2 -0
  42. package/tsconfig.build.json +5 -0
  43. package/tsconfig.json +9 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,82 @@
1
+ # @osmix/shared
2
+
3
+ ## 0.0.13
4
+
5
+ ### Patch Changes
6
+
7
+ - aba4bd8: Fix for nodejs package imports
8
+
9
+ ## 0.0.12
10
+
11
+ ### Patch Changes
12
+
13
+ - 2a634cb: Fix publishing
14
+
15
+ ## 0.0.11
16
+
17
+ ### Patch Changes
18
+
19
+ - 3c8ee95: Fix and simplify package exports
20
+
21
+ ## 0.0.10
22
+
23
+ ### Patch Changes
24
+
25
+ - 12728ed: Replace `csv-parse` usage in `@osmix/gtfs` with a browser-friendly shared streaming CSV parser in `@osmix/shared`, adapted from `mafintosh/csv-parser` parsing behavior.
26
+
27
+ ## 0.0.9
28
+
29
+ ### Patch Changes
30
+
31
+ - f32e4ee: General cleanup
32
+
33
+ ## 0.0.8
34
+
35
+ ### Patch Changes
36
+
37
+ - f468db5: Fix publishing (2)
38
+
39
+ ## 0.0.7
40
+
41
+ ### Patch Changes
42
+
43
+ - 68d6bd8: Fix publishing for packages.
44
+
45
+ ## 0.0.6
46
+
47
+ ### Patch Changes
48
+
49
+ - 0cd8a2e: Explore patterns for extending Osmix worker
50
+
51
+ ## 0.0.5
52
+
53
+ ### Patch Changes
54
+
55
+ - bb629cf: Simplify raster drawing when geometry is smaller than a pixel
56
+ - edbb26b: Handle more Relation types
57
+ - 69a36bd: Switch Nodes coordinate storage to Int32Array
58
+
59
+ ## 0.0.4
60
+
61
+ ### Patch Changes
62
+
63
+ - 572cbd8: Raster tile updates
64
+ - d001d9a: Refactor to align around new main external API
65
+
66
+ ## 0.0.3
67
+
68
+ ### Patch Changes
69
+
70
+ - b4a3ff2: Improve Relation handling and display
71
+
72
+ ## 0.0.2
73
+
74
+ ### Patch Changes
75
+
76
+ - 33d9c12: Modify types to take Uint8Array<ArrayBufferLike> for compatiblity
77
+
78
+ ## 0.0.1
79
+
80
+ ### Patch Changes
81
+
82
+ - Initial release
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- import type { GeoBbox2D } from "./types";
9
+ import type { GeoBbox2D } from "./types.ts";
10
10
  /**
11
11
  * Check if two bounding boxes intersect or contain each other.
12
12
  * Handles both partial overlaps and complete containment.
@@ -1 +1 @@
1
- {"version":3,"file":"bbox-intersects.d.ts","sourceRoot":"","sources":["../src/bbox-intersects.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,WActE"}
1
+ {"version":3,"file":"bbox-intersects.d.ts","sourceRoot":"","sources":["../src/bbox-intersects.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,WActE"}
package/dist/color.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Rgba } from "./types";
1
+ import type { Rgba } from "./types.ts";
2
2
  export declare function normalizeHexColor(value: string | number | null | undefined): string | undefined;
3
3
  export declare function hexColorToRgba(value: string | number | null | undefined): Rgba | undefined;
4
4
  //# sourceMappingURL=color.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAInC,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,GAAG,SAAS,CAiBpB;AAED,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,IAAI,GAAG,SAAS,CASlB"}
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAItC,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,GAAG,SAAS,CAiBpB;AAED,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,IAAI,GAAG,SAAS,CASlB"}
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import type { GeoBbox2D } from "./types";
10
+ import type { GeoBbox2D } from "./types.ts";
11
11
  /**
12
12
  * OSM coordinate scale: coordinates are stored as integer microdegrees.
13
13
  * 1 microdegree = 1e-7 degrees = 0.0000001 degrees
@@ -1 +1 @@
1
- {"version":3,"file":"coordinates.d.ts","sourceRoot":"","sources":["../src/coordinates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAM,CAAA;AAElC;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,SAAS,GACb,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAOlE"}
1
+ {"version":3,"file":"coordinates.d.ts","sourceRoot":"","sources":["../src/coordinates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAM,CAAA;AAElC;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,SAAS,GACb,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAOlE"}
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import type { LonLat, OsmRelation, OsmWay, RelationKind, RelationKindMetadata } from "./types";
10
+ import type { LonLat, OsmRelation, OsmWay, RelationKind, RelationKindMetadata } from "./types.ts";
11
11
  /**
12
12
  * Get the semantic kind of a relation based on its type tag.
13
13
  * Based on [OSM relation documentation](https://wiki.openstreetmap.org/wiki/Relation):
@@ -1 +1 @@
1
- {"version":3,"file":"relation-kind.d.ts","sourceRoot":"","sources":["../src/relation-kind.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACX,MAAM,EACN,WAAW,EAEX,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,MAAM,SAAS,CAAA;AAEhB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CA4CnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,WAAW,GACnB,oBAAoB,CAyCtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EACxC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,EAAE,CAmCZ;AAqJD;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,WAAW,EACrB,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,CAWV;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,EACvD,QAAQ,SAAK,EACb,OAAO,cAAoB,GACzB;IACF,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;CACnB,CA4DA"}
1
+ {"version":3,"file":"relation-kind.d.ts","sourceRoot":"","sources":["../src/relation-kind.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACX,MAAM,EACN,WAAW,EAEX,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CA4CnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,WAAW,GACnB,oBAAoB,CAyCtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EACxC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,EAAE,CAmCZ;AAqJD;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,WAAW,EACrB,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,CAWV;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,EACvD,QAAQ,SAAK,EACb,OAAO,cAAoB,GACzB;IACF,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;CACnB,CA4DA"}
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import type { LonLat, OsmRelation, OsmRelationMember, OsmWay } from "./types";
12
+ import type { LonLat, OsmRelation, OsmRelationMember, OsmWay } from "./types.ts";
13
13
  /**
14
14
  * Get way members from a relation, grouped by role (outer/inner).
15
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"relation-multipolygon.d.ts","sourceRoot":"","sources":["../src/relation-multipolygon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAE7E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,GAAG;IAC3D,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAC1B,KAAK,EAAE,iBAAiB,EAAE,CAAA;CAC1B,CAeA;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAwGnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EACxC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,EAAE,EAAE,CAwDd"}
1
+ {"version":3,"file":"relation-multipolygon.d.ts","sourceRoot":"","sources":["../src/relation-multipolygon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEhF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,GAAG;IAC3D,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAC1B,KAAK,EAAE,iBAAiB,EAAE,CAAA;CAC1B,CAeA;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAwGnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EACxC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,EAAE,EAAE,CAwDd"}
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * @module
7
7
  */
8
- import { concatBytes } from "./concat-bytes";
8
+ import { concatBytes } from "./concat-bytes.js";
9
9
  /**
10
10
  * Consume a ReadableStream and return all data as a single Uint8Array.
11
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"stream-to-bytes.js","sourceRoot":"","sources":["../src/stream-to-bytes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAA+C;IAE/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IACjC,MAAM,MAAM,GAA8B,EAAE,CAAA;IAE5C,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAE3C,IAAI,IAAI,EAAE,CAAC;YACV,MAAK;QACN,CAAC;QAED,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC"}
1
+ {"version":3,"file":"stream-to-bytes.js","sourceRoot":"","sources":["../src/stream-to-bytes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAA+C;IAE/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IACjC,MAAM,MAAM,GAA8B,EAAE,CAAA;IAE5C,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAE3C,IAAI,IAAI,EAAE,CAAC;YACV,MAAK;QACN,CAAC;QAED,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC"}
package/dist/tile.d.ts CHANGED
@@ -7,7 +7,9 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import type { GeoBbox2D, LonLat, Tile, TilePxBbox, XY } from "./types";
10
+ import { pointToTileFraction } from "@mapbox/tilebelt";
11
+ import type { GeoBbox2D, LonLat, Tile, TilePxBbox, XY } from "./types.ts";
12
+ export { pointToTileFraction };
11
13
  /**
12
14
  * Get the geographic bounding box of a tile.
13
15
  * Returns [west, south, east, north].
@@ -22,6 +24,16 @@ export declare function bboxToTilePx(bbox: GeoBbox2D, tile: Tile, tileSize?: num
22
24
  * Returns [x, y] in pixels relative to the top-left of the tile.
23
25
  */
24
26
  export declare function llToTilePx(ll: LonLat, tile: Tile, tileSize?: number): XY;
27
+ /**
28
+ * Convert lon/lat bounds to Web Mercator tile range for a zoom.
29
+ */
30
+ export declare function bboxToTileRange(bbox: GeoBbox2D, zoom: number): {
31
+ minX: number;
32
+ minY: number;
33
+ maxX: number;
34
+ maxY: number;
35
+ count: number;
36
+ };
25
37
  /**
26
38
  * Convert tile pixel coordinates to geographic coordinates.
27
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tile.d.ts","sourceRoot":"","sources":["../src/tile.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAatE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAOhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,IAAI,EACV,QAAQ,SAAM,GACZ,UAAU,CAIZ;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,SAAM,GAAG,EAAE,CAMrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,SAAM,GAAG,MAAM,CAKzE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,MAAM,GAAG,SAAS,GAChC,EAAE,CASJ"}
1
+ {"version":3,"file":"tile.d.ts","sourceRoot":"","sources":["../src/tile.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAIzE,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAW9B;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAOhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,IAAI,EACV,QAAQ,SAAM,GACZ,UAAU,CAIZ;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,SAAM,GAAG,EAAE,CAMrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM;;;;;;EAU5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,SAAM,GAAG,MAAM,CAKzE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,MAAM,GAAG,SAAS,GAChC,EAAE,CASJ"}
package/dist/tile.js CHANGED
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { pointToTileFraction } from "@mapbox/tilebelt";
11
11
  const RADIANS_TO_DEGREES = 180 / Math.PI;
12
+ export { pointToTileFraction };
12
13
  function tile2lon(x, z) {
13
14
  return (x / 2 ** z) * 360 - 180;
14
15
  }
@@ -47,6 +48,20 @@ export function llToTilePx(ll, tile, tileSize = 256) {
47
48
  const y = (tf[1] - ty) * tileSize;
48
49
  return [x, y];
49
50
  }
51
+ /**
52
+ * Convert lon/lat bounds to Web Mercator tile range for a zoom.
53
+ */
54
+ export function bboxToTileRange(bbox, zoom) {
55
+ const [west, south, east, north] = bbox;
56
+ const [xA, yA] = pointToTileFraction(west, north, zoom);
57
+ const [xB, yB] = pointToTileFraction(east, south, zoom);
58
+ const minX = Math.min(xA, xB);
59
+ const maxX = Math.max(xA, xB);
60
+ const minY = Math.min(yA, yB);
61
+ const maxY = Math.max(yA, yB);
62
+ const count = (maxX - minX + 1) * (maxY - minY + 1);
63
+ return { minX, minY, maxX, maxY, count };
64
+ }
50
65
  /**
51
66
  * Convert tile pixel coordinates to geographic coordinates.
52
67
  */
package/dist/tile.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tile.js","sourceRoot":"","sources":["../src/tile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tile.js","sourceRoot":"","sources":["../src/tile.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,8 @@
5
5
  *
6
6
  * @module
7
7
  */
8
- import { bytesToStream } from "./bytes-to-stream";
9
- import { streamToBytes } from "./stream-to-bytes";
8
+ import { bytesToStream } from "./bytes-to-stream.js";
9
+ import { streamToBytes } from "./stream-to-bytes.js";
10
10
  /**
11
11
  * Pipe a byte array through a TransformStream and return the result.
12
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"transform-bytes.js","sourceRoot":"","sources":["../src/transform-bytes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,KAA8B,EAC9B,eAGC;IAED,OAAO,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAA;AACxE,CAAC"}
1
+ {"version":3,"file":"transform-bytes.js","sourceRoot":"","sources":["../src/transform-bytes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,KAA8B,EAC9B,eAGC;IAED,OAAO,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAA;AACxE,CAAC"}
package/dist/utils.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- import type { GeoBbox2D, LonLat, OsmEntity, OsmEntityType, OsmNode, OsmRelation, OsmWay } from "./types";
9
+ import type { GeoBbox2D, LonLat, OsmEntity, OsmEntityType, OsmNode, OsmRelation, OsmWay } from "./types.ts";
10
10
  /** Type guard: check if entity is a Node. */
11
11
  export declare function isNode(entity: OsmEntity): entity is OsmNode;
12
12
  /** Check if two nodes are equal (position, tags, and info). */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACX,SAAS,EACT,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAO,EACP,WAAW,EACX,MAAM,EACN,MAAM,SAAS,CAAA;AAShB,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,OAAO,CAE3D;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,WAEjD;AAED,4CAA4C;AAC5C,wBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,MAAM,CAEzD;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,WAAW,CAEnE;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,WAE9C;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,WAE7D;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,WAO/D;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAK9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAY5D"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACX,SAAS,EACT,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAO,EACP,WAAW,EACX,MAAM,EACN,MAAM,YAAY,CAAA;AASnB,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,OAAO,CAE3D;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,WAEjD;AAED,4CAA4C;AAC5C,wBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,MAAM,CAEzD;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,WAAW,CAEnE;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,WAE9C;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,WAE7D;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,WAO/D;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAK9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAY5D"}
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import type { OsmWay } from "./types";
12
+ import type { OsmWay } from "./types.ts";
13
13
  /**
14
14
  * Determine if a way is an area based on its tags and nodes.
15
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"way-is-area.d.ts","sourceRoot":"","sources":["../src/way-is-area.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAqDrC;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CA+B/C"}
1
+ {"version":3,"file":"way-is-area.d.ts","sourceRoot":"","sources":["../src/way-is-area.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAqDxC;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CA+B/C"}
package/package.json CHANGED
@@ -1,70 +1,35 @@
1
1
  {
2
- "$schema": "https://json.schemastore.org/package",
3
2
  "name": "@osmix/shared",
4
3
  "type": "module",
5
- "version": "0.0.11",
4
+ "version": "0.0.13",
6
5
  "description": "Shared utilities for Osmix",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/conveyal/osmix.git"
10
+ },
7
11
  "exports": {
8
12
  "./tsconfig/base.json": "./tsconfig/base.json",
9
13
  "./tsconfig/test.json": "./tsconfig/test.json",
10
14
  "./tsconfig/app.json": "./tsconfig/app.json",
11
15
  "./*": {
12
- "types": "./src/*.ts",
13
- "bun": "./src/*.ts",
14
- "default": "./dist/*.js"
15
- }
16
- },
17
- "typesVersions": {
18
- "*": {
19
- "tsconfig/base.json": [
20
- "tsconfig/base.json"
21
- ],
22
- "tsconfig/test.json": [
23
- "tsconfig/test.json"
24
- ],
25
- "tsconfig/app.json": [
26
- "tsconfig/app.json"
27
- ],
28
- "*": [
29
- "src/*"
30
- ]
16
+ "default": "./dist/*.js",
17
+ "types": "./dist/*.d.ts"
31
18
  }
32
19
  },
33
- "publishConfig": {
34
- "access": "public"
35
- },
36
- "license": "MIT",
37
- "repository": {
38
- "type": "git",
39
- "url": "git+https://github.com/conveyal/osmix.git"
40
- },
41
- "homepage": "https://github.com/conveyal/osmix#readme",
42
- "bugs": {
43
- "url": "https://github.com/conveyal/osmix/issues"
44
- },
45
- "sideEffects": false,
46
20
  "scripts": {
47
21
  "build": "tsc -p tsconfig.build.json",
48
22
  "bench": "bun test --bench",
49
- "prepare": "bun run build",
50
- "release": "bun publish",
51
23
  "test": "bun test",
52
24
  "typecheck": "tsgo --noEmit"
53
25
  },
54
26
  "devDependencies": {
55
- "@types/bun": "catalog:",
56
- "typescript": "catalog:"
27
+ "@types/bun": "^1.3.9",
28
+ "typescript": "^5.9.0"
57
29
  },
58
30
  "dependencies": {
59
31
  "@mapbox/tilebelt": "^2.0.3",
60
- "dequal": "catalog:",
32
+ "dequal": "^2.0.3",
61
33
  "lineclip": "^2.0.0"
62
- },
63
- "files": [
64
- "dist",
65
- "src",
66
- "tsconfig",
67
- "README.md",
68
- "LICENSE"
69
- ]
34
+ }
70
35
  }
@@ -7,7 +7,7 @@
7
7
  * @module
8
8
  */
9
9
 
10
- import type { GeoBbox2D } from "./types"
10
+ import type { GeoBbox2D } from "./types.ts"
11
11
 
12
12
  /**
13
13
  * Check if two bounding boxes intersect or contain each other.
package/src/color.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Rgba } from "./types"
1
+ import type { Rgba } from "./types.ts"
2
2
 
3
3
  const hexPattern = /^[0-9a-fA-F]+$/
4
4
 
@@ -8,7 +8,7 @@
8
8
  * @module
9
9
  */
10
10
 
11
- import type { GeoBbox2D } from "./types"
11
+ import type { GeoBbox2D } from "./types.ts"
12
12
 
13
13
  /**
14
14
  * OSM coordinate scale: coordinates are stored as integer microdegrees.
@@ -15,7 +15,7 @@ import type {
15
15
  OsmWay,
16
16
  RelationKind,
17
17
  RelationKindMetadata,
18
- } from "./types"
18
+ } from "./types.ts"
19
19
 
20
20
  /**
21
21
  * Get the semantic kind of a relation based on its type tag.
@@ -10,7 +10,7 @@
10
10
  * @module
11
11
  */
12
12
 
13
- import type { LonLat, OsmRelation, OsmRelationMember, OsmWay } from "./types"
13
+ import type { LonLat, OsmRelation, OsmRelationMember, OsmWay } from "./types.ts"
14
14
 
15
15
  /**
16
16
  * Get way members from a relation, grouped by role (outer/inner).
@@ -6,7 +6,7 @@
6
6
  * @module
7
7
  */
8
8
 
9
- import { concatBytes } from "./concat-bytes"
9
+ import { concatBytes } from "./concat-bytes.ts"
10
10
 
11
11
  /**
12
12
  * Consume a ReadableStream and return all data as a single Uint8Array.
package/src/tile.ts CHANGED
@@ -9,10 +9,12 @@
9
9
  */
10
10
 
11
11
  import { pointToTileFraction } from "@mapbox/tilebelt"
12
- import type { GeoBbox2D, LonLat, Tile, TilePxBbox, XY } from "./types"
12
+ import type { GeoBbox2D, LonLat, Tile, TilePxBbox, XY } from "./types.ts"
13
13
 
14
14
  const RADIANS_TO_DEGREES = 180 / Math.PI
15
15
 
16
+ export { pointToTileFraction }
17
+
16
18
  function tile2lon(x: number, z: number): number {
17
19
  return (x / 2 ** z) * 360 - 180
18
20
  }
@@ -60,6 +62,21 @@ export function llToTilePx(ll: LonLat, tile: Tile, tileSize = 256): XY {
60
62
  return [x, y]
61
63
  }
62
64
 
65
+ /**
66
+ * Convert lon/lat bounds to Web Mercator tile range for a zoom.
67
+ */
68
+ export function bboxToTileRange(bbox: GeoBbox2D, zoom: number) {
69
+ const [west, south, east, north] = bbox
70
+ const [xA, yA] = pointToTileFraction(west, north, zoom)
71
+ const [xB, yB] = pointToTileFraction(east, south, zoom)
72
+ const minX = Math.min(xA, xB)
73
+ const maxX = Math.max(xA, xB)
74
+ const minY = Math.min(yA, yB)
75
+ const maxY = Math.max(yA, yB)
76
+ const count = (maxX - minX + 1) * (maxY - minY + 1)
77
+ return { minX, minY, maxX, maxY, count }
78
+ }
79
+
63
80
  /**
64
81
  * Convert tile pixel coordinates to geographic coordinates.
65
82
  */
@@ -6,8 +6,8 @@
6
6
  * @module
7
7
  */
8
8
 
9
- import { bytesToStream } from "./bytes-to-stream"
10
- import { streamToBytes } from "./stream-to-bytes"
9
+ import { bytesToStream } from "./bytes-to-stream.ts"
10
+ import { streamToBytes } from "./stream-to-bytes.ts"
11
11
 
12
12
  /**
13
13
  * Pipe a byte array through a TransformStream and return the result.
package/src/utils.ts CHANGED
@@ -16,7 +16,7 @@ import type {
16
16
  OsmNode,
17
17
  OsmRelation,
18
18
  OsmWay,
19
- } from "./types"
19
+ } from "./types.ts"
20
20
 
21
21
  /**
22
22
  * Check if two entities have equal tags and info.
@@ -10,7 +10,7 @@
10
10
  * @module
11
11
  */
12
12
 
13
- import type { OsmWay } from "./types"
13
+ import type { OsmWay } from "./types.ts"
14
14
 
15
15
  /**
16
16
  * Tags that imply an area unless their value is exactly "no"
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it } from "bun:test"
2
+ import {
3
+ CsvParseStream,
4
+ type CsvParseStreamOptions,
5
+ } from "../src/csv-parse-stream"
6
+
7
+ async function parseCsv(
8
+ chunks: string[],
9
+ opts: CsvParseStreamOptions = {},
10
+ ): Promise<Record<string, string>[]> {
11
+ const source = new ReadableStream<string>({
12
+ start(controller) {
13
+ for (const chunk of chunks) controller.enqueue(chunk)
14
+ controller.close()
15
+ },
16
+ })
17
+
18
+ const parsed = source.pipeThrough(new CsvParseStream(opts))
19
+ return Array.fromAsync(parsed)
20
+ }
21
+
22
+ describe("CsvParseStream", () => {
23
+ it("parses basic header + rows", async () => {
24
+ const rows = await parseCsv(["id,name\n1,Alice\n2,Bob\n"])
25
+ expect(rows).toEqual([
26
+ { id: "1", name: "Alice" },
27
+ { id: "2", name: "Bob" },
28
+ ])
29
+ })
30
+
31
+ it("handles quoted fields with commas and escaped quotes", async () => {
32
+ const rows = await parseCsv([
33
+ 'id,name,notes\n1,"Alice, A.","says ""hi"""\n',
34
+ ])
35
+
36
+ expect(rows).toEqual([{ id: "1", name: "Alice, A.", notes: 'says "hi"' }])
37
+ })
38
+
39
+ it("handles fields split across chunks", async () => {
40
+ const rows = await parseCsv([
41
+ "id,name,notes\n1,Alice,",
42
+ '"line one',
43
+ ' and two"\n2,Bob,ok\n',
44
+ ])
45
+
46
+ expect(rows).toEqual([
47
+ { id: "1", name: "Alice", notes: "line one and two" },
48
+ { id: "2", name: "Bob", notes: "ok" },
49
+ ])
50
+ })
51
+
52
+ it("supports comment skipping + header/value mapping", async () => {
53
+ const rows = await parseCsv(
54
+ ["# comment\n", "id,name\n", "1,Alice\n", "2,Bob\n"],
55
+ {
56
+ skipComments: true,
57
+ mapHeaders: ({ header }) => header.toUpperCase(),
58
+ mapValues: ({ value }) => value.trim(),
59
+ },
60
+ )
61
+
62
+ expect(rows).toEqual([
63
+ { ID: "1", NAME: "Alice" },
64
+ { ID: "2", NAME: "Bob" },
65
+ ])
66
+ })
67
+ })
@@ -0,0 +1,8 @@
1
+ import { expect, test } from "bun:test"
2
+ import { haversineDistance } from "../src/haversine-distance"
3
+
4
+ test("haversineDistance", () => {
5
+ const p1: [number, number] = [-75.343, 39.984]
6
+ const p2: [number, number] = [-75.534, 39.123]
7
+ expect(haversineDistance(p1, p2)).toBeCloseTo(97129.2211, 3)
8
+ })