@honua/sdk-esri-compat 0.1.12 → 0.1.14

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 (250) hide show
  1. package/README.md +2 -0
  2. package/columnar/apache-arrow.d.ts +17 -0
  3. package/columnar/apache-arrow.d.ts.map +1 -0
  4. package/columnar/apache-arrow.js +1036 -0
  5. package/columnar/batch-cache-conformance.d.ts +66 -0
  6. package/columnar/batch-cache-conformance.d.ts.map +1 -0
  7. package/columnar/batch-cache-conformance.js +317 -0
  8. package/columnar/batch-cache-indexeddb.d.ts +31 -0
  9. package/columnar/batch-cache-indexeddb.d.ts.map +1 -0
  10. package/columnar/batch-cache-indexeddb.js +148 -0
  11. package/columnar/batch-cache.d.ts +298 -0
  12. package/columnar/batch-cache.d.ts.map +1 -0
  13. package/columnar/batch-cache.js +757 -0
  14. package/columnar/geoarrow-aggregate.d.ts +178 -0
  15. package/columnar/geoarrow-aggregate.d.ts.map +1 -0
  16. package/columnar/geoarrow-aggregate.js +976 -0
  17. package/columnar/geoarrow-patch.d.ts +382 -0
  18. package/columnar/geoarrow-patch.d.ts.map +1 -0
  19. package/columnar/geoarrow-patch.js +1656 -0
  20. package/columnar/geoarrow-reproject.d.ts +22 -0
  21. package/columnar/geoarrow-reproject.d.ts.map +1 -0
  22. package/columnar/geoarrow-reproject.js +119 -0
  23. package/columnar/geoarrow-serialization.d.ts +68 -0
  24. package/columnar/geoarrow-serialization.d.ts.map +1 -0
  25. package/columnar/geoarrow-serialization.js +331 -0
  26. package/columnar/geoarrow-types.d.ts +271 -0
  27. package/columnar/geoarrow-types.d.ts.map +1 -0
  28. package/columnar/geoarrow-types.js +15 -0
  29. package/columnar/geoarrow.d.ts +52 -0
  30. package/columnar/geoarrow.d.ts.map +1 -0
  31. package/columnar/geoarrow.js +1469 -0
  32. package/columnar/index.d.ts +43 -0
  33. package/columnar/index.d.ts.map +1 -0
  34. package/columnar/index.js +29 -0
  35. package/columnar/operators.d.ts +70 -0
  36. package/columnar/operators.d.ts.map +1 -0
  37. package/columnar/operators.js +307 -0
  38. package/columnar/result.d.ts +369 -0
  39. package/columnar/result.d.ts.map +1 -0
  40. package/columnar/result.js +815 -0
  41. package/columnar/telemetry.d.ts +152 -0
  42. package/columnar/telemetry.d.ts.map +1 -0
  43. package/columnar/telemetry.js +265 -0
  44. package/columnar/transfer.d.ts +28 -0
  45. package/columnar/transfer.d.ts.map +1 -0
  46. package/columnar/transfer.js +669 -0
  47. package/columnar/types.d.ts +175 -0
  48. package/columnar/types.d.ts.map +1 -0
  49. package/columnar/types.js +22 -0
  50. package/columnar/worker.d.ts +157 -0
  51. package/columnar/worker.d.ts.map +1 -0
  52. package/columnar/worker.js +1059 -0
  53. package/connect-url-safety.d.ts +53 -0
  54. package/connect-url-safety.js +189 -0
  55. package/contract/pmtiles.d.ts +6 -5
  56. package/contract/pmtiles.d.ts.map +1 -1
  57. package/contract/pmtiles.js +30 -5
  58. package/contract/source.d.ts.map +1 -1
  59. package/contract/source.js +11 -8
  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 +14 -8
  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/index.d.ts +3 -1
  145. package/index.js +1 -0
  146. package/offline/digest.d.ts +15 -0
  147. package/offline/digest.js +58 -0
  148. package/offline/quota.d.ts +161 -0
  149. package/offline/quota.js +370 -0
  150. package/offline/types.d.ts +349 -0
  151. package/offline/types.js +75 -0
  152. package/package.json +21 -2
  153. package/query-planner/canonical-filter.d.ts +30 -0
  154. package/query-planner/canonical-filter.d.ts.map +1 -0
  155. package/query-planner/canonical-filter.js +30 -0
  156. package/query-planner/canonical.d.ts +7 -0
  157. package/query-planner/canonical.d.ts.map +1 -0
  158. package/query-planner/canonical.js +145 -0
  159. package/query-planner/columnar-plan.d.ts +63 -0
  160. package/query-planner/columnar-plan.d.ts.map +1 -0
  161. package/query-planner/columnar-plan.js +94 -0
  162. package/query-planner/cql2-json.d.ts +17 -0
  163. package/query-planner/cql2-json.d.ts.map +1 -0
  164. package/query-planner/cql2-json.js +646 -0
  165. package/query-planner/diagnostics.d.ts +35 -0
  166. package/query-planner/diagnostics.d.ts.map +1 -0
  167. package/query-planner/diagnostics.js +386 -0
  168. package/query-planner/duckdb.d.ts +79 -0
  169. package/query-planner/duckdb.d.ts.map +1 -0
  170. package/query-planner/duckdb.js +772 -0
  171. package/query-planner/execution-context.d.ts +5 -0
  172. package/query-planner/execution-context.d.ts.map +1 -0
  173. package/query-planner/execution-context.js +52 -0
  174. package/query-planner/executor.d.ts +5 -0
  175. package/query-planner/executor.d.ts.map +1 -0
  176. package/query-planner/executor.js +229 -0
  177. package/query-planner/geoservices.d.ts +91 -0
  178. package/query-planner/geoservices.d.ts.map +1 -0
  179. package/query-planner/geoservices.js +688 -0
  180. package/query-planner/grpc.d.ts +100 -0
  181. package/query-planner/grpc.d.ts.map +1 -0
  182. package/query-planner/grpc.js +760 -0
  183. package/query-planner/index.d.ts +59 -0
  184. package/query-planner/index.d.ts.map +1 -0
  185. package/query-planner/index.js +43 -0
  186. package/query-planner/ir.d.ts +25 -0
  187. package/query-planner/ir.d.ts.map +1 -0
  188. package/query-planner/ir.js +479 -0
  189. package/query-planner/local-aggregate.d.ts +5 -0
  190. package/query-planner/local-aggregate.d.ts.map +1 -0
  191. package/query-planner/local-aggregate.js +126 -0
  192. package/query-planner/odata-protocol-module.d.ts +54 -0
  193. package/query-planner/odata-protocol-module.d.ts.map +1 -0
  194. package/query-planner/odata-protocol-module.js +199 -0
  195. package/query-planner/odata-v1.d.ts +23 -0
  196. package/query-planner/odata-v1.d.ts.map +1 -0
  197. package/query-planner/odata-v1.js +202 -0
  198. package/query-planner/odata.d.ts +45 -0
  199. package/query-planner/odata.d.ts.map +1 -0
  200. package/query-planner/odata.js +519 -0
  201. package/query-planner/ogc-compiler.d.ts +55 -0
  202. package/query-planner/ogc-compiler.d.ts.map +1 -0
  203. package/query-planner/ogc-compiler.js +480 -0
  204. package/query-planner/ogc-features.d.ts +53 -0
  205. package/query-planner/ogc-features.d.ts.map +1 -0
  206. package/query-planner/ogc-features.js +639 -0
  207. package/query-planner/planner.d.ts +17 -0
  208. package/query-planner/planner.d.ts.map +1 -0
  209. package/query-planner/planner.js +937 -0
  210. package/query-planner/representation.d.ts +59 -0
  211. package/query-planner/representation.d.ts.map +1 -0
  212. package/query-planner/representation.js +140 -0
  213. package/query-planner/resource.d.ts +94 -0
  214. package/query-planner/resource.d.ts.map +1 -0
  215. package/query-planner/resource.js +526 -0
  216. package/query-planner/semantic-canonical.d.ts +15 -0
  217. package/query-planner/semantic-canonical.d.ts.map +1 -0
  218. package/query-planner/semantic-canonical.js +62 -0
  219. package/query-planner/semantic-compat.d.ts +10 -0
  220. package/query-planner/semantic-compat.d.ts.map +1 -0
  221. package/query-planner/semantic-compat.js +35 -0
  222. package/query-planner/semantic-compiler.d.ts +64 -0
  223. package/query-planner/semantic-compiler.d.ts.map +1 -0
  224. package/query-planner/semantic-compiler.js +81 -0
  225. package/query-planner/semantic-literals.d.ts +30 -0
  226. package/query-planner/semantic-literals.d.ts.map +1 -0
  227. package/query-planner/semantic-literals.js +133 -0
  228. package/query-planner/semantic-types.d.ts +265 -0
  229. package/query-planner/semantic-types.d.ts.map +1 -0
  230. package/query-planner/semantic-types.js +1 -0
  231. package/query-planner/semantic.d.ts +54 -0
  232. package/query-planner/semantic.d.ts.map +1 -0
  233. package/query-planner/semantic.js +1421 -0
  234. package/query-planner/types.d.ts +712 -0
  235. package/query-planner/types.d.ts.map +1 -0
  236. package/query-planner/types.js +49 -0
  237. package/query-planner/wfs-protocol-module.d.ts +57 -0
  238. package/query-planner/wfs-protocol-module.d.ts.map +1 -0
  239. package/query-planner/wfs-protocol-module.js +731 -0
  240. package/query-planner/wfs-semantic.d.ts +58 -0
  241. package/query-planner/wfs-semantic.d.ts.map +1 -0
  242. package/query-planner/wfs-semantic.js +547 -0
  243. package/query-planner/wfs-v1.d.ts +41 -0
  244. package/query-planner/wfs-v1.d.ts.map +1 -0
  245. package/query-planner/wfs-v1.js +366 -0
  246. package/query-planner/wfs.d.ts +4 -0
  247. package/query-planner/wfs.d.ts.map +1 -0
  248. package/query-planner/wfs.js +2 -0
  249. package/widget-capabilities.d.ts +67 -0
  250. package/widget-capabilities.js +152 -0
