@honua/react 0.1.11-beta.0 → 0.1.13

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 (193) hide show
  1. package/columnar/apache-arrow.d.ts +17 -0
  2. package/columnar/apache-arrow.d.ts.map +1 -0
  3. package/columnar/apache-arrow.js +1036 -0
  4. package/columnar/batch-cache-conformance.d.ts +66 -0
  5. package/columnar/batch-cache-conformance.d.ts.map +1 -0
  6. package/columnar/batch-cache-conformance.js +317 -0
  7. package/columnar/batch-cache-indexeddb.d.ts +31 -0
  8. package/columnar/batch-cache-indexeddb.d.ts.map +1 -0
  9. package/columnar/batch-cache-indexeddb.js +148 -0
  10. package/columnar/batch-cache.d.ts +298 -0
  11. package/columnar/batch-cache.d.ts.map +1 -0
  12. package/columnar/batch-cache.js +757 -0
  13. package/columnar/geoarrow-aggregate.d.ts +178 -0
  14. package/columnar/geoarrow-aggregate.d.ts.map +1 -0
  15. package/columnar/geoarrow-aggregate.js +976 -0
  16. package/columnar/geoarrow-patch.d.ts +382 -0
  17. package/columnar/geoarrow-patch.d.ts.map +1 -0
  18. package/columnar/geoarrow-patch.js +1656 -0
  19. package/columnar/geoarrow-reproject.d.ts +22 -0
  20. package/columnar/geoarrow-reproject.d.ts.map +1 -0
  21. package/columnar/geoarrow-reproject.js +119 -0
  22. package/columnar/geoarrow-serialization.d.ts +68 -0
  23. package/columnar/geoarrow-serialization.d.ts.map +1 -0
  24. package/columnar/geoarrow-serialization.js +331 -0
  25. package/columnar/geoarrow-types.d.ts +271 -0
  26. package/columnar/geoarrow-types.d.ts.map +1 -0
  27. package/columnar/geoarrow-types.js +15 -0
  28. package/columnar/geoarrow.d.ts +52 -0
  29. package/columnar/geoarrow.d.ts.map +1 -0
  30. package/columnar/geoarrow.js +1469 -0
  31. package/columnar/index.d.ts +43 -0
  32. package/columnar/index.d.ts.map +1 -0
  33. package/columnar/index.js +29 -0
  34. package/columnar/operators.d.ts +70 -0
  35. package/columnar/operators.d.ts.map +1 -0
  36. package/columnar/operators.js +307 -0
  37. package/columnar/result.d.ts +369 -0
  38. package/columnar/result.d.ts.map +1 -0
  39. package/columnar/result.js +815 -0
  40. package/columnar/telemetry.d.ts +152 -0
  41. package/columnar/telemetry.d.ts.map +1 -0
  42. package/columnar/telemetry.js +265 -0
  43. package/columnar/transfer.d.ts +28 -0
  44. package/columnar/transfer.d.ts.map +1 -0
  45. package/columnar/transfer.js +669 -0
  46. package/columnar/types.d.ts +175 -0
  47. package/columnar/types.d.ts.map +1 -0
  48. package/columnar/types.js +22 -0
  49. package/columnar/worker.d.ts +157 -0
  50. package/columnar/worker.d.ts.map +1 -0
  51. package/columnar/worker.js +1059 -0
  52. package/connect-url-safety.d.ts +53 -0
  53. package/connect-url-safety.js +189 -0
  54. package/contract/pmtiles.d.ts +6 -5
  55. package/contract/pmtiles.d.ts.map +1 -1
  56. package/contract/pmtiles.js +30 -5
  57. package/control-plane/generated/admin-operations.d.ts +3 -3
  58. package/control-plane/generated/admin-operations.d.ts.map +1 -1
  59. package/control-plane/generated/admin-operations.js +3 -3
  60. package/core/client.d.ts.map +1 -1
  61. package/core/client.js +87 -19
  62. package/core/deprecation-notice.d.ts +28 -0
  63. package/core/deprecation-notice.d.ts.map +1 -0
  64. package/core/deprecation-notice.js +22 -0
  65. package/core/esri-geojson.d.ts.map +1 -1
  66. package/core/esri-geojson.js +10 -6
  67. package/core/optional-grpc-peer.d.ts +15 -0
  68. package/core/optional-grpc-peer.d.ts.map +1 -0
  69. package/core/optional-grpc-peer.js +60 -0
  70. package/esri-compat/basemap-gallery.d.ts +2 -0
  71. package/esri-compat/basemap-gallery.d.ts.map +1 -1
  72. package/esri-compat/basemap-gallery.js +12 -0
  73. package/esri-compat/basemap.d.ts +4 -0
  74. package/esri-compat/basemap.d.ts.map +1 -1
  75. package/esri-compat/basemap.js +70 -0
  76. package/esri-compat/bookmarks.d.ts +2 -0
  77. package/esri-compat/bookmarks.d.ts.map +1 -1
  78. package/esri-compat/bookmarks.js +12 -0
  79. package/esri-compat/controls.d.ts +18 -0
  80. package/esri-compat/controls.d.ts.map +1 -1
  81. package/esri-compat/controls.js +120 -57
  82. package/esri-compat/directions.d.ts +4 -0
  83. package/esri-compat/directions.d.ts.map +1 -1
  84. package/esri-compat/directions.js +30 -20
  85. package/esri-compat/editor.d.ts +4 -0
  86. package/esri-compat/editor.d.ts.map +1 -1
  87. package/esri-compat/editor.js +16 -0
  88. package/esri-compat/esri-config.d.ts +2 -1
  89. package/esri-compat/esri-config.d.ts.map +1 -1
  90. package/esri-compat/feature-effect.d.ts +23 -0
  91. package/esri-compat/feature-effect.d.ts.map +1 -0
  92. package/esri-compat/feature-effect.js +12 -0
  93. package/esri-compat/feature-form.d.ts +6 -0
  94. package/esri-compat/feature-form.d.ts.map +1 -1
  95. package/esri-compat/feature-form.js +63 -0
  96. package/esri-compat/feature-layer.d.ts +21 -2
  97. package/esri-compat/feature-layer.d.ts.map +1 -1
  98. package/esri-compat/feature-layer.js +172 -1
  99. package/esri-compat/feature-table.d.ts +5 -0
  100. package/esri-compat/feature-table.d.ts.map +1 -1
  101. package/esri-compat/feature-table.js +23 -0
  102. package/esri-compat/identity-manager.d.ts +1 -1
  103. package/esri-compat/identity-manager.js +1 -1
  104. package/esri-compat/legend.d.ts +2 -0
  105. package/esri-compat/legend.d.ts.map +1 -1
  106. package/esri-compat/legend.js +98 -0
  107. package/esri-compat/locator.d.ts +1 -1
  108. package/esri-compat/locator.js +1 -1
  109. package/esri-compat/map-view-mount.d.ts +1 -0
  110. package/esri-compat/map-view-mount.d.ts.map +1 -1
  111. package/esri-compat/map-view-mount.js +46 -25
  112. package/esri-compat/map-view.d.ts +13 -0
  113. package/esri-compat/map-view.d.ts.map +1 -1
  114. package/esri-compat/map-view.js +94 -8
  115. package/esri-compat/map.d.ts +5 -1
  116. package/esri-compat/map.d.ts.map +1 -1
  117. package/esri-compat/map.js +10 -0
  118. package/esri-compat/measurement.d.ts +2 -0
  119. package/esri-compat/measurement.d.ts.map +1 -1
  120. package/esri-compat/measurement.js +14 -0
  121. package/esri-compat/point.d.ts +7 -0
  122. package/esri-compat/point.d.ts.map +1 -1
  123. package/esri-compat/point.js +33 -3
  124. package/esri-compat/popup.d.ts +2 -0
  125. package/esri-compat/popup.d.ts.map +1 -1
  126. package/esri-compat/popup.js +12 -0
  127. package/esri-compat/portal.d.ts +1 -1
  128. package/esri-compat/portal.js +1 -1
  129. package/esri-compat/print.d.ts +3 -0
  130. package/esri-compat/print.d.ts.map +1 -1
  131. package/esri-compat/print.js +15 -0
  132. package/esri-compat/search.d.ts +4 -0
  133. package/esri-compat/search.d.ts.map +1 -1
  134. package/esri-compat/search.js +25 -28
  135. package/esri-compat/sketch.d.ts +2 -0
  136. package/esri-compat/sketch.d.ts.map +1 -1
  137. package/esri-compat/sketch.js +12 -0
  138. package/esri-compat/widget-host.d.ts +46 -17
  139. package/esri-compat/widget-host.d.ts.map +1 -1
  140. package/esri-compat/widget-host.js +84 -20
  141. package/esri-compat/widget-shell-hosts.d.ts +61 -0
  142. package/esri-compat/widget-shell-hosts.d.ts.map +1 -0
  143. package/esri-compat/widget-shell-hosts.js +76 -0
  144. package/geocoding/index.d.ts +114 -0
  145. package/geocoding/index.d.ts.map +1 -0
  146. package/geocoding/index.js +293 -0
  147. package/geocoding/provider-http.d.ts +37 -0
  148. package/geocoding/provider-http.d.ts.map +1 -0
  149. package/geocoding/provider-http.js +93 -0
  150. package/geocoding/provider.d.ts +145 -0
  151. package/geocoding/provider.d.ts.map +1 -0
  152. package/geocoding/provider.js +41 -0
  153. package/geocoding/providers/honua.d.ts +28 -0
  154. package/geocoding/providers/honua.d.ts.map +1 -0
  155. package/geocoding/providers/honua.js +68 -0
  156. package/geocoding/providers/nominatim.d.ts +47 -0
  157. package/geocoding/providers/nominatim.d.ts.map +1 -0
  158. package/geocoding/providers/nominatim.js +105 -0
  159. package/geocoding/providers/pelias.d.ts +40 -0
  160. package/geocoding/providers/pelias.d.ts.map +1 -0
  161. package/geocoding/providers/pelias.js +115 -0
  162. package/geocoding/providers/photon.d.ts +39 -0
  163. package/geocoding/providers/photon.d.ts.map +1 -0
  164. package/geocoding/providers/photon.js +107 -0
  165. package/geometry/convert.d.ts +13 -0
  166. package/geometry/convert.d.ts.map +1 -0
  167. package/geometry/convert.js +12 -0
  168. package/geometry/index.d.ts +17 -0
  169. package/geometry/index.d.ts.map +1 -0
  170. package/geometry/index.js +15 -0
  171. package/geometry/internal.d.ts +25 -0
  172. package/geometry/internal.d.ts.map +1 -0
  173. package/geometry/internal.js +40 -0
  174. package/geometry/ops.d.ts +71 -0
  175. package/geometry/ops.d.ts.map +1 -0
  176. package/geometry/ops.js +147 -0
  177. package/geometry/project.d.ts +40 -0
  178. package/geometry/project.d.ts.map +1 -0
  179. package/geometry/project.js +88 -0
  180. package/geometry/types.d.ts +36 -0
  181. package/geometry/types.d.ts.map +1 -0
  182. package/geometry/types.js +12 -0
  183. package/kernel/renderer.d.ts +82 -0
  184. package/kernel/renderer.js +1 -0
  185. package/offline/digest.d.ts +15 -0
  186. package/offline/digest.js +58 -0
  187. package/offline/quota.d.ts +161 -0
  188. package/offline/quota.js +370 -0
  189. package/offline/types.d.ts +349 -0
  190. package/offline/types.js +75 -0
  191. package/package.json +14 -2
  192. package/widget-capabilities.d.ts +67 -0
  193. package/widget-capabilities.js +152 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Honua facade adapter: wraps the existing {@link HonuaGeocodingClient}
