@osmix/shared 0.0.8 → 0.0.11

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 (138) hide show
  1. package/dist/content-hasher.d.ts +28 -0
  2. package/dist/content-hasher.d.ts.map +1 -0
  3. package/dist/content-hasher.js +62 -0
  4. package/dist/content-hasher.js.map +1 -0
  5. package/dist/csv-parse-stream.d.ts +38 -0
  6. package/dist/csv-parse-stream.d.ts.map +1 -0
  7. package/dist/csv-parse-stream.js +157 -0
  8. package/dist/csv-parse-stream.js.map +1 -0
  9. package/dist/fixtures.d.ts.map +1 -0
  10. package/dist/{src/test/fixtures.js → fixtures.js} +2 -1
  11. package/dist/fixtures.js.map +1 -0
  12. package/dist/relation-kind.d.ts.map +1 -1
  13. package/dist/relation-kind.js +5 -3
  14. package/dist/relation-kind.js.map +1 -1
  15. package/dist/stream-to-bytes.js +2 -1
  16. package/dist/stream-to-bytes.js.map +1 -1
  17. package/dist/utils.d.ts +6 -1
  18. package/dist/utils.d.ts.map +1 -1
  19. package/dist/utils.js +21 -0
  20. package/dist/utils.js.map +1 -1
  21. package/package.json +34 -19
  22. package/src/content-hasher.ts +70 -0
  23. package/src/csv-parse-stream.ts +215 -0
  24. package/src/{test/fixtures.ts → fixtures.ts} +2 -1
  25. package/src/relation-kind.ts +5 -3
  26. package/src/stream-to-bytes.ts +1 -1
  27. package/src/utils.ts +20 -0
  28. package/CHANGELOG.md +0 -52
  29. package/dist/src/assert.d.ts +0 -24
  30. package/dist/src/assert.d.ts.map +0 -1
  31. package/dist/src/assert.js +0 -28
  32. package/dist/src/assert.js.map +0 -1
  33. package/dist/src/bbox-intersects.d.ts +0 -15
  34. package/dist/src/bbox-intersects.d.ts.map +0 -1
  35. package/dist/src/bbox-intersects.js +0 -24
  36. package/dist/src/bbox-intersects.js.map +0 -1
  37. package/dist/src/bytes-to-stream.d.ts +0 -18
  38. package/dist/src/bytes-to-stream.d.ts.map +0 -1
  39. package/dist/src/bytes-to-stream.js +0 -25
  40. package/dist/src/bytes-to-stream.js.map +0 -1
  41. package/dist/src/color.d.ts +0 -4
  42. package/dist/src/color.d.ts.map +0 -1
  43. package/dist/src/color.js +0 -33
  44. package/dist/src/color.js.map +0 -1
  45. package/dist/src/concat-bytes.d.ts +0 -5
  46. package/dist/src/concat-bytes.d.ts.map +0 -1
  47. package/dist/src/concat-bytes.js +0 -14
  48. package/dist/src/concat-bytes.js.map +0 -1
  49. package/dist/src/coordinates.d.ts +0 -28
  50. package/dist/src/coordinates.d.ts.map +0 -1
  51. package/dist/src/coordinates.js +0 -38
  52. package/dist/src/coordinates.js.map +0 -1
  53. package/dist/src/haversine-distance.d.ts +0 -16
  54. package/dist/src/haversine-distance.d.ts.map +0 -1
  55. package/dist/src/haversine-distance.js +0 -26
  56. package/dist/src/haversine-distance.js.map +0 -1
  57. package/dist/src/lineclip.d.ts +0 -2
  58. package/dist/src/lineclip.d.ts.map +0 -1
  59. package/dist/src/lineclip.js +0 -3
  60. package/dist/src/lineclip.js.map +0 -1
  61. package/dist/src/progress.d.ts +0 -42
  62. package/dist/src/progress.d.ts.map +0 -1
  63. package/dist/src/progress.js +0 -53
  64. package/dist/src/progress.js.map +0 -1
  65. package/dist/src/relation-kind.d.ts +0 -69
  66. package/dist/src/relation-kind.d.ts.map +0 -1
  67. package/dist/src/relation-kind.js +0 -375
  68. package/dist/src/relation-kind.js.map +0 -1
  69. package/dist/src/relation-multipolygon.d.ts +0 -43
  70. package/dist/src/relation-multipolygon.d.ts.map +0 -1
  71. package/dist/src/relation-multipolygon.js +0 -195
  72. package/dist/src/relation-multipolygon.js.map +0 -1
  73. package/dist/src/stream-to-bytes.d.ts +0 -18
  74. package/dist/src/stream-to-bytes.d.ts.map +0 -1
  75. package/dist/src/stream-to-bytes.js +0 -30
  76. package/dist/src/stream-to-bytes.js.map +0 -1
  77. package/dist/src/test/fixtures.d.ts.map +0 -1
  78. package/dist/src/test/fixtures.js.map +0 -1
  79. package/dist/src/throttle.d.ts +0 -25
  80. package/dist/src/throttle.d.ts.map +0 -1
  81. package/dist/src/throttle.js +0 -34
  82. package/dist/src/throttle.js.map +0 -1
  83. package/dist/src/tile.d.ts +0 -34
  84. package/dist/src/tile.d.ts.map +0 -1
  85. package/dist/src/tile.js +0 -72
  86. package/dist/src/tile.js.map +0 -1
  87. package/dist/src/transform-bytes.d.ts +0 -24
  88. package/dist/src/transform-bytes.d.ts.map +0 -1
  89. package/dist/src/transform-bytes.js +0 -28
  90. package/dist/src/transform-bytes.js.map +0 -1
  91. package/dist/src/types.d.ts +0 -99
  92. package/dist/src/types.d.ts.map +0 -1
  93. package/dist/src/types.js +0 -9
  94. package/dist/src/types.js.map +0 -1
  95. package/dist/src/utils.d.ts +0 -30
  96. package/dist/src/utils.d.ts.map +0 -1
  97. package/dist/src/utils.js +0 -70
  98. package/dist/src/utils.js.map +0 -1
  99. package/dist/src/way-is-area.d.ts +0 -24
  100. package/dist/src/way-is-area.d.ts.map +0 -1
  101. package/dist/src/way-is-area.js +0 -104
  102. package/dist/src/way-is-area.js.map +0 -1
  103. package/dist/src/zigzag.d.ts +0 -33
  104. package/dist/src/zigzag.d.ts.map +0 -1
  105. package/dist/src/zigzag.js +0 -40
  106. package/dist/src/zigzag.js.map +0 -1
  107. package/dist/test/fixtures.d.ts +0 -36
  108. package/dist/test/fixtures.d.ts.map +0 -1
  109. package/dist/test/fixtures.js +0 -175
  110. package/dist/test/fixtures.js.map +0 -1
  111. package/dist/test/haversine-distance.test.d.ts +0 -2
  112. package/dist/test/haversine-distance.test.d.ts.map +0 -1
  113. package/dist/test/haversine-distance.test.js +0 -8
  114. package/dist/test/haversine-distance.test.js.map +0 -1
  115. package/dist/test/relation-kind.test.d.ts +0 -2
  116. package/dist/test/relation-kind.test.d.ts.map +0 -1
  117. package/dist/test/relation-kind.test.js +0 -367
  118. package/dist/test/relation-kind.test.js.map +0 -1
  119. package/dist/test/relation-multipolygon.test.d.ts +0 -2
  120. package/dist/test/relation-multipolygon.test.d.ts.map +0 -1
  121. package/dist/test/relation-multipolygon.test.js +0 -237
  122. package/dist/test/relation-multipolygon.test.js.map +0 -1
  123. package/dist/test/utils.test.d.ts +0 -2
  124. package/dist/test/utils.test.d.ts.map +0 -1
  125. package/dist/test/utils.test.js +0 -76
  126. package/dist/test/utils.test.js.map +0 -1
  127. package/dist/test/way-is-area.test.d.ts +0 -2
  128. package/dist/test/way-is-area.test.d.ts.map +0 -1
  129. package/dist/test/way-is-area.test.js +0 -31
  130. package/dist/test/way-is-area.test.js.map +0 -1
  131. package/test/haversine-distance.test.ts +0 -8
  132. package/test/relation-kind.test.ts +0 -426
  133. package/test/relation-multipolygon.test.ts +0 -265
  134. package/test/utils.test.ts +0 -103
  135. package/test/way-is-area.test.ts +0 -42
  136. package/tsconfig.build.json +0 -5
  137. package/tsconfig.json +0 -9
  138. /package/dist/{src/test/fixtures.d.ts → fixtures.d.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/test/fixtures.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=haversine-distance.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"haversine-distance.test.d.ts","sourceRoot":"","sources":["../../test/haversine-distance.test.ts"],"names":[],"mappings":""}
