@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,195 @@
1
+ /**
2
+ * Multipolygon relation building utilities.
3
+ *
4
+ * Implements the OSM multipolygon relation specification to construct
5
+ * polygon geometries from way members. Handles outer/inner roles,
6
+ * way connection, and ring closure.
7
+ *
8
+ * @see https://wiki.openstreetmap.org/wiki/Relation:multipolygon
9
+ *
10
+ * @module
11
+ */
12
+ /**
13
+ * Get way members from a relation, grouped by role (outer/inner).
14
+ */
15
+ export function getWayMembersByRole(relation) {
16
+ const outer = [];
17
+ const inner = [];
18
+ for (const member of relation.members) {
19
+ if (member.type !== "way")
20
+ continue;
21
+ const role = member.role?.toLowerCase() ?? "";
22
+ if (role === "outer") {
23
+ outer.push(member);
24
+ }
25
+ else if (role === "inner") {
26
+ inner.push(member);
27
+ }
28
+ }
29
+ return { outer, inner };
30
+ }
31
+ /**
32
+ * Connect ways that share endpoints to form a continuous ring.
33
+ * Returns an array of rings (each ring is an array of way IDs in order).
34
+ *
35
+ * This function handles:
36
+ * - Ways that are reversed (end matches end, or start matches start).
37
+ * - Closed ways (single ways that form a ring).
38
+ * - Disconnected chains (multiple independent rings).
39
+ */
40
+ export function connectWaysToRings(wayMembers) {
41
+ if (wayMembers.length === 0)
42
+ return [];
43
+ const rings = [];
44
+ const used = new Set();
45
+ const wayMap = new Map();
46
+ // Build map of way ID to member
47
+ for (const member of wayMembers) {
48
+ wayMap.set(member.id, member);
49
+ }
50
+ // Helper to reverse a way's refs
51
+ const reverseWay = (way) => ({
52
+ ...way,
53
+ refs: [...way.refs].reverse(),
54
+ });
55
+ // Build rings by connecting ways
56
+ for (const startWay of wayMembers) {
57
+ if (used.has(startWay.id))
58
+ continue;
59
+ if (startWay.refs.length < 2)
60
+ throw Error("Way has less than 2 refs");
61
+ const ring = [startWay];
62
+ used.add(startWay.id);
63
+ let currentStart = startWay.refs[0];
64
+ let currentEnd = startWay.refs[startWay.refs.length - 1];
65
+ // Try to extend the ring forward
66
+ while (true) {
67
+ let found = false;
68
+ for (const nextWay of wayMembers) {
69
+ if (used.has(nextWay.id))
70
+ continue;
71
+ if (nextWay.refs.length < 2)
72
+ throw Error("Way has less than 2 refs");
73
+ const nextStart = nextWay.refs[0];
74
+ const nextEnd = nextWay.refs[nextWay.refs.length - 1];
75
+ // Check if next way connects to current end
76
+ if (currentEnd === nextStart) {
77
+ ring.push(nextWay);
78
+ used.add(nextWay.id);
79
+ currentEnd = nextEnd;
80
+ found = true;
81
+ break;
82
+ }
83
+ if (currentEnd === nextEnd) {
84
+ // Need to reverse next way
85
+ ring.push(reverseWay(nextWay));
86
+ used.add(nextWay.id);
87
+ currentEnd = nextStart;
88
+ found = true;
89
+ break;
90
+ }
91
+ }
92
+ if (!found)
93
+ break;
94
+ }
95
+ // Try to extend the ring backward
96
+ currentStart = startWay.refs[0];
97
+ currentEnd = startWay.refs[startWay.refs.length - 1];
98
+ while (true) {
99
+ let found = false;
100
+ for (const nextWay of wayMembers) {
101
+ if (used.has(nextWay.id))
102
+ continue;
103
+ if (nextWay.refs.length < 2)
104
+ throw Error("Way has less than 2 refs");
105
+ const nextStart = nextWay.refs[0];
106
+ const nextEnd = nextWay.refs[nextWay.refs.length - 1];
107
+ // Check if next way connects to current start
108
+ if (currentStart === nextEnd) {
109
+ ring.unshift(nextWay);
110
+ used.add(nextWay.id);
111
+ currentStart = nextStart;
112
+ found = true;
113
+ break;
114
+ }
115
+ if (currentStart === nextStart) {
116
+ // Need to reverse next way
117
+ ring.unshift(reverseWay(nextWay));
118
+ used.add(nextWay.id);
119
+ currentStart = nextEnd;
120
+ found = true;
121
+ break;
122
+ }
123
+ }
124
+ if (!found)
125
+ break;
126
+ }
127
+ // Only add ring if it's closed (first and last node are the same)
128
+ if (ring.length > 0) {
129
+ const firstWay = ring[0];
130
+ const lastWay = ring[ring.length - 1];
131
+ if (firstWay?.refs[0] === lastWay?.refs[lastWay.refs.length - 1]) {
132
+ rings.push(ring);
133
+ }
134
+ }
135
+ }
136
+ return rings;
137
+ }
138
+ /**
139
+ * Build polygon rings from way members of a relation.
140
+ * Returns an array where each element is an array of coordinate rings (outer + inner).
141
+ *
142
+ * Based on OSM multipolygon relation specification:
143
+ * https://wiki.openstreetmap.org/wiki/Relation:multipolygon
144
+ *
145
+ * This implementation connects way members into closed rings, and then groups them
146
+ * into polygons. Currently, it associates all inner rings with every outer ring
147
+ * found in the relation, which is a simplification. A robust implementation would
148
+ * use point-in-polygon checks to strictly nest holes inside their parent outer ring.
149
+ */
150
+ export function buildRelationRings(relation, getWay, getNodeCoordinates) {
151
+ const { outer, inner } = getWayMembersByRole(relation);
152
+ // Connect outer ways into rings
153
+ const outerRings = connectWaysToRings(outer.map((m) => getWay(m.ref)).filter((w) => w !== null));
154
+ // Connect inner ways into rings
155
+ const innerRings = connectWaysToRings(inner.map((m) => getWay(m.ref)).filter((w) => w !== null));
156
+ const wayRingToCoords = (ring) => {
157
+ const coords = [];
158
+ for (const way of ring) {
159
+ for (const nodeId of way.refs) {
160
+ const coord = getNodeCoordinates(nodeId);
161
+ if (coord)
162
+ coords.push(coord);
163
+ }
164
+ }
165
+ // Ensure ring is closed
166
+ if (coords.length > 0) {
167
+ const first = coords[0];
168
+ const last = coords[coords.length - 1];
169
+ if (first && last && (first[0] !== last[0] || first[1] !== last[1])) {
170
+ coords.push([first[0], first[1]]);
171
+ }
172
+ }
173
+ return coords;
174
+ };
175
+ // Convert way rings to coordinate rings
176
+ const coordinateRings = [];
177
+ for (const outerRing of outerRings) {
178
+ const outerCoordinates = wayRingToCoords(outerRing);
179
+ if (outerCoordinates.length >= 3) {
180
+ // Find inner rings that belong to this outer ring
181
+ const innerCoordinates = [];
182
+ for (const innerRing of innerRings) {
183
+ const innerCoords = wayRingToCoords(innerRing);
184
+ if (innerCoords.length >= 3) {
185
+ // TODO: do proper point-in-polygon test with https://github.com/rowanwins/point-in-polygon-hao
186
+ innerCoordinates.push(innerCoords);
187
+ }
188
+ }
189
+ // Create polygon: [outer ring, ...inner rings]
190
+ coordinateRings.push([outerCoordinates, ...innerCoordinates]);
191
+ }
192
+ }
193
+ return coordinateRings;
194
+ }
195
+ //# sourceMappingURL=relation-multipolygon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-multipolygon.js","sourceRoot":"","sources":["../src/relation-multipolygon.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,24 @@
1
1
  /**
2
- * Short utility for checking index access.
2
+ * Assertion utilities for defensive programming.
3
+ *
4
+ * Provides typed assertion helpers that throw errors when conditions are not met,
5
+ * commonly used for index bounds checking and null/undefined guards.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Assert that a value is neither null nor undefined.
11
+ *
12
+ * @param value - The value to check.
13
+ * @param message - Optional error message if assertion fails.
14
+ * @throws Error if value is null or undefined.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const item = array[index]
19
+ * assertValue(item, `No item at index ${index}`)
20
+ * // TypeScript now knows item is non-nullable
21
+ * ```
3
22
  */
