@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
@@ -0,0 +1,64 @@
1
+ import type { Store } from '../../store/store.js';
2
+ import type { Feature, Group, Layer, SelectionType } from '../../store/types.js';
3
+ import { DrawError } from '../errors.js';
4
+ /** The error for an ID that names nothing of its kind */
5
+ export declare function notFound(kind: string, id: unknown): DrawError;
6
+ /** The error for an input of the wrong shape or value */
7
+ export declare function invalidInput(message: string, details?: unknown): DrawError;
8
+ /** Whether the value is a plain object (not null, not an array) */
9
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
10
+ /** Throws unless the value is a plain object */
11
+ export declare function requireRecord(value: unknown, what: string): void;
12
+ /** Throws unless the value is an array of strings, and returns it without repeated IDs */
13
+ export declare function requireIds(value: unknown, what?: string): string[];
14
+ /** Throws unless the value is a non-empty string */
15
+ export declare function requireId(value: unknown, what?: string): string;
16
+ /** Throws unless the key of the object is absent or a boolean */
17
+ export declare function optionalBoolean(value: Record<string, unknown>, key: string): void;
18
+ /** Throws unless the key of the object is absent or a string */
19
+ export declare function optionalString(value: Record<string, unknown>, key: string): void;
20
+ /** Throws unless the keys of the object are all among the allowed ones */
21
+ export declare function onlyKeys(value: Record<string, unknown>, allowed: readonly string[], what: string): void;
22
+ /** Throws unless the index is absent or an integer from 0 */
23
+ export declare function optionalIndex(value: unknown): number | undefined;
24
+ /**
25
+ * The keys of a filter that must match; a key given as `undefined` does not filter
26
+ *
27
+ * @returns The entries to compare
28
+ */
29
+ export declare function filterEntries(filter: unknown, allowed: readonly string[]): Array<[string, unknown]>;
30
+ /** Whether an item matches every entry of a filter */
31
+ export declare function matches(item: object, entries: Array<[string, unknown]>): boolean;
32
+ /** Whether a patch changes nothing but `locked` and `visible`, which a lock still allows */
33
+ export declare function onlyLockOrVisibility(patch: object): boolean;
34
+ /** Whether the ID names a feature, a group or a layer */
35
+ export declare function isTaken(store: Store, id: string): boolean;
36
+ /** The layer that lists a group, or else the layer the group records */
37
+ export declare function layerOfGroup(store: Store, group: Group): Layer | undefined;
38
+ /**
39
+ * Runs `fn` with the locks of the features, groups and layers of the Store ignored by the
40
+ * writes of the resources; read-only is still enforced. Nested calls keep ignoring them until
41
+ * the outermost one ends.
42
+ */
43
+ export declare function withLocksIgnored<T>(store: Store, fn: () => T): T;
44
+ /** Whether the writes to the Store ignore the locks now (see {@link withLocksIgnored}) */
45
+ export declare function locksIgnored(store: Store): boolean;
46
+ /**
47
+ * Whether a lock refuses a write to the feature: it, its group or its layer is locked, and
48
+ * the write does not ignore the locks
49
+ */
50
+ export declare function featureLocked(store: Store, feature: Feature): boolean;
51
+ /**
52
+ * Whether a lock refuses a write to the group: it or its layer is locked, and the write does
53
+ * not ignore the locks
54
+ */
55
+ export declare function groupLocked(store: Store, group: Group): boolean;
56
+ /** Whether a lock refuses a write to the layer: it is locked, and the write does not ignore it */
57
+ export declare function layerLocked(store: Store, layer: Layer): boolean;
58
+ /**
59
+ * Whether an item can be seen: it exists, its own visible flag and the ones of its group and
60
+ * layer are on, and this client hides none of them
61
+ */
62
+ export declare function isShown(store: Store, type: SelectionType, id: string): boolean;
63
+ /** Looks an item of a type up, or undefined */
64
+ export declare function getItem(store: Store, type: SelectionType, id: string): Feature | Group | Layer | undefined;
@@ -0,0 +1,178 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { isFeatureLocked, isGroupLocked } from '../../store/lock.js';
4
+ import { DrawError } from '../errors.js';
5
+ // ============================================================================
6
+ // Errors
7
+ // ============================================================================
8
+ /** The error for an ID that names nothing of its kind */
9
+ export function notFound(kind, id) {
10
+ return new DrawError('not-found', `There is no ${kind} with the ID ${JSON.stringify(id)}`, {
11
+ id,
12
+ });
13
+ }
14
+ /** The error for an input of the wrong shape or value */
15
+ export function invalidInput(message, details) {
16
+ return new DrawError('invalid-input', message, details);
17
+ }
18
+ // ============================================================================
19
+ // Checks of the arguments
20
+ // ============================================================================
21
+ /** Whether the value is a plain object (not null, not an array) */
22
+ export function isRecord(value) {
23
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
24
+ }
25
+ /** Throws unless the value is a plain object */
26
+ export function requireRecord(value, what) {
27
+ if (!isRecord(value))
28
+ throw invalidInput(`${what} must be an object`);
29
+ }
30
+ /** Throws unless the value is an array of strings, and returns it without repeated IDs */
31
+ export function requireIds(value, what = 'The IDs') {
32
+ if (!Array.isArray(value) || value.some((id) => typeof id !== 'string')) {
33
+ throw invalidInput(`${what} must be an array of strings`);
34
+ }
35
+ return [...new Set(value)];
36
+ }
37
+ /** Throws unless the value is a non-empty string */
38
+ export function requireId(value, what = 'The ID') {
39
+ if (typeof value !== 'string' || value === '') {
40
+ throw invalidInput(`${what} must be a non-empty string`);
41
+ }
42
+ return value;
43
+ }
44
+ /** Throws unless the key of the object is absent or a boolean */
45
+ export function optionalBoolean(value, key) {
46
+ if (key in value && value[key] !== undefined && typeof value[key] !== 'boolean') {
47
+ throw invalidInput(`${key} must be a boolean`);
48
+ }
49
+ }
50
+ /** Throws unless the key of the object is absent or a string */
51
+ export function optionalString(value, key) {
52
+ if (key in value && value[key] !== undefined && typeof value[key] !== 'string') {
53
+ throw invalidInput(`${key} must be a string`);
54
+ }
55
+ }
56
+ /** Throws unless the keys of the object are all among the allowed ones */
57
+ export function onlyKeys(value, allowed, what) {
58
+ for (const key of Object.keys(value)) {
59
+ if (!allowed.includes(key))
60
+ throw invalidInput(`${what} cannot have the key ${key}`);
61
+ }
62
+ }
63
+ /** Throws unless the index is absent or an integer from 0 */
64
+ export function optionalIndex(value) {
65
+ if (value === undefined)
66
+ return undefined;
67
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
68
+ throw invalidInput('index must be an integer from 0');
69
+ }
70
+ return value;
71
+ }
72
+ /**
73
+ * The keys of a filter that must match; a key given as `undefined` does not filter
74
+ *
75
+ * @returns The entries to compare
76
+ */
77
+ export function filterEntries(filter, allowed) {
78
+ if (filter === undefined)
79
+ return [];
80
+ requireRecord(filter, 'The filter');
81
+ onlyKeys(filter, allowed, 'The filter');
82
+ return Object.entries(filter).filter(([, value]) => value !== undefined);
83
+ }
84
+ /** Whether an item matches every entry of a filter */
85
+ export function matches(item, entries) {
86
+ const record = item;
87
+ return entries.every(([key, value]) => record[key] === value);
88
+ }
89
+ /** Whether a patch changes nothing but `locked` and `visible`, which a lock still allows */
90
+ export function onlyLockOrVisibility(patch) {
91
+ return Object.keys(patch).every((key) => key === 'locked' || key === 'visible');
92
+ }
93
+ // ============================================================================
94
+ // Lookups of the document
95
+ // ============================================================================
96
+ /** Whether the ID names a feature, a group or a layer */
97
+ export function isTaken(store, id) {
98
+ return (store.getFeature(id) !== undefined ||
99
+ store.getGroup(id) !== undefined ||
100
+ store.getLayer(id) !== undefined);
101
+ }
102
+ /** The layer that lists a group, or else the layer the group records */
103
+ export function layerOfGroup(store, group) {
104
+ return store.getLayer(group.layerId);
105
+ }
106
+ /** How deep each Store is in `transact` calls with `ignoreLocks` */
107
+ const lockBypassDepth = new WeakMap();
108
+ /**
109
+ * Runs `fn` with the locks of the features, groups and layers of the Store ignored by the
110
+ * writes of the resources; read-only is still enforced. Nested calls keep ignoring them until
111
+ * the outermost one ends.
112
+ */
113
+ export function withLocksIgnored(store, fn) {
114
+ lockBypassDepth.set(store, (lockBypassDepth.get(store) ?? 0) + 1);
115
+ try {
116
+ return fn();
117
+ }
118
+ finally {
119
+ const depth = (lockBypassDepth.get(store) ?? 1) - 1;
120
+ if (depth === 0)
121
+ lockBypassDepth.delete(store);
122
+ else
123
+ lockBypassDepth.set(store, depth);
124
+ }
125
+ }
126
+ /** Whether the writes to the Store ignore the locks now (see {@link withLocksIgnored}) */
127
+ export function locksIgnored(store) {
128
+ return lockBypassDepth.has(store);
129
+ }
130
+ /**
131
+ * Whether a lock refuses a write to the feature: it, its group or its layer is locked, and
132
+ * the write does not ignore the locks
133
+ */
134
+ export function featureLocked(store, feature) {
135
+ return !locksIgnored(store) && isFeatureLocked(feature, store);
136
+ }
137
+ /**
138
+ * Whether a lock refuses a write to the group: it or its layer is locked, and the write does
139
+ * not ignore the locks
140
+ */
141
+ export function groupLocked(store, group) {
142
+ return !locksIgnored(store) && isGroupLocked(group, () => layerOfGroup(store, group));
143
+ }
144
+ /** Whether a lock refuses a write to the layer: it is locked, and the write does not ignore it */
145
+ export function layerLocked(store, layer) {
146
+ return !locksIgnored(store) && layer.locked;
147
+ }
148
+ /**
149
+ * Whether an item can be seen: it exists, its own visible flag and the ones of its group and
150
+ * layer are on, and this client hides none of them
151
+ */
152
+ export function isShown(store, type, id) {
153
+ const layerShown = (layerId) => store.getLayer(layerId)?.visible === true && !store.isHidden(layerId);
154
+ const groupShown = (group) => group.visible && !store.isHidden(group.id) && layerShown(group.layerId);
155
+ if (type === 'layer')
156
+ return layerShown(id);
157
+ if (type === 'group') {
158
+ const group = store.getGroup(id);
159
+ return group !== undefined && groupShown(group);
160
+ }
161
+ const feature = store.getFeature(id);
162
+ if (!feature?.visible || store.isHidden(id))
163
+ return false;
164
+ if (feature.groupId) {
165
+ const group = store.getGroup(feature.groupId);
166
+ if (group && !groupShown(group))
167
+ return false;
168
+ }
169
+ return layerShown(feature.layerId);
170
+ }
171
+ /** Looks an item of a type up, or undefined */
172
+ export function getItem(store, type, id) {
173
+ if (type === 'feature')
174
+ return store.getFeature(id);
175
+ if (type === 'group')
176
+ return store.getGroup(id);
177
+ return store.getLayer(id);
178
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,159 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The shape of an extension, checked before it is added
5
+ *
6
+ * `draw.extensions.*.add` hands every value to {@link validateExtension} before anything is
7
+ * installed, so a value of the wrong shape is refused with `DrawError('invalid-input')` and
8
+ * nothing is added. The checks follow the contract types: a required member must be there with
9
+ * the right type, and an optional member, when it is given, must have the right type too. The
10
+ * name is checked by the collection itself.
11
+ */
12
+ import { DrawError } from '../errors.js';
13
+ /** The kinds of GeoJSON geometry a feature type can declare */
14
+ const GEOMETRY_TYPES = new Set([
15
+ 'Point',
16
+ 'LineString',
17
+ 'Polygon',
18
+ 'MultiPoint',
19
+ 'MultiLineString',
20
+ 'MultiPolygon',
21
+ 'GeometryCollection',
22
+ ]);
23
+ /** The receivers of the input a plugin may give */
24
+ const INPUT_HANDLERS = [
25
+ 'onPointerDown',
26
+ 'onPointerMove',
27
+ 'onPointerUp',
28
+ 'onPointerLeave',
29
+ 'onClick',
30
+ 'onDoubleClick',
31
+ 'onDragStart',
32
+ 'onDrag',
33
+ 'onDragEnd',
34
+ 'onDragCancel',
35
+ 'onKeyDown',
36
+ 'onKeyUp',
37
+ ];
38
+ /** The hooks of the interaction of a plugin */
39
+ const INTERACTION_HOOKS = [
40
+ 'filterSelection',
41
+ 'onFeatureClick',
42
+ 'onFeatureDoubleClick',
43
+ 'onDrawCommit',
44
+ 'isBusy',
45
+ 'finish',
46
+ 'cancel',
47
+ 'container',
48
+ ];
49
+ /** What each kind requires and allows, besides its name */
50
+ const SHAPES = {
51
+ plugin: { required: ['onAdd'], optional: ['onRemove'] },
52
+ 'feature type': {
53
+ required: [],
54
+ optional: [
55
+ 'appliesTo',
56
+ 'hitTest',
57
+ 'boxSelect',
58
+ 'bounds',
59
+ 'outline',
60
+ 'bbox',
61
+ 'handles',
62
+ 'onHandleDrag',
63
+ 'onHandleDragStart',
64
+ 'onHandleDragEnd',
65
+ 'snapCandidates',
66
+ ],
67
+ },
68
+ overlay: {
69
+ required: ['onAdd', 'draw', 'onRemove'],
70
+ optional: ['drawForLayer', 'drawVertices', 'hasPendingWork'],
71
+ },
72
+ 'snap provider': { required: ['candidates'], optional: [] },
73
+ 'handle provider': {
74
+ required: ['handles', 'onDrag'],
75
+ optional: ['globalHandles', 'onDragStart', 'onDragEnd'],
76
+ },
77
+ 'companion provider': { required: ['has', 'draw', 'hitTest'], optional: ['onClick'] },
78
+ };
79
+ /** The error for a value of the wrong shape */
80
+ function wrongShape(kind, message, member) {
81
+ return new DrawError('invalid-input', `The ${kind} ${message}`, member === undefined ? { kind } : { kind, member });
82
+ }
83
+ /** Whether the value is an object that is not an array */
84
+ function isObject(value) {
85
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
86
+ }
87
+ /** Checks that the members named are functions: required ones must be there */
88
+ function requireFunctions(kind, value, required, optional, prefix = '') {
89
+ for (const member of required) {
90
+ if (typeof value[member] !== 'function') {
91
+ throw wrongShape(kind, `must have the function ${prefix}${member}`, `${prefix}${member}`);
92
+ }
93
+ }
94
+ for (const member of optional) {
95
+ if (value[member] !== undefined && typeof value[member] !== 'function') {
96
+ throw wrongShape(kind, `has ${prefix}${member} that is not a function`, `${prefix}${member}`);
97
+ }
98
+ }
99
+ }
100
+ /** Checks an optional group of functions, such as the input receivers of a plugin */
101
+ function optionalGroup(kind, value, member, names) {
102
+ const group = value[member];
103
+ if (group === undefined)
104
+ return;
105
+ if (!isObject(group))
106
+ throw wrongShape(kind, `has ${member} that is not an object`, member);
107
+ requireFunctions(kind, group, [], names, `${member}.`);
108
+ }
109
+ /** Checks an optional number, finite and, when asked, not negative */
110
+ function optionalNumber(kind, value, member, nonNegative) {
111
+ const number = value[member];
112
+ if (number === undefined)
113
+ return;
114
+ if (typeof number !== 'number' || !Number.isFinite(number) || (nonNegative && number < 0)) {
115
+ const what = nonNegative ? 'a finite number of 0 or more' : 'a finite number';
116
+ throw wrongShape(kind, `has ${member} that is not ${what}`, member);
117
+ }
118
+ }
119
+ /**
120
+ * Checks that a value has the shape of an extension of the kind; the name is not checked
121
+ *
122
+ * @param kind - The kind of extension the value is added as
123
+ * @param value - The value given to `add`
124
+ * @throws `DrawError` with the code `invalid-input` when the value does not have the shape
125
+ * @internal
126
+ */
127
+ export function validateExtension(kind, value) {
128
+ if (kind === 'mode') {
129
+ if (typeof value !== 'function')
130
+ throw wrongShape(kind, 'must be a function');
131
+ return;
132
+ }
133
+ if (!isObject(value))
134
+ throw wrongShape(kind, 'must be an object');
135
+ const shape = SHAPES[kind];
136
+ requireFunctions(kind, value, shape.required, shape.optional);
137
+ switch (kind) {
138
+ case 'plugin':
139
+ optionalGroup(kind, value, 'input', INPUT_HANDLERS);
140
+ optionalGroup(kind, value, 'interaction', INTERACTION_HOOKS);
141
+ return;
142
+ case 'feature type': {
143
+ if (typeof value.geometry !== 'string' || !GEOMETRY_TYPES.has(value.geometry)) {
144
+ throw wrongShape(kind, 'must name a kind of GeoJSON geometry in geometry', 'geometry');
145
+ }
146
+ const renderer = value.renderer;
147
+ if (!isObject(renderer))
148
+ throw wrongShape(kind, 'must have a renderer', 'renderer');
149
+ requireFunctions(kind, renderer, ['onAdd', 'draw', 'onRemove'], [], 'renderer.');
150
+ optionalNumber(kind, value, 'hitPaddingPx', true);
151
+ return;
152
+ }
153
+ case 'overlay':
154
+ optionalNumber(kind, value, 'order', false);
155
+ return;
156
+ default:
157
+ return;
158
+ }
159
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * `draw.layers`: the layers of the document
3
+ */
4
+ import type { Layer, LayerFilter, LayerInput, LayerPatch } from './model.js';
5
+ /**
6
+ * The layers of the document, with the standard methods of a collection, the stacking order
7
+ * and the active layer.
8
+ *
9
+ * A wrong argument (an ID that does not exist, an input of the wrong shape) throws a
10
+ * `DrawError` and changes nothing. A refusal because of the state (read-only, a lock) returns
11
+ * `null` or `false` and changes nothing. A method whose name ends in `Many` runs in one
12
+ * transaction: all of it happens or none of it does.
13
+ */
14
+ export interface LayersCollection {
15
+ /**
16
+ * Gets a layer by ID.
17
+ *
18
+ * @returns The layer, or `undefined` when there is none with this ID
19
+ */
20
+ get(id: string): Layer | undefined;
21
+ /**
22
+ * Gets layers by ID, in the order of the IDs.
23
+ *
24
+ * @returns One entry per ID: the layer, or `undefined` when there is none with that ID
25
+ */
26
+ getMany(ids: readonly string[]): (Layer | undefined)[];
27
+ /**
28
+ * Lists the layers in stacking order, from the back.
29
+ *
30
+ * @param filter - Keeps only the layers that match every key given
31
+ */
32
+ list(filter?: LayerFilter): Layer[];
33
+ /**
34
+ * Counts the layers.
35
+ *
36
+ * @param filter - Counts only the layers that match every key given
37
+ */
38
+ count(filter?: LayerFilter): number;
39
+ /** Whether a layer with this ID exists. */
40
+ has(id: string): boolean;
41
+ /**
42
+ * Creates a layer and returns it as it was stored.
43
+ *
44
+ * @returns The new layer, or `null` when the document is read-only
45
+ * @throws `DrawError` with the code `invalid-input` when the input has the wrong shape, or
46
+ * `already-exists` when its ID is taken
47
+ */
48
+ create(input: LayerInput): Layer | null;
49
+ /**
50
+ * Creates several layers in one transaction: all of them or none.
51
+ *
52
+ * @returns The new layers in the order of the inputs, or `null` when the document is
53
+ * read-only
54
+ * @throws `DrawError` as {@link LayersCollection.create} does, for any of the inputs;
55
+ * nothing is created then
56
+ */
57
+ createMany(inputs: readonly LayerInput[]): Layer[] | null;
58
+ /**
59
+ * Changes the keys given in the patch and returns the layer after the change.
60
+ *
61
+ * @returns The changed layer, or `null` when the change is refused (read-only, a lock)
62
+ * @throws `DrawError` with the code `not-found` when there is no layer with this ID, or
63
+ * `invalid-input` when the patch has the wrong shape
64
+ */
65
+ update(id: string, patch: LayerPatch): Layer | null;
66
+ /**
67
+ * Changes several layers in one transaction: all of them or none.
68
+ *
69
+ * @returns The changed layers in the order of the patches, or `null` when the change is
70
+ * refused
71
+ * @throws `DrawError` as {@link LayersCollection.update} does, for any of the patches;
72
+ * nothing changes then
73
+ */
74
+ updateMany(patches: readonly {
75
+ id: string;
76
+ patch: LayerPatch;
77
+ }[]): Layer[] | null;
78
+ /**
79
+ * Deletes a layer with its features and groups.
80
+ *
81
+ * @returns True when it was deleted, false when the deletion is refused (read-only, a lock)
82
+ * @throws `DrawError` with the code `not-found` when there is no layer with this ID
83
+ */
84
+ delete(id: string): boolean;
85
+ /**
86
+ * Deletes several layers in one transaction: all of them or none.
87
+ *
88
+ * @returns True when they were deleted, false when the deletion is refused
89
+ * @throws `DrawError` with the code `not-found` when one of the IDs does not exist; nothing
90
+ * is deleted then
91
+ */
92
+ deleteMany(ids: readonly string[]): boolean;
93
+ /**
94
+ * Changes the stacking order.
95
+ *
96
+ * Besides the layers, the order may place the datasets whose order is `layer-order` and the
97
+ * entries the `isExternalEntry` option recognizes. An entry of the stacking order that is
98
+ * not a layer and is left out of `order` keeps its position; the entries given fill the
99
+ * other positions in the order given, and those new to the stacking order go to the front.
100
+ *
101
+ * @param order - The IDs of every layer, and of the other entries to place, from the back
102
+ * @returns True when the order changed, false when the change is refused (read-only)
103
+ * @throws `DrawError` with the code `invalid-input` when the IDs do not list every layer
104
+ * or list an ID twice, or `not-found` when one of them is not a layer, a `layer-order`
105
+ * dataset or an entry the `isExternalEntry` option recognizes
106
+ */
107
+ reorder(order: readonly string[]): boolean;
108
+ /**
109
+ * The stacking order as {@link LayersCollection.reorder} takes it: the IDs of every layer and
110
+ * of the other entries placed on it (the datasets whose order is `layer-order` and the
111
+ * entries the `isExternalEntry` option recognizes), from the back. An entry that is no longer
112
+ * one of those is left out, so the array can be changed and given to `reorder` as it is.
113
+ *
114
+ * @returns A frozen array of IDs
115
+ */
116
+ getOrder(): readonly string[];
117
+ /**
118
+ * The layer that drawn features go into.
119
+ *
120
+ * @returns The active layer, or `null` when there is no layer
121
+ */
122
+ getActive(): Layer | null;
123
+ /**
124
+ * Changes the layer that drawn features go into.
125
+ *
126
+ * @returns True when it changed, false when the layer cannot take drawn features (a lock)
127
+ * @throws `DrawError` with the code `not-found` when there is no layer with this ID
128
+ */
129
+ setActive(id: string): boolean;
130
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `draw.metadata`: the title and the description of the document
3
+ */
4
+ import type { Metadata } from './model.js';
5
+ /**
6
+ * The title and the description of the document.
7
+ */
8
+ export interface MetadataResource {
9
+ /** The title and the description. */
10
+ get(): Metadata;
11
+ /**
12
+ * Changes the fields given and returns the metadata after the change.
13
+ *
14
+ * @returns The changed metadata, or `null` when the document is read-only
15
+ * @throws `DrawError` with the code `invalid-input` when a field has the wrong type
16
+ */
17
+ update(patch: Partial<Metadata>): Metadata | null;
18
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};