@osmix/geoparquet 0.1.0

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 (40) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +47 -0
  3. package/dist/src/from-geoparquet.d.ts +68 -0
  4. package/dist/src/from-geoparquet.d.ts.map +1 -0
  5. package/dist/src/from-geoparquet.js +455 -0
  6. package/dist/src/from-geoparquet.js.map +1 -0
  7. package/dist/src/index.d.ts +27 -0
  8. package/dist/src/index.d.ts.map +1 -0
  9. package/dist/src/index.js +27 -0
  10. package/dist/src/index.js.map +1 -0
  11. package/dist/src/types.d.ts +47 -0
  12. package/dist/src/types.d.ts.map +1 -0
  13. package/dist/src/types.js +6 -0
  14. package/dist/src/types.js.map +1 -0
  15. package/dist/src/wkb.d.ts +22 -0
  16. package/dist/src/wkb.d.ts.map +1 -0
  17. package/dist/src/wkb.js +181 -0
  18. package/dist/src/wkb.js.map +1 -0
  19. package/dist/test/from-geoparquet.test.d.ts +2 -0
  20. package/dist/test/from-geoparquet.test.d.ts.map +1 -0
  21. package/dist/test/from-geoparquet.test.js +445 -0
  22. package/dist/test/from-geoparquet.test.js.map +1 -0
  23. package/dist/test/monaco-parquet.test.d.ts +2 -0
  24. package/dist/test/monaco-parquet.test.d.ts.map +1 -0
  25. package/dist/test/monaco-parquet.test.js +200 -0
  26. package/dist/test/monaco-parquet.test.js.map +1 -0
  27. package/dist/test/wkb.test.d.ts +2 -0
  28. package/dist/test/wkb.test.d.ts.map +1 -0
  29. package/dist/test/wkb.test.js +234 -0
  30. package/dist/test/wkb.test.js.map +1 -0
  31. package/package.json +53 -0
  32. package/src/from-geoparquet.ts +565 -0
  33. package/src/index.ts +27 -0
  34. package/src/types.ts +51 -0
  35. package/src/wkb.ts +218 -0
  36. package/test/download-monaco-highways.sh +40 -0
  37. package/test/from-geoparquet.test.ts +520 -0
  38. package/test/monaco-parquet.test.ts +249 -0
  39. package/test/wkb.test.ts +296 -0
  40. package/tsconfig.json +9 -0
