@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.
- package/CHANGELOG.md +1016 -2
- package/README.ja.md +39 -19
- package/README.md +41 -21
- package/dist/api/datasets.d.ts +258 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +135 -0
- package/dist/api/draw.js +18 -0
- package/dist/api/drawing.d.ts +87 -0
- package/dist/api/errors.d.ts +35 -0
- package/dist/api/errors.js +35 -0
- package/dist/api/events.d.ts +306 -0
- package/dist/api/extension/context.d.ts +247 -0
- package/dist/api/extension/feature-type.d.ts +129 -0
- package/dist/api/extension/mode.d.ts +123 -0
- package/dist/api/extension/plugin.d.ts +51 -0
- package/dist/api/extension/plugin.js +3 -0
- package/dist/api/extension/provider.d.ts +119 -0
- package/dist/api/extension/provider.js +3 -0
- package/dist/api/extension/render.d.ts +176 -0
- package/dist/api/extension/render.js +3 -0
- package/dist/api/extension/store.d.ts +190 -0
- package/dist/api/extension/store.js +3 -0
- package/dist/api/extensions.d.ts +306 -0
- package/dist/api/extensions.js +3 -0
- package/dist/api/features.d.ts +188 -0
- package/dist/api/features.js +3 -0
- package/dist/api/groups.d.ts +111 -0
- package/dist/api/groups.js +3 -0
- package/dist/api/hidden.d.ts +45 -0
- package/dist/api/hidden.js +3 -0
- package/dist/api/impl/adapters.js +463 -0
- package/dist/api/impl/contexts.js +466 -0
- package/dist/api/impl/create-draw.js +124 -0
- package/dist/api/impl/datasets.js +404 -0
- package/dist/api/impl/destroy-guard.js +74 -0
- package/dist/api/impl/document.js +280 -0
- package/dist/api/impl/drawing.js +180 -0
- package/dist/api/impl/engine-context.d.ts +7 -0
- package/dist/api/{context.js → impl/engine-context.js} +49 -38
- package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
- package/dist/api/impl/events.js +422 -0
- package/dist/api/impl/extension-host.js +361 -0
- package/dist/api/impl/extensions.js +229 -0
- package/dist/api/impl/features.js +445 -0
- package/dist/api/impl/geometry/apply.d.ts +32 -0
- package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
- package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
- package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/split.js +10 -21
- package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
- package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
- package/dist/api/impl/geometry/types.js +3 -0
- package/dist/api/impl/groups.d.ts +3 -0
- package/dist/api/impl/groups.js +268 -0
- package/dist/api/impl/hidden.js +60 -0
- package/dist/api/impl/import-export/constants.d.ts +22 -0
- package/dist/api/impl/import-export/constants.js +24 -0
- package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
- package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
- package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
- package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
- package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
- package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
- package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
- package/dist/api/impl/import-export/image-import.d.ts +16 -0
- package/dist/api/impl/import-export/image-import.js +73 -0
- package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
- package/dist/api/impl/import-export/legacy-image-style.js +49 -0
- package/dist/api/impl/import-export/native-format.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
- package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
- package/dist/api/impl/import-export/native-upgrade.js +139 -0
- package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
- package/dist/api/impl/import-export/style-validation.d.ts +24 -0
- package/dist/api/impl/import-export/style-validation.js +86 -0
- package/dist/api/impl/import-export/types.d.ts +52 -0
- package/dist/api/impl/import-export/types.js +3 -0
- package/dist/api/impl/input.js +180 -0
- package/dist/api/impl/layers.js +307 -0
- package/dist/api/impl/metadata.d.ts +1 -0
- package/dist/api/impl/metadata.js +22 -0
- package/dist/api/impl/options.d.ts +1 -0
- package/dist/api/impl/options.js +822 -0
- package/dist/api/impl/placement.d.ts +1 -0
- package/dist/api/impl/placement.js +138 -0
- package/dist/api/impl/render-context.d.ts +13 -0
- package/dist/api/impl/render-context.js +272 -0
- package/dist/api/impl/rows.d.ts +1 -0
- package/dist/api/impl/rows.js +46 -0
- package/dist/api/impl/selection.d.ts +1 -0
- package/dist/api/impl/selection.js +186 -0
- package/dist/api/impl/shared.d.ts +64 -0
- package/dist/api/impl/shared.js +178 -0
- package/dist/api/impl/validate-extension.d.ts +1 -0
- package/dist/api/impl/validate-extension.js +159 -0
- package/dist/api/layers.d.ts +130 -0
- package/dist/api/layers.js +3 -0
- package/dist/api/metadata.d.ts +18 -0
- package/dist/api/metadata.js +3 -0
- package/dist/api/model.d.ts +487 -0
- package/dist/api/model.js +47 -0
- package/dist/api/options.d.ts +466 -0
- package/dist/api/options.js +3 -0
- package/dist/api/selection.d.ts +94 -0
- package/dist/api/selection.js +3 -0
- package/dist/api/state.d.ts +155 -0
- package/dist/api/state.js +12 -0
- package/dist/{display → dataset}/chunk.d.ts +1 -1
- package/dist/{display → dataset}/chunk.js +4 -3
- package/dist/{display → dataset}/dataset.js +18 -21
- package/dist/dataset/interaction.d.ts +1 -0
- package/dist/{display → dataset}/interaction.js +18 -6
- package/dist/dataset/manager.d.ts +1 -0
- package/dist/dataset/provider.d.ts +1 -0
- package/dist/{display → dataset}/retained.d.ts +1 -1
- package/dist/{display → dataset}/retained.js +8 -7
- package/dist/dataset/source.d.ts +1 -0
- package/dist/{display → dataset}/source.js +17 -4
- package/dist/dataset/spatial.d.ts +1 -0
- package/dist/{display → dataset}/spatial.js +1 -1
- package/dist/dataset/style.d.ts +1 -0
- package/dist/{display → dataset}/style.js +1 -1
- package/dist/dataset/table-source.d.ts +1 -0
- package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
- package/dist/{display → dataset}/thinning.d.ts +0 -10
- package/dist/{display → dataset}/thinning.js +3 -2
- package/dist/dataset/triangulation.d.ts +1 -0
- package/dist/{display → dataset}/triangulation.js +0 -0
- package/dist/{display → dataset}/types.d.ts +82 -121
- package/dist/dataset/types.js +61 -0
- package/dist/dispatcher/hit-test/box-strategies.js +13 -13
- package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
- package/dist/dispatcher/hit-test/globe-shape.js +5 -4
- package/dist/dispatcher/hit-test/service.d.ts +17 -0
- package/dist/dispatcher/hit-test/service.js +80 -16
- package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
- package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
- package/dist/dispatcher/hit-test/strategies/image.js +6 -18
- package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
- package/dist/dispatcher/hit-test/strategies/line.js +9 -2
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
- package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
- package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
- package/dist/dispatcher/hit-test/strategies/point.js +8 -4
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
- package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
- package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
- package/dist/dispatcher/input-router.js +152 -69
- package/dist/dispatcher/normalizer.js +6 -2
- package/dist/dispatcher/types.d.ts +6 -1
- package/dist/extension/feature-handler.d.ts +1 -182
- package/dist/extension/index.d.ts +4 -7
- package/dist/extension/renderers.d.ts +1 -208
- package/dist/geometry/angle.d.ts +0 -8
- package/dist/geometry/angle.js +0 -8
- package/dist/geometry/bbox.d.ts +4 -12
- package/dist/geometry/bbox.js +4 -12
- package/dist/geometry/boolean.d.ts +0 -51
- package/dist/geometry/boolean.js +0 -51
- package/dist/geometry/buffer.d.ts +0 -26
- package/dist/geometry/buffer.js +0 -26
- package/dist/geometry/circle.d.ts +0 -9
- package/dist/geometry/circle.js +0 -9
- package/dist/geometry/coords.d.ts +0 -16
- package/dist/geometry/coords.js +0 -16
- package/dist/geometry/distance.d.ts +0 -24
- package/dist/geometry/distance.js +0 -24
- package/dist/geometry/errors.d.ts +21 -36
- package/dist/geometry/errors.js +49 -29
- package/dist/geometry/geojson.d.ts +81 -0
- package/dist/geometry/geojson.js +164 -0
- package/dist/geometry/index.d.ts +38 -23
- package/dist/geometry/index.js +43 -31
- package/dist/geometry/measure.d.ts +0 -27
- package/dist/geometry/measure.js +0 -27
- package/dist/geometry/predicates.d.ts +0 -9
- package/dist/geometry/predicates.js +0 -9
- package/dist/geometry/public-bounds.d.ts +26 -0
- package/dist/geometry/public-bounds.js +30 -0
- package/dist/geometry/public-combine.d.ts +78 -0
- package/dist/geometry/public-combine.js +82 -0
- package/dist/geometry/public-create.d.ts +54 -0
- package/dist/geometry/public-create.js +70 -0
- package/dist/geometry/public-measure.d.ts +170 -0
- package/dist/geometry/public-measure.js +283 -0
- package/dist/geometry/public-predicates.d.ts +54 -0
- package/dist/geometry/public-predicates.js +144 -0
- package/dist/geometry/public-repair.d.ts +75 -0
- package/dist/geometry/public-repair.js +77 -0
- package/dist/geometry/simplify.d.ts +0 -7
- package/dist/geometry/simplify.js +0 -7
- package/dist/geometry/split.d.ts +0 -20
- package/dist/geometry/split.js +0 -20
- package/dist/geometry/units.d.ts +20 -12
- package/dist/geometry/units.js +20 -12
- package/dist/index.d.ts +52 -66
- package/dist/index.js +6 -18
- package/dist/messages.d.ts +7 -7
- package/dist/modes/draw/circle.js +83 -207
- package/dist/modes/draw/commit-layer.d.ts +5 -16
- package/dist/modes/draw/commit-layer.js +2 -13
- package/dist/modes/draw/freehand.js +108 -246
- package/dist/modes/draw/image.js +4 -2
- package/dist/modes/draw/index.d.ts +5 -5
- package/dist/modes/draw/index.js +5 -5
- package/dist/modes/draw/line.js +18 -354
- package/dist/modes/draw/point.js +29 -78
- package/dist/modes/draw/polygon.js +23 -368
- package/dist/modes/draw/trace-support.d.ts +43 -36
- package/dist/modes/draw/trace-support.js +95 -98
- package/dist/modes/draw/vertex-drawing.d.ts +1 -0
- package/dist/modes/draw/vertex-drawing.js +176 -0
- package/dist/modes/handler.d.ts +1 -285
- package/dist/modes/manager.d.ts +2 -2
- package/dist/modes/manager.js +3 -0
- package/dist/modes/select/box-selection.d.ts +3 -3
- package/dist/modes/select/box-selection.js +2 -1
- package/dist/modes/select/click-handler.d.ts +5 -5
- package/dist/modes/select/click-handler.js +22 -20
- package/dist/modes/select/cursor-handler.d.ts +2 -2
- package/dist/modes/select/drag/intermediate-writes.js +1 -1
- package/dist/modes/select/drag/move.js +3 -3
- package/dist/modes/select/drag/operation.d.ts +3 -3
- package/dist/modes/select/drag/radius.js +5 -4
- package/dist/modes/select/drag/transform.d.ts +2 -2
- package/dist/modes/select/drag/transform.js +11 -5
- package/dist/modes/select/drag/vertex.d.ts +2 -2
- package/dist/modes/select/drag/vertex.js +13 -8
- package/dist/modes/select/drag-handler.js +44 -25
- package/dist/modes/select/mode.js +17 -17
- package/dist/modes/select/shortcut-handler.d.ts +8 -8
- package/dist/modes/select/shortcut-handler.js +9 -7
- package/dist/operations/layer-operations.js +29 -168
- package/dist/operations/resize.d.ts +2 -2
- package/dist/operations/resize.js +5 -5
- package/dist/operations/rotate.js +5 -5
- package/dist/operations/selection-operations.d.ts +16 -1
- package/dist/operations/selection-operations.js +28 -13
- package/dist/operations/shared-vertex.js +4 -2
- package/dist/operations/trace-graph.d.ts +0 -18
- package/dist/operations/trace-graph.js +0 -18
- package/dist/operations/vertex.js +36 -35
- package/dist/shared/color.d.ts +1 -0
- package/dist/shared/color.js +245 -0
- package/dist/shared/config/constants.d.ts +1 -54
- package/dist/shared/config/constants.js +1 -58
- package/dist/shared/config/feature-style.d.ts +16 -13
- package/dist/shared/config/feature-style.js +9 -0
- package/dist/shared/config/rendering.d.ts +3 -3
- package/dist/shared/config/selection-highlight.d.ts +0 -15
- package/dist/shared/config/selection-highlight.js +4 -7
- package/dist/shared/config/selection.d.ts +2 -32
- package/dist/shared/config/selection.js +0 -18
- package/dist/shared/config/topology.d.ts +2 -2
- package/dist/shared/config/trace.d.ts +4 -4
- package/dist/shared/math/angle.d.ts +1 -1
- package/dist/shared/math/angle.js +1 -1
- package/dist/shared/math/circle.d.ts +1 -1
- package/dist/shared/math/circle.js +1 -1
- package/dist/shared/math/distance.d.ts +2 -1
- package/dist/shared/math/distance.js +3 -2
- package/dist/shared/math/index.d.ts +1 -1
- package/dist/shared/math/index.js +1 -1
- package/dist/shared/math/transform.d.ts +23 -0
- package/dist/shared/math/transform.js +47 -28
- package/dist/shared/properties.d.ts +18 -0
- package/dist/shared/properties.js +129 -0
- package/dist/shared/types/events.d.ts +15 -7
- package/dist/shared/types/model.d.ts +109 -159
- package/dist/shared/types/style.d.ts +1 -1
- package/dist/shared/utils/color.d.ts +2 -36
- package/dist/shared/utils/color.js +13 -70
- package/dist/shared/utils/coordinates.d.ts +30 -4
- package/dist/shared/utils/coordinates.js +56 -10
- package/dist/shared/utils/event-emitter.d.ts +1 -262
- package/dist/shared/utils/event-emitter.js +4 -3
- package/dist/shared/utils/feature-bbox.js +8 -7
- package/dist/shared/utils/feature-segments.js +5 -4
- package/dist/shared/utils/image.d.ts +0 -4
- package/dist/shared/utils/image.js +0 -6
- package/dist/shared/utils/name-generator.d.ts +14 -20
- package/dist/shared/utils/name-generator.js +20 -3
- package/dist/shared/utils/pixel-ratio.d.ts +9 -3
- package/dist/shared/utils/pixel-ratio.js +13 -4
- package/dist/shared/utils/property.d.ts +7 -50
- package/dist/shared/utils/property.js +22 -87
- package/dist/snapping/custom-targets.js +21 -4
- package/dist/snapping/indicator.js +20 -11
- package/dist/snapping/providers/display.d.ts +6 -1
- package/dist/snapping/providers/display.js +2 -1
- package/dist/snapping/providers/guide.d.ts +3 -43
- package/dist/snapping/providers/guide.js +1 -44
- package/dist/snapping/providers/intersection.js +1 -1
- package/dist/snapping/providers/store.js +3 -3
- package/dist/snapping/service.js +18 -7
- package/dist/snapping/types.d.ts +9 -35
- package/dist/store/draw-store.js +233 -142
- package/dist/store/local-visibility.d.ts +11 -6
- package/dist/store/local-visibility.js +38 -7
- package/dist/store/lock.d.ts +0 -6
- package/dist/store/lock.js +0 -6
- package/dist/store/memory/change-bus.d.ts +3 -3
- package/dist/store/memory/change-bus.js +12 -0
- package/dist/store/memory/file-store.d.ts +2 -2
- package/dist/store/memory/ui-state.d.ts +1 -51
- package/dist/store/memory/ui-state.js +122 -134
- package/dist/store/memory.d.ts +1 -8
- package/dist/store/memory.js +249 -45
- package/dist/store/ordering.d.ts +9 -0
- package/dist/store/ordering.js +17 -0
- package/dist/store/spatial/spatial-index.d.ts +1 -1
- package/dist/store/spatial/spatial-index.js +1 -1
- package/dist/store/spatial/store-spatial-index.d.ts +3 -1
- package/dist/store/spatial/store-spatial-index.js +9 -3
- package/dist/store/store.d.ts +66 -107
- package/dist/store/types.d.ts +1 -1
- package/dist/store/writable-layer.d.ts +1 -1
- package/dist/store/writable-layer.js +2 -2
- package/dist/table/builder.d.ts +83 -0
- package/dist/table/builder.js +381 -0
- package/dist/table/index.d.ts +37 -0
- package/dist/table/index.js +5 -0
- package/dist/table/packed-rtree.d.ts +1 -0
- package/dist/{display → table}/packed-rtree.js +1 -1
- package/dist/table/partition.d.ts +1 -0
- package/dist/{display → table}/partition.js +3 -3
- package/dist/table/prepare.d.ts +44 -0
- package/dist/table/prepare.js +136 -0
- package/dist/table/table.d.ts +1 -0
- package/dist/{display/columnar → table}/table.js +29 -25
- package/dist/{display/columnar → table}/types.d.ts +68 -72
- package/dist/table/types.js +3 -0
- package/dist/view/coordinator.js +4 -3
- package/dist/view/feature-companion.d.ts +13 -7
- package/dist/view/feature-companion.js +11 -3
- package/dist/view/globe-subdivision.js +3 -3
- package/dist/view/layer/attach.d.ts +1 -1
- package/dist/view/layer/attach.js +1 -1
- package/dist/view/layer/custom-layer.js +40 -11
- package/dist/view/layer/display-list.js +2 -1
- package/dist/view/layer/drape-planner.d.ts +2 -2
- package/dist/view/layer/frame-render.d.ts +3 -3
- package/dist/view/layer/frame-render.js +7 -2
- package/dist/view/layer/frame-state.d.ts +6 -6
- package/dist/view/layer/index.d.ts +2 -2
- package/dist/view/layer/index.js +1 -1
- package/dist/view/layer/render.d.ts +4 -4
- package/dist/view/layer/render.js +3 -8
- package/dist/view/layer/renderers.d.ts +2 -2
- package/dist/view/layer/renderers.js +1 -1
- package/dist/view/layer/slot-manager.d.ts +2 -2
- package/dist/view/layer/slot-manager.js +4 -4
- package/dist/view/layer/slots.d.ts +2 -2
- package/dist/view/layer/slots.js +1 -1
- package/dist/view/layer/store-retained-bbox.js +3 -2
- package/dist/view/layer/store-retained-classify.d.ts +5 -7
- package/dist/view/layer/store-retained-classify.js +19 -7
- package/dist/view/layer/store-retained-collect.js +8 -7
- package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
- package/dist/view/layer/store-retained-coord-patch.js +13 -4
- package/dist/view/layer/store-retained-immediate.d.ts +3 -3
- package/dist/view/layer/store-retained-immediate.js +3 -8
- package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
- package/dist/view/layer/store-retained.d.ts +2 -2
- package/dist/view/layer/store-retained.js +1 -1
- package/dist/view/renderers/batch-manager.js +8 -7
- package/dist/view/renderers/drawer.js +21 -15
- package/dist/view/renderers/image.js +13 -39
- package/dist/view/renderers/line/line-types.d.ts +3 -3
- package/dist/view/renderers/line/sdf-line.js +3 -1
- package/dist/view/renderers/point/billboard-depth.js +1 -1
- package/dist/view/renderers/point/point-instance.js +1 -1
- package/dist/view/renderers/point/point-shape.js +2 -2
- package/dist/view/renderers/point/point-style.js +48 -4
- package/dist/view/renderers/polygon/batch.js +1 -2
- package/dist/view/renderers/polygon/fill.js +3 -1
- package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
- package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
- package/dist/view/renderers/stroke.js +3 -1
- package/dist/view/shaders/helpers.d.ts +2 -42
- package/dist/view/shaders/helpers.js +0 -6
- package/dist/view/shaders/projection.d.ts +15 -7
- package/dist/view/shaders/projection.js +23 -6
- package/dist/view/shaders/quad.d.ts +16 -12
- package/dist/view/shaders/quad.js +34 -13
- package/dist/view/style-rule.d.ts +5 -42
- package/dist/view/style-rule.js +20 -44
- package/dist/view/terrain/binding.d.ts +1 -0
- package/dist/view/terrain/binding.js +29 -0
- package/dist/view/terrain/context.d.ts +3 -4
- package/dist/view/terrain/context.js +4 -5
- package/dist/view/terrain/drape/geometry.js +1 -1
- package/dist/view/terrain/drape/pass.d.ts +1 -1
- package/dist/view/terrain/drape/pass.js +8 -7
- package/dist/view/terrain/polygon.d.ts +9 -5
- package/dist/view/terrain/polygon.js +16 -2
- package/dist/view/terrain/state.d.ts +1 -1
- package/dist/view/terrain/state.js +1 -1
- package/dist/view/terrain/tessellation.d.ts +2 -2
- package/dist/view/terrain/tessellation.js +1 -1
- package/dist/view/ui/auxiliary-handles.d.ts +6 -29
- package/dist/view/ui/bounds.js +8 -12
- package/dist/view/ui/handle-test.js +2 -2
- package/dist/view/ui/handle-thinning.js +17 -17
- package/dist/view/ui/handles.js +21 -13
- package/dist/view/ui/helper.d.ts +1 -1
- package/dist/view/ui/helper.js +1 -1
- package/dist/view/ui/index.d.ts +1 -1
- package/dist/view/ui/selection-scope.js +4 -2
- package/dist/view/ui/selection-ui/bounding-box.js +6 -6
- package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
- package/dist/view/ui/selection-ui/extension-registry.js +70 -7
- package/dist/view/ui/selection-ui/index.d.ts +2 -2
- package/dist/view/ui/selection-ui/index.js +1 -1
- package/dist/view/ui/selection-ui/renderer.js +15 -38
- package/dist/view/ui/selection-ui/types.d.ts +17 -2
- package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
- package/dist/view/ui/selection-ui-drawer.js +63 -2
- package/dist/view/ui/tentative.js +1 -1
- package/dist/webgl/index.d.ts +65 -0
- package/dist/webgl/index.js +62 -0
- package/package.json +20 -9
- package/dist/api/api.d.ts +0 -1259
- package/dist/api/api.js +0 -86
- package/dist/api/context.d.ts +0 -173
- package/dist/api/display-api.js +0 -23
- package/dist/api/event-api.d.ts +0 -13
- package/dist/api/event-api.js +0 -17
- package/dist/api/extension-api.d.ts +0 -46
- package/dist/api/extension-api.js +0 -85
- package/dist/api/feature-api.d.ts +0 -11
- package/dist/api/feature-api.js +0 -101
- package/dist/api/geometry/apply.d.ts +0 -51
- package/dist/api/geometry/boolean.d.ts +0 -28
- package/dist/api/geometry/boolean.js +0 -65
- package/dist/api/geometry/types.d.ts +0 -31
- package/dist/api/geometry-operations.d.ts +0 -162
- package/dist/api/geometry-operations.js +0 -94
- package/dist/api/group-api.d.ts +0 -10
- package/dist/api/group-api.js +0 -78
- package/dist/api/import-export/constants.d.ts +0 -29
- package/dist/api/import-export/constants.js +0 -40
- package/dist/api/import-export/file-name.d.ts +0 -10
- package/dist/api/import-export/file-name.js +0 -20
- package/dist/api/import-export/geojson-export.d.ts +0 -19
- package/dist/api/import-export/image-import.d.ts +0 -12
- package/dist/api/import-export/image-import.js +0 -53
- package/dist/api/import-export/index.d.ts +0 -9
- package/dist/api/import-export/index.js +0 -107
- package/dist/api/import-export/native-format.d.ts +0 -15
- package/dist/api/import-export/style-validation.d.ts +0 -27
- package/dist/api/import-export/style-validation.js +0 -49
- package/dist/api/import-export/types.d.ts +0 -26
- package/dist/api/index.d.ts +0 -15
- package/dist/api/index.js +0 -3
- package/dist/api/input-api.d.ts +0 -158
- package/dist/api/input-api.js +0 -144
- package/dist/api/instance-api.d.ts +0 -38
- package/dist/api/instance-api.js +0 -136
- package/dist/api/layer-api.d.ts +0 -12
- package/dist/api/layer-api.js +0 -62
- package/dist/api/selection-api.d.ts +0 -7
- package/dist/api/selection-api.js +0 -78
- package/dist/api/snapping-api.d.ts +0 -125
- package/dist/api/snapping-api.js +0 -50
- package/dist/api/topology-api.d.ts +0 -30
- package/dist/api/topology-api.js +0 -16
- package/dist/api/tracing-api.d.ts +0 -31
- package/dist/api/tracing-api.js +0 -16
- package/dist/dispatcher/hit-test/index.d.ts +0 -14
- package/dist/dispatcher/hit-test/index.js +0 -9
- package/dist/dispatcher/index.d.ts +0 -15
- package/dist/dispatcher/index.js +0 -3
- package/dist/display/columnar/index.d.ts +0 -12
- package/dist/display/columnar/index.js +0 -13
- package/dist/display/columnar/prepare.d.ts +0 -42
- package/dist/display/columnar/prepare.js +0 -116
- package/dist/display/index.d.ts +0 -13
- package/dist/display/types.js +0 -43
- package/dist/maplibre-gl-draw.d.ts +0 -47
- package/dist/modes/cursor.js +0 -72
- package/dist/modes/index.d.ts +0 -7
- package/dist/operations/index.d.ts +0 -9
- package/dist/operations/index.js +0 -3
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/mutation-hooks.d.ts +0 -28
- package/dist/plugins/mutation-hooks.js +0 -84
- package/dist/plugins/plugin-context.js +0 -367
- package/dist/plugins/plugin-manager.d.ts +0 -103
- package/dist/plugins/plugin-manager.js +0 -316
- package/dist/plugins/plugin.d.ts +0 -529
- package/dist/shared/config/index.d.ts +0 -17
- package/dist/shared/config/index.js +0 -8
- package/dist/shared/utils/index.d.ts +0 -15
- package/dist/shared/utils/index.js +0 -24
- package/dist/snapping/index.d.ts +0 -14
- package/dist/snapping/index.js +0 -4
- package/dist/store/change-merger.js +0 -102
- package/dist/store/event-bridge.js +0 -161
- package/dist/store/index.d.ts +0 -12
- package/dist/store/index.js +0 -4
- package/dist/view/index.d.ts +0 -47
- package/dist/view/index.js +0 -20
- /package/dist/api/{geometry/types.js → datasets.js} +0 -0
- /package/dist/api/{import-export/types.js → document.js} +0 -0
- /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
- /package/dist/{display/index.js → api/events.js} +0 -0
- /package/dist/{modes/index.js → api/extension/context.js} +0 -0
- /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
- /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
- /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
- /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
- /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
- /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
- /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
- /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
- /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
- /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
- /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
- /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
- /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
- /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
- /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
- /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
- /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
- /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
- /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
- /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
- /package/dist/{display → dataset}/chunk-set.js +0 -0
- /package/dist/{display → dataset}/dataset.d.ts +0 -0
- /package/dist/{display → dataset}/manager.js +0 -0
- /package/dist/{display → dataset}/provider.js +0 -0
- /package/dist/{display → dataset}/selection.d.ts +0 -0
- /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,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
|
+
}
|