@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.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 (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -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,81 @@
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
+ * @throws GeometryError (`invalid-input`) for a value that is neither, and for a feature
27
+ * without a geometry
28
+ */
29
+ export declare function geometryOf(input: Geometry | {
30
+ readonly geometry: Geometry;
31
+ }, operation: string): Geometry;
32
+ /**
33
+ * Returns the coordinates of a point given as a position or a Point
34
+ *
35
+ * @throws GeometryError (`invalid-input`) for anything else
36
+ */
37
+ export declare function positionOf(input: PointInput, operation: string): Coordinate;
38
+ /**
39
+ * Returns the geometry of a Polygon or a MultiPolygon, given as it is or in a feature
40
+ *
41
+ * @throws GeometryError (`invalid-input`) for any other geometry
42
+ */
43
+ export declare function areaGeometryOf(input: AreaInput, operation: string): Polygon | MultiPolygon;
44
+ /**
45
+ * Returns the coordinates of a Polygon or a MultiPolygon, given as it is or in a feature
46
+ *
47
+ * @throws GeometryError (`invalid-input`) for any other geometry
48
+ */
49
+ export declare function areaOf(input: AreaInput, operation: string): AreaCoordinates;
50
+ /**
51
+ * Returns the coordinates of each polygon in an array
52
+ *
53
+ * @throws GeometryError (`invalid-input`) for a value that is not an array, and for an
54
+ * element that is not a Polygon or a MultiPolygon
55
+ */
56
+ export declare function areasOf(inputs: readonly AreaInput[], operation: string): AreaCoordinates[];
57
+ /**
58
+ * Returns the coordinates of a LineString, given as it is or in a feature
59
+ *
60
+ * @throws GeometryError (`invalid-input`) for any other geometry
61
+ */
62
+ export declare function lineOf(input: LineString | {
63
+ readonly geometry: Geometry;
64
+ }, operation: string): Coordinate[];
65
+ /**
66
+ * Returns the lines of a LineString or a MultiLineString, given as it is or in a feature
67
+ *
68
+ * @throws GeometryError (`invalid-input`) for any other geometry
69
+ */
70
+ export declare function linesOf(input: LineInput, operation: string): Coordinate[][];
71
+ /** Every position of a geometry, the members of a collection included */
72
+ export declare function positionsOf(geometry: Geometry): Coordinate[];
73
+ /** A copy of a position, as returned by the public functions */
74
+ export declare function toPosition(coordinate: Coordinate): Position;
75
+ /** A Point geometry at a position */
76
+ export declare function toPoint(coordinate: Coordinate): Point;
77
+ /**
78
+ * Wraps MultiPolygon coordinates into a geometry: a Polygon for one part, a MultiPolygon for
79
+ * several, and null for none
80
+ */
81
+ export declare function toAreaGeometry(coordinates: MultiPolygonCoordinates): Polygon | MultiPolygon | null;
@@ -0,0 +1,164 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { invalidInput } from './errors.js';
4
+ /** The geometry types that carry `coordinates` */
5
+ const COORDINATE_TYPES = new Set([
6
+ 'Point',
7
+ 'MultiPoint',
8
+ 'LineString',
9
+ 'MultiLineString',
10
+ 'Polygon',
11
+ 'MultiPolygon',
12
+ ]);
13
+ function isObject(value) {
14
+ return typeof value === 'object' && value !== null;
15
+ }
16
+ /** Whether a value is an array whose first two elements are numbers */
17
+ function isPosition(value) {
18
+ return (Array.isArray(value) &&
19
+ value.length >= 2 &&
20
+ typeof value[0] === 'number' &&
21
+ typeof value[1] === 'number');
22
+ }
23
+ /**
24
+ * Returns the geometry of a geometry, or of anything that carries one in a `geometry` field
25
+ * (a GeoJSON feature, a feature of the drawing)
26
+ *
27
+ * @throws GeometryError (`invalid-input`) for a value that is neither, and for a feature
28
+ * without a geometry
29
+ */
30
+ export function geometryOf(input, operation) {
31
+ const value = input;
32
+ if (!isObject(value)) {
33
+ throw invalidInput(operation, 'the input is not a geometry or a feature');
34
+ }
35
+ if (!isGeometryType(value.type)) {
36
+ if (!('geometry' in value) && value.type !== 'Feature') {
37
+ throw invalidInput(operation, 'the input is not a geometry or a feature');
38
+ }
39
+ const geometry = value.geometry;
40
+ if (!isObject(geometry) || !isGeometryType(geometry.type)) {
41
+ throw invalidInput(operation, 'the feature has no geometry');
42
+ }
43
+ return geometryOf(geometry, operation);
44
+ }
45
+ if (value.type === 'GeometryCollection') {
46
+ if (!Array.isArray(value.geometries)) {
47
+ throw invalidInput(operation, 'the geometry collection has no geometries');
48
+ }
49
+ }
50
+ else if (!Array.isArray(value.coordinates)) {
51
+ throw invalidInput(operation, 'the input is not a geometry or a feature');
52
+ }
53
+ return value;
54
+ }
55
+ /** Whether a value names a GeoJSON geometry type */
56
+ function isGeometryType(type) {
57
+ return typeof type === 'string' && (COORDINATE_TYPES.has(type) || type === 'GeometryCollection');
58
+ }
59
+ /**
60
+ * Returns the coordinates of a point given as a position or a Point
61
+ *
62
+ * @throws GeometryError (`invalid-input`) for anything else
63
+ */
64
+ export function positionOf(input, operation) {
65
+ if (isPosition(input))
66
+ return input;
67
+ if (isObject(input) && input.type === 'Point' && isPosition(input.coordinates)) {
68
+ return input.coordinates;
69
+ }
70
+ throw invalidInput(operation, 'the input is not a position or a Point');
71
+ }
72
+ /**
73
+ * Returns the geometry of a Polygon or a MultiPolygon, given as it is or in a feature
74
+ *
75
+ * @throws GeometryError (`invalid-input`) for any other geometry
76
+ */
77
+ export function areaGeometryOf(input, operation) {
78
+ const geometry = geometryOf(input, operation);
79
+ if (geometry.type !== 'Polygon' && geometry.type !== 'MultiPolygon') {
80
+ throw invalidInput(operation, 'the input is not a Polygon or a MultiPolygon');
81
+ }
82
+ return geometry;
83
+ }
84
+ /**
85
+ * Returns the coordinates of a Polygon or a MultiPolygon, given as it is or in a feature
86
+ *
87
+ * @throws GeometryError (`invalid-input`) for any other geometry
88
+ */
89
+ export function areaOf(input, operation) {
90
+ return areaGeometryOf(input, operation).coordinates;
91
+ }
92
+ /**
93
+ * Returns the coordinates of each polygon in an array
94
+ *
95
+ * @throws GeometryError (`invalid-input`) for a value that is not an array, and for an
96
+ * element that is not a Polygon or a MultiPolygon
97
+ */
98
+ export function areasOf(inputs, operation) {
99
+ if (!Array.isArray(inputs)) {
100
+ throw invalidInput(operation, 'the input is not an array of polygons');
101
+ }
102
+ return inputs.map((input) => areaOf(input, operation));
103
+ }
104
+ /**
105
+ * Returns the coordinates of a LineString, given as it is or in a feature
106
+ *
107
+ * @throws GeometryError (`invalid-input`) for any other geometry
108
+ */
109
+ export function lineOf(input, operation) {
110
+ const geometry = geometryOf(input, operation);
111
+ if (geometry.type !== 'LineString') {
112
+ throw invalidInput(operation, 'the input is not a LineString');
113
+ }
114
+ return geometry.coordinates;
115
+ }
116
+ /**
117
+ * Returns the lines of a LineString or a MultiLineString, given as it is or in a feature
118
+ *
119
+ * @throws GeometryError (`invalid-input`) for any other geometry
120
+ */
121
+ export function linesOf(input, operation) {
122
+ const geometry = geometryOf(input, operation);
123
+ if (geometry.type === 'LineString')
124
+ return [geometry.coordinates];
125
+ if (geometry.type === 'MultiLineString')
126
+ return geometry.coordinates;
127
+ throw invalidInput(operation, 'the input is not a LineString or a MultiLineString');
128
+ }
129
+ /** Every position of a geometry, the members of a collection included */
130
+ export function positionsOf(geometry) {
131
+ switch (geometry.type) {
132
+ case 'Point':
133
+ return [geometry.coordinates];
134
+ case 'MultiPoint':
135
+ case 'LineString':
136
+ return geometry.coordinates;
137
+ case 'MultiLineString':
138
+ case 'Polygon':
139
+ return geometry.coordinates.flat();
140
+ case 'MultiPolygon':
141
+ return geometry.coordinates.flat(2);
142
+ case 'GeometryCollection':
143
+ return geometry.geometries.flatMap(positionsOf);
144
+ }
145
+ }
146
+ /** A copy of a position, as returned by the public functions */
147
+ export function toPosition(coordinate) {
148
+ return [coordinate[0], coordinate[1]];
149
+ }
150
+ /** A Point geometry at a position */
151
+ export function toPoint(coordinate) {
152
+ return { type: 'Point', coordinates: toPosition(coordinate) };
153
+ }
154
+ /**
155
+ * Wraps MultiPolygon coordinates into a geometry: a Polygon for one part, a MultiPolygon for
156
+ * several, and null for none
157
+ */
158
+ export function toAreaGeometry(coordinates) {
159
+ if (coordinates.length === 0)
160
+ return null;
161
+ if (coordinates.length === 1)
162
+ return { type: 'Polygon', coordinates: coordinates[0] };
163
+ return { type: 'MultiPolygon', coordinates };
164
+ }
@@ -1,28 +1,43 @@
1
1
  /**
2
- * Geometry module
2
+ * Geometry calculations that need no map.
3
3
  *
4
- * A collection of pure functions independent of the rendering and editing machinery.
5
- * It does not depend on maplibre, the DOM, wasm, the Store or events, and its only
6
- * runtime dependency is polygon-clipping. The same input produces the same output
7
- * regardless of the environment, and determinism is guaranteed by the version of the
8
- * package.
4
+ * Measure lengths and areas, build circles and buffers, combine polygons, test whether a
5
+ * point lies in a polygon, and tidy shapes. They also work in code that does not use the
6
+ * drawing engine (workers, servers, tests).
9
7
  *
10
- * As a limitation, crossing the ±180 degree meridian and the vicinity of the poles are
11
- * out of scope.
8
+ * ```ts
9
+ * import { area, buffer, union } from '@sakuzu/maplibre-gl-draw/geometry';
10
+ *
11
+ * const a = draw.features.get('park');
12
+ * const b = draw.features.get('lake');
13
+ * const merged = union([a, b]); // Polygon | MultiPolygon | null
14
+ * const zone = buffer(merged, 300); // the area within 300 m
15
+ * console.log(area(zone) / 1e6, 'km²');
16
+ * ```
17
+ *
18
+ * The functions take GeoJSON geometries, or anything with a `geometry` field whose geometry
19
+ * they use (GeoJSON features and the features of the drawing), and return GeoJSON geometries. Lengths, distances, radii and tolerances are in meters, areas in
20
+ * square meters, and bearings and coordinates in degrees. An input whose shape a function
21
+ * cannot take throws a {@link GeometryError}; a computation whose result is empty returns null.
22
+ * Crossing the ±180 degree meridian and the vicinity of the poles are out of scope.
23
+ *
24
+ * Read next: the guide
25
+ * [snapping and geometry](https://sakuzu.github.io/maplibre-gl-draw/guides/snapping-geometry),
26
+ * which also shows the operations that change the drawing (`draw.features.union` and the
27
+ * rest). The functions used most are {@link area}, {@link length}, {@link buffer} and
28
+ * {@link union}.
29
+ *
30
+ * @module geometry
12
31
  */
13
- export { getPointAtAngle } from './angle.js';
14
- export { bboxContains, bboxIntersects, boundingBox, coordinatesBBox } from './bbox.js';
15
- export { clip, difference, differenceAll, intersection, intersectionAll, normalizeArea, union, unionAll, } from './boolean.js';
16
- export type { BufferOptions } from './buffer.js';
17
- export { buffer, DEFAULT_BUFFER_SEGMENTS } from './buffer.js';
18
- export { generateCirclePolygon } from './circle.js';
19
- export { closeRing, flattenAreaCoordinates, isMultiPolygonCoordinates, isRingClosed, toMultiPolygonCoordinates, } from './coords.js';
20
- export { destinationPoint, haversineDistanceMeters, initialBearingDegrees } from './distance.js';
21
- export type { GeometryErrorCode, GeometryOperation } from './errors.js';
32
+ export { along, area, bearing, centroid, destination, distance, length, midpoint, nearestPointOnLine, perimeter, pointOnSurface, } from './public-measure.js';
33
+ export { buffer, circle } from './public-create.js';
34
+ export { difference, intersection, split, union } from './public-combine.js';
35
+ export { bboxContains, bboxIntersects } from './bbox.js';
36
+ export { contains, overlaps, pointInPolygon } from './public-predicates.js';
37
+ export { makeValid, rewind, simplify } from './public-repair.js';
38
+ export { bbox } from './public-bounds.js';
39
+ export { metersToDegrees } from './units.js';
40
+ export type { GeometryErrorCode } from './errors.js';
22
41
  export { GeometryError } from './errors.js';
23
- export { centroid, geodesicLength, pointOnSurface, sphericalArea } from './measure.js';
24
- export { contains, intersects, pointInPolygon, within } from './predicates.js';
25
- export { isRingClockwise, normalizeMultiPolygonOrientation, normalizePolygonOrientation, normalizeRingOrientation, signedRingArea, simplify, } from './simplify.js';
26
- export { segmentIntersection, splitArea } from './split.js';
27
- export type { AreaCoordinates, BBox, Coordinate, GeometryInput, LineStringGeometry, MultiLineStringGeometry, MultiPointGeometry, MultiPolygonCoordinates, MultiPolygonGeometry, PointGeometry, PolygonCoordinates, PolygonGeometry, Ring, } from './types.js';
28
- export { EARTH_RADIUS_METERS, toDegrees, toRadians } from './units.js';
42
+ export type { BBox } from './types.js';
43
+ export { EARTH_RADIUS_METERS } from './units.js';