@@ -0,0 +1,519 @@
1
+ import { validateExecutableCrsBinding } from "../contract/schema.js";
2
+ import { hashSemanticQuery } from "./semantic-canonical.js";
3
+ import { prepareSemanticCompilerQuery, runSemanticCompiler, sameCrsDefinition, sameExecutableCrs, semanticSchemaField, semanticUnsupported, } from "./semantic-compiler.js";
4
+ import { exactDecimalText, finiteDecimalNumber, odataPropertyPath, quotedSemanticString, recordSemanticFieldMapping, semanticRequestFingerprint, sortSemanticFieldMappings, verifiedSemanticNativeText, verifiedSemanticSourceText, verifiedSemanticSourceVersion, } from "./semantic-literals.js";
5
+ import { HonuaQueryPlanningError } from "./types.js";
6
+ const ODATA_COMPARISON_OPERATOR = {
7
+ eq: "eq",
8
+ ne: "ne",
9
+ lt: "lt",
10
+ lte: "le",
11
+ gt: "gt",
12
+ gte: "ge",
13
+ };
14
+ /** Compile a validated semantic AST to exact OData v4 system query options. */
15
+ export function compileSemanticOdataQuery(options) {
16
+ return runSemanticCompiler(() => {
17
+ const source = verifiedOdataSource(options.source);
18
+ const { query, schema } = prepareSemanticCompilerQuery(options.query, options.schema, "odata");
19
+ const state = { schema, source, fieldMappings: [], usesNativeFilter: false };
20
+ if (query.kind === "aggregate") {
21
+ semanticUnsupported("unsupported-node", "$.kind", "Portable OData v4 aggregation requires a separate typed $apply semantic model");
22
+ }
23
+ const projection = odataProjection(query, state);
24
+ const filter = query.filter
25
+ ? compileOdataSemanticFilter(query.filter, state, "$.filter")
26
+ : undefined;
27
+ const orderBy = odataOrderBy(query, state);
28
+ const page = odataPage(query);
29
+ const queryFingerprint = hashSemanticQuery(query, { schema, protocol: "odata" });
30
+ const request = {
31
+ entitySet: source.entitySet,
32
+ ...(source.sourceVersion ? { sourceVersion: source.sourceVersion } : {}),
33
+ ...(filter ? { filter } : {}),
34
+ ...projection,
35
+ ...(orderBy ? { orderBy } : {}),
36
+ ...page,
37
+ fieldMappings: sortSemanticFieldMappings(state.fieldMappings),
38
+ usesNativeFilter: state.usesNativeFilter,
39
+ };
40
+ const artifact = {
41
+ compiler: "odata-v4-semantic-query-v1",
42
+ dialect: "odata-4.0",
43
+ schemaFingerprint: schema.fingerprint,
44
+ queryFingerprint,
45
+ requestFingerprint: semanticRequestFingerprint("honua:query-request:odata-4.0:1", {
46
+ schemaFingerprint: schema.fingerprint,
47
+ queryFingerprint,
48
+ sourceVersion: source.sourceVersion ?? null,
49
+ request,
50
+ }),
51
+ ...request,
52
+ };
53
+ return { artifact };
54
+ });
55
+ }
56
+ function verifiedOdataSource(value) {
57
+ if (!value || typeof value !== "object") {
58
+ throw new HonuaQueryPlanningError("invalid-query", "Semantic OData source identity is invalid");
59
+ }
60
+ const entitySet = verifiedSemanticSourceText(value.entitySet, "options.source.entitySet");
61
+ try {
62
+ odataPropertyPath([entitySet], "options.source.entitySet");
63
+ }
64
+ catch {
65
+ throw new HonuaQueryPlanningError("invalid-query", "options.source.entitySet is invalid");
66
+ }
67
+ const sourceVersion = verifiedSemanticSourceVersion(value.sourceVersion, "options.source.sourceVersion");
68
+ const functions = value.supportedSpatialFunctions ?? [];
69
+ if (!Array.isArray(functions)) {
70
+ throw new HonuaQueryPlanningError("invalid-query", "options.source.supportedSpatialFunctions is invalid");
71
+ }
72
+ const allowed = new Set(["geo.intersects", "geo.distance"]);
73
+ const seen = new Set();
74
+ for (const name of functions) {
75
+ if (!allowed.has(name) || seen.has(name)) {
76
+ throw new HonuaQueryPlanningError("invalid-query", "options.source.supportedSpatialFunctions is invalid");
77
+ }
78
+ seen.add(name);
79
+ }
80
+ return {
81
+ entitySet,
82
+ ...(sourceVersion ? { sourceVersion } : {}),
83
+ supportedSpatialFunctions: [...functions].sort(),
84
+ };
85
+ }
86
+ function odataProjection(query, state) {
87
+ const primary = primaryOdataGeometryField(state.schema);
88
+ const geometryField = query.geometry && typeof query.geometry === "object"
89
+ ? query.geometry.field
90
+ : query.geometry === "omit"
91
+ ? undefined
92
+ : primary;
93
+ if (query.geometry === "include" && !primary) {
94
+ semanticUnsupported("unsupported-projection", "$.geometry", "OData geometry inclusion requires a known primary geometry property");
95
+ }
96
+ const requested = query.select ?? state.schema.fields.map((field) => field.name);
97
+ const select = [];
98
+ let outputGeometry;
99
+ requested.forEach((name, index) => {
100
+ const path = query.select ? `$.select[${index}]` : "$.schema.fields";
101
+ const field = semanticSchemaField(state.schema, name, path);
102
+ if (field.type.kind !== "geometry") {
103
+ select.push(odataRequestField(field, state, path));
104
+ return;
105
+ }
106
+ if (query.select && field.name !== geometryField) {
107
+ semanticUnsupported("unsupported-projection", path, "An OData geometry property selected as data must match the geometry projection");
108
+ }
109
+ if (field.name !== geometryField)
110
+ return;
111
+ outputGeometry = odataOutputGeometry(field, state, path);
112
+ select.push(outputGeometry.propertyPath);
113
+ });
114
+ if (geometryField && !outputGeometry) {
115
+ const field = semanticSchemaField(state.schema, geometryField, "$.geometry");
116
+ outputGeometry = odataOutputGeometry(field, state, "$.geometry");
117
+ if (!select.includes(outputGeometry.propertyPath))
118
+ select.push(outputGeometry.propertyPath);
119
+ }
120
+ if (query.outputCrs) {
121
+ if (!outputGeometry) {
122
+ semanticUnsupported("unsupported-projection", "$.outputCrs", "OData cannot apply an output CRS when geometry is omitted");
123
+ }
124
+ if (!sameCrsDefinition(outputGeometry.crs.definition, query.outputCrs)) {
125
+ semanticUnsupported("crs-transform-required", "$.outputCrs", "OData v4 has no portable output geometry transform option");
126
+ }
127
+ }
128
+ if (select.length === 0) {
129
+ semanticUnsupported("unsupported-projection", "$.select", "OData requires at least one selected property");
130
+ }
131
+ return { select, ...(outputGeometry ? { outputGeometry } : {}) };
132
+ }
133
+ function odataOutputGeometry(field, state, path) {
134
+ const propertyPath = odataRequestField(field, state, path);
135
+ const metadata = sourceOdataGeometryField(state.schema, field.name, path);
136
+ const crs = executableOdataCrs(metadata.crs, path);
137
+ if (metadata.layout !== "xy") {
138
+ semanticUnsupported("unsupported-geometry", path, "OData geometry output requires explicit xy layout metadata");
139
+ }
140
+ const spatialType = odataSpatialType(field, metadata, path);
141
+ assertOdataSpatialCategoryCrs(spatialType, crs, path);
142
+ return {
143
+ field: field.name,
144
+ propertyPath,
145
+ spatialType,
146
+ crs,
147
+ layout: "xy",
148
+ };
149
+ }
150
+ function odataOrderBy(query, state) {
151
+ if (!query.sort || query.sort.length === 0)
152
+ return undefined;
153
+ return query.sort.map((sort, index) => {
154
+ if (sort.nulls && sort.nulls !== "native") {
155
+ semanticUnsupported("unsupported-sort", `$.sort[${index}].nulls`, "OData v4 does not expose portable explicit null ordering");
156
+ }
157
+ const path = `$.sort[${index}].field`;
158
+ const field = semanticSchemaField(state.schema, sort.field, path);
159
+ return `${odataRequestField(field, state, path)} ${sort.direction}`;
160
+ });
161
+ }
162
+ function odataPage(query) {
163
+ if (!query.page)
164
+ return {};
165
+ if (query.page.limit !== undefined && query.page.limit > 2_147_483_647) {
166
+ semanticUnsupported("unsupported-node", "$.page.limit", "OData $top is int32-bounded");
167
+ }
168
+ if (query.page.kind === "offset" && query.page.offset > 2_147_483_647) {
169
+ semanticUnsupported("unsupported-node", "$.page.offset", "OData $skip is int32-bounded");
170
+ }
171
+ return {
172
+ ...(query.page.kind === "offset" ? { skip: query.page.offset } : {}),
173
+ ...(query.page.limit !== undefined ? { top: query.page.limit } : {}),
174
+ };
175
+ }
176
+ function compileOdataSemanticFilter(filter, state, path) {
177
+ switch (filter.kind) {
178
+ case "comparison": {
179
+ const field = semanticSchemaField(state.schema, filter.left.name, `${path}.left.name`);
180
+ return `${odataRequestField(field, state, `${path}.left.name`)} ${ODATA_COMPARISON_OPERATOR[filter.operator]} ${odataLiteral(filter.right.value, field, `${path}.right.value`)}`;
181
+ }
182
+ case "list": {
183
+ const field = semanticSchemaField(state.schema, filter.operand.name, `${path}.operand.name`);
184
+ const name = odataRequestField(field, state, `${path}.operand.name`);
185
+ return filter.values
186
+ .map((literal, index) => `(${name} eq ${odataLiteral(literal.value, field, `${path}.values[${index}].value`)})`)
187
+ .join(" or ");
188
+ }
189
+ case "range": {
190
+ const field = semanticSchemaField(state.schema, filter.operand.name, `${path}.operand.name`);
191
+ const name = odataRequestField(field, state, `${path}.operand.name`);
192
+ return `(${name} ge ${odataLiteral(filter.lower.value, field, `${path}.lower.value`)}) and (${name} le ${odataLiteral(filter.upper.value, field, `${path}.upper.value`)})`;
193
+ }
194
+ case "null": {
195
+ const field = semanticSchemaField(state.schema, filter.operand.name, `${path}.operand.name`);
196
+ return `${odataRequestField(field, state, `${path}.operand.name`)} ${filter.operator === "is-not-null" ? "ne" : "eq"} null`;
197
+ }
198
+ case "pattern":
199
+ return compileOdataPattern(filter, state, path);
200
+ case "boolean":
201
+ return filter.args
202
+ .map((entry, index) => odataParenthesized(compileOdataSemanticFilter(entry, state, `${path}.args[${index}]`)))
203
+ .join(filter.operator === "and" ? " and " : " or ");
204
+ case "not":
205
+ return `not ${odataParenthesized(compileOdataSemanticFilter(filter.arg, state, `${path}.arg`))}`;
206
+ case "temporal": {
207
+ if (filter.operator === "during" || filter.operator === "time-intersects") {
208
+ semanticUnsupported("unsupported-node", `${path}.operator`, `OData v4 cannot represent the OGC ${filter.operator} temporal-topology predicate exactly`);
209
+ }
210
+ const field = semanticSchemaField(state.schema, filter.operand.name, `${path}.operand.name`);
211
+ const name = odataRequestField(field, state, `${path}.operand.name`);
212
+ return `${name} ${filter.operator === "before" ? "lt" : "gt"} ${odataLiteral(filter.value.value, field, `${path}.value.value`)}`;
213
+ }
214
+ case "spatial":
215
+ return compileOdataSpatial(filter, state, path);
216
+ case "native": {
217
+ if (filter.dialect !== "odata-4.0" || filter.payload.format !== "text") {
218
+ semanticUnsupported("unsupported-native-filter", path, "OData native filters require odata-4.0 text");
219
+ }
220
+ state.usesNativeFilter = true;
221
+ return verifiedSemanticNativeText(filter.payload.text, `${path}.payload.text`, "OData 4.0");
222
+ }
223
+ }
224
+ }
225
+ function compileOdataPattern(filter, state, path) {
226
+ if (filter.caseSensitive === false) {
227
+ semanticUnsupported("unsupported-node", `${path}.caseSensitive`, "OData v4 cannot prove case-insensitive pattern semantics across services");
228
+ }
229
+ const field = semanticSchemaField(state.schema, filter.operand.name, `${path}.operand.name`);
230
+ const name = odataRequestField(field, state, `${path}.operand.name`);
231
+ const pattern = filter.pattern;
232
+ if (pattern.includes("_")) {
233
+ semanticUnsupported("unsupported-node", `${path}.pattern`, "OData string functions cannot represent the LIKE single-character wildcard");
234
+ }
235
+ const percentCount = [...pattern].filter((character) => character === "%").length;
236
+ if (percentCount === 0)
237
+ return `${name} eq ${quotedSemanticString(pattern, `${path}.pattern`)}`;
238
+ if (pattern === "%") {
239
+ semanticUnsupported("unsupported-node", `${path}.pattern`, "An always-true LIKE pattern is not emitted");
240
+ }
241
+ const starts = pattern.startsWith("%");
242
+ const ends = pattern.endsWith("%");
243
+ if (percentCount !== Number(starts) + Number(ends)) {
244
+ semanticUnsupported("unsupported-node", `${path}.pattern`, "OData string functions cannot represent an interior LIKE wildcard exactly");
245
+ }
246
+ const value = pattern.slice(starts ? 1 : 0, ends ? -1 : undefined);
247
+ if (value.length === 0 && starts && ends) {
248
+ semanticUnsupported("unsupported-node", `${path}.pattern`, "An always-true LIKE pattern is not emitted");
249
+ }
250
+ const literal = quotedSemanticString(value, `${path}.pattern`);
251
+ if (starts && ends)
252
+ return `contains(${name},${literal})`;
253
+ if (starts)
254
+ return `endswith(${name},${literal})`;
255
+ return `startswith(${name},${literal})`;
256
+ }
257
+ function odataLiteral(value, field, path) {
258
+ switch (field.type.kind) {
259
+ case "boolean":
260
+ return value ? "true" : "false";
261
+ case "integer":
262
+ case "decimal":
263
+ return typeof value === "number" ? finiteDecimalNumber(value, path) : exactDecimalText(value, path);
264
+ case "float":
265
+ return finiteDecimalNumber(value, path);
266
+ case "string":
267
+ return quotedSemanticString(value, path);
268
+ case "uuid":
269
+ case "date":
270
+ case "time":
271
+ return value;
272
+ case "timestamp":
273
+ if (/:60(?:[.Z+-]|$)/.test(value)) {
274
+ semanticUnsupported("unsupported-field-type", path, "OData Edm.DateTimeOffset does not support leap seconds");
275
+ }
276
+ return value;
277
+ case "duration":
278
+ return `duration${quotedSemanticString(value, path)}`;
279
+ case "union":
280
+ return odataUnionLiteral(value, field, path);
281
+ default:
282
+ semanticUnsupported("unsupported-field-type", path, `OData v4 cannot represent ${field.type.kind} literals exactly in $filter`);
283
+ }
284
+ }
285
+ function odataUnionLiteral(value, field, path) {
286
+ const specialFloat = field.type.kind === "union" &&
287
+ field.type.members.length === 2 &&
288
+ field.type.members.some((member) => member.kind === "float") &&
289
+ field.type.members.some((member) => member.kind === "string" && member.encoding === "odata-special-float");
290
+ const nativeFloat = field.native.some((reference) => reference.protocol === "odata" && (reference.name === "Edm.Single" || reference.name === "Edm.Double"));
291
+ if (!specialFloat || !nativeFloat) {
292
+ semanticUnsupported("unsupported-field-type", path, "OData union literal metadata is ambiguous");
293
+ }
294
+ if (typeof value === "number")
295
+ return finiteDecimalNumber(value, path);
296
+ if (value === "NaN" || value === "INF" || value === "-INF")
297
+ return value;
298
+ semanticUnsupported("unsupported-field-type", path, "OData special floats require NaN, INF, or -INF");
299
+ }
300
+ function compileOdataSpatial(filter, state, path) {
301
+ if (filter.operator === "within-distance" || filter.operator === "beyond-distance") {
302
+ semanticUnsupported("unsupported-distance", `${path}.distance`, "OData geo.distance cannot preserve semantic planar/geodesic mode and portable units");
303
+ }
304
+ if (filter.operator !== "intersects" && filter.operator !== "bbox-intersects") {
305
+ semanticUnsupported("unsupported-node", `${path}.operator`, `OData v4 has no portable function for exact ${filter.operator} semantics`);
306
+ }
307
+ if (!state.source.supportedSpatialFunctions.includes("geo.intersects")) {
308
+ semanticUnsupported("unsupported-source", `${path}.operator`, "OData source evidence does not explicitly advertise geo.intersects");
309
+ }
310
+ const fieldName = filter.property?.name ?? primaryOdataGeometryField(state.schema);
311
+ if (!fieldName) {
312
+ semanticUnsupported("unsupported-geometry", `${path}.property`, "OData requires an explicit geometry property");
313
+ }
314
+ const field = semanticSchemaField(state.schema, fieldName, `${path}.property.name`);
315
+ const propertyPath = odataRequestField(field, state, `${path}.property.name`);
316
+ const metadata = sourceOdataGeometryField(state.schema, fieldName, `${path}.property`);
317
+ const propertySpatial = odataFilterSpatialType(field, metadata, `${path}.property.name`);
318
+ const sourceCrs = executableOdataCrs(metadata.crs, `${path}.property`);
319
+ assertOdataSpatialCategoryCrs(propertySpatial.spatialType, sourceCrs, `${path}.property`);
320
+ if (metadata.layout !== "xy") {
321
+ semanticUnsupported("unsupported-geometry", `${path}.property`, "OData spatial filtering requires explicit xy geometry-property layout metadata");
322
+ }
323
+ if (filter.operator === "bbox-intersects") {
324
+ if (propertySpatial.geometryKind !== "Point") {
325
+ semanticUnsupported("unsupported-geometry", `${path}.property.name`, "OData bbox intersection requires an exact Point property for the Point,Polygon signature");
326
+ }
327
+ const literal = odataBboxLiteral(filter.bbox, sourceCrs, propertySpatial.spatialType, path);
328
+ return `geo.intersects(${propertyPath},${literal})`;
329
+ }
330
+ const literalKind = filter.geometry.geometry.type;
331
+ if (propertySpatial.geometryKind === "Point" && literalKind === "Polygon") {
332
+ const literal = odataGeometryLiteral(filter.geometry, sourceCrs, propertySpatial.spatialType, path);
333
+ return `geo.intersects(${propertyPath},${literal})`;
334
+ }
335
+ if (propertySpatial.geometryKind === "Polygon" && literalKind === "Point") {
336
+ const literal = odataGeometryLiteral(filter.geometry, sourceCrs, propertySpatial.spatialType, path);
337
+ return `geo.intersects(${literal},${propertyPath})`;
338
+ }
339
+ semanticUnsupported("unsupported-geometry", `${path}.geometry.geometry`, `OData geo.intersects requires Point,Polygon operands; property is ${propertySpatial.geometryKind} and literal is ${literalKind}`);
340
+ }
341
+ function odataGeometryLiteral(value, sourceCrs, spatialType, path) {
342
+ if (value.layout !== "xy") {
343
+ semanticUnsupported("unsupported-geometry", `${path}.geometry.layout`, "OData v4 spatial literals require an xy coordinate layout");
344
+ }
345
+ assertOdataEastNorth(value.crs, `${path}.geometry.crs`);
346
+ if (!sameExecutableCrs(sourceCrs, value.crs)) {
347
+ semanticUnsupported("crs-transform-required", `${path}.geometry.crs`, "Spatial literal CRS differs from the OData geometry property CRS");
348
+ }
349
+ return odataSpatialLiteral(spatialType, value.crs, odataWkt(value.geometry, path), `${path}.geometry.crs`);
350
+ }
351
+ function odataBboxLiteral(value, sourceCrs, spatialType, path) {
352
+ if (value.box.layout !== "xy") {
353
+ semanticUnsupported("unsupported-geometry", `${path}.bbox.box.layout`, "OData v4 bounding-box literals require an xy layout");
354
+ }
355
+ assertOdataEastNorth(value.crs, `${path}.bbox.crs`);
356
+ if (!sameExecutableCrs(sourceCrs, value.crs)) {
357
+ semanticUnsupported("crs-transform-required", `${path}.bbox.crs`, "Bounding-box CRS differs from the OData geometry property CRS");
358
+ }
359
+ const [xmin, ymin, xmax, ymax] = value.box.bounds;
360
+ const wkt = `POLYGON ((${wktPosition([xmin, ymin])}, ${wktPosition([xmax, ymin])}, ${wktPosition([
361
+ xmax,
362
+ ymax,
363
+ ])}, ${wktPosition([xmin, ymax])}, ${wktPosition([xmin, ymin])}))`;
364
+ return odataSpatialLiteral(spatialType, value.crs, wkt, `${path}.bbox.crs`);
365
+ }
366
+ function odataSpatialLiteral(spatialType, crs, wkt, path) {
367
+ const srid = odataSrid(crs, path);
368
+ return `${spatialType}'SRID=${srid};${wkt}'`;
369
+ }
370
+ function odataWkt(geometry, path) {
371
+ switch (geometry.type) {
372
+ case "Point":
373
+ return `POINT (${wktPosition(geometry.coordinates)})`;
374
+ case "MultiPoint":
375
+ return `MULTIPOINT (${geometry.coordinates.map((position) => `(${wktPosition(position)})`).join(", ")})`;
376
+ case "LineString":
377
+ return `LINESTRING (${wktLine(geometry.coordinates)})`;
378
+ case "MultiLineString":
379
+ return `MULTILINESTRING (${geometry.coordinates.map((line) => `(${wktLine(line)})`).join(", ")})`;
380
+ case "Polygon":
381
+ return `POLYGON (${geometry.coordinates.map((ring) => `(${wktLine(ring)})`).join(", ")})`;
382
+ case "MultiPolygon":
383
+ return `MULTIPOLYGON (${geometry.coordinates
384
+ .map((polygon) => `(${polygon.map((ring) => `(${wktLine(ring)})`).join(", ")})`)
385
+ .join(", ")})`;
386
+ case "GeometryCollection":
387
+ semanticUnsupported("unsupported-geometry", `${path}.geometry.geometry`, "OData v4 spatial literals do not compile GeometryCollection in this exact slice");
388
+ }
389
+ }
390
+ function wktLine(positions) {
391
+ return positions.map(wktPosition).join(", ");
392
+ }
393
+ function wktPosition(position) {
394
+ return `${finiteDecimalNumber(position[0], "$.geometry.coordinates")} ${finiteDecimalNumber(position[1], "$.geometry.coordinates")}`;
395
+ }
396
+ function executableOdataCrs(value, path) {
397
+ let crs;
398
+ try {
399
+ crs = validateExecutableCrsBinding(value, path);
400
+ }
401
+ catch {
402
+ semanticUnsupported("unsupported-crs", path, "OData requires a resolved executable geometry-property CRS");
403
+ }
404
+ if (crs.coordinateEpoch !== undefined) {
405
+ semanticUnsupported("unsupported-crs", path, "OData spatial literals cannot preserve coordinate epochs");
406
+ }
407
+ assertOdataEastNorth(crs, path);
408
+ odataSrid(crs, path);
409
+ return crs;
410
+ }
411
+ function odataSrid(value, path) {
412
+ const definition = value.definition;
413
+ if (definition.kind === "authority" &&
414
+ definition.authority.toUpperCase() === "EPSG" &&
415
+ /^\d+$/.test(definition.code)) {
416
+ const srid = Number(definition.code);
417
+ if (Number.isSafeInteger(srid) && srid > 0 && srid <= 2_147_483_647)
418
+ return srid;
419
+ }
420
+ semanticUnsupported("unsupported-crs", path, "OData spatial literals require a positive EPSG SRID");
421
+ }
422
+ function assertOdataEastNorth(value, path) {
423
+ const [x, y] = value.coordinateOrder.axes;
424
+ if (x?.direction !== "east" || y?.direction !== "north") {
425
+ semanticUnsupported("unsupported-crs", path, "OData spatial literals require east/north x/y payload axes");
426
+ }
427
+ }
428
+ const ODATA_SPATIAL_NATIVE_TYPES = {
429
+ "Edm.Geography": { spatialType: "geography" },
430
+ "Edm.GeographyPoint": { spatialType: "geography", geometryKind: "Point" },
431
+ "Edm.GeographyLineString": { spatialType: "geography", geometryKind: "LineString" },
432
+ "Edm.GeographyPolygon": { spatialType: "geography", geometryKind: "Polygon" },
433
+ "Edm.GeographyMultiPoint": { spatialType: "geography", geometryKind: "MultiPoint" },
434
+ "Edm.GeographyMultiLineString": { spatialType: "geography", geometryKind: "MultiLineString" },
435
+ "Edm.GeographyMultiPolygon": { spatialType: "geography", geometryKind: "MultiPolygon" },
436
+ "Edm.GeographyCollection": { spatialType: "geography", geometryKind: "GeometryCollection" },
437
+ "Edm.Geometry": { spatialType: "geometry" },
438
+ "Edm.GeometryPoint": { spatialType: "geometry", geometryKind: "Point" },
439
+ "Edm.GeometryLineString": { spatialType: "geometry", geometryKind: "LineString" },
440
+ "Edm.GeometryPolygon": { spatialType: "geometry", geometryKind: "Polygon" },
441
+ "Edm.GeometryMultiPoint": { spatialType: "geometry", geometryKind: "MultiPoint" },
442
+ "Edm.GeometryMultiLineString": { spatialType: "geometry", geometryKind: "MultiLineString" },
443
+ "Edm.GeometryMultiPolygon": { spatialType: "geometry", geometryKind: "MultiPolygon" },
444
+ "Edm.GeometryCollection": { spatialType: "geometry", geometryKind: "GeometryCollection" },
445
+ };
446
+ function odataSpatialType(field, metadata, path) {
447
+ return odataSpatialTypeEvidence(field, metadata, path).spatialType;
448
+ }
449
+ function odataFilterSpatialType(field, metadata, path) {
450
+ const evidence = odataSpatialTypeEvidence(field, metadata, path);
451
+ if (evidence.geometryKind !== "Point" && evidence.geometryKind !== "Polygon") {
452
+ semanticUnsupported("unsupported-source", path, "OData geo.intersects requires an exact Edm Point or Polygon property type");
453
+ }
454
+ if (metadata.geometryTypes.state !== "known" || metadata.geometryTypes.type !== evidence.geometryKind) {
455
+ semanticUnsupported("unsupported-source", path, "OData geo.intersects requires matching, single-kind SourceSchemaV2 geometry evidence");
456
+ }
457
+ return { spatialType: evidence.spatialType, geometryKind: evidence.geometryKind };
458
+ }
459
+ function odataSpatialTypeEvidence(field, metadata, path) {
460
+ const references = field.native.filter((reference) => reference.protocol === "odata");
461
+ if (references.length !== 1 || !Object.hasOwn(ODATA_SPATIAL_NATIVE_TYPES, references[0]?.name)) {
462
+ semanticUnsupported("unsupported-source", path, "OData geometry properties require one exact OData v4 Edm.Geography or Edm.Geometry primitive type");
463
+ }
464
+ const type = references[0]?.name;
465
+ const evidence = ODATA_SPATIAL_NATIVE_TYPES[type];
466
+ if (!evidence) {
467
+ semanticUnsupported("unsupported-source", path, "OData spatial native type evidence is unavailable");
468
+ }
469
+ const geometryKind = evidence.geometryKind;
470
+ if (geometryKind && (metadata.geometryTypes.state !== "known" || metadata.geometryTypes.type !== geometryKind)) {
471
+ semanticUnsupported("unsupported-source", path, "OData native spatial primitive requires matching, single-kind SourceSchemaV2 geometry evidence");
472
+ }
473
+ return evidence;
474
+ }
475
+ const ODATA_ANGULAR_AXIS_UNITS = new Set(["degree", "radian"]);
476
+ const ODATA_LINEAR_AXIS_UNITS = new Set([
477
+ "metre",
478
+ "meter",
479
+ "kilometre",
480
+ "kilometer",
481
+ "foot",
482
+ "us-survey-foot",
483
+ "mile",
484
+ "nautical-mile",
485
+ "yard",
486
+ ]);
487
+ function assertOdataSpatialCategoryCrs(spatialType, crs, path) {
488
+ const units = crs.coordinateOrder.axes.slice(0, 2).map((axis) => axis.unit?.toLowerCase());
489
+ const category = units.every((unit) => unit !== undefined && ODATA_ANGULAR_AXIS_UNITS.has(unit))
490
+ ? "geography"
491
+ : units.every((unit) => unit !== undefined && ODATA_LINEAR_AXIS_UNITS.has(unit))
492
+ ? "geometry"
493
+ : undefined;
494
+ if (category !== spatialType) {
495
+ semanticUnsupported("unsupported-crs", path, `OData ${spatialType} requires ${spatialType === "geography" ? "angular" : "linear"} horizontal CRS axes`);
496
+ }
497
+ }
498
+ function sourceOdataGeometryField(schema, name, path) {
499
+ if (schema.geometry.state !== "known") {
500
+ semanticUnsupported("unsupported-source", path, "OData source geometry metadata is unavailable");
501
+ }
502
+ const field = schema.geometry.fields.find((candidate) => candidate.field === name);
503
+ if (!field)
504
+ semanticUnsupported("unsupported-source", path, "OData geometry-property metadata is unavailable");
505
+ return field;
506
+ }
507
+ function primaryOdataGeometryField(schema) {
508
+ return schema.geometry.state === "known" && schema.geometry.primaryField.state === "known"
509
+ ? schema.geometry.primaryField.field
510
+ : undefined;
511
+ }
512
+ function odataRequestField(field, state, path) {
513
+ const requestField = odataPropertyPath(field.path, path);
514
+ recordSemanticFieldMapping(state.fieldMappings, field, requestField);
515
+ return requestField;
516
+ }
517
+ function odataParenthesized(value) {
518
+ return `(${value})`;
519
+ }
@@ -0,0 +1,55 @@
1
+ import type { CanonicalGeometry, CrsDefinition, ExecutableBoundingBox, ExecutableCrsBinding, ExecutableGeometryValue, JsonValue, LogicalField, SourceProtocol, SourceSchemaV2 } from "../contract/schema.js";
2
+ export interface OgcAxisPlan {
3
+ readonly srsName: string;
4
+ /** Target/definition-axis index to source/payload-axis index. */
5
+ readonly permutation: readonly number[];
6
+ }
7
+ export interface NormalizedNamespaceBindings {
8
+ readonly bindings: Readonly<Record<string, string>>;
9
+ readonly ordered: readonly (readonly [string, string])[];
10
+ }
11
+ /** @internal Normalize an explicit conformance declaration without inferring support. */
12
+ export declare function normalizeConformanceUris(value: readonly string[], path: string): readonly string[];
13
+ /** @internal Normalize explicit CRS/namespace-style URI evidence. */
14
+ export declare function normalizeIdentifierUris(value: readonly string[] | undefined, path: string): readonly string[];
15
+ /** @internal Stable identity for normalized source capability evidence. */
16
+ export declare function compilerEvidenceFingerprint(domain: string, evidence: JsonValue): `sha256:${string}`;
17
+ /** @internal Stable identity for an immutable compiled request pre-image. */
18
+ export declare function compiledRequestFingerprint(domain: string, artifact: JsonValue): `sha256:${string}`;
19
+ /** @internal Match only the OGC conformance identifier itself, not a substring. */
20
+ export declare function hasConformanceClass(conformsTo: readonly string[], standard: string, name: string): boolean;
21
+ /** @internal Select the physical source property represented by one logical field. */
22
+ export declare function ogcFieldPath(schema: SourceSchemaV2, name: string, protocol: Extract<SourceProtocol, "ogc-features" | "wfs">, path: string): readonly string[];
23
+ /** @internal Require a single CQL2 queryable name. */
24
+ export declare function cql2FieldName(schema: SourceSchemaV2, name: string, path: string): string;
25
+ /** @internal Require a namespace-safe FES ValueReference. */
26
+ export declare function fesValueReference(schema: SourceSchemaV2, name: string, namespaces: NormalizedNamespaceBindings, path: string): string;
27
+ /** @internal Validate and deterministically order namespace bindings. */
28
+ export declare function normalizeNamespaceBindings(value: Readonly<Record<string, string>> | undefined, path: string): NormalizedNamespaceBindings;
29
+ /** @internal Verify a QName used for a WFS feature type. */
30
+ export declare function validateFesTypeName(typeName: string, namespaces: NormalizedNamespaceBindings, path: string): string;
31
+ /** @internal Produce a URI usable as CQL2 filter-crs, WFS srsName, or output CRS. */
32
+ export declare function ogcCrsUri(definition: CrsDefinition, path: string): string;
33
+ /** @internal Build an executable axis reordering plan; this never transforms values or units. */
34
+ export declare function ogcAxisPlan(binding: ExecutableCrsBinding, dimensions: 2 | 3, path: string): OgcAxisPlan;
35
+ /** @internal Reorder a validated semantic geometry into CRS-definition axis order. */
36
+ export declare function geometryInDefinitionOrder(value: ExecutableGeometryValue, path: string): CanonicalGeometry;
37
+ /** @internal Reorder a validated semantic bounding box into CRS-definition axis order. */
38
+ export declare function bboxInDefinitionOrder(value: ExecutableBoundingBox, path: string): readonly number[];
39
+ /** @internal Return the executable filter CRS after verifying every spatial leaf agrees. */
40
+ export declare function sharedFilterCrs(current: ExecutableCrsBinding | undefined, next: ExecutableCrsBinding, path: string): ExecutableCrsBinding;
41
+ /** @internal Resolve the field metadata used to encode typed literals. */
42
+ export declare function compilerField(schema: SourceSchemaV2, name: string, path: string): LogicalField;
43
+ /** @internal CQL2 identifiers follow the XML-Name-derived grammar in CQL2 1.0. */
44
+ export declare function cql2Identifier(value: string, path: string): string;
45
+ /** @internal Encode a CQL2 character literal with all standardized control escapes. */
46
+ export declare function cql2StringLiteral(value: string, path: string): string;
47
+ /** @internal Escape XML 1.0 character data after rejecting unrepresentable code points. */
48
+ export declare function xmlText(value: string, path: string): string;
49
+ /** @internal Escape XML 1.0 attribute data after rejecting unrepresentable code points. */
50
+ export declare function xmlAttribute(value: string, path: string): string;
51
+ /** @internal Canonical finite-number rendering shared by CQL2, WKT, and GML. */
52
+ export declare function ogcNumber(value: number, path: string): string;
53
+ /** @internal Convert canonical geometry to deterministic WKT after axis reordering. */
54
+ export declare function geometryToWkt(value: CanonicalGeometry, layout: "xy" | "xyz", path: string): string;
55
+ //# sourceMappingURL=ogc-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ogc-compiler.d.ts","sourceRoot":"","sources":["../../../src/query-planner/ogc-compiler.ts"],"names":[],"mappings":"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"}