3
+ * (Honua-hosted GeocodeServer locator) in the provider-pluggable
4
+ * {@link GeocodingProvider} contract, making the Honua facade one provider
5
+ * among several.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { assertGeocodingCapability, } from "../provider.js";
10
+ const HONUA_ATTRIBUTION = "Honua-hosted locator service";
11
+ const HONUA_CAPABILITIES = ["geocode", "reverse", "suggest"];
12
+ /**
13
+ * Wrap a {@link HonuaGeocodingClient} in the {@link GeocodingProvider}
14
+ * contract.
15
+ *
16
+ * @experimental
17
+ */
18
+ export function honuaGeocodingProvider(client, options = {}) {
19
+ const policy = options.capabilityPolicy ?? "strict";
20
+ const provenance = Object.freeze({
21
+ provider: "honua",
22
+ attribution: options.attribution ?? HONUA_ATTRIBUTION,
23
+ ...(options.usagePolicyUrl !== undefined ? { usagePolicyUrl: options.usagePolicyUrl } : {}),
24
+ });
25
+ return {
26
+ id: "honua",
27
+ capabilities: HONUA_CAPABILITIES,
28
+ attribution: provenance.attribution,
29
+ usagePolicyUrl: provenance.usagePolicyUrl,
30
+ async geocode(query, geocodeOptions) {
31
+ assertGeocodingCapability({ id: "honua", capabilities: HONUA_CAPABILITIES }, "geocode", policy);
32
+ const results = await client.forwardGeocode(query, {
33
+ maxResults: geocodeOptions?.limit,
34
+ countryCodes: geocodeOptions?.countryCodes,
35
+ });
36
+ return results.map((result) => ({
37
+ address: result.address,
38
+ latitude: result.latitude,
39
+ longitude: result.longitude,
40
+ score: result.score,
41
+ attributes: result.attributes,
42
+ provenance,
43
+ }));
44
+ },
45
+ async reverse(latitude, longitude) {
46
+ assertGeocodingCapability({ id: "honua", capabilities: HONUA_CAPABILITIES }, "reverse", policy);
47
+ const result = await client.reverseGeocode(latitude, longitude);
48
+ if (!result) {
49
+ return null;
50
+ }
51
+ return {
52
+ address: result.address,
53
+ latitude: result.latitude,
54
+ longitude: result.longitude,
55
+ attributes: result.attributes,
56
+ provenance,
57
+ };
58
+ },
59
+ async suggest(text, suggestOptions) {
60
+ assertGeocodingCapability({ id: "honua", capabilities: HONUA_CAPABILITIES }, "suggest", policy);
61
+ const suggestions = await client.suggest(text, {
62
+ maxSuggestions: suggestOptions?.limit,
63
+ countryCodes: suggestOptions?.countryCodes,
64
+ });
65
+ return suggestions.map((suggestion) => ({ text: suggestion.text, provenance }));
66
+ },
67
+ };
68
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Nominatim adapter for the {@link GeocodingProvider} contract.
3
+ *
4
+ * Supports `geocode` and `reverse`; Nominatim has no typeahead endpoint, so
5
+ * `suggest` is declared unsupported and throws
6
+ * `HonuaCapabilityNotSupportedError` under the strict capability policy.
7
+ *
8
+ * There is no default endpoint: pass the `baseUrl` of an instance you are
9
+ * entitled to use. If you point at the public
10
+ * `https://nominatim.openstreetmap.org` service you MUST follow the OSMF
11
+ * Nominatim usage policy — at most 1 request/second, a real `userAgent`
12
+ * identifying your application, and no heavy typeahead-style traffic.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import type { CapabilityPolicy } from "../../contract/types.js";
17
+ import { type ProviderTransportOptions } from "../provider-http.js";
18
+ import { type GeocodingProvider } from "../provider.js";
19
+ /** Options for {@link nominatimGeocodingProvider}. @experimental */
20
+ export interface NominatimProviderOptions extends ProviderTransportOptions {
21
+ /**
22
+ * Base URL of the Nominatim instance, e.g. `https://nominatim.example.org`.
23
+ * Required — no third-party default is baked in (usage-policy safety).
24
+ */
25
+ baseUrl: string;
26
+ /**
27
+ * Value for the `User-Agent` header. The OSMF usage policy requires a real
28
+ * application identifier when using the public instance. Only settable in
29
+ * non-browser runtimes; browsers control their own `User-Agent`.
30
+ */
31
+ userAgent?: string;
32
+ /** Contact email forwarded as the `email` query parameter (public-instance etiquette). */
33
+ email?: string;
34
+ /** Capability policy; `"strict"` (default) throws on `suggest`. */
35
+ capabilityPolicy?: CapabilityPolicy;
36
+ /** Override the default attribution string (self-hosted instances). */
37
+ attribution?: string;
38
+ /** Override the default usage-policy URL (self-hosted instances). */
39
+ usagePolicyUrl?: string;
40
+ }
41
+ /**
42
+ * Create a {@link GeocodingProvider} backed by a Nominatim instance.
43
+ *
44
+ * @experimental
45
+ */
46
+ export declare function nominatimGeocodingProvider(options: NominatimProviderOptions): GeocodingProvider;
47
+ //# sourceMappingURL=nominatim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nominatim.d.ts","sourceRoot":"","sources":["../../../../src/geocoding/providers/nominatim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,KAAK,wBAAwB,EAI9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,iBAAiB,EAMvB,MAAM,gBAAgB,CAAC;AAExB,oEAAoE;AACpE,MAAM,WAAW,wBAAyB,SAAQ,wBAAwB;IACxE;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAmBD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAqF/F"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Nominatim adapter for the {@link GeocodingProvider} contract.
3
+ *
4
+ * Supports `geocode` and `reverse`; Nominatim has no typeahead endpoint, so
5
+ * `suggest` is declared unsupported and throws
6
+ * `HonuaCapabilityNotSupportedError` under the strict capability policy.
7
+ *
8
+ * There is no default endpoint: pass the `baseUrl` of an instance you are
9
+ * entitled to use. If you point at the public
10
+ * `https://nominatim.openstreetmap.org` service you MUST follow the OSMF
11
+ * Nominatim usage policy — at most 1 request/second, a real `userAgent`
12
+ * identifying your application, and no heavy typeahead-style traffic.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import { providerGetJson, stringifyProviderAttributes, trimProviderBaseUrl, } from "../provider-http.js";
17
+ import { assertGeocodingCapability, } from "../provider.js";
18
+ const NOMINATIM_ATTRIBUTION = "Data © OpenStreetMap contributors, ODbL 1.0";
19
+ const NOMINATIM_USAGE_POLICY_URL = "https://operations.osmfoundation.org/policies/nominatim/";
20
+ const NOMINATIM_CAPABILITIES = ["geocode", "reverse"];
21
+ /**
22
+ * Create a {@link GeocodingProvider} backed by a Nominatim instance.
23
+ *
24
+ * @experimental
25
+ */
26
+ export function nominatimGeocodingProvider(options) {
27
+ const baseUrl = trimProviderBaseUrl(options.baseUrl);
28
+ const policy = options.capabilityPolicy ?? "strict";
29
+ const headers = {};
30
+ if (options.userAgent) {
31
+ headers["User-Agent"] = options.userAgent;
32
+ }
33
+ const provenance = Object.freeze({
34
+ provider: "nominatim",
35
+ attribution: options.attribution ?? NOMINATIM_ATTRIBUTION,
36
+ usagePolicyUrl: options.usagePolicyUrl ?? NOMINATIM_USAGE_POLICY_URL,
37
+ });
38
+ const request = (path, params, label) => {
39
+ params.set("format", "jsonv2");
40
+ if (options.email) {
41
+ params.set("email", options.email);
42
+ }
43
+ return providerGetJson(`${baseUrl}${path}?${params.toString()}`, {
44
+ fetchFn: options.fetchFn,
45
+ timeoutMs: options.timeoutMs,
46
+ headers,
47
+ label,
48
+ });
49
+ };
50
+ const toMatch = (place) => ({
51
+ address: place.display_name ?? "",
52
+ latitude: Number(place.lat),
53
+ longitude: Number(place.lon),
54
+ score: place.importance,
55
+ attributes: stringifyProviderAttributes({
56
+ place_id: place.place_id,
57
+ osm_type: place.osm_type,
58
+ osm_id: place.osm_id,
59
+ category: place.category,
60
+ type: place.type,
61
+ }),
62
+ provenance,
63
+ });
64
+ return {
65
+ id: "nominatim",
66
+ capabilities: NOMINATIM_CAPABILITIES,
67
+ attribution: provenance.attribution,
68
+ usagePolicyUrl: provenance.usagePolicyUrl,
69
+ async geocode(query, geocodeOptions) {
70
+ assertGeocodingCapability({ id: "nominatim", capabilities: NOMINATIM_CAPABILITIES }, "geocode", policy);
71
+ const params = new URLSearchParams({ q: query });
72
+ if (geocodeOptions?.limit !== undefined) {
73
+ params.set("limit", String(geocodeOptions.limit));
74
+ }
75
+ if (geocodeOptions?.countryCodes !== undefined) {
76
+ params.set("countrycodes", geocodeOptions.countryCodes);
77
+ }
78
+ const places = await request("/search", params, "nominatim geocode");
79
+ return (places ?? []).map(toMatch);
80
+ },
81
+ async reverse(latitude, longitude) {
82
+ assertGeocodingCapability({ id: "nominatim", capabilities: NOMINATIM_CAPABILITIES }, "reverse", policy);
83
+ const params = new URLSearchParams({ lat: String(latitude), lon: String(longitude) });
84
+ const place = await request("/reverse", params, "nominatim reverse");
85
+ // Nominatim reports "no result" as `{ "error": "Unable to geocode" }`.
86
+ if (!place || place.error !== undefined || place.lat === undefined) {
87
+ return null;
88
+ }
89
+ const match = toMatch(place);
90
+ return {
91
+ address: match.address,
92
+ latitude: match.latitude,
93
+ longitude: match.longitude,
94
+ attributes: match.attributes,
95
+ provenance,
96
+ };
97
+ },
98
+ async suggest() {
99
+ // Declared capability miss: Nominatim's usage policy forbids
100
+ // autocomplete-style traffic and it exposes no suggest endpoint.
101
+ assertGeocodingCapability({ id: "nominatim", capabilities: NOMINATIM_CAPABILITIES }, "suggest", policy);
102
+ return [];
103
+ },
104
+ };
105
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Pelias adapter for the {@link GeocodingProvider} contract.
3
+ *
4
+ * Supports `geocode` (`/v1/search`), `reverse` (`/v1/reverse`), and `suggest`
5
+ * via the dedicated `/v1/autocomplete` endpoint.
6
+ *
7
+ * There is no default endpoint: pass the `baseUrl` of an instance you are
8
+ * entitled to use (self-hosted Pelias or a hosted service such as
9
+ * geocode.earth, whose terms and API key requirements you must follow).
10
+ * Attribution depends on the datasets the instance is built from — override
11
+ * `attribution` to match your instance's obligations.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import type { CapabilityPolicy } from "../../contract/types.js";
16
+ import { type ProviderTransportOptions } from "../provider-http.js";
17
+ import { type GeocodingProvider } from "../provider.js";
18
+ /** Options for {@link peliasGeocodingProvider}. @experimental */
19
+ export interface PeliasProviderOptions extends ProviderTransportOptions {
20
+ /**
21
+ * Base URL of the Pelias instance, e.g. `https://pelias.example.org`.
22
+ * Required — no third-party default is baked in (usage-policy safety).
23
+ */
24
+ baseUrl: string;
25
+ /** API key forwarded as the `api_key` query parameter (hosted instances). */
26
+ apiKey?: string;
27
+ /** Capability policy; Pelias supports all declared operations. */
28
+ capabilityPolicy?: CapabilityPolicy;
29
+ /** Override the default attribution string to match your instance's datasets. */
30
+ attribution?: string;
31
+ /** Override the default usage-policy URL (hosted/self-hosted instances). */
32
+ usagePolicyUrl?: string;
33
+ }
34
+ /**
35
+ * Create a {@link GeocodingProvider} backed by a Pelias instance.
36
+ *
37
+ * @experimental
38
+ */
39
+ export declare function peliasGeocodingProvider(options: PeliasProviderOptions): GeocodingProvider;
40
+ //# sourceMappingURL=pelias.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pelias.d.ts","sourceRoot":"","sources":["../../../../src/geocoding/providers/pelias.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,KAAK,wBAAwB,EAI9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,iBAAiB,EAOvB,MAAM,gBAAgB,CAAC;AAExB,iEAAiE;AACjE,MAAM,WAAW,qBAAsB,SAAQ,wBAAwB;IACrE;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAwBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,iBAAiB,CAiGzF"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Pelias adapter for the {@link GeocodingProvider} contract.
3
+ *
4
+ * Supports `geocode` (`/v1/search`), `reverse` (`/v1/reverse`), and `suggest`
5
+ * via the dedicated `/v1/autocomplete` endpoint.
6
+ *
7
+ * There is no default endpoint: pass the `baseUrl` of an instance you are
8
+ * entitled to use (self-hosted Pelias or a hosted service such as
9
+ * geocode.earth, whose terms and API key requirements you must follow).
10
+ * Attribution depends on the datasets the instance is built from — override
11
+ * `attribution` to match your instance's obligations.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import { providerGetJson, stringifyProviderAttributes, trimProviderBaseUrl, } from "../provider-http.js";
16
+ import { assertGeocodingCapability, } from "../provider.js";
17
+ const PELIAS_ATTRIBUTION = "Geocoding by Pelias; data © OpenStreetMap contributors and other dataset licensors";
18
+ const PELIAS_USAGE_POLICY_URL = "https://github.com/pelias/documentation/blob/master/data-licenses.md";
19
+ const PELIAS_CAPABILITIES = ["geocode", "reverse", "suggest"];
20
+ /**
21
+ * Create a {@link GeocodingProvider} backed by a Pelias instance.
22
+ *
23
+ * @experimental
24
+ */
25
+ export function peliasGeocodingProvider(options) {
26
+ const baseUrl = trimProviderBaseUrl(options.baseUrl);
27
+ const policy = options.capabilityPolicy ?? "strict";
28
+ const provenance = Object.freeze({
29
+ provider: "pelias",
30
+ attribution: options.attribution ?? PELIAS_ATTRIBUTION,
31
+ usagePolicyUrl: options.usagePolicyUrl ?? PELIAS_USAGE_POLICY_URL,
32
+ });
33
+ const request = (path, params, label) => {
34
+ if (options.apiKey) {
35
+ params.set("api_key", options.apiKey);
36
+ }
37
+ return providerGetJson(`${baseUrl}${path}?${params.toString()}`, {
38
+ fetchFn: options.fetchFn,
39
+ timeoutMs: options.timeoutMs,
40
+ label,
41
+ });
42
+ };
43
+ const toMatch = (feature) => {
44
+ const [longitude, latitude] = feature.geometry?.coordinates ?? [Number.NaN, Number.NaN];
45
+ const p = feature.properties ?? {};
46
+ return {
47
+ address: p.label ?? p.name ?? "",
48
+ latitude,
49
+ longitude,
50
+ score: p.confidence,
51
+ attributes: stringifyProviderAttributes({
52
+ gid: p.gid,
53
+ layer: p.layer,
54
+ source: p.source,
55
+ country_code: p.country_code,
56
+ postalcode: p.postalcode,
57
+ }),
58
+ provenance,
59
+ };
60
+ };
61
+ const applyCountryFilter = (params, countryCodes) => {
62
+ if (countryCodes !== undefined) {
63
+ params.set("boundary.country", countryCodes);
64
+ }
65
+ };
66
+ return {
67
+ id: "pelias",
68
+ capabilities: PELIAS_CAPABILITIES,
69
+ attribution: provenance.attribution,
70
+ usagePolicyUrl: provenance.usagePolicyUrl,
71
+ async geocode(query, geocodeOptions) {
72
+ assertGeocodingCapability({ id: "pelias", capabilities: PELIAS_CAPABILITIES }, "geocode", policy);
73
+ const params = new URLSearchParams({ text: query });
74
+ if (geocodeOptions?.limit !== undefined) {
75
+ params.set("size", String(geocodeOptions.limit));
76
+ }
77
+ applyCountryFilter(params, geocodeOptions?.countryCodes);
78
+ const data = await request("/v1/search", params, "pelias geocode");
79
+ return (data.features ?? []).map(toMatch);
80
+ },
81
+ async reverse(latitude, longitude) {
82
+ assertGeocodingCapability({ id: "pelias", capabilities: PELIAS_CAPABILITIES }, "reverse", policy);
83
+ const params = new URLSearchParams({
84
+ "point.lat": String(latitude),
85
+ "point.lon": String(longitude),
86
+ });
87
+ const data = await request("/v1/reverse", params, "pelias reverse");
88
+ const feature = data.features?.[0];
89
+ if (!feature) {
90
+ return null;
91
+ }
92
+ const match = toMatch(feature);
93
+ return {
94
+ address: match.address,
95
+ latitude: match.latitude,
96
+ longitude: match.longitude,
97
+ attributes: match.attributes,
98
+ provenance,
99
+ };
100
+ },
101
+ async suggest(text, suggestOptions) {
102
+ assertGeocodingCapability({ id: "pelias", capabilities: PELIAS_CAPABILITIES }, "suggest", policy);
103
+ const params = new URLSearchParams({ text });
104
+ if (suggestOptions?.limit !== undefined) {
105
+ params.set("size", String(suggestOptions.limit));
106
+ }
107
+ applyCountryFilter(params, suggestOptions?.countryCodes);
108
+ const data = await request("/v1/autocomplete", params, "pelias suggest");
109
+ return (data.features ?? []).map((feature) => ({
110
+ text: feature.properties?.label ?? feature.properties?.name ?? "",
111
+ provenance,
112
+ }));
113
+ },
114
+ };
115
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Photon adapter for the {@link GeocodingProvider} contract.
3
+ *
4
+ * Photon (komoot) is typeahead-first, so it supports all three operations:
5
+ * `geocode`, `reverse`, and `suggest` (suggest reuses the search endpoint,
6
+ * which is designed for as-you-type queries).
7
+ *
8
+ * There is no default endpoint: pass the `baseUrl` of an instance you are
9
+ * entitled to use (e.g. a self-hosted Photon, or `https://photon.komoot.io`
10
+ * within its fair-use terms).
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import type { CapabilityPolicy } from "../../contract/types.js";
15
+ import { type ProviderTransportOptions } from "../provider-http.js";
16
+ import { type GeocodingProvider } from "../provider.js";
17
+ /** Options for {@link photonGeocodingProvider}. @experimental */
18
+ export interface PhotonProviderOptions extends ProviderTransportOptions {
19
+ /**
20
+ * Base URL of the Photon instance, e.g. `https://photon.example.org`.
21
+ * Required — no third-party default is baked in (usage-policy safety).
22
+ */
23
+ baseUrl: string;
24
+ /** BCP-47 language for results, forwarded as `lang` when set. */
25
+ language?: string;
26
+ /** Capability policy; Photon supports all declared operations. */
27
+ capabilityPolicy?: CapabilityPolicy;
28
+ /** Override the default attribution string (self-hosted instances). */
29
+ attribution?: string;
30
+ /** Override the default usage-policy URL (self-hosted instances). */
31
+ usagePolicyUrl?: string;
32
+ }
33
+ /**
34
+ * Create a {@link GeocodingProvider} backed by a Photon instance.
35
+ *
36
+ * @experimental
37
+ */
38
+ export declare function photonGeocodingProvider(options: PhotonProviderOptions): GeocodingProvider;
39
+ //# sourceMappingURL=photon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"photon.d.ts","sourceRoot":"","sources":["../../../../src/geocoding/providers/photon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,KAAK,wBAAwB,EAI9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,iBAAiB,EAOvB,MAAM,gBAAgB,CAAC;AAExB,iEAAiE;AACjE,MAAM,WAAW,qBAAsB,SAAQ,wBAAwB;IACrE;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAsCD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,iBAAiB,CAmFzF"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Photon adapter for the {@link GeocodingProvider} contract.
3
+ *
4
+ * Photon (komoot) is typeahead-first, so it supports all three operations:
5
+ * `geocode`, `reverse`, and `suggest` (suggest reuses the search endpoint,
6
+ * which is designed for as-you-type queries).
7
+ *
8
+ * There is no default endpoint: pass the `baseUrl` of an instance you are
9
+ * entitled to use (e.g. a self-hosted Photon, or `https://photon.komoot.io`
10
+ * within its fair-use terms).
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import { providerGetJson, stringifyProviderAttributes, trimProviderBaseUrl, } from "../provider-http.js";
15
+ import { assertGeocodingCapability, } from "../provider.js";
16
+ const PHOTON_ATTRIBUTION = "Data © OpenStreetMap contributors, ODbL 1.0";
17
+ const PHOTON_USAGE_POLICY_URL = "https://photon.komoot.io/";
18
+ const PHOTON_CAPABILITIES = ["geocode", "reverse", "suggest"];
19
+ function photonLabel(feature) {
20
+ const p = feature.properties ?? {};
21
+ const streetLine = p.housenumber && p.street ? `${p.street} ${p.housenumber}` : p.street;
22
+ const parts = [p.name, streetLine, p.city, p.state, p.country].filter((part) => typeof part === "string" && part.length > 0);
23
+ // Photon repeats `name` for street-level results; drop consecutive duplicates.
24
+ return parts.filter((part, index) => part !== parts[index - 1]).join(", ");
25
+ }
26
+ /**
27
+ * Create a {@link GeocodingProvider} backed by a Photon instance.
28
+ *
29
+ * @experimental
30
+ */
31
+ export function photonGeocodingProvider(options) {
32
+ const baseUrl = trimProviderBaseUrl(options.baseUrl);
33
+ const policy = options.capabilityPolicy ?? "strict";
34
+ const provenance = Object.freeze({
35
+ provider: "photon",
36
+ attribution: options.attribution ?? PHOTON_ATTRIBUTION,
37
+ usagePolicyUrl: options.usagePolicyUrl ?? PHOTON_USAGE_POLICY_URL,
38
+ });
39
+ const request = (path, params, label) => {
40
+ if (options.language) {
41
+ params.set("lang", options.language);
42
+ }
43
+ return providerGetJson(`${baseUrl}${path}?${params.toString()}`, {
44
+ fetchFn: options.fetchFn,
45
+ timeoutMs: options.timeoutMs,
46
+ label,
47
+ });
48
+ };
49
+ const toMatch = (feature) => {
50
+ const [longitude, latitude] = feature.geometry?.coordinates ?? [Number.NaN, Number.NaN];
51
+ const p = feature.properties ?? {};
52
+ return {
53
+ address: photonLabel(feature),
54
+ latitude,
55
+ longitude,
56
+ attributes: stringifyProviderAttributes({
57
+ osm_id: p.osm_id,
58
+ osm_type: p.osm_type,
59
+ osm_key: p.osm_key,
60
+ osm_value: p.osm_value,
61
+ postcode: p.postcode,
62
+ type: p.type,
63
+ }),
64
+ provenance,
65
+ };
66
+ };
67
+ const search = async (query, limit, label) => {
68
+ const params = new URLSearchParams({ q: query });
69
+ if (limit !== undefined) {
70
+ params.set("limit", String(limit));
71
+ }
72
+ const data = await request("/api", params, label);
73
+ return (data.features ?? []).map(toMatch);
74
+ };
75
+ return {
76
+ id: "photon",
77
+ capabilities: PHOTON_CAPABILITIES,
78
+ attribution: provenance.attribution,
79
+ usagePolicyUrl: provenance.usagePolicyUrl,
80
+ async geocode(query, geocodeOptions) {
81
+ assertGeocodingCapability({ id: "photon", capabilities: PHOTON_CAPABILITIES }, "geocode", policy);
82
+ return search(query, geocodeOptions?.limit, "photon geocode");
83
+ },
84
+ async reverse(latitude, longitude) {
85
+ assertGeocodingCapability({ id: "photon", capabilities: PHOTON_CAPABILITIES }, "reverse", policy);
86
+ const params = new URLSearchParams({ lat: String(latitude), lon: String(longitude) });
87
+ const data = await request("/reverse", params, "photon reverse");
88
+ const feature = data.features?.[0];
89
+ if (!feature) {
90
+ return null;
91
+ }
92
+ const match = toMatch(feature);
93
+ return {
94
+ address: match.address,
95
+ latitude: match.latitude,
96
+ longitude: match.longitude,
97
+ attributes: match.attributes,
98
+ provenance,
99
+ };
100
+ },
101
+ async suggest(text, suggestOptions) {
102
+ assertGeocodingCapability({ id: "photon", capabilities: PHOTON_CAPABILITIES }, "suggest", policy);
103
+ const matches = await search(text, suggestOptions?.limit, "photon suggest");
104
+ return matches.map((match) => ({ text: match.address, provenance }));
105
+ },
106
+ };
107
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Esri-JSON ↔ GeoJSON conversion for the geometry package.
3
+ *
4
+ * These are re-exports of the single canonical converter utility in
5
+ * `src/core/esri-geojson.ts` (heritage of issue #264) — the geometry package
6
+ * deliberately does not fork its own Esri conversion logic. `esriToGeoJson` /
7
+ * `geoJsonToEsri` are the ergonomic aliases used by `@honua/geometry` and the
8
+ * `geometryEngine` compat shim.
9
+ *
10
+ * @module
11
+ */
12
+ export { esriGeometryToGeoJSON as esriToGeoJson, esriFeatureToGeoJSON as esriFeatureToGeoJson, geoJsonToEsriGeometry as geoJsonToEsri, } from "../core/esri-geojson.js";
13
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/geometry/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,qBAAqB,IAAI,aAAa,EACtC,oBAAoB,IAAI,oBAAoB,EAC5C,qBAAqB,IAAI,aAAa,GACvC,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Esri-JSON ↔ GeoJSON conversion for the geometry package.
3
+ *
4
+ * These are re-exports of the single canonical converter utility in
5
+ * `src/core/esri-geojson.ts` (heritage of issue #264) — the geometry package
6
+ * deliberately does not fork its own Esri conversion logic. `esriToGeoJson` /
7
+ * `geoJsonToEsri` are the ergonomic aliases used by `@honua/geometry` and the
8
+ * `geometryEngine` compat shim.
9
+ *
10
+ * @module
11
+ */
12
+ export { esriGeometryToGeoJSON as esriToGeoJson, esriFeatureToGeoJSON as esriFeatureToGeoJson, geoJsonToEsriGeometry as geoJsonToEsri, } from "../core/esri-geojson.js";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `@honua/geometry` — curated, tree-shakeable client-side geometry operations
3
+ * for the Honua SDK.
4
+ *
5
+ * This subpath (`@honua/sdk-js/geometry`, split-packaged as `@honua/geometry`)
6
+ * wraps the individual `@turf/*` packages and `proj4`, typed against the SDK's
7
+ * own GeoJSON contract. Importing a single op only pulls that op's turf backing
8
+ * into a consumer bundle; the core SDK never imports this module, so core-only
9
+ * consumers never pay for turf/proj4.
10
+ *
11
+ * @module
12
+ */
13
+ export { area, bbox, booleanContains, booleanIntersects, booleanWithin, buffer, centroid, convex, difference, intersect, length, nearestPoint, simplify, union, } from "./ops.js";
14
+ export { defineProjection, normalizeCrs, project, toWebMercator, toWgs84 } from "./project.js";
15
+ export { esriFeatureToGeoJson, esriToGeoJson, geoJsonToEsri } from "./convert.js";
16
+ export type { GeoJsonFeature, GeoJsonFeatureCollection, GeoJsonGeometry, GeoJsonLineString, GeoJsonMultiLineString, GeoJsonMultiPoint, GeoJsonMultiPolygon, GeoJsonPoint, GeoJsonPolygon, GeometryInput, LinearUnit, } from "./types.js";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/geometry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,MAAM,EACN,QAAQ,EACR,MAAM,EACN,UAAU,EACV,SAAS,EACT,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,KAAK,GACN,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElF,YAAY,EACV,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,UAAU,GACX,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `@honua/geometry` — curated, tree-shakeable client-side geometry operations
3
+ * for the Honua SDK.
4
+ *
5
+ * This subpath (`@honua/sdk-js/geometry`, split-packaged as `@honua/geometry`)
6
+ * wraps the individual `@turf/*` packages and `proj4`, typed against the SDK's
7
+ * own GeoJSON contract. Importing a single op only pulls that op's turf backing
8
+ * into a consumer bundle; the core SDK never imports this module, so core-only
9
+ * consumers never pay for turf/proj4.
10
+ *
11
+ * @module
12
+ */
13
+ export { area, bbox, booleanContains, booleanIntersects, booleanWithin, buffer, centroid, convex, difference, intersect, length, nearestPoint, simplify, union, } from "./ops.js";
14
+ export { defineProjection, normalizeCrs, project, toWebMercator, toWgs84 } from "./project.js";
15
+ export { esriFeatureToGeoJson, esriToGeoJson, geoJsonToEsri } from "./convert.js";
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Internal bridge between the SDK's GeoJSON contract types and the `geojson`
3
+ * declarations that the `@turf/*` packages are typed against. The two are
4
+ * structurally identical for the primitive geometry types the geometry package
5
+ * supports, so the conversions are erased casts — kept in one place so the ops
6
+ * modules stay free of scattered `as unknown as` noise.
7
+ *
8
+ * @internal
9
+ * @module
10
+ */
11
+ import type { Feature as TurfFeature, FeatureCollection as TurfFeatureCollection, Geometry as TurfGeometry } from "geojson";
12
+ import type { GeoJsonFeature } from "../core/types.js";
13
+ import type { GeoJsonGeometry } from "../expr/expression.js";
14
+ import type { GeometryInput } from "./types.js";
15
+ /** Narrow an input to its bare geometry, unwrapping a `Feature` if needed. */
16
+ export declare function inputToGeometry(input: GeometryInput): GeoJsonGeometry;
17
+ /** Present an SDK geometry to turf as a `geojson` geometry. */
18
+ export declare function toTurfGeometry(geometry: GeoJsonGeometry): TurfGeometry;
19
+ /** Present an SDK geometry input to turf as a `geojson` value. */
20
+ export declare function toTurfInput(input: GeometryInput): TurfFeature | TurfFeatureCollection | TurfGeometry;
21
+ /** Convert a turf geometry back into an SDK geometry. */
22
+ export declare function fromTurfGeometry(geometry: TurfGeometry): GeoJsonGeometry;
23
+ /** Convert a turf feature back into an SDK feature. */
24
+ export declare function fromTurfFeature(feature: TurfFeature): GeoJsonFeature;
25
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/geometry/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,OAAO,IAAI,WAAW,EACtB,iBAAiB,IAAI,qBAAqB,EAC1C,QAAQ,IAAI,YAAY,EACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,CAYrE;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY,CAEtE;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,GAAG,qBAAqB,GAAG,YAAY,CAEpG;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,eAAe,CAExE;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAEpE"}