@@ -0,0 +1,200 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { getFixturePath } from "@osmix/shared/test/fixtures";
3
+ import { fromGeoParquet, GeoParquetOsmBuilder } from "../src";
4
+ /**
5
+ * Integration tests using the Monaco highways GeoParquet fixture.
6
+ *
7
+ * The fixture was downloaded from LayerCake (https://openstreetmap.us/our-work/layercake/)
8
+ * using DuckDB with a bounding box filter for Monaco. The fixture has a flattened
9
+ * structure where each tag column is separate (highway, name, surface, etc.) rather
10
+ * than nested in a tags struct.
11
+ *
12
+ * Note: hyparquet automatically parses GeoParquet WKB geometry into GeoJSON objects.
13
+ *
14
+ * Monaco bounding box:
15
+ * - xmin: 7.409205, xmax: 7.448637
16
+ * - ymin: 43.72335, ymax: 43.75169
17
+ */
18
+ describe("@osmix/geoparquet: Monaco highways fixture", () => {
19
+ const fixtureFile = () => Bun.file(getFixturePath("monaco.parquet"));
20
+ const getOsm = async () => fromGeoParquet(await fixtureFile().arrayBuffer());
21
+ it("should load the monaco.parquet fixture", async () => {
22
+ const file = fixtureFile();
23
+ expect(await file.exists()).toBe(true);
24
+ const size = file.size;
25
+ expect(size).toBeGreaterThan(0);
26
+ expect(size).toBeLessThan(1_000_000); // Should be a small fixture
27
+ });
28
+ it("should read parquet rows with correct structure", async () => {
29
+ const builder = new GeoParquetOsmBuilder({ id: "monaco" }, { rowEnd: 5 });
30
+ const rows = await builder.readParquetRows(await fixtureFile().arrayBuffer());
31
+ expect(rows.length).toBe(5);
32
+ // Verify row structure
33
+ const firstRow = rows[0];
34
+ expect(firstRow["id"]).toBeDefined();
35
+ expect(firstRow["geometry"]).toBeDefined();
36
+ // expect(firstRow.osm_type).toBeDefined()
37
+ // hyparquet parses GeoParquet WKB into GeoJSON automatically
38
+ expect(firstRow["geometry"].type).toBeDefined();
39
+ // Verify it's a geometry with coordinates (not a GeometryCollection)
40
+ expect(["Point", "LineString", "Polygon", "MultiPolygon"]).toContain(firstRow["geometry"].type);
41
+ });
42
+ it("should convert highway features to OSM entities", async () => {
43
+ const osm = await getOsm();
44
+ // Should have created nodes and ways from the highway features
45
+ expect(osm.nodes.size).toBeGreaterThan(0);
46
+ expect(osm.ways.size).toBeGreaterThan(0);
47
+ // Monaco is small, so we expect reasonable numbers
48
+ // The highway extract should have a few hundred to a few thousand ways
49
+ expect(osm.ways.size).toBeGreaterThan(100);
50
+ expect(osm.ways.size).toBeLessThan(10_000);
51
+ });
52
+ it("should preserve highway tags from GeoParquet columns", async () => {
53
+ const osm = await getOsm();
54
+ // Find ways with highway tags
55
+ let highwayCount = 0;
56
+ for (let i = 0; i < osm.ways.size; i++) {
57
+ const way = osm.ways.getByIndex(i);
58
+ if (way?.tags?.["highway"]) {
59
+ highwayCount++;
60
+ }
61
+ }
62
+ // Most features should have highway tags since this is the highways layer
63
+ expect(highwayCount).toBeGreaterThan(0);
64
+ });
65
+ it("should have valid node coordinates within Monaco bounds", async () => {
66
+ const osm = await getOsm();
67
+ // Monaco bounding box (slightly expanded for node positions)
68
+ const minLon = 7.4;
69
+ const maxLon = 7.45;
70
+ const minLat = 43.72;
71
+ const maxLat = 43.76;
72
+ // Check that all nodes are within Monaco bounds
73
+ let validNodes = 0;
74
+ for (let i = 0; i < osm.nodes.size; i++) {
75
+ const node = osm.nodes.getByIndex(i);
76
+ if (node) {
77
+ expect(node.lon).toBeGreaterThanOrEqual(minLon);
78
+ expect(node.lon).toBeLessThanOrEqual(maxLon);
79
+ expect(node.lat).toBeGreaterThanOrEqual(minLat);
80
+ expect(node.lat).toBeLessThanOrEqual(maxLat);
81
+ validNodes++;
82
+ }
83
+ }
84
+ expect(validNodes).toBeGreaterThan(0);
85
+ });
86
+ it("should build spatial indexes after loading", async () => {
87
+ const osm = await getOsm();
88
+ // Indexes should be built
89
+ expect(osm.isReady()).toBe(true);
90
+ expect(osm.nodes.isReady()).toBe(true);
91
+ expect(osm.ways.isReady()).toBe(true);
92
+ });
93
+ it("should handle ways with multiple nodes", async () => {
94
+ const osm = await getOsm();
95
+ // Count ways with enough nodes
96
+ let validWays = 0;
97
+ for (let i = 0; i < osm.ways.size; i++) {
98
+ const way = osm.ways.getByIndex(i);
99
+ if (way && way.refs.length >= 2) {
100
+ validWays++;
101
+ // All node refs should resolve to actual nodes
102
+ for (const ref of way.refs) {
103
+ const node = osm.nodes.getById(ref);
104
+ expect(node).toBeDefined();
105
+ }
106
+ }
107
+ }
108
+ // Most ways should have at least 2 nodes (minimum for a LineString)
109
+ expect(validWays).toBeGreaterThan(0);
110
+ });
111
+ it("should handle maxRows option to limit features", async () => {
112
+ const builder = new GeoParquetOsmBuilder({ id: "monaco" }, { rowEnd: 10 });
113
+ const rows = await builder.readParquetRows(await fixtureFile().arrayBuffer());
114
+ builder.processGeoParquetRows(rows);
115
+ const osm = builder.buildOsm();
116
+ // Should only have processed 10 features
117
+ expect(rows.length).toBe(10);
118
+ // Note: Some rows may be Point geometries (crossings) which don't create ways
119
+ expect(osm.nodes.size + osm.ways.size).toBeGreaterThan(0);
120
+ });
121
+ it("should find common highway types in Monaco", async () => {
122
+ const osm = await getOsm();
123
+ const highwayTypes = new Map();
124
+ for (let i = 0; i < osm.ways.size; i++) {
125
+ const way = osm.ways.getByIndex(i);
126
+ const highway = way?.tags?.["highway"];
127
+ if (highway && typeof highway === "string") {
128
+ highwayTypes.set(highway, (highwayTypes.get(highway) ?? 0) + 1);
129
+ }
130
+ }
131
+ // Monaco should have some common highway types
132
+ const allTypes = Array.from(highwayTypes.keys());
133
+ expect(allTypes.length).toBeGreaterThan(0);
134
+ // Common types that should exist in Monaco's dense urban area
135
+ const commonTypes = ["residential", "footway", "service", "path", "steps"];
136
+ const foundCommonTypes = commonTypes.filter((t) => highwayTypes.has(t));
137
+ // At least some common types should be present
138
+ expect(foundCommonTypes.length).toBeGreaterThan(0);
139
+ });
140
+ it("should handle surface and other highway attributes", async () => {
141
+ const osm = await getOsm();
142
+ // Check that some ways have additional attributes beyond just highway
143
+ let waysWithSurface = 0;
144
+ let waysWithName = 0;
145
+ for (let i = 0; i < osm.ways.size; i++) {
146
+ const way = osm.ways.getByIndex(i);
147
+ if (way?.tags) {
148
+ if (way.tags["surface"])
149
+ waysWithSurface++;
150
+ if (way.tags["name"])
151
+ waysWithName++;
152
+ }
153
+ }
154
+ // Some highways should have surface or name attributes
155
+ // (not all will, so we just check that at least some do)
156
+ expect(waysWithSurface + waysWithName).toBeGreaterThan(0);
157
+ });
158
+ it("should reuse nodes for connected highways", async () => {
159
+ const osm = await getOsm();
160
+ // Count how many ways reference the same nodes
161
+ const nodeRefCounts = new Map();
162
+ for (let i = 0; i < osm.ways.size; i++) {
163
+ const way = osm.ways.getByIndex(i);
164
+ if (way) {
165
+ for (const ref of way.refs) {
166
+ nodeRefCounts.set(ref, (nodeRefCounts.get(ref) ?? 0) + 1);
167
+ }
168
+ }
169
+ }
170
+ // Some nodes should be shared between multiple ways (intersections)
171
+ const sharedNodes = Array.from(nodeRefCounts.values()).filter((c) => c > 1);
172
+ expect(sharedNodes.length).toBeGreaterThan(0);
173
+ });
174
+ it("should handle Point geometries (crossings)", async () => {
175
+ const osm = await getOsm();
176
+ // Find nodes with crossing tags (Point features become Nodes with tags)
177
+ let crossingCount = 0;
178
+ for (let i = 0; i < osm.nodes.size; i++) {
179
+ const node = osm.nodes.getByIndex(i);
180
+ if (node?.tags?.["highway"] === "crossing") {
181
+ crossingCount++;
182
+ }
183
+ }
184
+ // Monaco should have some pedestrian crossings
185
+ expect(crossingCount).toBeGreaterThan(0);
186
+ });
187
+ it("should count geometry types in the fixture", async () => {
188
+ const builder = new GeoParquetOsmBuilder({ id: "monaco" });
189
+ const rows = await builder.readParquetRows(await fixtureFile().arrayBuffer());
190
+ const typeCounts = new Map();
191
+ for (const row of rows) {
192
+ const type = row["geometry"]?.type ?? "unknown";
193
+ typeCounts.set(type, (typeCounts.get(type) ?? 0) + 1);
194
+ }
195
+ // Highways layer should have mostly LineStrings (roads) and some Points (crossings)
196
+ expect(typeCounts.get("LineString") ?? 0).toBeGreaterThan(0);
197
+ expect(typeCounts.get("Point") ?? 0).toBeGreaterThan(0);
198
+ });
199
+ });
200
+ //# sourceMappingURL=monaco-parquet.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monaco-parquet.test.js","sourceRoot":"","sources":["../../test/monaco-parquet.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wkb.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wkb.test.d.ts","sourceRoot":"","sources":["../../test/wkb.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,234 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { parseWkb } from "../src/wkb";
3
+ /**
4
+ * Helper to create a WKB Point with properly encoded float64 coordinates.
5
+ */
6
+ function createPointWkb(lon, lat, littleEndian = true) {
7
+ const buffer = new ArrayBuffer(21);
8
+ const view = new DataView(buffer);
9
+ let offset = 0;
10
+ view.setUint8(offset, littleEndian ? 1 : 0);
11
+ offset += 1;
12
+ view.setUint32(offset, 1, littleEndian); // Point type
13
+ offset += 4;
14
+ view.setFloat64(offset, lon, littleEndian);
15
+ offset += 8;
16
+ view.setFloat64(offset, lat, littleEndian);
17
+ return new Uint8Array(buffer);
18
+ }
19
+ describe("@osmix/geoparquet: WKB Parser", () => {
20
+ it("should parse a Point geometry (little endian)", () => {
21
+ const wkb = createPointWkb(-122.4194, 37.7749, true);
22
+ const geometry = parseWkb(wkb);
23
+ expect(geometry.type).toBe("Point");
24
+ if (geometry.type === "Point") {
25
+ expect(geometry.coordinates[0]).toBeCloseTo(-122.4194, 4);
26
+ expect(geometry.coordinates[1]).toBeCloseTo(37.7749, 4);
27
+ }
28
+ });
29
+ it("should parse a Point geometry (big endian)", () => {
30
+ const wkb = createPointWkb(-122.4194, 37.7749, false);
31
+ const geometry = parseWkb(wkb);
32
+ expect(geometry.type).toBe("Point");
33
+ if (geometry.type === "Point") {
34
+ expect(geometry.coordinates[0]).toBeCloseTo(-122.4194, 4);
35
+ expect(geometry.coordinates[1]).toBeCloseTo(37.7749, 4);
36
+ }
37
+ });
38
+ it("should parse a LineString geometry", () => {
39
+ // WKB LineString with 3 points
40
+ const buffer = new ArrayBuffer(1 + 4 + 4 + 3 * 16);
41
+ const view = new DataView(buffer);
42
+ let offset = 0;
43
+ // Byte order: little endian
44
+ view.setUint8(offset, 1);
45
+ offset += 1;
46
+ // Geometry type: LineString (2)
47
+ view.setUint32(offset, 2, true);
48
+ offset += 4;
49
+ // Number of points: 3
50
+ view.setUint32(offset, 3, true);
51
+ offset += 4;
52
+ // Point 1: -122.4194, 37.7749
53
+ view.setFloat64(offset, -122.4194, true);
54
+ offset += 8;
55
+ view.setFloat64(offset, 37.7749, true);
56
+ offset += 8;
57
+ // Point 2: -122.4094, 37.7849
58
+ view.setFloat64(offset, -122.4094, true);
59
+ offset += 8;
60
+ view.setFloat64(offset, 37.7849, true);
61
+ offset += 8;
62
+ // Point 3: -122.3994, 37.7949
63
+ view.setFloat64(offset, -122.3994, true);
64
+ offset += 8;
65
+ view.setFloat64(offset, 37.7949, true);
66
+ const wkb = new Uint8Array(buffer);
67
+ const geometry = parseWkb(wkb);
68
+ expect(geometry.type).toBe("LineString");
69
+ if (geometry.type === "LineString") {
70
+ expect(geometry.coordinates).toHaveLength(3);
71
+ expect(geometry.coordinates[0]?.[0]).toBeCloseTo(-122.4194, 4);
72
+ expect(geometry.coordinates[0]?.[1]).toBeCloseTo(37.7749, 4);
73
+ expect(geometry.coordinates[1]?.[0]).toBeCloseTo(-122.4094, 4);
74
+ expect(geometry.coordinates[1]?.[1]).toBeCloseTo(37.7849, 4);
75
+ expect(geometry.coordinates[2]?.[0]).toBeCloseTo(-122.3994, 4);
76
+ expect(geometry.coordinates[2]?.[1]).toBeCloseTo(37.7949, 4);
77
+ }
78
+ });
79
+ it("should parse a Polygon geometry", () => {
80
+ // WKB Polygon with 1 ring of 5 points (closed)
81
+ const buffer = new ArrayBuffer(1 + 4 + 4 + 4 + 5 * 16);
82
+ const view = new DataView(buffer);
83
+ let offset = 0;
84
+ // Byte order: little endian
85
+ view.setUint8(offset, 1);
86
+ offset += 1;
87
+ // Geometry type: Polygon (3)
88
+ view.setUint32(offset, 3, true);
89
+ offset += 4;
90
+ // Number of rings: 1
91
+ view.setUint32(offset, 1, true);
92
+ offset += 4;
93
+ // Number of points in ring: 5
94
+ view.setUint32(offset, 5, true);
95
+ offset += 4;
96
+ // Points (closed ring)
97
+ const coords = [
98
+ [-122.4194, 37.7749],
99
+ [-122.4094, 37.7749],
100
+ [-122.4094, 37.7849],
101
+ [-122.4194, 37.7849],
102
+ [-122.4194, 37.7749], // closed
103
+ ];
104
+ for (const [lon, lat] of coords) {
105
+ view.setFloat64(offset, lon, true);
106
+ offset += 8;
107
+ view.setFloat64(offset, lat, true);
108
+ offset += 8;
109
+ }
110
+ const wkb = new Uint8Array(buffer);
111
+ const geometry = parseWkb(wkb);
112
+ expect(geometry.type).toBe("Polygon");
113
+ if (geometry.type === "Polygon") {
114
+ expect(geometry.coordinates).toHaveLength(1);
115
+ expect(geometry.coordinates[0]).toHaveLength(5);
116
+ expect(geometry.coordinates[0]?.[0]?.[0]).toBeCloseTo(-122.4194, 4);
117
+ expect(geometry.coordinates[0]?.[0]?.[1]).toBeCloseTo(37.7749, 4);
118
+ }
119
+ });
120
+ it("should parse a MultiPolygon geometry", () => {
121
+ // Helper to create polygon WKB
122
+ const createPolygonWkb = (coords) => {
123
+ const totalPoints = coords.reduce((sum, ring) => sum + ring.length, 0);
124
+ const size = 1 + 4 + 4 + coords.length * 4 + totalPoints * 16;
125
+ const buffer = new ArrayBuffer(size);
126
+ const view = new DataView(buffer);
127
+ let offset = 0;
128
+ // Byte order
129
+ view.setUint8(offset, 1);
130
+ offset += 1;
131
+ // Polygon type
132
+ view.setUint32(offset, 3, true);
133
+ offset += 4;
134
+ // Number of rings
135
+ view.setUint32(offset, coords.length, true);
136
+ offset += 4;
137
+ for (const ring of coords) {
138
+ view.setUint32(offset, ring.length, true);
139
+ offset += 4;
140
+ for (const [lon, lat] of ring) {
141
+ view.setFloat64(offset, lon, true);
142
+ offset += 8;
143
+ view.setFloat64(offset, lat, true);
144
+ offset += 8;
145
+ }
146
+ }
147
+ return [buffer, size];
148
+ };
149
+ // Create MultiPolygon with 2 polygons
150
+ const poly1Coords = [
151
+ [
152
+ [-122.4194, 37.7749],
153
+ [-122.4094, 37.7749],
154
+ [-122.4094, 37.7849],
155
+ [-122.4194, 37.7849],
156
+ [-122.4194, 37.7749],
157
+ ],
158
+ ];
159
+ const poly2Coords = [
160
+ [
161
+ [-122.3994, 37.7649],
162
+ [-122.3894, 37.7649],
163
+ [-122.3894, 37.7749],
164
+ [-122.3994, 37.7749],
165
+ [-122.3994, 37.7649],
166
+ ],
167
+ ];
168
+ const [poly1Buffer, poly1Size] = createPolygonWkb(poly1Coords);
169
+ const [poly2Buffer, poly2Size] = createPolygonWkb(poly2Coords);
170
+ // MultiPolygon header + 2 polygons
171
+ const multiBuffer = new ArrayBuffer(1 + 4 + 4 + poly1Size + poly2Size);
172
+ const multiView = new DataView(multiBuffer);
173
+ let offset = 0;
174
+ // Byte order
175
+ multiView.setUint8(offset, 1);
176
+ offset += 1;
177
+ // MultiPolygon type (6)
178
+ multiView.setUint32(offset, 6, true);
179
+ offset += 4;
180
+ // Number of geometries
181
+ multiView.setUint32(offset, 2, true);
182
+ offset += 4;
183
+ // Copy polygon 1
184
+ new Uint8Array(multiBuffer, offset, poly1Size).set(new Uint8Array(poly1Buffer));
185
+ offset += poly1Size;
186
+ // Copy polygon 2
187
+ new Uint8Array(multiBuffer, offset, poly2Size).set(new Uint8Array(poly2Buffer));
188
+ const wkb = new Uint8Array(multiBuffer);
189
+ const geometry = parseWkb(wkb);
190
+ expect(geometry.type).toBe("MultiPolygon");
191
+ if (geometry.type === "MultiPolygon") {
192
+ expect(geometry.coordinates).toHaveLength(2);
193
+ expect(geometry.coordinates[0]).toHaveLength(1);
194
+ expect(geometry.coordinates[1]).toHaveLength(1);
195
+ }
196
+ });
197
+ it("should handle EWKB with SRID flag", () => {
198
+ // EWKB Point with SRID (SRID flag: 0x20000000)
199
+ const buffer = new ArrayBuffer(1 + 4 + 4 + 16);
200
+ const view = new DataView(buffer);
201
+ let offset = 0;
202
+ // Byte order: little endian
203
+ view.setUint8(offset, 1);
204
+ offset += 1;
205
+ // Geometry type: Point (1) with SRID flag (0x20000001)
206
+ view.setUint32(offset, 0x20000001, true);
207
+ offset += 4;
208
+ // SRID: 4326
209
+ view.setUint32(offset, 4326, true);
210
+ offset += 4;
211
+ // Point: -122.4194, 37.7749
212
+ view.setFloat64(offset, -122.4194, true);
213
+ offset += 8;
214
+ view.setFloat64(offset, 37.7749, true);
215
+ const wkb = new Uint8Array(buffer);
216
+ const geometry = parseWkb(wkb);
217
+ expect(geometry.type).toBe("Point");
218
+ if (geometry.type === "Point") {
219
+ expect(geometry.coordinates[0]).toBeCloseTo(-122.4194, 4);
220
+ expect(geometry.coordinates[1]).toBeCloseTo(37.7749, 4);
221
+ }
222
+ });
223
+ it("should throw on unsupported geometry type", () => {
224
+ const wkb = new Uint8Array([
225
+ 0x01, // little endian
226
+ 0x64,
227
+ 0x00,
228
+ 0x00,
229
+ 0x00, // Invalid type (100)
230
+ ]);
231
+ expect(() => parseWkb(wkb)).toThrow("Unsupported WKB geometry type: 100");
232
+ });
233
+ });
234
+ //# sourceMappingURL=wkb.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wkb.test.js","sourceRoot":"","sources":["../../test/wkb.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/package",
3
+ "name": "@osmix/geoparquet",
4
+ "description": "Import OSM data from GeoParquet files.",
5
+ "version": "0.1.0",
6
+ "type": "module",
7
+ "main": "./src/index.ts",
8
+ "types": "./src/index.ts",
9
+ "publishConfig": {
10
+ "access": "public",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md",
22
+ "LICENSE"
23
+ ]
24
+ },
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/conveyal/osmix.git"
29
+ },
30
+ "homepage": "https://github.com/conveyal/osmix#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/conveyal/osmix/issues"
33
+ },
34
+ "sideEffects": false,
35
+ "scripts": {
36
+ "build": "tsc --excludeDirectories test",
37
+ "bench": "bun test --bench",
38
+ "prepublishOnly": "tsc",
39
+ "test": "bun test",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "devDependencies": {
43
+ "@types/bun": "catalog:",
44
+ "@types/geojson": "catalog:",
45
+ "typescript": "catalog:"
46
+ },
47
+ "dependencies": {
48
+ "@osmix/core": "workspace:*",
49
+ "@osmix/shared": "workspace:*",
50
+ "@placemarkio/geojson-rewind": "catalog:",
51
+ "hyparquet": "^1.23.0"
52
+ }
53
+ }