@sakuzu/maplibre-gl-draw 1.0.0 → 2.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 (541) hide show
  1. package/CHANGELOG.md +1109 -2
  2. package/README.ja.md +83 -50
  3. package/README.md +89 -53
  4. package/THIRD_PARTY_NOTICES.md +29 -0
  5. package/dist/api/datasets.d.ts +263 -0
  6. package/dist/api/document.d.ts +66 -0
  7. package/dist/api/draw.d.ts +137 -0
  8. package/dist/api/draw.js +20 -0
  9. package/dist/api/drawing.d.ts +87 -0
  10. package/dist/api/errors.d.ts +35 -0
  11. package/dist/api/errors.js +35 -0
  12. package/dist/api/events.d.ts +316 -0
  13. package/dist/api/extension/context.d.ts +247 -0
  14. package/dist/api/extension/feature-type.d.ts +129 -0
  15. package/dist/api/extension/mode.d.ts +123 -0
  16. package/dist/api/extension/plugin.d.ts +51 -0
  17. package/dist/api/extension/plugin.js +3 -0
  18. package/dist/api/extension/provider.d.ts +119 -0
  19. package/dist/api/extension/provider.js +3 -0
  20. package/dist/api/extension/render.d.ts +176 -0
  21. package/dist/api/extension/render.js +3 -0
  22. package/dist/api/extension/store.d.ts +190 -0
  23. package/dist/api/extension/store.js +3 -0
  24. package/dist/api/extensions.d.ts +306 -0
  25. package/dist/api/extensions.js +3 -0
  26. package/dist/api/features.d.ts +188 -0
  27. package/dist/api/features.js +3 -0
  28. package/dist/api/groups.d.ts +111 -0
  29. package/dist/api/groups.js +3 -0
  30. package/dist/api/hidden.d.ts +45 -0
  31. package/dist/api/hidden.js +3 -0
  32. package/dist/api/impl/adapters.js +463 -0
  33. package/dist/api/impl/contexts.js +466 -0
  34. package/dist/api/impl/create-draw.js +124 -0
  35. package/dist/api/impl/datasets.js +405 -0
  36. package/dist/api/impl/destroy-guard.js +74 -0
  37. package/dist/api/impl/document.js +280 -0
  38. package/dist/api/impl/drawing.js +180 -0
  39. package/dist/api/impl/engine-context.d.ts +7 -0
  40. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  41. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  42. package/dist/api/impl/events.js +423 -0
  43. package/dist/api/impl/extension-host.js +364 -0
  44. package/dist/api/impl/extensions.js +229 -0
  45. package/dist/api/impl/features.js +445 -0
  46. package/dist/api/impl/geometry/apply.d.ts +32 -0
  47. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  48. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  49. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  50. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  51. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  52. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  53. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  54. package/dist/api/impl/geometry/types.js +3 -0
  55. package/dist/api/impl/groups.d.ts +3 -0
  56. package/dist/api/impl/groups.js +268 -0
  57. package/dist/api/impl/hidden.js +60 -0
  58. package/dist/api/impl/import-export/constants.d.ts +22 -0
  59. package/dist/api/impl/import-export/constants.js +24 -0
  60. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  61. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  62. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  63. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  64. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  66. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  68. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  69. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  70. package/dist/api/impl/import-export/image-import.js +73 -0
  71. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  72. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  73. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  74. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  75. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  76. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  77. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  78. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  79. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  80. package/dist/api/impl/import-export/style-validation.js +86 -0
  81. package/dist/api/impl/import-export/types.d.ts +52 -0
  82. package/dist/api/impl/import-export/types.js +3 -0
  83. package/dist/api/impl/input.js +180 -0
  84. package/dist/api/impl/layers.js +307 -0
  85. package/dist/api/impl/metadata.d.ts +1 -0
  86. package/dist/api/impl/metadata.js +22 -0
  87. package/dist/api/impl/options.d.ts +1 -0
  88. package/dist/api/impl/options.js +851 -0
  89. package/dist/api/impl/placement.d.ts +1 -0
  90. package/dist/api/impl/placement.js +138 -0
  91. package/dist/api/impl/render-context.d.ts +13 -0
  92. package/dist/api/impl/render-context.js +272 -0
  93. package/dist/api/impl/rows.d.ts +1 -0
  94. package/dist/api/impl/rows.js +46 -0
  95. package/dist/api/impl/selection.d.ts +1 -0
  96. package/dist/api/impl/selection.js +186 -0
  97. package/dist/api/impl/shared.d.ts +64 -0
  98. package/dist/api/impl/shared.js +178 -0
  99. package/dist/api/impl/validate-extension.d.ts +1 -0
  100. package/dist/api/impl/validate-extension.js +159 -0
  101. package/dist/api/layers.d.ts +130 -0
  102. package/dist/api/layers.js +3 -0
  103. package/dist/api/metadata.d.ts +18 -0
  104. package/dist/api/metadata.js +3 -0
  105. package/dist/api/model.d.ts +487 -0
  106. package/dist/api/model.js +47 -0
  107. package/dist/api/options.d.ts +466 -0
  108. package/dist/api/options.js +3 -0
  109. package/dist/api/selection.d.ts +94 -0
  110. package/dist/api/selection.js +3 -0
  111. package/dist/api/state.d.ts +155 -0
  112. package/dist/api/state.js +12 -0
  113. package/dist/{display → dataset}/chunk.d.ts +1 -1
  114. package/dist/{display → dataset}/chunk.js +4 -3
  115. package/dist/{display → dataset}/dataset.js +21 -21
  116. package/dist/dataset/interaction.d.ts +1 -0
  117. package/dist/{display → dataset}/interaction.js +18 -6
  118. package/dist/dataset/manager.d.ts +1 -0
  119. package/dist/dataset/provider.d.ts +1 -0
  120. package/dist/{display → dataset}/retained.d.ts +1 -1
  121. package/dist/{display → dataset}/retained.js +8 -7
  122. package/dist/dataset/source.d.ts +1 -0
  123. package/dist/{display → dataset}/source.js +17 -4
  124. package/dist/dataset/spatial.d.ts +1 -0
  125. package/dist/{display → dataset}/spatial.js +1 -1
  126. package/dist/dataset/style.d.ts +1 -0
  127. package/dist/{display → dataset}/style.js +1 -1
  128. package/dist/dataset/table-source.d.ts +1 -0
  129. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  130. package/dist/{display → dataset}/thinning.d.ts +0 -10
  131. package/dist/{display → dataset}/thinning.js +3 -2
  132. package/dist/dataset/triangulation.d.ts +1 -0
  133. package/dist/{display → dataset}/triangulation.js +0 -0
  134. package/dist/{display → dataset}/types.d.ts +84 -121
  135. package/dist/dataset/types.js +61 -0
  136. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  137. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  138. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  139. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  140. package/dist/dispatcher/hit-test/service.js +80 -16
  141. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  142. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  143. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  144. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  145. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  146. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  147. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  148. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  149. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  150. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  151. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  152. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  153. package/dist/dispatcher/input-router.js +154 -70
  154. package/dist/dispatcher/normalizer.js +25 -4
  155. package/dist/dispatcher/types.d.ts +6 -1
  156. package/dist/extension/feature-handler.d.ts +1 -182
  157. package/dist/extension/index.d.ts +4 -7
  158. package/dist/extension/renderers.d.ts +1 -208
  159. package/dist/geometry/angle.d.ts +0 -8
  160. package/dist/geometry/angle.js +0 -8
  161. package/dist/geometry/bbox.d.ts +4 -12
  162. package/dist/geometry/bbox.js +4 -12
  163. package/dist/geometry/boolean.d.ts +0 -51
  164. package/dist/geometry/boolean.js +0 -51
  165. package/dist/geometry/buffer.d.ts +0 -26
  166. package/dist/geometry/buffer.js +0 -26
  167. package/dist/geometry/circle.d.ts +0 -9
  168. package/dist/geometry/circle.js +0 -9
  169. package/dist/geometry/coords.d.ts +0 -16
  170. package/dist/geometry/coords.js +0 -16
  171. package/dist/geometry/distance.d.ts +0 -24
  172. package/dist/geometry/distance.js +0 -24
  173. package/dist/geometry/errors.d.ts +21 -36
  174. package/dist/geometry/errors.js +49 -29
  175. package/dist/geometry/geojson.d.ts +85 -0
  176. package/dist/geometry/geojson.js +173 -0
  177. package/dist/geometry/index.d.ts +38 -23
  178. package/dist/geometry/index.js +43 -31
  179. package/dist/geometry/measure.d.ts +0 -27
  180. package/dist/geometry/measure.js +0 -27
  181. package/dist/geometry/predicates.d.ts +0 -9
  182. package/dist/geometry/predicates.js +0 -9
  183. package/dist/geometry/public-bounds.d.ts +26 -0
  184. package/dist/geometry/public-bounds.js +30 -0
  185. package/dist/geometry/public-combine.d.ts +78 -0
  186. package/dist/geometry/public-combine.js +82 -0
  187. package/dist/geometry/public-create.d.ts +54 -0
  188. package/dist/geometry/public-create.js +70 -0
  189. package/dist/geometry/public-measure.d.ts +170 -0
  190. package/dist/geometry/public-measure.js +283 -0
  191. package/dist/geometry/public-predicates.d.ts +54 -0
  192. package/dist/geometry/public-predicates.js +144 -0
  193. package/dist/geometry/public-repair.d.ts +75 -0
  194. package/dist/geometry/public-repair.js +77 -0
  195. package/dist/geometry/simplify.d.ts +0 -7
  196. package/dist/geometry/simplify.js +0 -7
  197. package/dist/geometry/split.d.ts +0 -20
  198. package/dist/geometry/split.js +0 -20
  199. package/dist/geometry/units.d.ts +20 -12
  200. package/dist/geometry/units.js +20 -12
  201. package/dist/index.d.ts +66 -66
  202. package/dist/index.js +6 -18
  203. package/dist/messages.d.ts +7 -7
  204. package/dist/modes/draw/circle.js +83 -207
  205. package/dist/modes/draw/commit-layer.d.ts +5 -16
  206. package/dist/modes/draw/commit-layer.js +2 -13
  207. package/dist/modes/draw/freehand.js +108 -246
  208. package/dist/modes/draw/image.js +4 -2
  209. package/dist/modes/draw/index.d.ts +5 -5
  210. package/dist/modes/draw/index.js +5 -5
  211. package/dist/modes/draw/line.js +18 -354
  212. package/dist/modes/draw/point.js +29 -78
  213. package/dist/modes/draw/polygon.js +23 -368
  214. package/dist/modes/draw/trace-support.d.ts +43 -36
  215. package/dist/modes/draw/trace-support.js +95 -98
  216. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  217. package/dist/modes/draw/vertex-drawing.js +176 -0
  218. package/dist/modes/handler.d.ts +1 -285
  219. package/dist/modes/manager.d.ts +2 -2
  220. package/dist/modes/manager.js +3 -0
  221. package/dist/modes/select/box-selection.d.ts +3 -3
  222. package/dist/modes/select/box-selection.js +2 -1
  223. package/dist/modes/select/click-handler.d.ts +5 -5
  224. package/dist/modes/select/click-handler.js +22 -20
  225. package/dist/modes/select/cursor-handler.d.ts +2 -2
  226. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  227. package/dist/modes/select/drag/move.js +3 -3
  228. package/dist/modes/select/drag/operation.d.ts +3 -3
  229. package/dist/modes/select/drag/radius.js +5 -4
  230. package/dist/modes/select/drag/transform.d.ts +2 -2
  231. package/dist/modes/select/drag/transform.js +11 -5
  232. package/dist/modes/select/drag/vertex.d.ts +2 -2
  233. package/dist/modes/select/drag/vertex.js +13 -8
  234. package/dist/modes/select/drag-handler.js +44 -25
  235. package/dist/modes/select/mode.js +17 -17
  236. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  237. package/dist/modes/select/shortcut-handler.js +9 -7
  238. package/dist/operations/layer-operations.js +29 -168
  239. package/dist/operations/resize.d.ts +2 -2
  240. package/dist/operations/resize.js +5 -5
  241. package/dist/operations/rotate.js +5 -5
  242. package/dist/operations/selection-operations.d.ts +16 -1
  243. package/dist/operations/selection-operations.js +28 -13
  244. package/dist/operations/shared-vertex.js +4 -2
  245. package/dist/operations/trace-graph.d.ts +0 -18
  246. package/dist/operations/trace-graph.js +0 -18
  247. package/dist/operations/vertex.js +36 -35
  248. package/dist/shared/color.d.ts +1 -0
  249. package/dist/shared/color.js +245 -0
  250. package/dist/shared/config/constants.d.ts +1 -54
  251. package/dist/shared/config/constants.js +1 -58
  252. package/dist/shared/config/feature-style.d.ts +16 -13
  253. package/dist/shared/config/feature-style.js +9 -0
  254. package/dist/shared/config/rendering.d.ts +3 -3
  255. package/dist/shared/config/selection-highlight.d.ts +0 -15
  256. package/dist/shared/config/selection-highlight.js +4 -7
  257. package/dist/shared/config/selection.d.ts +2 -32
  258. package/dist/shared/config/selection.js +0 -18
  259. package/dist/shared/config/topology.d.ts +2 -2
  260. package/dist/shared/config/trace.d.ts +4 -4
  261. package/dist/shared/math/angle.d.ts +1 -1
  262. package/dist/shared/math/angle.js +1 -1
  263. package/dist/shared/math/circle.d.ts +1 -1
  264. package/dist/shared/math/circle.js +1 -1
  265. package/dist/shared/math/distance.d.ts +2 -1
  266. package/dist/shared/math/distance.js +3 -2
  267. package/dist/shared/math/index.d.ts +1 -1
  268. package/dist/shared/math/index.js +1 -1
  269. package/dist/shared/math/transform.d.ts +23 -0
  270. package/dist/shared/math/transform.js +47 -28
  271. package/dist/shared/properties.d.ts +18 -0
  272. package/dist/shared/properties.js +129 -0
  273. package/dist/shared/types/events.d.ts +15 -7
  274. package/dist/shared/types/model.d.ts +109 -159
  275. package/dist/shared/types/style.d.ts +1 -1
  276. package/dist/shared/utils/color.d.ts +2 -36
  277. package/dist/shared/utils/color.js +13 -70
  278. package/dist/shared/utils/coordinates.d.ts +30 -4
  279. package/dist/shared/utils/coordinates.js +56 -10
  280. package/dist/shared/utils/event-emitter.d.ts +1 -262
  281. package/dist/shared/utils/event-emitter.js +4 -3
  282. package/dist/shared/utils/feature-bbox.js +8 -7
  283. package/dist/shared/utils/feature-segments.js +5 -4
  284. package/dist/shared/utils/image.d.ts +0 -4
  285. package/dist/shared/utils/image.js +0 -6
  286. package/dist/shared/utils/name-generator.d.ts +14 -20
  287. package/dist/shared/utils/name-generator.js +20 -3
  288. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  289. package/dist/shared/utils/pixel-ratio.js +13 -4
  290. package/dist/shared/utils/property.d.ts +7 -50
  291. package/dist/shared/utils/property.js +22 -87
  292. package/dist/snapping/custom-targets.js +21 -4
  293. package/dist/snapping/indicator.js +20 -11
  294. package/dist/snapping/providers/display.d.ts +6 -1
  295. package/dist/snapping/providers/display.js +2 -1
  296. package/dist/snapping/providers/guide.d.ts +3 -43
  297. package/dist/snapping/providers/guide.js +1 -44
  298. package/dist/snapping/providers/intersection.js +1 -1
  299. package/dist/snapping/providers/store.js +3 -3
  300. package/dist/snapping/service.js +18 -7
  301. package/dist/snapping/types.d.ts +9 -35
  302. package/dist/store/draw-store.js +233 -142
  303. package/dist/store/local-visibility.d.ts +11 -6
  304. package/dist/store/local-visibility.js +38 -7
  305. package/dist/store/lock.d.ts +0 -6
  306. package/dist/store/lock.js +0 -6
  307. package/dist/store/memory/change-bus.d.ts +3 -3
  308. package/dist/store/memory/change-bus.js +12 -0
  309. package/dist/store/memory/file-store.d.ts +2 -2
  310. package/dist/store/memory/ui-state.d.ts +1 -51
  311. package/dist/store/memory/ui-state.js +122 -134
  312. package/dist/store/memory.d.ts +1 -8
  313. package/dist/store/memory.js +249 -45
  314. package/dist/store/ordering.d.ts +9 -0
  315. package/dist/store/ordering.js +17 -0
  316. package/dist/store/spatial/spatial-index.d.ts +1 -1
  317. package/dist/store/spatial/spatial-index.js +1 -1
  318. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  319. package/dist/store/spatial/store-spatial-index.js +9 -3
  320. package/dist/store/store.d.ts +66 -107
  321. package/dist/store/types.d.ts +1 -1
  322. package/dist/store/writable-layer.d.ts +1 -1
  323. package/dist/store/writable-layer.js +2 -2
  324. package/dist/table/builder.d.ts +83 -0
  325. package/dist/table/builder.js +381 -0
  326. package/dist/table/index.d.ts +37 -0
  327. package/dist/table/index.js +5 -0
  328. package/dist/table/packed-rtree.d.ts +1 -0
  329. package/dist/{display → table}/packed-rtree.js +1 -1
  330. package/dist/table/partition.d.ts +1 -0
  331. package/dist/{display → table}/partition.js +3 -3
  332. package/dist/table/prepare.d.ts +44 -0
  333. package/dist/table/prepare.js +136 -0
  334. package/dist/table/table.d.ts +1 -0
  335. package/dist/{display/columnar → table}/table.js +29 -25
  336. package/dist/{display/columnar → table}/types.d.ts +68 -72
  337. package/dist/table/types.js +3 -0
  338. package/dist/view/coordinator.js +4 -3
  339. package/dist/view/feature-companion.d.ts +13 -7
  340. package/dist/view/feature-companion.js +11 -3
  341. package/dist/view/globe-subdivision.js +3 -3
  342. package/dist/view/layer/attach.d.ts +12 -6
  343. package/dist/view/layer/attach.js +86 -10
  344. package/dist/view/layer/custom-layer.js +40 -11
  345. package/dist/view/layer/display-list.js +2 -1
  346. package/dist/view/layer/drape-planner.d.ts +2 -2
  347. package/dist/view/layer/frame-render.d.ts +3 -3
  348. package/dist/view/layer/frame-render.js +7 -2
  349. package/dist/view/layer/frame-state.d.ts +6 -6
  350. package/dist/view/layer/index.d.ts +2 -2
  351. package/dist/view/layer/index.js +1 -1
  352. package/dist/view/layer/render.d.ts +4 -4
  353. package/dist/view/layer/render.js +3 -8
  354. package/dist/view/layer/renderers.d.ts +2 -2
  355. package/dist/view/layer/renderers.js +1 -1
  356. package/dist/view/layer/slot-manager.d.ts +2 -2
  357. package/dist/view/layer/slot-manager.js +4 -4
  358. package/dist/view/layer/slots.d.ts +2 -2
  359. package/dist/view/layer/slots.js +1 -1
  360. package/dist/view/layer/store-retained-bbox.js +3 -2
  361. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  362. package/dist/view/layer/store-retained-classify.js +19 -7
  363. package/dist/view/layer/store-retained-collect.js +8 -7
  364. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  365. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  366. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  367. package/dist/view/layer/store-retained-immediate.js +3 -8
  368. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  369. package/dist/view/layer/store-retained.d.ts +2 -2
  370. package/dist/view/layer/store-retained.js +1 -1
  371. package/dist/view/renderers/batch-manager.js +8 -7
  372. package/dist/view/renderers/drawer.js +21 -15
  373. package/dist/view/renderers/image.js +13 -39
  374. package/dist/view/renderers/line/line-types.d.ts +3 -3
  375. package/dist/view/renderers/line/sdf-line.js +3 -1
  376. package/dist/view/renderers/point/billboard-depth.js +1 -1
  377. package/dist/view/renderers/point/point-instance.js +1 -1
  378. package/dist/view/renderers/point/point-shape.js +2 -2
  379. package/dist/view/renderers/point/point-style.js +48 -4
  380. package/dist/view/renderers/polygon/batch.js +1 -2
  381. package/dist/view/renderers/polygon/fill.js +3 -1
  382. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  383. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  384. package/dist/view/renderers/stroke.js +3 -1
  385. package/dist/view/shaders/helpers.d.ts +2 -42
  386. package/dist/view/shaders/helpers.js +0 -6
  387. package/dist/view/shaders/projection.d.ts +15 -7
  388. package/dist/view/shaders/projection.js +23 -6
  389. package/dist/view/shaders/quad.d.ts +16 -12
  390. package/dist/view/shaders/quad.js +34 -13
  391. package/dist/view/style-rule.d.ts +5 -42
  392. package/dist/view/style-rule.js +20 -44
  393. package/dist/view/terrain/binding.d.ts +1 -0
  394. package/dist/view/terrain/binding.js +29 -0
  395. package/dist/view/terrain/context.d.ts +3 -4
  396. package/dist/view/terrain/context.js +4 -5
  397. package/dist/view/terrain/drape/geometry.js +1 -1
  398. package/dist/view/terrain/drape/pass.d.ts +1 -1
  399. package/dist/view/terrain/drape/pass.js +8 -7
  400. package/dist/view/terrain/polygon.d.ts +9 -5
  401. package/dist/view/terrain/polygon.js +16 -2
  402. package/dist/view/terrain/state.d.ts +1 -1
  403. package/dist/view/terrain/state.js +1 -1
  404. package/dist/view/terrain/tessellation.d.ts +2 -2
  405. package/dist/view/terrain/tessellation.js +1 -1
  406. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  407. package/dist/view/ui/bounds.js +8 -12
  408. package/dist/view/ui/handle-test.js +2 -2
  409. package/dist/view/ui/handle-thinning.js +17 -17
  410. package/dist/view/ui/handles.js +21 -13
  411. package/dist/view/ui/helper.d.ts +1 -1
  412. package/dist/view/ui/helper.js +1 -1
  413. package/dist/view/ui/index.d.ts +1 -1
  414. package/dist/view/ui/selection-scope.js +4 -2
  415. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  416. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  417. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  418. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  419. package/dist/view/ui/selection-ui/index.js +1 -1
  420. package/dist/view/ui/selection-ui/renderer.js +15 -38
  421. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  422. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  423. package/dist/view/ui/selection-ui-drawer.js +63 -2
  424. package/dist/view/ui/tentative.js +1 -1
  425. package/dist/webgl/index.d.ts +65 -0
  426. package/dist/webgl/index.js +62 -0
  427. package/package.json +38 -15
  428. package/dist/api/api.d.ts +0 -1259
  429. package/dist/api/api.js +0 -86
  430. package/dist/api/context.d.ts +0 -173
  431. package/dist/api/display-api.js +0 -23
  432. package/dist/api/event-api.d.ts +0 -13
  433. package/dist/api/event-api.js +0 -17
  434. package/dist/api/extension-api.d.ts +0 -46
  435. package/dist/api/extension-api.js +0 -85
  436. package/dist/api/feature-api.d.ts +0 -11
  437. package/dist/api/feature-api.js +0 -101
  438. package/dist/api/geometry/apply.d.ts +0 -51
  439. package/dist/api/geometry/boolean.d.ts +0 -28
  440. package/dist/api/geometry/boolean.js +0 -65
  441. package/dist/api/geometry/types.d.ts +0 -31
  442. package/dist/api/geometry-operations.d.ts +0 -162
  443. package/dist/api/geometry-operations.js +0 -94
  444. package/dist/api/group-api.d.ts +0 -10
  445. package/dist/api/group-api.js +0 -78
  446. package/dist/api/import-export/constants.d.ts +0 -29
  447. package/dist/api/import-export/constants.js +0 -40
  448. package/dist/api/import-export/file-name.d.ts +0 -10
  449. package/dist/api/import-export/file-name.js +0 -20
  450. package/dist/api/import-export/geojson-export.d.ts +0 -19
  451. package/dist/api/import-export/image-import.d.ts +0 -12
  452. package/dist/api/import-export/image-import.js +0 -53
  453. package/dist/api/import-export/index.d.ts +0 -9
  454. package/dist/api/import-export/index.js +0 -107
  455. package/dist/api/import-export/native-format.d.ts +0 -15
  456. package/dist/api/import-export/style-validation.d.ts +0 -27
  457. package/dist/api/import-export/style-validation.js +0 -49
  458. package/dist/api/import-export/types.d.ts +0 -26
  459. package/dist/api/index.d.ts +0 -15
  460. package/dist/api/index.js +0 -3
  461. package/dist/api/input-api.d.ts +0 -158
  462. package/dist/api/input-api.js +0 -144
  463. package/dist/api/instance-api.d.ts +0 -38
  464. package/dist/api/instance-api.js +0 -136
  465. package/dist/api/layer-api.d.ts +0 -12
  466. package/dist/api/layer-api.js +0 -62
  467. package/dist/api/selection-api.d.ts +0 -7
  468. package/dist/api/selection-api.js +0 -78
  469. package/dist/api/snapping-api.d.ts +0 -125
  470. package/dist/api/snapping-api.js +0 -50
  471. package/dist/api/topology-api.d.ts +0 -30
  472. package/dist/api/topology-api.js +0 -16
  473. package/dist/api/tracing-api.d.ts +0 -31
  474. package/dist/api/tracing-api.js +0 -16
  475. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  476. package/dist/dispatcher/hit-test/index.js +0 -9
  477. package/dist/dispatcher/index.d.ts +0 -15
  478. package/dist/dispatcher/index.js +0 -3
  479. package/dist/display/columnar/index.d.ts +0 -12
  480. package/dist/display/columnar/index.js +0 -13
  481. package/dist/display/columnar/prepare.d.ts +0 -42
  482. package/dist/display/columnar/prepare.js +0 -116
  483. package/dist/display/index.d.ts +0 -13
  484. package/dist/display/types.js +0 -43
  485. package/dist/maplibre-gl-draw.d.ts +0 -47
  486. package/dist/modes/cursor.js +0 -72
  487. package/dist/modes/index.d.ts +0 -7
  488. package/dist/operations/index.d.ts +0 -9
  489. package/dist/operations/index.js +0 -3
  490. package/dist/plugins/index.d.ts +0 -10
  491. package/dist/plugins/mutation-hooks.d.ts +0 -28
  492. package/dist/plugins/mutation-hooks.js +0 -84
  493. package/dist/plugins/plugin-context.js +0 -367
  494. package/dist/plugins/plugin-manager.d.ts +0 -103
  495. package/dist/plugins/plugin-manager.js +0 -316
  496. package/dist/plugins/plugin.d.ts +0 -529
  497. package/dist/shared/config/index.d.ts +0 -17
  498. package/dist/shared/config/index.js +0 -8
  499. package/dist/shared/utils/index.d.ts +0 -15
  500. package/dist/shared/utils/index.js +0 -24
  501. package/dist/snapping/index.d.ts +0 -14
  502. package/dist/snapping/index.js +0 -4
  503. package/dist/store/change-merger.js +0 -102
  504. package/dist/store/event-bridge.js +0 -161
  505. package/dist/store/index.d.ts +0 -12
  506. package/dist/store/index.js +0 -4
  507. package/dist/view/index.d.ts +0 -47
  508. package/dist/view/index.js +0 -20
  509. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  510. /package/dist/api/{import-export/types.js → document.js} +0 -0
  511. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  512. /package/dist/{display/index.js → api/events.js} +0 -0
  513. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  514. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  515. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  516. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  517. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  518. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  519. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  520. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  521. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  522. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  523. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  524. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  525. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  526. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  527. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  528. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  529. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  532. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  533. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  534. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  535. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  536. /package/dist/{display → dataset}/chunk-set.js +0 -0
  537. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  538. /package/dist/{display → dataset}/manager.js +0 -0
  539. /package/dist/{display → dataset}/provider.js +0 -0
  540. /package/dist/{display → dataset}/selection.d.ts +0 -0
  541. /package/dist/{display → dataset}/selection.js +0 -0
