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.
- package/LICENSE +1 -1
- package/README.md +83 -63
- package/adapters/abstract-data-service-adapter.d.ts +120 -0
- package/adapters/abstract-data-service-adapter.js +395 -0
- package/adapters/abstract-data-service-adapter.js.map +1 -0
- package/adapters/adapter-ajax-fetch.d.ts +12 -0
- package/adapters/adapter-ajax-fetch.js +13 -0
- package/adapters/adapter-ajax-fetch.js.map +1 -0
- package/{adapter-ajax-post → adapters}/adapter-ajax-post.d.ts +40 -36
- package/{fesm2022/breeze-client-adapter-ajax-post.mjs → adapters/adapter-ajax-post.js} +80 -82
- package/adapters/adapter-ajax-post.js.map +1 -0
- package/{adapter-ajax-fetch → adapters}/adapter-core.d.ts +4 -4
- package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → adapters/adapter-core.js} +48 -91
- package/adapters/adapter-core.js.map +1 -0
- package/adapters/adapter-data-service-webapi.d.ts +9 -0
- package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → adapters/adapter-data-service-webapi.js} +105 -107
- package/adapters/adapter-data-service-webapi.js.map +1 -0
- package/adapters/adapter-model-library-backing-store.d.ts +32 -0
- package/adapters/adapter-model-library-backing-store.js +321 -0
- package/adapters/adapter-model-library-backing-store.js.map +1 -0
- package/adapters/adapter-uri-builder-json.d.ts +11 -0
- package/adapters/adapter-uri-builder-json.js +40 -0
- package/adapters/adapter-uri-builder-json.js.map +1 -0
- package/adapters/http.d.ts +52 -0
- package/adapters/http.js +202 -0
- package/adapters/http.js.map +1 -0
- package/angular/adapter-angular-httpclient.d.ts +21 -0
- package/angular/adapter-angular-httpclient.js +70 -0
- package/angular/adapter-angular-httpclient.js.map +1 -0
- package/breeze.d.ts +215 -0
- package/breeze.js +141 -0
- package/breeze.js.map +1 -0
- package/config/config.d.ts +212 -0
- package/config/config.js +392 -0
- package/config/config.js.map +1 -0
- package/config/configure.d.ts +66 -0
- package/config/configure.js +46 -0
- package/config/configure.js.map +1 -0
- package/config/default-adapters.d.ts +1 -0
- package/config/default-adapters.js +40 -0
- package/config/default-adapters.js.map +1 -0
- package/config/interface-registry.d.ts +191 -0
- package/config/interface-registry.js +5 -0
- package/config/interface-registry.js.map +1 -0
- package/{src → core}/assert-param.d.ts +52 -60
- package/core/assert-param.js +390 -0
- package/core/assert-param.js.map +1 -0
- package/core/core.d.ts +285 -0
- package/core/core.js +772 -0
- package/core/core.js.map +1 -0
- package/core/enum.d.ts +116 -0
- package/core/enum.js +167 -0
- package/core/enum.js.map +1 -0
- package/core/event.d.ts +169 -0
- package/core/event.js +338 -0
- package/core/event.js.map +1 -0
- package/entity/array.d.ts +3 -0
- package/entity/array.js +4 -0
- package/entity/array.js.map +1 -0
- package/entity/complex-array.d.ts +17 -0
- package/entity/complex-array.js +104 -0
- package/entity/complex-array.js.map +1 -0
- package/entity/default-property-interceptor.d.ts +1 -0
- package/entity/default-property-interceptor.js +496 -0
- package/entity/default-property-interceptor.js.map +1 -0
- package/{src → entity}/entity-action.d.ts +36 -42
- package/entity/entity-action.js +45 -0
- package/entity/entity-action.js.map +1 -0
- package/entity/entity-aspect.d.ts +457 -0
- package/entity/entity-aspect.js +1262 -0
- package/entity/entity-aspect.js.map +1 -0
- package/entity/entity-base.d.ts +55 -0
- package/entity/entity-base.js +41 -0
- package/entity/entity-base.js.map +1 -0
- package/entity/entity-group.d.ts +1 -0
- package/entity/entity-group.js +224 -0
- package/entity/entity-group.js.map +1 -0
- package/entity/entity-key.d.ts +95 -0
- package/entity/entity-key.js +189 -0
- package/entity/entity-key.js.map +1 -0
- package/{src → entity}/entity-state.d.ts +112 -84
- package/entity/entity-state.js +135 -0
- package/entity/entity-state.js.map +1 -0
- package/entity/key-generator.d.ts +57 -0
- package/entity/key-generator.js +155 -0
- package/entity/key-generator.js.map +1 -0
- package/entity/observable-array.d.ts +25 -0
- package/entity/observable-array.js +230 -0
- package/entity/observable-array.js.map +1 -0
- package/entity/primitive-array.d.ts +12 -0
- package/entity/primitive-array.js +71 -0
- package/entity/primitive-array.js.map +1 -0
- package/entity/relation-array.d.ts +24 -0
- package/entity/relation-array.js +176 -0
- package/entity/relation-array.js.map +1 -0
- package/entity/unattached-children-map.d.ts +1 -0
- package/entity/unattached-children-map.js +105 -0
- package/entity/unattached-children-map.js.map +1 -0
- package/generate-entity-classes.js +1176 -0
- package/manager/entity-manager.d.ts +801 -0
- package/manager/entity-manager.js +2395 -0
- package/manager/entity-manager.js.map +1 -0
- package/{src → manager}/save-options.d.ts +48 -42
- package/manager/save-options.js +51 -0
- package/manager/save-options.js.map +1 -0
- package/{src → metadata}/data-service.d.ts +229 -184
- package/metadata/data-service.js +246 -0
- package/metadata/data-service.js.map +1 -0
- package/metadata/data-type.d.ts +122 -0
- package/metadata/data-type.js +465 -0
- package/metadata/data-type.js.map +1 -0
- package/metadata/entity-metadata.d.ts +1193 -0
- package/metadata/entity-metadata.js +2502 -0
- package/metadata/entity-metadata.js.map +1 -0
- package/{src → metadata}/local-query-comparison-options.d.ts +65 -59
- package/metadata/local-query-comparison-options.js +69 -0
- package/metadata/local-query-comparison-options.js.map +1 -0
- package/{src → metadata}/naming-convention.d.ts +75 -72
- package/metadata/naming-convention.js +97 -0
- package/metadata/naming-convention.js.map +1 -0
- package/mixins/mixin-get-entity-graph.d.ts +63 -0
- package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → mixins/mixin-get-entity-graph.js} +331 -253
- package/mixins/mixin-get-entity-graph.js.map +1 -0
- package/mixins/mixin-save-queuing.d.ts +98 -0
- package/{fesm2022/breeze-client-mixin-save-queuing.mjs → mixins/mixin-save-queuing.js} +493 -365
- package/mixins/mixin-save-queuing.js.map +1 -0
- package/package.json +63 -94
- package/query/entity-query.d.ts +521 -0
- package/query/entity-query.js +1149 -0
- package/query/entity-query.js.map +1 -0
- package/{src → query}/mapping-context.d.ts +44 -46
- package/query/mapping-context.js +412 -0
- package/query/mapping-context.js.map +1 -0
- package/query/predicate.d.ts +394 -0
- package/query/predicate.js +1294 -0
- package/query/predicate.js.map +1 -0
- package/query/property-path.d.ts +252 -0
- package/query/property-path.js +2 -0
- package/query/property-path.js.map +1 -0
- package/{src → query}/query-options.d.ts +143 -119
- package/query/query-options.js +180 -0
- package/query/query-options.js.map +1 -0
- package/rxjs/breeze-rxjs.d.ts +72 -0
- package/rxjs/breeze-rxjs.js +117 -0
- package/rxjs/breeze-rxjs.js.map +1 -0
- package/validation/validate.d.ts +583 -0
- package/validation/validate.js +961 -0
- package/validation/validate.js.map +1 -0
- package/{src → validation}/validation-options.d.ts +67 -63
- package/validation/validation-options.js +70 -0
- package/validation/validation-options.js.map +1 -0
- package/adapter-ajax-angularjs/adapter-ajax-angularjs.d.ts +0 -17
- package/adapter-ajax-angularjs/adapter-core.d.ts +0 -4
- package/adapter-ajax-angularjs/index.d.ts +0 -5
- package/adapter-ajax-fetch/adapter-ajax-fetch.d.ts +0 -18
- package/adapter-ajax-fetch/index.d.ts +0 -5
- package/adapter-ajax-httpclient/adapter-ajax-httpclient.d.ts +0 -13
- package/adapter-ajax-httpclient/adapter-core.d.ts +0 -4
- package/adapter-ajax-httpclient/index.d.ts +0 -5
- package/adapter-ajax-jquery/adapter-ajax-jquery.d.ts +0 -15
- package/adapter-ajax-jquery/index.d.ts +0 -5
- package/adapter-ajax-post/index.d.ts +0 -5
- package/adapter-data-service-odata/adapter-core.d.ts +0 -4
- package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -17
- package/adapter-data-service-odata/index.d.ts +0 -5
- package/adapter-data-service-webapi/adapter-data-service-webapi.d.ts +0 -15
- package/adapter-data-service-webapi/index.d.ts +0 -5
- package/adapter-model-library-backing-store/adapter-model-library-backing-store.d.ts +0 -10
- package/adapter-model-library-backing-store/index.d.ts +0 -5
- package/adapter-model-library-ko/adapter-model-library-ko.d.ts +0 -10
- package/adapter-model-library-ko/index.d.ts +0 -5
- package/adapter-uri-builder-json/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-json/adapter-uri-builder-json.d.ts +0 -8
- package/adapter-uri-builder-json/index.d.ts +0 -5
- package/adapter-uri-builder-odata/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-odata/adapter-uri-builder-odata.d.ts +0 -8
- package/adapter-uri-builder-odata/index.d.ts +0 -5
- package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
- package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
- package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
- package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
- package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
- package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
- package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
- package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
- package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
- package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
- package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -461
- package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
- package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
- package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
- package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
- package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
- package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
- package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
- package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
- package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
- package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
- package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
- package/esm2022/breeze-client.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
- package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
- package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
- package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
- package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
- package/esm2022/src/array.mjs +0 -4
- package/esm2022/src/assert-param.mjs +0 -330
- package/esm2022/src/breeze.mjs +0 -85
- package/esm2022/src/complex-array.mjs +0 -117
- package/esm2022/src/config.mjs +0 -232
- package/esm2022/src/core.mjs +0 -712
- package/esm2022/src/csdl-metadata-parser.mjs +0 -385
- package/esm2022/src/data-service.mjs +0 -221
- package/esm2022/src/data-type.mjs +0 -510
- package/esm2022/src/default-property-interceptor.mjs +0 -460
- package/esm2022/src/entity-action.mjs +0 -45
- package/esm2022/src/entity-aspect.mjs +0 -897
- package/esm2022/src/entity-group.mjs +0 -192
- package/esm2022/src/entity-key.mjs +0 -125
- package/esm2022/src/entity-manager.mjs +0 -2163
- package/esm2022/src/entity-metadata.mjs +0 -2242
- package/esm2022/src/entity-query.mjs +0 -1024
- package/esm2022/src/entity-state.mjs +0 -107
- package/esm2022/src/enum.mjs +0 -143
- package/esm2022/src/event.mjs +0 -264
- package/esm2022/src/interface-registry.mjs +0 -39
- package/esm2022/src/key-generator.mjs +0 -110
- package/esm2022/src/local-query-comparison-options.mjs +0 -65
- package/esm2022/src/mapping-context.mjs +0 -411
- package/esm2022/src/naming-convention.mjs +0 -92
- package/esm2022/src/observable-array.mjs +0 -183
- package/esm2022/src/predicate.mjs +0 -1259
- package/esm2022/src/primitive-array.mjs +0 -85
- package/esm2022/src/query-options.mjs +0 -152
- package/esm2022/src/relation-array.mjs +0 -173
- package/esm2022/src/save-options.mjs +0 -41
- package/esm2022/src/unattached-children-map.mjs +0 -56
- package/esm2022/src/validate.mjs +0 -995
- package/esm2022/src/validation-options.mjs +0 -64
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs +0 -194
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs +0 -114
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs +0 -516
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs +0 -276
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs +0 -248
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs +0 -246
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
- package/fesm2022/breeze-client.mjs +0 -14144
- package/fesm2022/breeze-client.mjs.map +0 -1
- package/index.d.ts +0 -1
- package/mixin-get-entity-graph/index.d.ts +0 -5
- package/mixin-get-entity-graph/mixin-get-entity-graph.d.ts +0 -31
- package/mixin-save-queuing/index.d.ts +0 -5
- package/mixin-save-queuing/mixin-save-queuing.d.ts +0 -32
- package/src/abstract-data-service-adapter.d.ts +0 -84
- package/src/array.d.ts +0 -3
- package/src/breeze.d.ts +0 -139
- package/src/complex-array.d.ts +0 -13
- package/src/config.d.ts +0 -104
- package/src/core.d.ts +0 -164
- package/src/csdl-metadata-parser.d.ts +0 -7
- package/src/data-type.d.ts +0 -89
- package/src/default-property-interceptor.d.ts +0 -4
- package/src/entity-aspect.d.ts +0 -332
- package/src/entity-group.d.ts +0 -28
- package/src/entity-key.d.ts +0 -77
- package/src/entity-manager.d.ts +0 -680
- package/src/entity-metadata.d.ts +0 -988
- package/src/entity-query.d.ts +0 -444
- package/src/enum.d.ts +0 -100
- package/src/event.d.ts +0 -142
- package/src/interface-registry.d.ts +0 -150
- package/src/key-generator.d.ts +0 -12
- package/src/observable-array.d.ts +0 -52
- package/src/predicate.d.ts +0 -376
- package/src/primitive-array.d.ts +0 -7
- package/src/relation-array.d.ts +0 -18
- package/src/unattached-children-map.d.ts +0 -19
- 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"]}
|