@chelone/core 0.5.0 → 0.7.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 (253) hide show
  1. package/dist/assistant/assistant-session.d.ts +28 -0
  2. package/dist/assistant/assistant-session.js +208 -0
  3. package/dist/assistant/echo-transport.d.ts +7 -0
  4. package/dist/assistant/echo-transport.js +28 -0
  5. package/dist/assistant/http-transport.d.ts +10 -0
  6. package/dist/assistant/http-transport.js +98 -0
  7. package/dist/assistant/types.d.ts +54 -0
  8. package/dist/auth/access-control.d.ts +13 -5
  9. package/dist/auth/access-control.js +25 -21
  10. package/dist/auth/auth-options.d.ts +21 -17
  11. package/dist/auth/auth-options.js +80 -48
  12. package/dist/auth/permission-matrix.d.ts +12 -0
  13. package/dist/auth/permission-matrix.js +67 -0
  14. package/dist/auth/types.d.ts +14 -4
  15. package/dist/block-editor/block-document.d.ts +60 -0
  16. package/dist/block-editor/block-document.js +143 -0
  17. package/dist/block-editor/data-blocks.d.ts +63 -0
  18. package/dist/block-editor/data-blocks.js +117 -0
  19. package/dist/chart/chart-data.d.ts +25 -0
  20. package/dist/chart/chart-data.js +61 -0
  21. package/dist/command-menu/hotkey.js +58 -47
  22. package/dist/command-menu/recents.js +8 -11
  23. package/dist/command-menu/registry.d.ts +9 -5
  24. package/dist/command-menu/registry.js +36 -46
  25. package/dist/controller/calendar-dates.js +82 -113
  26. package/dist/controller/calendar-events.js +93 -88
  27. package/dist/controller/client-list-controller.d.ts +2 -2
  28. package/dist/controller/client-list-controller.js +251 -254
  29. package/dist/controller/data-table-columns.d.ts +2 -0
  30. package/dist/controller/data-table-columns.js +50 -56
  31. package/dist/controller/deep-equal.d.ts +1 -0
  32. package/dist/controller/deep-equal.js +14 -0
  33. package/dist/controller/filter-toggle.js +36 -44
  34. package/dist/controller/in-place-editor.d.ts +42 -0
  35. package/dist/controller/in-place-editor.js +42 -0
  36. package/dist/controller/infinite-list-controller.js +220 -190
  37. package/dist/controller/inspector.d.ts +49 -0
  38. package/dist/controller/inspector.js +64 -0
  39. package/dist/controller/job-monitor.d.ts +41 -0
  40. package/dist/controller/job-monitor.js +49 -0
  41. package/dist/controller/kanban-board.d.ts +2 -3
  42. package/dist/controller/kanban-board.js +43 -24
  43. package/dist/controller/list-controller.d.ts +5 -5
  44. package/dist/controller/list-controller.js +444 -400
  45. package/dist/controller/list-params.js +96 -87
  46. package/dist/controller/pivot-grid.d.ts +36 -0
  47. package/dist/controller/pivot-grid.js +99 -0
  48. package/dist/controller/prev-next.d.ts +2 -2
  49. package/dist/controller/prev-next.js +74 -54
  50. package/dist/controller/record-controllers.d.ts +14 -6
  51. package/dist/controller/record-controllers.js +288 -257
  52. package/dist/controller/record-diff.d.ts +21 -0
  53. package/dist/controller/record-diff.js +50 -0
  54. package/dist/controller/record-timeline.d.ts +35 -0
  55. package/dist/controller/record-timeline.js +48 -0
  56. package/dist/controller/record-tree.js +57 -47
  57. package/dist/controller/record-workflow.d.ts +38 -16
  58. package/dist/controller/record-workflow.js +85 -64
  59. package/dist/controller/reference-many-controller.js +198 -192
  60. package/dist/controller/reference-one-controller.d.ts +1 -1
  61. package/dist/controller/reference-one-controller.js +63 -56
  62. package/dist/controller/saved-queries.js +104 -91
  63. package/dist/controller/translate-fallback.js +10 -6
  64. package/dist/csv/export.d.ts +2 -1
  65. package/dist/csv/export.js +43 -40
  66. package/dist/csv/import-controller.js +185 -169
  67. package/dist/csv/match-headers.js +29 -22
  68. package/dist/csv/parse-with.js +60 -54
  69. package/dist/csv/run-import.js +69 -72
  70. package/dist/csv/validate-rows.d.ts +1 -1
  71. package/dist/csv/validate-rows.js +65 -52
  72. package/dist/data/cache-ops.d.ts +5 -4
  73. package/dist/data/cache-ops.js +208 -190
  74. package/dist/data/combine-data-providers.js +25 -23
  75. package/dist/data/data-provider-log.d.ts +45 -0
  76. package/dist/data/data-provider-log.js +93 -0
  77. package/dist/data/errors.js +14 -10
  78. package/dist/data/fake-provider.d.ts +6 -3
  79. package/dist/data/fake-provider.js +129 -114
  80. package/dist/data/fetch-utils.js +61 -44
  81. package/dist/data/filter-branch.d.ts +5 -0
  82. package/dist/data/filter-branch.js +10 -0
  83. package/dist/data/get-many-aggregate.js +84 -76
  84. package/dist/data/http-error.js +17 -12
  85. package/dist/data/keys.js +50 -36
  86. package/dist/data/mutation-options.d.ts +14 -9
  87. package/dist/data/mutation-options.js +93 -109
  88. package/dist/data/query-options.js +73 -68
  89. package/dist/data/remove-empty.d.ts +3 -0
  90. package/dist/data/remove-empty.js +11 -0
  91. package/dist/data/undoable.d.ts +2 -2
  92. package/dist/data/undoable.js +190 -174
  93. package/dist/data/with-lifecycle-callbacks.d.ts +45 -17
  94. package/dist/data/with-lifecycle-callbacks.js +66 -52
  95. package/dist/environment/application-update-store.js +58 -55
  96. package/dist/environment/offline-store.js +21 -21
  97. package/dist/form/array-binding.d.ts +30 -11
  98. package/dist/form/array-binding.js +184 -166
  99. package/dist/form/choice-ids.d.ts +7 -0
  100. package/dist/form/choice-ids.js +11 -0
  101. package/dist/form/choices-controller.d.ts +3 -2
  102. package/dist/form/choices-controller.js +302 -275
  103. package/dist/form/date-format.d.ts +38 -0
  104. package/dist/form/date-format.js +89 -0
  105. package/dist/form/dirty-values.d.ts +2 -2
  106. package/dist/form/dirty-values.js +22 -11
  107. package/dist/form/duration.d.ts +22 -0
  108. package/dist/form/duration.js +49 -0
  109. package/dist/form/edit-create-form.d.ts +12 -5
  110. package/dist/form/edit-create-form.js +243 -188
  111. package/dist/form/event-value.d.ts +6 -0
  112. package/dist/form/event-value.js +17 -0
  113. package/dist/form/field-error.d.ts +14 -0
  114. package/dist/form/field-error.js +28 -0
  115. package/dist/form/field-name.d.ts +20 -0
  116. package/dist/form/field-name.js +6 -0
  117. package/dist/form/filter-form-values.js +63 -49
  118. package/dist/form/form-controller.d.ts +9 -1
  119. package/dist/form/form-controller.js +165 -160
  120. package/dist/form/form-groups.d.ts +4 -3
  121. package/dist/form/form-groups.js +79 -79
  122. package/dist/form/form-handle.d.ts +175 -0
  123. package/dist/form/form-handle.js +68 -0
  124. package/dist/form/input-binding.d.ts +56 -31
  125. package/dist/form/input-binding.js +169 -118
  126. package/dist/form/input-values.d.ts +130 -0
  127. package/dist/form/input-values.js +177 -0
  128. package/dist/form/json-text.js +51 -37
  129. package/dist/form/save-pipeline.d.ts +6 -8
  130. package/dist/form/save-pipeline.js +91 -82
  131. package/dist/form/set-form-values.d.ts +6 -0
  132. package/dist/form/set-form-values.js +10 -0
  133. package/dist/form/source.js +97 -65
  134. package/dist/form/text-of.d.ts +2 -0
  135. package/dist/form/text-of.js +7 -0
  136. package/dist/form/validators.d.ts +58 -19
  137. package/dist/form/validators.js +97 -71
  138. package/dist/geo/bbox.d.ts +5 -4
  139. package/dist/geo/bbox.js +69 -48
  140. package/dist/geo/bounds.d.ts +14 -3
  141. package/dist/geo/bounds.js +98 -68
  142. package/dist/geo/constraints.js +88 -93
  143. package/dist/geo/coordinates.js +31 -23
  144. package/dist/geo/editor.d.ts +13 -13
  145. package/dist/geo/editor.js +176 -153
  146. package/dist/geo/geocoding.d.ts +4 -4
  147. package/dist/geo/geocoding.js +38 -41
  148. package/dist/geo/geojson.d.ts +12 -74
  149. package/dist/geo/geojson.js +52 -40
  150. package/dist/geo/geometry-math.d.ts +4 -4
  151. package/dist/geo/geometry-math.js +100 -93
  152. package/dist/geo/index.d.ts +7 -6
  153. package/dist/geo/map-layers.d.ts +42 -7
  154. package/dist/geo/map-layers.js +88 -62
  155. package/dist/geo/map-style.js +31 -32
  156. package/dist/geo/messages.js +48 -45
  157. package/dist/geo/nominatim.js +88 -80
  158. package/dist/geo/osm-presets.d.ts +4 -3
  159. package/dist/geo/osm-presets.js +108 -86
  160. package/dist/geo/osm-tags.js +14 -12
  161. package/dist/geo/overpass.d.ts +14 -2
  162. package/dist/geo/overpass.js +83 -90
  163. package/dist/geo/shape-value.d.ts +9 -5
  164. package/dist/geo/shape-value.js +169 -146
  165. package/dist/geo/snap-to-roads.d.ts +3 -3
  166. package/dist/geo/snap-to-roads.js +55 -50
  167. package/dist/geo/throttle.js +36 -39
  168. package/dist/guards.d.ts +37 -0
  169. package/dist/guards.js +62 -0
  170. package/dist/i18n/default-messages.js +34 -29
  171. package/dist/i18n/english-messages.js +187 -189
  172. package/dist/i18n/i18n.d.ts +8 -2
  173. package/dist/i18n/i18n.js +47 -48
  174. package/dist/i18n/inflection.d.ts +34 -0
  175. package/dist/i18n/inflection.js +82 -0
  176. package/dist/i18n/messages.d.ts +10 -2
  177. package/dist/i18n/messages.js +17 -4
  178. package/dist/i18n/missing-keys.d.ts +19 -0
  179. package/dist/i18n/missing-keys.js +68 -0
  180. package/dist/i18n/translatable.d.ts +16 -1
  181. package/dist/i18n/translatable.js +40 -47
  182. package/dist/index.d.ts +96 -22
  183. package/dist/index.js +52 -257
  184. package/dist/json/deep-equal.d.ts +8 -0
  185. package/dist/json/deep-equal.js +24 -0
  186. package/dist/json/strip-json-comments.js +38 -42
  187. package/dist/noop.d.ts +2 -0
  188. package/dist/noop.js +4 -0
  189. package/dist/notification/error-message.d.ts +2 -0
  190. package/dist/notification/error-message.js +10 -0
  191. package/dist/notification/notification-store.d.ts +3 -2
  192. package/dist/notification/notification-store.js +41 -45
  193. package/dist/onboarding-tour/placement.d.ts +34 -0
  194. package/dist/onboarding-tour/placement.js +67 -0
  195. package/dist/onboarding-tour/tour-controller.d.ts +25 -0
  196. package/dist/onboarding-tour/tour-controller.js +50 -0
  197. package/dist/realtime/add-events-for-mutations.js +75 -81
  198. package/dist/realtime/announce-lock.d.ts +7 -0
  199. package/dist/realtime/announce-lock.js +18 -0
  200. package/dist/realtime/broadcast-channel-transport.d.ts +14 -0
  201. package/dist/realtime/broadcast-channel-transport.js +69 -0
  202. package/dist/realtime/copy-members.js +22 -14
  203. package/dist/realtime/in-memory-lock-provider.js +41 -60
  204. package/dist/realtime/live.js +95 -101
  205. package/dist/realtime/lock-options.js +16 -16
  206. package/dist/realtime/lock-session.js +91 -78
  207. package/dist/realtime/memory-transport.js +26 -67
  208. package/dist/realtime/presence.js +120 -122
  209. package/dist/realtime/realtime-data-provider.d.ts +10 -0
  210. package/dist/realtime/realtime-data-provider.js +45 -42
  211. package/dist/realtime/reconnect-backoff.d.ts +15 -0
  212. package/dist/realtime/reconnect-backoff.js +17 -0
  213. package/dist/realtime/sse-transport.d.ts +31 -0
  214. package/dist/realtime/sse-transport.js +235 -0
  215. package/dist/realtime/status-store.js +23 -28
  216. package/dist/realtime/topic-hub.d.ts +24 -0
  217. package/dist/realtime/topic-hub.js +66 -0
  218. package/dist/realtime/topics.js +10 -12
  219. package/dist/realtime/types.js +10 -12
  220. package/dist/realtime/unread-count.js +21 -21
  221. package/dist/realtime/websocket-transport.d.ts +32 -0
  222. package/dist/realtime/websocket-transport.js +306 -0
  223. package/dist/resource/describe-resource.d.ts +2 -0
  224. package/dist/resource/describe-resource.js +232 -219
  225. package/dist/resource/get-at-path.js +29 -14
  226. package/dist/resource/identifier.d.ts +18 -0
  227. package/dist/resource/identifier.js +27 -0
  228. package/dist/resource/record.d.ts +4 -0
  229. package/dist/resource/record.js +10 -0
  230. package/dist/resource/register.d.ts +7 -0
  231. package/dist/resource/registry-store.d.ts +45 -15
  232. package/dist/resource/registry-store.js +67 -60
  233. package/dist/resource/registry.d.ts +10 -0
  234. package/dist/resource/registry.js +8 -4
  235. package/dist/resource/source-path.d.ts +16 -1
  236. package/dist/rich-text/rich-text-extras.d.ts +132 -0
  237. package/dist/rich-text/rich-text-extras.js +179 -0
  238. package/dist/rich-text/rich-text-image.d.ts +124 -0
  239. package/dist/rich-text/rich-text-image.js +163 -0
  240. package/dist/rich-text/rich-text.d.ts +62 -0
  241. package/dist/rich-text/rich-text.js +142 -0
  242. package/dist/router/location.d.ts +22 -4
  243. package/dist/router/location.js +41 -18
  244. package/dist/router/match.js +47 -39
  245. package/dist/router/paths.js +40 -34
  246. package/dist/router/record-from-location.d.ts +1 -1
  247. package/dist/router/record-from-location.js +25 -17
  248. package/dist/store/adapters.js +51 -55
  249. package/dist/store/micro-store.js +57 -59
  250. package/dist/store/shallow-equal.d.ts +12 -0
  251. package/dist/store/shallow-equal.js +20 -0
  252. package/dist/store/store.js +54 -57
  253. package/package.json +13 -11
