breeze-client 2.2.1 → 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 +62 -93
  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,465 @@
1
+ import { core, getUuid } from '../core/core.js';
2
+ import { BreezeEnum } from '../core/enum.js';
3
+ import { Validator } from '../validation/validate.js';
4
+ // A date-time with no zone that ends in fractional seconds, of any length: Json.NET drops trailing
5
+ // zeros, so 500 ms is ".5". It used to be /.\d{3}$/, which needed three digits and, with its
6
+ // unescaped dot, also matched an offset written without a colon ("+0200").
7
+ const _fractionalSecondsRegex = /\d\d\.\d+$/;
8
+ // Names the .NET servers can write in metadata for types the client knows by another name.
9
+ // EF Core writes the CLR type name (MetadataBuilder.NormalizeDataTypeName); NHibernate its own type names.
10
+ const _dataTypeAliases = {
11
+ TimeSpan: "Time",
12
+ Char: "String",
13
+ SByte: "Int16",
14
+ UInt16: "Int32",
15
+ UInt32: "Int64",
16
+ UInt64: "Int64",
17
+ AnsiString: "String", // NHibernate
18
+ AnsiChar: "String", // NHibernate
19
+ StringClob: "String", // NHibernate
20
+ };
21
+ /**
22
+ DataType is an 'Enum' containing all of the supported data types.
23
+ */
24
+ export class DataType extends BreezeEnum {
25
+ /**
26
+ The function Breeze converts `DateTime` and `DateTimeOffset` values from the server with, when it
27
+ materializes query and save results. Defaults to {@link DataType.parseDateAsUTC}. Replace it at
28
+ startup, before the first query, to change how a date-time string with no offset is read - for
29
+ example with {@link DataType.parseDateAsLocal}. It does not affect saves, which always send UTC.
30
+ */
31
+ static parseDateFromServer = (value) => DataType.parseDateAsUTC(value);
32
+ // same effect as above but doesn't give right TSDOC.
33
+ // static parseDateFromServer = DataType.parseDateAsUTC;
34
+ /** @hidden @internal */
35
+ static constants;
36
+ /** A string (.NET `String`; also `Char`). Default `""`. */
37
+ static String = new DataType({
38
+ defaultValue: "",
39
+ parse: coerceToString,
40
+ getNext: getNextString
41
+ });
42
+ /** A 64-bit integer (.NET `Int64`; also `UInt32` and `UInt64`), held as a JavaScript `number`, so values beyond ±2^53 lose precision. Default `0`. */
43
+ static Int64 = new DataType({
44
+ defaultValue: 0,
45
+ isNumeric: true,
46
+ isInteger: true,
47
+ parse: coerceToInt,
48
+ getNext: getNextNumber
49
+ });
50
+ /** A 32-bit integer (.NET `Int32`; also `UInt16`), held as a `number`. Default `0`. */
51
+ static Int32 = new DataType({
52
+ defaultValue: 0,
53
+ isNumeric: true,
54
+ isInteger: true,
55
+ parse: coerceToInt,
56
+ getNext: getNextNumber
57
+ });
58
+ /** A 16-bit integer (.NET `Int16`; also `SByte`), held as a `number`. Default `0`. */
59
+ static Int16 = new DataType({
60
+ defaultValue: 0,
61
+ isNumeric: true,
62
+ isInteger: true,
63
+ parse: coerceToInt,
64
+ getNext: getNextNumber
65
+ });
66
+ /** An unsigned 8-bit integer, 0 to 255 (.NET `Byte`), held as a `number`. Default `0`. */
67
+ static Byte = new DataType({
68
+ defaultValue: 0,
69
+ isNumeric: true,
70
+ isInteger: true,
71
+ parse: coerceToInt,
72
+ });
73
+ /** A decimal number (.NET `Decimal`), held as a JavaScript `number` - a double - so digits beyond its precision are lost. Default `0`. */
74
+ static Decimal = new DataType({
75
+ defaultValue: 0,
76
+ isNumeric: true,
77
+ isFloat: true,
78
+ parse: coerceToFloat,
79
+ getNext: getNextNumber
80
+ });
81
+ /** A 64-bit floating-point number (.NET `Double`). Also the type Breeze infers for an unmapped property that holds a number. Default `0`. */
82
+ static Double = new DataType({
83
+ defaultValue: 0,
84
+ isNumeric: true,
85
+ isFloat: true,
86
+ parse: coerceToFloat,
87
+ getNext: getNextNumber
88
+ });
89
+ /** A 32-bit floating-point number (.NET `Single`), held as a `number`. Default `0`. */
90
+ static Single = new DataType({
91
+ defaultValue: 0,
92
+ isNumeric: true,
93
+ isFloat: true,
94
+ parse: coerceToFloat,
95
+ getNext: getNextNumber
96
+ });
97
+ /** A calendar date with no time (.NET `DateOnly`), held as a `Date` at local midnight. Read from the first ten characters (`YYYY-MM-DD`) of the server's value, sent back as `YYYY-MM-DD` from the local date, and compared by date alone. Default 1 January 1900. */
98
+ static DateOnly = new DataType({
99
+ defaultValue: new Date(1900, 0, 1),
100
+ isDate: true,
101
+ parse: coerceToDateOnly,
102
+ parseRawValue: parseRawDateOnly,
103
+ normalize: normalizeDateOnly, // dates don't perform equality comparisons properly
104
+ getNext: getNextDateTime,
105
+ getConcurrencyValue: getConcurrencyDateTime
106
+ });
107
+ /** A date and time (.NET `DateTime`), held as a `Date`. Read from the server with {@link DataType.parseDateFromServer} and sent as ISO 8601 in UTC. Also the type Breeze infers for an unmapped property that holds a `Date`. Default 1 January 1900, local midnight. */
108
+ static DateTime = new DataType({
109
+ defaultValue: new Date(1900, 0, 1),
110
+ isDate: true,
111
+ parse: coerceToDate,
112
+ parseRawValue: parseRawDate,
113
+ normalize: function (value) { return value && value.getTime && value.getTime(); }, // dates don't perform equality comparisons properly
114
+ getNext: getNextDateTime,
115
+ getConcurrencyValue: getConcurrencyDateTime
116
+ });
117
+ /** A date and time with an offset (.NET `DateTimeOffset`), held as a `Date`, which has no offset: it is read with {@link DataType.parseDateFromServer} and sent back in UTC, so the original offset is lost. Default 1 January 1900, local midnight. */
118
+ static DateTimeOffset = new DataType({
119
+ defaultValue: new Date(1900, 0, 1),
120
+ isDate: true,
121
+ parse: coerceToDate,
122
+ parseRawValue: parseRawDate,
123
+ normalize: function (value) { return value && value.getTime && value.getTime(); }, // dates don't perform equality comparisons properly
124
+ getNext: getNextDateTime,
125
+ getConcurrencyValue: getConcurrencyDateTime
126
+ });
127
+ /** A duration (.NET `TimeSpan`), held as the ISO 8601 duration string the server sends, such as `PT4H30M`. Compared as a number of seconds in local queries. Default `PT0S`. */
128
+ static Time = new DataType({
129
+ defaultValue: "PT0S",
130
+ // Looked up on each call, not captured here, so that replacing parseTimeFromServer works.
131
+ parseRawValue: (value) => DataType.parseTimeFromServer(value)
132
+ });
133
+ /** A time of day (.NET `TimeOnly`), held as the string the server sends: "14:30:00" or "01:23:45.678". */
134
+ static TimeOnly = new DataType({
135
+ defaultValue: "00:00:00"
136
+ });
137
+ /** A `true` or `false` value (.NET `Boolean`). Default `false`. */
138
+ static Boolean = new DataType({
139
+ defaultValue: false,
140
+ parse: coerceToBool,
141
+ });
142
+ /** A GUID (.NET `Guid`), held as a lower-case string. Default `"00000000-0000-0000-0000-000000000000"`. */
143
+ static Guid = new DataType({
144
+ defaultValue: "00000000-0000-0000-0000-000000000000",
145
+ parse: coerceToGuid,
146
+ getNext: getNextGuid,
147
+ parseRawValue: function (val) { return val.toLowerCase(); },
148
+ getConcurrencyValue: getUuid
149
+ });
150
+ /** Binary data (.NET `byte[]`), such as a SQL `rowversion`, held as the base64 string the server sends. Default `null`. */
151
+ static Binary = new DataType({
152
+ defaultValue: null,
153
+ parseRawValue: parseRawBinary
154
+ });
155
+ /** An unknown type: a server type name the client does not recognize (the original is kept in the property's `rawTypeName`), or an unmapped property whose type cannot be inferred. Values are not converted or validated. Default `undefined`. */
156
+ static Undefined = new DataType({
157
+ defaultValue: undefined,
158
+ });
159
+ /**
160
+ Returns the function Breeze uses to turn values of a data type into something `===`, `<` and `>`
161
+ compare correctly, in local queries and when ordering: the data type's `normalize` if it has one,
162
+ a conversion to seconds for {@link DataType.Time}, and otherwise the value itself. Applications do
163
+ not normally need it.
164
+ @param dataType - The data type of the values to compare.
165
+ */
166
+ static getComparableFn(dataType) {
167
+ if (dataType && dataType.normalize) {
168
+ return dataType.normalize;
169
+ }
170
+ else if (dataType === DataType.Time) {
171
+ // durations must be converted to compare them
172
+ return function (value) {
173
+ return value && core.durationToSeconds(value);
174
+ };
175
+ }
176
+ else {
177
+ // TODO: __identity
178
+ return function (value) {
179
+ return value;
180
+ };
181
+ }
182
+ }
183
+ /**
184
+ Returns the DataType with the specified name, or undefined if there is none. Also accepts the names the .NET
185
+ servers use for some types, such as 'TimeSpan' for {@link DataType.Time}.
186
+ */
187
+ static fromName(name) {
188
+ const dt = super.fromName(name) || super.fromName(_dataTypeAliases[name]);
189
+ return dt instanceof DataType ? dt : undefined;
190
+ }
191
+ /** Returns the DataType for a specified input. */
192
+ static fromValue(val) {
193
+ if (core.isDate(val))
194
+ return DataType.DateTime;
195
+ switch (typeof val) {
196
+ case "string":
197
+ if (core.isGuid(val))
198
+ return DataType.Guid;
199
+ // the >3 below is a hack to insure that if we are inferring datatypes that
200
+ // very short strings that are valid but unlikely ISO encoded Time's are treated as strings instead.
201
+ else if (core.isDuration(val) && val.length > 3)
202
+ return DataType.Time;
203
+ else if (core.isDateString(val))
204
+ return DataType.DateTime;
205
+ return DataType.String;
206
+ case "boolean":
207
+ return DataType.Boolean;
208
+ case "number":
209
+ return DataType.Double;
210
+ }
211
+ return DataType.Undefined;
212
+ }
213
+ /**
214
+ Converts a {@link DataType.Time} value from the server. By default it returns the value unchanged:
215
+ a `Time` is held as the ISO 8601 duration string the server sends, such as `PT4H30M`. Replace it
216
+ at startup, before the first query, to hold durations some other way - as a number of seconds,
217
+ say, with {@link core.durationToSeconds}.
218
+ */
219
+ static parseTimeFromServer(source) {
220
+ return source;
221
+ }
222
+ /**
223
+ Converts a date-time string from the server to a `Date`. This is the default
224
+ {@link DataType.parseDateFromServer}.
225
+ - A string with `Z` or an offset (`2024-03-15T10:30:00Z`, `...10:30:00+02:00`) is read as given.
226
+ - A string with no offset that ends in fractional seconds, of any length
227
+ (`2024-03-15T10:30:00.5`, `...00.000`, `...00.1234567`), is read as UTC: Breeze appends `Z`.
228
+ - Any other string with no offset, such as `2024-03-15T10:30:00`, goes to `Date.parse`
229
+ unchanged, which reads it as **local** time.
230
+ @param source - The value from the server.
231
+ */
232
+ static parseDateAsUTC(source) {
233
+ if (typeof source === 'string') {
234
+ // No zone but fractional seconds: the server wrote UTC without saying so. Append the Z.
235
+ if (_fractionalSecondsRegex.test(source))
236
+ source = source + 'Z';
237
+ }
238
+ source = new Date(Date.parse(source));
239
+ return source;
240
+ }
241
+ /** Parse as UTC then shift to local time */
242
+ static parseDateAsLocal(source) {
243
+ var dt = DataType.parseDateAsUTC(source);
244
+ if (core.isDate(dt)) {
245
+ dt = new Date(dt.getTime() + dt.getTimezoneOffset() * 60000);
246
+ }
247
+ return dt;
248
+ }
249
+ ;
250
+ /** if val is a Date, return a date-only string e.g. '2023-12-31' */
251
+ static toDateOnlyString(val) {
252
+ // DateOnly types should not have time component, but JSON.stringify makes a full ISO string.
253
+ // We convert it to string here to prevent that, and shift the time zone because toISOString converts to UTC.
254
+ return val && val.getTime && new Date(val.getTime() - val.getTimezoneOffset() * 60000).toISOString().substring(0, 10) || val;
255
+ }
256
+ /** Returns a raw value converted to the specified DataType */
257
+ static parseRawValue(val, dataType) {
258
+ // undefined values will be the default for most unmapped properties EXCEPT when they are set
259
+ // in a jsonResultsAdapter ( an unusual use case).
260
+ if (val === undefined)
261
+ return undefined;
262
+ if (!val)
263
+ return val;
264
+ if (dataType && dataType.parseRawValue) {
265
+ val = dataType.parseRawValue(val);
266
+ }
267
+ return val;
268
+ }
269
+ /** @hidden @internal */
270
+ // used during initialization; visible on instance for testing purposes.
271
+ static _resetConstants() {
272
+ DataType.constants = {
273
+ stringPrefix: "K_",
274
+ nextNumber: -1,
275
+ nextNumberIncrement: -1
276
+ };
277
+ }
278
+ }
279
+ DataType.prototype._$typeName = "DataType";
280
+ DataType._resetConstants();
281
+ DataType.resolveSymbols();
282
+ DataType.getSymbols().forEach((sym) => sym.validatorCtor = getValidatorCtor(sym));
283
+ // private functions;
284
+ function getValidatorCtor(dataType) {
285
+ switch (dataType) {
286
+ case DataType.String:
287
+ return Validator.string;
288
+ case DataType.Int64:
289
+ return Validator.int64;
290
+ case DataType.Int32:
291
+ return Validator.int32;
292
+ case DataType.Int16:
293
+ return Validator.int16;
294
+ case DataType.Decimal:
295
+ return Validator.number;
296
+ case DataType.Double:
297
+ return Validator.number;
298
+ case DataType.Single:
299
+ return Validator.number;
300
+ case DataType.DateTime:
301
+ return Validator.date;
302
+ case DataType.DateTimeOffset:
303
+ return Validator.date;
304
+ case DataType.DateOnly:
305
+ return Validator.date;
306
+ case DataType.Boolean:
307
+ return Validator.bool;
308
+ case DataType.Guid:
309
+ return Validator.guid;
310
+ case DataType.Byte:
311
+ return Validator.byte;
312
+ case DataType.Binary:
313
+ // TODO: don't quite know how to validate this yet.
314
+ return Validator.none;
315
+ case DataType.Time:
316
+ return Validator.duration;
317
+ case DataType.TimeOnly:
318
+ return timeOnlyValidator;
319
+ case DataType.Undefined:
320
+ return Validator.none;
321
+ }
322
+ }
323
+ /** A .NET TimeOnly as the server writes and reads it: "HH:mm", "HH:mm:ss" or "HH:mm:ss.fffffff". */
324
+ function timeOnlyValidator(context) {
325
+ return Validator.regularExpression({ ...context, expression: "^([01]\\d|2[0-3]):[0-5]\\d(:[0-5]\\d(\\.\\d{1,7})?)?$" });
326
+ }
327
+ /** Local midnight on the day of a DateOnly value, so that values on the same day compare equal and order correctly. */
328
+ function normalizeDateOnly(value) {
329
+ if (!(value && value.getTime))
330
+ return value;
331
+ const day = new Date(value.getTime());
332
+ day.setHours(0, 0, 0, 0);
333
+ return day.getTime();
334
+ }
335
+ function getNextString() {
336
+ return DataType.constants.stringPrefix + getNextNumber().toString();
337
+ }
338
+ function getNextNumber() {
339
+ let result = DataType.constants.nextNumber;
340
+ DataType.constants.nextNumber += DataType.constants.nextNumberIncrement;
341
+ return result;
342
+ }
343
+ function getNextGuid() {
344
+ return getUuid();
345
+ }
346
+ function getNextDateTime() {
347
+ return new Date();
348
+ }
349
+ function getConcurrencyDateTime(val) {
350
+ // use the current datetime but insure that it is different from previous call.
351
+ let dt = new Date();
352
+ let dt2 = new Date();
353
+ while (dt.getTime() === dt2.getTime()) {
354
+ dt2 = new Date();
355
+ }
356
+ return dt2;
357
+ }
358
+ function coerceToString(source, sourceTypeName) {
359
+ return (source == null) ? source : source.toString();
360
+ }
361
+ function coerceToGuid(source, sourceTypeName) {
362
+ if (sourceTypeName === "string") {
363
+ return source.trim().toLowerCase();
364
+ }
365
+ return source;
366
+ }
367
+ function coerceToInt(source, sourceTypeName) {
368
+ if (sourceTypeName === "string") {
369
+ let src = source.trim();
370
+ if (src === "")
371
+ return null;
372
+ let val = parseInt(src, 10);
373
+ return isNaN(val) ? source : val;
374
+ }
375
+ else if (sourceTypeName === "number") {
376
+ return Math.round(source);
377
+ }
378
+ // do we want to coerce floats -> ints
379
+ return source;
380
+ }
381
+ function coerceToFloat(source, sourceTypeName) {
382
+ if (sourceTypeName === "string") {
383
+ let src = source.trim();
384
+ if (src === "")
385
+ return null;
386
+ let val = parseFloat(src);
387
+ return isNaN(val) ? source : val;
388
+ }
389
+ return source;
390
+ }
391
+ function coerceToDate(source, sourceTypeName) {
392
+ let val;
393
+ if (sourceTypeName === "string") {
394
+ let src = source.trim();
395
+ if (!source || !source.trim()) {
396
+ return null;
397
+ }
398
+ val = new Date(Date.parse(src));
399
+ return core.isDate(val) ? val : source;
400
+ }
401
+ else if (sourceTypeName === "number") {
402
+ val = new Date(source);
403
+ return core.isDate(val) ? val : source;
404
+ }
405
+ return source;
406
+ }
407
+ /** Trim off time portion before parse if source is string */
408
+ function coerceToDateOnly(source, sourceTypeName) {
409
+ let val;
410
+ if (sourceTypeName === "string") {
411
+ if (!source || !source.trim()) {
412
+ return null;
413
+ }
414
+ val = DataType.parseDateAsLocal(source);
415
+ return core.isDate(val) ? val : source;
416
+ }
417
+ else if (sourceTypeName === "number") {
418
+ val = new Date(source);
419
+ return core.isDate(val) ? val : source;
420
+ }
421
+ return source;
422
+ }
423
+ function coerceToBool(source, sourceTypeName) {
424
+ if (sourceTypeName === "string") {
425
+ let src = source.trim().toLowerCase();
426
+ if (src === "false" || src === "") {
427
+ return false;
428
+ }
429
+ else if (src === "true") {
430
+ return true;
431
+ }
432
+ else {
433
+ return source;
434
+ }
435
+ }
436
+ return source;
437
+ }
438
+ function parseRawDate(val) {
439
+ if (!core.isDate(val)) {
440
+ val = DataType.parseDateFromServer(val);
441
+ }
442
+ return val;
443
+ }
444
+ /** Trim off time portion before parse */
445
+ function parseRawDateOnly(val) {
446
+ if (typeof val === 'string') {
447
+ if (val.length > 10) {
448
+ val = val.substring(0, 10);
449
+ }
450
+ val = DataType.parseDateAsLocal(val);
451
+ }
452
+ return val;
453
+ }
454
+ function parseRawBinary(val) {
455
+ if (val && val.$value !== undefined) {
456
+ val = val.$value; // this will be a byte[] encoded as a string
457
+ }
458
+ return val;
459
+ }
460
+ //function hasTimeZone(source) {
461
+ // var ix = source.indexOf("T");
462
+ // var timePart = source.substring(ix+1);
463
+ // return timePart.indexOf("-") >= 0 || timePart.indexOf("+") >= 0 || timePart.indexOf("Z");
464
+ //}
465
+ //# sourceMappingURL=data-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-type.js","sourceRoot":"","sources":["../../src/metadata/data-type.ts"],"names":[],"mappings":"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","sourcesContent":["import { core, getUuid } from '../core/core.js';\r\nimport { BreezeEnum } from '../core/enum.js';\r\nimport { Validator } from '../validation/validate.js';\r\n\r\n// A date-time with no zone that ends in fractional seconds, of any length: Json.NET drops trailing\r\n// zeros, so 500 ms is \".5\". It used to be /.\\d{3}$/, which needed three digits and, with its\r\n// unescaped dot, also matched an offset written without a colon (\"+0200\").\r\nconst _fractionalSecondsRegex = /\\d\\d\\.\\d+$/;\r\n\r\n// Names the .NET servers can write in metadata for types the client knows by another name.\r\n// EF Core writes the CLR type name (MetadataBuilder.NormalizeDataTypeName); NHibernate its own type names.\r\nconst _dataTypeAliases: Record<string, string> = {\r\n TimeSpan: \"Time\",\r\n Char: \"String\",\r\n SByte: \"Int16\",\r\n UInt16: \"Int32\",\r\n UInt32: \"Int64\",\r\n UInt64: \"Int64\",\r\n AnsiString: \"String\", // NHibernate\r\n AnsiChar: \"String\", // NHibernate\r\n StringClob: \"String\", // NHibernate\r\n};\r\n\r\n/** \r\nDataType is an 'Enum' containing all of the supported data types.\r\n*/\r\nexport class DataType extends BreezeEnum {\r\n /** The default value of this DataType. __Read Only__ */\r\n declare defaultValue?: any;\r\n /** Whether this is a 'numeric' DataType. __Read Only__ */\r\n declare isNumeric?: boolean;\r\n /** Whether this is an 'integer' DataType. __Read Only__ */\r\n declare isInteger?: boolean;\r\n\r\n /** The constructor function to create a {@link Validator} to be used in validating instances of this DataType. */\r\n validatorCtor?(context?: any): Validator;\r\n /** \r\n Optional function to normalize a data value for comparison, if its value cannot be used directly. \r\n Note that this will be called each time a property is changed, so make it fast.\r\n @returns value appropriate for this DataType\r\n */\r\n normalize?(value: any): any;\r\n /**\r\n Optional function to convert a raw (server) value from string to this DataType.\r\n @returns value appropriate for this DataType\r\n */\r\n parseRawValue?(value: any): any;\r\n /**\r\n Optional function to convert a value from string to this DataType. Note that this will be called each time a property is changed, so make it fast.\r\n @returns value appropriate for this DataType \r\n */\r\n parse?(source: any, sourceTypeName: string): any;\r\n /** \r\n Optional function to get the next value for key generation, if this datatype is used as a key. Uses an internal table of previous values.\r\n @returns value appropriate for this DataType \r\n */\r\n getNext?(): any;\r\n /**\r\n Optional function to get the next value when the datatype is used as a concurrency property.\r\n @param previousValue\r\n @returns the next concurrency value, which may be a function of the previousValue.\r\n */\r\n getConcurrencyValue?(previousValue?: any): any;\r\n\r\n /**\r\n The function Breeze converts `DateTime` and `DateTimeOffset` values from the server with, when it\r\n materializes query and save results. Defaults to {@link DataType.parseDateAsUTC}. Replace it at\r\n startup, before the first query, to change how a date-time string with no offset is read - for\r\n example with {@link DataType.parseDateAsLocal}. It does not affect saves, which always send UTC.\r\n */\r\n static parseDateFromServer = (value: any) => DataType.parseDateAsUTC(value);\r\n // same effect as above but doesn't give right TSDOC.\r\n // static parseDateFromServer = DataType.parseDateAsUTC;\r\n\r\n /** @hidden @internal */\r\n static constants: { stringPrefix: string, nextNumber: number, nextNumberIncrement: number };\r\n\r\n /** A string (.NET `String`; also `Char`). Default `\"\"`. */\r\n static String = new DataType({\r\n defaultValue: \"\",\r\n parse: coerceToString,\r\n getNext: getNextString\r\n });\r\n\r\n /** A 64-bit integer (.NET `Int64`; also `UInt32` and `UInt64`), held as a JavaScript `number`, so values beyond ±2^53 lose precision. Default `0`. */\r\n static Int64 = new DataType({\r\n defaultValue: 0,\r\n isNumeric: true,\r\n isInteger: true,\r\n parse: coerceToInt,\r\n getNext: getNextNumber\r\n });\r\n\r\n /** A 32-bit integer (.NET `Int32`; also `UInt16`), held as a `number`. Default `0`. */\r\n static Int32 = new DataType({\r\n defaultValue: 0,\r\n isNumeric: true,\r\n isInteger: true,\r\n parse: coerceToInt,\r\n getNext: getNextNumber\r\n });\r\n\r\n /** A 16-bit integer (.NET `Int16`; also `SByte`), held as a `number`. Default `0`. */\r\n static Int16 = new DataType({\r\n defaultValue: 0,\r\n isNumeric: true,\r\n isInteger: true,\r\n parse: coerceToInt,\r\n getNext: getNextNumber\r\n });\r\n\r\n /** An unsigned 8-bit integer, 0 to 255 (.NET `Byte`), held as a `number`. Default `0`. */\r\n static Byte = new DataType({\r\n defaultValue: 0,\r\n isNumeric: true,\r\n isInteger: true,\r\n parse: coerceToInt,\r\n });\r\n\r\n /** A decimal number (.NET `Decimal`), held as a JavaScript `number` - a double - so digits beyond its precision are lost. Default `0`. */\r\n static Decimal = new DataType({\r\n defaultValue: 0,\r\n isNumeric: true,\r\n isFloat: true,\r\n parse: coerceToFloat,\r\n getNext: getNextNumber\r\n });\r\n\r\n /** A 64-bit floating-point number (.NET `Double`). Also the type Breeze infers for an unmapped property that holds a number. Default `0`. */\r\n static Double = new DataType({\r\n defaultValue: 0,\r\n isNumeric: true,\r\n isFloat: true,\r\n parse: coerceToFloat,\r\n getNext: getNextNumber\r\n });\r\n\r\n /** A 32-bit floating-point number (.NET `Single`), held as a `number`. Default `0`. */\r\n static Single = new DataType({\r\n defaultValue: 0,\r\n isNumeric: true,\r\n isFloat: true,\r\n parse: coerceToFloat,\r\n getNext: getNextNumber\r\n });\r\n\r\n /** A calendar date with no time (.NET `DateOnly`), held as a `Date` at local midnight. Read from the first ten characters (`YYYY-MM-DD`) of the server's value, sent back as `YYYY-MM-DD` from the local date, and compared by date alone. Default 1 January 1900. */\r\n static DateOnly = new DataType({\r\n defaultValue: new Date(1900, 0, 1),\r\n isDate: true,\r\n parse: coerceToDateOnly,\r\n parseRawValue: parseRawDateOnly,\r\n normalize: normalizeDateOnly, // dates don't perform equality comparisons properly\r\n getNext: getNextDateTime,\r\n getConcurrencyValue: getConcurrencyDateTime\r\n });\r\n\r\n /** A date and time (.NET `DateTime`), held as a `Date`. Read from the server with {@link DataType.parseDateFromServer} and sent as ISO 8601 in UTC. Also the type Breeze infers for an unmapped property that holds a `Date`. Default 1 January 1900, local midnight. */\r\n static DateTime = new DataType({\r\n defaultValue: new Date(1900, 0, 1),\r\n isDate: true,\r\n parse: coerceToDate,\r\n parseRawValue: parseRawDate,\r\n normalize: function (value: any) { return value && value.getTime && value.getTime(); }, // dates don't perform equality comparisons properly\r\n getNext: getNextDateTime,\r\n getConcurrencyValue: getConcurrencyDateTime\r\n });\r\n\r\n /** A date and time with an offset (.NET `DateTimeOffset`), held as a `Date`, which has no offset: it is read with {@link DataType.parseDateFromServer} and sent back in UTC, so the original offset is lost. Default 1 January 1900, local midnight. */\r\n static DateTimeOffset = new DataType({\r\n defaultValue: new Date(1900, 0, 1),\r\n isDate: true,\r\n parse: coerceToDate,\r\n parseRawValue: parseRawDate,\r\n normalize: function (value: any) { return value && value.getTime && value.getTime(); }, // dates don't perform equality comparisons properly\r\n getNext: getNextDateTime,\r\n getConcurrencyValue: getConcurrencyDateTime\r\n });\r\n\r\n /** A duration (.NET `TimeSpan`), held as the ISO 8601 duration string the server sends, such as `PT4H30M`. Compared as a number of seconds in local queries. Default `PT0S`. */\r\n static Time = new DataType({\r\n defaultValue: \"PT0S\",\r\n // Looked up on each call, not captured here, so that replacing parseTimeFromServer works.\r\n parseRawValue: (value: any) => DataType.parseTimeFromServer(value)\r\n });\r\n\r\n /** A time of day (.NET `TimeOnly`), held as the string the server sends: \"14:30:00\" or \"01:23:45.678\". */\r\n static TimeOnly = new DataType({\r\n defaultValue: \"00:00:00\"\r\n });\r\n\r\n /** A `true` or `false` value (.NET `Boolean`). Default `false`. */\r\n static Boolean = new DataType({\r\n defaultValue: false,\r\n parse: coerceToBool,\r\n });\r\n\r\n /** A GUID (.NET `Guid`), held as a lower-case string. Default `\"00000000-0000-0000-0000-000000000000\"`. */\r\n static Guid = new DataType({\r\n defaultValue: \"00000000-0000-0000-0000-000000000000\",\r\n parse: coerceToGuid,\r\n getNext: getNextGuid,\r\n parseRawValue: function (val: string) { return val.toLowerCase(); },\r\n getConcurrencyValue: getUuid\r\n });\r\n\r\n /** Binary data (.NET `byte[]`), such as a SQL `rowversion`, held as the base64 string the server sends. Default `null`. */\r\n static Binary = new DataType({\r\n defaultValue: null,\r\n parseRawValue: parseRawBinary\r\n });\r\n\r\n /** An unknown type: a server type name the client does not recognize (the original is kept in the property's `rawTypeName`), or an unmapped property whose type cannot be inferred. Values are not converted or validated. Default `undefined`. */\r\n static Undefined = new DataType({\r\n defaultValue: undefined,\r\n });\r\n\r\n /**\r\n Returns the function Breeze uses to turn values of a data type into something `===`, `<` and `>`\r\n compare correctly, in local queries and when ordering: the data type's `normalize` if it has one,\r\n a conversion to seconds for {@link DataType.Time}, and otherwise the value itself. Applications do\r\n not normally need it.\r\n @param dataType - The data type of the values to compare.\r\n */\r\n static getComparableFn(dataType?: DataType) {\r\n if (dataType && dataType.normalize) {\r\n return dataType.normalize;\r\n } else if (dataType === DataType.Time) {\r\n // durations must be converted to compare them\r\n return function (value: any) {\r\n return value && core.durationToSeconds(value);\r\n };\r\n } else {\r\n // TODO: __identity\r\n return function (value: any) {\r\n return value;\r\n };\r\n }\r\n }\r\n\r\n /**\r\n Returns the DataType with the specified name, or undefined if there is none. Also accepts the names the .NET\r\n servers use for some types, such as 'TimeSpan' for {@link DataType.Time}.\r\n */\r\n static fromName(name: string): DataType | undefined {\r\n const dt = super.fromName(name) || super.fromName(_dataTypeAliases[name]);\r\n return dt instanceof DataType ? dt : undefined;\r\n }\r\n\r\n /** Returns the DataType for a specified input. */\r\n static fromValue(val: any) {\r\n if (core.isDate(val)) return DataType.DateTime;\r\n switch (typeof val) {\r\n case \"string\":\r\n if (core.isGuid(val)) return DataType.Guid;\r\n // the >3 below is a hack to insure that if we are inferring datatypes that\r\n // very short strings that are valid but unlikely ISO encoded Time's are treated as strings instead.\r\n else if (core.isDuration(val) && val.length > 3) return DataType.Time;\r\n else if (core.isDateString(val)) return DataType.DateTime;\r\n return DataType.String;\r\n case \"boolean\":\r\n return DataType.Boolean;\r\n case \"number\":\r\n return DataType.Double;\r\n }\r\n return DataType.Undefined;\r\n }\r\n\r\n /**\r\n Converts a {@link DataType.Time} value from the server. By default it returns the value unchanged:\r\n a `Time` is held as the ISO 8601 duration string the server sends, such as `PT4H30M`. Replace it\r\n at startup, before the first query, to hold durations some other way - as a number of seconds,\r\n say, with {@link core.durationToSeconds}.\r\n */\r\n static parseTimeFromServer(source: any) {\r\n return source;\r\n }\r\n\r\n /**\r\n Converts a date-time string from the server to a `Date`. This is the default\r\n {@link DataType.parseDateFromServer}.\r\n - A string with `Z` or an offset (`2024-03-15T10:30:00Z`, `...10:30:00+02:00`) is read as given.\r\n - A string with no offset that ends in fractional seconds, of any length\r\n (`2024-03-15T10:30:00.5`, `...00.000`, `...00.1234567`), is read as UTC: Breeze appends `Z`.\r\n - Any other string with no offset, such as `2024-03-15T10:30:00`, goes to `Date.parse`\r\n unchanged, which reads it as **local** time.\r\n @param source - The value from the server.\r\n */\r\n static parseDateAsUTC(source: any) {\r\n if (typeof source === 'string') {\r\n // No zone but fractional seconds: the server wrote UTC without saying so. Append the Z.\r\n if (_fractionalSecondsRegex.test(source)) source = source + 'Z';\r\n }\r\n source = new Date(Date.parse(source));\r\n return source;\r\n }\r\n\r\n /** Parse as UTC then shift to local time */\r\n static parseDateAsLocal(source: string) {\r\n var dt = DataType.parseDateAsUTC(source);\r\n if (core.isDate(dt)) {\r\n dt = new Date(dt.getTime() + dt.getTimezoneOffset()*60000);\r\n }\r\n return dt;\r\n };\r\n\r\n /** if val is a Date, return a date-only string e.g. '2023-12-31' */\r\n static toDateOnlyString(val: any) {\r\n // DateOnly types should not have time component, but JSON.stringify makes a full ISO string.\r\n // We convert it to string here to prevent that, and shift the time zone because toISOString converts to UTC.\r\n return val && val.getTime && new Date(val.getTime() - val.getTimezoneOffset()*60000).toISOString().substring(0, 10) || val;\r\n }\r\n\r\n /** Returns a raw value converted to the specified DataType */\r\n static parseRawValue(val: any, dataType?: DataType) {\r\n // undefined values will be the default for most unmapped properties EXCEPT when they are set\r\n // in a jsonResultsAdapter ( an unusual use case).\r\n if (val === undefined) return undefined;\r\n if (!val) return val;\r\n if (dataType && dataType.parseRawValue) {\r\n val = dataType.parseRawValue(val);\r\n }\r\n return val;\r\n }\r\n\r\n /** @hidden @internal */\r\n // used during initialization; visible on instance for testing purposes.\r\n static _resetConstants() {\r\n DataType.constants = {\r\n stringPrefix: \"K_\",\r\n nextNumber: -1,\r\n nextNumberIncrement: -1\r\n };\r\n }\r\n\r\n}\r\nDataType.prototype._$typeName = \"DataType\";\r\nDataType._resetConstants();\r\nDataType.resolveSymbols();\r\nDataType.getSymbols().forEach((sym: DataType) => sym.validatorCtor = getValidatorCtor(sym));\r\n\r\n// private functions;\r\n\r\n\r\nfunction getValidatorCtor(dataType: DataType) {\r\n switch (dataType) {\r\n case DataType.String:\r\n return Validator.string;\r\n case DataType.Int64:\r\n return Validator.int64;\r\n case DataType.Int32:\r\n return Validator.int32;\r\n case DataType.Int16:\r\n return Validator.int16;\r\n case DataType.Decimal:\r\n return Validator.number;\r\n case DataType.Double:\r\n return Validator.number;\r\n case DataType.Single:\r\n return Validator.number;\r\n case DataType.DateTime:\r\n return Validator.date;\r\n case DataType.DateTimeOffset:\r\n return Validator.date;\r\n case DataType.DateOnly:\r\n return Validator.date;\r\n case DataType.Boolean:\r\n return Validator.bool;\r\n case DataType.Guid:\r\n return Validator.guid;\r\n case DataType.Byte:\r\n return Validator.byte;\r\n case DataType.Binary:\r\n // TODO: don't quite know how to validate this yet.\r\n return Validator.none;\r\n case DataType.Time:\r\n return Validator.duration;\r\n case DataType.TimeOnly:\r\n return timeOnlyValidator;\r\n case DataType.Undefined:\r\n return Validator.none;\r\n }\r\n}\r\n\r\n/** A .NET TimeOnly as the server writes and reads it: \"HH:mm\", \"HH:mm:ss\" or \"HH:mm:ss.fffffff\". */\r\nfunction timeOnlyValidator(context?: any) {\r\n return Validator.regularExpression({ ...context, expression: \"^([01]\\\\d|2[0-3]):[0-5]\\\\d(:[0-5]\\\\d(\\\\.\\\\d{1,7})?)?$\" });\r\n}\r\n\r\n/** Local midnight on the day of a DateOnly value, so that values on the same day compare equal and order correctly. */\r\nfunction normalizeDateOnly(value: any) {\r\n if (!(value && value.getTime)) return value;\r\n const day = new Date(value.getTime());\r\n day.setHours(0, 0, 0, 0);\r\n return day.getTime();\r\n}\r\n\r\nfunction getNextString() {\r\n return DataType.constants.stringPrefix + getNextNumber().toString();\r\n}\r\n\r\nfunction getNextNumber() {\r\n let result = DataType.constants.nextNumber;\r\n DataType.constants.nextNumber += DataType.constants.nextNumberIncrement;\r\n return result;\r\n}\r\n\r\nfunction getNextGuid() {\r\n return getUuid();\r\n}\r\n\r\nfunction getNextDateTime() {\r\n return new Date();\r\n}\r\n\r\nfunction getConcurrencyDateTime(val: any) {\r\n // use the current datetime but insure that it is different from previous call.\r\n let dt = new Date();\r\n let dt2 = new Date();\r\n while (dt.getTime() === dt2.getTime()) {\r\n dt2 = new Date();\r\n }\r\n return dt2;\r\n}\r\n\r\nfunction coerceToString(source: any, sourceTypeName?: string) {\r\n return (source == null) ? source : source.toString();\r\n}\r\n\r\nfunction coerceToGuid(source: any, sourceTypeName: string) {\r\n if (sourceTypeName === \"string\") {\r\n return source.trim().toLowerCase();\r\n }\r\n return source;\r\n}\r\n\r\nfunction coerceToInt(source: any, sourceTypeName: string) {\r\n if (sourceTypeName === \"string\") {\r\n let src = source.trim();\r\n if (src === \"\") return null;\r\n let val = parseInt(src, 10);\r\n return isNaN(val) ? source : val;\r\n } else if (sourceTypeName === \"number\") {\r\n return Math.round(source);\r\n }\r\n // do we want to coerce floats -> ints\r\n return source;\r\n}\r\n\r\nfunction coerceToFloat(source: any, sourceTypeName: string) {\r\n if (sourceTypeName === \"string\") {\r\n let src = source.trim();\r\n if (src === \"\") return null;\r\n let val = parseFloat(src);\r\n return isNaN(val) ? source : val;\r\n }\r\n return source;\r\n}\r\n\r\nfunction coerceToDate(source: any, sourceTypeName: string) {\r\n let val: any;\r\n if (sourceTypeName === \"string\") {\r\n let src = source.trim();\r\n if (!source || !source.trim()) { return null; }\r\n val = new Date(Date.parse(src));\r\n return core.isDate(val) ? val : source;\r\n } else if (sourceTypeName === \"number\") {\r\n val = new Date(source);\r\n return core.isDate(val) ? val : source;\r\n }\r\n return source;\r\n}\r\n\r\n/** Trim off time portion before parse if source is string */\r\nfunction coerceToDateOnly(source: any, sourceTypeName: string) {\r\n let val: any;\r\n if (sourceTypeName === \"string\") {\r\n if (!source || !source.trim()) { return null; }\r\n val = DataType.parseDateAsLocal(source);\r\n return core.isDate(val) ? val : source;\r\n } else if (sourceTypeName === \"number\") {\r\n val = new Date(source);\r\n return core.isDate(val) ? val : source;\r\n }\r\n return source;\r\n}\r\n\r\nfunction coerceToBool(source: any, sourceTypeName: string) {\r\n if (sourceTypeName === \"string\") {\r\n let src = source.trim().toLowerCase();\r\n if (src === \"false\" || src === \"\") {\r\n return false;\r\n } else if (src === \"true\") {\r\n return true;\r\n } else {\r\n return source;\r\n }\r\n }\r\n return source;\r\n}\r\n\r\n\r\nfunction parseRawDate(val: any) {\r\n if (!core.isDate(val)) {\r\n val = DataType.parseDateFromServer(val);\r\n }\r\n return val;\r\n}\r\n\r\n/** Trim off time portion before parse */\r\nfunction parseRawDateOnly(val: any) {\r\n if (typeof val === 'string') {\r\n if (val.length > 10) {\r\n val = val.substring(0, 10);\r\n }\r\n val = DataType.parseDateAsLocal(val);\r\n }\r\n return val;\r\n}\r\n\r\nfunction parseRawBinary(val: any) {\r\n if (val && val.$value !== undefined) {\r\n val = val.$value; // this will be a byte[] encoded as a string\r\n }\r\n return val;\r\n}\r\n\r\n//function hasTimeZone(source) {\r\n// var ix = source.indexOf(\"T\");\r\n// var timePart = source.substring(ix+1);\r\n// return timePart.indexOf(\"-\") >= 0 || timePart.indexOf(\"+\") >= 0 || timePart.indexOf(\"Z\");\r\n//}\r\n"]}