@osmix/shared 0.0.2 → 0.0.7

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 (208) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +49 -19
  3. package/dist/assert.d.ts +24 -0
  4. package/dist/assert.d.ts.map +1 -0
  5. package/dist/assert.js +28 -0
  6. package/dist/assert.js.map +1 -0
  7. package/dist/bbox-intersects.d.ts +15 -0
  8. package/dist/bbox-intersects.d.ts.map +1 -0
  9. package/dist/bbox-intersects.js +24 -0
  10. package/dist/bbox-intersects.js.map +1 -0
  11. package/dist/bytes-to-stream.d.ts +18 -0
  12. package/dist/bytes-to-stream.d.ts.map +1 -0
  13. package/dist/bytes-to-stream.js +25 -0
  14. package/dist/bytes-to-stream.js.map +1 -0
  15. package/dist/color.d.ts +4 -0
  16. package/dist/color.d.ts.map +1 -0
  17. package/dist/color.js +33 -0
  18. package/dist/color.js.map +1 -0
  19. package/dist/concat-bytes.d.ts +5 -0
  20. package/dist/concat-bytes.d.ts.map +1 -0
  21. package/dist/concat-bytes.js +14 -0
  22. package/dist/concat-bytes.js.map +1 -0
  23. package/dist/coordinates.d.ts +28 -0
  24. package/dist/coordinates.d.ts.map +1 -0
  25. package/dist/coordinates.js +38 -0
  26. package/dist/coordinates.js.map +1 -0
  27. package/dist/haversine-distance.d.ts +16 -0
  28. package/dist/haversine-distance.d.ts.map +1 -0
  29. package/dist/haversine-distance.js +26 -0
  30. package/dist/haversine-distance.js.map +1 -0
  31. package/dist/lineclip.d.ts +2 -0
  32. package/dist/lineclip.d.ts.map +1 -0
  33. package/dist/lineclip.js +3 -0
  34. package/dist/lineclip.js.map +1 -0
  35. package/dist/progress.d.ts +42 -0
  36. package/dist/progress.d.ts.map +1 -0
  37. package/dist/progress.js +53 -0
  38. package/dist/progress.js.map +1 -0
  39. package/dist/relation-kind.d.ts +69 -0
  40. package/dist/relation-kind.d.ts.map +1 -0
  41. package/dist/relation-kind.js +375 -0
  42. package/dist/relation-kind.js.map +1 -0
  43. package/dist/relation-multipolygon.d.ts +43 -0
  44. package/dist/relation-multipolygon.d.ts.map +1 -0
  45. package/dist/relation-multipolygon.js +195 -0
  46. package/dist/relation-multipolygon.js.map +1 -0
  47. package/dist/src/assert.d.ts +20 -1
  48. package/dist/src/assert.d.ts.map +1 -1
  49. package/dist/src/assert.js +20 -1
  50. package/dist/src/assert.js.map +1 -1
  51. package/dist/src/bbox-intersects.d.ts +15 -0
  52. package/dist/src/bbox-intersects.d.ts.map +1 -0
  53. package/dist/src/bbox-intersects.js +24 -0
  54. package/dist/src/bbox-intersects.js.map +1 -0
  55. package/dist/src/bytes-to-stream.d.ts +17 -1
  56. package/dist/src/bytes-to-stream.d.ts.map +1 -1
  57. package/dist/src/bytes-to-stream.js +16 -0
  58. package/dist/src/bytes-to-stream.js.map +1 -1
  59. package/dist/src/color.d.ts +4 -0
  60. package/dist/src/color.d.ts.map +1 -0
  61. package/dist/src/color.js +33 -0
  62. package/dist/src/color.js.map +1 -0
  63. package/dist/src/coordinates.d.ts +28 -0
  64. package/dist/src/coordinates.d.ts.map +1 -0
  65. package/dist/src/coordinates.js +38 -0
  66. package/dist/src/coordinates.js.map +1 -0
  67. package/dist/src/haversine-distance.d.ts +9 -1
  68. package/dist/src/haversine-distance.d.ts.map +1 -1
  69. package/dist/src/haversine-distance.js +9 -1
  70. package/dist/src/haversine-distance.js.map +1 -1
  71. package/dist/src/progress.d.ts +42 -0
  72. package/dist/src/progress.d.ts.map +1 -0
  73. package/dist/src/progress.js +53 -0
  74. package/dist/src/progress.js.map +1 -0
  75. package/dist/src/relation-kind.d.ts +69 -0
  76. package/dist/src/relation-kind.d.ts.map +1 -0
  77. package/dist/src/relation-kind.js +375 -0
  78. package/dist/src/relation-kind.js.map +1 -0
  79. package/dist/src/relation-multipolygon.d.ts +43 -0
  80. package/dist/src/relation-multipolygon.d.ts.map +1 -0
  81. package/dist/src/relation-multipolygon.js +195 -0
  82. package/dist/src/relation-multipolygon.js.map +1 -0
  83. package/dist/src/stream-to-bytes.d.ts +16 -0
  84. package/dist/src/stream-to-bytes.d.ts.map +1 -1
  85. package/dist/src/stream-to-bytes.js +16 -0
  86. package/dist/src/stream-to-bytes.js.map +1 -1
  87. package/dist/src/test/fixtures.d.ts +1 -1
  88. package/dist/src/test/fixtures.d.ts.map +1 -1
  89. package/dist/src/test/fixtures.js +16 -8
  90. package/dist/src/test/fixtures.js.map +1 -1
  91. package/dist/src/throttle.d.ts +25 -0
  92. package/dist/src/throttle.d.ts.map +1 -0
  93. package/dist/src/throttle.js +34 -0
  94. package/dist/src/throttle.js.map +1 -0
  95. package/dist/src/tile.d.ts +34 -0
  96. package/dist/src/tile.d.ts.map +1 -0
  97. package/dist/src/tile.js +72 -0
  98. package/dist/src/tile.js.map +1 -0
  99. package/dist/src/transform-bytes.d.ts +22 -0
  100. package/dist/src/transform-bytes.d.ts.map +1 -1
  101. package/dist/src/transform-bytes.js +22 -0
  102. package/dist/src/transform-bytes.js.map +1 -1
  103. package/dist/src/types.d.ts +76 -1
  104. package/dist/src/types.d.ts.map +1 -1
  105. package/dist/src/types.js +8 -0
  106. package/dist/src/types.js.map +1 -1
  107. package/dist/src/utils.d.ts +30 -0
  108. package/dist/src/utils.d.ts.map +1 -0
  109. package/dist/src/utils.js +70 -0
  110. package/dist/src/utils.js.map +1 -0
  111. package/dist/src/way-is-area.d.ts +24 -0
  112. package/dist/src/way-is-area.d.ts.map +1 -0
  113. package/dist/src/way-is-area.js +104 -0
  114. package/dist/src/way-is-area.js.map +1 -0
  115. package/dist/src/zigzag.d.ts +33 -0
  116. package/dist/src/zigzag.d.ts.map +1 -0
  117. package/dist/src/zigzag.js +40 -0
  118. package/dist/src/zigzag.js.map +1 -0
  119. package/dist/stream-to-bytes.d.ts +18 -0
  120. package/dist/stream-to-bytes.d.ts.map +1 -0
  121. package/dist/stream-to-bytes.js +30 -0
  122. package/dist/stream-to-bytes.js.map +1 -0
  123. package/dist/test/fixtures.d.ts +36 -0
  124. package/dist/test/fixtures.d.ts.map +1 -0
  125. package/dist/test/fixtures.js +175 -0
  126. package/dist/test/fixtures.js.map +1 -0
  127. package/dist/test/haversine-distance.test.js +2 -2
  128. package/dist/test/haversine-distance.test.js.map +1 -1
  129. package/dist/test/relation-kind.test.d.ts +2 -0
  130. package/dist/test/relation-kind.test.d.ts.map +1 -0
  131. package/dist/test/relation-kind.test.js +367 -0
  132. package/dist/test/relation-kind.test.js.map +1 -0
  133. package/dist/test/relation-multipolygon.test.d.ts +2 -0
  134. package/dist/test/relation-multipolygon.test.d.ts.map +1 -0
  135. package/dist/test/relation-multipolygon.test.js +237 -0
  136. package/dist/test/relation-multipolygon.test.js.map +1 -0
  137. package/dist/test/utils.test.d.ts +2 -0
  138. package/dist/test/utils.test.d.ts.map +1 -0
  139. package/dist/test/utils.test.js +76 -0
  140. package/dist/test/utils.test.js.map +1 -0
  141. package/dist/test/way-is-area.test.d.ts +2 -0
  142. package/dist/test/way-is-area.test.d.ts.map +1 -0
  143. package/dist/test/way-is-area.test.js +31 -0
  144. package/dist/test/way-is-area.test.js.map +1 -0
  145. package/dist/throttle.d.ts +25 -0
  146. package/dist/throttle.d.ts.map +1 -0
  147. package/dist/throttle.js +34 -0
  148. package/dist/throttle.js.map +1 -0
  149. package/dist/tile.d.ts +34 -0
  150. package/dist/tile.d.ts.map +1 -0
  151. package/dist/tile.js +72 -0
  152. package/dist/tile.js.map +1 -0
  153. package/dist/transform-bytes.d.ts +24 -0
  154. package/dist/transform-bytes.d.ts.map +1 -0
  155. package/dist/transform-bytes.js +28 -0
  156. package/dist/transform-bytes.js.map +1 -0
  157. package/dist/types.d.ts +99 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +9 -0
  160. package/dist/types.js.map +1 -0
  161. package/dist/utils.d.ts +30 -0
  162. package/dist/utils.d.ts.map +1 -0
  163. package/dist/utils.js +70 -0
  164. package/dist/utils.js.map +1 -0
  165. package/dist/way-is-area.d.ts +24 -0
  166. package/dist/way-is-area.d.ts.map +1 -0
  167. package/dist/way-is-area.js +104 -0
  168. package/dist/way-is-area.js.map +1 -0
  169. package/dist/zigzag.d.ts +33 -0
  170. package/dist/zigzag.d.ts.map +1 -0
  171. package/dist/zigzag.js +40 -0
  172. package/dist/zigzag.js.map +1 -0
  173. package/package.json +11 -10
  174. package/src/assert.ts +21 -1
  175. package/src/bbox-intersects.ts +30 -0
  176. package/src/bytes-to-stream.ts +17 -0
  177. package/src/color.ts +37 -0
  178. package/src/coordinates.ts +45 -0
  179. package/src/haversine-distance.ts +10 -1
  180. package/src/progress.ts +74 -0
  181. package/src/relation-kind.ts +446 -0
  182. package/src/relation-multipolygon.ts +225 -0
  183. package/src/stream-to-bytes.ts +17 -0
  184. package/src/test/fixtures.ts +16 -12
  185. package/src/throttle.ts +37 -0
  186. package/src/tile.ts +89 -0
  187. package/src/transform-bytes.ts +23 -0
  188. package/src/types.ts +93 -1
  189. package/src/utils.ts +79 -0
  190. package/src/way-is-area.ts +107 -0
  191. package/src/zigzag.ts +42 -0
  192. package/test/haversine-distance.test.ts +2 -2
  193. package/test/relation-kind.test.ts +426 -0
  194. package/test/relation-multipolygon.test.ts +265 -0
  195. package/test/utils.test.ts +103 -0
  196. package/test/way-is-area.test.ts +42 -0
  197. package/tsconfig/test.json +1 -0
  198. package/tsconfig.build.json +5 -0
  199. package/dist/src/spherical-mercator.d.ts +0 -15
  200. package/dist/src/spherical-mercator.d.ts.map +0 -1
  201. package/dist/src/spherical-mercator.js +0 -35
  202. package/dist/src/spherical-mercator.js.map +0 -1
  203. package/dist/src/spherical-mercator.test.d.ts +0 -2
  204. package/dist/src/spherical-mercator.test.d.ts.map +0 -1
  205. package/dist/src/spherical-mercator.test.js +0 -25
  206. package/dist/src/spherical-mercator.test.js.map +0 -1
  207. package/src/spherical-mercator.test.ts +0 -42
  208. package/src/spherical-mercator.ts +0 -42