@@ -1,8 +0,0 @@
1
- import { expect, test } from "bun:test";
2
- import { haversineDistance } from "../src/haversine-distance";
3
- test("haversineDistance", () => {
4
- const p1 = [-75.343, 39.984];
5
- const p2 = [-75.534, 39.123];
6
- expect(haversineDistance(p1, p2)).toBeCloseTo(97129.2211, 3);
7
- });
8
- //# sourceMappingURL=haversine-distance.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"haversine-distance.test.js","sourceRoot":"","sources":["../../test/haversine-distance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC9B,MAAM,EAAE,GAAqB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9C,MAAM,EAAE,GAAqB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9C,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=relation-kind.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relation-kind.test.d.ts","sourceRoot":"","sources":["../../test/relation-kind.test.ts"],"names":[],"mappings":""}
@@ -1,367 +0,0 @@
1
- import { describe, expect, it } from "bun:test";
2
- import { buildRelationLineStrings, collectRelationPoints, getRelationKind, getRelationKindMetadata, isAreaRelation, isLineRelation, isLogicRelation, isPointRelation, isSuperRelation, resolveRelationMembers, } from "../src/relation-kind";
3
- describe("relation-kind", () => {
4
- describe("getRelationKind", () => {
5
- it("identifies multipolygon as area", () => {
6
- const relation = {
7
- id: 1,
8
- tags: { type: "multipolygon" },
9
- members: [],
10
- };
11
- expect(getRelationKind(relation)).toBe("area");
12
- });
13
- it("identifies boundary as area", () => {
14
- const relation = {
15
- id: 1,
16
- tags: { type: "boundary" },
17
- members: [],
18
- };
19
- expect(getRelationKind(relation)).toBe("area");
20
- });
21
- it("identifies route as line", () => {
22
- const relation = {
23
- id: 1,
24
- tags: { type: "route" },
25
- members: [],
26
- };
27
- expect(getRelationKind(relation)).toBe("line");
28
- });
29
- it("identifies multilinestring as line", () => {
30
- const relation = {
31
- id: 1,
32
- tags: { type: "multilinestring" },
33
- members: [],
34
- };
35
- expect(getRelationKind(relation)).toBe("line");
36
- });
37
- it("identifies multipoint as point", () => {
38
- const relation = {
39
- id: 1,
40
- tags: { type: "multipoint" },
41
- members: [],
42
- };
43
- expect(getRelationKind(relation)).toBe("point");
44
- });
45
- it("identifies restriction as logic", () => {
46
- const relation = {
47
- id: 1,
48
- tags: { type: "restriction" },
49
- members: [],
50
- };
51
- expect(getRelationKind(relation)).toBe("logic");
52
- });
53
- it("identifies super-relation by having relation members", () => {
54
- const relation = {
55
- id: 1,
56
- tags: { type: "collection" },
57
- members: [{ type: "relation", ref: 2 }],
58
- };
59
- expect(getRelationKind(relation)).toBe("super");
60
- });
61
- it("defaults to logic for untyped relations", () => {
62
- const relation = {
63
- id: 1,
64
- members: [],
65
- };
66
- expect(getRelationKind(relation)).toBe("logic");
67
- });
68
- it("handles case-insensitive type tags", () => {
69
- const relation = {
70
- id: 1,
71
- tags: { type: "MULTIPOLYGON" },
72
- members: [],
73
- };
74
- expect(getRelationKind(relation)).toBe("area");
75
- });
76
- });
77
- describe("getRelationKindMetadata", () => {
78
- it("returns correct metadata for area relations", () => {
79
- const relation = {
80
- id: 1,
81
- tags: { type: "multipolygon" },
82
- members: [],
83
- };
84
- const metadata = getRelationKindMetadata(relation);
85
- expect(metadata.kind).toBe("area");
86
- expect(metadata.expectedRoles).toEqual(["outer", "inner"]);
87
- expect(metadata.orderMatters).toBe(false);
88
- });
89
- it("returns correct metadata for line relations", () => {
90
- const relation = {
91
- id: 1,
92
- tags: { type: "route" },
93
- members: [],
94
- };
95
- const metadata = getRelationKindMetadata(relation);
96
- expect(metadata.kind).toBe("line");
97
- expect(metadata.orderMatters).toBe(true);
98
- });
99
- });
100
- describe("isAreaRelation", () => {
101
- it("returns true for multipolygon", () => {
102
- const relation = {
103
- id: 1,
104
- tags: { type: "multipolygon" },
105
- members: [],
106
- };
107
- expect(isAreaRelation(relation)).toBe(true);
108
- });
109
- it("returns false for route", () => {
110
- const relation = {
111
- id: 1,
112
- tags: { type: "route" },
113
- members: [],
114
- };
115
- expect(isAreaRelation(relation)).toBe(false);
116
- });
117
- });
118
- describe("isLineRelation", () => {
119
- it("returns true for route", () => {
120
- const relation = {
121
- id: 1,
122
- tags: { type: "route" },
123
- members: [],
124
- };
125
- expect(isLineRelation(relation)).toBe(true);
126
- });
127
- it("returns true for multilinestring", () => {
128
- const relation = {
129
- id: 1,
130
- tags: { type: "multilinestring" },
131
- members: [],
132
- };
133
- expect(isLineRelation(relation)).toBe(true);
134
- });
135
- });
136
- describe("isPointRelation", () => {
137
- it("returns true for multipoint", () => {
138
- const relation = {
139
- id: 1,
140
- tags: { type: "multipoint" },
141
- members: [],
142
- };
143
- expect(isPointRelation(relation)).toBe(true);
144
- });
145
- });
146
- describe("isSuperRelation", () => {
147
- it("returns true for relation with relation members", () => {
148
- const relation = {
149
- id: 1,
150
- tags: { type: "collection" },
151
- members: [{ type: "relation", ref: 2 }],
152
- };
153
- expect(isSuperRelation(relation)).toBe(true);
154
- });
155
- it("returns false for relation without relation members", () => {
156
- const relation = {
157
- id: 1,
158
- tags: { type: "route" },
159
- members: [{ type: "way", ref: 2 }],
160
- };
161
- expect(isSuperRelation(relation)).toBe(false);
162
- });
163
- });
164
- describe("isLogicRelation", () => {
165
- it("returns true for restriction", () => {
166
- const relation = {
167
- id: 1,
168
- tags: { type: "restriction" },
169
- members: [],
170
- };
171
- expect(isLogicRelation(relation)).toBe(true);
172
- });
173
- });
174
- describe("buildRelationLineStrings", () => {
175
- it("builds linestrings from connected ways", () => {
176
- const relation = {
177
- id: 1,
178
- tags: { type: "route" },
179
- members: [
180
- { type: "way", ref: 1 },
181
- { type: "way", ref: 2 },
182
- ],
183
- };
184
- const way1 = { id: 1, refs: [1, 2] };
185
- const way2 = { id: 2, refs: [2, 3] };
186
- const getWay = (id) => {
187
- if (id === 1)
188
- return way1;
189
- if (id === 2)
190
- return way2;
191
- return null;
192
- };
193
- const getNodeCoordinates = (id) => {
194
- const coords = {
195
- 1: [0.0, 0.0],
196
- 2: [1.0, 0.0],
197
- 3: [2.0, 0.0],
198
- };
199
- return coords[id];
200
- };
201
- const lineStrings = buildRelationLineStrings(relation, getWay, getNodeCoordinates);
202
- expect(lineStrings).toHaveLength(1);
203
- expect(lineStrings[0]).toHaveLength(3);
204
- });
205
- it("handles disconnected ways as separate linestrings", () => {
206
- const relation = {
207
- id: 1,
208
- tags: { type: "route" },
209
- members: [
210
- { type: "way", ref: 1 },
211
- { type: "way", ref: 2 },
212
- ],
213
- };
214
- const way1 = { id: 1, refs: [1, 2] };
215
- const way2 = { id: 2, refs: [3, 4] };
216
- const getWay = (id) => {
217
- if (id === 1)
218
- return way1;
219
- if (id === 2)
220
- return way2;
221
- return null;
222
- };
223
- const getNodeCoordinates = (id) => {
224
- const coords = {
225
- 1: [0.0, 0.0],
226
- 2: [1.0, 0.0],
227
- 3: [10.0, 10.0],
228
- 4: [11.0, 10.0],
229
- };
230
- return coords[id];
231
- };
232
- const lineStrings = buildRelationLineStrings(relation, getWay, getNodeCoordinates);
233
- expect(lineStrings.length).toBeGreaterThanOrEqual(2);
234
- });
235
- });
236
- describe("collectRelationPoints", () => {
237
- it("collects point coordinates from node members", () => {
238
- const relation = {
239
- id: 1,
240
- tags: { type: "multipoint" },
241
- members: [
242
- { type: "node", ref: 1 },
243
- { type: "node", ref: 2 },
244
- { type: "way", ref: 10 }, // Should be ignored
245
- ],
246
- };
247
- const getNodeCoordinates = (id) => {
248
- const coords = {
249
- 1: [0.0, 0.0],
250
- 2: [1.0, 1.0],
251
- };
252
- return coords[id];
253
- };
254
- const points = collectRelationPoints(relation, getNodeCoordinates);
255
- expect(points).toHaveLength(2);
256
- expect(points[0]).toEqual([0.0, 0.0]);
257
- expect(points[1]).toEqual([1.0, 1.0]);
258
- });
259
- it("handles missing node coordinates", () => {
260
- const relation = {
261
- id: 1,
262
- tags: { type: "multipoint" },
263
- members: [
264
- { type: "node", ref: 1 },
265
- { type: "node", ref: 2 },
266
- ],
267
- };
268
- const getNodeCoordinates = (id) => {
269
- if (id === 1)
270
- return [0.0, 0.0];
271
- return undefined; // Missing coordinate
272
- };
273
- const points = collectRelationPoints(relation, getNodeCoordinates);
274
- expect(points).toHaveLength(1);
275
- });
276
- });
277
- describe("resolveRelationMembers", () => {
278
- it("resolves direct members", () => {
279
- const relation = {
280
- id: 1,
281
- tags: { type: "collection" },
282
- members: [
283
- { type: "node", ref: 1 },
284
- { type: "way", ref: 10 },
285
- ],
286
- };
287
- const getRelation = () => null;
288
- const resolved = resolveRelationMembers(relation, getRelation);
289
- expect(resolved.nodes).toEqual([1]);
290
- expect(resolved.ways).toEqual([10]);
291
- expect(resolved.relations).toEqual([]);
292
- });
293
- it("resolves nested relation members", () => {
294
- const relation1 = {
295
- id: 1,
296
- tags: { type: "collection" },
297
- members: [
298
- { type: "relation", ref: 2 },
299
- { type: "node", ref: 1 },
300
- ],
301
- };
302
- const relation2 = {
303
- id: 2,
304
- tags: { type: "collection" },
305
- members: [
306
- { type: "way", ref: 10 },
307
- { type: "node", ref: 2 },
308
- ],
309
- };
310
- const getRelation = (id) => {
311
- if (id === 2)
312
- return relation2;
313
- return null;
314
- };
315
- const resolved = resolveRelationMembers(relation1, getRelation);
316
- expect(resolved.nodes).toContain(1);
317
- expect(resolved.nodes).toContain(2);
318
- expect(resolved.ways).toContain(10);
319
- expect(resolved.relations).toContain(2);
320
- });
321
- it("detects cycles and prevents infinite recursion", () => {
322
- const relation1 = {
323
- id: 1,
324
- tags: { type: "collection" },
325
- members: [{ type: "relation", ref: 2 }],
326
- };
327
- const relation2 = {
328
- id: 2,
329
- tags: { type: "collection" },
330
- members: [{ type: "relation", ref: 1 }], // Circular reference
331
- };
332
- const getRelation = (id) => {
333
- if (id === 1)
334
- return relation1;
335
- if (id === 2)
336
- return relation2;
337
- return null;
338
- };
339
- const resolved = resolveRelationMembers(relation1, getRelation, 10);
340
- // Should not crash and should include relation2 but not recurse infinitely
341
- expect(resolved.relations).toContain(2);
342
- });
343
- it("respects maxDepth limit", () => {
344
- const relation1 = {
345
- id: 1,
346
- tags: { type: "collection" },
347
- members: [{ type: "relation", ref: 2 }],
348
- };
349
- const relation2 = {
350
- id: 2,
351
- tags: { type: "collection" },
352
- members: [{ type: "node", ref: 100 }],
353
- };
354
- const getRelation = (id) => {
355
- if (id === 1)
356
- return relation1;
357
- if (id === 2)
358
- return relation2;
359
- return null;
360
- };
361
- const resolved = resolveRelationMembers(relation1, getRelation, 0);
362
- // Should not resolve nested relation when maxDepth is 0
363
- expect(resolved.nodes).not.toContain(100);
364
- });
365
- });
366
- });
367
- //# sourceMappingURL=relation-kind.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relation-kind.test.js","sourceRoot":"","sources":["../../test/relation-kind.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=relation-multipolygon.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relation-multipolygon.test.d.ts","sourceRoot":"","sources":["../../test/relation-multipolygon.test.ts"],"names":[],"mappings":""}
@@ -1,237 +0,0 @@
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