@@ -1,168 +1,191 @@
1
+ import { isJsonObject } from "../guards.js";
1
2
  import { isGeoGeometry } from "./geojson.js";
2
- const EDITOR_PROPERTIES = {
3
- mode: "mode",
4
- currentlyDrawing: "currentlyDrawing",
5
- edited: "edited",
6
- closingPoint: "closingPoint",
7
- snappingPoint: "snappingPoint",
8
- coordinatePoint: "coordinatePoint",
9
- coordinatePointFeatureId: "coordinatePointFeatureId",
10
- coordinatePointIds: "coordinatePointIds",
11
- provisionalCoordinateCount: "provisionalCoordinateCount",
12
- committedCoordinateCount: "committedCoordinateCount",
13
- marker: "marker",
14
- selected: "selected",
15
- midPoint: "midPoint",
16
- selectionPointFeatureId: "selectionPointFeatureId",
17
- selectionPoint: "selectionPoint"
3
+ // src/geo/editor.ts
4
+ var EDITOR_PROPERTIES = {
5
+ mode: "mode",
6
+ currentlyDrawing: "currentlyDrawing",
7
+ edited: "edited",
8
+ closingPoint: "closingPoint",
9
+ snappingPoint: "snappingPoint",
10
+ coordinatePoint: "coordinatePoint",
11
+ coordinatePointFeatureId: "coordinatePointFeatureId",
12
+ coordinatePointIds: "coordinatePointIds",
13
+ provisionalCoordinateCount: "provisionalCoordinateCount",
14
+ committedCoordinateCount: "committedCoordinateCount",
15
+ marker: "marker",
16
+ selected: "selected",
17
+ midPoint: "midPoint",
18
+ selectionPointFeatureId: "selectionPointFeatureId",
19
+ selectionPoint: "selectionPoint"
18
20
  };
19
- const HELPER_FLAGS = [
20
- EDITOR_PROPERTIES.selectionPoint,
21
- EDITOR_PROPERTIES.midPoint,
22
- EDITOR_PROPERTIES.closingPoint,
23
- EDITOR_PROPERTIES.snappingPoint,
24
- EDITOR_PROPERTIES.coordinatePoint,
25
- EDITOR_PROPERTIES.currentlyDrawing
21
+ /** Flags that mark a feature the editor made for itself, not the user's shape. */
22
+ var HELPER_FLAGS = [
23
+ EDITOR_PROPERTIES.selectionPoint,
24
+ EDITOR_PROPERTIES.midPoint,
25
+ EDITOR_PROPERTIES.closingPoint,
26
+ EDITOR_PROPERTIES.snappingPoint,
27
+ EDITOR_PROPERTIES.coordinatePoint,
28
+ EDITOR_PROPERTIES.currentlyDrawing
26
29
  ];
27
- const EDITOR_OWN_PROPERTIES = [
28
- ...Object.values(EDITOR_PROPERTIES),
29
- "radiusKilometers"
30
- ];
31
- const SOURCE_ID = "chelone:id";
32
- const SOURCE_PROPERTIES = "chelone:properties";
33
- const MODES = {
34
- Point: "point",
35
- LineString: "linestring",
36
- Polygon: "polygon"
30
+ /**
31
+ * Properties the editor adds to a user's own feature. `radiusKilometers` is
32
+ * written by its circle mode and is a literal in its source, not a constant.
33
+ */
34
+ var EDITOR_OWN_PROPERTIES = [...Object.values(EDITOR_PROPERTIES), "radiusKilometers"];
35
+ /** Where the editor keeps the id a feature had before it went in. */
36
+ var SOURCE_ID = "chelone:id";
37
+ /**
38
+ * Where the editor keeps the properties a feature had before it went in, so
39
+ * none of them can be mistaken for its own flags.
40
+ */
41
+ var SOURCE_PROPERTIES = "chelone:properties";
42
+ var MODES = {
43
+ Point: "point",
44
+ LineString: "linestring",
45
+ Polygon: "polygon"
37
46
  };
38
- const EDITOR_DECIMALS = 9;
39
- function editorPosition([longitude, latitude]) {
40
- const wrapped = longitude >= -180 && longitude <= 180 ? longitude : ((longitude + 180) % 360 + 360) % 360 - 180;
41
- return [
42
- Number(wrapped.toFixed(EDITOR_DECIMALS)) + 0,
43
- Number(latitude.toFixed(EDITOR_DECIMALS)) + 0
44
- ];
47
+ /** Decimals the editor accepts in a position. */
48
+ var EDITOR_DECIMALS = 9;
49
+ /**
50
+ * A position as the editor accepts it: longitude wrapped into -180 to 180,
51
+ * both numbers rounded to 9 decimals, and any altitude dropped.
52
+ */
53
+ function editorPosition([longitude = NaN, latitude = NaN]) {
54
+ const wrapped = longitude >= -180 && longitude <= 180 ? longitude : ((longitude + 180) % 360 + 360) % 360 - 180;
55
+ return [Number(wrapped.toFixed(EDITOR_DECIMALS)) + 0, Number(latitude.toFixed(EDITOR_DECIMALS)) + 0];
45
56
  }
46
57
  function editorGeometry(geometry) {
47
- switch (geometry.type) {
48
- case "Point":
49
- return { ...geometry, coordinates: editorPosition(geometry.coordinates) };
50
- case "LineString":
51
- return {
52
- ...geometry,
53
- coordinates: geometry.coordinates.map(editorPosition)
54
- };
55
- case "Polygon":
56
- return {
57
- ...geometry,
58
- coordinates: geometry.coordinates.map(
59
- (ring) => ring.map(editorPosition)
60
- )
61
- };
62
- }
58
+ switch (geometry.type) {
59
+ case "Point": return {
60
+ ...geometry,
61
+ coordinates: editorPosition(geometry.coordinates)
62
+ };
63
+ case "LineString": return {
64
+ ...geometry,
65
+ coordinates: geometry.coordinates.map(editorPosition)
66
+ };
67
+ case "Polygon": return {
68
+ ...geometry,
69
+ coordinates: geometry.coordinates.map((ring) => ring.map(editorPosition))
70
+ };
71
+ }
63
72
  }
73
+ /**
74
+ * Copies of the features the editor can hold, each with a fresh `id` from
75
+ * `getId` and a `properties.mode` naming its drawing mode. The editor refuses
76
+ * an id its own strategy did not make, so the source `id` moves to
77
+ * `properties["chelone:id"]`, and the source properties move whole to
78
+ * `properties["chelone:properties"]`. Features it cannot hold are left out.
79
+ * The editor refuses a position with more than 9 decimals, an altitude or a
80
+ * longitude outside -180 to 180, so each copy's positions are rounded to 9
81
+ * decimals, cut to longitude and latitude, and wrapped. The source is not
82
+ * rewritten.
83
+ */
64
84
  function toEditorFeatures(features, getId) {
65
- const result = [];
66
- for (const feature of features) {
67
- const geometry = feature.geometry;
68
- if (!geometry || geometry.type !== "Point" && geometry.type !== "LineString" && geometry.type !== "Polygon" || geometry.type === "Polygon" && geometry.coordinates.length !== 1) {
69
- continue;
70
- }
71
- const properties = {
72
- mode: MODES[geometry.type],
73
- [SOURCE_PROPERTIES]: { ...feature.properties }
74
- };
75
- if (feature.id !== void 0) properties[SOURCE_ID] = feature.id;
76
- result.push({
77
- type: "Feature",
78
- id: getId(),
79
- geometry: editorGeometry(geometry),
80
- properties
81
- });
82
- }
83
- return result;
84
- }
85
- function isPlainObject(value) {
86
- return typeof value === "object" && value !== null && !Array.isArray(value);
85
+ const result = [];
86
+ for (const feature of features) {
87
+ const geometry = feature.geometry;
88
+ if (!geometry || geometry.type !== "Point" && geometry.type !== "LineString" && geometry.type !== "Polygon" || geometry.type === "Polygon" && geometry.coordinates.length !== 1) continue;
89
+ const properties = {
90
+ mode: MODES[geometry.type],
91
+ [SOURCE_PROPERTIES]: { ...feature.properties }
92
+ };
93
+ if (feature.id !== void 0) properties[SOURCE_ID] = feature.id;
94
+ result.push({
95
+ type: "Feature",
96
+ id: getId(),
97
+ geometry: editorGeometry(geometry),
98
+ properties
99
+ });
100
+ }
101
+ return result;
87
102
  }
103
+ /**
104
+ * The user's features in an editor snapshot: its helper features (selection
105
+ * points, midpoints, closing points, snapping points and a feature still being
106
+ * drawn) are dropped, and `id` and `properties` come back from `chelone:id`
107
+ * and `chelone:properties`. A feature the editor made has no `id`, and keeps
108
+ * its properties but for the editor's own. A feature with a coordinate that is
109
+ * not a finite number, or a `chelone:properties` that is not a JSON object, is
110
+ * left out.
111
+ */
88
112
  function fromEditorFeatures(snapshot) {
89
- const result = [];
90
- for (const entry of snapshot) {
91
- const source = { ...entry.properties };
92
- if (HELPER_FLAGS.some((flag) => source[flag])) continue;
93
- if (!isGeoGeometry(entry.geometry)) continue;
94
- const kept = source[SOURCE_PROPERTIES];
95
- const properties = isPlainObject(kept) ? { ...kept } : Object.fromEntries(
96
- Object.entries(source).filter(
97
- ([key]) => key !== SOURCE_ID && key !== SOURCE_PROPERTIES && !EDITOR_OWN_PROPERTIES.includes(key)
98
- )
99
- );
100
- const feature = {
101
- type: "Feature",
102
- geometry: entry.geometry,
103
- properties
104
- };
105
- const id = source[SOURCE_ID];
106
- if (typeof id === "string" || typeof id === "number") feature.id = id;
107
- result.push(feature);
108
- }
109
- return result;
113
+ const result = [];
114
+ for (const entry of snapshot) {
115
+ const source = { ...entry.properties };
116
+ if (HELPER_FLAGS.some((flag) => source[flag])) continue;
117
+ if (!isGeoGeometry(entry.geometry)) continue;
118
+ const kept = source[SOURCE_PROPERTIES];
119
+ if (SOURCE_PROPERTIES in source && !isJsonObject(kept)) continue;
120
+ const properties = isJsonObject(kept) ? { ...kept } : Object.fromEntries(Object.entries(source).filter(([key]) => key !== SOURCE_ID && key !== SOURCE_PROPERTIES && !EDITOR_OWN_PROPERTIES.includes(key)));
121
+ const feature = {
122
+ type: "Feature",
123
+ geometry: entry.geometry,
124
+ properties
125
+ };
126
+ const id = source[SOURCE_ID];
127
+ if (typeof id === "string" || typeof id === "number") feature.id = id;
128
+ result.push(feature);
129
+ }
130
+ return result;
110
131
  }
132
+ /** Keeps the keys whose value is set. */
111
133
  function defined(entries) {
112
- const result = {};
113
- for (const [key, value] of Object.entries(entries)) {
114
- if (value !== void 0) result[key] = value;
115
- }
116
- return result;
134
+ const result = {};
135
+ for (const [key, value] of Object.entries(entries)) if (value !== void 0) result[key] = value;
136
+ return result;
117
137
  }
138
+ /**
139
+ * Maps a {@link ShapeStyle} onto the style keys of each Terra Draw mode. A key
140
+ * with no value in `style` is left out so the mode keeps its own default.
141
+ * `pointRadius` becomes a width, the diameter.
142
+ */
118
143
  function editorStyles(style) {
119
- const fill = style.fillColor ?? style.color;
120
- const width = style.pointRadius === void 0 ? void 0 : style.pointRadius * 2;
121
- const area = defined({
122
- fillColor: fill,
123
- fillOpacity: style.fillOpacity,
124
- outlineColor: style.color,
125
- outlineWidth: style.weight,
126
- outlineOpacity: style.opacity
127
- });
128
- return {
129
- point: defined({ pointColor: style.pointColor, pointWidth: width }),
130
- linestring: defined({
131
- lineStringColor: style.color,
132
- lineStringWidth: style.weight,
133
- lineStringOpacity: style.opacity
134
- }),
135
- polygon: area,
136
- rectangle: { ...area },
137
- circle: { ...area },
138
- render: defined({
139
- pointColor: style.pointColor,
140
- pointWidth: width,
141
- lineStringColor: style.color,
142
- lineStringWidth: style.weight,
143
- lineStringOpacity: style.opacity,
144
- polygonFillColor: fill,
145
- polygonFillOpacity: style.fillOpacity,
146
- polygonOutlineColor: style.color,
147
- polygonOutlineWidth: style.weight
148
- }),
149
- select: defined({
150
- selectedPointColor: style.pointColor,
151
- selectedPointWidth: width,
152
- selectedLineStringColor: style.color,
153
- selectedLineStringWidth: style.weight,
154
- selectedLineStringOpacity: style.opacity,
155
- selectedPolygonColor: fill,
156
- selectedPolygonFillOpacity: style.fillOpacity,
157
- selectedPolygonOutlineColor: style.color,
158
- selectedPolygonOutlineWidth: style.weight,
159
- selectedPolygonOutlineOpacity: style.opacity
160
- })
161
- };
144
+ const fill = style.fillColor ?? style.color;
145
+ const width = style.pointRadius === void 0 ? void 0 : style.pointRadius * 2;
146
+ const area = defined({
147
+ fillColor: fill,
148
+ fillOpacity: style.fillOpacity,
149
+ outlineColor: style.color,
150
+ outlineWidth: style.weight,
151
+ outlineOpacity: style.opacity
152
+ });
153
+ return {
154
+ point: defined({
155
+ pointColor: style.pointColor,
156
+ pointWidth: width
157
+ }),
158
+ linestring: defined({
159
+ lineStringColor: style.color,
160
+ lineStringWidth: style.weight,
161
+ lineStringOpacity: style.opacity
162
+ }),
163
+ polygon: area,
164
+ rectangle: { ...area },
165
+ circle: { ...area },
166
+ render: defined({
167
+ pointColor: style.pointColor,
168
+ pointWidth: width,
169
+ lineStringColor: style.color,
170
+ lineStringWidth: style.weight,
171
+ lineStringOpacity: style.opacity,
172
+ polygonFillColor: fill,
173
+ polygonFillOpacity: style.fillOpacity,
174
+ polygonOutlineColor: style.color,
175
+ polygonOutlineWidth: style.weight
176
+ }),
177
+ select: defined({
178
+ selectedPointColor: style.pointColor,
179
+ selectedPointWidth: width,
180
+ selectedLineStringColor: style.color,
181
+ selectedLineStringWidth: style.weight,
182
+ selectedLineStringOpacity: style.opacity,
183
+ selectedPolygonColor: fill,
184
+ selectedPolygonFillOpacity: style.fillOpacity,
185
+ selectedPolygonOutlineColor: style.color,
186
+ selectedPolygonOutlineWidth: style.weight,
187
+ selectedPolygonOutlineOpacity: style.opacity
188
+ })
189
+ };
162
190
  }
163
- export {
164
- EDITOR_PROPERTIES,
165
- editorStyles,
166
- fromEditorFeatures,
167
- toEditorFeatures
168
- };
191
+ export { EDITOR_PROPERTIES, editorStyles, fromEditorFeatures, toEditorFeatures };
@@ -1,11 +1,11 @@
1
1
  import type { QueryFunctionContext } from "@tanstack/query-core";
2
- import type { GeoBBox } from "./geojson.js";
2
+ import type { LngLatBox } from "./bounds.js";
3
3
  export interface GeocodeResult {
4
4
  displayName: string;
5
5
  lat: number;
6
6
  lng: number;
7
7
  /** `[west, south, east, north]`. */
8
- bbox?: GeoBBox;
8
+ bbox?: LngLatBox;
9
9
  /** The service's own kind of place, such as `city` or `house`. */
10
10
  type?: string;
11
11
  /** The service's unmapped hit, for fields core does not model. */
@@ -19,7 +19,7 @@ export interface GeocodeSearchOptions extends GeocodeRequestOptions {
19
19
  /** ISO 3166-1 alpha-2 codes to restrict the search to. */
20
20
  countryCodes?: string[];
21
21
  /** `[west, south, east, north]` to favour or restrict hits to. */
22
- viewBox?: GeoBBox;
22
+ viewBox?: LngLatBox;
23
23
  }
24
24
  export interface GeocodingProvider {
25
25
  name: string;
@@ -45,7 +45,7 @@ export interface GeocodeQueryOptions extends ReverseGeocodeQueryOptions {
45
45
  minChars?: number;
46
46
  limit?: number;
47
47
  countryCodes?: string[];
48
- viewBox?: GeoBBox;
48
+ viewBox?: LngLatBox;
49
49
  }
50
50
  export interface GeocodeQuery<TData> {
51
51
  queryKey: readonly unknown[];
@@ -1,45 +1,42 @@
1
- const FIVE_MINUTES_MS = 5 * 60 * 1e3;
1
+ // src/geo/geocoding.ts
2
+ var FIVE_MINUTES_MS = 3e5;
3
+ /** Query options for `useQuery`; the query's `signal` reaches the provider. */
2
4
  function geocodeQueryOptions(provider, query, options = {}) {
3
- const {
4
- minChars = 3,
5
- limit,
6
- countryCodes,
7
- viewBox,
8
- staleTime = FIVE_MINUTES_MS
9
- } = options;
10
- const trimmed = query.trim();
11
- return {
12
- queryKey: [
13
- "geocode",
14
- provider.cacheKey ?? provider.name,
15
- trimmed,
16
- countryCodes ?? null,
17
- viewBox ?? null,
18
- limit ?? null
19
- ],
20
- queryFn: ({ signal }) => provider.search(trimmed, { signal, limit, countryCodes, viewBox }),
21
- enabled: trimmed.length >= minChars,
22
- staleTime,
23
- // A rate-limited public service is not hit again; the caller reports the failure.
24
- retry: false
25
- };
5
+ const { minChars = 3, limit, countryCodes, viewBox, staleTime = FIVE_MINUTES_MS } = options;
6
+ const trimmed = query.trim();
7
+ return {
8
+ queryKey: [
9
+ "geocode",
10
+ provider.cacheKey ?? provider.name,
11
+ trimmed,
12
+ countryCodes ?? null,
13
+ viewBox ?? null,
14
+ limit ?? null
15
+ ],
16
+ queryFn: ({ signal }) => provider.search(trimmed, {
17
+ signal,
18
+ limit,
19
+ countryCodes,
20
+ viewBox
21
+ }),
22
+ enabled: trimmed.length >= minChars,
23
+ staleTime,
24
+ retry: false
25
+ };
26
26
  }
27
- const round5 = (value) => Math.round(value * 1e5) / 1e5;
27
+ var round5 = (value) => Math.round(value * 1e5) / 1e5;
28
28
  function reverseGeocodeQueryOptions(provider, position, options = {}) {
29
- const { lat, lng } = position;
30
- return {
31
- queryKey: [
32
- "reverse-geocode",
33
- provider.cacheKey ?? provider.name,
34
- round5(lat),
35
- round5(lng)
36
- ],
37
- queryFn: ({ signal }) => provider.reverse(lat, lng, { signal }),
38
- enabled: Number.isFinite(lat) && Number.isFinite(lng),
39
- staleTime: options.staleTime ?? FIVE_MINUTES_MS
40
- };
29
+ const { lat, lng } = position;
30
+ return {
31
+ queryKey: [
32
+ "reverse-geocode",
33
+ provider.cacheKey ?? provider.name,
34
+ round5(lat),
35
+ round5(lng)
36
+ ],
37
+ queryFn: ({ signal }) => provider.reverse(lat, lng, { signal }),
38
+ enabled: Number.isFinite(lat) && Number.isFinite(lng),
39
+ staleTime: options.staleTime ?? FIVE_MINUTES_MS
40
+ };
41
41
  }
42
- export {
43
- geocodeQueryOptions,
44
- reverseGeocodeQueryOptions
45
- };
42
+ export { geocodeQueryOptions, reverseGeocodeQueryOptions };
@@ -1,75 +1,13 @@
1
- /** `[longitude, latitude]` with an optional altitude and further members. */
2
- export type GeoPosition = [
3
- longitude: number,
4
- latitude: number,
5
- ...rest: number[]
6
- ];
7
- /** `[west, south, east, north]`. */
8
- export type GeoBBox = [
9
- west: number,
10
- south: number,
11
- east: number,
12
- north: number
13
- ];
14
- /** `[west, south, min altitude, east, north, max altitude]`. */
15
- export type GeoBBox3D = [
16
- west: number,
17
- south: number,
18
- minAltitude: number,
19
- east: number,
20
- north: number,
21
- maxAltitude: number
22
- ];
23
- interface GeoGeometryBase {
24
- bbox?: GeoBBox | GeoBBox3D;
25
- }
26
- export interface GeoPoint extends GeoGeometryBase {
27
- type: "Point";
28
- coordinates: GeoPosition;
29
- }
30
- export interface GeoMultiPoint extends GeoGeometryBase {
31
- type: "MultiPoint";
32
- coordinates: GeoPosition[];
33
- }
34
- export interface GeoLineString extends GeoGeometryBase {
35
- type: "LineString";
36
- coordinates: GeoPosition[];
37
- }
38
- export interface GeoMultiLineString extends GeoGeometryBase {
39
- type: "MultiLineString";
40
- coordinates: GeoPosition[][];
41
- }
42
- export interface GeoPolygon extends GeoGeometryBase {
43
- type: "Polygon";
44
- coordinates: GeoPosition[][];
45
- }
46
- export interface GeoMultiPolygon extends GeoGeometryBase {
47
- type: "MultiPolygon";
48
- coordinates: GeoPosition[][][];
49
- }
50
- export interface GeoGeometryCollection extends GeoGeometryBase {
51
- type: "GeometryCollection";
52
- geometries: GeoGeometry[];
53
- }
54
- export type GeoGeometry = GeoPoint | GeoMultiPoint | GeoLineString | GeoMultiLineString | GeoPolygon | GeoMultiPolygon | GeoGeometryCollection;
55
- export interface GeoFeature {
56
- type: "Feature";
57
- geometry: GeoGeometry | null;
58
- properties: Record<string, unknown> | null;
59
- id?: string | number;
60
- bbox?: GeoBBox | GeoBBox3D;
61
- }
62
- export interface GeoFeatureCollection {
63
- type: "FeatureCollection";
64
- features: GeoFeature[];
65
- bbox?: GeoBBox | GeoBBox3D;
66
- }
67
- /** What a map input stores: a geometry, a Feature or a FeatureCollection. */
68
- export type GeoJsonValue = GeoGeometry | GeoFeature | GeoFeatureCollection;
1
+ import type { Feature, FeatureCollection, Geometry, MultiPolygon, Polygon } from "geojson";
2
+ import { type JsonObject } from "../guards.js";
3
+ export type { Feature, FeatureCollection, Geometry } from "geojson";
69
4
  /** True for exactly four finite numbers. */
70
- export declare function isGeoBBox(value: unknown): value is GeoBBox;
71
- export declare function isGeoGeometry(value: unknown): value is GeoGeometry;
72
- export declare function isGeoFeature(value: unknown): value is GeoFeature;
73
- export declare function isGeoFeatureCollection(value: unknown): value is GeoFeatureCollection;
74
- export declare function isGeoJsonValue(value: unknown): value is GeoJsonValue;
75
- export {};
5
+ export declare function isGeoBBox(value: unknown): value is [number, number, number, number];
6
+ export declare function isGeoGeometry(value: unknown): value is Geometry;
7
+ /** A Polygon or a MultiPolygon, the geometries turf's area operations take. */
8
+ export declare function isGeoArea(value: unknown): value is Polygon | MultiPolygon;
9
+ export declare function isGeoFeature(value: unknown): value is Feature<Geometry | null, JsonObject | null>;
10
+ export declare function isGeoFeatureCollection(value: unknown): value is FeatureCollection<Geometry | null, JsonObject | null>;
11
+ export declare function isGeoJsonValue(value: unknown): value is Geometry | Feature<Geometry | null, JsonObject | null> | FeatureCollection<Geometry | null, JsonObject | null>;
12
+ /** The features MapLibre draws: a feature with a null geometry has nothing to draw. */
13
+ export declare function placedFeatures(collection: FeatureCollection<Geometry | null, JsonObject | null>): FeatureCollection<Geometry, JsonObject | null>;