4
23
  export declare function assertValue<T>(value?: T, message?: string): asserts value is NonNullable<T>;
5
24
  //# sourceMappingURL=assert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/assert.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC5B,KAAK,CAAC,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAIjC"}
1
+ {"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/assert.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC5B,KAAK,CAAC,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAIjC"}
@@ -1,5 +1,24 @@
1
1
  /**
2
- * Short utility for checking index access.
2
+ * Assertion utilities for defensive programming.
3
+ *
4
+ * Provides typed assertion helpers that throw errors when conditions are not met,
5
+ * commonly used for index bounds checking and null/undefined guards.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Assert that a value is neither null nor undefined.
11
+ *
12
+ * @param value - The value to check.
13
+ * @param message - Optional error message if assertion fails.
14
+ * @throws Error if value is null or undefined.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const item = array[index]
19
+ * assertValue(item, `No item at index ${index}`)
20
+ * // TypeScript now knows item is non-nullable
21
+ * ```
3
22
  */
4
23
  export function assertValue(value, message) {
5
24
  if (value === undefined || value === null) {
@@ -1 +1 @@
1
- {"version":3,"file":"assert.js","sourceRoot":"","sources":["../../src/assert.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,WAAW,CAC1B,KAAS,EACT,OAAgB;IAEhB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAA;IACrD,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"assert.js","sourceRoot":"","sources":["../../src/assert.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAC1B,KAAS,EACT,OAAgB;IAEhB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAA;IACrD,CAAC;AACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Bounding box intersection and containment utilities.
3
+ *
4
+ * Provides functions for checking spatial relationships between
5
+ * geographic bounding boxes (west, south, east, north format).
6
+ *
7
+ * @module
8
+ */
9
+ import type { GeoBbox2D } from "./types";
10
+ /**
11
+ * Check if two bounding boxes intersect or contain each other.
12
+ * Handles both partial overlaps and complete containment.
13
+ */
14
+ export declare function bboxContainsOrIntersects(bb1: GeoBbox2D, bb2: GeoBbox2D): boolean;
15
+ //# sourceMappingURL=bbox-intersects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bbox-intersects.d.ts","sourceRoot":"","sources":["../../src/bbox-intersects.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,WActE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Bounding box intersection and containment utilities.
3
+ *
4
+ * Provides functions for checking spatial relationships between
5
+ * geographic bounding boxes (west, south, east, north format).
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Check if two bounding boxes intersect or contain each other.
11
+ * Handles both partial overlaps and complete containment.
12
+ */
13
+ export function bboxContainsOrIntersects(bb1, bb2) {
14
+ const westIn = (bb1[0] >= bb2[0] && bb1[0] <= bb2[2]) ||
15
+ (bb2[0] >= bb1[0] && bb2[0] <= bb1[2]);
16
+ const eastIn = (bb1[2] >= bb2[0] && bb1[2] <= bb2[2]) ||
17
+ (bb2[2] >= bb1[0] && bb2[2] <= bb1[2]);
18
+ const northIn = (bb1[1] >= bb2[1] && bb1[1] <= bb2[3]) ||
19
+ (bb2[1] >= bb1[1] && bb2[1] <= bb1[3]);
20
+ const southIn = (bb1[3] >= bb2[1] && bb1[3] <= bb2[3]) ||
21
+ (bb2[3] >= bb1[1] && bb2[3] <= bb1[3]);
22
+ return (westIn || eastIn) && (northIn || southIn);
23
+ }
24
+ //# sourceMappingURL=bbox-intersects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bbox-intersects.js","sourceRoot":"","sources":["../../src/bbox-intersects.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAc,EAAE,GAAc;IACtE,MAAM,MAAM,GACX,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,MAAM,GACX,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,OAAO,GACZ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,OAAO,GACZ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAA;AAClD,CAAC"}
@@ -1,2 +1,18 @@
1
- export declare function bytesToStream(bytes: Uint8Array<ArrayBuffer>): import("stream/web").ReadableStream<Uint8Array<ArrayBuffer>>;
1
+ /**
2
+ * Byte array to stream conversion.
3
+ *
4
+ * Wraps a Uint8Array in a ReadableStream for use with streaming APIs.
5
+ *
6
+ * @module
7
+ */
8
+ /**
9
+ * Create a ReadableStream from a Uint8Array.
10
+ *
11
+ * The stream will emit the entire byte array as a single chunk,
12
+ * then close immediately.
13
+ *
14
+ * @param bytes - The byte array to wrap.
15
+ * @returns A ReadableStream that emits the bytes.
16
+ */
17
+ export declare function bytesToStream(bytes: Uint8Array<ArrayBuffer>): ReadableStream<Uint8Array<ArrayBuffer>>;
2
18
  //# sourceMappingURL=bytes-to-stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bytes-to-stream.d.ts","sourceRoot":"","sources":["../../src/bytes-to-stream.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,gEAO3D"}
1
+ {"version":3,"file":"bytes-to-stream.d.ts","sourceRoot":"","sources":["../../src/bytes-to-stream.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,2CAO3D"}
@@ -1,3 +1,19 @@
1
+ /**
2
+ * Byte array to stream conversion.
3
+ *
4
+ * Wraps a Uint8Array in a ReadableStream for use with streaming APIs.
5
+ *
6
+ * @module
7
+ */
8
+ /**
9
+ * Create a ReadableStream from a Uint8Array.
10
+ *
11
+ * The stream will emit the entire byte array as a single chunk,
12
+ * then close immediately.
13
+ *
14
+ * @param bytes - The byte array to wrap.
15
+ * @returns A ReadableStream that emits the bytes.
16
+ */
1
17
  export function bytesToStream(bytes) {
2
18
  return new ReadableStream({
3
19
  start(controller) {
@@ -1 +1 @@
1
- {"version":3,"file":"bytes-to-stream.js","sourceRoot":"","sources":["../../src/bytes-to-stream.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,KAA8B;IAC3D,OAAO,IAAI,cAAc,CAA0B;QAClD,KAAK,CAAC,UAAU;YACf,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzB,UAAU,CAAC,KAAK,EAAE,CAAA;QACnB,CAAC;KACD,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"bytes-to-stream.js","sourceRoot":"","sources":["../../src/bytes-to-stream.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAA8B;IAC3D,OAAO,IAAI,cAAc,CAA0B;QAClD,KAAK,CAAC,UAAU;YACf,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzB,UAAU,CAAC,KAAK,EAAE,CAAA;QACnB,CAAC;KACD,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Rgba } from "./types";
2
+ export declare function normalizeHexColor(value: string | number | null | undefined): string | undefined;
3
+ export declare function hexColorToRgba(value: string | number | null | undefined): Rgba | undefined;
4
+ //# sourceMappingURL=color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAInC,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,GAAG,SAAS,CAiBpB;AAED,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,IAAI,GAAG,SAAS,CASlB"}
@@ -0,0 +1,33 @@
1
+ const hexPattern = /^[0-9a-fA-F]+$/;
2
+ export function normalizeHexColor(value) {
3
+ if (value === null || value === undefined)
4
+ return;
5
+ const raw = String(value).trim();
6
+ if (!raw)
7
+ return;
8
+ let hex = raw.startsWith("#") ? raw.slice(1) : raw;
9
+ if (!hexPattern.test(hex))
10
+ return;
11
+ if (hex.length === 3 || hex.length === 4) {
12
+ hex = hex
13
+ .split("")
14
+ .map((char) => `${char}${char}`)
15
+ .join("");
16
+ }
17
+ else if (hex.length !== 6 && hex.length !== 8) {
18
+ return;
19
+ }
20
+ return `#${hex.toUpperCase()}`;
21
+ }
22
+ export function hexColorToRgba(value) {
23
+ const normalized = normalizeHexColor(value);
24
+ if (!normalized)
25
+ return;
26
+ const hex = normalized.slice(1);
27
+ const r = Number.parseInt(hex.slice(0, 2), 16);
28
+ const g = Number.parseInt(hex.slice(2, 4), 16);
29
+ const b = Number.parseInt(hex.slice(4, 6), 16);
30
+ const a = hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) : 255;
31
+ return [r, g, b, a];
32
+ }
33
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/color.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,gBAAgB,CAAA;AAEnC,MAAM,UAAU,iBAAiB,CAChC,KAAyC;IAEzC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAM;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAChC,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,IAAI,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAM;IAEjC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,GAAG,GAAG,GAAG;aACP,KAAK,CAAC,EAAE,CAAC;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;aAC/B,IAAI,CAAC,EAAE,CAAC,CAAA;IACX,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAM;IACP,CAAC;IAED,OAAO,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,KAAyC;IAEzC,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,CAAC,UAAU;QAAE,OAAM;IACvB,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9C,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACvE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AACpB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Coordinate precision utilities for OSM data.
3
+ *
4
+ * OSM stores coordinates as integer microdegrees (7 decimal places) for
5
+ * compact storage and consistent precision. This module provides conversions
6
+ * between floating-point degrees and integer microdegrees.
7
+ *
8
+ * @module
9
+ */
10
+ import type { GeoBbox2D } from "./types";
11
+ /**
12
+ * OSM coordinate scale: coordinates are stored as integer microdegrees.
13
+ * 1 microdegree = 1e-7 degrees = 0.0000001 degrees
14
+ */
15
+ export declare const OSM_COORD_SCALE = 10000000;
16
+ /**
17
+ * Convert degrees to microdegrees (integer).
18
+ */
19
+ export declare function toMicroDegrees(degrees: number): number;
20
+ /**
21
+ * Convert microdegrees (integer) to degrees (float).
22
+ */
23
+ export declare function microToDegrees(microdegrees: number): number;
24
+ /**
25
+ * Convert a bounding box from degrees to microdegrees.
26
+ */
27
+ export declare function bboxToMicroDegrees(bbox: GeoBbox2D): [minLon: number, minLat: number, maxLon: number, maxLat: number];
28
+ //# sourceMappingURL=coordinates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinates.d.ts","sourceRoot":"","sources":["../../src/coordinates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAM,CAAA;AAElC;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,SAAS,GACb,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAOlE"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Coordinate precision utilities for OSM data.
3
+ *
4
+ * OSM stores coordinates as integer microdegrees (7 decimal places) for
5
+ * compact storage and consistent precision. This module provides conversions
6
+ * between floating-point degrees and integer microdegrees.
7
+ *
8
+ * @module
9
+ */
10
+ /**
11
+ * OSM coordinate scale: coordinates are stored as integer microdegrees.
12
+ * 1 microdegree = 1e-7 degrees = 0.0000001 degrees
13
+ */
14
+ export const OSM_COORD_SCALE = 1e7;
15
+ /**
16
+ * Convert degrees to microdegrees (integer).
17
+ */
18
+ export function toMicroDegrees(degrees) {
19
+ return Math.round(degrees * OSM_COORD_SCALE);
20
+ }
21
+ /**
22
+ * Convert microdegrees (integer) to degrees (float).
23
+ */
24
+ export function microToDegrees(microdegrees) {
25
+ return microdegrees / OSM_COORD_SCALE;
26
+ }
27
+ /**
28
+ * Convert a bounding box from degrees to microdegrees.
29
+ */
30
+ export function bboxToMicroDegrees(bbox) {
31
+ return [
32
+ toMicroDegrees(bbox[0]),
33
+ toMicroDegrees(bbox[1]),
34
+ toMicroDegrees(bbox[2]),
35
+ toMicroDegrees(bbox[3]),
36
+ ];
37
+ }
38
+ //# sourceMappingURL=coordinates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinates.js","sourceRoot":"","sources":["../../src/coordinates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;AAElC;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC,CAAA;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,YAAoB;IAClD,OAAO,YAAY,GAAG,eAAe,CAAA;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CACjC,IAAe;IAEf,OAAO;QACN,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACvB,CAAA;AACF,CAAC"}
@@ -1,5 +1,13 @@
1
1
  /**
2
- * Calculate the haversine distance between two LonLat points.
2
+ * Great-circle distance calculation using the Haversine formula.
3
+ *
4
+ * Computes the shortest distance between two points on a sphere,
5
+ * accounting for Earth's curvature. Accurate for most geographic distances.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Calculate the great-circle distance between two geographic points.
3
11
  * @param p1 - The first point
4
12
  * @param p2 - The second point
5
13
  * @returns The haversine distance in meters
@@ -1 +1 @@
1
- {"version":3,"file":"haversine-distance.d.ts","sourceRoot":"","sources":["../../src/haversine-distance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACpB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAClB,MAAM,CAWR"}
1
+ {"version":3,"file":"haversine-distance.d.ts","sourceRoot":"","sources":["../../src/haversine-distance.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACpB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAClB,MAAM,CAWR"}
@@ -1,5 +1,13 @@
1
1
  /**
2
- * Calculate the haversine distance between two LonLat points.
2
+ * Great-circle distance calculation using the Haversine formula.
3
+ *
4
+ * Computes the shortest distance between two points on a sphere,
5
+ * accounting for Earth's curvature. Accurate for most geographic distances.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Calculate the great-circle distance between two geographic points.
3
11
  * @param p1 - The first point
4
12
  * @param p2 - The second point
5
13
  * @returns The haversine distance in meters
@@ -1 +1 @@
1
- {"version":3,"file":"haversine-distance.js","sourceRoot":"","sources":["../../src/haversine-distance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAChC,EAAoB,EACpB,EAAoB;IAEpB,MAAM,CAAC,GAAG,SAAS,CAAA,CAAC,2BAA2B;IAC/C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACpC,MAAM,CAAC,GACN,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"haversine-distance.js","sourceRoot":"","sources":["../../src/haversine-distance.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAChC,EAAoB,EACpB,EAAoB;IAEpB,MAAM,CAAC,GAAG,SAAS,CAAA,CAAC,2BAA2B;IAC/C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACpC,MAAM,CAAC,GACN,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,CAAA;AACb,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Progress event helpers for long-running operations.
3
+ *
4
+ * Provides a standard interface for reporting progress from workers and
5
+ * async operations. Uses CustomEvent for cross-context communication.
6
+ *
7
+ * @module
8
+ */
9
+ export type ProgressLevel = "info" | "warn" | "error";
10
+ /**
11
+ * Progress payload containing a message and timestamp.
12
+ * Planned expansion to include percentage completion.
13
+ */
14
+ export type Progress = {
15
+ msg: string;
16
+ timestamp: number;
17
+ level: ProgressLevel;
18
+ };
19
+ /** CustomEvent carrying progress details. */
20
+ export interface ProgressEvent extends CustomEvent<Progress> {
21
+ }
22
+ /**
23
+ * Create a Progress payload with current timestamp.
24
+ * @param msg - The progress message.
25
+ */
26
+ export declare function progress(msg: string, level?: ProgressLevel): Progress;
27
+ /**
28
+ * Create a ProgressEvent with the given message.
29
+ * @param msg - The progress message.
30
+ */
31
+ export declare function progressEvent(msg: string, level?: ProgressLevel): ProgressEvent;
32
+ /**
33
+ * Extract the message string from a progress event.
34
+ * @param event - The event to extract from.
35
+ */
36
+ export declare function progressEventMessage(event: Event): string;
37
+ /**
38
+ * Log a progress event's message to the console.
39
+ * @param progress - The progress event to log.
40
+ */
41
+ export declare function logProgress(progress: ProgressEvent): void;
42
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAErD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,aAAa,CAAA;CACpB,CAAA;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAc,SAAQ,WAAW,CAAC,QAAQ,CAAC;CAAG;AAE/D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,aAAsB,GAAG,QAAQ,CAM7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,aAAsB,GAC3B,aAAa,CAEf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,QAclD"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Progress event helpers for long-running operations.
3
+ *
4
+ * Provides a standard interface for reporting progress from workers and
5
+ * async operations. Uses CustomEvent for cross-context communication.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Create a Progress payload with current timestamp.
11
+ * @param msg - The progress message.
12
+ */
13
+ export function progress(msg, level = "info") {
14
+ return {
15
+ msg,
16
+ timestamp: Date.now(),
17
+ level,
18
+ };
19
+ }
20
+ /**
21
+ * Create a ProgressEvent with the given message.
22
+ * @param msg - The progress message.
23
+ */
24
+ export function progressEvent(msg, level = "info") {
25
+ return new CustomEvent("progress", { detail: progress(msg, level) });
26
+ }
27
+ /**
28
+ * Extract the message string from a progress event.
29
+ * @param event - The event to extract from.
30
+ */
31
+ export function progressEventMessage(event) {
32
+ return event.detail.msg;
33
+ }
34
+ /**
35
+ * Log a progress event's message to the console.
36
+ * @param progress - The progress event to log.
37
+ */
38
+ export function logProgress(progress) {
39
+ const level = progress.detail.level;
40
+ const message = progressEventMessage(progress);
41
+ switch (level) {
42
+ case "info":
43
+ console.log(message);
44
+ break;
45
+ case "warn":
46
+ console.warn(message);
47
+ break;
48
+ case "error":
49
+ console.error(message);
50
+ break;
51
+ }
52
+ }
53
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,QAAuB,MAAM;IAClE,OAAO;QACN,GAAG;QACH,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK;KACL,CAAA;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC5B,GAAW,EACX,QAAuB,MAAM;IAE7B,OAAO,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAY;IAChD,OAAQ,KAAuB,CAAC,MAAM,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAuB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;IACnC,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAC9C,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,MAAM;YACV,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACpB,MAAK;QACN,KAAK,MAAM;YACV,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrB,MAAK;QACN,KAAK,OAAO;YACX,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtB,MAAK;IACP,CAAC;AACF,CAAC"}