@@ -42,31 +42,5 @@ export interface BufferOptions {
42
42
  * shrunk polygon vanishes. `null` when the operation is not defined for the input
43
43
  * @throws {@link GeometryError} when the boolean operation engine fails even after the
44
44
  * retry on the 1e-9 degree grid
45
- *
46
- * @example
47
- * ```ts
48
- * import { buffer } from '@sakuzu/maplibre-gl-draw/geometry';
49
- *
50
- * // The area within 100 m of a line
51
- * const corridor = buffer(
52
- * { type: 'LineString', coordinates: [[139.76, 35.68], [139.77, 35.69]] },
53
- * 100,
54
- * { segments: 32 },
55
- * );
56
- *
57
- * // Shrink a polygon by 50 m
58
- * const shrunk = buffer(
59
- * {
60
- * type: 'Polygon',
61
- * coordinates: [[[139.76, 35.68], [139.77, 35.68], [139.77, 35.69], [139.76, 35.68]]],
62
- * },
63
- * -50,
64
- * );
65
- * if (shrunk === null) {
66
- * // Not defined for the input
67
- * } else if (shrunk.length === 0) {
68
- * // The whole area vanished
69
- * }
70
- * ```
71
45
  */
72
46
  export declare function buffer(geometry: GeometryInput, meters: number, options?: BufferOptions): MultiPolygonCoordinates | null;
@@ -161,32 +161,6 @@ function isAreaGeometry(geometry) {
161
161
  * shrunk polygon vanishes. `null` when the operation is not defined for the input
162
162
  * @throws {@link GeometryError} when the boolean operation engine fails even after the
163
163
  * retry on the 1e-9 degree grid
164
- *
165
- * @example
166
- * ```ts
167
- * import { buffer } from '@sakuzu/maplibre-gl-draw/geometry';
168
- *
169
- * // The area within 100 m of a line
170
- * const corridor = buffer(
171
- * { type: 'LineString', coordinates: [[139.76, 35.68], [139.77, 35.69]] },
172
- * 100,
173
- * { segments: 32 },
174
- * );
175
- *
176
- * // Shrink a polygon by 50 m
177
- * const shrunk = buffer(
178
- * {
179
- * type: 'Polygon',
180
- * coordinates: [[[139.76, 35.68], [139.77, 35.68], [139.77, 35.69], [139.76, 35.68]]],
181
- * },
182
- * -50,
183
- * );
184
- * if (shrunk === null) {
185
- * // Not defined for the input
186
- * } else if (shrunk.length === 0) {
187
- * // The whole area vanished
188
- * }
189
- * ```
190
164
  */
191
165
  export function buffer(geometry, meters, options) {
192
166
  if (!Number.isFinite(meters)) {
@@ -26,15 +26,6 @@ export declare function normalizeCircleSegments(segments: number | undefined, fa
26
26
  * @returns The ring, `segments + 1` positions `[lng, lat]` with the first repeated at the
27
27
  * end. An empty array for a center that is not finite and for a radius that is negative
28
28
  * or not finite
29
- *
30
- * @example
31
- * ```ts
32
- * import { generateCirclePolygon } from '@sakuzu/maplibre-gl-draw/geometry';
33
- *
34
- * const ring = generateCirclePolygon([139.767, 35.681], 500, 32);
35
- * ring.length; // 33
36
- * const polygon = [ring]; // Polygon coordinates
37
- * ```
38
29
  */
39
30
  export declare function generateCirclePolygon(center: Coordinate, radiusMeters: number, segments?: number): Coordinate[];
40
31
  /**
@@ -48,15 +48,6 @@ export function normalizeCircleSegments(segments, fallback = DEFAULT_CIRCLE_SEGM
48
48
  * @returns The ring, `segments + 1` positions `[lng, lat]` with the first repeated at the
49
49
  * end. An empty array for a center that is not finite and for a radius that is negative
50
50
  * or not finite
51
- *
52
- * @example
53
- * ```ts
54
- * import { generateCirclePolygon } from '@sakuzu/maplibre-gl-draw/geometry';
55
- *
56
- * const ring = generateCirclePolygon([139.767, 35.681], 500, 32);
57
- * ring.length; // 33
58
- * const polygon = [ring]; // Polygon coordinates
59
- * ```
60
51
  */
61
52
  export function generateCirclePolygon(center, radiusMeters, segments = DEFAULT_CIRCLE_SEGMENTS) {
62
53
  if (!isFiniteCoordinate(center) || !Number.isFinite(radiusMeters) || radiusMeters < 0) {
@@ -18,15 +18,6 @@ import type { AreaCoordinates, Coordinate, MultiPolygonCoordinates, Ring } from
18
18
  * @param coordinates Polygon or MultiPolygon coordinates
19
19
  * @returns `true` for MultiPolygon coordinates (a type guard). `false` for Polygon
20
20
  * coordinates and for coordinates with no position
21
- *
22
- * @example
23
- * ```ts
24
- * import { isMultiPolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
25
- *
26
- * const ring: [number, number][] = [[0, 0], [1, 0], [1, 1], [0, 0]];
27
- * isMultiPolygonCoordinates([ring]); // false (Polygon)
28
- * isMultiPolygonCoordinates([[ring]]); // true (MultiPolygon)
29
- * ```
30
21
  */
31
22
  export declare function isMultiPolygonCoordinates(coordinates: AreaCoordinates): coordinates is MultiPolygonCoordinates;
32
23
  /**
@@ -75,13 +66,6 @@ export declare function isRingClosed(ring: Ring): boolean;
75
66
  *
76
67
  * @param ring A coordinate sequence
77
68
  * @returns A new closed array. The input itself when it is already closed or empty
78
- *
79
- * @example
80
- * ```ts
81
- * import { closeRing } from '@sakuzu/maplibre-gl-draw/geometry';
82
- *
83
- * closeRing([[0, 0], [1, 0], [1, 1]]); // [[0, 0], [1, 0], [1, 1], [0, 0]]
84
- * ```
85
69
  */
86
70
  export declare function closeRing(ring: Ring): Ring;
87
71
  /**
@@ -13,15 +13,6 @@
13
13
  * @param coordinates Polygon or MultiPolygon coordinates
14
14
  * @returns `true` for MultiPolygon coordinates (a type guard). `false` for Polygon
15
15
  * coordinates and for coordinates with no position
16
- *
17
- * @example
18
- * ```ts
19
- * import { isMultiPolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
20
- *
21
- * const ring: [number, number][] = [[0, 0], [1, 0], [1, 1], [0, 0]];
22
- * isMultiPolygonCoordinates([ring]); // false (Polygon)
23
- * isMultiPolygonCoordinates([[ring]]); // true (MultiPolygon)
24
- * ```
25
16
  */
26
17
  export function isMultiPolygonCoordinates(coordinates) {
27
18
  for (const element of coordinates) {
@@ -112,13 +103,6 @@ export function isRingClosed(ring) {
112
103
  *
113
104
  * @param ring A coordinate sequence
114
105
  * @returns A new closed array. The input itself when it is already closed or empty
115
- *
116
- * @example
117
- * ```ts
118
- * import { closeRing } from '@sakuzu/maplibre-gl-draw/geometry';
119
- *
120
- * closeRing([[0, 0], [1, 0], [1, 1]]); // [[0, 0], [1, 0], [1, 1], [0, 0]]
121
- * ```
122
106
  */
123
107
  export function closeRing(ring) {
124
108
  if (ring.length === 0 || isRingClosed(ring)) {
@@ -15,14 +15,6 @@ import type { Coordinate } from './types.js';
15
15
  * @param coord1 A position `[lng, lat]` in degrees
16
16
  * @param coord2 A position `[lng, lat]` in degrees
17
17
  * @returns The distance in meters. 0 for identical positions
18
- *
19
- * @example
20
- * ```ts
21
- * import { haversineDistanceMeters } from '@sakuzu/maplibre-gl-draw/geometry';
22
- *
23
- * // Tokyo Station to Osaka Station
24
- * haversineDistanceMeters([139.767, 35.681], [135.495, 34.702]); // about 403,139 m
25
- * ```
26
18
  */
27
19
  export declare function haversineDistanceMeters(coord1: Coordinate, coord2: Coordinate): number;
28
20
  /**
@@ -35,14 +27,6 @@ export declare function haversineDistanceMeters(coord1: Coordinate, coord2: Coor
35
27
  * @param to The end `[lng, lat]` in degrees
36
28
  * @returns The bearing in degrees, clockwise with north as 0, in the range [0, 360). 0 when
37
29
  * the two positions are identical
38
- *
39
- * @example
40
- * ```ts
41
- * import { initialBearingDegrees } from '@sakuzu/maplibre-gl-draw/geometry';
42
- *
43
- * initialBearingDegrees([0, 0], [1, 0]); // 90 (due east)
44
- * initialBearingDegrees([0, 0], [0, 1]); // 0 (due north)
45
- * ```
46
30
  */
47
31
  export declare function initialBearingDegrees(from: Coordinate, to: Coordinate): number;
48
32
  /**
@@ -67,13 +51,5 @@ export declare function initialBearingDegrees(from: Coordinate, to: Coordinate):
67
51
  * goes the opposite way
68
52
  * @param bearingDegrees The initial bearing in degrees, clockwise with north as 0
69
53
  * @returns The position reached, `[lng, lat]` in degrees
70
- *
71
- * @example
72
- * ```ts
73
- * import { destinationPoint } from '@sakuzu/maplibre-gl-draw/geometry';
74
- *
75
- * // 1 km due east of Tokyo Station
76
- * destinationPoint([139.767, 35.681], 1000, 90); // [139.77807..., 35.68099...]
77
- * ```
78
54
  */
79
55
  export declare function destinationPoint(origin: Coordinate, distanceMeters: number, bearingDegrees: number): Coordinate;
@@ -11,14 +11,6 @@ import { EARTH_RADIUS_METERS, toDegrees, toRadians } from './units.js';
11
11
  * @param coord1 A position `[lng, lat]` in degrees
12
12
  * @param coord2 A position `[lng, lat]` in degrees
13
13
  * @returns The distance in meters. 0 for identical positions
14
- *
15
- * @example
16
- * ```ts
17
- * import { haversineDistanceMeters } from '@sakuzu/maplibre-gl-draw/geometry';
18
- *
19
- * // Tokyo Station to Osaka Station
20
- * haversineDistanceMeters([139.767, 35.681], [135.495, 34.702]); // about 403,139 m
21
- * ```
22
14
  */
23
15
  export function haversineDistanceMeters(coord1, coord2) {
24
16
  const R = EARTH_RADIUS_METERS;
@@ -41,14 +33,6 @@ export function haversineDistanceMeters(coord1, coord2) {
41
33
  * @param to The end `[lng, lat]` in degrees
42
34
  * @returns The bearing in degrees, clockwise with north as 0, in the range [0, 360). 0 when
43
35
  * the two positions are identical
44
- *
45
- * @example
46
- * ```ts
47
- * import { initialBearingDegrees } from '@sakuzu/maplibre-gl-draw/geometry';
48
- *
49
- * initialBearingDegrees([0, 0], [1, 0]); // 90 (due east)
50
- * initialBearingDegrees([0, 0], [0, 1]); // 0 (due north)
51
- * ```
52
36
  */
53
37
  export function initialBearingDegrees(from, to) {
54
38
  const [lng1, lat1] = from;
@@ -86,14 +70,6 @@ export function initialBearingDegrees(from, to) {
86
70
  * goes the opposite way
87
71
  * @param bearingDegrees The initial bearing in degrees, clockwise with north as 0
88
72
  * @returns The position reached, `[lng, lat]` in degrees
89
- *
90
- * @example
91
- * ```ts
92
- * import { destinationPoint } from '@sakuzu/maplibre-gl-draw/geometry';
93
- *
94
- * // 1 km due east of Tokyo Station
95
- * destinationPoint([139.767, 35.681], 1000, 90); // [139.77807..., 35.68099...]
96
- * ```
97
73
  */
98
74
  export function destinationPoint(origin, distanceMeters, bearingDegrees) {
99
75
  const [lng, lat] = origin;
@@ -4,47 +4,32 @@
4
4
  * The boolean operations run on polygon-clipping, which reports a failure by throwing an
5
5
  * Error whose message is its own internal wording (a sweep-line event, a segment id). Such
6
6
  * a failure leaves the module as a GeometryError instead: the reason is a stable code the
7
- * caller can branch on, and the original error is kept as `cause` for diagnosis.
7
+ * caller can branch on, and the original error is kept as `cause` for diagnosis. An input
8
+ * whose shape a function cannot take leaves as a GeometryError too.
8
9
  */
9
10
  /**
10
- * Why a geometry operation failed
11
- *
12
- * - `invalid-input`: the input is not a polygon the operation can take (a degenerate
13
- * segment, a malformed ring)
14
- * - `unclosed-ring`: the output ring could not be closed, typically because edges nearly
15
- * coincide within floating-point precision (still failing after the retry on the grid)
16
- * - `too-complex`: the operation gave up on an input too large or tangled for it
17
- * - `internal`: any other failure inside the boolean operation engine
18
- */
19
- export type GeometryErrorCode = 'invalid-input' | 'unclosed-ring' | 'too-complex' | 'internal';
20
- /**
21
- * The boolean operation that failed.
22
- *
23
- * It can differ from the function called: {@link normalizeArea} and {@link unionAll} run
24
- * `union`, and {@link buffer} runs `union` and `difference`.
11
+ * Why a geometry function failed: `invalid-input` for an input whose shape the function cannot
12
+ * take, `engine-failure` for a boolean operation that could not compute a result.
25
13
  */
26
- export type GeometryOperation = 'union' | 'difference' | 'intersection';
14
+ export type GeometryErrorCode = 'invalid-input' | 'engine-failure';
27
15
  /**
28
- * The error a geometry operation throws when the boolean operation engine cannot compute a
29
- * result.
16
+ * The error a geometry function throws for an input it cannot take or when its boolean
17
+ * operation cannot compute a result.
30
18
  *
31
- * Every function that runs a boolean operation can throw it: the boolean operations,
32
- * {@link splitArea}, {@link buffer}, the polygon predicates and {@link sphericalArea}. A
33
- * failure is first retried once with the coordinates rounded to a 1e-9 degree grid (about
34
- * 0.1 mm); this error is thrown only when the retry fails too. Branch on `code`, which is
35
- * stable across versions of the engine; the message is `<operation>: <reason>` in English
36
- * and is meant for logs.
19
+ * A failure of a boolean operation is first retried once with the coordinates rounded to a
20
+ * 1e-9 degree grid (about 0.1 mm); the error is thrown only when the retry fails too. Branch
21
+ * on `code`; the message is `<operation>: <reason>` in English and is meant for logs.
37
22
  *
38
23
  * @example
39
24
  * ```ts
40
- * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
25
+ * import type { Polygon } from 'geojson';
41
26
  * import { GeometryError, union } from '@sakuzu/maplibre-gl-draw/geometry';
42
27
  *
43
- * function tryMerge(a: PolygonCoordinates, b: PolygonCoordinates) {
28
+ * function tryMerge(a: Polygon, b: Polygon) {
44
29
  * try {
45
- * return union(a, b);
30
+ * return union([a, b]);
46
31
  * } catch (error) {
47
- * if (error instanceof GeometryError && error.code === 'unclosed-ring') {
32
+ * if (error instanceof GeometryError && error.code === 'engine-failure') {
48
33
  * // Keep the inputs as they are and tell the user the merge failed
49
34
  * return null;
50
35
  * }
@@ -54,21 +39,21 @@ export type GeometryOperation = 'union' | 'difference' | 'intersection';
54
39
  * ```
55
40
  */
56
41
  export declare class GeometryError extends Error {
57
- /** Why the operation failed */
42
+ /** Why the function failed */
58
43
  readonly code: GeometryErrorCode;
59
- /** The boolean operation that failed */
60
- readonly operation: GeometryOperation;
61
- /** The error thrown by the boolean operation engine, kept for diagnosis */
44
+ /** The name of the function that failed, such as `union` or `buffer` */
45
+ readonly operation: string;
46
+ /** The error that caused this one, kept for diagnosis */
62
47
  readonly cause: unknown;
63
48
  /**
64
49
  * Creates the error. The library creates it; a caller only needs to catch it.
65
50
  *
66
- * @param code Why the operation failed
67
- * @param operation The boolean operation that failed
51
+ * @param code Why the function failed
52
+ * @param operation The name of the function that failed
68
53
  * @param message The message, `<operation>: <reason>`
69
54
  * @param options The original error as `cause`
70
55
  */
71
- constructor(code: GeometryErrorCode, operation: GeometryOperation, message: string, options?: {
56
+ constructor(code: GeometryErrorCode, operation: string, message: string, options?: {
72
57
  cause?: unknown;
73
58
  });
74
59
  }
@@ -1,26 +1,23 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  /**
4
- * The error a geometry operation throws when the boolean operation engine cannot compute a
5
- * result.
4
+ * The error a geometry function throws for an input it cannot take or when its boolean
5
+ * operation cannot compute a result.
6
6
  *
7
- * Every function that runs a boolean operation can throw it: the boolean operations,
8
- * {@link splitArea}, {@link buffer}, the polygon predicates and {@link sphericalArea}. A
9
- * failure is first retried once with the coordinates rounded to a 1e-9 degree grid (about
10
- * 0.1 mm); this error is thrown only when the retry fails too. Branch on `code`, which is
11
- * stable across versions of the engine; the message is `<operation>: <reason>` in English
12
- * and is meant for logs.
7
+ * A failure of a boolean operation is first retried once with the coordinates rounded to a
8
+ * 1e-9 degree grid (about 0.1 mm); the error is thrown only when the retry fails too. Branch
9
+ * on `code`; the message is `<operation>: <reason>` in English and is meant for logs.
13
10
  *
14
11
  * @example
15
12
  * ```ts
16
- * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
13
+ * import type { Polygon } from 'geojson';
17
14
  * import { GeometryError, union } from '@sakuzu/maplibre-gl-draw/geometry';
18
15
  *
19
- * function tryMerge(a: PolygonCoordinates, b: PolygonCoordinates) {
16
+ * function tryMerge(a: Polygon, b: Polygon) {
20
17
  * try {
21
- * return union(a, b);
18
+ * return union([a, b]);
22
19
  * } catch (error) {
23
- * if (error instanceof GeometryError && error.code === 'unclosed-ring') {
20
+ * if (error instanceof GeometryError && error.code === 'engine-failure') {
24
21
  * // Keep the inputs as they are and tell the user the merge failed
25
22
  * return null;
26
23
  * }
@@ -33,28 +30,28 @@ export class GeometryError extends Error {
33
30
  /**
34
31
  * Creates the error. The library creates it; a caller only needs to catch it.
35
32
  *
36
- * @param code Why the operation failed
37
- * @param operation The boolean operation that failed
33
+ * @param code Why the function failed
34
+ * @param operation The name of the function that failed
38
35
  * @param message The message, `<operation>: <reason>`
39
36
  * @param options The original error as `cause`
40
37
  */
41
38
  constructor(code, operation, message, options) {
42
39
  super(message);
43
- /** Why the operation failed */
40
+ /** Why the function failed */
44
41
  Object.defineProperty(this, "code", {
45
42
  enumerable: true,
46
43
  configurable: true,
47
44
  writable: true,
48
45
  value: void 0
49
46
  });
50
- /** The boolean operation that failed */
47
+ /** The name of the function that failed, such as `union` or `buffer` */
51
48
  Object.defineProperty(this, "operation", {
52
49
  enumerable: true,
53
50
  configurable: true,
54
51
  writable: true,
55
52
  value: void 0
56
53
  });
57
- /** The error thrown by the boolean operation engine, kept for diagnosis */
54
+ /** The error that caused this one, kept for diagnosis */
58
55
  Object.defineProperty(this, "cause", {
59
56
  enumerable: true,
60
57
  configurable: true,
@@ -70,7 +67,8 @@ export class GeometryError extends Error {
70
67
  /**
71
68
  * Classifies an error thrown by polygon-clipping by its message
72
69
  *
73
- * The messages are those of polygon-clipping 0.15; one that is not recognized is `internal`.
70
+ * The messages are those of polygon-clipping 0.15. An input it rejects is `invalid-input`;
71
+ * everything else is `engine-failure`.
74
72
  */
75
73
  function classify(error) {
76
74
  const message = error instanceof Error ? error.message : String(error);
@@ -78,20 +76,12 @@ function classify(error) {
78
76
  message.startsWith('Tried to create degenerate segment')) {
79
77
  return 'invalid-input';
80
78
  }
81
- if (message.startsWith('Unable to complete output ring')) {
82
- return 'unclosed-ring';
83
- }
84
- if (message.startsWith('Infinite loop')) {
85
- return 'too-complex';
86
- }
87
- return 'internal';
79
+ return 'engine-failure';
88
80
  }
89
- /** The message of each reason */
81
+ /** The message of each reason of a boolean operation */
90
82
  const MESSAGES = {
91
83
  'invalid-input': 'the input is not a valid polygon',
92
- 'unclosed-ring': 'the output ring could not be closed',
93
- 'too-complex': 'the input is too complex',
94
- internal: 'the boolean operation failed',
84
+ 'engine-failure': 'the boolean operation failed',
95
85
  };
96
86
  /**
97
87
  * Wraps an error thrown by polygon-clipping into a GeometryError
@@ -102,3 +92,33 @@ export function toGeometryError(error, operation) {
102
92
  const code = classify(error);
103
93
  return new GeometryError(code, operation, `${operation}: ${MESSAGES[code]}`, { cause: error });
104
94
  }
95
+ /**
96
+ * Creates the error for an input whose shape a function cannot take
97
+ *
98
+ * @internal
99
+ */
100
+ export function invalidInput(operation, reason) {
101
+ return new GeometryError('invalid-input', operation, `${operation}: ${reason}`);
102
+ }
103
+ /**
104
+ * Runs a computation and renames the function of a GeometryError it throws
105
+ *
106
+ * The boolean operations name themselves (`union`, `difference`, `intersection`); a public
107
+ * function that runs them reports its own name instead, keeping the reason and the cause.
108
+ *
109
+ * @internal
110
+ */
111
+ export function withOperation(operation, run) {
112
+ try {
113
+ return run();
114
+ }
115
+ catch (error) {
116
+ if (error instanceof GeometryError && error.operation !== operation) {
117
+ const reason = error.message.slice(error.message.indexOf(': ') + 2);
118
+ throw new GeometryError(error.code, operation, `${operation}: ${reason}`, {
119
+ cause: error.cause,
120
+ });
121
+ }
122
+ throw error;
123
+ }
124
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * GeoJSON input and output of the public functions
3
+ *
4
+ * The public functions take GeoJSON geometries, or anything that carries one in a `geometry`
5
+ * field (GeoJSON features, the features of the drawing), and return GeoJSON geometries;
6
+ * the computations underneath work on coordinate arrays. These helpers take the coordinates
7
+ * out of an input, reject an input whose shape a function cannot take with a GeometryError
8
+ * (`invalid-input`), and wrap the computed coordinates back into a geometry.
9
+ */
10
+ import type { Geometry, LineString, MultiLineString, MultiPolygon, Point, Polygon, Position } from 'geojson';
11
+ import type { AreaCoordinates, Coordinate, MultiPolygonCoordinates } from './types.js';
12
+ /** A point as taken by the public functions */
13
+ export type PointInput = Position | Point;
14
+ /** A polygon as taken by the public functions */
15
+ export type AreaInput = Polygon | MultiPolygon | {
16
+ readonly geometry: Geometry;
17
+ };
18
+ /** A line as taken by the public functions */
19
+ export type LineInput = LineString | MultiLineString | {
20
+ readonly geometry: Geometry;
21
+ };
22
+ /**
23
+ * Returns the geometry of a geometry, or of anything that carries one in a `geometry` field
24
+ * (a GeoJSON feature, a feature of the drawing)
25
+ *
26
+ * A value whose `geometry` member is a geometry is read as a feature first, whatever its own
27
+ * `type` says: a feature of the drawing names its feature type there (`'Polygon'`,
28
+ * `'Circle'`, `'Freehand'` and so on), which is not the type of a geometry it is.
29
+ *
30
+ * @throws GeometryError (`invalid-input`) for a value that is neither, and for a feature
31
+ * without a geometry
32
+ */
33
+ export declare function geometryOf(input: Geometry | {
34
+ readonly geometry: Geometry;
35
+ }, operation: string): Geometry;
36
+ /**
37
+ * Returns the coordinates of a point given as a position or a Point
38
+ *
39
+ * @throws GeometryError (`invalid-input`) for anything else
40
+ */
41
+ export declare function positionOf(input: PointInput, operation: string): Coordinate;
42
+ /**
43
+ * Returns the geometry of a Polygon or a MultiPolygon, given as it is or in a feature
44
+ *
45
+ * @throws GeometryError (`invalid-input`) for any other geometry
46
+ */
47
+ export declare function areaGeometryOf(input: AreaInput, operation: string): Polygon | MultiPolygon;
48
+ /**
49
+ * Returns the coordinates of a Polygon or a MultiPolygon, given as it is or in a feature
50
+ *
51
+ * @throws GeometryError (`invalid-input`) for any other geometry
52
+ */
53
+ export declare function areaOf(input: AreaInput, operation: string): AreaCoordinates;
54
+ /**
55
+ * Returns the coordinates of each polygon in an array
56
+ *
57
+ * @throws GeometryError (`invalid-input`) for a value that is not an array, and for an
58
+ * element that is not a Polygon or a MultiPolygon
59
+ */
60
+ export declare function areasOf(inputs: readonly AreaInput[], operation: string): AreaCoordinates[];
61
+ /**
62
+ * Returns the coordinates of a LineString, given as it is or in a feature
63
+ *
64
+ * @throws GeometryError (`invalid-input`) for any other geometry
65
+ */
66
+ export declare function lineOf(input: LineString | {
67
+ readonly geometry: Geometry;
68
+ }, operation: string): Coordinate[];
69
+ /**
70
+ * Returns the lines of a LineString or a MultiLineString, given as it is or in a feature
71
+ *
72
+ * @throws GeometryError (`invalid-input`) for any other geometry
73
+ */
74
+ export declare function linesOf(input: LineInput, operation: string): Coordinate[][];
75
+ /** Every position of a geometry, the members of a collection included */
76
+ export declare function positionsOf(geometry: Geometry): Coordinate[];
77
+ /** A copy of a position, as returned by the public functions */
78
+ export declare function toPosition(coordinate: Coordinate): Position;
79
+ /** A Point geometry at a position */
80
+ export declare function toPoint(coordinate: Coordinate): Point;
81
+ /**
82
+ * Wraps MultiPolygon coordinates into a geometry: a Polygon for one part, a MultiPolygon for
83
+ * several, and null for none
84
+ */
85
+ export declare function toAreaGeometry(coordinates: MultiPolygonCoordinates): Polygon | MultiPolygon | null;