@@ -0,0 +1,237 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { buildRelationRings, connectWaysToRings, getWayMembersByRole, } from "../src/relation-multipolygon";
3
+ describe("relation-multipolygon", () => {
4
+ describe("getWayMembersByRole", () => {
5
+ it("groups way members by outer and inner roles", () => {
6
+ const relation = {
7
+ id: 1,
8
+ tags: { type: "multipolygon" },
9
+ members: [
10
+ { type: "way", ref: 10, role: "outer" },
11
+ { type: "way", ref: 11, role: "inner" },
12
+ { type: "way", ref: 12, role: "outer" },
13
+ { type: "node", ref: 1 },
14
+ { type: "way", ref: 13, role: "inner" },
15
+ ],
16
+ };
17
+ const { outer, inner } = getWayMembersByRole(relation);
18
+ expect(outer).toHaveLength(2);
19
+ expect(outer[0]?.ref).toBe(10);
20
+ expect(outer[1]?.ref).toBe(12);
21
+ expect(inner).toHaveLength(2);
22
+ expect(inner[0]?.ref).toBe(11);
23
+ expect(inner[1]?.ref).toBe(13);
24
+ });
25
+ it("handles case-insensitive roles", () => {
26
+ const relation = {
27
+ id: 1,
28
+ tags: { type: "multipolygon" },
29
+ members: [
30
+ { type: "way", ref: 10, role: "OUTER" },
31
+ { type: "way", ref: 11, role: "Inner" },
32
+ ],
33
+ };
34
+ const { outer, inner } = getWayMembersByRole(relation);
35
+ expect(outer).toHaveLength(1);
36
+ expect(inner).toHaveLength(1);
37
+ });
38
+ it("handles missing roles", () => {
39
+ const relation = {
40
+ id: 1,
41
+ tags: { type: "multipolygon" },
42
+ members: [
43
+ { type: "way", ref: 10 },
44
+ { type: "way", ref: 11, role: "outer" },
45
+ ],
46
+ };
47
+ const { outer, inner } = getWayMembersByRole(relation);
48
+ expect(outer).toHaveLength(1);
49
+ expect(inner).toHaveLength(0);
50
+ });
51
+ });
52
+ describe("connectWaysToRings", () => {
53
+ it("connects ways sharing endpoints into a single ring", () => {
54
+ const way1 = { id: 1, refs: [1, 2] };
55
+ const way2 = { id: 2, refs: [2, 3] };
56
+ const way3 = { id: 3, refs: [3, 1] };
57
+ const rings = connectWaysToRings([way1, way2, way3]);
58
+ expect(rings).toHaveLength(1);
59
+ expect(rings[0]).toEqual([way1, way2, way3]);
60
+ });
61
+ it("handles ways that need to be reversed", () => {
62
+ // way1 ends at 2, way2 starts at 2 (normal connection)
63
+ const way1 = { id: 1, refs: [1, 2] };
64
+ const way2 = { id: 2, refs: [2, 3, 4] };
65
+ const rings = connectWaysToRings([way1, way2]);
66
+ // Should create a ring if ways connect and form a closed loop
67
+ // This test verifies basic connection logic
68
+ expect(rings.length).toBeGreaterThanOrEqual(0);
69
+ });
70
+ it("creates separate rings for disconnected ways", () => {
71
+ const way1 = { id: 1, refs: [1, 2, 1] }; // closed ring
72
+ const way2 = { id: 2, refs: [3, 4, 3] }; // separate closed ring
73
+ const rings = connectWaysToRings([way1, way2]);
74
+ expect(rings).toHaveLength(2);
75
+ });
76
+ it("only includes closed rings", () => {
77
+ const way1 = { id: 1, refs: [1, 2, 3] }; // not closed
78
+ const way2 = { id: 2, refs: [4, 5, 4] }; // closed
79
+ const rings = connectWaysToRings([way1, way2]);
80
+ // Only the closed ring should be included
81
+ expect(rings.length).toBeGreaterThanOrEqual(1);
82
+ });
83
+ });
84
+ describe("buildRelationRings", () => {
85
+ it("builds simple multipolygon with outer ring only", () => {
86
+ const relation = {
87
+ id: 1,
88
+ tags: { type: "multipolygon" },
89
+ members: [{ type: "way", ref: 1, role: "outer" }],
90
+ };
91
+ const way1 = {
92
+ id: 1,
93
+ refs: [1, 2, 3, 4, 1],
94
+ };
95
+ const getWay = (id) => (id === 1 ? way1 : null);
96
+ const getNodeCoordinates = (id) => {
97
+ const coords = {
98
+ 1: [0.0, 0.0],
99
+ 2: [1.0, 0.0],
100
+ 3: [1.0, 1.0],
101
+ 4: [0.0, 1.0],
102
+ };
103
+ return coords[id];
104
+ };
105
+ const rings = buildRelationRings(relation, getWay, getNodeCoordinates);
106
+ expect(rings).toHaveLength(1);
107
+ expect(rings[0]).toHaveLength(1); // one outer ring
108
+ expect(rings[0]?.[0]).toHaveLength(5); // closed ring with 5 points
109
+ });
110
+ it("builds multipolygon with outer and inner rings (holes)", () => {
111
+ const relation = {
112
+ id: 1,
113
+ tags: { type: "multipolygon" },
114
+ members: [
115
+ { type: "way", ref: 1, role: "outer" },
116
+ { type: "way", ref: 2, role: "inner" },
117
+ ],
118
+ };
119
+ const way1 = {
120
+ id: 1,
121
+ refs: [1, 2, 3, 4, 1], // outer square
122
+ };
123
+ const way2 = {
124
+ id: 2,
125
+ refs: [5, 6, 7, 5], // inner triangle
126
+ };
127
+ const getWay = (id) => {
128
+ if (id === 1)
129
+ return way1;
130
+ if (id === 2)
131
+ return way2;
132
+ return null;
133
+ };
134
+ const getNodeCoordinates = (id) => {
135
+ const coords = {
136
+ 1: [-1.0, -1.0],
137
+ 2: [1.0, -1.0],
138
+ 3: [1.0, 1.0],
139
+ 4: [-1.0, 1.0],
140
+ 5: [-0.5, 0.0],
141
+ 6: [0.5, 0.0],
142
+ 7: [0.0, 0.5],
143
+ };
144
+ return coords[id];
145
+ };
146
+ const rings = buildRelationRings(relation, getWay, getNodeCoordinates);
147
+ expect(rings).toHaveLength(1);
148
+ expect(rings[0]).toHaveLength(2); // outer + inner
149
+ expect(rings[0]?.[0]).toBeDefined(); // outer ring
150
+ expect(rings[0]?.[1]).toBeDefined(); // inner ring (hole)
151
+ });
152
+ it("builds multipolygon with multiple outer rings", () => {
153
+ const relation = {
154
+ id: 1,
155
+ tags: { type: "multipolygon" },
156
+ members: [
157
+ { type: "way", ref: 1, role: "outer" },
158
+ { type: "way", ref: 2, role: "outer" },
159
+ ],
160
+ };
161
+ const way1 = {
162
+ id: 1,
163
+ refs: [1, 2, 3, 1], // first polygon
164
+ };
165
+ const way2 = {
166
+ id: 2,
167
+ refs: [4, 5, 6, 4], // second polygon
168
+ };
169
+ const getWay = (id) => {
170
+ if (id === 1)
171
+ return way1;
172
+ if (id === 2)
173
+ return way2;
174
+ return null;
175
+ };
176
+ const getNodeCoordinates = (id) => {
177
+ const coords = {
178
+ 1: [0.0, 0.0],
179
+ 2: [1.0, 0.0],
180
+ 3: [0.5, 1.0],
181
+ 4: [2.0, 0.0],
182
+ 5: [3.0, 0.0],
183
+ 6: [2.5, 1.0],
184
+ };
185
+ return coords[id];
186
+ };
187
+ const rings = buildRelationRings(relation, getWay, getNodeCoordinates);
188
+ expect(rings).toHaveLength(2); // two separate polygons
189
+ });
190
+ it("handles relation similar to osmtogeojson test case", () => {
191
+ // Based on: https://github.com/placemark/osmtogeojson/blob/main/test/osm.test.js
192
+ const relation = {
193
+ id: 1,
194
+ tags: { type: "multipolygon" },
195
+ members: [
196
+ { type: "way", ref: 2, role: "outer" },
197
+ { type: "way", ref: 3, role: "inner" },
198
+ ],
199
+ };
200
+ const way2 = {
201
+ id: 2,
202
+ refs: [4, 5, 6, 7, 4], // outer square
203
+ };
204
+ const way3 = {
205
+ id: 3,
206
+ refs: [8, 9, 10, 8], // inner triangle
207
+ };
208
+ const getWay = (id) => {
209
+ if (id === 2)
210
+ return way2;
211
+ if (id === 3)
212
+ return way3;
213
+ return null;
214
+ };
215
+ const getNodeCoordinates = (id) => {
216
+ const coords = {
217
+ 4: [-1.0, -1.0],
218
+ 5: [-1.0, 1.0],
219
+ 6: [1.0, 1.0],
220
+ 7: [1.0, -1.0],
221
+ 8: [-0.5, 0.0],
222
+ 9: [0.5, 0.0],
223
+ 10: [0.0, 0.5],
224
+ };
225
+ return coords[id];
226
+ };
227
+ const rings = buildRelationRings(relation, getWay, getNodeCoordinates);
228
+ expect(rings).toHaveLength(1);
229
+ expect(rings[0]).toHaveLength(2); // outer + inner
230
+ // Outer ring should have 5 points (closed square)
231
+ expect(rings[0]?.[0]).toHaveLength(5);
232
+ // Inner ring should have 4 points (closed triangle)
233
+ expect(rings[0]?.[1]).toHaveLength(4);
234
+ });
235
+ });
236
+ });
237
+ //# sourceMappingURL=relation-multipolygon.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-multipolygon.test.js","sourceRoot":"","sources":["../../test/relation-multipolygon.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { entityPropertiesEqual, getEntityType, isMultipolygonRelation, isNode, isNodeEqual, isRelation, isRelationEqual, isWay, isWayEqual, } from "../src/utils";
3
+ describe("utils", () => {
4
+ const node = {
5
+ id: 1,
6
+ lat: 10,
7
+ lon: 20,
8
+ tags: { name: "node" },
9
+ };
10
+ const way = {
11
+ id: 2,
12
+ refs: [1, 2, 3],
13
+ tags: { highway: "residential" },
14
+ };
15
+ const members = [
16
+ {
17
+ type: "node",
18
+ ref: 1,
19
+ },
20
+ ];
21
+ const relation = {
22
+ id: 3,
23
+ members,
24
+ tags: { type: "multipolygon" },
25
+ };
26
+ it("narrows entity types", () => {
27
+ expect(isNode(node)).toBe(true);
28
+ expect(isWay(way)).toBe(true);
29
+ expect(isRelation(relation)).toBe(true);
30
+ });
31
+ it("compares entity equality", () => {
32
+ expect(isNodeEqual(node, { ...node })).toBe(true);
33
+ expect(isWayEqual(way, { ...way })).toBe(true);
34
+ expect(isRelationEqual(relation, { ...relation })).toBe(true);
35
+ });
36
+ it("detects property differences", () => {
37
+ expect(entityPropertiesEqual(node, { ...node, tags: { name: "changed" } })).toBe(false);
38
+ expect(entityPropertiesEqual(way, { ...way, refs: [1, 2, 4] })).toBe(false);
39
+ expect(entityPropertiesEqual(relation, {
40
+ ...relation,
41
+ members: [{ type: "node", ref: 2 }],
42
+ })).toBe(false);
43
+ });
44
+ it("provides entity type", () => {
45
+ expect(getEntityType(node)).toBe("node");
46
+ expect(getEntityType(way)).toBe("way");
47
+ expect(getEntityType(relation)).toBe("relation");
48
+ });
49
+ describe("isMultipolygonRelation", () => {
50
+ it("identifies multipolygon relations", () => {
51
+ const relation = {
52
+ id: 1,
53
+ tags: { type: "multipolygon" },
54
+ members: [],
55
+ };
56
+ expect(isMultipolygonRelation(relation)).toBe(true);
57
+ });
58
+ it("rejects non-multipolygon relations", () => {
59
+ const relation = {
60
+ id: 1,
61
+ tags: { type: "route" },
62
+ members: [],
63
+ };
64
+ expect(isMultipolygonRelation(relation)).toBe(false);
65
+ });
66
+ it("rejects relations without type tag", () => {
67
+ const relation = {
68
+ id: 1,
69
+ tags: { name: "test" },
70
+ members: [],
71
+ };
72
+ expect(isMultipolygonRelation(relation)).toBe(false);
73
+ });
74
+ });
75
+ });
76
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=way-is-area.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"way-is-area.test.d.ts","sourceRoot":"","sources":["../../test/way-is-area.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { wayIsArea } from "../src/way-is-area";
3
+ describe("wayIsArea", () => {
4
+ it("returns false for open ways", () => {
5
+ const refs = [1, 2, 3];
6
+ expect(wayIsArea({ id: 0, refs, tags: { building: "yes" } })).toBe(false);
7
+ });
8
+ it("returns true for closed way without tags", () => {
9
+ const refs = [1, 2, 3, 1];
10
+ expect(wayIsArea({ id: 0, refs })).toBe(true);
11
+ });
12
+ it("honors explicit area override", () => {
13
+ const refs = [1, 2, 3, 1];
14
+ expect(wayIsArea({ id: 0, refs, tags: { area: "no", building: "yes" } })).toBe(false);
15
+ expect(wayIsArea({ id: 0, refs, tags: { area: "yes" } })).toBe(true);
16
+ });
17
+ it("treats implied tags as areas", () => {
18
+ const refs = [1, 2, 3, 1];
19
+ expect(wayIsArea({ id: 0, refs, tags: { building: "yes" } })).toBe(true);
20
+ });
21
+ it("considers included values", () => {
22
+ const refs = [1, 2, 3, 1];
23
+ expect(wayIsArea({ id: 0, refs, tags: { highway: "rest_area" } })).toBe(true);
24
+ expect(wayIsArea({ id: 0, refs, tags: { highway: "primary" } })).toBe(false);
25
+ });
26
+ it("rejects excluded values", () => {
27
+ const refs = [1, 2, 3, 1];
28
+ expect(wayIsArea({ id: 0, refs, tags: { natural: "coastline" } })).toBe(false);
29
+ });
30
+ });
31
+ //# sourceMappingURL=way-is-area.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"way-is-area.test.js","sourceRoot":"","sources":["../../test/way-is-area.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Throttling utilities for rate-limiting function calls.
3
+ *
4
+ * Useful for limiting progress updates from workers or other high-frequency
5
+ * operations to avoid overwhelming the UI or logging.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Create a throttled version of a function that only executes at most
11
+ * once per `timeFrame` milliseconds.
12
+ *
13
+ * @param func - The function to throttle.
14
+ * @param timeFrame - Minimum time between calls in milliseconds.
15
+ * @returns A throttled version of the function.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const logThrottled = throttle((msg) => console.log(msg), 1000)
20
+ * // Only logs at most once per second
21
+ * for (let i = 0; i < 1000; i++) logThrottled(`Progress: ${i}`)
22
+ * ```
23
+ */
24
+ export declare function throttle<T extends unknown[]>(func: (...args: T) => void, timeFrame: number): (...args: T) => void;
25
+ //# sourceMappingURL=throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../src/throttle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,EAC3C,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,EAC1B,SAAS,EAAE,MAAM,IAGT,GAAG,MAAM,CAAC,UAOlB"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Throttling utilities for rate-limiting function calls.
3
+ *
4
+ * Useful for limiting progress updates from workers or other high-frequency
5
+ * operations to avoid overwhelming the UI or logging.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Create a throttled version of a function that only executes at most
11
+ * once per `timeFrame` milliseconds.
12
+ *
13
+ * @param func - The function to throttle.
14
+ * @param timeFrame - Minimum time between calls in milliseconds.
15
+ * @returns A throttled version of the function.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const logThrottled = throttle((msg) => console.log(msg), 1000)
20
+ * // Only logs at most once per second
21
+ * for (let i = 0; i < 1000; i++) logThrottled(`Progress: ${i}`)
22
+ * ```
23
+ */
24
+ export function throttle(func, timeFrame) {
25
+ let lastTime = 0;
26
+ return (...args) => {
27
+ const now = Date.now();
28
+ if (now - lastTime >= timeFrame) {
29
+ func(...args);
30
+ lastTime = now;
31
+ }
32
+ };
33
+ }
34
+ //# sourceMappingURL=throttle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.js","sourceRoot":"","sources":["../src/throttle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CACvB,IAA0B,EAC1B,SAAiB;IAEjB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,OAAO,CAAC,GAAG,IAAO,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;YACb,QAAQ,GAAG,GAAG,CAAA;QACf,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
package/dist/tile.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * XYZ tile coordinate utilities.
3
+ *
4
+ * Provides conversions between geographic coordinates (lon/lat) and
5
+ * tile pixel coordinates for XYZ tiled map systems. Supports various
6
+ * tile sizes and zoom levels.
7
+ *
8
+ * @module
9
+ */
10
+ import type { GeoBbox2D, LonLat, Tile, TilePxBbox, XY } from "./types";
11
+ /**
12
+ * Get the geographic bounding box of a tile.
13
+ * Returns [west, south, east, north].
14
+ */
15
+ export declare function tileToBbox(tile: Tile): GeoBbox2D;
16
+ /**
17
+ * Convert a bounding box from geographic coordinates to tile pixel coordinates.
18
+ */
19
+ export declare function bboxToTilePx(bbox: GeoBbox2D, tile: Tile, tileSize?: number): TilePxBbox;
20
+ /**
21
+ * Convert a geographic coordinate to tile pixel coordinates.
22
+ * Returns [x, y] in pixels relative to the top-left of the tile.
23
+ */
24
+ export declare function llToTilePx(ll: LonLat, tile: Tile, tileSize?: number): XY;
25
+ /**
26
+ * Convert tile pixel coordinates to geographic coordinates.
27
+ */
28
+ export declare function tilePxToLonLat(px: XY, tile: Tile, tileSize?: number): LonLat;
29
+ /**
30
+ * Clamp a pixel coordinate to the tile bounds and round to the nearest integer. Useful for converting a floating point pixel
31
+ * coordinate to a the exact tile pixel it is contained by.
32
+ */
33
+ export declare function clampAndRoundPx(px: XY, tileSizeOrBbox: number | GeoBbox2D): XY;
34
+ //# sourceMappingURL=tile.d.ts.map
@@ -0,0 +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"}
package/dist/tile.js ADDED
@@ -0,0 +1,72 @@
1
+ /**
2
+ * XYZ tile coordinate utilities.
3
+ *
4
+ * Provides conversions between geographic coordinates (lon/lat) and
5
+ * tile pixel coordinates for XYZ tiled map systems. Supports various
6
+ * tile sizes and zoom levels.
7
+ *
8
+ * @module
9
+ */
10
+ import { pointToTileFraction } from "@mapbox/tilebelt";
11
+ const RADIANS_TO_DEGREES = 180 / Math.PI;
12
+ function tile2lon(x, z) {
13
+ return (x / 2 ** z) * 360 - 180;
14
+ }
15
+ function tile2lat(y, z) {
16
+ const n = Math.PI - (2 * Math.PI * y) / 2 ** z;
17
+ return RADIANS_TO_DEGREES * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));
18
+ }
19
+ /**
20
+ * Get the geographic bounding box of a tile.
21
+ * Returns [west, south, east, north].
22
+ */
23
+ export function tileToBbox(tile) {
24
+ const [tx, ty, tz] = tile;
25
+ const n = tile2lat(ty, tz);
26
+ const s = tile2lat(ty + 1, tz);
27
+ const e = tile2lon(tx + 1, tz);
28
+ const w = tile2lon(tx, tz);
29
+ return [w, s, e, n];
30
+ }
31
+ /**
32
+ * Convert a bounding box from geographic coordinates to tile pixel coordinates.
33
+ */
34
+ export function bboxToTilePx(bbox, tile, tileSize = 256) {
35
+ const [minX, minY] = llToTilePx([bbox[0], bbox[3]], tile, tileSize);
36
+ const [maxX, maxY] = llToTilePx([bbox[2], bbox[1]], tile, tileSize);
37
+ return [minX, minY, maxX, maxY];
38
+ }
39
+ /**
40
+ * Convert a geographic coordinate to tile pixel coordinates.
41
+ * Returns [x, y] in pixels relative to the top-left of the tile.
42
+ */
43
+ export function llToTilePx(ll, tile, tileSize = 256) {
44
+ const [tx, ty, tz] = tile;
45
+ const tf = pointToTileFraction(ll[0], ll[1], tz);
46
+ const x = (tf[0] - tx) * tileSize;
47
+ const y = (tf[1] - ty) * tileSize;
48
+ return [x, y];
49
+ }
50
+ /**
51
+ * Convert tile pixel coordinates to geographic coordinates.
52
+ */
53
+ export function tilePxToLonLat(px, tile, tileSize = 256) {
54
+ const [tx, ty, tz] = tile;
55
+ const lon = tile2lon(px[0] / tileSize + tx, tz);
56
+ const lat = tile2lat(px[1] / tileSize + ty, tz);
57
+ return [lon, lat];
58
+ }
59
+ /**
60
+ * Clamp a pixel coordinate to the tile bounds and round to the nearest integer. Useful for converting a floating point pixel
61
+ * coordinate to a the exact tile pixel it is contained by.
62
+ */
63
+ export function clampAndRoundPx(px, tileSizeOrBbox) {
64
+ const [minX, minY, maxX, maxY] = typeof tileSizeOrBbox === "number"
65
+ ? [0, 0, tileSizeOrBbox, tileSizeOrBbox]
66
+ : tileSizeOrBbox;
67
+ return [
68
+ Math.max(minX, Math.min(maxX, Math.round(px[0]))),
69
+ Math.max(minY, Math.min(maxY, Math.round(px[1]))),
70
+ ];
71
+ }
72
+ //# sourceMappingURL=tile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile.js","sourceRoot":"","sources":["../src/tile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Transform stream utilities.
3
+ *
4
+ * Helpers for piping byte arrays through TransformStreams (e.g., compression).
5
+ *
6
+ * @module
7
+ */
8
+ /**
9
+ * Pipe a byte array through a TransformStream and return the result.
10
+ *
11
+ * Useful for applying compression/decompression or other transformations
12
+ * to byte data using the Web Streams API.
13
+ *
14
+ * @param bytes - The input bytes.
15
+ * @param transformStream - The transform to apply (e.g., CompressionStream).
16
+ * @returns A Promise resolving to the transformed bytes.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const compressed = await transformBytes(data, new CompressionStream('gzip'))
21
+ * ```
22
+ */
23
+ export declare function transformBytes(bytes: Uint8Array<ArrayBuffer>, transformStream: TransformStream<Uint8Array<ArrayBuffer>, Uint8Array<ArrayBuffer>>): Promise<Uint8Array<ArrayBuffer>>;
24
+ //# sourceMappingURL=transform-bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-bytes.d.ts","sourceRoot":"","sources":["../src/transform-bytes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CACnC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,EAC9B,eAAe,EAAE,eAAe,CAC/B,UAAU,CAAC,WAAW,CAAC,EACvB,UAAU,CAAC,WAAW,CAAC,CACvB,GACC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAElC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Transform stream utilities.
3
+ *
4
+ * Helpers for piping byte arrays through TransformStreams (e.g., compression).
5
+ *
6
+ * @module
7
+ */
8
+ import { bytesToStream } from "./bytes-to-stream";
9
+ import { streamToBytes } from "./stream-to-bytes";
10
+ /**
11
+ * Pipe a byte array through a TransformStream and return the result.
12
+ *
13
+ * Useful for applying compression/decompression or other transformations
14
+ * to byte data using the Web Streams API.
15
+ *
16
+ * @param bytes - The input bytes.
17
+ * @param transformStream - The transform to apply (e.g., CompressionStream).
18
+ * @returns A Promise resolving to the transformed bytes.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const compressed = await transformBytes(data, new CompressionStream('gzip'))
23
+ * ```
24
+ */
25
+ export async function transformBytes(bytes, transformStream) {
26
+ return streamToBytes(bytesToStream(bytes).pipeThrough(transformStream));
27
+ }
28
+ //# sourceMappingURL=transform-bytes.js.map
@@ -0,0 +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"}