breeze-client 2.2.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +83 -63
  3. package/adapters/abstract-data-service-adapter.d.ts +120 -0
  4. package/adapters/abstract-data-service-adapter.js +395 -0
  5. package/adapters/abstract-data-service-adapter.js.map +1 -0
  6. package/adapters/adapter-ajax-fetch.d.ts +12 -0
  7. package/adapters/adapter-ajax-fetch.js +13 -0
  8. package/adapters/adapter-ajax-fetch.js.map +1 -0
  9. package/{adapter-ajax-post → adapters}/adapter-ajax-post.d.ts +40 -36
  10. package/{fesm2022/breeze-client-adapter-ajax-post.mjs → adapters/adapter-ajax-post.js} +80 -82
  11. package/adapters/adapter-ajax-post.js.map +1 -0
  12. package/{adapter-ajax-fetch → adapters}/adapter-core.d.ts +4 -4
  13. package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → adapters/adapter-core.js} +48 -91
  14. package/adapters/adapter-core.js.map +1 -0
  15. package/adapters/adapter-data-service-webapi.d.ts +9 -0
  16. package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → adapters/adapter-data-service-webapi.js} +105 -107
  17. package/adapters/adapter-data-service-webapi.js.map +1 -0
  18. package/adapters/adapter-model-library-backing-store.d.ts +32 -0
  19. package/adapters/adapter-model-library-backing-store.js +321 -0
  20. package/adapters/adapter-model-library-backing-store.js.map +1 -0
  21. package/adapters/adapter-uri-builder-json.d.ts +11 -0
  22. package/adapters/adapter-uri-builder-json.js +40 -0
  23. package/adapters/adapter-uri-builder-json.js.map +1 -0
  24. package/adapters/http.d.ts +52 -0
  25. package/adapters/http.js +202 -0
  26. package/adapters/http.js.map +1 -0
  27. package/angular/adapter-angular-httpclient.d.ts +21 -0
  28. package/angular/adapter-angular-httpclient.js +70 -0
  29. package/angular/adapter-angular-httpclient.js.map +1 -0
  30. package/breeze.d.ts +215 -0
  31. package/breeze.js +141 -0
  32. package/breeze.js.map +1 -0
  33. package/config/config.d.ts +212 -0
  34. package/config/config.js +392 -0
  35. package/config/config.js.map +1 -0
  36. package/config/configure.d.ts +66 -0
  37. package/config/configure.js +46 -0
  38. package/config/configure.js.map +1 -0
  39. package/config/default-adapters.d.ts +1 -0
  40. package/config/default-adapters.js +40 -0
  41. package/config/default-adapters.js.map +1 -0
  42. package/config/interface-registry.d.ts +191 -0
  43. package/config/interface-registry.js +5 -0
  44. package/config/interface-registry.js.map +1 -0
  45. package/{src → core}/assert-param.d.ts +52 -60
  46. package/core/assert-param.js +390 -0
  47. package/core/assert-param.js.map +1 -0
  48. package/core/core.d.ts +285 -0
  49. package/core/core.js +772 -0
  50. package/core/core.js.map +1 -0
  51. package/core/enum.d.ts +116 -0
  52. package/core/enum.js +167 -0
  53. package/core/enum.js.map +1 -0
  54. package/core/event.d.ts +169 -0
  55. package/core/event.js +338 -0
  56. package/core/event.js.map +1 -0
  57. package/entity/array.d.ts +3 -0
  58. package/entity/array.js +4 -0
  59. package/entity/array.js.map +1 -0
  60. package/entity/complex-array.d.ts +17 -0
  61. package/entity/complex-array.js +104 -0
  62. package/entity/complex-array.js.map +1 -0
  63. package/entity/default-property-interceptor.d.ts +1 -0
  64. package/entity/default-property-interceptor.js +496 -0
  65. package/entity/default-property-interceptor.js.map +1 -0
  66. package/{src → entity}/entity-action.d.ts +36 -42
  67. package/entity/entity-action.js +45 -0
  68. package/entity/entity-action.js.map +1 -0
  69. package/entity/entity-aspect.d.ts +457 -0
  70. package/entity/entity-aspect.js +1262 -0
  71. package/entity/entity-aspect.js.map +1 -0
  72. package/entity/entity-base.d.ts +55 -0
  73. package/entity/entity-base.js +41 -0
  74. package/entity/entity-base.js.map +1 -0
  75. package/entity/entity-group.d.ts +1 -0
  76. package/entity/entity-group.js +224 -0
  77. package/entity/entity-group.js.map +1 -0
  78. package/entity/entity-key.d.ts +95 -0
  79. package/entity/entity-key.js +189 -0
  80. package/entity/entity-key.js.map +1 -0
  81. package/{src → entity}/entity-state.d.ts +112 -84
  82. package/entity/entity-state.js +135 -0
  83. package/entity/entity-state.js.map +1 -0
  84. package/entity/key-generator.d.ts +57 -0
  85. package/entity/key-generator.js +155 -0
  86. package/entity/key-generator.js.map +1 -0
  87. package/entity/observable-array.d.ts +25 -0
  88. package/entity/observable-array.js +230 -0
  89. package/entity/observable-array.js.map +1 -0
  90. package/entity/primitive-array.d.ts +12 -0
  91. package/entity/primitive-array.js +71 -0
  92. package/entity/primitive-array.js.map +1 -0
  93. package/entity/relation-array.d.ts +24 -0
  94. package/entity/relation-array.js +176 -0
  95. package/entity/relation-array.js.map +1 -0
  96. package/entity/unattached-children-map.d.ts +1 -0
  97. package/entity/unattached-children-map.js +105 -0
  98. package/entity/unattached-children-map.js.map +1 -0
  99. package/generate-entity-classes.js +1176 -0
  100. package/manager/entity-manager.d.ts +801 -0
  101. package/manager/entity-manager.js +2395 -0
  102. package/manager/entity-manager.js.map +1 -0
  103. package/{src → manager}/save-options.d.ts +48 -42
  104. package/manager/save-options.js +51 -0
  105. package/manager/save-options.js.map +1 -0
  106. package/{src → metadata}/data-service.d.ts +229 -184
  107. package/metadata/data-service.js +246 -0
  108. package/metadata/data-service.js.map +1 -0
  109. package/metadata/data-type.d.ts +122 -0
  110. package/metadata/data-type.js +465 -0
  111. package/metadata/data-type.js.map +1 -0
  112. package/metadata/entity-metadata.d.ts +1193 -0
  113. package/metadata/entity-metadata.js +2502 -0
  114. package/metadata/entity-metadata.js.map +1 -0
  115. package/{src → metadata}/local-query-comparison-options.d.ts +65 -59
  116. package/metadata/local-query-comparison-options.js +69 -0
  117. package/metadata/local-query-comparison-options.js.map +1 -0
  118. package/{src → metadata}/naming-convention.d.ts +75 -72
  119. package/metadata/naming-convention.js +97 -0
  120. package/metadata/naming-convention.js.map +1 -0
  121. package/mixins/mixin-get-entity-graph.d.ts +63 -0
  122. package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → mixins/mixin-get-entity-graph.js} +331 -253
  123. package/mixins/mixin-get-entity-graph.js.map +1 -0
  124. package/mixins/mixin-save-queuing.d.ts +98 -0
  125. package/{fesm2022/breeze-client-mixin-save-queuing.mjs → mixins/mixin-save-queuing.js} +493 -365
  126. package/mixins/mixin-save-queuing.js.map +1 -0
  127. package/package.json +63 -94
  128. package/query/entity-query.d.ts +521 -0
  129. package/query/entity-query.js +1149 -0
  130. package/query/entity-query.js.map +1 -0
  131. package/{src → query}/mapping-context.d.ts +44 -46
  132. package/query/mapping-context.js +412 -0
  133. package/query/mapping-context.js.map +1 -0
  134. package/query/predicate.d.ts +394 -0
  135. package/query/predicate.js +1294 -0
  136. package/query/predicate.js.map +1 -0
  137. package/query/property-path.d.ts +252 -0
  138. package/query/property-path.js +2 -0
  139. package/query/property-path.js.map +1 -0
  140. package/{src → query}/query-options.d.ts +143 -119
  141. package/query/query-options.js +180 -0
  142. package/query/query-options.js.map +1 -0
  143. package/rxjs/breeze-rxjs.d.ts +72 -0
  144. package/rxjs/breeze-rxjs.js +117 -0
  145. package/rxjs/breeze-rxjs.js.map +1 -0
  146. package/validation/validate.d.ts +583 -0
  147. package/validation/validate.js +961 -0
  148. package/validation/validate.js.map +1 -0
  149. package/{src → validation}/validation-options.d.ts +67 -63
  150. package/validation/validation-options.js +70 -0
  151. package/validation/validation-options.js.map +1 -0
  152. package/adapter-ajax-angularjs/adapter-ajax-angularjs.d.ts +0 -17
  153. package/adapter-ajax-angularjs/adapter-core.d.ts +0 -4
  154. package/adapter-ajax-angularjs/index.d.ts +0 -5
  155. package/adapter-ajax-fetch/adapter-ajax-fetch.d.ts +0 -18
  156. package/adapter-ajax-fetch/index.d.ts +0 -5
  157. package/adapter-ajax-httpclient/adapter-ajax-httpclient.d.ts +0 -13
  158. package/adapter-ajax-httpclient/adapter-core.d.ts +0 -4
  159. package/adapter-ajax-httpclient/index.d.ts +0 -5
  160. package/adapter-ajax-jquery/adapter-ajax-jquery.d.ts +0 -15
  161. package/adapter-ajax-jquery/index.d.ts +0 -5
  162. package/adapter-ajax-post/index.d.ts +0 -5
  163. package/adapter-data-service-odata/adapter-core.d.ts +0 -4
  164. package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -17
  165. package/adapter-data-service-odata/index.d.ts +0 -5
  166. package/adapter-data-service-webapi/adapter-data-service-webapi.d.ts +0 -15
  167. package/adapter-data-service-webapi/index.d.ts +0 -5
  168. package/adapter-model-library-backing-store/adapter-model-library-backing-store.d.ts +0 -10
  169. package/adapter-model-library-backing-store/index.d.ts +0 -5
  170. package/adapter-model-library-ko/adapter-model-library-ko.d.ts +0 -10
  171. package/adapter-model-library-ko/index.d.ts +0 -5
  172. package/adapter-uri-builder-json/adapter-core.d.ts +0 -4
  173. package/adapter-uri-builder-json/adapter-uri-builder-json.d.ts +0 -8
  174. package/adapter-uri-builder-json/index.d.ts +0 -5
  175. package/adapter-uri-builder-odata/adapter-core.d.ts +0 -4
  176. package/adapter-uri-builder-odata/adapter-uri-builder-odata.d.ts +0 -8
  177. package/adapter-uri-builder-odata/index.d.ts +0 -5
  178. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
  179. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
  180. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
  181. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
  182. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
  183. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
  184. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
  185. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
  186. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
  187. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
  188. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
  189. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
  190. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
  191. package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
  192. package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -461
  193. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
  194. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
  195. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
  196. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
  197. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
  198. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
  199. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
  200. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
  201. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
  202. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
  203. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
  204. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
  205. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
  206. package/esm2022/breeze-client.mjs +0 -5
  207. package/esm2022/index.mjs +0 -2
  208. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
  209. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
  210. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
  211. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
  212. package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
  213. package/esm2022/src/array.mjs +0 -4
  214. package/esm2022/src/assert-param.mjs +0 -330
  215. package/esm2022/src/breeze.mjs +0 -85
  216. package/esm2022/src/complex-array.mjs +0 -117
  217. package/esm2022/src/config.mjs +0 -232
  218. package/esm2022/src/core.mjs +0 -712
  219. package/esm2022/src/csdl-metadata-parser.mjs +0 -385
  220. package/esm2022/src/data-service.mjs +0 -221
  221. package/esm2022/src/data-type.mjs +0 -510
  222. package/esm2022/src/default-property-interceptor.mjs +0 -460
  223. package/esm2022/src/entity-action.mjs +0 -45
  224. package/esm2022/src/entity-aspect.mjs +0 -897
  225. package/esm2022/src/entity-group.mjs +0 -192
  226. package/esm2022/src/entity-key.mjs +0 -125
  227. package/esm2022/src/entity-manager.mjs +0 -2163
  228. package/esm2022/src/entity-metadata.mjs +0 -2242
  229. package/esm2022/src/entity-query.mjs +0 -1024
  230. package/esm2022/src/entity-state.mjs +0 -107
  231. package/esm2022/src/enum.mjs +0 -143
  232. package/esm2022/src/event.mjs +0 -264
  233. package/esm2022/src/interface-registry.mjs +0 -39
  234. package/esm2022/src/key-generator.mjs +0 -110
  235. package/esm2022/src/local-query-comparison-options.mjs +0 -65
  236. package/esm2022/src/mapping-context.mjs +0 -411
  237. package/esm2022/src/naming-convention.mjs +0 -92
  238. package/esm2022/src/observable-array.mjs +0 -183
  239. package/esm2022/src/predicate.mjs +0 -1259
  240. package/esm2022/src/primitive-array.mjs +0 -85
  241. package/esm2022/src/query-options.mjs +0 -152
  242. package/esm2022/src/relation-array.mjs +0 -173
  243. package/esm2022/src/save-options.mjs +0 -41
  244. package/esm2022/src/unattached-children-map.mjs +0 -56
  245. package/esm2022/src/validate.mjs +0 -995
  246. package/esm2022/src/validation-options.mjs +0 -64
  247. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs +0 -190
  248. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
  249. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs +0 -190
  250. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
  251. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs +0 -194
  252. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
  253. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs +0 -114
  254. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
  255. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
  256. package/fesm2022/breeze-client-adapter-data-service-odata.mjs +0 -516
  257. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  258. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  259. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs +0 -276
  260. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
  261. package/fesm2022/breeze-client-adapter-model-library-ko.mjs +0 -248
  262. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
  263. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
  264. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs +0 -246
  265. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
  266. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
  267. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
  268. package/fesm2022/breeze-client.mjs +0 -14144
  269. package/fesm2022/breeze-client.mjs.map +0 -1
  270. package/index.d.ts +0 -1
  271. package/mixin-get-entity-graph/index.d.ts +0 -5
  272. package/mixin-get-entity-graph/mixin-get-entity-graph.d.ts +0 -31
  273. package/mixin-save-queuing/index.d.ts +0 -5
  274. package/mixin-save-queuing/mixin-save-queuing.d.ts +0 -32
  275. package/src/abstract-data-service-adapter.d.ts +0 -84
  276. package/src/array.d.ts +0 -3
  277. package/src/breeze.d.ts +0 -139
  278. package/src/complex-array.d.ts +0 -13
  279. package/src/config.d.ts +0 -104
  280. package/src/core.d.ts +0 -164
  281. package/src/csdl-metadata-parser.d.ts +0 -7
  282. package/src/data-type.d.ts +0 -89
  283. package/src/default-property-interceptor.d.ts +0 -4
  284. package/src/entity-aspect.d.ts +0 -332
  285. package/src/entity-group.d.ts +0 -28
  286. package/src/entity-key.d.ts +0 -77
  287. package/src/entity-manager.d.ts +0 -680
  288. package/src/entity-metadata.d.ts +0 -988
  289. package/src/entity-query.d.ts +0 -444
  290. package/src/enum.d.ts +0 -100
  291. package/src/event.d.ts +0 -142
  292. package/src/interface-registry.d.ts +0 -150
  293. package/src/key-generator.d.ts +0 -12
  294. package/src/observable-array.d.ts +0 -52
  295. package/src/predicate.d.ts +0 -376
  296. package/src/primitive-array.d.ts +0 -7
  297. package/src/relation-array.d.ts +0 -18
  298. package/src/unattached-children-map.d.ts +0 -19
  299. package/src/validate.d.ts +0 -650
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate.js","sourceRoot":"","sources":["../../src/query/predicate.ts"],"names":[],"mappings":"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","sourcesContent":["import { core, arraySlice, hasOwnProperty as hasOwnProp, stringStartsWith as strStartsWith, stringEndsWith as strEndsWith } from '../core/core.js';\nimport { EntityType, StructuralType, DataProperty } from '../metadata/entity-metadata.js';\nimport { QueryOp } from './entity-query.js';\nimport type { FilterQueryOp, RecursiveArray } from './entity-query.js';\nimport { DataType } from '../metadata/data-type.js';\nimport { EntityAspect, Entity } from '../entity/entity-aspect.js';\nimport { LocalQueryComparisonOptions } from '../metadata/local-query-comparison-options.js';\nimport type { CollectionElement, CollectionPath, FilterOpFor, FilterValueFor, FunctionExpressionPath, NoInferFrom, PropertyPath, PropertyValue, QuantifierOp, WhereObject } from './property-path.js';\n\nexport interface Op {\n key: string;\n aliases?: string[];\n isFunction?: boolean;\n}\n\n/** @hidden @internal */\nexport interface OpMap {\n [key: string]: Op;\n}\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport interface Visitor {\n\n}\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport interface VisitContext {\n entityType?: EntityType;\n // usesNameOnServer?: boolean;\n toNameOnServer?: boolean;\n useExplicitDataType?: boolean;\n visitor?: Visitor;\n}\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport interface ExpressionContext {\n entityType?: EntityType;\n usesNameOnServer?: boolean;\n dataType?: DataType | string;\n isRHS?: boolean;\n isFnArg?: boolean;\n}\n\n/**\nBuilds {@link Predicate}s checked against one entity type - what {@link Predicate.for} returns.\n\nEach Predicate it produces is a `Predicate<T>`, so combining them with `and`, `or` and `not` is\nchecked too, and an {@link EntityQuery} for another type will not accept them.\n*/\nexport interface TypedPredicateFactory<T> {\n // Escapes first, checked forms last - when no signature matches, the compiler reports the last\n // one, and its message is the useful one. Same arrangement as EntityQuery.where().\n /** A path only known at run time, or a query function, neither of which can be checked.\n ```ts\n const p = Predicate.for(Customer);\n const byColumn = p(userChosenColumn, \"eq\", value); // userChosenColumn: string\n const byFunction = p(\"toLower(companyName)\", \"startsWith\", \"c\");\n ```\n */\n <P extends string>(property: P extends FunctionExpressionPath ? P : (string extends P ? P : never),\n operator: string | FilterQueryOp, value: any): Predicate<T>;\n <P extends string>(collection: string extends P ? P : never, quantifier: string | FilterQueryOp,\n property: string, operator: string | FilterQueryOp, value: any): Predicate<T>;\n /** A property, an operator that suits its type, and a matching value.\n ```ts\n const p = Predicate.for(Order);\n const pred = p(\"freight\", \"gt\", 100);\n const viaNavigation = p(\"customer.companyName\", \"startsWith\", \"A\");\n ```\n */\n <P extends PropertyPath<T>, O extends FilterOpFor<PropertyValue<T, P>>>(\n property: P, operator: O, value: FilterValueFor<T, PropertyValue<T, P>, O>): Predicate<T>;\n /** `any` or `all` over a collection, filtered by a Predicate built for the element type.\n ```ts\n const pd = Predicate.for(OrderDetail);\n const pred = Predicate.for(Order)(\"orderDetails\", \"any\", pd(\"unitPrice\", \">\", 20));\n ```\n */\n <P extends CollectionPath<T>>(collection: P, quantifier: QuantifierOp | FilterQueryOp,\n predicate: Predicate<CollectionElement<T, P>>): Predicate<T>;\n /** `any` or `all` over a collection, then a filter on the element type.\n ```ts\n const p = Predicate.for(Customer);\n const pred = p(\"orders\", \"all\", \"freight\", \"lt\", 100);\n ```\n */\n <P extends CollectionPath<T>,\n P2 extends PropertyPath<CollectionElement<T, P>>,\n O2 extends FilterOpFor<PropertyValue<CollectionElement<T, P>, P2>>>(\n collection: P, quantifier: QuantifierOp, property: P2, operator: O2,\n value: FilterValueFor<CollectionElement<T, P>, PropertyValue<CollectionElement<T, P>, P2>, O2>): Predicate<T>;\n /** The object form, checked in full.\n ```ts\n const p = Predicate.for(Customer);\n const pred = p({ city: \"London\", companyName: { startsWith: \"A\" } });\n ```\n */\n (predicate: WhereObject<T>): Predicate<T>;\n}\n\n/**\nUsed to define a 'where' predicate for an {@link EntityQuery}. Predicates are immutable, which means that any\nmethod that would modify a Predicate actually returns a new Predicate.\n```ts\nconst p = Predicate.for(Order);\nconst p1 = p(\"freight\", \">\", 100);\nconst p2 = p1.and(p(\"shipCity\", \"startsWith\", \"C\"));\nconst query = EntityQuery.from(Order).where(p2);\n```\n*/\nexport class Predicate<T = any> {\n /**\n Never set: it is here only so that a `Predicate<Order>` and a `Predicate<Customer>` are different\n types. It is public because a private member reaches the published .d.ts without its type, which\n would lose the distinction.\n @hidden\n */\n declare readonly _$predicateFor?: T;\n /** The operator of this predicate. Its `key` is, for example, `eq` or `gt` for a comparison, `and` or `or` for a composite, `not`, or `any` or `all`. `undefined` for a pass-through predicate made from a raw filter string. __Read Only__ */\n declare op: Op;\n /** @hidden @internal */\n declare _entityType?: EntityType;\n /** @hidden @internal */\n declare aliasMap: OpMap;\n /** The name of the visitor method that handles this kind of predicate, such as `binaryPredicate` or `andOrPredicate`. Used by Breeze when it serializes or evaluates a predicate; applications do not normally need it. __Read Only__ */\n declare visitorMethodName: string;\n\n\n /**\n Predicate constructor. The compiler checks nothing it is given; for that, build the Predicate with\n {@link Predicate.for} or {@link Predicate.create} and a type argument instead.\n ```ts\n const p1 = new Predicate(\"companyName\", \"startsWith\", \"B\");\n const query = EntityQuery.from(Customer).where(p1);\n ```\n\n or\n ```ts\n const p2 = new Predicate(\"region\", FilterQueryOp.Equals, null);\n const query = EntityQuery.from(Customer).where(p2);\n ```\n @param args - `property, operator, value`, in that order:\n - **property**: A property name, a nested property name or an expression involving a property name.\n - **operator**: the filter query operator.\n - **value**: This will be treated as either a property expression or a literal depending on context. In general,\n if the value can be interpreted as a property expression it will be, otherwise it will be treated as a literal.\n In most cases this works well, but you can also force the interpretation by making the value argument itself an object with a 'value'\n property and an 'isLiteral' property set to either true or false. Breeze also tries to infer the dataType of any\n literal based on context, if this fails you can force this inference by making the value argument an object with a\n 'value' property and a 'dataType' property set to one of the breeze.DataType enumeration instances.\n */\n constructor(...args: any[]) {\n if (args.length === 0) return;\n if (!(this instanceof Predicate)) {\n return new Predicate(...<any>args);\n }\n return (Predicate.create as (...a: any[]) => Predicate)(...args);\n }\n\n // Naming the entity type checks the predicate against it. The checked overloads come last, so\n // that when none matches it is their error the compiler reports rather than an escape's.\n //\n // How much is checked depends on which form you use, and it is a limit of the language rather\n // than a choice: supplying T explicitly stops TypeScript inferring the remaining type\n // parameters, so the three-argument form cannot tie its value back to the property named in\n // its first argument. The object form has only T to infer, so it is checked in full - operator\n // and value included, with a spelling suggestion for a misspelled key. Predicate.for() is the\n // other way to get the whole check, by inferring T from a constructor instead of being told it.\n static create<T = any>(predicate: Predicate<T>): Predicate<T>;\n static create(rawFilterString: string): Predicate;\n static create(anArray: RecursiveArray<string | number | FilterQueryOp | Predicate>): Predicate;\n static create<P extends string>(property: P extends FunctionExpressionPath ? P : (string extends P ? P : never),\n operator: string | FilterQueryOp, value: any): Predicate;\n static create<P extends string>(collection: string extends P ? P : never,\n quantifier: string | FilterQueryOp, property: string,\n operator: string | FilterQueryOp, value: any): Predicate;\n static create(property: string, filterop: string, property2: string, filterop2: string,\n property3: string, filterop3: string, value: any): Predicate;\n /** Checks the property path against `T`. The operator and the value are not tied to that\n property: supplying `T` stops TypeScript inferring the rest from the path. Use the object form,\n or {@link Predicate.for}, to have them checked too.\n ```ts\n const p = Predicate.create<Customer>(\"companyName\", \"startsWith\", \"C\");\n ```\n */\n static create<T = any>(property: PropertyPath<NoInferFrom<T>> | FunctionExpressionPath,\n operator: string | FilterQueryOp, value: any): Predicate<T>;\n /** `any` or `all` over a collection, filtered by a Predicate built for the element type.\n ```ts\n const pd = Predicate.for(OrderDetail);\n const p = Predicate.create<Order>(\"orderDetails\", \"any\", pd(\"unitPrice\", \">\", 20));\n ```\n */\n static create<T = any>(collection: CollectionPath<NoInferFrom<T>>, quantifier: QuantifierOp | FilterQueryOp,\n predicate: Predicate): Predicate<T>;\n /** Checks the collection path against `T`.\n ```ts\n const p = Predicate.create<Customer>(\"orders\", \"any\", \"freight\", \">\", 100);\n ```\n */\n static create<T = any>(collection: CollectionPath<NoInferFrom<T>>, quantifier: QuantifierOp | FilterQueryOp,\n property: string, operator: string | FilterQueryOp, value: any): Predicate<T>;\n /** The object form, checked in full against `T`.\n ```ts\n const p = Predicate.create<Order>({ freight: { gt: 100 }, shipCity: { startsWith: \"C\" } });\n ```\n */\n static create<T = any>(predicate: WhereObject<NoInferFrom<T>>): Predicate<T>;\n /**\n Same as using the ctor, except that given the entity type as a type argument, the compiler checks\n the predicate against that type - everything in the object form, the property path in the\n three-argument form:\n ```ts\n const p1 = Predicate.create<Order>({ freight: { gt: 100 } });\n const p2 = Predicate.create<Order>(\"freight\", \">\", 100);\n ```\n\n Without one, nothing is checked, and\n ```ts\n const p3 = Predicate.create(\"freight\", \">\", 100);\n // is the same as\n const p4 = new Predicate(\"freight\", \">\", 100);\n ```\n @param args - `property, operator, value`, in that order:\n - **property**: A property name, a nested property name or an expression involving a property name.\n - **operator**: the filter query operator.\n - **value**: This will be treated as either a property expression or a literal depending on context. In general,\n if the value can be interpreted as a property expression it will be, otherwise it will be treated as a literal.\n In most cases this works well, but you can also force the interpretation by making the value argument itself an object with a 'value'\n property and an 'isLiteral' property set to either true or false. Breeze also tries to infer the dataType of any\n literal based on context, if this fails you can force this inference by making the value argument an object with a\n 'value' property and a 'dataType' property set to one of the breeze.DataType enumeration instances.\n */\n static create(...args: any[]) {\n // can be called from std javascript without new ( legacy )\n\n // empty ctor is used by all subclasses.\n if (args.length === 0) return new Predicate();\n if (args.length === 1) {\n // possibilities:\n // Predicate([ aPredicate ]) or Predicate([\"freight\", \">\", 100]) - an array\n // Predicate(aPredicate) - a predicate\n // Predicate( \"freight gt 100\" } // passthru ( i.e. a raw filter string) - a string\n // Predicate( { freight: { \">\": 100 } }) - an object\n let arg = arguments[0];\n if (Array.isArray(arg)) {\n if (arg.length === 1) {\n // recurse\n return new Predicate(arg[0]);\n } else {\n return createPredicateFromArray(arg);\n }\n } else if (arg instanceof Predicate) {\n return arg;\n } else if (typeof arg === 'string') {\n return new PassthruPredicate(arg);\n } else {\n return createPredicateFromObject(arg);\n }\n } else {\n // 2 possibilities\n // Predicate(\"freight\", \">\", 100\");\n // Predicate(\"orders\", \"any\", \"freight\", \">\", 950);\n return createPredicateFromArray(args);\n }\n }\n\n /** @hidden @internal */\n _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\n // noop here;\n }\n\n /**\n Creates a 'composite' Predicate by 'and'ing a set of specified Predicates together.\n ```ts\n const p = Predicate.for(Order);\n const dt = new Date(1988, 9, 12);\n const p1 = p(\"orderDate\", \"ne\", dt);\n const p2 = p(\"shipCity\", \"startsWith\", \"C\");\n const p3 = p(\"freight\", \">\", 100);\n const newPred = Predicate.and(p1, p2, p3);\n ```\n\n or\n ```ts\n const preds = [p1, p2, p3];\n const newPred = Predicate.and(preds);\n ```\n @param predicates - multiple Predicates or an array of Predicates. \n Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\n */\n static and<T = any>(...predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n static and<T = any>(predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n static and(...args: any[]) {\n return new AndOrPredicate(\"and\", args);\n }\n\n /**\n Creates a 'composite' Predicate by 'or'ing a set of specified Predicates together.\n ```ts\n const p = Predicate.for(Order);\n const dt = new Date(1988, 9, 12);\n const p1 = p(\"orderDate\", \"ne\", dt);\n const p2 = p(\"shipCity\", \"startsWith\", \"C\");\n const p3 = p(\"freight\", \">\", 100);\n const newPred = Predicate.or(p1, p2, p3);\n ```\n\n or\n ```ts\n const preds = [p1, p2, p3];\n const newPred = Predicate.or(preds);\n ```\n @param predicates - multiple Predicates or an array of Predicates.\n Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\n */\n static or<T = any>(...predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n static or<T = any>(predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n static or(...args: any[]) {\n return new AndOrPredicate(\"or\", args);\n }\n\n /**\n Creates a 'composite' Predicate by 'negating' a specified predicate.\n ```ts\n const p1 = Predicate.create<Order>({ freight: { gt: 100 } });\n const not_p1 = Predicate.not(p1);\n ```\n\n This can also be accomplished using the 'instance' version of the 'not' method\n ```ts\n const not_p1 = p1.not();\n ```\n\n Both of which would be the same as\n ```ts\n const not_p1 = Predicate.create<Order>({ freight: { le: 100 } });\n ```\n */\n static not<T = any>(pred: Predicate<T>): Predicate<T> {\n return pred.not();\n }\n\n /**\n Builds Predicates checked against one entity type.\n ```ts\n const p = Predicate.for(Customer);\n const pred = p(\"companyName\", \"startsWith\", \"C\").and(p(\"city\", \"eq\", \"Vienna\"));\n ```\n\n A standalone Predicate has no query to take an entity type from, so on its own\n {@link Predicate.create} cannot check anything. Naming the type supplies what is missing, the\n same way {@link EntityQuery.from} does for a query - and from a constructor rather than a type\n argument, so the type is written once.\n\n The constructor is read for its type only; nothing about it is kept. The predicates are ordinary\n Predicates at run time, typed `Predicate<U>`, so that what they are combined with, and the query\n they are used in, is checked too. The constructor does not have to be registered with a MetadataStore for this - though\n if it is not, nothing validates the path against the metadata either, exactly as before.\n @param ctor - The entity class to check property paths against.\n @returns A factory that builds Predicates for that type.\n */\n static for<U extends Entity>(ctor: new () => U): TypedPredicateFactory<U> {\n return ((...args: any[]) => Predicate.create(...args as [any])) as TypedPredicateFactory<U>;\n }\n\n /**\n Adds functions that predicates can call, such as `toupper` in `Predicate.create<Customer>(\"toupper(companyName)\", \"==\", \"ACME\")`,\n or replaces existing ones. Each entry maps a function name to `fn`, which evaluates it in local\n queries, and the {@link DataType} it returns. A server query sends the call by name, so the\n server must support the function too.\n ```ts\n Predicate.extendFuncMap({\n initial: { fn: (s: string) => s.charAt(0), dataType: DataType.String }\n });\n ```\n @param funcMap - The functions to add, keyed by name. Write names in lower case: Breeze lower-cases a\n function name when it parses a predicate.\n */\n static extendFuncMap (funcMap: {[key: string]: {fn: (...args: any[]) => any, dataType: DataType}}): void {\n for (let func in (funcMap || {})) {\n let config = funcMap[func];\n FnExpr._funcMap.set(func, config);\n }\n };\n\n // The forms EntityQuery.where takes, checked against T in the same way and in the same order:\n // Predicates first, then the escapes for what cannot be checked, then the checked forms last so\n // that theirs is the error reported. For a Predicate<any>, every path is a plain string.\n and(...predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n and(predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n and(predicate: WhereObject<T>): Predicate<T>;\n and<O extends string>(property: PropertyPath<T>,\n operator: string extends O ? O : never, value: any): Predicate<T>;\n and<P extends string>(property: P extends FunctionExpressionPath ? P : (string extends P ? P : never),\n operator: string | FilterQueryOp, value: any): Predicate<T>;\n and<P extends string>(collection: string extends P ? P : never,\n quantifier: string | FilterQueryOp, property: string,\n operator: string | FilterQueryOp, value: any): Predicate<T>;\n and<P extends CollectionPath<T>>(collection: P, quantifier: QuantifierOp | FilterQueryOp,\n predicate: Predicate<CollectionElement<T, P>>): Predicate<T>;\n and<P extends PropertyPath<T>, O extends FilterOpFor<PropertyValue<T, P>>>(\n property: P, operator: O, value: FilterValueFor<T, PropertyValue<T, P>, O>): Predicate<T>;\n and<P extends CollectionPath<T>,\n P2 extends PropertyPath<CollectionElement<T, P>>,\n O2 extends FilterOpFor<PropertyValue<CollectionElement<T, P>, P2>>>(\n collection: P, quantifier: QuantifierOp, property: P2, operator: O2,\n value: FilterValueFor<CollectionElement<T, P>, PropertyValue<CollectionElement<T, P>, P2>, O2>): Predicate<T>;\n /**\n 'And's this Predicate with one or more other Predicates and returns a new 'composite' Predicate\n ```ts\n const p = Predicate.for(Order);\n const dt = new Date(1988, 9, 12);\n const p1 = p(\"orderDate\", \"ne\", dt);\n const p2 = p(\"shipCity\", \"startsWith\", \"C\");\n const p3 = p(\"freight\", \">\", 100);\n const newPred = p1.and(p2, p3);\n ```\n\n or\n ```ts\n const preds = [p2, p3];\n const newPred = p1.and(preds);\n ```\n\n The 'and' method is also used to write \"fluent\" expressions\n ```ts\n const p4 = p(\"shipCity\", \"startsWith\", \"F\")\n .and(p(\"freight\", \"gt\", 2000));\n ```\n\n It also takes the arguments of {@link Predicate.create} in place of a Predicate - such as\n `.and(\"freight\", \"gt\", 2000)` - checked against the Predicate's entity type, as\n {@link EntityQuery.where} checks them against the query's.\n @param args - multiple Predicates or an array of Predicates. \n Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\n */\n and(...args: any[]) {\n return new AndOrPredicate(\"and\", argsForAndOrPredicates(this, args));\n }\n\n // The forms EntityQuery.where takes, checked against T in the same way and in the same order:\n // Predicates first, then the escapes for what cannot be checked, then the checked forms last so\n // that theirs is the error reported. For a Predicate<any>, every path is a plain string.\n or(...predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n or(predicates: (Predicate<T> | null | undefined)[]): Predicate<T>;\n or(predicate: WhereObject<T>): Predicate<T>;\n or<O extends string>(property: PropertyPath<T>,\n operator: string extends O ? O : never, value: any): Predicate<T>;\n or<P extends string>(property: P extends FunctionExpressionPath ? P : (string extends P ? P : never),\n operator: string | FilterQueryOp, value: any): Predicate<T>;\n or<P extends string>(collection: string extends P ? P : never,\n quantifier: string | FilterQueryOp, property: string,\n operator: string | FilterQueryOp, value: any): Predicate<T>;\n or<P extends CollectionPath<T>>(collection: P, quantifier: QuantifierOp | FilterQueryOp,\n predicate: Predicate<CollectionElement<T, P>>): Predicate<T>;\n or<P extends PropertyPath<T>, O extends FilterOpFor<PropertyValue<T, P>>>(\n property: P, operator: O, value: FilterValueFor<T, PropertyValue<T, P>, O>): Predicate<T>;\n or<P extends CollectionPath<T>,\n P2 extends PropertyPath<CollectionElement<T, P>>,\n O2 extends FilterOpFor<PropertyValue<CollectionElement<T, P>, P2>>>(\n collection: P, quantifier: QuantifierOp, property: P2, operator: O2,\n value: FilterValueFor<CollectionElement<T, P>, PropertyValue<CollectionElement<T, P>, P2>, O2>): Predicate<T>;\n /**\n 'Or's this Predicate with one or more other Predicates and returns a new 'composite' Predicate\n ```ts\n const p = Predicate.for(Order);\n const dt = new Date(1988, 9, 12);\n const p1 = p(\"orderDate\", \"ne\", dt);\n const p2 = p(\"shipCity\", \"startsWith\", \"C\");\n const p3 = p(\"freight\", \">\", 100);\n const newPred = p1.or(p2, p3);\n ```\n\n or\n ```ts\n const preds = [p2, p3];\n const newPred = p1.or(preds);\n ```\n\n The 'or' method is also used to write \"fluent\" expressions\n ```ts\n const p4 = p(\"shipCity\", \"startsWith\", \"F\")\n .or(p(\"freight\", \"gt\", 2000));\n ```\n\n It also takes the arguments of {@link Predicate.create} in place of a Predicate - such as\n `.or(\"freight\", \"gt\", 2000)` - checked against the Predicate's entity type, as\n {@link EntityQuery.where} checks them against the query's.\n @param args - multiple Predicates or an array of Predicates. \n Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\n */\n or(...args: any[]) {\n return new AndOrPredicate(\"or\", argsForAndOrPredicates(this, args));\n }\n\n /**\n Returns the 'negated' version of this Predicate\n ```ts\n const p1 = Predicate.create<Order>({ freight: { gt: 100 } });\n const not_p1 = p1.not();\n ```\n\n This can also be accomplished using the 'static' version of the 'not' method\n ```ts\n const not_p1 = Predicate.not(p1);\n ```\n\n which would be the same as\n ```ts\n const not_p1 = Predicate.create<Order>({ freight: { le: 100 } });\n ```\n */\n not(): Predicate<T> {\n return new UnaryPredicate(\"not\", this);\n }\n\n /**\n Returns this predicate in Breeze's JSON query syntax, with property paths as written - the object\n form that {@link Predicate.create} and {@link EntityQuery.where} also accept, such as\n `{ freight: { gt: 100 } }`. `JSON.stringify` calls it.\n */\n //\n toJSON() {\n // toJSON ( part of js standard - takes a single parameter\n // that is either \"\" or the name of the property being serialized.\n return this.toJSONExt({ entityType: this._entityType });\n }\n\n /** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n @adapter (see {@link UriBuilderAdapter}) \n @hidden @internal \n */\n toJSONExt(context: VisitContext) {\n return this.visit(context, toJSONVisitor);\n }\n\n /** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n @adapter (see {@link UriBuilderAdapter}) \n @hidden @internal \n */\n toFunction(context: VisitContext) {\n return this.visit(context, toFunctionVisitor);\n }\n\n /** Returns this predicate as a JSON string: `JSON.stringify` of {@link Predicate.toJSON}. Useful for logging and debugging. */\n toString() {\n return JSON.stringify(this);\n }\n\n /** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n @adapter (see {@link UriBuilderAdapter}) \n @hidden @internal \n */\n visit(context: VisitContext, visitor?: Visitor) {\n if (core.isEmpty(context)) {\n context = { entityType: undefined };\n } else if (context instanceof EntityType) {\n context = { entityType: context };\n } else if (!hasOwnProp(context, \"entityType\")) {\n throw new Error(\"All visitor methods must be called with a context object containing at least an 'entityType' property\");\n }\n\n if (visitor) {\n context.visitor = visitor;\n }\n let tVisitor = visitor || context.visitor!;\n let fn = (tVisitor as Record<string, any>)[this.visitorMethodName];\n if (fn == null) {\n throw new Error(\"Unable to locate method: \" + this.visitorMethodName + \" on visitor\");\n }\n\n let entityType = context.entityType;\n // don't bother validating if already done so ( or if no _validate method\n if (this._validate && (entityType == null || this._entityType !== entityType)) {\n // don't need to capture return value because validation fn doesn't have one.\n this._validate(entityType, context.toNameOnServer);\n this._entityType = entityType;\n }\n\n return fn.call(this, context);\n }\n\n /** @hidden @internal */\n _initialize(visitorMethodName: string, opMap: { [key: string]: { aliases?: string[], isFunction?: boolean }} = {}) {\n this.visitorMethodName = visitorMethodName;\n let aliasMap = this.aliasMap = {};\n for (let op in opMap ) {\n updateAliasMap(aliasMap, op, opMap[op] as Op);\n }\n }\n\n /** @hidden @internal */\n _resolveOp(op: string | QueryOp, okIfNotFound?: boolean) {\n let opStr = (typeof op === \"string\") ? op : op.operator;\n let result = this.aliasMap[opStr.toLowerCase()];\n if (!result && !okIfNotFound) {\n throw new Error(\"Unable to resolve operator: \" + opStr);\n }\n return result;\n }\n\n}\n\nfunction createPredicateFromArray(arr: any[]) {\n // TODO: assert that length of the array should be > 3\n // Needs to handle:\n // [ \"freight\", \">\", 100\"];\n // [ \"orders\", \"any\", \"freight\", \">\", 950 ]\n // [ \"orders\", \"and\", anotherPred ]\n // [ \"orders\", \"and\", [ \"freight, \">\", 950 ]]\n let json: Record<string, any> = {};\n let value: Record<string, any> = {};\n json[arr[0]] = value;\n let op = arr[1];\n op = op.operator || op; // incoming op will be either a string or a FilterQueryOp\n if (arr.length === 3) {\n value[op] = arr[2];\n } else {\n value[op] = createPredicateFromArray(arr.splice(2));\n }\n return createPredicateFromObject(json);\n}\n\nfunction createPredicateFromObject(obj: Object) {\n if (obj instanceof Predicate) return obj;\n\n if (typeof obj !== 'object') {\n throw new Error(\"Unable to convert to a Predicate: \" + obj);\n }\n let keys = Object.keys(obj);\n let preds = keys.map(function (key) {\n return createPredicateFromKeyValue(key, (obj as Record<string, any>)[key]);\n });\n return (preds.length === 1) ? preds[0] : new AndOrPredicate(\"and\", preds);\n}\n\nfunction createPredicateFromKeyValue(key: string, value: any): Predicate {\n // { and: [a,b] } key='and', value = [a,b]\n if (AndOrPredicate.prototype._resolveOp(key, true)) {\n return new AndOrPredicate(key, value);\n }\n\n // { not: a } key= 'not', value = a\n if (UnaryPredicate.prototype._resolveOp(key, true)) {\n return new UnaryPredicate(key, value);\n }\n\n if ((typeof value !== 'object') || value == null || core.isDate(value)) {\n // { foo: bar } key='foo', value = bar ( where bar is a literal i.e. a string, a number, a boolean or a date.\n return new BinaryPredicate(\"eq\", key, value);\n } else if (hasOwnProp(value, 'value')) {\n // { foo: { value: bar, dataType: xxx} } key='foo', value = bar ( where bar is an object representing a literal\n return new BinaryPredicate(\"eq\", key, value);\n }\n\n if (Array.isArray(value)) {\n throw new Error(\"Unable to resolve predicate after the phrase: \" + key);\n }\n\n let expr = key;\n let keys = Object.keys(value);\n let preds = keys.map(function (op) {\n\n // { a: { any: b } op = 'any', expr=a, value[op] = b\n if (AnyAllPredicate.prototype._resolveOp(op, true)) {\n return new AnyAllPredicate(op, expr, value[op]);\n }\n\n if (BinaryPredicate.prototype._resolveOp(op, true)) {\n // { a: { \">\": b }} op = \">\", expr=a, value[op] = b\n return new BinaryPredicate(op, expr, value[op]);\n } else if (hasOwnProp(value[op], 'value')) {\n // { a: { \">\": { value: b, dataType: 'Int32' }} expr = a value[op] = { value: b, dataType: 'Int32' }\n return new BinaryPredicate(\"eq\", expr, value[op]);\n }\n\n let msg = core.formatString(\"Unable to resolve predicate after the phrase: '%1' for operator: '%2' and value: '%3'\", expr, op, value[op]);\n throw new Error(msg);\n\n });\n\n return (preds.length === 1) ? preds[0] : new AndOrPredicate(\"and\", preds);\n}\n\nfunction argsForAndOrPredicates(obj: {}, args: any[]) {\n let preds = args[0];\n if (preds instanceof Predicate) {\n preds = arraySlice(args);\n } else if (!Array.isArray(preds)) {\n preds = [new Predicate(arraySlice(args))];\n }\n return [obj].concat(preds);\n}\n\nfunction updateAliasMap(aliasMap: OpMap, opStr: string, op: Op) {\n let key = opStr.toLowerCase();\n op.key = key;\n aliasMap[key] = op;\n\n op.aliases && op.aliases.forEach((alias: any) => {\n aliasMap[alias.toLowerCase()] = op;\n });\n}\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden @internal \n*/\nclass PassthruPredicate extends Predicate {\n value: any;\n constructor(value: any) {\n super();\n this.value = value;\n }\n\n // _validate = core.noop;\n}\nPassthruPredicate.prototype._initialize('passthruPredicate');\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport class UnaryPredicate extends Predicate {\n pred: Predicate;\n constructor(op: string | QueryOp, ...args: any[]) {\n super();\n this.op = this._resolveOp(op);\n this.pred = new Predicate(args);\n }\n\n _validate(entityType: EntityType, usesNameOnServer?: boolean) {\n this.pred._validate(entityType, usesNameOnServer);\n }\n}\n\nUnaryPredicate.prototype._initialize('unaryPredicate', {\n 'not': { aliases: ['!', '~'] },\n});\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport class BinaryPredicate extends Predicate {\n expr1Source: any;\n expr2Source: any;\n expr1?: PredicateExpression;\n expr2?: PredicateExpression;\n constructor(op: string | QueryOp, expr1: any, expr2: any) {\n super();\n // 5 public props op, expr1Source, expr2Source, expr1, expr2\n this.op = this._resolveOp(op);\n this.expr1Source = expr1;\n this.expr2Source = expr2;\n // this.expr1 and this.expr2 won't be\n // determined until validate is run\n }\n\n\n _validate(entityType: EntityType, usesNameOnServer?: boolean) {\n let expr1Context = { entityType: entityType, usesNameOnServer: usesNameOnServer };\n this.expr1 = createExpr(this.expr1Source, expr1Context);\n if (this.expr1 == null) {\n throw new Error(\"Unable to validate 1st expression: \" + this.expr1Source);\n }\n if (this.expr1 instanceof LitExpr) {\n // lhs must be either a property or a function.\n throw new Error(\"The left hand side of a binary predicate cannot be a literal expression, it must be a valid property or functional predicate expression: \" + this.expr1Source);\n }\n\n if (this.op.key === 'in' && !Array.isArray(this.expr2Source)) {\n throw new Error(\"The 'in' operator requires that its right hand argument be an array\");\n }\n let expr2Context = core.extend(expr1Context, { isRHS: true, dataType: this.expr1.dataType });\n this.expr2 = createExpr(this.expr2Source, expr2Context);\n if (this.expr2 == null) {\n throw new Error(\"Unable to validate 2nd expression: \" + this.expr2Source);\n }\n\n if (this.expr1.dataType == null) {\n this.expr1.dataType = this.expr2.dataType;\n }\n }\n\n\n}\n\nBinaryPredicate.prototype._initialize('binaryPredicate', {\n 'eq': {\n aliases: [\"==\", \"equals\", \"equal\"]\n },\n 'ne': {\n aliases: [\"!=\", \"~=\", \"notequals\", \"notequal\"]\n },\n 'lt': {\n aliases: [\"<\", \"lessthan\"]\n },\n 'le': {\n aliases: [\"<=\", \"lessthanorequal\"]\n },\n 'gt': {\n aliases: [\">\", \"greaterthan\"]\n },\n 'ge': {\n aliases: [\">=\", \"greaterthanorequal\"]\n },\n 'startswith': {\n isFunction: true\n },\n 'endswith': {\n isFunction: true\n },\n 'contains': {\n aliases: [\"substringof\"],\n isFunction: true\n },\n 'in': {\n\n }\n});\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden\n*/\nexport class AndOrPredicate extends Predicate {\n preds: Predicate[];\n constructor(op: string | QueryOp, preds: any[]) {\n super();\n this.op = this._resolveOp(op);\n if (preds.length === 1 && Array.isArray(preds[0])) {\n preds = preds[0];\n }\n this.preds = preds.filter(function (pred) {\n return pred != null;\n }).map(function (pred) {\n return new Predicate(pred);\n });\n if (this.preds.length === 1) {\n return this.preds[0] as AndOrPredicate; // HACK: this.preds[0] is actually NOT a AndOrPredicate but some other kind of pred.\n }\n }\n\n _validate(entityType: EntityType, usesNameOnServer?: boolean) {\n this.preds.forEach((pred) => {\n pred._validate(entityType, usesNameOnServer);\n });\n }\n}\n\nAndOrPredicate.prototype._initialize(\"andOrPredicate\", {\n 'and': { aliases: ['&&'] },\n 'or': { aliases: ['||'] }\n} );\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport class AnyAllPredicate extends Predicate {\n /** @internal */\n expr: PredicateExpression;\n exprSource: string;\n pred: Predicate;\n // 4 public props: op, exprSource, expr, pred\n constructor(op: string | QueryOp, expr: string, pred: any) {\n super();\n this.op = this._resolveOp(op);\n this.exprSource = expr;\n // this.expr will not be resolved until validate is called\n this.pred = new Predicate(pred);\n }\n\n _validate(entityType: EntityType, usesNameOnServer: boolean) {\n this.expr = createExpr(this.exprSource, { entityType: entityType, usesNameOnServer: usesNameOnServer } as ExpressionContext);\n // can't really know the predicateEntityType unless the original entity type was known.\n if (entityType == null || entityType.isAnonymous) {\n this.expr.dataType = undefined;\n }\n this.pred._validate(this.expr.dataType as EntityType | undefined, usesNameOnServer);\n }\n\n}\n\nAnyAllPredicate.prototype._initialize(\"anyAllPredicate\", {\n 'any': { aliases: ['some'] },\n 'all': { aliases: [\"every\"] }\n});\n\n/** @hidden */\nexport class PredicateExpression {\n visitorMethodName: string;\n visit: Function; // TODO\n dataType?: DataType | StructuralType;\n constructor(visitorMethodName: string) {\n this.visitorMethodName = visitorMethodName;\n // give expressions the Predicate prototype method\n this.visit = Predicate.prototype.visit;\n }\n\n // default impls - may/will be overridden be subclass expressions\n _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\n // noop;\n }\n}\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport class LitExpr extends PredicateExpression {\n value: any;\n /** Narrows the optional dataType on PredicateExpression: a LitExpr always has one,\n because the constructor falls back to DataType.fromValue when none is supplied. */\n declare dataType: DataType;\n hasExplicitDataType: boolean;\n // 2 public props: value, dataType\n constructor(value: any, dataType: string | DataType | undefined, hasExplicitDataType?: boolean) {\n super(\"litExpr\");\n // dataType may come is an a string\n let dt1 = resolveDataType(dataType);\n // if the DataType comes in as Undefined this means\n // that we should NOT attempt to parse it but just leave it alone\n // for now - this is usually because it is part of a Func expr.\n // The cast holds for test/tsconfig.json, which checks src/ again with strictNullChecks off;\n // `resolveDataType` returns `DataType | string | undefined`, and only the strict pass drops\n // the `string` here.\n let dt2 = (dt1 || DataType.fromValue(value)) as DataType;\n\n if (dt2.parse) {\n if (Array.isArray(value)) {\n this.value = value.map((v) => { return dt2.parse!(v, typeof v); });\n } else {\n this.value = dt2.parse(value, typeof value);\n }\n } else {\n this.value = value;\n }\n this.dataType = dt2;\n this.hasExplicitDataType = !!hasExplicitDataType;\n }\n\n toString() {\n return \" LitExpr - value: \" + this.value.toString() + \" dataType: \" + this.dataType.toString();\n }\n\n}\n\nfunction resolveDataType(dataType?: DataType | string) {\n if (dataType == null) return dataType;\n // if (DataType.contains(dataType)) {\n if (dataType instanceof DataType) {\n return dataType;\n }\n if (typeof dataType === 'string') {\n let dt = DataType.fromName(dataType) as DataType;\n if (dt) return dt;\n throw new Error(\"Unable to resolve a dataType named: \" + dataType);\n }\n\n throw new Error(\"The dataType parameter passed into this literal expression is not a 'DataType'\" + dataType);\n}\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden \n*/\nexport class PropExpr extends PredicateExpression {\n propertyPath: string;\n // two public props: propertyPath, dateType\n constructor(propertyPath: string) {\n super('propExpr');\n this.propertyPath = propertyPath;\n //this.dataType = DataType.Undefined;\n // this.dataType resolved after validate ( if not on an anon type }\n }\n\n toString() {\n return \" PropExpr - \" + this.propertyPath;\n }\n\n _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\n\n if (entityType == null || entityType.isAnonymous) return;\n let props = entityType.getPropertiesOnPath(this.propertyPath, null, false);\n\n if (!props) {\n let msg = core.formatString(\"Unable to resolve propertyPath. EntityType: '%1' PropertyPath: '%2'\", entityType.name, this.propertyPath);\n throw new Error(msg);\n }\n // get the last property\n let prop = props[props.length - 1];\n if (prop instanceof DataProperty) {\n this.dataType = prop.dataType;\n } else {\n this.dataType = prop.entityType;\n }\n }\n\n}\n\n/** For use by breeze plugin authors only. The class is for use in building a {@link UriBuilderAdapter} implementation. \n@adapter (see {@link UriBuilderAdapter}) \n@hidden\n*/\nexport class FnExpr extends PredicateExpression {\n fnName: string;\n exprs: PredicateExpression[];\n localFn: any; // TODO:\n constructor(fnName: string, exprs: PredicateExpression[]) {\n super('fnExpr');\n // 4 public props: fnName, exprs, localFn, dataType\n this.fnName = fnName;\n this.exprs = exprs;\n let qf = FnExpr._funcMap.get(fnName);\n if (qf == null) {\n throw new Error(\"Unknown function: \" + fnName);\n }\n this.localFn = qf.fn;\n this.dataType = qf.dataType;\n }\n\n toString() {\n let exprStr = this.exprs.map(function (expr) {\n expr.toString();\n }).toString();\n return \"FnExpr - \" + this.fnName + \"(\" + exprStr + \")\";\n }\n\n _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\n this.exprs.forEach(function (expr) {\n expr._validate(entityType, usesNameOnServer);\n });\n }\n\n static _funcMap = new Map<string, { fn: (...args: any[]) => any; dataType: DataType }>(Object.entries({\n toupper: {\n fn: function (source: string) {\n return source.toUpperCase();\n }, dataType: DataType.String\n },\n tolower: {\n fn: function (source: string) {\n return source.toLowerCase();\n }, dataType: DataType.String\n },\n substring: {\n // As on the server (.NET String.Substring(startIndex, length)), the third argument is\n // a length, not an end index. Function arguments arrive unparsed, often as strings.\n fn: function (source: string, pos: number, length?: number) {\n const start = Number(pos);\n return length == null ? source.substring(start) : source.substring(start, start + Number(length));\n }, dataType: DataType.String\n },\n substringof: {\n fn: function (find: string, source: string) {\n return source.indexOf(find) >= 0;\n }, dataType: DataType.Boolean\n },\n length: {\n fn: function (source: any) {\n return source.length;\n }, dataType: DataType.Int32\n },\n trim: {\n fn: function (source: string) {\n return source.trim();\n }, dataType: DataType.String\n },\n concat: {\n fn: function (s1: string, s2: string) {\n return s1.concat(s2);\n }, dataType: DataType.String\n },\n replace: {\n fn: function (source: string, find: string, replace: string) {\n return source.replace(find, replace);\n }, dataType: DataType.String\n },\n startswith: {\n fn: function (source: string, find: string) {\n return strStartsWith(source, find);\n }, dataType: DataType.Boolean\n },\n endswith: {\n fn: function (source: string, find: string) {\n return strEndsWith(source, find);\n }, dataType: DataType.Boolean\n },\n indexof: {\n fn: function (source: any, find: any) {\n return source.indexOf(find);\n }, dataType: DataType.Int32\n },\n round: {\n fn: function (source: number) {\n return Math.round(source);\n }, dataType: DataType.Int32\n },\n ceiling: {\n fn: function (source: number) {\n return Math.ceil(source);\n }, dataType: DataType.Int32\n },\n floor: {\n fn: function (source: number) {\n return Math.floor(source);\n }, dataType: DataType.Int32\n },\n second: {\n fn: function (source: Date) {\n return source.getSeconds();\n }, dataType: DataType.Int32\n },\n minute: {\n fn: function (source: Date) {\n return source.getMinutes();\n }, dataType: DataType.Int32\n },\n hour: {\n fn: function (source: Date) {\n return source.getHours();\n }, dataType: DataType.Int32\n },\n day: {\n fn: function (source: Date) {\n return source.getDate();\n }, dataType: DataType.Int32\n },\n month: {\n fn: function (source: Date) {\n return source.getMonth() + 1;\n }, dataType: DataType.Int32\n },\n year: {\n fn: function (source: Date) {\n return source.getFullYear();\n }, dataType: DataType.Int32\n }\n }));\n\n}\n\n// TODO: add dataTypes for the args next - will help to infer other dataTypes.\n\n\nlet RX_IDENTIFIER = /^[a-z_][\\w.$]*$/i;\n// comma delimited expressions ignoring commas inside of both single and double quotes.\nlet RX_COMMA_DELIM1 = /('[^']*'|[^,]+)/g;\nlet RX_COMMA_DELIM2 = /(\"[^\"]*\"|[^,]+)/g;\nlet DELIM = String.fromCharCode(191);\n\nfunction createExpr(source: any, exprContext: ExpressionContext) {\n let entityType = exprContext.entityType;\n\n // the right hand side of an 'in' clause\n if (Array.isArray(source)) {\n if (!exprContext.isRHS) {\n throw new Error(\"Array expressions are only permitted on the right hand side of a BinaryPredicate\");\n }\n return new LitExpr(source, exprContext.dataType!);\n }\n\n if (!(typeof source === 'string')) {\n if (source != null && typeof source === 'object' && !source.toISOString) {\n // source is an object but not a Date-like thing such as a JS or MomentJS Date\n if (source.value === undefined) {\n throw new Error(\"Unable to resolve an expression for: \" + source + \" on entityType: \" + (entityType ? entityType.name : 'null'));\n }\n // { value, isProperty: true } or { value, isLiteral: false } forces a property;\n // anything else (including { value, isLiteral: true }) is a literal.\n if (source.isProperty || source.isLiteral === false) {\n return new PropExpr(source.value);\n } else {\n // we want to insure that any LitExpr created this way is tagged with 'hasExplicitDataType: true'\n // because we want to insure that if we roundtrip thru toJSON that we don't\n // accidentally reinterpret this node as a PropExpr.\n // return new LitExpr(source.value, source.dataType || context.dataType, !!source.dataType);\n return new LitExpr(source.value, source.dataType || exprContext.dataType, true);\n }\n } else {\n return new LitExpr(source, exprContext.dataType);\n }\n }\n\n if (exprContext.isRHS) {\n if (entityType == null || entityType.isAnonymous) {\n // if entityType is unknown then assume that the rhs is a literal\n return new LitExpr(source, exprContext.dataType);\n } else {\n return parseLitOrPropExpr(source, exprContext);\n }\n } else {\n let regex = /\\([^()]*\\)/;\n let m: RegExpExecArray | null;\n let tokens: string[] = [];\n let i = 0;\n while (m = regex.exec(source)) {\n let token = m[0];\n tokens.push(token);\n let repl = DELIM + i++;\n source = source.replace(token, repl);\n }\n\n let expr = parseExpr(source, tokens, exprContext);\n expr._validate(entityType, exprContext.usesNameOnServer);\n return expr;\n }\n}\n\nfunction parseExpr(source: string, tokens: string[], exprContext: ExpressionContext): PredicateExpression {\n let parts = source.split(DELIM);\n if (parts.length === 1) {\n return parseLitOrPropExpr(parts[0], exprContext);\n } else {\n return parseFnExpr(source, parts, tokens, exprContext);\n }\n}\n\nfunction parseLitOrPropExpr(value: string, exprContext: ExpressionContext): PredicateExpression {\n value = value.trim();\n // value is either a string, a quoted string, a number, a bool value, or a date\n // if a string ( not a quoted string) then this represents a property name ( 1st ) or a lit string ( 2nd)\n let firstChar = value.substr(0, 1);\n let isQuoted = (firstChar === \"'\" || firstChar === '\"') && value.length > 1 && value.substr(value.length - 1) === firstChar;\n if (isQuoted) {\n let unquotedValue = value.substr(1, value.length - 2);\n return new LitExpr(unquotedValue, exprContext.dataType || DataType.String);\n } else {\n let entityType = exprContext.entityType;\n // TODO: get rid of isAnonymous below when we get the chance.\n if (entityType == null || entityType.isAnonymous) {\n // this fork will only be reached on the LHS of an BinaryPredicate -\n // a RHS expr cannot get here with an anon type\n return new PropExpr(value);\n } else {\n let mayBeIdentifier = RX_IDENTIFIER.test(value);\n if (mayBeIdentifier) {\n // if (entityType.getProperty(value, false) != null) {\n if (entityType.getPropertiesOnPath(value, null, false) != null) {\n return new PropExpr(value);\n }\n }\n }\n // we don't really know the datatype here because even though it comes in as a string\n // its usually a string BUT it might be a number i.e. the \"1\" or the \"2\" from an expr\n // like \"toUpper(substring(companyName, 1, 2))\"\n return new LitExpr(value, exprContext.dataType);\n }\n}\n\nfunction parseFnExpr(source: string, parts: string[], tokens: string[], exprContext: ExpressionContext) {\n let fnName = parts[0].trim().toLowerCase();\n\n let argSource = (tokens as unknown as Record<string, string>)[parts[1]].trim() as string;\n if (argSource.substr(0, 1) === \"(\") {\n argSource = argSource.substr(1, argSource.length - 2);\n }\n let commaMatchStr = source.indexOf(\"'\") >= 0 ? RX_COMMA_DELIM1 : RX_COMMA_DELIM2;\n let args = argSource.match(commaMatchStr);\n let newContext = core.extend({}, exprContext) as ExpressionContext;\n // a dataType of Undefined on a context basically means not to try parsing\n // the value if the expr is a literal\n newContext.dataType = DataType.Undefined;\n newContext.isFnArg = true;\n let exprs = args!.map(function (a) {\n return parseExpr(a, tokens, newContext);\n });\n return new FnExpr(fnName, exprs);\n}\n\n// toFunctionVisitor\n\nlet toFunctionVisitor = {\n\n isExtended: false,\n\n passthruPredicate: function (this: PassthruPredicate) {\n throw new Error(\"Cannot execute an PassthruPredicate expression against the local cache: \" + this.value);\n },\n\n unaryPredicate: function (this: UnaryPredicate, context: VisitContext) {\n let predFn = this.pred.visit(context);\n switch (this.op.key) {\n case \"not\":\n return function (entity: any) {\n return !predFn(entity);\n };\n default:\n throw new Error(\"Invalid unary operator:\" + this.op.key);\n }\n },\n\n binaryPredicate: function (this: BinaryPredicate, context: VisitContext) {\n let expr1Fn = this.expr1!.visit(context);\n let expr2Fn = this.expr2!.visit(context);\n let dataType = this.expr1!.dataType || this.expr2!.dataType;\n let lqco = context.entityType!.metadataStore.localQueryComparisonOptions;\n let predFn = getBinaryPredicateFn(this, dataType as DataType, lqco);\n if (predFn == null) {\n throw new Error(\"Invalid binaryPredicate operator:\" + this.op.key);\n }\n return function (entity: Entity) {\n return predFn!(expr1Fn(entity), expr2Fn(entity));\n };\n },\n\n andOrPredicate: function (this: AndOrPredicate, context: VisitContext) {\n let predFns = this.preds.map((pred) => {\n return pred.visit(context);\n });\n switch (this.op!.key) {\n case \"and\":\n return function (entity: any) {\n let result = predFns.reduce(function (prev, cur) {\n return prev && cur(entity);\n }, true);\n return result;\n };\n case \"or\":\n return function (entity: any) {\n let result = predFns.reduce(function (prev, cur) {\n return prev || cur(entity);\n }, false);\n return result;\n };\n default:\n throw new Error(\"Invalid boolean operator:\" + this.op!.key);\n }\n },\n\n anyAllPredicate: function (this: AnyAllPredicate, context: VisitContext) {\n let exprFn = this.expr.visit(context);\n let newContext = core.extend({}, context) as VisitContext;\n newContext.entityType = this.expr.dataType as EntityType;\n let predFn = this.pred.visit(newContext);\n let anyAllPredFn = getAnyAllPredicateFn(this.op);\n return function (entity: any) {\n return anyAllPredFn(exprFn(entity), predFn);\n };\n },\n\n litExpr: function (this: LitExpr) {\n let value = this.value;\n return function (entity: any) {\n return value;\n };\n },\n\n propExpr: function (this: PropExpr) {\n let propertyPath = this.propertyPath;\n let properties = propertyPath.split('.');\n if (properties.length === 1) {\n return function (entity: any) {\n return entity.getProperty(propertyPath);\n };\n } else {\n return function (entity: Entity) {\n return EntityAspect.getPropertyPathValue(entity, properties);\n };\n }\n },\n\n fnExpr: function (this: FnExpr, context: ExpressionContext) {\n let exprFns = this.exprs.map(function (expr) {\n return expr.visit(context);\n });\n let that = this;\n return function (entity: any) {\n let values = exprFns.map(function (exprFn) {\n let value = exprFn(entity);\n return value;\n });\n let result = that.localFn.apply(null, values);\n return result;\n };\n }\n\n};\n\nfunction getAnyAllPredicateFn(op: Op): (v1: any[], v2: any) => boolean {\n switch (op.key) {\n case \"any\":\n return function (v1, v2) {\n return v1.some(function (v) {\n return v2(v);\n });\n };\n case \"all\":\n return function (v1, v2) {\n return v1.every(function (v) {\n return v2(v);\n });\n };\n default:\n throw new Error(\"Unknown operator: \" + op.key);\n }\n}\n\nfunction getBinaryPredicateFn(binaryPredicate: BinaryPredicate, dataType: DataType, lqco: LocalQueryComparisonOptions) {\n let op = binaryPredicate.op;\n let mc = DataType.getComparableFn(dataType);\n let predFn: (v1: any, v2: any) => boolean;\n switch (op.key) {\n case 'eq':\n predFn = function (v1, v2) {\n if (v1 && typeof v1 === 'string') {\n return stringEquals(v1, v2, lqco);\n } else {\n return mc(v1) === mc(v2);\n }\n };\n break;\n case 'ne':\n predFn = function (v1, v2) {\n if (v1 && typeof v1 === 'string') {\n return !stringEquals(v1, v2, lqco);\n } else {\n return mc(v1) !== mc(v2);\n }\n };\n break;\n case 'gt':\n predFn = function (v1, v2) {\n return mc(v1) > mc(v2);\n };\n break;\n case 'ge':\n predFn = function (v1, v2) {\n return mc(v1) >= mc(v2);\n };\n break;\n case 'lt':\n predFn = function (v1, v2) {\n return mc(v1) < mc(v2);\n };\n break;\n case 'le':\n predFn = function (v1, v2) {\n return mc(v1) <= mc(v2);\n };\n break;\n case 'startswith':\n predFn = function (v1, v2) {\n return stringStartsWith(v1, v2, lqco);\n };\n break;\n case 'endswith':\n predFn = function (v1, v2) {\n return stringEndsWith(v1, v2, lqco);\n };\n break;\n case 'contains':\n predFn = function (v1, v2) {\n return stringContains(v1, v2, lqco);\n };\n break;\n case 'in':\n predFn = function (v1: any, v2: any[]) {\n v1 = mc(v1);\n v2 = v2.map(function (v) { return mc(v); });\n return v2.indexOf(v1) >= 0;\n };\n break;\n default:\n return null;\n }\n return predFn;\n}\n\nfunction stringEquals(a: any, b: any, lqco: LocalQueryComparisonOptions) {\n if (b == null) return false;\n if (typeof b !== 'string') {\n b = b.toString();\n }\n if (lqco.usesSql92CompliantStringComparison) {\n a = (a || \"\").trim();\n b = (b || \"\").trim();\n }\n if (!lqco.isCaseSensitive) {\n a = (a || \"\").toLowerCase();\n b = (b || \"\").toLowerCase();\n }\n return a === b;\n}\n\nfunction stringStartsWith(a: any, b: any, lqco: LocalQueryComparisonOptions) {\n if (!lqco.isCaseSensitive) {\n a = (a || \"\").toLowerCase();\n b = (b || \"\").toLowerCase();\n }\n return strStartsWith(a, b);\n}\n\nfunction stringEndsWith(a: any, b: any, lqco: LocalQueryComparisonOptions) {\n if (!lqco.isCaseSensitive) {\n a = (a || \"\").toLowerCase();\n b = (b || \"\").toLowerCase();\n }\n return strEndsWith(a, b);\n}\n\nfunction stringContains(a: any, b: any, lqco: LocalQueryComparisonOptions) {\n if (!lqco.isCaseSensitive) {\n a = (a || \"\").toLowerCase();\n b = (b || \"\").toLowerCase();\n }\n return a.indexOf(b) >= 0;\n}\n\n// toJSONVisitor\n\nlet toJSONVisitor = {\n\n passthruPredicate: function (this: PassthruPredicate) {\n return this.value;\n },\n\n unaryPredicate: function (this: UnaryPredicate, context: VisitContext) {\n let predVal = this.pred.visit(context);\n let json: Record<string, any> = {};\n json[this.op.key] = predVal;\n return json;\n },\n\n binaryPredicate: function (this: BinaryPredicate, context: VisitContext) {\n let expr1Val = this.expr1!.visit(context);\n let expr2Val = this.expr2!.visit(context);\n let json: Record<string, any> = {};\n if (this.expr2 instanceof PropExpr) {\n expr2Val = { value: expr2Val, isProperty: true };\n }\n if (this.op.key === \"eq\") {\n json[expr1Val] = expr2Val;\n } else {\n let value: Record<string, any> = {};\n json[expr1Val] = value;\n value[this.op.key] = expr2Val;\n }\n return json;\n },\n\n andOrPredicate: function (this: AndOrPredicate, context: VisitContext) {\n let predVals = this.preds.map(function (pred) {\n return pred.visit(context);\n });\n if (!predVals || !predVals.length) {\n return {};\n }\n let json: Record<string, any> | undefined;\n // normalizeAnd clauses if possible.\n // passthru predicate will appear as string and their 'ands' can't be 'normalized'\n if (this.op!.key === 'and' && predVals.length === 2 && !predVals.some((v) => v.or || typeof(v) === 'string')) {\n // normalize 'and' clauses - will return null if can't be combined.\n json = predVals.reduce(combine);\n }\n if (json == null) {\n json = {};\n json[this.op!.key!] = predVals;\n }\n return json;\n },\n\n anyAllPredicate: function (this: AnyAllPredicate, context: VisitContext) {\n let exprVal = this.expr.visit(context);\n let newContext = core.extend({}, context) as VisitContext;\n newContext.entityType = this.expr.dataType as EntityType;\n let predVal = this.pred.visit(newContext);\n let json: Record<string, any> = {};\n let value: Record<string, any> = {};\n value[this.op.key] = predVal;\n json[exprVal] = value;\n return json;\n },\n\n litExpr: function (this: LitExpr, context: VisitContext) {\n // special handling for DateOnly because it serializes improperly\n const value = (this.dataType === DataType.DateOnly) ? DataType.toDateOnlyString(this.value) : this.value;\n if (this.hasExplicitDataType || context.useExplicitDataType) {\n return { value: value, dataType: this.dataType.name };\n } else {\n return value;\n }\n },\n\n propExpr: function (this: PropExpr, context: VisitContext) {\n if (context.toNameOnServer) {\n if (!context.entityType) {\n console.warn(`No EntityType for propertyPath \"${this.propertyPath}\". ${core.strings.TO_TYPE}`);\n return this.propertyPath;\n }\n return context.entityType!.clientPropertyPathToServer(this.propertyPath);\n } else {\n return this.propertyPath;\n }\n },\n\n fnExpr: function (this: FnExpr, context: VisitContext) {\n let exprVals = this.exprs.map(function (expr) {\n return expr.visit(context);\n });\n return this.fnName + \"(\" + exprVals.join(\",\") + \")\";\n }\n\n};\n\nfunction combine(j1: Object, j2: Object) {\n const a = j1 as Record<string, any>, b = j2 as Record<string, any>;\n let ok = Object.keys(b).every(function (key) {\n if (a.hasOwnProperty(key)) {\n if (typeof (b[key]) !== 'object') {\n // exit and indicate that we can't combine\n return false;\n }\n if (combine(a[key], b[key]) == null) {\n return false;\n }\n } else if (typeof (a) !== 'object') {\n // cannot assign to j1[key]\n return false;\n } else {\n a[key] = b[key];\n }\n return true;\n });\n return ok ? j1 : null;\n}\n\n\n\n\n"]}
@@ -0,0 +1,252 @@
1
+ import type { ComplexObject, Entity } from '../entity/entity-aspect.js';
2
+ import type { ComplexArray } from '../entity/complex-array.js';
3
+ import type { RelationArray } from '../entity/relation-array.js';
4
+ import type { FilterQueryOp } from './entity-query.js';
5
+ import type { Predicate } from './predicate.js';
6
+ /**
7
+ The types behind the checked form of {@link EntityQuery.where}, {@link EntityQuery.orderBy},
8
+ {@link EntityQuery.expand} and {@link Predicate.for}.
9
+
10
+ Nothing here exists at runtime. A query is still built from the same strings it always was; these
11
+ only decide which of those strings the compiler accepts, and with what operator and value.
12
+
13
+ Everything is written so that an untyped query behaves exactly as it did before. `EntityQuery`
14
+ defaults its type argument to `any` and hundreds of existing call sites rely on that, so every
15
+ type here degrades to `string` / `any` when it cannot see a concrete entity type. See
16
+ {@link PropertyPath}.
17
+
18
+ @module
19
+ */
20
+ /**
21
+ `T`, in a position the compiler does not infer `T` from - so that `Predicate.create(...)` without a
22
+ type argument is a `Predicate<any>`, rather than a Predicate of whatever the arguments look like.
23
+ The built-in `NoInfer` does this, but needs TypeScript 5.4 in the application that compiles
24
+ against Breeze's .d.ts; this works in any version.
25
+ */
26
+ export type NoInferFrom<T> = [T][T extends any ? 0 : never];
27
+ /** Property types that can be compared in a filter. */
28
+ type Scalar = string | number | boolean | Date;
29
+ /** The properties of `T` that came from the model, without the members Breeze itself supplies. */
30
+ type Own<T> = Exclude<keyof T, keyof Entity | keyof ComplexObject> & string;
31
+ /** The element type of a collection-valued property, or `never` if it is not one. */
32
+ type ElementOf<V> = V extends RelationArray<infer E> ? E : V extends ComplexArray ? ComplexObject : never;
33
+ /** True for a property that can be walked through: a to-one navigation, or a complex type. */
34
+ type IsWalkable<V> = [
35
+ ElementOf<V>
36
+ ] extends [never] ? (NonNullable<V> extends Entity | ComplexObject ? true : false) : false;
37
+ /** @hidden The data properties of `T`: those holding a value, rather than an entity or collection. */
38
+ export type DataKeys<T> = {
39
+ [K in Own<T>]-?: NonNullable<T[K]> extends Scalar ? K : never;
40
+ }[Own<T>];
41
+ type WalkKeys<T> = {
42
+ [K in Own<T>]-?: IsWalkable<T[K]> extends true ? K : never;
43
+ }[Own<T>];
44
+ type CollectionKeys<T> = {
45
+ [K in Own<T>]-?: [ElementOf<T[K]>] extends [never] ? never : K;
46
+ }[Own<T>];
47
+ type IsEntityValued<V> = [
48
+ ElementOf<V>
49
+ ] extends [never] ? (NonNullable<V> extends Entity ? true : false) : (ElementOf<V> extends Entity ? true : false);
50
+ type NavigationKeys<T> = {
51
+ [K in Own<T>]-?: IsEntityValued<T[K]> extends true ? K : never;
52
+ }[Own<T>];
53
+ type NavigationTarget<V> = [ElementOf<V>] extends [never] ? NonNullable<V> : ElementOf<V>;
54
+ /**
55
+ How many navigations a generated path may cross: `'shipCity'` is none, `'customer.companyName'`
56
+ is one.
57
+
58
+ Three covers the filters people actually write. The cost is paid in the size of the union the
59
+ compiler carries per entity type, which grows with the model and is multiplied out at every
60
+ level. A deeper path still works - it is simply not offered or checked, because a path these
61
+ types do not recognize falls through to the untyped overload rather than failing.
62
+
63
+ The counter is a tuple, and a level is one element off the front of it, rather than a number and
64
+ a lookup table of its predecessors. The two count the same way, but TypeScript 4.6 and 4.7 report
65
+ `TS2589: Type instantiation is excessively deep` against this file for the indexed-access form -
66
+ only under `skipLibCheck: false`, and the paths still type correctly, but a consumer on those two
67
+ versions should not have to see it. Tuple destructuring is understood by every version we support.
68
+ */
69
+ type DefaultDepth = [unknown, unknown, unknown];
70
+ /** Paths ending in a comparable value. */
71
+ type RawPropertyPath<T, D extends unknown[] = DefaultDepth> = DataKeys<T> | (D extends [unknown, ...infer Rest] ? {
72
+ [K in WalkKeys<T>]: `${K}.${RawPropertyPath<NonNullable<T[K]>, Rest>}`;
73
+ }[WalkKeys<T>] : never);
74
+ /** Paths ending in a collection, which is what `any` and `all` filter over. */
75
+ type RawCollectionPath<T, D extends unknown[] = DefaultDepth> = CollectionKeys<T> | (D extends [unknown, ...infer Rest] ? {
76
+ [K in WalkKeys<T>]: `${K}.${RawCollectionPath<NonNullable<T[K]>, Rest>}`;
77
+ }[WalkKeys<T>] : never);
78
+ /** Paths ending in anything a projection can return - a value, a complex object, or a navigation,
79
+ to-one or collection - walking only through to-one navigations and complex properties: a
80
+ projection cannot reach into each element of a collection. What `select` takes. */
81
+ type RawSelectPath<T, D extends unknown[] = DefaultDepth> = DataKeys<T> | WalkKeys<T> | NavigationKeys<T> | (D extends [unknown, ...infer Rest] ? {
82
+ [K in WalkKeys<T>]: `${K}.${RawSelectPath<NonNullable<T[K]>, Rest>}`;
83
+ }[WalkKeys<T>] : never);
84
+ /** Paths ending in a navigation, to-one or collection - what `expand` takes. */
85
+ type RawNavigationPath<T, D extends unknown[] = DefaultDepth> = NavigationKeys<T> | (D extends [unknown, ...infer Rest] ? {
86
+ [K in NavigationKeys<T>]: `${K}.${RawNavigationPath<NavigationTarget<T[K]>, Rest>}`;
87
+ }[NavigationKeys<T>] : never);
88
+ /**
89
+ The property paths of `T` that name a comparable value - `'companyName'`, `'customer.city'` - as
90
+ a union of string literals, so a misspelling is a compile error and an editor can complete them.
91
+
92
+ `Entity extends T` is the guard. It is true only when `T` is `any` or bare `Entity`, which is
93
+ what an untyped query has; this is then plain `string` and nothing is restricted, exactly as
94
+ before. The same shape as {@link QueriedAs}.
95
+
96
+ Collections are absent, because a collection is filtered with `any` or `all` rather than compared
97
+ - see {@link CollectionPath}.
98
+ */
99
+ export type PropertyPath<T> = Entity extends T ? string : RawPropertyPath<T>;
100
+ /** The property paths of `T` that name a collection, for the `any` and `all` forms of
101
+ {@link EntityQuery.where}. Plain `string` for an untyped query. */
102
+ export type CollectionPath<T> = Entity extends T ? string : RawCollectionPath<T>;
103
+ /** The property paths of `T` that name a navigation, for {@link EntityQuery.expand}. Plain
104
+ `string` for an untyped query. */
105
+ export type NavigationPath<T> = Entity extends T ? string : RawNavigationPath<T>;
106
+ /** The property paths of `T` that a projection can return, for {@link EntityQuery.select}: a value
107
+ (`'companyName'`), a complex object (`'location'`), or a navigation (`'orders'`, `'customer'`),
108
+ reached through to-one navigations and complex properties (`'customer.companyName'`). Plain
109
+ `string` for an untyped query. */
110
+ export type SelectPath<T> = Entity extends T ? string : RawSelectPath<T>;
111
+ /** The original values an {@link EntityAspect} or {@link ComplexAspect} keeps: for each data property
112
+ edited since the entity was last saved or accepted, its value before the first edit. Typed from the
113
+ entity class - `{ freight?: number; shipCity?: string; … }` - for an {@link EntityAspectOf} or
114
+ {@link ComplexAspectOf}. Only the class's own data properties: reaching another entity from here
115
+ would make an entity class's type depend on itself. */
116
+ export type OriginalValues<T> = {
117
+ [K in DataKeys<T>]?: T[K];
118
+ };
119
+ /** The key of an entity of type `T` given by property name - `{ orderID: 10248, productID: 11 }` -
120
+ in place of an array whose order must match the type's key. Accepted by
121
+ {@link EntityManager.getEntityByKey} and {@link EntityManager.fetchEntityByKey} with an entity class,
122
+ and by the {@link EntityKey} constructor. The names are checked against `T`'s data properties; which
123
+ of them form the key is known only from the metadata, and checked when the key is made. Plain
124
+ `Record<string, any>` for an untyped call. */
125
+ export type KeyValues<T> = Entity extends T ? Record<string, any> : {
126
+ [K in DataKeys<T>]?: T[K];
127
+ };
128
+ /**
129
+ A {@link PropertyPath}, optionally followed by ` desc` or ` asc`, for
130
+ {@link EntityQuery.orderBy}. Plain `string` for an untyped query.
131
+
132
+ A comma-separated list of clauses is still accepted, it is just not checked: enumerating every
133
+ combination of paths is not something to ask of a compiler. Pass an array instead to keep the
134
+ checking.
135
+ */
136
+ export type OrderByPath<T> = Entity extends T ? string : RawPropertyPath<T> | `${RawPropertyPath<T>} desc` | `${RawPropertyPath<T>} asc`;
137
+ type RawPropertyValue<T, P> = P extends `${infer Head}.${infer Rest}` ? (Head extends keyof T ? RawPropertyValue<NonNullable<T[Head]>, Rest> : never) : P extends keyof T ? NonNullable<T[P]> : never;
138
+ /** The type of the value at path `P` of `T`, which is what a filter compares against. `any` for
139
+ an untyped query. */
140
+ export type PropertyValue<T, P> = Entity extends T ? any : RawPropertyValue<T, P>;
141
+ /** The element type of the collection at path `P` of `T` - what an `any` or `all` filter then
142
+ filters on. `any` for an untyped query. */
143
+ export type CollectionElement<T, P> = Entity extends T ? any : ElementOf<RawPropertyValue<T, P>>;
144
+ /** Operators valid for any property type, with the aliases Breeze accepts. */
145
+ type EqualityOps = 'eq' | 'ne' | '==' | '!=' | 'equals' | 'notequals';
146
+ /** Operators valid for anything with an order to it. */
147
+ type ComparisonOps = 'gt' | 'lt' | 'ge' | 'le' | '>' | '<' | '>=' | '<=' | 'greaterthan' | 'lessthan' | 'greaterthanorequal' | 'lessthanorequal';
148
+ /** Operators valid only on strings. */
149
+ type StringOps = 'startsWith' | 'startswith' | 'endsWith' | 'endswith' | 'contains' | 'substringof';
150
+ /** Membership of a set. */
151
+ type InOp = 'in';
152
+ /** The `any` and `all` quantifiers over a collection, with their aliases. */
153
+ export type QuantifierOp = 'any' | 'all' | 'some' | 'every';
154
+ /**
155
+ The operators that make sense for a value of type `V`.
156
+
157
+ Only the string form is checked. A {@link FilterQueryOp} instance is accepted against every
158
+ property type, because they are all one type: `FilterQueryOp.StartsWith` is not distinguishable
159
+ from `FilterQueryOp.GreaterThan` at compile time.
160
+ */
161
+ export type FilterOpFor<V> = FilterQueryOp | FilterOpNameFor<V>;
162
+ /**
163
+ The operator *names* that make sense for a value of type `V`, without {@link FilterQueryOp}.
164
+
165
+ The object form of a filter needs these on their own, because an object key can only be a string:
166
+ `{ freight: { gt: 100 } }`.
167
+ */
168
+ export type FilterOpNameFor<V> = [
169
+ NonNullable<V>
170
+ ] extends [string] ? EqualityOps | ComparisonOps | StringOps | InOp : [NonNullable<V>] extends [number] ? EqualityOps | ComparisonOps | InOp : [NonNullable<V>] extends [Date] ? EqualityOps | ComparisonOps | InOp : [NonNullable<V>] extends [boolean] ? EqualityOps | InOp : EqualityOps | ComparisonOps | StringOps | InOp;
171
+ /**
172
+ The object form of a filter value, which forces an interpretation Breeze would otherwise infer:
173
+ whether to read `value` as a literal or as the name of another property, and what {@link DataType}
174
+ it has.
175
+ */
176
+ export interface FilterValueExpression {
177
+ /** The value to compare against: a literal, or the name of another property when `isProperty` is set or `isLiteral` is `false`. */
178
+ value: any;
179
+ /** Read `value` as a literal rather than as a property name. */
180
+ isLiteral?: boolean;
181
+ /** Read `value` as a property name rather than as a literal. The runtime honours either this
182
+ or `isLiteral: false`; both spellings are long-standing. */
183
+ isProperty?: boolean;
184
+ /** Pin the {@link DataType}, for when inference from context gets it wrong. */
185
+ dataType?: any;
186
+ }
187
+ /**
188
+ What may be compared against a property of type `V` under operator `O`.
189
+
190
+ `V` itself, or null - filtering on a missing value is ordinary - or a {@link FilterValueExpression}.
191
+ `in` takes an array of `V` instead.
192
+
193
+ Any {@link PropertyPath} of `T` is also allowed, whatever `V` is, because Breeze compares a
194
+ property to another property the same way it compares to a literal:
195
+ `where('requiredDate', '<', 'shippedDate')`. That is why the value of a number property may be a
196
+ string - but only a string that names a real property, so `where('freight', 'gt', 'one hundred')`
197
+ is still rejected.
198
+ */
199
+ export type FilterValueFor<T, V, O> = O extends InOp ? readonly (V | null)[] | FilterValueExpression : V | null | undefined | FilterValueExpression | PropertyPath<T>;
200
+ /**
201
+ A query function applied to a property, rather than a plain property path - `toUpper(companyName)`,
202
+ `toUpper(substring(companyName, 1, 2))`. Recognized by the parentheses and let through unchecked:
203
+ what is inside one is a small expression language of its own, not a property path.
204
+ */
205
+ export type FunctionExpressionPath = `${string}(${string})`;
206
+ /**
207
+ The operator clause of an object filter: `{ gt: 100 }`, `{ startsWith: 'C' }`, `{ in: [1, 2] }`.
208
+ Several operators in one clause are and-ed, which is what the runtime does with them.
209
+ */
210
+ export type FilterOpsObject<T, V> = {
211
+ [O in FilterOpNameFor<V>]?: FilterValueFor<T, V, O>;
212
+ };
213
+ /**
214
+ What may stand to the right of a property key in an object filter: a bare value, which means
215
+ equality, or an operator clause, or a {@link FilterValueExpression}.
216
+ */
217
+ export type FilterClause<T, V> = V | null | FilterValueExpression | FilterOpsObject<T, V>;
218
+ /** The keys an object filter on `T` may carry. */
219
+ type WhereKey<T> = PropertyPath<T> | CollectionPath<T> | FunctionExpressionPath | 'and' | 'or' | 'not';
220
+ /**
221
+ The object - "JSON" - form of a filter, checked against `T`.
222
+
223
+ ```ts
224
+ EntityQuery.from(Customer).where({ city: 'London', country: 'UK' });
225
+ EntityQuery.from(Order).where({ freight: { gt: 100 } });
226
+ EntityQuery.from(Order).where({ 'customer.companyName': { startsWith: 'A' } });
227
+ EntityQuery.from(Customer).where({ or: [{ city: 'London' }, { city: 'Berlin' }] });
228
+ EntityQuery.from(Customer).where({ orders: { any: { freight: { gt: 100 } } } });
229
+ ```
230
+
231
+ Several keys in one object are and-ed, as the runtime does with them.
232
+
233
+ This deliberately enumerates the model's paths as keys rather than validating the object the
234
+ caller wrote. Both check the same mistakes, but only this shape makes a bad key an ordinary
235
+ excess-property error - which is the diagnostic that carries a spelling suggestion:
236
+
237
+ ```
238
+ Object literal may only specify known properties, but 'compnyName' does not exist
239
+ in type '{ ... }'. Did you mean to write 'companyName'?
240
+ ```
241
+
242
+ The cost is that the compiler prints that type in the message, so these are longer than the
243
+ errors from the three-argument form. It is the better trade: the suggestion names the fix.
244
+
245
+ `object` for an untyped query, which restricts nothing - see {@link PropertyPath}.
246
+ */
247
+ export type WhereObject<T> = Entity extends T ? object : {
248
+ [K in WhereKey<T>]?: K extends 'and' | 'or' ? readonly (Predicate | WhereObject<T>)[] : K extends 'not' ? Predicate | WhereObject<T> : K extends FunctionExpressionPath ? FilterClause<T, any> : K extends CollectionPath<T> ? {
249
+ [Q in QuantifierOp]?: Predicate | WhereObject<CollectionElement<T, K>>;
250
+ } : FilterClause<T, PropertyValue<T, K>>;
251
+ };
252
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=property-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-path.js","sourceRoot":"","sources":["../../src/query/property-path.ts"],"names":[],"mappings":"","sourcesContent":["import type { ComplexObject, Entity } from '../entity/entity-aspect.js';\r\nimport type { ComplexArray } from '../entity/complex-array.js';\r\nimport type { RelationArray } from '../entity/relation-array.js';\r\nimport type { FilterQueryOp } from './entity-query.js';\r\nimport type { Predicate } from './predicate.js';\r\n\r\n/**\r\nThe types behind the checked form of {@link EntityQuery.where}, {@link EntityQuery.orderBy},\r\n{@link EntityQuery.expand} and {@link Predicate.for}.\r\n\r\nNothing here exists at runtime. A query is still built from the same strings it always was; these\r\nonly decide which of those strings the compiler accepts, and with what operator and value.\r\n\r\nEverything is written so that an untyped query behaves exactly as it did before. `EntityQuery`\r\ndefaults its type argument to `any` and hundreds of existing call sites rely on that, so every\r\ntype here degrades to `string` / `any` when it cannot see a concrete entity type. See\r\n{@link PropertyPath}.\r\n\r\n@module\r\n*/\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Walking an entity type\r\n// ---------------------------------------------------------------------------------------------\r\n\r\n/**\r\n`T`, in a position the compiler does not infer `T` from - so that `Predicate.create(...)` without a\r\ntype argument is a `Predicate<any>`, rather than a Predicate of whatever the arguments look like.\r\nThe built-in `NoInfer` does this, but needs TypeScript 5.4 in the application that compiles\r\nagainst Breeze's .d.ts; this works in any version.\r\n*/\r\nexport type NoInferFrom<T> = [T][T extends any ? 0 : never];\r\n\r\n/** Property types that can be compared in a filter. */\r\ntype Scalar = string | number | boolean | Date;\r\n\r\n/** The properties of `T` that came from the model, without the members Breeze itself supplies. */\r\ntype Own<T> = Exclude<keyof T, keyof Entity | keyof ComplexObject> & string;\r\n\r\n/** The element type of a collection-valued property, or `never` if it is not one. */\r\ntype ElementOf<V> =\r\n V extends RelationArray<infer E> ? E :\r\n V extends ComplexArray ? ComplexObject :\r\n never;\r\n\r\n/** True for a property that can be walked through: a to-one navigation, or a complex type. */\r\ntype IsWalkable<V> =\r\n [ElementOf<V>] extends [never]\r\n ? (NonNullable<V> extends Entity | ComplexObject ? true : false)\r\n : false;\r\n\r\n/** @hidden The data properties of `T`: those holding a value, rather than an entity or collection. */\r\nexport type DataKeys<T> = { [K in Own<T>]-?: NonNullable<T[K]> extends Scalar ? K : never }[Own<T>];\r\ntype WalkKeys<T> = { [K in Own<T>]-?: IsWalkable<T[K]> extends true ? K : never }[Own<T>];\r\ntype CollectionKeys<T> = { [K in Own<T>]-?: [ElementOf<T[K]>] extends [never] ? never : K }[Own<T>];\r\n\r\ntype IsEntityValued<V> =\r\n [ElementOf<V>] extends [never]\r\n ? (NonNullable<V> extends Entity ? true : false)\r\n : (ElementOf<V> extends Entity ? true : false);\r\ntype NavigationKeys<T> = { [K in Own<T>]-?: IsEntityValued<T[K]> extends true ? K : never }[Own<T>];\r\ntype NavigationTarget<V> = [ElementOf<V>] extends [never] ? NonNullable<V> : ElementOf<V>;\r\n\r\n/**\r\nHow many navigations a generated path may cross: `'shipCity'` is none, `'customer.companyName'`\r\nis one.\r\n\r\nThree covers the filters people actually write. The cost is paid in the size of the union the\r\ncompiler carries per entity type, which grows with the model and is multiplied out at every\r\nlevel. A deeper path still works - it is simply not offered or checked, because a path these\r\ntypes do not recognize falls through to the untyped overload rather than failing.\r\n\r\nThe counter is a tuple, and a level is one element off the front of it, rather than a number and\r\na lookup table of its predecessors. The two count the same way, but TypeScript 4.6 and 4.7 report\r\n`TS2589: Type instantiation is excessively deep` against this file for the indexed-access form -\r\nonly under `skipLibCheck: false`, and the paths still type correctly, but a consumer on those two\r\nversions should not have to see it. Tuple destructuring is understood by every version we support.\r\n*/\r\ntype DefaultDepth = [unknown, unknown, unknown];\r\n\r\n/** Paths ending in a comparable value. */\r\ntype RawPropertyPath<T, D extends unknown[] = DefaultDepth> =\r\n | DataKeys<T>\r\n | (D extends [unknown, ...infer Rest]\r\n ? { [K in WalkKeys<T>]: `${K}.${RawPropertyPath<NonNullable<T[K]>, Rest>}` }[WalkKeys<T>]\r\n : never);\r\n\r\n/** Paths ending in a collection, which is what `any` and `all` filter over. */\r\ntype RawCollectionPath<T, D extends unknown[] = DefaultDepth> =\r\n | CollectionKeys<T>\r\n | (D extends [unknown, ...infer Rest]\r\n ? { [K in WalkKeys<T>]: `${K}.${RawCollectionPath<NonNullable<T[K]>, Rest>}` }[WalkKeys<T>]\r\n : never);\r\n\r\n/** Paths ending in anything a projection can return - a value, a complex object, or a navigation,\r\nto-one or collection - walking only through to-one navigations and complex properties: a\r\nprojection cannot reach into each element of a collection. What `select` takes. */\r\ntype RawSelectPath<T, D extends unknown[] = DefaultDepth> =\r\n | DataKeys<T> | WalkKeys<T> | NavigationKeys<T>\r\n | (D extends [unknown, ...infer Rest]\r\n ? { [K in WalkKeys<T>]: `${K}.${RawSelectPath<NonNullable<T[K]>, Rest>}` }[WalkKeys<T>]\r\n : never);\r\n\r\n/** Paths ending in a navigation, to-one or collection - what `expand` takes. */\r\ntype RawNavigationPath<T, D extends unknown[] = DefaultDepth> =\r\n | NavigationKeys<T>\r\n | (D extends [unknown, ...infer Rest]\r\n ? { [K in NavigationKeys<T>]: `${K}.${RawNavigationPath<NavigationTarget<T[K]>, Rest>}` }[NavigationKeys<T>]\r\n : never);\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// The public path types, each guarded so that an untyped query is unaffected\r\n// ---------------------------------------------------------------------------------------------\r\n\r\n/**\r\nThe property paths of `T` that name a comparable value - `'companyName'`, `'customer.city'` - as\r\na union of string literals, so a misspelling is a compile error and an editor can complete them.\r\n\r\n`Entity extends T` is the guard. It is true only when `T` is `any` or bare `Entity`, which is\r\nwhat an untyped query has; this is then plain `string` and nothing is restricted, exactly as\r\nbefore. The same shape as {@link QueriedAs}.\r\n\r\nCollections are absent, because a collection is filtered with `any` or `all` rather than compared\r\n- see {@link CollectionPath}.\r\n*/\r\nexport type PropertyPath<T> = Entity extends T ? string : RawPropertyPath<T>;\r\n\r\n/** The property paths of `T` that name a collection, for the `any` and `all` forms of\r\n{@link EntityQuery.where}. Plain `string` for an untyped query. */\r\nexport type CollectionPath<T> = Entity extends T ? string : RawCollectionPath<T>;\r\n\r\n/** The property paths of `T` that name a navigation, for {@link EntityQuery.expand}. Plain\r\n`string` for an untyped query. */\r\nexport type NavigationPath<T> = Entity extends T ? string : RawNavigationPath<T>;\r\n\r\n/** The property paths of `T` that a projection can return, for {@link EntityQuery.select}: a value\r\n(`'companyName'`), a complex object (`'location'`), or a navigation (`'orders'`, `'customer'`),\r\nreached through to-one navigations and complex properties (`'customer.companyName'`). Plain\r\n`string` for an untyped query. */\r\nexport type SelectPath<T> = Entity extends T ? string : RawSelectPath<T>;\r\n\r\n/** The original values an {@link EntityAspect} or {@link ComplexAspect} keeps: for each data property\r\nedited since the entity was last saved or accepted, its value before the first edit. Typed from the\r\nentity class - `{ freight?: number; shipCity?: string; … }` - for an {@link EntityAspectOf} or\r\n{@link ComplexAspectOf}. Only the class's own data properties: reaching another entity from here\r\n would make an entity class's type depend on itself. */\r\nexport type OriginalValues<T> = { [K in DataKeys<T>]?: T[K] };\r\n\r\n/** The key of an entity of type `T` given by property name - `{ orderID: 10248, productID: 11 }` -\r\nin place of an array whose order must match the type's key. Accepted by\r\n{@link EntityManager.getEntityByKey} and {@link EntityManager.fetchEntityByKey} with an entity class,\r\nand by the {@link EntityKey} constructor. The names are checked against `T`'s data properties; which\r\nof them form the key is known only from the metadata, and checked when the key is made. Plain\r\n`Record<string, any>` for an untyped call. */\r\nexport type KeyValues<T> = Entity extends T ? Record<string, any> : { [K in DataKeys<T>]?: T[K] };\r\n\r\n/**\r\nA {@link PropertyPath}, optionally followed by ` desc` or ` asc`, for\r\n{@link EntityQuery.orderBy}. Plain `string` for an untyped query.\r\n\r\nA comma-separated list of clauses is still accepted, it is just not checked: enumerating every\r\ncombination of paths is not something to ask of a compiler. Pass an array instead to keep the\r\nchecking.\r\n*/\r\nexport type OrderByPath<T> =\r\n Entity extends T ? string\r\n : RawPropertyPath<T> | `${RawPropertyPath<T>} desc` | `${RawPropertyPath<T>} asc`;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Resolving a path back to its type\r\n// ---------------------------------------------------------------------------------------------\r\n\r\ntype RawPropertyValue<T, P> =\r\n P extends `${infer Head}.${infer Rest}`\r\n ? (Head extends keyof T ? RawPropertyValue<NonNullable<T[Head]>, Rest> : never)\r\n : P extends keyof T ? NonNullable<T[P]> : never;\r\n\r\n/** The type of the value at path `P` of `T`, which is what a filter compares against. `any` for\r\nan untyped query. */\r\nexport type PropertyValue<T, P> = Entity extends T ? any : RawPropertyValue<T, P>;\r\n\r\n/** The element type of the collection at path `P` of `T` - what an `any` or `all` filter then\r\nfilters on. `any` for an untyped query. */\r\nexport type CollectionElement<T, P> =\r\n Entity extends T ? any : ElementOf<RawPropertyValue<T, P>>;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Operators and values\r\n// ---------------------------------------------------------------------------------------------\r\n\r\n/** Operators valid for any property type, with the aliases Breeze accepts. */\r\ntype EqualityOps = 'eq' | 'ne' | '==' | '!=' | 'equals' | 'notequals';\r\n/** Operators valid for anything with an order to it. */\r\ntype ComparisonOps = 'gt' | 'lt' | 'ge' | 'le' | '>' | '<' | '>=' | '<='\r\n | 'greaterthan' | 'lessthan' | 'greaterthanorequal' | 'lessthanorequal';\r\n/** Operators valid only on strings. */\r\ntype StringOps = 'startsWith' | 'startswith' | 'endsWith' | 'endswith'\r\n | 'contains' | 'substringof';\r\n/** Membership of a set. */\r\ntype InOp = 'in';\r\n\r\n/** The `any` and `all` quantifiers over a collection, with their aliases. */\r\nexport type QuantifierOp = 'any' | 'all' | 'some' | 'every';\r\n\r\n/**\r\nThe operators that make sense for a value of type `V`.\r\n\r\nOnly the string form is checked. A {@link FilterQueryOp} instance is accepted against every\r\nproperty type, because they are all one type: `FilterQueryOp.StartsWith` is not distinguishable\r\nfrom `FilterQueryOp.GreaterThan` at compile time.\r\n*/\r\nexport type FilterOpFor<V> = FilterQueryOp | FilterOpNameFor<V>;\r\n\r\n/**\r\nThe operator *names* that make sense for a value of type `V`, without {@link FilterQueryOp}.\r\n\r\nThe object form of a filter needs these on their own, because an object key can only be a string:\r\n`{ freight: { gt: 100 } }`.\r\n*/\r\nexport type FilterOpNameFor<V> =\r\n [NonNullable<V>] extends [string] ? EqualityOps | ComparisonOps | StringOps | InOp\r\n : [NonNullable<V>] extends [number] ? EqualityOps | ComparisonOps | InOp\r\n : [NonNullable<V>] extends [Date] ? EqualityOps | ComparisonOps | InOp\r\n : [NonNullable<V>] extends [boolean] ? EqualityOps | InOp\r\n : EqualityOps | ComparisonOps | StringOps | InOp;\r\n\r\n/**\r\nThe object form of a filter value, which forces an interpretation Breeze would otherwise infer:\r\nwhether to read `value` as a literal or as the name of another property, and what {@link DataType}\r\nit has.\r\n*/\r\nexport interface FilterValueExpression {\r\n /** The value to compare against: a literal, or the name of another property when `isProperty` is set or `isLiteral` is `false`. */\r\n value: any;\r\n /** Read `value` as a literal rather than as a property name. */\r\n isLiteral?: boolean;\r\n /** Read `value` as a property name rather than as a literal. The runtime honours either this\r\n or `isLiteral: false`; both spellings are long-standing. */\r\n isProperty?: boolean;\r\n /** Pin the {@link DataType}, for when inference from context gets it wrong. */\r\n dataType?: any;\r\n}\r\n\r\n/**\r\nWhat may be compared against a property of type `V` under operator `O`.\r\n\r\n`V` itself, or null - filtering on a missing value is ordinary - or a {@link FilterValueExpression}.\r\n`in` takes an array of `V` instead.\r\n\r\nAny {@link PropertyPath} of `T` is also allowed, whatever `V` is, because Breeze compares a\r\nproperty to another property the same way it compares to a literal:\r\n`where('requiredDate', '<', 'shippedDate')`. That is why the value of a number property may be a\r\nstring - but only a string that names a real property, so `where('freight', 'gt', 'one hundred')`\r\nis still rejected.\r\n*/\r\nexport type FilterValueFor<T, V, O> =\r\n O extends InOp ? readonly (V | null)[] | FilterValueExpression\r\n : V | null | undefined | FilterValueExpression | PropertyPath<T>;\r\n\r\n/**\r\nA query function applied to a property, rather than a plain property path - `toUpper(companyName)`,\r\n`toUpper(substring(companyName, 1, 2))`. Recognized by the parentheses and let through unchecked:\r\nwhat is inside one is a small expression language of its own, not a property path.\r\n*/\r\nexport type FunctionExpressionPath = `${string}(${string})`;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// The object form\r\n// ---------------------------------------------------------------------------------------------\r\n\r\n/**\r\nThe operator clause of an object filter: `{ gt: 100 }`, `{ startsWith: 'C' }`, `{ in: [1, 2] }`.\r\nSeveral operators in one clause are and-ed, which is what the runtime does with them.\r\n*/\r\nexport type FilterOpsObject<T, V> = { [O in FilterOpNameFor<V>]?: FilterValueFor<T, V, O> };\r\n\r\n/**\r\nWhat may stand to the right of a property key in an object filter: a bare value, which means\r\nequality, or an operator clause, or a {@link FilterValueExpression}.\r\n*/\r\nexport type FilterClause<T, V> =\r\n | V | null\r\n | FilterValueExpression\r\n | FilterOpsObject<T, V>;\r\n\r\n/** The keys an object filter on `T` may carry. */\r\ntype WhereKey<T> =\r\n | PropertyPath<T>\r\n | CollectionPath<T>\r\n | FunctionExpressionPath\r\n | 'and' | 'or' | 'not';\r\n\r\n/**\r\nThe object - \"JSON\" - form of a filter, checked against `T`.\r\n\r\n```ts\r\nEntityQuery.from(Customer).where({ city: 'London', country: 'UK' });\r\nEntityQuery.from(Order).where({ freight: { gt: 100 } });\r\nEntityQuery.from(Order).where({ 'customer.companyName': { startsWith: 'A' } });\r\nEntityQuery.from(Customer).where({ or: [{ city: 'London' }, { city: 'Berlin' }] });\r\nEntityQuery.from(Customer).where({ orders: { any: { freight: { gt: 100 } } } });\r\n```\r\n\r\nSeveral keys in one object are and-ed, as the runtime does with them.\r\n\r\nThis deliberately enumerates the model's paths as keys rather than validating the object the\r\ncaller wrote. Both check the same mistakes, but only this shape makes a bad key an ordinary\r\nexcess-property error - which is the diagnostic that carries a spelling suggestion:\r\n\r\n```\r\nObject literal may only specify known properties, but 'compnyName' does not exist\r\nin type '{ ... }'. Did you mean to write 'companyName'?\r\n```\r\n\r\nThe cost is that the compiler prints that type in the message, so these are longer than the\r\nerrors from the three-argument form. It is the better trade: the suggestion names the fix.\r\n\r\n`object` for an untyped query, which restricts nothing - see {@link PropertyPath}.\r\n*/\r\nexport type WhereObject<T> =\r\n Entity extends T ? object\r\n : {\r\n [K in WhereKey<T>]?:\r\n K extends 'and' | 'or' ? readonly (Predicate | WhereObject<T>)[]\r\n : K extends 'not' ? Predicate | WhereObject<T>\r\n : K extends FunctionExpressionPath ? FilterClause<T, any>\r\n : K extends CollectionPath<T>\r\n ? { [Q in QuantifierOp]?: Predicate | WhereObject<CollectionElement<T, K>> }\r\n : FilterClause<T, PropertyValue<T, K>>\r\n };\r\n"]}