@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.
- package/CHANGELOG.md +33 -0
- package/README.md +49 -19
- package/dist/assert.d.ts +24 -0
- package/dist/assert.d.ts.map +1 -0
- package/dist/assert.js +28 -0
- package/dist/assert.js.map +1 -0
- package/dist/bbox-intersects.d.ts +15 -0
- package/dist/bbox-intersects.d.ts.map +1 -0
- package/dist/bbox-intersects.js +24 -0
- package/dist/bbox-intersects.js.map +1 -0
- package/dist/bytes-to-stream.d.ts +18 -0
- package/dist/bytes-to-stream.d.ts.map +1 -0
- package/dist/bytes-to-stream.js +25 -0
- package/dist/bytes-to-stream.js.map +1 -0
- package/dist/color.d.ts +4 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +33 -0
- package/dist/color.js.map +1 -0
- package/dist/concat-bytes.d.ts +5 -0
- package/dist/concat-bytes.d.ts.map +1 -0
- package/dist/concat-bytes.js +14 -0
- package/dist/concat-bytes.js.map +1 -0
- package/dist/coordinates.d.ts +28 -0
- package/dist/coordinates.d.ts.map +1 -0
- package/dist/coordinates.js +38 -0
- package/dist/coordinates.js.map +1 -0
- package/dist/haversine-distance.d.ts +16 -0
- package/dist/haversine-distance.d.ts.map +1 -0
- package/dist/haversine-distance.js +26 -0
- package/dist/haversine-distance.js.map +1 -0
- package/dist/lineclip.d.ts +2 -0
- package/dist/lineclip.d.ts.map +1 -0
- package/dist/lineclip.js +3 -0
- package/dist/lineclip.js.map +1 -0
- package/dist/progress.d.ts +42 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +53 -0
- package/dist/progress.js.map +1 -0
- package/dist/relation-kind.d.ts +69 -0
- package/dist/relation-kind.d.ts.map +1 -0
- package/dist/relation-kind.js +375 -0
- package/dist/relation-kind.js.map +1 -0
- package/dist/relation-multipolygon.d.ts +43 -0
- package/dist/relation-multipolygon.d.ts.map +1 -0
- package/dist/relation-multipolygon.js +195 -0
- package/dist/relation-multipolygon.js.map +1 -0
- package/dist/src/assert.d.ts +20 -1
- package/dist/src/assert.d.ts.map +1 -1
- package/dist/src/assert.js +20 -1
- package/dist/src/assert.js.map +1 -1
- package/dist/src/bbox-intersects.d.ts +15 -0
- package/dist/src/bbox-intersects.d.ts.map +1 -0
- package/dist/src/bbox-intersects.js +24 -0
- package/dist/src/bbox-intersects.js.map +1 -0
- package/dist/src/bytes-to-stream.d.ts +17 -1
- package/dist/src/bytes-to-stream.d.ts.map +1 -1
- package/dist/src/bytes-to-stream.js +16 -0
- package/dist/src/bytes-to-stream.js.map +1 -1
- package/dist/src/color.d.ts +4 -0
- package/dist/src/color.d.ts.map +1 -0
- package/dist/src/color.js +33 -0
- package/dist/src/color.js.map +1 -0
- package/dist/src/coordinates.d.ts +28 -0
- package/dist/src/coordinates.d.ts.map +1 -0
- package/dist/src/coordinates.js +38 -0
- package/dist/src/coordinates.js.map +1 -0
- package/dist/src/haversine-distance.d.ts +9 -1
- package/dist/src/haversine-distance.d.ts.map +1 -1
- package/dist/src/haversine-distance.js +9 -1
- package/dist/src/haversine-distance.js.map +1 -1
- package/dist/src/progress.d.ts +42 -0
- package/dist/src/progress.d.ts.map +1 -0
- package/dist/src/progress.js +53 -0
- package/dist/src/progress.js.map +1 -0
- package/dist/src/relation-kind.d.ts +69 -0
- package/dist/src/relation-kind.d.ts.map +1 -0
- package/dist/src/relation-kind.js +375 -0
- package/dist/src/relation-kind.js.map +1 -0
- package/dist/src/relation-multipolygon.d.ts +43 -0
- package/dist/src/relation-multipolygon.d.ts.map +1 -0
- package/dist/src/relation-multipolygon.js +195 -0
- package/dist/src/relation-multipolygon.js.map +1 -0
- package/dist/src/stream-to-bytes.d.ts +16 -0
- package/dist/src/stream-to-bytes.d.ts.map +1 -1
- package/dist/src/stream-to-bytes.js +16 -0
- package/dist/src/stream-to-bytes.js.map +1 -1
- package/dist/src/test/fixtures.d.ts +1 -1
- package/dist/src/test/fixtures.d.ts.map +1 -1
- package/dist/src/test/fixtures.js +16 -8
- package/dist/src/test/fixtures.js.map +1 -1
- package/dist/src/throttle.d.ts +25 -0
- package/dist/src/throttle.d.ts.map +1 -0
- package/dist/src/throttle.js +34 -0
- package/dist/src/throttle.js.map +1 -0
- package/dist/src/tile.d.ts +34 -0
- package/dist/src/tile.d.ts.map +1 -0
- package/dist/src/tile.js +72 -0
- package/dist/src/tile.js.map +1 -0
- package/dist/src/transform-bytes.d.ts +22 -0
- package/dist/src/transform-bytes.d.ts.map +1 -1
- package/dist/src/transform-bytes.js +22 -0
- package/dist/src/transform-bytes.js.map +1 -1
- package/dist/src/types.d.ts +76 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils.d.ts +30 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +70 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/way-is-area.d.ts +24 -0
- package/dist/src/way-is-area.d.ts.map +1 -0
- package/dist/src/way-is-area.js +104 -0
- package/dist/src/way-is-area.js.map +1 -0
- package/dist/src/zigzag.d.ts +33 -0
- package/dist/src/zigzag.d.ts.map +1 -0
- package/dist/src/zigzag.js +40 -0
- package/dist/src/zigzag.js.map +1 -0
- package/dist/stream-to-bytes.d.ts +18 -0
- package/dist/stream-to-bytes.d.ts.map +1 -0
- package/dist/stream-to-bytes.js +30 -0
- package/dist/stream-to-bytes.js.map +1 -0
- package/dist/test/fixtures.d.ts +36 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +175 -0
- package/dist/test/fixtures.js.map +1 -0
- package/dist/test/haversine-distance.test.js +2 -2
- package/dist/test/haversine-distance.test.js.map +1 -1
- package/dist/test/relation-kind.test.d.ts +2 -0
- package/dist/test/relation-kind.test.d.ts.map +1 -0
- package/dist/test/relation-kind.test.js +367 -0
- package/dist/test/relation-kind.test.js.map +1 -0
- package/dist/test/relation-multipolygon.test.d.ts +2 -0
- package/dist/test/relation-multipolygon.test.d.ts.map +1 -0
- package/dist/test/relation-multipolygon.test.js +237 -0
- package/dist/test/relation-multipolygon.test.js.map +1 -0
- package/dist/test/utils.test.d.ts +2 -0
- package/dist/test/utils.test.d.ts.map +1 -0
- package/dist/test/utils.test.js +76 -0
- package/dist/test/utils.test.js.map +1 -0
- package/dist/test/way-is-area.test.d.ts +2 -0
- package/dist/test/way-is-area.test.d.ts.map +1 -0
- package/dist/test/way-is-area.test.js +31 -0
- package/dist/test/way-is-area.test.js.map +1 -0
- package/dist/throttle.d.ts +25 -0
- package/dist/throttle.d.ts.map +1 -0
- package/dist/throttle.js +34 -0
- package/dist/throttle.js.map +1 -0
- package/dist/tile.d.ts +34 -0
- package/dist/tile.d.ts.map +1 -0
- package/dist/tile.js +72 -0
- package/dist/tile.js.map +1 -0
- package/dist/transform-bytes.d.ts +24 -0
- package/dist/transform-bytes.d.ts.map +1 -0
- package/dist/transform-bytes.js +28 -0
- package/dist/transform-bytes.js.map +1 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +30 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +70 -0
- package/dist/utils.js.map +1 -0
- package/dist/way-is-area.d.ts +24 -0
- package/dist/way-is-area.d.ts.map +1 -0
- package/dist/way-is-area.js +104 -0
- package/dist/way-is-area.js.map +1 -0
- package/dist/zigzag.d.ts +33 -0
- package/dist/zigzag.d.ts.map +1 -0
- package/dist/zigzag.js +40 -0
- package/dist/zigzag.js.map +1 -0
- package/package.json +11 -10
- package/src/assert.ts +21 -1
- package/src/bbox-intersects.ts +30 -0
- package/src/bytes-to-stream.ts +17 -0
- package/src/color.ts +37 -0
- package/src/coordinates.ts +45 -0
- package/src/haversine-distance.ts +10 -1
- package/src/progress.ts +74 -0
- package/src/relation-kind.ts +446 -0
- package/src/relation-multipolygon.ts +225 -0
- package/src/stream-to-bytes.ts +17 -0
- package/src/test/fixtures.ts +16 -12
- package/src/throttle.ts +37 -0
- package/src/tile.ts +89 -0
- package/src/transform-bytes.ts +23 -0
- package/src/types.ts +93 -1
- package/src/utils.ts +79 -0
- package/src/way-is-area.ts +107 -0
- package/src/zigzag.ts +42 -0
- package/test/haversine-distance.test.ts +2 -2
- package/test/relation-kind.test.ts +426 -0
- package/test/relation-multipolygon.test.ts +265 -0
- package/test/utils.test.ts +103 -0
- package/test/way-is-area.test.ts +42 -0
- package/tsconfig/test.json +1 -0
- package/tsconfig.build.json +5 -0
- package/dist/src/spherical-mercator.d.ts +0 -15
- package/dist/src/spherical-mercator.d.ts.map +0 -1
- package/dist/src/spherical-mercator.js +0 -35
- package/dist/src/spherical-mercator.js.map +0 -1
- package/dist/src/spherical-mercator.test.d.ts +0 -2
- package/dist/src/spherical-mercator.test.d.ts.map +0 -1
- package/dist/src/spherical-mercator.test.js +0 -25
- package/dist/src/spherical-mercator.test.js.map +0 -1
- package/src/spherical-mercator.test.ts +0 -42
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/throttle.js
ADDED
|
@@ -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
|
package/dist/tile.js.map
ADDED
|
@@ -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"}
|