{"version":3,"file":"breeze-client.mjs","sources":["../../src/enum.ts","../../src/core.ts","../../src/assert-param.ts","../../src/event.ts","../../src/config.ts","../../src/data-service.ts","../../src/validate.ts","../../src/data-type.ts","../../src/entity-state.ts","../../src/entity-action.ts","../../src/entity-key.ts","../../src/query-options.ts","../../src/predicate.ts","../../src/entity-query.ts","../../src/entity-aspect.ts","../../src/naming-convention.ts","../../src/csdl-metadata-parser.ts","../../src/local-query-comparison-options.ts","../../src/default-property-interceptor.ts","../../src/entity-metadata.ts","../../src/abstract-data-service-adapter.ts","../../src/validation-options.ts","../../src/save-options.ts","../../src/key-generator.ts","../../src/entity-group.ts","../../src/mapping-context.ts","../../src/unattached-children-map.ts","../../src/entity-manager.ts","../../src/interface-registry.ts","../../src/observable-array.ts","../../src/relation-array.ts","../../src/complex-array.ts","../../src/primitive-array.ts","../../src/breeze.ts","../../breeze-client.ts"],"sourcesContent":["/*\r\n * Copyright 2012-2023 IdeaBlade, Inc.  All Rights Reserved.  \r\n * Use, reproduction, distribution, and modification of this code is subject to the terms and \r\n * conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license\r\n *\r\n * Author: Jay Traband\r\n */\r\n\r\n/**\r\nBase class for all Breeze enumerations, such as EntityState, DataType, FetchStrategy, MergeStrategy etc.\r\nA Breeze Enum is a namespaced set of constant values.  Each Enum consists of a group of related constants, called 'symbols'.\r\nUnlike enums in some other environments, each 'symbol' can have both methods and properties.\r\n>     class DayOfWeek extends BreezeEnum {\r\n>       dayIndex: number;\r\n>       isWeekend?: boolean;\r\n>       nextDay() {\r\n>         let nextIndex = (this.dayIndex + 1) % 7;\r\n>         return DayOfWeek.getSymbols()[nextIndex];\r\n>       }\r\n>\r\n>       static Monday = new DayOfWeek( { dayIndex: 0});\r\n>       static Tuesday = new DayOfWeek( { dayIndex: 1 });\r\n>       static Wednesday = new DayOfWeek( { dayIndex: 2 });\r\n>       static Thursday = new DayOfWeek( { dayIndex: 3 });\r\n>       static Friday = new DayOfWeek( { dayIndex: 4 });\r\n>       static Saturday = new DayOfWeek( { dayIndex: 5, isWeekend: true });\r\n>       static Sunday = new DayOfWeek( { dayIndex: 6, isWeekend: true });\r\n>     }\r\n>\r\n>     describe(\"DayOfWeek\", () => {\r\n>       test(\"should support full enum capabilities\", function() {\r\n>         // // custom methods\r\n>         let dowSymbols = DayOfWeek.getSymbols();\r\n>         expect(dowSymbols.length).toBe(7);\r\n>         expect(DayOfWeek.Monday.nextDay()).toBe(DayOfWeek.Tuesday);\r\n>         expect(DayOfWeek.Sunday.nextDay()).toBe(DayOfWeek.Monday);\r\n>       // // custom properties\r\n>         expect(DayOfWeek.Tuesday.isWeekend).toBe(undefined);\r\n>         expect(DayOfWeek.Saturday.isWeekend).toBe(true);\r\n>       // // Standard enum capabilities\r\n>         expect(DayOfWeek.Thursday instanceof DayOfWeek).toBe(true);\r\n>         expect(BreezeEnum.isSymbol(DayOfWeek.Wednesday)).toBe(true);\r\n>         expect(DayOfWeek.contains(DayOfWeek.Thursday)).toBe(true);\r\n>         expect(DayOfWeek.Friday.toString()).toBe(\"Friday\");\r\n>       });\r\n>   });\r\nNote that we have Error['x'] = ... in some places in the code to prevent Terser from optimizing out some important calls.\r\n@dynamic\r\n*/\r\nexport class BreezeEnum {\r\n  // // TODO: think about CompositeEnum (flags impl).\r\n  /** The name of this symbol */\r\n  declare name: string;\r\n  /** Type of the enum; set in prototype of each enum */\r\n  declare _$typeName: string;\r\n  /** @hidden @internal */\r\n  static _resolvedNamesAndSymbols: { name: string, symbol: BreezeEnum }[];\r\n\r\n  /**  */\r\n  constructor(propertiesObj?: Object) {\r\n    if (propertiesObj) {\r\n      Object.keys(propertiesObj).forEach((key) => this[key] = propertiesObj[key]);\r\n    }\r\n  }\r\n\r\n  /**\r\n  Returns all of the symbols contained within this Enum.\r\n  >     let symbols = DayOfWeek.getSymbols();\r\n  @return All of the symbols contained within this Enum.\r\n  **/\r\n  static getSymbols() {\r\n    return this.resolveSymbols().map(ks => ks.symbol);\r\n  }\r\n\r\n  /**\r\n  Returns the names of all of the symbols contained within this Enum.\r\n  >     let symbols = DayOfWeek.getNames();\r\n  @return  All of the names of the symbols contained within this Enum.\r\n  **/\r\n  static getNames() {\r\n    return this.resolveSymbols().map(ks => ks.name);\r\n  }\r\n\r\n  /**\r\n  Returns an Enum symbol given its name.\r\n  >     let dayOfWeek = DayOfWeek.from(\"Thursday\");\r\n  >     // nowdayOfWeek === DayOfWeek.Thursday\r\n  @param name - Name for which an enum symbol should be returned.\r\n  @return The symbol that matches the name or 'undefined' if not found.\r\n  **/\r\n  static fromName(name: string) {\r\n    return this[name];\r\n  }\r\n\r\n  /**\r\n  Seals this enum so that no more symbols may be added to it. This should only be called after all symbols\r\n  have already been added to the Enum. This method also sets the 'name' property on each of the symbols.\r\n  >     DayOfWeek.resolveSymbols();\r\n  **/\r\n  static resolveSymbols() {\r\n    if (this._resolvedNamesAndSymbols) return this._resolvedNamesAndSymbols;\r\n    let result: {name: string, symbol: BreezeEnum }[] = [];\r\n\r\n    for (let key in this) {\r\n      if (this.hasOwnProperty(key)) {\r\n        let symb = this[key];\r\n        if (symb instanceof BreezeEnum) {\r\n          result.push( { name: key, symbol: symb });\r\n          this[key] = symb;\r\n          symb.name = key;\r\n        }\r\n      }\r\n    }\r\n    this._resolvedNamesAndSymbols = result;\r\n    return result;\r\n  }\r\n\r\n  /**\r\n  Returns whether an Enum contains a specified symbol.\r\n  >     let symbol = DayOfWeek.Friday;\r\n  >     if (DayOfWeek.contains(symbol)) {\r\n  >         // do something\r\n  >     }\r\n  @param sym - Object or symbol to test.\r\n  @return Whether this Enum contains the specified symbol.\r\n  **/\r\n  static contains(sym: BreezeEnum) {\r\n    if (!(sym instanceof BreezeEnum)) {\r\n      return false;\r\n    }\r\n\r\n    return this[sym.name] != null;\r\n  }\r\n\r\n\r\n  // /**\r\n  // Checks if an object is an Enum 'symbol'. Use the 'contains' method instead of this one \r\n  // if you want to test for a specific Enum. \r\n  // >     if (Enum.isSymbol(DayOfWeek.Wednesday)) {\r\n  // >       // do something ...\r\n  // >     };\r\n  // **/\r\n  // static isSymbol(obj: any) {\r\n  //   return obj instanceof BreezeEnum;\r\n  // };\r\n\r\n  /** Returns the string name of this Enum */\r\n  toString() {\r\n    return this.name;\r\n  }\r\n\r\n  /** Return enum name and symbol name */\r\n  toJSON() {\r\n    return {\r\n      _$typeName: this['_$typeName'] || (this.constructor as any).name,\r\n      name: this.name\r\n    };\r\n  }\r\n\r\n}\r\n\r\n\r\n","/** See if this comment will make it into .d.ts */\r\nimport { BreezeEnum } from './enum';\r\ndeclare var global: any;\r\ndeclare var window: any;\r\n\r\nexport interface ErrorCallback {\r\n    (error: Error): void;\r\n}\r\n\r\nexport interface Callback {\r\n    (data: any): void;\r\n}\r\n\r\n// type Predicate = (i: any) => boolean;\r\ntype Predicate<T> = (i: T) => boolean;\r\n\r\nlet hasOwnProperty: (obj: Object, key: string) => boolean = uncurry(Object.prototype.hasOwnProperty);\r\nlet arraySlice: (ar: any[], start?: number, end?: number) => any[] = uncurry(Array.prototype.slice);\r\nlet isES5Supported: boolean = function () {\r\n    try {\r\n        return !!(Object.getPrototypeOf && Object.defineProperty({}, 'x', {}));\r\n    } catch (e) {\r\n        return false;\r\n    }\r\n} ();\r\n\r\n// iterate over object\r\nfunction objectForEach(obj: Object, kvFn: (key: string, val: any) => any) {\r\n    for (let key in obj) {\r\n        if (hasOwnProperty(obj, key)) {\r\n            kvFn(key, obj[key]);\r\n        }\r\n    }\r\n}\r\n\r\nfunction objectMap(obj: Object, kvFn?: (key: string, val: any) => any): any[] {\r\n    let results: any[] = [];\r\n    for (let key in obj) {\r\n        if (hasOwnProperty(obj, key)) {\r\n            let result = kvFn ? kvFn(key, obj[key]) : obj[key];\r\n            if (result !== undefined) {\r\n                results.push(result);\r\n            }\r\n        }\r\n    }\r\n    return results;\r\n}\r\n\r\nfunction objectFirst(obj: Object, kvPredicate: (key: string, val: any) => boolean): { key: string, value: any } | null {\r\n    for (let key in obj) {\r\n        if (hasOwnProperty(obj, key)) {\r\n            let value = obj[key];\r\n            if (kvPredicate(key, value)) {\r\n                return { key: key, value: value };\r\n            }\r\n        }\r\n    }\r\n    return null;\r\n}\r\n\r\nfunction arrayFlatMap<T, U>(arr: T[], mapFn: (arg: T) => U[]) {\r\n    return Array.prototype.concat.apply([], arr.map(mapFn)) as U[];\r\n}\r\n\r\nfunction isSettable(obj: Object, propertyName: string): boolean {\r\n    let pd = getPropDescriptor(obj, propertyName);\r\n    if (pd == null) return true;\r\n    return !!(pd.writable || pd.set);\r\n}\r\n\r\nfunction getPropDescriptor(obj: Object, propertyName: string): PropertyDescriptor | undefined {\r\n    if (!isES5Supported) return undefined;\r\n\r\n    if (obj.hasOwnProperty(propertyName)) {\r\n        return Object.getOwnPropertyDescriptor(obj, propertyName);\r\n    } else {\r\n        let nextObj = Object.getPrototypeOf(obj);\r\n        if (nextObj == null) return undefined;\r\n        return getPropDescriptor(nextObj, propertyName);\r\n    }\r\n}\r\n\r\n// Functional extensions\r\n\r\n/** can be used like: persons.filter(propEq(\"firstName\", \"John\")) */\r\nfunction propEq(propertyName: string, value: any): (obj: Object) => boolean {\r\n    return function (obj: any) {\r\n        return obj[propertyName] === value;\r\n    };\r\n}\r\n\r\n/** can be used like: persons.filter(propEq(\"firstName\", \"FirstName\", \"John\")) */\r\nfunction propsEq(property1Name: string, property2Name: string, value: any): (obj: Object) => boolean {\r\n    return function (obj: any) {\r\n        return obj[property1Name] === value || obj[property2Name] === value;\r\n    };\r\n}\r\n\r\n/** can be used like persons.map(pluck(\"firstName\")) */\r\nfunction pluck(propertyName: any): (obj: Object) => any {\r\n    return function (obj: any) {\r\n        return obj[propertyName];\r\n    };\r\n}\r\n\r\n// end functional extensions\r\n\r\n/** Return an array of property values from source */\r\nfunction getOwnPropertyValues(source: Object): any[] {\r\n    let result: any[] = [];\r\n    for (let name in source) {\r\n        if (hasOwnProperty(source, name)) {\r\n            result.push(source[name]);\r\n        }\r\n    }\r\n    return result;\r\n}\r\n\r\n/** Copy properties from source to target. Returns target. */\r\nfunction extend(target: Object, source: Object, propNames?: string[]): Object {\r\n    if (!source) return target;\r\n    if (propNames) {\r\n        propNames.forEach(function (propName) {\r\n            target[propName] = source[propName];\r\n        });\r\n    } else {\r\n        for (let propName in source) {\r\n            if (hasOwnProperty(source, propName)) {\r\n                target[propName] = source[propName];\r\n            }\r\n        }\r\n    }\r\n    return target;\r\n}\r\n\r\n/** Copy properties from defaults iff undefined on target.  Returns target. */\r\nfunction updateWithDefaults(target: Object, defaults: Object): any {\r\n    for (let name in defaults) {\r\n        if (target[name] === undefined) {\r\n            target[name] = defaults[name];\r\n        }\r\n    }\r\n    return target;\r\n}\r\n\r\n/** Set ctor.defaultInstance to an instance of ctor with properties from target.\r\n    We want to insure that the object returned by ctor.defaultInstance is always immutable\r\n    Use 'target' as the primary template for the ctor.defaultInstance;\r\n    Use current 'ctor.defaultInstance' as the template for any missing properties\r\n    creates a new instance for ctor.defaultInstance\r\n    returns target unchanged */\r\nfunction setAsDefault(target: Object, ctor: { new (...args: any[]): any, defaultInstance?: any }): any {\r\n    ctor.defaultInstance = updateWithDefaults(new ctor(target), ctor.defaultInstance);\r\n    return target;\r\n}\r\n\r\n/**\r\n    'source' is an object that will be transformed into another\r\n    'template' is a map where the\r\n       keys: are the keys to return\r\n         if a key contains ','s then the key is treated as a delimited string with first of the\r\n         keys being the key to return and the others all valid aliases for this key\r\n       'values' are either\r\n           1) the 'default' value of the key\r\n           2) a function that takes in the source value and should return the value to set\r\n         The value from the source is then set on the target,\r\n         after first passing thru the fn, if provided, UNLESS:\r\n           1) it is the default value\r\n           2) it is undefined ( nulls WILL be set)\r\n    'target' is optional\r\n       - if it exists then properties of the target will be set ( overwritten if the exist)\r\n       - if it does not exist then a new object will be created as filled.\r\n    'target is returned.\r\n*/\r\nfunction toJson(source: Object, template: Object, target: Object = {}): Object {\r\n\r\n    for (let key in template) {\r\n        let aliases = key.split(\",\");\r\n        let defaultValue = template[key];\r\n        // using some as a forEach with a 'break'\r\n        aliases.some(function (propName) {\r\n            if (!(propName in source)) return false;\r\n            let value = source[propName];\r\n            // there is a functional property defined with this alias ( not what we want to replace).\r\n            if (typeof value === 'function') return false;\r\n            // '==' is deliberate here - idea is that null or undefined values will never get serialized\r\n            // if default value is set to null.\r\n            // tslint:disable-next-line\r\n            if (value == defaultValue) return true;\r\n            if (Array.isArray(value) && value.length === 0) return true;\r\n            if (typeof (defaultValue) === \"function\") {\r\n                value = defaultValue(value);\r\n            } else if (typeof (value) === \"object\") {\r\n                if (value && value instanceof BreezeEnum) {\r\n                    value = value.name;\r\n                }\r\n            }\r\n            if (value === undefined) return true;\r\n            target[aliases[0]] = value;\r\n            return true;\r\n        });\r\n    }\r\n    return target;\r\n}\r\n\r\n/** Replacer function for toJSONSafe, when serializing entities.  Excludes entityAspect and other internal properties. */\r\nfunction toJSONSafeReplacer(prop: string, val: any) {\r\n    if (prop === \"entityAspect\" || prop === \"complexAspect\" || prop === \"entityType\" || prop === \"complexType\"\r\n        || prop === \"getProperty\" || prop === \"setProperty\"\r\n        || prop === \"constructor\" || prop.charAt(0) === '_' || prop.charAt(0) === '$') return;\r\n    return val;\r\n}\r\n\r\n/** Safely perform toJSON logic on objects with cycles. */\r\nfunction toJSONSafe(obj: any, replacer?: (prop: string, value: any) => any): any {\r\n    if (obj !== Object(obj)) return obj; // primitive value\r\n    if (obj._$visited) return undefined;\r\n    if (obj.toJSON) {\r\n        let newObj = obj.toJSON();\r\n        if (newObj !== Object(newObj)) return newObj; // primitive value\r\n        if (newObj !== obj) return toJSONSafe(newObj, replacer);\r\n        // toJSON returned the object unchanged.\r\n        obj = newObj;\r\n    }\r\n    obj._$visited = true;\r\n    let result: any;\r\n    if (obj instanceof Array) {\r\n        result = obj.map(function (o: any) {\r\n            return toJSONSafe(o, replacer);\r\n        });\r\n    } else if (typeof (obj) === \"function\") {\r\n        result = undefined;\r\n    } else {\r\n        result = {};\r\n        for (let prop in obj) {\r\n            if (prop === \"_$visited\") continue;\r\n            let val = obj[prop];\r\n            if (replacer) {\r\n                val = replacer(prop, val);\r\n                if (val === undefined) continue;\r\n            }\r\n            val = toJSONSafe(val, replacer);\r\n            if (val === undefined) continue;\r\n            result[prop] = val;\r\n        }\r\n    }\r\n    delete obj._$visited;\r\n    return result;\r\n}\r\n\r\n/** Resolves the values of a list of properties by checking each property in multiple sources until a value is found. */\r\nfunction resolveProperties(sources: Object[], propertyNames: string[]): any {\r\n    let r = {};\r\n    let length = sources.length;\r\n    propertyNames.forEach(function (pn) {\r\n        for (let i = 0; i < length; i++) {\r\n            let src = sources[i];\r\n            if (src) {\r\n                let val = src[pn];\r\n                if (val !== undefined) {\r\n                    r[pn] = val;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    });\r\n    return r;\r\n}\r\n\r\n\r\n// array functions\r\n\r\nfunction toArray(item: any): any[] {\r\n    if (item == null) {\r\n        return [];\r\n    } else if (Array.isArray(item)) {\r\n        return item;\r\n    } else {\r\n        return [item];\r\n    }\r\n}\r\n\r\n/** a version of Array.map that doesn't require an array, i.e. works on arrays and scalars. */\r\n// function map<T, U>(items: T | T[], fn: (v: T, ix?: number) => U, includeNull?: boolean): U | U[] {\r\n function map<T>(items: T | T[], fn: (v: T, ix?: number) => any, includeNull?: boolean): any | any[] {\r\n    // whether to return nulls in array of results; default = true;\r\n    includeNull = includeNull == null ? true : includeNull;\r\n    if (items == null) return items;\r\n    // let result: U[];\r\n    if (Array.isArray(items)) {\r\n        let result: any[] = [];\r\n        items.forEach(function (v: any, ix: number) {\r\n            let r = fn(v, ix);\r\n            if (r != null || includeNull) {\r\n                result[ix] = r;\r\n            }\r\n        });\r\n        return result;\r\n    } else {\r\n        let result = fn(items);\r\n        return result;\r\n    }\r\n\r\n}\r\n\r\n/** Return first element matching predicate */\r\nfunction arrayFirst<T>(array: T[], predicate: Predicate<any>): T;\r\nfunction arrayFirst<T>(array: T[], predicate: Predicate<T>) {\r\n    for (let i = 0, j = array.length; i < j; i++) {\r\n        if (predicate(array[i])) {\r\n            return array[i];\r\n        }\r\n    }\r\n    return null;\r\n}\r\n\r\n/** Return index of first element matching predicate */\r\nfunction arrayIndexOf<T>(array: T[], predicate: Predicate<any>): number;\r\nfunction arrayIndexOf<T>(array: T[], predicate: Predicate<T>): number {\r\n    for (let i = 0, j = array.length; i < j; i++) {\r\n        if (predicate(array[i])) return i;\r\n    }\r\n    return -1;\r\n}\r\n\r\n/** Add item if not already in array */\r\nfunction arrayAddItemUnique<T>(array: T[], item: T) {\r\n    let ix = array.indexOf(item);\r\n    if (ix === -1) array.push(item);\r\n}\r\n\r\n/** Remove items from the array\r\n * @param array\r\n * @param predicateOrItem - item to remove, or function to determine matching item\r\n * @param shouldRemoveMultiple - true to keep removing after first match, false otherwise\r\n */\r\nfunction arrayRemoveItem<T>(array: T[], predicateOrItem: T | Predicate<T> , shouldRemoveMultiple?: boolean) {\r\n    let predicate = (isFunction(predicateOrItem) ? predicateOrItem : undefined) as Predicate<T>;\r\n    let lastIx = array.length - 1;\r\n    let removed = false;\r\n    for (let i = lastIx; i >= 0; i--) {\r\n        if (predicate ? predicate(array[i]) : (array[i] === predicateOrItem)) {\r\n            array.splice(i, 1);\r\n            removed = true;\r\n            if (!shouldRemoveMultiple) {\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n    return removed;\r\n}\r\n\r\n/** Combine array elements using the callback.  Returns array with length == min(a1.length, a2.length) */\r\nfunction arrayZip(a1: any[], a2: any[], callback: (x1: any, x2: any) => any): any[] {\r\n    let result: any[] = [];\r\n    let n = Math.min(a1.length, a2.length);\r\n    for (let i = 0; i < n; ++i) {\r\n        result.push(callback(a1[i], a2[i]));\r\n    }\r\n    return result;\r\n}\r\n\r\n//function arrayDistinct(array) {\r\n//    array = array || [];\r\n//    let result = [];\r\n//    for (let i = 0, j = array.length; i < j; i++) {\r\n//        if (result.indexOf(array[i]) < 0)\r\n//            result.push(array[i]);\r\n//    }\r\n//    return result;\r\n//}\r\n\r\n// Not yet needed\r\n//// much faster but only works on array items with a toString method that\r\n//// returns distinct string for distinct objects.  So this is safe for arrays with primitive\r\n//// types but not for arrays with object types, unless toString() has been implemented.\r\n//function arrayDistinctUnsafe(array) {\r\n//    let o = {}, i, l = array.length, r = [];\r\n//    for (i = 0; i < l; i += 1) {\r\n//        let v = array[i];\r\n//        o[v] = v;\r\n//    }\r\n//    for (i in o) r.push(o[i]);\r\n//    return r;\r\n//}\r\n\r\nfunction arrayEquals(a1: any[], a2: any[], equalsFn?: (x1: any, x2: any) => boolean): boolean {\r\n    //Check if the arrays are undefined/null\r\n    if (!a1 || !a2) return false;\r\n\r\n    if (a1.length !== a2.length) return false;\r\n\r\n    //go thru all the vars\r\n    for (let i = 0; i < a1.length; i++) {\r\n        //if the let is an array, we need to make a recursive check\r\n        //otherwise we'll just compare the values\r\n        if (Array.isArray(a1[i])) {\r\n            if (!arrayEquals(a1[i], a2[i])) return false;\r\n        } else {\r\n            if (equalsFn) {\r\n                if (!equalsFn(a1[i], a2[i])) return false;\r\n            } else {\r\n                if (a1[i] !== a2[i]) return false;\r\n            }\r\n        }\r\n    }\r\n    return true;\r\n}\r\n\r\n// end of array functions\r\n\r\n/** Returns an array for a source and a prop, and creates the prop if needed. */\r\nfunction getArray(source: Object, propName: string): any[] {\r\n    let arr = source[propName];\r\n    if (!arr) {\r\n        arr = [];\r\n        source[propName] = arr;\r\n    }\r\n    return arr;\r\n}\r\n\r\n/** Calls requireLibCore on semicolon-separated libNames */\r\nfunction requireLib(libNames: string, errMessage?: string) {\r\n    let arrNames = libNames.split(\";\");\r\n    for (let i = 0, j = arrNames.length; i < j; i++) {\r\n        let lib = requireLibCore(arrNames[i]);\r\n        if (lib) return lib;\r\n    }\r\n    if (errMessage) {\r\n        throw new Error(\"Unable to initialize \" + libNames + \".  \" + errMessage);\r\n    }\r\n}\r\n\r\n\r\n\r\n/** Returns the 'libName' module if loaded or else returns undefined */\r\nfunction requireLibCore(libName: string) {\r\n    let win = window || (global ? global.window : undefined);\r\n    if (!win) return; // Must run in a browser. Todo: add commonjs support\r\n\r\n    // get library from browser globals if we can\r\n    let lib = win[libName];\r\n    if (lib) return lib;\r\n\r\n    // if require exists, maybe require can get it.\r\n    // This method is synchronous so it can't load modules with AMD.\r\n    // It can only obtain modules from require that have already been loaded.\r\n    // Developer should bootstrap such that the breeze module\r\n    // loads after all other libraries that breeze should find with this method\r\n    // See documentation\r\n    let r = win.require;\r\n    if (r) { // if require exists\r\n        if (r.defined) { // require.defined is not standard and may not exist\r\n            // require.defined returns true if module has been loaded\r\n            return r.defined(libName) ? r(libName) : undefined;\r\n        } else {\r\n            // require.defined does not exist so we have to call require('libName') directly.\r\n            // The require('libName') overload is synchronous and does not load modules.\r\n            // It throws an exception if the module isn't already loaded.\r\n            try {\r\n                return r(libName);\r\n            } catch (e) {\r\n                // require('libName') threw because module not loaded\r\n                return;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/** Execute fn while obj has tempValue for property */\r\nfunction using(obj: Object, property: string, tempValue: any, fn: () => any) {\r\n    if (!obj) {\r\n        return fn();\r\n    }\r\n    let originalValue = obj[property];\r\n    if (tempValue === originalValue) {\r\n        return fn();\r\n    }\r\n    obj[property] = tempValue;\r\n    try {\r\n        return fn();\r\n    } finally {\r\n        if (originalValue === undefined) {\r\n            delete obj[property];\r\n        } else {\r\n            obj[property] = originalValue;\r\n        }\r\n    }\r\n}\r\n\r\n/** Call state = startFn(), call fn(), call endFn(state) */\r\nfunction wrapExecution(startFn: () => any, endFn: (state: any) => any, fn: () => any) {\r\n    let state: any;\r\n    try {\r\n        state = startFn();\r\n        return fn();\r\n    } catch (e) {\r\n        if (typeof (state) === 'object') {\r\n            state.error = e;\r\n        }\r\n        throw e;\r\n    } finally {\r\n        endFn(state);\r\n    }\r\n}\r\n\r\n/** Remember & return the value of fn() when it was called with its current args */\r\nfunction memoize(fn: any): any {\r\n    return function () {\r\n        let args = arraySlice(<any>arguments),\r\n            hash = \"\",\r\n            i = args.length,\r\n            currentArg: any = null;\r\n        while (i--) {\r\n            currentArg = args[i];\r\n            hash += (currentArg === Object(currentArg)) ? JSON.stringify(currentArg) : currentArg;\r\n            fn.memoize || (fn.memoize = {});\r\n        }\r\n        return (hash in fn.memoize) ?\r\n            fn.memoize[hash] :\r\n            fn.memoize[hash] = fn.apply(this, args);\r\n    };\r\n}\r\n\r\nconst uuidrex = /[xy]/g;\r\nfunction getUuid(): string {\r\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(uuidrex, function (c) {\r\n        // tslint:disable-next-line\r\n        let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n        return v.toString(16);\r\n    });\r\n}\r\n\r\nconst durationrex = /^P((\\d+Y)?(\\d+M)?(\\d+D)?)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$/;\r\nconst lettersrex = /[A-Za-z]+/g;\r\nfunction durationToSeconds(duration: string) {\r\n    // basic algorithm from https://github.com/nezasa/iso8601-js-period\r\n    if (typeof duration !== \"string\") throw new Error(\"Invalid ISO8601 duration '\" + duration + \"'\");\r\n\r\n    // regex splits as follows - grp0, grp1, y, m, d, grp2, h, m, s\r\n    //                           0     1     2  3  4  5     6  7  8\r\n    let struct = durationrex.exec(duration);\r\n    if (!struct) throw new Error(\"Invalid ISO8601 duration '\" + duration + \"'\");\r\n\r\n    let ymdhmsIndexes = [2, 3, 4, 6, 7, 8]; // -> grp1,y,m,d,grp2,h,m,s\r\n    let factors = [31104000, // year (360*24*60*60)\r\n        2592000,             // month (30*24*60*60)\r\n        86400,               // day (24*60*60)\r\n        3600,                // hour (60*60)\r\n        60,                  // minute (60)\r\n        1];                  // second (1)\r\n\r\n    let seconds = 0;\r\n    for (let i = 0; i < 6; i++) {\r\n        let digit = struct[ymdhmsIndexes[i]];\r\n        // remove letters, replace by 0 if not defined\r\n        digit = <any>(digit ? +digit.replace(lettersrex, '') : 0);\r\n        seconds += <any>digit * factors[i];\r\n    }\r\n    return seconds;\r\n\r\n}\r\n\r\n// is functions\r\n\r\nfunction noop() {\r\n    // does nothing\r\n}\r\n\r\nfunction identity(x: any): any {\r\n    return x;\r\n}\r\n\r\nfunction classof(o: any) {\r\n    if (o === null) {\r\n        return \"null\";\r\n    }\r\n    if (o === undefined) {\r\n        return \"undefined\";\r\n    }\r\n    return Object.prototype.toString.call(o).slice(8, -1).toLowerCase();\r\n}\r\n\r\nfunction isDate(o: any) {\r\n    return classof(o) === \"date\" && !isNaN(o.getTime());\r\n}\r\n\r\nconst isdaterex = /^((\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)))$/;\r\nfunction isDateString(s: string) {\r\n    // let rx = /^(\\d{4}|[+\\-]\\d{6})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:(Z)|([+\\-])(\\d{2})(?::(\\d{2}))?)?)?$/;\r\n    return (typeof s === \"string\") && isdaterex.test(s);\r\n}\r\n\r\nfunction isFunction(o: any) {\r\n    return classof(o) === \"function\";\r\n}\r\n\r\n// function isString(o: any) {\r\n//     return (typeof o === \"string\");\r\n// }\r\n\r\n// function isObject(o: any) {\r\n//     return (typeof o === \"object\");\r\n// }\r\n\r\nconst isguidrex = /^[a-fA-F\\d]{8}-(?:[a-fA-F\\d]{4}-){3}[a-fA-F\\d]{12}$/;\r\nfunction isGuid(value: any) {\r\n    return (typeof value === \"string\") && isguidrex.test(value);\r\n}\r\n\r\nconst isdurationrex = /^(-|)?P[T]?[\\d\\.,\\-]+[YMDTHS]/;\r\nfunction isDuration(value: any) {\r\n    return (typeof value === \"string\") && isdurationrex.test(value);\r\n}\r\n\r\nfunction isEmpty(obj: any) {\r\n    if (obj === null || obj === undefined) {\r\n        return true;\r\n    }\r\n    for (let key in obj) {\r\n        if (hasOwnProperty(obj, key)) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n\r\nfunction isNumeric(n: any) {\r\n    return !isNaN(parseFloat(n)) && isFinite(n);\r\n}\r\n\r\n\r\n\r\n// end of is Functions\r\n\r\n// string functions\r\n\r\nfunction stringStartsWith(str: string, prefix: string) {\r\n    // returns true for empty string or null prefix\r\n    if ((!str)) return false;\r\n    if (prefix === \"\" || prefix == null) return true;\r\n    return str.indexOf(prefix, 0) === 0;\r\n}\r\n\r\nfunction stringEndsWith(str: string, suffix: string) {\r\n    // returns true for empty string or null suffix\r\n    if ((!str)) return false;\r\n    if (suffix === \"\" || suffix == null) return true;\r\n    return str.indexOf(suffix, str.length - suffix.length) !== -1;\r\n}\r\n\r\n// Based on fragment from Dean Edwards' Base 2 library\r\n/** format(\"a %1 and a %2\", \"cat\", \"dog\") -> \"a cat and a dog\" */\r\nfunction formatString(str: string, ...params: any[]) {\r\n    let args = arguments;\r\n    let pattern = RegExp(\"%([1-\" + (arguments.length - 1) + \"])\", \"g\");\r\n    return str.replace(pattern, function (match, index) {\r\n        return args[index];\r\n    });\r\n}\r\n\r\n// See http://stackoverflow.com/questions/7225407/convert-camelcasetext-to-camel-case-text\r\n/** Change text to title case with spaces, e.g. 'myPropertyName12' to 'My Property Name 12' */\r\nconst camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;\r\nfunction titleCaseSpace(text: string) {\r\n    text = text.replace(camelEdges, '$1 ');\r\n    text = text.charAt(0).toUpperCase() + text.slice(1);\r\n    return text;\r\n}\r\n\r\n// end of string functions\r\n\r\n// See Mark Miller’s explanation of what this does.\r\n// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming\r\nfunction uncurry(f: any) {\r\n    let call = Function.call;\r\n    return function () {\r\n        return call.apply(f, arguments);\r\n    };\r\n}\r\n\r\n// shims\r\n\r\nif (!Object.create) {\r\n    Object.create = function (parent: any) {\r\n        let F = <any>function () {\r\n        };\r\n        F.prototype = parent;\r\n        return new F();\r\n    };\r\n}\r\n\r\n// strings for error messages\r\n\r\nconst strings = {\r\n    \"TO_TYPE\": \"Add 'EntityQuery.toType()' to your query, or call 'MetadataStore.setEntityTypeForResourceName()' to register an EntityType for this resourceName.\"\r\n}\r\n\r\n// // not all methods above are exported\r\nexport const core = {\r\n    isES5Supported: isES5Supported,\r\n    hasOwnProperty: hasOwnProperty,\r\n    getOwnPropertyValues: getOwnPropertyValues,\r\n    getPropertyDescriptor: getPropDescriptor,\r\n    objectForEach: objectForEach,\r\n    objectFirst: objectFirst,\r\n    objectMap: objectMap, // TODO: replace this with something strongly typed.\r\n    extend: extend,\r\n    propEq: propEq,\r\n    propsEq: propsEq,\r\n    pluck: pluck,\r\n    map: map,\r\n    resolveProperties: resolveProperties,\r\n    setAsDefault: setAsDefault,\r\n    updateWithDefaults: updateWithDefaults,\r\n    getArray: getArray,\r\n    toArray: toArray,\r\n    arrayEquals: arrayEquals,\r\n    arraySlice: arraySlice,\r\n    arrayFirst: arrayFirst,\r\n    arrayIndexOf: arrayIndexOf,\r\n    arrayRemoveItem: arrayRemoveItem,\r\n    arrayZip: arrayZip,\r\n    arrayAddItemUnique: arrayAddItemUnique,\r\n    arrayFlatMap: arrayFlatMap,\r\n\r\n    requireLib: requireLib,\r\n    using: using,\r\n    wrapExecution: wrapExecution,\r\n\r\n    memoize: memoize,\r\n    getUuid: getUuid,\r\n    durationToSeconds: durationToSeconds,\r\n\r\n    isSettable: isSettable,\r\n\r\n    isDate: isDate,\r\n    isDateString: isDateString,\r\n    isGuid: isGuid,\r\n    isDuration: isDuration,\r\n    isFunction: isFunction,\r\n    isEmpty: isEmpty,\r\n    isNumeric: isNumeric,\r\n\r\n    identity: identity,\r\n    noop: noop,\r\n\r\n    stringStartsWith: stringStartsWith,\r\n    stringEndsWith: stringEndsWith,\r\n    formatString: formatString,\r\n    titleCase: titleCaseSpace,\r\n\r\n    toJson: toJson,\r\n    toJSONSafe: toJSONSafe,\r\n    toJSONSafeReplacer: toJSONSafeReplacer,\r\n\r\n    strings: strings\r\n};\r\n\r\nexport interface ErrorCallback {\r\n    (error: any): void;\r\n}\r\n\r\n\r\n// Unused\r\n/*\r\n// returns true for booleans, numbers, strings and dates\r\n// false for null, and non-date objects, functions, and arrays\r\nfunction isPrimitive(obj: any) {\r\n    if (obj == null) return false;\r\n    // true for numbers, strings, booleans and null, false for objects\r\n    if (obj != Object(obj)) return true;\r\n    return isDate(obj);\r\n}\r\n\r\n*/","import { BreezeEnum } from './enum';\r\nimport { core  } from './core';\r\n\r\n/** @hidden @internal */\r\nexport interface IParamContext {\r\n    typeName?: string;\r\n    type?: Function;\r\n    prevContext?: IParamContext;\r\n    msg?: string | ((context: IParamContext, v: any) => string);\r\n    mustNotBeEmpty?: boolean;\r\n    enumType?: BreezeEnum;\r\n    propertyName?: string;\r\n    allowNull?: boolean;\r\n    fn?(context: IParamContext, v: any): boolean;\r\n}\r\n\r\n/** @hidden @internal */\r\nexport interface IConfigParam {\r\n    config: any;\r\n    params: Param[];\r\n    whereParam: (propName: string) => Param;\r\n}\r\n\r\n/** @hidden @internal */\r\nexport class Param {\r\n    // The %1 parameter\r\n    // is required\r\n    // must be a %2\r\n    // must be an instance of %2\r\n    // must be an instance of the %2 enumeration\r\n    // must have a %2 property\r\n    // must be an array where each element\r\n    // is optional or\r\n\r\n    v: any;\r\n    name: string;\r\n    defaultValue: any;\r\n    parent: IConfigParam;\r\n    /** @hidden @internal */\r\n    _context: IParamContext;\r\n    /** @hidden @internal */\r\n    _contexts: IParamContext[];\r\n\r\n    constructor(v: any, name: string) {\r\n        this.v = v;\r\n        this.name = name;\r\n        this._contexts = [<any>null];\r\n    }\r\n\r\n    isObject(): Param {\r\n        return this.isTypeOf('object');\r\n    }\r\n\r\n    isBoolean(): Param {\r\n        return this.isTypeOf('boolean');\r\n    }\r\n\r\n    isString(): Param {\r\n        return this.isTypeOf('string');\r\n    }\r\n\r\n    isNumber(): Param {\r\n        return this.isTypeOf('number');\r\n    }\r\n\r\n    isFunction(): Param {\r\n        return this.isTypeOf('function');\r\n    }\r\n\r\n    isNonEmptyString(): Param {\r\n        return addContext(this, {\r\n            fn: isNonEmptyString,\r\n            msg: \"must be a nonEmpty string\"\r\n        });\r\n    }\r\n\r\n\r\n    isTypeOf(typeName: string): Param {\r\n        return addContext(this, {\r\n            fn: isTypeOf,\r\n            typeName: typeName,\r\n            msg: \"must be a '\" + typeName + \"'\"\r\n        });\r\n    }\r\n\r\n\r\n    isInstanceOf(type: Function, typeName?: string): Param {\r\n        typeName = typeName || type.prototype._$typeName;\r\n        return addContext(this, {\r\n            fn: isInstanceOf,\r\n            type: type,\r\n            typeName: typeName,\r\n            msg: \"must be an instance of '\" + typeName + \"'\"\r\n        });\r\n    }\r\n\r\n\r\n    hasProperty(propertyName: string): Param {\r\n        return addContext(this, {\r\n            fn: hasProperty,\r\n            propertyName: propertyName,\r\n            msg: \"must have a '\" + propertyName + \"' property\"\r\n        });\r\n    }\r\n\r\n\r\n    isEnumOf(enumType: any): Param {\r\n        return addContext(this, {\r\n            fn: isEnumOf,\r\n            enumType: enumType,\r\n            msg: \"must be an instance of the '\" + (enumType.name || 'unknown') + \"' enumeration\"\r\n        });\r\n    }\r\n\r\n    isRequired(allowNull: boolean = false): Param {\r\n        return addContext(this, {\r\n            fn: isRequired,\r\n            allowNull: allowNull,\r\n            msg: \"is required\"\r\n        });\r\n    }\r\n\r\n    isOptional(): Param {\r\n        let context = {\r\n            fn: isOptional,\r\n            prevContext: <any>null,\r\n            msg: isOptionalMessage\r\n        };\r\n        return addContext(this, context);\r\n    }\r\n\r\n    isNonEmptyArray(): Param {\r\n        return this.isArray(true);\r\n    }\r\n\r\n    isArray(mustNotBeEmpty?: boolean): Param {\r\n        let context = {\r\n            fn: isArray,\r\n            mustNotBeEmpty: mustNotBeEmpty,\r\n            prevContext: <any>null,\r\n            msg: isArrayMessage\r\n        };\r\n        return addContext(this, context);\r\n    }\r\n\r\n    or() {\r\n        this._contexts.push(<any>null);\r\n        this._context = <any>null;\r\n        return this;\r\n    }\r\n\r\n    check(defaultValue?: any) {\r\n        let ok = exec(this);\r\n        if (ok === undefined) return;\r\n        if (!ok) {\r\n            throw new Error(this.getMessage());\r\n        }\r\n\r\n        if (this.v !== undefined) {\r\n            return this.v;\r\n        } else {\r\n            return defaultValue;\r\n        }\r\n    }\r\n\r\n    /** @hidden @internal */\r\n    // called from outside this file.\r\n    _addContext(context: IParamContext) {\r\n        return addContext(this, context);\r\n    }\r\n\r\n    getMessage() {\r\n        let that = this;\r\n        let message = this._contexts.map(function (context) {\r\n            return getMessage(context, that.v);\r\n        }).join(\", or it \");\r\n        return core.formatString(this.MESSAGE_PREFIX, this.name) + \" \" + message;\r\n    }\r\n\r\n    withDefault(defaultValue: any) {\r\n        this.defaultValue = defaultValue;\r\n        return this;\r\n    }\r\n\r\n    whereParam(propName: string) {\r\n        return this.parent.whereParam(propName);\r\n    }\r\n\r\n    applyAll(instance: any, checkOnly: boolean = false) {\r\n        let parentTypeName = instance._$typeName;\r\n        let allowUnknownProperty = (parentTypeName && this.parent.config._$typeName === parentTypeName);\r\n\r\n        let clone = core.extend({}, this.parent.config);\r\n        this.parent.params.forEach(function (p) {\r\n            if (!allowUnknownProperty) delete clone[p.name];\r\n            try {\r\n                p.check();\r\n            } catch (e) {\r\n                throwConfigError(instance, e.message);\r\n            }\r\n            (!checkOnly) && p._applyOne(instance);\r\n        });\r\n        // should be no properties left in the clone\r\n        if (!allowUnknownProperty) {\r\n            for (let key in clone) {\r\n                // allow props with an undefined value\r\n                if (clone[key] !== undefined) {\r\n                    throwConfigError(instance, core.formatString(\"Unknown property: '%1'.\", key));\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /** @hidden @internal */\r\n    _applyOne = function (this: Param, instance: any) {\r\n        if (this.v !== undefined) {\r\n            instance[this.name] = this.v;\r\n        } else {\r\n            if (this.defaultValue !== undefined) {\r\n                instance[this.name] = this.defaultValue;\r\n            }\r\n        }\r\n    };\r\n\r\n    MESSAGE_PREFIX = \"The '%1' parameter \";\r\n\r\n}\r\n\r\n/** @hidden @internal */\r\nexport let assertParam = function (v: any, name: string) {\r\n    return new Param(v, name);\r\n};\r\n\r\nfunction isTypeOf(context: IParamContext, v: any) {\r\n    if (v == null) return false;\r\n    if (typeof (v) === context.typeName) return true;\r\n    return false;\r\n}\r\n\r\nfunction isNonEmptyString(context: IParamContext, v: any) {\r\n    if (v == null) return false;\r\n    return (typeof (v) === 'string') && v.length > 0;\r\n}\r\n\r\nfunction isInstanceOf(context: IParamContext, v: any) {\r\n    if (v == null || context.type == null) return false;\r\n    return (v instanceof context.type);\r\n}\r\n\r\nfunction isEnumOf(context: IParamContext, v: any) {\r\n    if (v == null || context.enumType == null ) return false;\r\n    return (context.enumType as any).contains(v);\r\n}\r\n\r\nfunction hasProperty(context: IParamContext, v: any) {\r\n    if (v == null || context.propertyName == null) return false;\r\n    return (v[context.propertyName] !== undefined);\r\n}\r\n\r\nfunction isRequired(context: IParamContext, v: any) {\r\n    if (context.allowNull) {\r\n        return v !== undefined;\r\n    } else {\r\n        return v != null;\r\n    }\r\n}\r\n\r\nfunction isOptional(context: IParamContext, v: any) {\r\n    if (v == null) return true;\r\n    let prevContext = context.prevContext;\r\n    if (prevContext && prevContext.fn) {\r\n        return prevContext.fn(prevContext, v);\r\n    } else {\r\n        return true;\r\n    }\r\n}\r\n\r\nfunction isOptionalMessage(context: IParamContext, v: any) {\r\n    let prevContext = context.prevContext;\r\n    let element = prevContext ? \" or it \" + getMessage(prevContext, v) : \"\";\r\n    return \"is optional\" + element;\r\n}\r\n\r\nfunction isArray(context: IParamContext, v: any) {\r\n    if (!Array.isArray(v)) {\r\n        return false;\r\n    }\r\n    if (context.mustNotBeEmpty) {\r\n        if (v.length === 0) return false;\r\n    }\r\n    // allow standalone is array call.\r\n    let prevContext = context.prevContext;\r\n    if (!prevContext) return true;\r\n\r\n    let pc = <any>prevContext;\r\n    return v.every(function (v1: any) {\r\n        return pc.fn && pc.fn(pc, v1);\r\n    });\r\n}\r\n\r\nfunction isArrayMessage(context: IParamContext, v: any) {\r\n    let arrayDescr = context.mustNotBeEmpty ? \"a nonEmpty array\" : \"an array\";\r\n    let prevContext = context.prevContext;\r\n    let element = prevContext ? \" where each element \" + getMessage(prevContext, v) : \"\";\r\n    return \" must be \" + arrayDescr + element;\r\n}\r\n\r\nfunction getMessage(context: IParamContext, v: any) {\r\n    let msg = context.msg;\r\n    if (typeof (msg) === \"function\") {\r\n        msg = (<any>msg)(context, v);\r\n    }\r\n    return msg;\r\n}\r\n\r\nfunction addContext(that: Param, context: IParamContext) {\r\n    if (that._context) {\r\n        let curContext = that._context;\r\n\r\n        while (curContext.prevContext != null) {\r\n            curContext = curContext.prevContext;\r\n        }\r\n\r\n        if (curContext.prevContext === null) {\r\n            curContext.prevContext = context;\r\n            // just update the prevContext but don't change the curContext.\r\n            return that;\r\n        } else if (context.prevContext == null) {\r\n            context.prevContext = that._context;\r\n        } else {\r\n            throw new Error(\"Illegal construction - use 'or' to combine checks\");\r\n        }\r\n    }\r\n    return setContext(that, context);\r\n}\r\n\r\nfunction setContext(that: Param, context: IParamContext) {\r\n    that._contexts[that._contexts.length - 1] = context;\r\n    that._context = context;\r\n    return that;\r\n}\r\n\r\n\r\nfunction exec(self: Param) {\r\n    // clear off last one if null\r\n    let contexts = self._contexts;\r\n    if (contexts[contexts.length - 1] == null) {\r\n        contexts.pop();\r\n    }\r\n    if (contexts.length === 0) {\r\n        return undefined;\r\n    }\r\n    return contexts.some(function (context: IParamContext) {\r\n        return context.fn ? context.fn(context, self.v) : false;\r\n    });\r\n}\r\n\r\nfunction throwConfigError(instance: any, message: string) {\r\n    throw new Error(core.formatString(\"Error configuring an instance of '%1'. %2\", (instance && instance._$typeName) || \"object\", message));\r\n}\r\n\r\nclass ConfigParam {\r\n    config: any;\r\n    params: Param[];\r\n    constructor(config: Object) {\r\n        if (typeof (config) !== \"object\") {\r\n            throw new Error(\"Configuration parameter should be an object, instead it is a: \" + typeof (config));\r\n        }\r\n        this.config = config;\r\n        this.params = [];\r\n    }\r\n\r\n    whereParam(propName: string) {\r\n        let param = new Param(this.config[propName], propName);\r\n        param.parent = this;\r\n        this.params.push(param);\r\n        return param;\r\n    }\r\n}\r\n\r\n/** @hidden @internal */\r\nexport let assertConfig = function (config: Object) {\r\n    return new ConfigParam(config) as IConfigParam;\r\n};\r\n\r\n\r\n// Param is exposed so that additional 'is' methods can be added to the prototype.\r\n(core as any).Param = Param;\r\n(core as any).assertParam = assertParam;\r\n(core as any).assertConfig = assertConfig;\r\n","import { core } from './core';\r\nimport { assertParam } from './assert-param';\r\n\r\nfunction publishCore<T>(that: BreezeEvent<T>, data: T, errorCallback?: (e: Error) => any) {\r\n  let subscribers = that._subscribers;\r\n  if (!subscribers) return true;\r\n  // subscribers from outer scope.\r\n  subscribers.forEach(function (s) {\r\n    try {\r\n      s.callback(data);\r\n    } catch (e) {\r\n      e.context = \"unable to publish on topic: \" + that.name;\r\n      if (errorCallback) {\r\n        errorCallback(e);\r\n      } else if (that._defaultErrorCallback) {\r\n        that._defaultErrorCallback(e);\r\n      } else {\r\n        fallbackErrorHandler(e);\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction fallbackErrorHandler(e: Error) {\r\n  // TODO: maybe log this\r\n  // for now do nothing;\r\n}\r\n\r\n\r\n/** @hidden @internal */\r\nexport interface Subscription {\r\n  unsubKey: number;\r\n  callback: (data: any) => any;\r\n}\r\n\r\n/**\r\nClass to support basic event publication and subscription semantics.\r\n@dynamic\r\n**/\r\nexport class BreezeEvent<T> {\r\n  /** @hidden @internal */\r\n  static __eventNameMap = {};\r\n  /** @hidden @internal */\r\n  static __nextUnsubKey = 1;\r\n  /** The name of this Event */\r\n  name: string;\r\n  /** The object doing the publication. i.e. the object to which this event is attached. */\r\n  publisher: Object;\r\n\r\n  /** @hidden @internal */\r\n  _subscribers: Subscription[];\r\n  /** @hidden @internal */\r\n  _defaultErrorCallback: (e: Error) => any;\r\n\r\n\r\n  /**\r\n  Constructor for an Event\r\n  >     salaryEvent = new BreezeEvent(\"salaryEvent\", person);\r\n  @param name - The name of the event.\r\n  @param publisher - The object that will be doing the publication. i.e. the object to which this event is attached.\r\n  @param defaultErrorCallback - Function to call when an error occurs during subscription execution. \r\n  If omitted then subscriber notification failures will be ignored.\r\n  **/\r\n  constructor(name: string, publisher: Object, defaultErrorCallback?: (e: Error) => any) {\r\n    assertParam(name, \"eventName\").isNonEmptyString().check();\r\n    assertParam(publisher, \"publisher\").isObject().check();\r\n\r\n    this.name = name;\r\n    // register the name\r\n    BreezeEvent.__eventNameMap[name] = true;\r\n    this.publisher = publisher;\r\n    if (defaultErrorCallback) {\r\n      this._defaultErrorCallback = defaultErrorCallback;\r\n    }\r\n  }\r\n\r\n  /**\r\n  Publish data for this event.\r\n  >      // Assume 'salaryEvent' is previously constructed Event\r\n  >      salaryEvent.publish( { eventType: \"payRaise\", amount: 100 });\r\n\r\n  This event can also be published asychronously\r\n  >      salaryEvent.publish( { eventType: \"payRaise\", amount: 100 }, true);\r\n\r\n  And we can add a handler in case the subscriber 'mishandles' the event.\r\n  >      salaryEvent.publish( { eventType: \"payRaise\", amount: 100 }, true, function(error) {\r\n  >          // do something with the 'error' object\r\n  >      });\r\n  @param data - Data to publish\r\n  @param publishAsync - (default=false) Whether to publish asynchonously or not.\r\n  @param errorCallback - Function to be called for any errors that occur during publication. If omitted,\r\n  errors will be eaten.\r\n  @return false if event is disabled; true otherwise.\r\n  **/\r\n  publish(data: T, publishAsync: boolean = false, errorCallback?: (e: Error) => any) {\r\n\r\n    if (!BreezeEvent._isEnabled(this.name, this.publisher)) return false;\r\n\r\n    if (publishAsync === true) {\r\n      setTimeout(publishCore, 0, this, data, errorCallback);\r\n    } else {\r\n      publishCore(this, data, errorCallback);\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /**\r\n  Publish data for this event asynchronously.\r\n  >      // Assume 'salaryEvent' is previously constructed Event\r\n  >      salaryEvent.publishAsync( { eventType: \"payRaise\", amount: 100 });\r\n\r\n  And we can add a handler in case the subscriber 'mishandles' the event.\r\n  >      salaryEvent.publishAsync( { eventType: \"payRaise\", amount: 100 }, function(error) {\r\n  >          // do something with the 'error' object\r\n  >      });\r\n  @param data - Data to publish\r\n  @param errorCallback - Function to be called for any errors that occur during publication. If omitted,\r\n  errors will be eaten.\r\n  **/\r\n  publishAsync(data: T, errorCallback: (e: Error) => any) {\r\n    this.publish(data, true, errorCallback);\r\n  }\r\n\r\n  /**\r\n  Subscribe to this event.\r\n  >      // Assume 'salaryEvent' is previously constructed Event\r\n  >      salaryEvent.subscribe(function (eventArgs) {\r\n  >          if (eventArgs.eventType === \"payRaise\") {\r\n  >              // do something\r\n  >          }\r\n  >      });\r\n\r\n  There are several built in Breeze events, such as [[EntityAspect.propertyChanged]], [[EntityAspect.validationErrorsChanged]] as well.\r\n  >      // Assume order is a preexisting 'order' entity\r\n  >      order.entityAspect.propertyChanged.subscribe(function (pcEvent) {\r\n  >          if ( pcEvent.propertyName === \"OrderDate\") {\r\n  >              // do something\r\n  >          }\r\n  >      });\r\n  @param callback- Function to be called whenever 'data' is published for this event.\r\n  @param callback.data - {Object} Whatever 'data' was published.  This should be documented on the specific event.\r\n  @return This is a key for 'unsubscription'.  It can be passed to the 'unsubscribe' method.\r\n  **/\r\n  subscribe(callback: (data: T) => any) {\r\n    if (!this._subscribers) {\r\n      this._subscribers = [];\r\n    }\r\n\r\n    let unsubKey = BreezeEvent.__nextUnsubKey;\r\n    this._subscribers.push({ unsubKey: unsubKey, callback: callback });\r\n    ++BreezeEvent.__nextUnsubKey;\r\n    return unsubKey;\r\n  }\r\n\r\n  /**\r\n  Unsubscribe from this event.\r\n  >      // Assume order is a preexisting 'order' entity\r\n  >      let token = order.entityAspect.propertyChanged.subscribe(function (pcEvent) {\r\n  >              // do something\r\n  >      });\r\n  >      // sometime later\r\n  >      order.entityAspect.propertyChanged.unsubscribe(token);\r\n  @param unsubKey - The value returned from the 'subscribe' method may be used to unsubscribe here.\r\n  @return Whether unsubscription occured. This will return false if already unsubscribed or if the key simply\r\n  cannot be found.\r\n  **/\r\n  unsubscribe = function (unsubKey: number) {\r\n    if (!this._subscribers) return false;\r\n    let subs = this._subscribers;\r\n    let ix = core.arrayIndexOf(subs, function (s) {\r\n      return s.unsubKey === unsubKey;\r\n    });\r\n    if (ix !== -1) {\r\n      subs.splice(ix, 1);\r\n      if (subs.length === 0) {\r\n        this._subscribers = null;\r\n      }\r\n      return true;\r\n    } else {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  /** remove all subscribers */\r\n  clear() {\r\n    this._subscribers = <any>null;\r\n  }\r\n\r\n  /** event bubbling - document later. */\r\n\r\n  // null or undefined 'getParentFn' means Event does not need to bubble i.e. that it is always enabled - .\r\n  static bubbleEvent(target: any, getParentFn?: (() => any)) {\r\n    target._getEventParent = getParentFn || null;\r\n  }\r\n\r\n  /**\r\n  Enables or disables the named event for an object and all of its children.\r\n  >      BreezeEvent.enable(“propertyChanged”, myEntityManager, false)\r\n\r\n  will disable all EntityAspect.propertyChanged events within a EntityManager.\r\n  >      BreezeEvent.enable(“propertyChanged”, myEntityManager, true)\r\n\r\n  will enable all EntityAspect.propertyChanged events within a EntityManager.\r\n  >      BreezeEvent.enable(“propertyChanged”, myEntity.entityAspect, false)\r\n\r\n  will disable EntityAspect.propertyChanged events for a specific entity.\r\n  >      BreezeEvent.enable(“propertyChanged”, myEntity.entityAspect, null)\r\n\r\n  will removes any enabling / disabling at the entity aspect level so now any 'Event.enable' calls at the EntityManager level,\r\n  made either previously or in the future, will control notification.\r\n  >      BreezeEvent.enable(“validationErrorsChanged”, myEntityManager, function(em) {\r\n  >          return em.customTag === “blue”;\r\n  >      })\r\n\r\n\r\n  will either enable or disable myEntityManager based on the current value of a ‘customTag’ property on myEntityManager.\r\n  Note that this is dynamic, changing the customTag value will cause events to be enabled or disabled immediately.\r\n  @param eventName - The name of the event.\r\n  @param target - The object at which enabling or disabling will occur.  All event notifications that occur to this object or\r\n  children of this object will be enabled or disabled.\r\n  @param isEnabled - A boolean, a null or a function that returns either a boolean or a null.\r\n  **/\r\n static enable(eventName: string, obj: Object, isEnabled: boolean | ((x: any) => boolean)) {\r\n    assertParam(eventName, \"eventName\").isNonEmptyString().check();\r\n    assertParam(obj, \"obj\").isObject().check();\r\n    assertParam(isEnabled, \"isEnabled\").isBoolean().isOptional().or().isFunction().check();\r\n    let ob = <any>obj;\r\n    if (!ob._$eventMap) {\r\n      ob._$eventMap = {};\r\n    }\r\n    ob._$eventMap[eventName] = isEnabled;\r\n  }\r\n\r\n  /**\r\n  Returns whether for a specific event and a specific object and its children, notification is enabled or disabled or not set.\r\n  >      BreezeEvent.isEnabled(“propertyChanged”, myEntityManager)\r\n  > \r\n  @param eventName - The name of the event.\r\n  @param target - The object for which we want to know if notifications are enabled.\r\n  @return A null is returned if this value has not been set.\r\n  **/\r\n  static isEnabled(eventName: string, obj: Object) {\r\n    assertParam(eventName, \"eventName\").isNonEmptyString().check();\r\n    assertParam(obj, \"obj\").isObject().check();\r\n    // null is ok - it just means that the object is at the top level.\r\n    if ((<any>obj)._getEventParent === undefined) {\r\n      throw new Error(\"This object does not support event enabling/disabling\");\r\n    }\r\n    // return ctor._isEnabled(getFullEventName(eventName), obj);\r\n    return BreezeEvent._isEnabled(eventName, 3);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  static _isEnabled = function (eventName: string, obj: Object) {\r\n    let isEnabled: any = null;\r\n    let ob = <any>obj;\r\n    let eventMap = ob._$eventMap;\r\n    if (eventMap) {\r\n      isEnabled = eventMap[eventName];\r\n    }\r\n    if (isEnabled != null) {\r\n      if (typeof isEnabled === 'function') {\r\n        return !!isEnabled(obj);\r\n      } else {\r\n        return !!isEnabled;\r\n      }\r\n    } else {\r\n      let parent = ob._getEventParent && ob._getEventParent();\r\n      if (parent) {\r\n        return !!this._isEnabled(eventName, parent);\r\n      } else {\r\n        // default if not explicitly disabled.\r\n        return true;\r\n      }\r\n    }\r\n  };\r\n\r\n\r\n}\r\n\r\n// legacy support - deliberately not typed\r\n(core as any).Event = BreezeEvent;","import { core } from './core';\r\nimport { assertParam  } from './assert-param';\r\nimport { BreezeEvent } from './event';\r\n\r\n/** @hidden */\r\nexport interface AdapterCtor<T extends BaseAdapter> { new (...args: any[]): T; }\r\n/** @hidden */\r\nexport interface IDef<T extends BaseAdapter> { ctor: AdapterCtor<T>; defaultInstance?: T; }\r\n\r\nexport type AdapterType = 'dataService'|'modelLibrary'|'ajax'|'uriBuilder';\r\n\r\nexport class InterfaceDef<T extends BaseAdapter> {\r\n\r\n    name: string;\r\n    defaultInstance?: T;\r\n    /** @hidden @internal */\r\n    _implMap: { [name: string]: IDef<T> };\r\n\r\n    constructor(name: string) {\r\n        this.name = name;\r\n        this.defaultInstance = undefined;\r\n        this._implMap = {};\r\n    }\r\n\r\n    /** Define an implementation of the given adaptername */\r\n    registerCtor(adapterName: string, ctor: AdapterCtor<T>): void {\r\n        this._implMap[adapterName.toLowerCase()] = { ctor: ctor, defaultInstance: undefined };\r\n    }\r\n\r\n    /** Return the definition for the given adapterName */\r\n    getImpl(adapterName: string): IDef<T> {\r\n        return this._implMap[adapterName.toLowerCase()];\r\n    }\r\n\r\n    /** Return the first implementation for this InterfaceDef */\r\n    getFirstImpl(): IDef<T> {\r\n        let kv = core.objectFirst(this._implMap, function () {\r\n            return true;\r\n        });\r\n        return kv ? kv.value : null;\r\n    }\r\n\r\n    getDefaultInstance() {\r\n        return this.defaultInstance as T;\r\n    }\r\n}\r\n\r\nexport interface BaseAdapter {\r\n    /** @hidden @internal */\r\n    _$impl?: any;\r\n    name: string;\r\n    initialize(): void;\r\n    checkForRecomposition?: (context: any) => void;\r\n}\r\n\r\nexport class BreezeConfig {\r\n    functionRegistry = {};\r\n    typeRegistry = {};\r\n    objectRegistry = {};\r\n    interfaceInitialized: BreezeEvent<{ interfaceName: string, instance: BaseAdapter, isDefault: boolean }>;\r\n\r\n    stringifyPad = '';\r\n    /** whether to prohibit eval() and Function() in breeze code */\r\n    noEval: boolean;\r\n    /** @hidden @internal */\r\n    _interfaceRegistry: any;  // will be set in adapter-interfaces. untyped here to avoid circularity issues.\r\n\r\n    constructor() {\r\n        this.interfaceInitialized = new BreezeEvent(\"interfaceInitialized\", this);\r\n        if (this.noEval === undefined) {\r\n            try {\r\n                Error['x'] = Function('');\r\n                this.noEval = false; // eval succeeded\r\n            } catch {\r\n                this.noEval = true; // eval failed, probably due to CSP\r\n            }\r\n        }\r\n        \r\n    }\r\n\r\n    /**\r\n    Method use to register implementations of standard breeze interfaces.  Calls to this method are usually\r\n    made as the last step within an adapter implementation.\r\n    @method registerAdapter\r\n    @param interfaceName {String} - one of the following interface names: \"ajax\", \"dataService\", \"modelLibrary\", \"uriBuilder\"\r\n    @param adapterCtor {Function} - an ctor function that returns an instance of the specified interface.\r\n    **/\r\n    registerAdapter<T extends BaseAdapter>(interfaceName: AdapterType, adapterCtor: AdapterCtor<T>) {\r\n        assertParam(interfaceName, \"interfaceName\").isNonEmptyString().check();\r\n        assertParam(adapterCtor, \"adapterCtor\").isFunction().check();\r\n        // this impl will be thrown away after the name is retrieved.\r\n        let impl = new adapterCtor();\r\n        let implName = impl.name;\r\n        if (!implName) {\r\n            throw new Error(\"Unable to locate a 'name' property on the constructor passed into the 'registerAdapter' call.\");\r\n        }\r\n        let idef = this.getInterfaceDef(interfaceName);\r\n        idef.registerCtor(implName, adapterCtor);\r\n    }\r\n\r\n    /**\r\n    Returns the ctor function used to implement a specific interface with a specific adapter name.\r\n    @method getAdapter\r\n    @param interfaceName {String} One of the following interface names: \"ajax\", \"dataService\", \"modelLibrary\", \"uriBuilder\"\r\n    @param [adapterName] {String} The name of any previously registered adapter. If this parameter is omitted then\r\n    this method returns the \"default\" adapter for this interface. If there is no default adapter, then a null is returned.\r\n    @return {Function|null} Returns either a ctor function or null.\r\n    **/\r\n    getAdapter(interfaceName: AdapterType, adapterName: string) {\r\n        let idef = this.getInterfaceDef(interfaceName);\r\n        if (adapterName) {\r\n            let impl = idef.getImpl(adapterName);\r\n            return impl ? impl.ctor : null;\r\n        } else {\r\n            return idef.defaultInstance ? idef.defaultInstance._$impl.ctor : null;\r\n        }\r\n    }\r\n\r\n    /**\r\n    Initializes a single adapter implementation. Initialization means either newing a instance of the\r\n    specified interface and then calling \"initialize\" on it or simply calling \"initialize\" on the instance\r\n    if it already exists.\r\n    @method initializeAdapterInstance\r\n    @param interfaceName {String} The name of the interface to which the adapter to initialize belongs.\r\n    @param adapterName {String} - The name of a previously registered adapter to initialize.\r\n    @param [isDefault=true] {Boolean} - Whether to make this the default \"adapter\" for this interface.\r\n    @return {an instance of the specified adapter}\r\n    **/\r\n    initializeAdapterInstance(interfaceName: AdapterType, adapterName: string, isDefault: boolean = true) {\r\n        isDefault = isDefault === undefined ? true : isDefault;\r\n        assertParam(interfaceName, \"interfaceName\").isNonEmptyString().check();\r\n        assertParam(adapterName, \"adapterName\").isNonEmptyString().check();\r\n        assertParam(isDefault, \"isDefault\").isBoolean().check();\r\n\r\n        let idef = this.getInterfaceDef(interfaceName);\r\n        let impl = idef.getImpl(adapterName);\r\n        if (!impl) {\r\n            throw new Error(\"Unregistered adapter.  Interface: \" + interfaceName + \" AdapterName: \" + adapterName);\r\n        }\r\n\r\n        return this._initializeAdapterInstanceCore(idef, impl, isDefault);\r\n    }\r\n\r\n    /**\r\n    Returns the adapter instance corresponding to the specified interface and adapter names.\r\n    @method getAdapterInstance\r\n    @param interfaceName {String} The name of the interface.\r\n    @param [adapterName] {String} - The name of a previously registered adapter.  If this parameter is\r\n    omitted then the default implementation of the specified interface is returned. If there is\r\n    no defaultInstance of this interface, then the first registered instance of this interface is returned.\r\n    @return {an instance of the specified adapter}\r\n    @internal\r\n    **/\r\n    getAdapterInstance<T extends BaseAdapter>(interfaceName: AdapterType, adapterName?: string) {\r\n        let idef = this.getInterfaceDef<T>(interfaceName);\r\n        let impl: IDef<T>;\r\n\r\n        let isDefault = adapterName == null || adapterName === \"\";\r\n        if (isDefault) {\r\n            if (idef.defaultInstance) return idef.defaultInstance;\r\n            impl = idef.getFirstImpl();\r\n        } else {\r\n            impl = idef.getImpl(adapterName!);\r\n        }\r\n        if (!impl) return undefined;\r\n        if (impl.defaultInstance) {\r\n            return impl.defaultInstance;\r\n        } else {\r\n            return this._initializeAdapterInstanceCore(idef, impl, isDefault);\r\n        }\r\n    }\r\n\r\n    /** this is needed for reflection purposes when deserializing an object that needs a fn or ctor.\r\n        Used to register validators. */\r\n    registerFunction(fn: Function, fnName: string) {\r\n        assertParam(fn, \"fn\").isFunction().check();\r\n        assertParam(fnName, \"fnName\").isString().check();\r\n        if (fn.prototype) {\r\n            fn.prototype._$fnName = fnName;\r\n        }\r\n        this.functionRegistry[fnName] = fn;\r\n    }\r\n\r\n    registerType(ctor: Function, typeName: string) {\r\n        assertParam(ctor, \"ctor\").isFunction().check();\r\n        assertParam(typeName, \"typeName\").isString().check();\r\n        if (ctor.prototype) {\r\n            ctor.prototype._$typeName = typeName;\r\n        }\r\n        this.typeRegistry[typeName] = ctor;\r\n    }\r\n\r\n    getRegisteredFunction(fnName: string) {\r\n        return this.functionRegistry[fnName];\r\n    }\r\n\r\n    getInterfaceDef<T extends BaseAdapter>(interfaceName: string) {\r\n        let lcName = interfaceName.toLowerCase();\r\n        // source may be null\r\n        let kv = core.objectFirst(this._interfaceRegistry || {}, function (k, v) {\r\n            return k.toLowerCase() === lcName;\r\n        });\r\n        if (!kv) {\r\n            throw new Error(\"Unknown interface name: \" + interfaceName);\r\n        }\r\n        return <InterfaceDef<T>>kv.value;\r\n    }\r\n\r\n    /** @deprecated @internal no-op kept for backward compatibility */\r\n    setQ(q: any) {\r\n        console && console.warn(\"setQ does nothing; ES6 Promise support is required - use a shim if necessary.\");\r\n    }\r\n\r\n    /** @hidden @internal */\r\n    _storeObject(obj: Object, type: string | Function, name: string) {\r\n        // uncomment this if we make this public.\r\n        //assertParam(obj, \"obj\").isObject().check();\r\n        //assertParam(name, \"objName\").isString().check();\r\n        let key = (typeof (type) === \"string\" ? type : type.prototype._$typeName) + \".\" + name;\r\n        this.objectRegistry[key] = obj;\r\n    }\r\n\r\n    /** @hidden @internal */\r\n    _fetchObject(type: string | Function, name: string) {\r\n        if (!name) return undefined;\r\n        let key = (typeof (type) === \"string\" ? type : type.prototype._$typeName) + \".\" + name;\r\n        let result = this.objectRegistry[key];\r\n        if (!result) {\r\n            throw new Error(\"Unable to locate a registered object by the name: \" + key);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    /** @hidden @internal */\r\n    _initializeAdapterInstanceCore<T extends BaseAdapter>(interfaceDef: InterfaceDef<T>, impl: IDef<T>, isDefault: boolean) {\r\n        let instance: T;\r\n        let inst = impl.defaultInstance;\r\n        if (!inst) {\r\n            instance = new (impl.ctor)();\r\n            impl.defaultInstance = instance;\r\n            instance._$impl = impl;\r\n        } else {\r\n            instance = inst;\r\n        }\r\n\r\n        instance.initialize();\r\n\r\n        if (isDefault) {\r\n            // next line needs to occur before any recomposition\r\n            interfaceDef.defaultInstance = instance;\r\n        }\r\n\r\n        // recomposition of other impls will occur here.\r\n        this.interfaceInitialized.publish({ interfaceName: interfaceDef.name, instance: instance, isDefault: true });\r\n\r\n        if (instance.checkForRecomposition != null) {\r\n            // now register for own dependencies.\r\n            this.interfaceInitialized.subscribe((interfaceInitializedArgs) => {\r\n                // TODO: why '!'s needed here for typescript to compile correctly???\r\n                instance.checkForRecomposition!(interfaceInitializedArgs);\r\n            });\r\n        }\r\n\r\n        return instance;\r\n    }\r\n\r\n}\r\n\r\nexport const config = new BreezeConfig();\r\n\r\n// legacy\r\n(core as any).config = config;\r\n\r\n\r\n\r\n","import { EntityType, NavigationProperty } from './entity-metadata';\r\nimport { DataServiceAdapter, UriBuilderAdapter } from './interface-registry';\r\nimport { KeyMapping } from './entity-manager';\r\nimport { MappingContext } from './mapping-context';\r\nimport { assertConfig } from './assert-param';\r\nimport { config } from './config';\r\nimport { core } from './core';\r\n\r\n/** Configuration info to be passed to the [[DataService]] constructor */\r\nexport interface DataServiceConfig {\r\n  /** The serviceName for this DataService.  **/\r\n  serviceName?: string;\r\n  /** The adapter name for the [[IDataServiceAdapter]] to be used with this service.  **/\r\n  adapterName?: string;\r\n  /** The adapter name for the [[IUriBuilderAdapter]] to be used with this service.  **/\r\n  uriBuilderName?: string;\r\n  /** Whether the server can provide metadata for this service.  **/\r\n  hasServerMetadata?: boolean;\r\n  /** The [[JsonResultsAdapter]] used to process the results of any query against this DataService.  **/\r\n  jsonResultsAdapter?: JsonResultsAdapter;\r\n  /** Whether to use JSONP when performing a 'GET' request against this service.  **/\r\n  useJsonp?: boolean;\r\n}\r\n/**\r\nA DataService instance is used to encapsulate the details of a single 'service'; this includes a serviceName, a dataService adapterInstance,\r\nand whether the service has server side metadata.\r\n\r\nYou can construct an EntityManager with either a serviceName or a DataService instance, if you use a serviceName then a DataService\r\nis constructed for you.  (It can also be set via the EntityManager.setProperties method).\r\n\r\nThe same applies to the MetadataStore.fetchMetadata method, i.e. it takes either a serviceName or a DataService instance.\r\n\r\nEach metadataStore contains a list of DataServices, each accessible via its ‘serviceName’.\r\n( see MetadataStore.getDataService and MetadataStore.addDataService).  The ‘addDataService’ method is called internally\r\nanytime a MetadataStore.fetchMetadata call occurs with a new dataService ( or service name).\r\n\r\n**/\r\nexport class DataService {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // actually put on prototype.\r\n  /** The serviceName for this DataService. __Read Only__ **/\r\n  declare serviceName: string;\r\n  /** The adapter name for the [[IDataServiceAdapter]] to be used with this service. __Read Only__  **/\r\n  declare adapterName: string;\r\n  /**  The [[IDataServiceAdapter]] implementation instance associated with this EntityManager. __Read Only__  **/\r\n  declare adapterInstance?: DataServiceAdapter;\r\n  /** The adapter name for the [[IUriBuilderAdapter]] to be used with this service. __Read Only__  **/\r\n  declare uriBuilderName: string;\r\n  /**  The [[IUriBuilderAdapter]] implementation instance associated with this EntityManager. __Read Only__  **/\r\n  declare uriBuilder?: UriBuilderAdapter;\r\n  /** Whether the server can provide metadata for this service. __Read Only__   **/\r\n  declare hasServerMetadata: boolean;\r\n  /** The [[JsonResultsAdapter]] used to process the results of any query against this DataService. __Read Only__ **/\r\n  declare jsonResultsAdapter: JsonResultsAdapter;\r\n  /** Whether to use JSONP when performing a 'GET' request against this service. __Read Only__  **/\r\n  declare useJsonp: boolean;\r\n\r\n  /**   DataService constructor\r\n  >     var dataService = new DataService({\r\n  >         serviceName: altServiceName,\r\n  >         hasServerMetadata: false\r\n  >     });\r\n\r\n  >     var metadataStore = new MetadataStore({\r\n  >         namingConvention: NamingConvention.camelCase\r\n  >     });\r\n\r\n  >     return new EntityManager({\r\n  >         dataService: dataService,\r\n  >         metadataStore: metadataStore\r\n  >     });\r\n  @param config - A configuration object.\r\n  **/\r\n  constructor(config?: DataServiceConfig) {\r\n    updateWithConfig(this, config);\r\n  }\r\n\r\n\r\n  /**\r\n  Returns a copy of this DataService with the specified properties applied.\r\n  @param config - The configuration object to apply to create a new DataService.\r\n  **/\r\n  using(config: DataServiceConfig) {\r\n    if (!config) return this;\r\n    let result = new DataService(this);\r\n    return updateWithConfig(result, config);\r\n  }\r\n\r\n  static resolve(dataServices: DataService[]) {\r\n    // final defaults\r\n    // Deliberate use of 'as any' below.\r\n    (dataServices as any).push({\r\n      hasServerMetadata: true,\r\n      useJsonp: false\r\n    });\r\n    let ds = new DataService(core.resolveProperties(dataServices,\r\n        [\"serviceName\", \"adapterName\", \"uriBuilderName\", \"hasServerMetadata\", \"jsonResultsAdapter\", \"useJsonp\"]));\r\n\r\n    if (!ds.serviceName) {\r\n      throw new Error(\"Unable to resolve a 'serviceName' for this dataService\");\r\n    }\r\n    ds.adapterInstance = ds.adapterInstance || config.getAdapterInstance<DataServiceAdapter>(\"dataService\", ds.adapterName);\r\n    ds.jsonResultsAdapter = ds.jsonResultsAdapter || ds.adapterInstance!.jsonResultsAdapter;\r\n    ds.uriBuilder = ds.uriBuilder || config.getAdapterInstance<UriBuilderAdapter>(\"uriBuilder\", ds.uriBuilderName);\r\n    return ds;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  static _normalizeServiceName(serviceName: string) {\r\n    serviceName = serviceName.trim();\r\n    if (serviceName.substr(-1) !== \"/\") {\r\n      return serviceName + '/';\r\n    } else {\r\n      return serviceName;\r\n    }\r\n  }\r\n\r\n  /**  */\r\n  toJSON() {\r\n    // don't use default value here - because we want to be able to distinguish undefined props for inheritence purposes.\r\n    return core.toJson(this, {\r\n      serviceName: null,\r\n      adapterName: null,\r\n      uriBuilderName: null,\r\n      hasServerMetadata: null,\r\n      jsonResultsAdapter: function (v: any) {\r\n        return v && v.name;\r\n      },\r\n      useJsonp: null\r\n    });\r\n  }\r\n\r\n  static fromJSON(json: any) {\r\n    json.jsonResultsAdapter = config._fetchObject(JsonResultsAdapter, json.jsonResultsAdapter);\r\n    return new DataService(json);\r\n  }\r\n\r\n  /**\r\n   Returns a url for this dataService with the specified suffix. This method handles dataService names either\r\n   with or without trailing '/'s.  If the suffix starts with \"http\" then it will be returned as-is.\r\n   @method qualifyUrl\r\n   @param suffix {String} The resulting url.\r\n   @return {a Url string}\r\n   **/\r\n  qualifyUrl(suffix: string) {\r\n    if (suffix && suffix.startsWith(\"http\")) {\r\n      return suffix;\r\n    }\r\n    let url = this.serviceName;\r\n    // remove any trailing \"/\"\r\n    if (core.stringEndsWith(url, \"/\")) {\r\n      url = url.substr(0, url.length - 1);\r\n    }\r\n    // ensure that it ends with \"/\" + suffix\r\n    suffix = \"/\" + suffix;\r\n    if (!core.stringEndsWith(url, suffix)) {\r\n      url = url + suffix;\r\n    }\r\n    return url;\r\n  }\r\n\r\n}\r\nDataService.prototype._$typeName = \"DataService\";\r\n\r\nfunction updateWithConfig(obj: DataService, dsConfig?: DataServiceConfig) {\r\n  if (dsConfig) {\r\n    assertConfig(dsConfig)\r\n        .whereParam(\"serviceName\").isOptional()\r\n        .whereParam(\"adapterName\").isString().isOptional()\r\n        .whereParam(\"uriBuilderName\").isString().isOptional()\r\n        .whereParam(\"hasServerMetadata\").isBoolean().isOptional()\r\n        .whereParam(\"jsonResultsAdapter\").isInstanceOf(JsonResultsAdapter).isOptional()\r\n        .whereParam(\"useJsonp\").isBoolean().isOptional()\r\n        .applyAll(obj);\r\n    obj.serviceName = obj.serviceName && DataService._normalizeServiceName(obj.serviceName);\r\n    obj.adapterInstance = obj.adapterName ?  config.getAdapterInstance<DataServiceAdapter>(\"dataService\", obj.adapterName) : undefined;\r\n    obj.uriBuilder = obj.uriBuilderName ? config.getAdapterInstance<UriBuilderAdapter>(\"uriBuilder\", obj.uriBuilderName) : undefined;\r\n  }\r\n  return obj;\r\n}\r\n\r\nexport interface NodeMeta {\r\n  entityType?: EntityType;\r\n  nodeId?: string;\r\n  nodeRefId?: string;\r\n  ignore?: boolean;\r\n  passThru?: boolean;\r\n  extraMetadata?: any;\r\n}\r\n\r\nexport interface NodeContext {\r\n  nodeType: string;\r\n  propertyName?: string;\r\n  navigationProperty?: NavigationProperty;\r\n}\r\n\r\n/** Configuration info to be passed to the [[JsonResultsAdapter]] constructor */\r\nexport interface JsonResultsAdapterConfig {\r\n  /** The name of this adapter.  This name is used to uniquely identify and locate this instance when an 'exported' JsonResultsAdapter is later imported. */\r\n  name: string;\r\n  /** A Function that is called once per query operation to extract the 'payload' from any json received over the wire. \r\n  This method has a default implementation which to simply return the \"results\" property from any json returned as a result of executing the query. \r\n  */\r\n  extractResults?: Function;\r\n  /** A function that is called once per save operation to extract the entities from any json received over the wire.  Must return an array.\r\n  This method has a default implementation which simply returns the \"entities\" property from any json returned as a result of executing the save. */\r\n  extractSaveResults?: Function;\r\n  /** A function that is called once per save operation to extract the key mappings from any json received over the wire.  Must return an array.\r\n  This method has a default implementation which simply returns the \"keyMappings\" property from any json returned as a result of executing the save. */\r\n  extractKeyMappings?: (data: {}) => KeyMapping[];\r\n  /** A function that is called once per save operation to extract any deleted keys from any json received over the wire.  Must return an array.\r\n  This method has a default implementation which simply returns an empty array. */\r\n  extractDeletedKeys?: (data: {}) => any[]; // TODO: refine\r\n  /** A visitor method that will be called on each node of the returned payload. */\r\n  visitNode?: (v: any, mc?: MappingContext, nodeContext?: NodeContext) => NodeMeta;\r\n\r\n}\r\n\r\n/**\r\nA JsonResultsAdapter instance is used to provide custom extraction and parsing logic on the json results returned by any web service.\r\nThis facility makes it possible for breeze to talk to virtually any web service and return objects that will be first class 'breeze' citizens.\r\n**/\r\nexport class JsonResultsAdapter {\r\n  /** @hidden @internal */\r\n  _$typeName: string; // actually put on prototype.\r\n  /** The name of this adapter.  This name is used to uniquely identify and locate this instance when an 'exported' JsonResultsAdapter is later imported. */\r\n  name: string;\r\n  /** A Function that is called once per query operation to extract the 'payload' from any json received over the wire. \r\n  This method has a default implementation which simply returns the \"results\" property from any json returned as a result of executing the query. */\r\n  extractResults: Function; // TODO - refine\r\n  /** A function that is called once per save operation to extract the entities from any json received over the wire.  Must return an array.\r\n  This method has a default implementation which simply returns the \"entities\" property from any json returned as a result of executing the save. */\r\n  extractSaveResults: Function;\r\n    /** A function that is called once per save operation to extract the key mappings from any json received over the wire.  Must return an array.\r\n  This method has a default implementation which simply returns the \"keyMappings\" property from any json returned as a result of executing the save. */\r\n  extractKeyMappings:  (data: {}) => KeyMapping[];\r\n  /** A function that is called once per save operation to extract any deleted keys from any json received over the wire.  Must return an array.\r\n  This method has a default implementation which is to simply returns the \"deletedKeys\" property from any json returned as a result of executing the save. */\r\n  extractDeletedKeys?: (data: {}) => any[]; // TODO: refine\r\n  /** A visitor method that will be called on each node of the returned payload. */\r\n  visitNode: Function;\r\n\r\n  /**\r\n  JsonResultsAdapter constructor\r\n\r\n  @example\r\n      //\r\n      var jsonResultsAdapter = new JsonResultsAdapter({\r\n          name: \"test1e\",\r\n          extractResults: function(json) {\r\n              return json.results;\r\n          },\r\n          visitNode: function(node, mappingContext, nodeContext) {\r\n              var entityType = normalizeTypeName(node.$type);\r\n              var propertyName = nodeContext.propertyName;\r\n              var ignore = propertyName && propertyName.substr(0, 1) === \"$\";\r\n\r\n              return {\r\n                  entityType: entityType,\r\n                  nodeId: node.$id,\r\n                  nodeRefId: node.$ref,\r\n                  ignore: ignore,\r\n                  passThru: false // default\r\n              };\r\n          }\r\n      });\r\n\r\n      var dataService = new DataService( {\r\n              serviceName: \"breeze/foo\",\r\n              jsonResultsAdapter: jsonResultsAdapter\r\n      });\r\n\r\n      var entityManager = new EntityManager( {\r\n          dataService: dataService\r\n      });\r\n\r\n  @param config - A configuration object.\r\n\r\n  **/\r\n  constructor(jsConfig: JsonResultsAdapterConfig) {\r\n    if (arguments.length !== 1) {\r\n      throw new Error(\"The JsonResultsAdapter ctor should be called with a single argument that is a configuration object.\");\r\n    }\r\n\r\n    assertConfig(jsConfig)\r\n        .whereParam(\"name\").isNonEmptyString()\r\n        .whereParam(\"extractResults\").isFunction().isOptional().withDefault(extractResultsDefault)\r\n        .whereParam(\"extractSaveResults\").isFunction().isOptional().withDefault(extractSaveResultsDefault)\r\n        .whereParam(\"extractKeyMappings\").isFunction().isOptional().withDefault(extractKeyMappingsDefault)\r\n        .whereParam(\"extractDeletedKeys\").isFunction().isOptional().withDefault(extractDeletedKeysDefault)\r\n        .whereParam(\"visitNode\").isFunction()\r\n        .applyAll(this);\r\n    config._storeObject(this, \"JsonResultsAdapter\", this.name);\r\n  }\r\n\r\n}\r\nJsonResultsAdapter.prototype._$typeName = \"JsonResultsAdapter\";\r\n\r\nfunction extractResultsDefault(data: any) {\r\n  return data.results;\r\n}\r\n\r\nfunction extractSaveResultsDefault(data: any) {\r\n  return data.entities || data.Entities || [];\r\n}\r\n\r\nfunction extractKeyMappingsDefault(data: any) {\r\n  return data.keyMappings || data.KeyMappings || [];\r\n}\r\n\r\nfunction extractDeletedKeysDefault(data: any) {\r\n  return data.deletedKeys || data.DeletedKeys || [];\r\n}\r\n\r\n","import { core } from './core';\r\nimport { assertParam } from './assert-param';\r\nimport { config } from './config';\r\nimport { NavigationProperty, DataProperty } from './entity-metadata';\r\nimport { Entity } from './entity-aspect';\r\n\r\nexport const INT16_MIN = -32768;\r\nexport const INT16_MAX = 32767;\r\n\r\nexport const INT32_MIN = -2147483648;\r\nexport const INT32_MAX = 2147483647;\r\n\r\nexport const BYTE_MIN = 0;\r\nexport const BYTE_MAX = 255;\r\n\r\n/** Passed to ValidationFn */\r\nexport interface ValidationContext {\r\n  entity?: Entity;\r\n  property?: DataProperty | NavigationProperty;\r\n  propertyName?: string;\r\n  value?: any;\r\n}\r\n\r\n/** Used by Validator to compose messages */\r\nexport interface ValidationMessageContext extends ValidationContext {\r\n  name?: string;\r\n  displayName?: string;\r\n  messageTemplate?: string;\r\n  message?: string | ((vc: ValidationContext) => string);\r\n  [key:string]: any;\r\n}\r\n\r\n/** Function called to validate an entity or property */\r\nexport interface ValidationFn {\r\n    (value: any, context?: ValidationContext): boolean;\r\n}\r\n\r\n// add common props and methods for every validator 'context' here.\r\nlet rootContext = {\r\n  displayName: function (context: ValidationContext) {\r\n    if (context.property) {\r\n      return context.property.resolveProperty(\"displayName\") || context.propertyName || context.property.name;\r\n    } else {\r\n      return \"Value\";\r\n    }\r\n  }\r\n};\r\n\r\n/**\r\nInstances of the Validator class provide the logic to validate another object and provide a description of any errors\r\nencountered during the validation process.  They are typically associated with a 'validators' property on the following types: [[EntityType]],\r\n[[DataProperty]] or [[NavigationProperty]].\r\n\r\nA number of property level validators are registered automatically, i.e added to each DataProperty.validators property\r\nbased on [[DataProperty]] metadata.  For example,\r\n\r\n- DataProperty.dataType -> one of the 'dataType' validator methods such as Validator.int64, Validator.date, Validator.bool etc.\r\n- DataProperty.maxLength -> Validator.maxLength\r\n- DataProperty.isNullable -> Validator.required (if not nullable)\r\n\r\n@class Validator\r\n**/\r\n\r\n/**\r\nValidator constructor - This method is used to create create custom validations.  Several\r\nbasic \"Validator\" construction methods are also provided as static methods to this class. These methods\r\nprovide a simpler syntax for creating basic validations.\r\n\r\nMany of these stock validators are inspired by and implemented to conform to the validators defined at\r\nhttp://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx\r\n\r\nSometimes a custom validator will be required.\r\n@example\r\nMost validators will be 'property' level validators, like this.\r\n@example\r\n    // v is this function is the value to be validated, in this case a \"country\" string.\r\n    var valFn = function (v) {\r\n        if (v == null) return true;\r\n        return (core.stringStartsWith(v, \"US\"));\r\n    };\r\n    var countryValidator = new Validator(\"countryIsUS\", valFn, {\r\n        displayName: \"Country\", \r\n        messageTemplate: \"'%displayName%' must start with 'US'\" \r\n    });\r\n\r\n    // Now plug it into Breeze.\r\n    // Assume em1 is a preexisting EntityManager.\r\n    var custType = metadataStore.getEntityType(\"Customer\");\r\n    var countryProp = custType.getProperty(\"Country\");\r\n    // Note that validator is added to a 'DataProperty' validators collection.\r\n    prop.validators.push(countryValidator);\r\nEntity level validators are also possible\r\n@example\r\n    function isValidZipCode(value) {\r\n        var re = /^\\d{5}([\\-]\\d{4})?$/;\r\n        return (re.test(value));\r\n    }\r\n\r\n    // v in this case will be a Customer entity\r\n    var valFn = function (v) {\r\n        // This validator only validates US Zip Codes.\r\n        if ( v.getProperty(\"Country\") === \"USA\") {\r\n            var postalCode = v.getProperty(\"PostalCode\");\r\n            return isValidZipCode(postalCode);\r\n        }\r\n        return true;\r\n    };\r\n    var zipCodeValidator = new Validator(\"zipCodeValidator\", valFn,\r\n        { messageTemplate: \"For the US, this is not a valid PostalCode\" });\r\n\r\n    // Now plug it into Breeze.\r\n    // Assume em1 is a preexisting EntityManager.\r\n    var custType = em1.metadataStore.getEntityType(\"Customer\");\r\n    // Note that validator is added to an 'EntityType' validators collection.\r\n    custType.validators.push(zipCodeValidator);\r\nWhat is commonly needed is a way of creating a parameterized function that will itself\r\nreturn a new Validator.  This requires the use of a 'context' object.\r\n@example\r\n    // create a function that will take in a config object\r\n    // and will return a validator\r\n    var numericRangeValidator = function(context) {\r\n        var valFn = function(v, ctx) {\r\n            if (v == null) return true;\r\n            if (typeof(v) !== \"number\") return false;\r\n            if (ctx.min != null && v < ctx.min) return false;\r\n            if (ctx.max != null && v > ctx.max) return false;\r\n            return true;\r\n        };\r\n        // The last parameter below is the 'context' object that will be passed into the 'ctx' parameter above\r\n        // when this validator executes. Several other properties, such as displayName will get added to this object as well.\r\n        return new Validator(\"numericRange\", valFn, {\r\n            messageTemplate: \"'%displayName%' must be a number between the values of %min% and %max%\",\r\n            min: context.min,\r\n            max: context.max\r\n        });\r\n    };\r\n    // Assume that freightProperty is a DataEntityProperty that describes numeric values.\r\n    // register the validator\r\n    freightProperty.validators.push(numericRangeValidator({ min: 100, max: 500 }));\r\n\r\nBreeze substitutes context values and functions for the tokens in the messageTemplate when preparing the runtime error message;\r\n'displayName' is a pre-defined context function that is always available.\r\n\r\nPlease note that Breeze substitutes the empty string for falsey parameters. That usually works in your favor.\r\nSometimes it doesn't as when the 'min' value is zero in which case the message text would have a hole\r\nwhere the 'min' value goes, saying: \"... an integer between the values of and ...\". That is not what you want.\r\n\r\nTo avoid this effect, you may can bake certain of the context values into the 'messageTemplate' itself\r\nas shown in this revision to the pertinent part of the previous example:\r\n@example\r\n    // ... as before\r\n    // ... but bake the min/max values into the message template.\r\n    var template = breeze.core.formatString(\r\n        \"'%displayName%' must be a number between the values of %1 and %2\",\r\n        context.min, context.max);\r\n    return new Validator(\"numericRange\", valFn, {\r\n        messageTemplate: template,\r\n        min: context.min,\r\n        max: context.max\r\n    });\r\n\r\n@method <ctor> Validator\r\n@param name {String} The name of this validator.\r\n@param validatorFn {Function} A function to perform validation.\r\n\r\nvalidatorFn(value, context)\r\n@param validatorFn.value {Object} Value to be validated\r\n@param validatorFn.context {Object} The same context object passed into the constructor with the following additional properties if not\r\notherwise specified.\r\n@param validatorFn.context.value {Object} The value being validated.\r\n@param validatorFn.context.name {String} The name of the validator being executed.\r\n@param validatorFn.context.displayName {String} This will be either the value of the property's 'displayName' property or\r\nthe value of its 'name' property or the string 'Value'\r\n@param validatorFn.context.messageTemplate {String} This will either be the value of Validator.messageTemplates[ {this validators name}] or null. Validator.messageTemplates\r\nis an object that is keyed by validator name and that can be added to in order to 'register' your own message for a given validator.\r\nThe following property can also be specified for any validator to force a specific errorMessage string\r\n@param [validatorFn.context.message] {String} If this property is set it will be used instead of the 'messageTemplate' property when an\r\nerror message is generated.\r\n\r\n@param [context] {Object} A free form object whose properties will made available during the validation and error message creation process.\r\nThis object will be passed into the Validator's validation function whenever 'validate' is called. See above for a description\r\nof additional properties that will be automatically added to this object if not otherwise specified.\r\n@dynamic\r\n**/\r\nexport class Validator {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on proto\r\n\r\n  declare name: string;\r\n  declare valFn: ValidationFn;\r\n  declare context: ValidationMessageContext;\r\n  declare currentContext: ValidationMessageContext;\r\n  declare private _baseContext: ValidationMessageContext;\r\n\r\n  constructor(name: string, valFn: ValidationFn, context?: ValidationMessageContext) {\r\n    // _baseContext is what will get serialized\r\n    this._baseContext = context || {} as ValidationMessageContext;\r\n    this._baseContext.name = name;\r\n    context = core.extend(Object.create(rootContext), this._baseContext) as ValidationMessageContext;\r\n    context.messageTemplate = context.messageTemplate || Validator.messageTemplates[name];\r\n    this.name = name;\r\n    this.valFn = valFn;\r\n    this.context = context;\r\n  }\r\n\r\n  /**\r\n  The name of this validator.\r\n\r\n  __readOnly__\r\n  @property name {String}\r\n  **/\r\n\r\n  /**\r\n  The context for this validator.\r\n\r\n  This object will typically contain at a minimum the following properties. \"name\", \"displayName\", and \"message\" or \"messageTemplate\".\r\n  __readOnly__\r\n  @property context {Object}\r\n  **/\r\n\r\n\r\n  /**\r\n  Run this validator against the specified value.  This method will usually be called internally either\r\n  automatically by an property change, entity attach, query or save operation, or manually as a result of\r\n  a validateEntity call on the EntityAspect. The resulting ValidationResults are available via the\r\n  EntityAspect.getValidationErrors method.\r\n\r\n  However, you can also call a validator directly either for testing purposes or some other reason if needed.\r\n  @example\r\n      // using one of the predefined validators\r\n      var validator = Validator.maxLength({ maxLength: 5, displayName: \"City\" });\r\n      // should be ok because \"asdf\".length < 5\r\n      var result = validator.validate(\"asdf\");\r\n      ok(result === null);\r\n      result = validator.validate(\"adasdfasdf\");\r\n      // extract all of the properties of the 'result'\r\n      var errMsg = result.errorMessage;\r\n      var context = result.context;\r\n      var sameValidator = result.validator;\r\n  @method validate\r\n  @param value {Object} Value to validate\r\n  @param additionalContext {Object} Any additional contextual information that the Validator\r\n  can make use of.\r\n  @return {ValidationError|null} A ValidationError if validation fails, null otherwise\r\n  **/\r\n  validate(value: any, additionalContext?: ValidationMessageContext) {\r\n    let currentContext: ValidationMessageContext; // { value?: Object };\r\n    if (additionalContext) {\r\n      currentContext = core.extend(Object.create(this.context), additionalContext) as ValidationMessageContext;\r\n    } else {\r\n      currentContext = this.context;\r\n    }\r\n    this.currentContext = currentContext;\r\n\r\n    try {\r\n      if (this.valFn(value, currentContext)) {\r\n        return null;\r\n      } else {\r\n        currentContext.value = value;\r\n        return new ValidationError(this, currentContext, this.getMessage());\r\n      }\r\n    } catch (e) {\r\n      return new ValidationError(this, currentContext, \"Exception occured while executing this validator: \" + this.name);\r\n    }\r\n  }\r\n\r\n\r\n  // context.value is not avail unless validate was called first.\r\n\r\n  /**\r\n  Returns the message generated by the most recent execution of this Validator.\r\n  @example\r\n      var v0 = Validator.maxLength({ maxLength: 5, displayName: \"City\" });\r\n      v0.validate(\"adasdfasdf\");\r\n      var errMessage = v0.getMessage());\r\n  @method getMessage\r\n  @return {String}\r\n  **/\r\n  getMessage() {\r\n    try {\r\n      let context = this.currentContext;\r\n      let message = context.message;\r\n      if (message) {\r\n        if (typeof (message) === \"function\") {\r\n          return message(context);\r\n        } else {\r\n          return message;\r\n        }\r\n      } else if (context.messageTemplate) {\r\n        return formatTemplate(context.messageTemplate, context);\r\n      } else {\r\n        return \"invalid value: \" + (this.name || \"{unnamed validator}\");\r\n      }\r\n    } catch (e) {\r\n      return \"Unable to format error message\" + e.toString();\r\n    }\r\n  }\r\n\r\n  toJSON() {\r\n    return this._baseContext;\r\n  }\r\n\r\n  /**\r\n  Creates a validator instance from a JSON object or an array of instances from an array of JSON objects.\r\n  @method fromJSON\r\n  @static\r\n  @param json {Object} JSON object that represents the serialized version of a validator.\r\n  **/\r\n  public static fromJSON(json: any): any {\r\n    if (Array.isArray(json)) {\r\n      return json.map(function (js) {\r\n        return Validator.fromJSON(js);\r\n      });\r\n    }\r\n    if (json instanceof Validator) {\r\n      return json;\r\n    }\r\n    let validatorName = \"Validator.\" + json.name;\r\n    let fn = config.getRegisteredFunction(validatorName);\r\n    if (!fn) {\r\n      throw new Error(\"Unable to locate a validator named:\" + json.name);\r\n    }\r\n    return fn(json);\r\n  }\r\n\r\n  /**\r\n  Register a validator instance so that any deserialized metadata can reference it.\r\n  @method register\r\n  @static\r\n  @param validator {Validator} Validator to register.\r\n  **/\r\n  public static register(validator: Validator) {\r\n    config.registerFunction(function () {\r\n      return validator;\r\n    }, \"Validator.\" + validator.name);\r\n  }\r\n\r\n  /**\r\n  Register a validator factory so that any deserialized metadata can reference it.\r\n  @method registerFactory\r\n  @static\r\n  @param validatorFactory {Function} A function that optionally takes a context property and returns a Validator instance.\r\n  @param name {String} The name of the validator.\r\n  **/\r\n  public static registerFactory(validatorFactory: (options?: any) => Validator, name: string) {\r\n    config.registerFunction(validatorFactory, \"Validator.\" + name);\r\n  }\r\n\r\n  /**\r\n  Map of standard error message templates keyed by validator name.\r\n  You can add to or modify this object to customize the template used for any validation error message.\r\n  @example\r\n      // v is this function is the value to be validated, in this case a \"country\" string.\r\n      var valFn = function (v) {\r\n          if (v == null) return true;\r\n          return (core.stringStartsWith(v, \"US\"));\r\n      };\r\n      var countryValidator = new Validator(\"countryIsUS\", valFn, { displayName: \"Country\" });\r\n      Validator.messageTemplates.countryIsUS = \"'%displayName%' must start with 'US'\";\r\n      // This will have a similar effect to this\r\n      var countryValidator = new Validator(\"countryIsUS\", valFn, {\r\n          displayName: \"Country\", \r\n          messageTemplate: \"'%displayName%' must start with 'US'\" \r\n      });\r\n  @property messageTemplates {Object}\r\n  @static\r\n  **/\r\n  public static messageTemplates = {\r\n    bool: \"'%displayName%' must be a 'true' or 'false' value\",\r\n    creditCard: \"The %displayName% is not a valid credit card number\",\r\n    date: \"'%displayName%' must be a date\",\r\n    duration: \"'%displayName%' must be a ISO8601 duration string, such as 'P3H24M60S'\",\r\n    emailAddress: \"The %displayName% '%value%' is not a valid email address\",\r\n    guid: \"'%displayName%' must be a GUID\",\r\n    integer: \"'%displayName%' must be an integer\",\r\n    integerRange: \"'%displayName%' must be an integer between the values of %minValue% and %maxValue%\",\r\n    maxLength: \"'%displayName%' must be a string with %maxLength% characters or less\",\r\n    number: \"'%displayName%' must be a number\",\r\n    phone: \"The %displayName% '%value%' is not a valid phone number\",\r\n    regularExpression: \"The %displayName% '%value%' does not match '%expression%'\",\r\n    required: \"'%displayName%' is required\",\r\n    string: \"'%displayName%' must be a string\",\r\n    stringLength: \"'%displayName%' must be a string with between %minLength% and %maxLength% characters\",\r\n    url: \"The %displayName% '%value%' is not a valid url\"\r\n  };\r\n\r\n  /**\r\n  Returns a standard 'required value' Validator\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var custType = em1.metadataStore.getEntityType(\"Customer\");\r\n      var regionProperty - custType.getProperty(\"Region\");\r\n      // Makes \"Region\" on Customer a required property.\r\n      regionProperty.validators.push(Validator.required());\r\n      // or to allow empty strings\r\n      regionProperty.validators.push(Validator.required({ allowEmptyStrings: true }););\r\n  @method required\r\n  @static\r\n  @param context {Object}\r\n  @param [context.allowEmptyStrings] {Boolean} If this parameter is omitted or false then empty strings do NOT pass validation.\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static required = function(context?: any) {\r\n    let valFn = function (v: any, ctx: any) {\r\n      if (typeof v === \"string\") {\r\n        if (ctx && ctx.allowEmptyStrings) return true;\r\n        return v.length > 0;\r\n      } else {\r\n        return v != null;\r\n      }\r\n    };\r\n    return new Validator(\"required\", valFn, context);\r\n  };\r\n\r\n  /**\r\n  Returns a standard maximum string length Validator; the maximum length must be specified\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var custType = em1.metadataStore.getEntityType(\"Customer\");\r\n      var regionProperty - custType.getProperty(\"Region\");\r\n      // Validates that the value of the Region property on Customer will be less than or equal to 5 characters.\r\n      regionProperty.validators.push(Validator.maxLength( {maxLength: 5}));\r\n  @method maxLength\r\n  @static\r\n  @param context {Object}\r\n  @param context.maxLength {Integer}\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static maxLength = function(context: any) {\r\n    let valFn = function (v: any, ctx: any) {\r\n      if (v == null) return true;\r\n      if (typeof (v) !== \"string\") return false;\r\n      return v.length <= ctx.maxLength;\r\n    };\r\n    return new Validator(\"maxLength\", valFn, context);\r\n  };\r\n\r\n  /**\r\n  Returns a standard string length Validator; both minimum and maximum lengths must be specified.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var custType = em1.metadataStore.getEntityType(\"Customer\");\r\n      var regionProperty - custType.getProperty(\"Region\");\r\n      // Validates that the value of the Region property on Customer will be\r\n      // between 2 and 5 characters\r\n      regionProperty.validators.push(Validator.stringLength( {minLength: 2, maxLength: 5});\r\n  @method stringLength\r\n  @static\r\n  @param context {Object}\r\n  @param context.maxLength {Integer}\r\n  @param context.minLength {Integer}\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static stringLength = function (context: any) {\r\n    let valFn = function (v: any, ctx: any) {\r\n      if (v == null) return true;\r\n      if (typeof (v) !== \"string\") return false;\r\n      if (ctx.minLength != null && v.length < ctx.minLength) return false;\r\n      if (ctx.maxLength != null && v.length > ctx.maxLength) return false;\r\n      return true;\r\n    };\r\n    return new Validator(\"stringLength\", valFn, context);\r\n  };\r\n\r\n  /**\r\n  Returns a standard string dataType Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var custType = em1.metadataStore.getEntityType(\"Customer\");\r\n      var regionProperty - custType.getProperty(\"Region\");\r\n      // Validates that the value of the Region property on Customer is a string.\r\n      regionProperty.validators.push(Validator.string());\r\n  @method string\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static string = function () {\r\n    let valFn = function (v: any) {\r\n      if (v == null) return true;\r\n      return (typeof v === \"string\");\r\n    };\r\n    return new Validator(\"string\", valFn);\r\n  };\r\n\r\n  /**\r\n  Returns a Guid data type Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var custType = em1.metadataStore.getEntityType(\"Customer\");\r\n      var customerIdProperty - custType.getProperty(\"CustomerID\");\r\n      // Validates that the value of the CustomerID property on Customer is a Guid.\r\n      customerIdProperty.validators.push(Validator.guid());\r\n  @method guid\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static guid = function () {\r\n    let valFn = function (v: any) {\r\n      if (v == null) return true;\r\n      return core.isGuid(v);\r\n    };\r\n    return new Validator(\"guid\", valFn);\r\n  };\r\n\r\n  /**\r\n  Returns a ISO 8601 duration string  Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var eventType = em1.metadataStore.getEntityType(\"Event\");\r\n      var elapsedTimeProperty - eventType.getProperty(\"ElapsedTime\");\r\n      // Validates that the value of the ElapsedTime property on Customer is a duration.\r\n      elapsedTimeProperty.validators.push(Validator.duration());\r\n  @method duration\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static duration = function () {\r\n    let valFn = function (v: any) {\r\n      if (v == null) return true;\r\n      return core.isDuration(v);\r\n    };\r\n    return new Validator(\"duration\", valFn);\r\n  };\r\n\r\n  /**\r\n  Returns a standard numeric data type Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var orderType = em1.metadataStore.getEntityType(\"Order\");\r\n      var freightProperty - orderType.getProperty(\"Freight\");\r\n      // Validates that the value of the Freight property on Order is a number.\r\n      freightProperty.validators.push(Validator.number());\r\n  @method number\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n\r\n    // TODO: may need to have seperate logic for single.\r\n  public static number = function(context?: any) {\r\n    let valFn = function (v: any, ctx: any) {\r\n      if (v == null) return true;\r\n      if (typeof v === \"string\" && ctx && ctx.allowString) {\r\n        v = parseFloat(v);\r\n      }\r\n      return (typeof v === \"number\" && !isNaN(v));\r\n    };\r\n    return new Validator(\"number\", valFn, context);\r\n  };\r\n  public static double = Validator.number;\r\n  public static single = Validator.number;\r\n\r\n  /**\r\n  Returns a standard large integer data type - 64 bit - Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var orderType = em1.metadataStore.getEntityType(\"Order\");\r\n      var freightProperty - orderType.getProperty(\"Freight\");\r\n      // Validates that the value of the Freight property on Order is within the range of a 64 bit integer.\r\n      freightProperty.validators.push(Validator.int64());\r\n  @method int64\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static integer = function(context: any) {\r\n    let valFn = function (v: any, ctx: any) {\r\n      if (v == null) return true;\r\n      if (typeof v === \"string\" && ctx && ctx.allowString) {\r\n        v = parseInt(v, 10);\r\n      }\r\n      return (typeof v === \"number\") && (!isNaN(v)) && Math.floor(v) === v;\r\n    };\r\n    return new Validator(\"integer\", valFn, context);\r\n  };\r\n  public static int64 = Validator.integer;\r\n\r\n  /**\r\n  Returns a standard 32 bit integer data type Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var orderType = em1.metadataStore.getEntityType(\"Order\");\r\n      var freightProperty - orderType.getProperty(\"Freight\");\r\n      freightProperty.validators.push(Validator.int32());\r\n  @method int32\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static int32 = function(context: any) {\r\n    return intRangeValidatorCtor(\"int32\", INT32_MIN, INT32_MAX, context)();\r\n  };\r\n\r\n  /**\r\n  Returns a standard 16 bit integer data type Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var orderType = em1.metadataStore.getEntityType(\"Order\");\r\n      var freightProperty - orderType.getProperty(\"Freight\");\r\n      // Validates that the value of the Freight property on Order is within the range of a 16 bit integer.\r\n      freightProperty.validators.push(Validator.int16());\r\n  @method int16\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static int16 = function(context: any) {\r\n    return intRangeValidatorCtor(\"int16\", INT16_MIN, INT16_MAX, context)();\r\n  };\r\n\r\n  /**\r\n  Returns a standard byte data type Validator. (This is a integer between 0 and 255 inclusive for js purposes).\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var orderType = em1.metadataStore.getEntityType(\"Order\");\r\n      var freightProperty - orderType.getProperty(\"Freight\");\r\n      // Validates that the value of the Freight property on Order is within the range of a 16 bit integer.\r\n      // Probably not a very good validation to place on the Freight property.\r\n      regionProperty.validators.push(Validator.byte());\r\n  @method byte\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static byte = function(context: any) {\r\n    return intRangeValidatorCtor(\"byte\", BYTE_MIN, BYTE_MAX, context)();\r\n  };\r\n\r\n  /**\r\n  Returns a standard boolean data type Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var productType = em1.metadataStore.getEntityType(\"Product\");\r\n      var discontinuedProperty - productType.getProperty(\"Discontinued\");\r\n      // Validates that the value of the Discontinued property on Product is a boolean\r\n      discontinuedProperty.validators.push(Validator.bool());\r\n  @method bool\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static bool = function() {\r\n    let valFn = function (v: any) {\r\n      if (v == null) return true;\r\n      return (v === true) || (v === false);\r\n    };\r\n    return new Validator(\"bool\", valFn);\r\n  };\r\n\r\n  public static none = function() {\r\n    let valFn = function (v: any) {\r\n      return true;\r\n    };\r\n    return new Validator(\"none\", valFn);\r\n  };\r\n\r\n  /**\r\n  Returns a standard date data type Validator.\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager.\r\n      var orderType = em1.metadataStore.getEntityType(\"Order\");\r\n      var orderDateProperty - orderType.getProperty(\"OrderDate\");\r\n      // Validates that the value of the OrderDate property on Order is a date\r\n      // Probably not a very good validation to place on the Freight property.\r\n      orderDateProperty.validators.push(Validator.date());\r\n  @method date\r\n  @static\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static date = function() {\r\n    let valFn = function (v: any) {\r\n      if (v == null) return true;\r\n      if (typeof v === \"string\") {\r\n        try {\r\n          return !isNaN(Date.parse(v));\r\n          // old code\r\n          // return __isDate(new Date(v));\r\n        } catch (e) {\r\n          return false;\r\n        }\r\n      } else {\r\n        return core.isDate(v);\r\n      }\r\n    };\r\n    return new Validator(\"date\", valFn);\r\n  };\r\n\r\n  /**\r\n  Returns a credit card number validator\r\n  Performs a luhn algorithm checksum test for plausability\r\n  catches simple mistakes; only service knows for sure\r\n  @example\r\n      // Assume em is a preexisting EntityManager.\r\n      var personType = em.metadataStore.getEntityType(\"Person\");\r\n      var creditCardProperty = personType.getProperty(\"creditCard\");\r\n      // Validates that the value of the Person.creditCard property is credit card.\r\n      creditCardProperty.validators.push(Validator.creditCard());\r\n  @method creditCard\r\n  @static\r\n  @param [context] {Object} optional parameters to pass through to validation constructor\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static creditCard = function(context?: any) {\r\n    function valFn(v: any) {\r\n      if (v == null || v === '') return true;\r\n      if (typeof (v) !== 'string') return false;\r\n      v = v.replace(/(\\-|\\s)/g, \"\"); // remove dashes and spaces\r\n      if (!v || /\\D/.test(v)) return false; // all digits, not empty\r\n      return luhn(v);\r\n    }\r\n    return new Validator('creditCard', valFn, context);\r\n  };\r\n\r\n\r\n  /**\r\n  Returns a regular expression validator; the expression must be specified\r\n  @example\r\n      // Add validator to a property. Assume em is a preexisting EntityManager.\r\n      var customerType = em.metadataStore.getEntityType(\"Customer\");\r\n      var regionProperty = customerType.getProperty(\"Region\");\r\n      // Validates that the value of Customer.Region is 2 char uppercase alpha.\r\n      regionProperty.validators.push(Validator.regularExpression( {expression: '^[A-Z]{2}$'} );\r\n  @method regularExpression\r\n  @static\r\n  @param context {Object}\r\n  @param context.expression {String} String form of the regular expression to apply\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static regularExpression = function(context?: any) {\r\n    function valFn(v: any, ctx: any) {\r\n      // do not invalidate if empty; use a separate required test\r\n      if (v == null || v === '') return true;\r\n      if (typeof (v) !== 'string') return false;\r\n      try {\r\n        let re = new RegExp(ctx.expression);\r\n        return re.test(v);\r\n      } catch (e) {\r\n        throw new Error('Missing or invalid expression parameter to regExp validator');\r\n      }\r\n    }\r\n    return new Validator('regularExpression', valFn, context);\r\n  };\r\n\r\n  /**\r\n  Returns the email address validator\r\n  @example\r\n      // Assume em is a preexisting EntityManager.\r\n      var personType = em.metadataStore.getEntityType(\"Person\");\r\n      var emailProperty = personType.getProperty(\"email\");\r\n      // Validates that the value of the Person.email property is an email address.\r\n      emailProperty.validators.push(Validator.emailAddress());\r\n  @method emailAddress\r\n  @static\r\n  @param [context] {Object} optional parameters to pass through to validation constructor\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static emailAddress = function(context?: any) {\r\n    // See https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/EmailAttribute.cs\r\n    let reEmailAddress = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i;\r\n    return makeRegExpValidator('emailAddress', reEmailAddress, null, context);\r\n  };\r\n\r\n  /**\r\n  Returns the phone validator\r\n  Provides basic assertions on the format and will help to eliminate most nonsense input\r\n  Matches:\r\n  International dialing prefix: {{}, +, 0, 0000} (with or without a trailing break character, if not '+': [-/. ])\r\n  > ((\\+)|(0(\\d+)?[-/.\\s]))\r\n  Country code: {{}, 1, ..., 999} (with or without a trailing break character: [-/. ])\r\n  > [1-9]\\d{,2}[-/.\\s]?\r\n  Area code: {(0), ..., (000000), 0, ..., 000000} (with or without a trailing break character: [-/. ])\r\n  > ((\\(\\d{1,6}\\)|\\d{1,6})[-/.\\s]?)?\r\n  Local: {0, ...}+ (with or without a trailing break character: [-/. ])\r\n  > (\\d+[-/.\\s]?)+\\d+\r\n  @example\r\n      // Assume em is a preexisting EntityManager.\r\n      var customerType = em.metadataStore.getEntityType(\"Customer\");\r\n      var phoneProperty = customerType.getProperty(\"phone\");\r\n      // Validates that the value of the Customer.phone property is phone.\r\n      phoneProperty.validators.push(Validator.phone());\r\n  @method phone\r\n  @static\r\n  @param [context] {Object} optional parameters to pass through to validation constructor\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static phone = function (context?: any) {\r\n    // See https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/Expressions.cs\r\n    let rePhone = /^((\\+|(0(\\d+)?[-/.\\s]?))[1-9]\\d{0,2}[-/.\\s]?)?((\\(\\d{1,6}\\)|\\d{1,6})[-/.\\s]?)?(\\d+[-/.\\s]?)+\\d+$/;\r\n    return makeRegExpValidator('phone', rePhone, null, context);\r\n  };\r\n\r\n  /**\r\n  Returns the URL (protocol required) validator\r\n  @example\r\n      // Assume em is a preexisting EntityManager.\r\n      var personType = em.metadataStore.getEntityType(\"Person\");\r\n      var websiteProperty = personType.getProperty(\"website\");\r\n      // Validates that the value of the Person.website property is a URL.\r\n      websiteProperty.validators.push(Validator.url());\r\n  @method url\r\n  @static\r\n  @param [context] {Object} optional parameters to pass through to validation constructor\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static url = function (context?: any) {\r\n    //See https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/UrlAttribute.cs\r\n    let reUrlProtocolRequired = /^(https?|ftp):\\/\\/(((([a-zA-Z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-fA-F]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|([a-zA-Z][\\-a-zA-Z0-9]*)|((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-zA-Z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-fA-F]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-zA-Z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-fA-F]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-zA-Z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-fA-F]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-zA-Z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-fA-F]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/;\r\n    return makeRegExpValidator('url', reUrlProtocolRequired, null, context);\r\n  };\r\n\r\n  /**\r\n  Creates a regular expression validator with a fixed expression.\r\n  Many of the stock validators are built with this factory method.\r\n  Their expressions are often derived from\r\n  https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions\r\n  You can try many of them at http://dataannotationsextensions.org/\r\n  @example\r\n      // Make a zipcode validator\r\n      function zipValidator = Validator.makeRegExpValidator(\r\n      \"zipVal,\r\n      /^\\d{5}([\\-]\\d{4})?$/,\r\n      \"The %displayName% '%value%' is not a valid U.S. zipcode\");\r\n      // Register it.\r\n      Validator.register(zipValidator);\r\n      // Add it to a data property. Assume em is a preexisting EntityManager.\r\n      var custType = em.metadataStore.getEntityType(\"Customer\");\r\n      var zipProperty = custType.getProperty(\"PostalCode\");\r\n      zipProperty.validators.push(zipValidator);\r\n  @method makeRegExpValidator\r\n  @static\r\n  @param validatorName {String} name of this validator\r\n  @param expression {String | RegExp} regular expression to apply\r\n  @param [defaultMessage] {String} default message for failed validations\r\n  @param [context] {Object} optional parameters to pass through to validation constructor\r\n  @return {Validator} A new Validator\r\n  **/\r\n  public static makeRegExpValidator = makeRegExpValidator;\r\n\r\n}\r\nValidator.prototype._$typeName = \"Validator\";\r\n\r\n// register all validators\r\nError['x'] = core.objectForEach(Validator, function (key: string, value: any) {\r\n  if (typeof (value) !== \"function\") {\r\n    return;\r\n  }\r\n  if (key === \"fromJSON\" || key === \"register\" ||\r\n      key === \"registerFactory\" || key === \"makeRegExpValidator\") {\r\n    return;\r\n  }\r\n\r\n  config.registerFunction(value, \"Validator.\" + key);\r\n});\r\n\r\nfunction formatTemplate(template: string, vars: Object, ownPropertiesOnly: boolean = false) {\r\n  if (!vars) return template;\r\n  return template.replace(/%([^%]+)%/g, function (_, key) {\r\n    let valOrFn: any;\r\n    if (ownPropertiesOnly) {\r\n      valOrFn = vars.hasOwnProperty(key) ? vars[key] : '';\r\n    } else {\r\n      valOrFn = vars[key];\r\n    }\r\n    if (valOrFn != null) {\r\n      if (core.isFunction(valOrFn)) {\r\n        return valOrFn(vars);\r\n      } else {\r\n        return valOrFn;\r\n      }\r\n    } else {\r\n      return \"\";\r\n    }\r\n  });\r\n}\r\n\r\nfunction intRangeValidatorCtor(validatorName: string, minValue: number, maxValue: number, context: any) {\r\n  context = context || {};\r\n  if (minValue !== undefined) { context.min = minValue; }\r\n  if (maxValue !== undefined) { context.max = maxValue; }\r\n  let templateExists = context.messageTemplate || Validator.messageTemplates[validatorName];\r\n  if (!templateExists) {\r\n    Validator.messageTemplates[validatorName] = core.formatString(\"'%displayName%' must be an integer between the values of %1 and %2\",\r\n        minValue, maxValue);\r\n  }\r\n  return function () {\r\n    let valFn = function (v: any, ctx: any) {\r\n      if (v == null) return true;\r\n      if (typeof v === \"string\" && ctx && ctx.allowString) {\r\n        v = parseInt(v, 0);\r\n      }\r\n      if ((typeof v === \"number\") && (!isNaN(v)) && Math.floor(v) === v) {\r\n        if (minValue != null && v < minValue) {\r\n          return false;\r\n        }\r\n        if (maxValue != null && v > maxValue) {\r\n          return false;\r\n        }\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    };\r\n    return new Validator(validatorName, valFn, context);\r\n  };\r\n}\r\n\r\nexport function makeRegExpValidator(validatorName: string, expression: RegExp, defaultMessage?: string | null, context?: any) {\r\n  if (defaultMessage) {\r\n    Validator.messageTemplates[validatorName] = defaultMessage;\r\n  }\r\n  let re = (typeof (expression) === 'string') ? new RegExp(expression) : expression;\r\n  let valFn = function (v: any) {\r\n    // do not invalidate if empty; use a separate required test\r\n    if (v == null || v === '') return true;\r\n    if (typeof (v) !== 'string') return false;\r\n    return re.test(v);\r\n  };\r\n  return new Validator(validatorName, valFn, context);\r\n}\r\n\r\n// http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#JavaScript\r\n\r\n// function luhn(a: string, b: number, c: number, d: number, e: number) {\r\n//   for (d = +a[b = a.length - 1], e = 0; b--; ) {\r\n//     c = +a[b], d += ++e % 2 ? 2 * c % 10 + (c > 4) : c;\r\n//   }\r\n//   return !(d % 10);\r\n// };\r\n\r\nlet  luhn = (function() {\r\n  let luhnArr = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9];\r\n  return function(str: string) \t{\r\n    let counter = 0;\r\n    let incNum: number;\r\n    let odd = false;\r\n    let temp = String(str).replace(/[^\\d]/g, \"\");\r\n    if ( temp.length === 0) return false;\r\n    for (let i = temp.length - 1; i >= 0; --i)  {\r\n      incNum = parseInt(temp.charAt(i), 10);\r\n      counter += (odd = !odd) ? incNum : luhnArr[incNum];\r\n    }\r\n    return (counter % 10 === 0);\r\n  };\r\n})();\r\n\r\n/**\r\nA ValidationError is used to describe a failed validation.\r\n\r\n@class ValidationError\r\n**/\r\n\r\n/**\r\nConstructs a new ValidationError\r\n@method <ctor> ValidationError\r\n\r\n@param validator {Validator || null} The Validator used to create this error, if any.\r\n@param context { ContextObject || null} The Context object used in conjunction with the Validator to create this error.\r\n@param errorMessage { String} The actual error message\r\n@param [key] {String} An optional key used to define a key for this error. One will be created automatically if not provided here.\r\n**/\r\nexport class ValidationError {\r\n  validator?: Validator;\r\n  key: string;\r\n  context: any;\r\n  errorMessage: string;\r\n  property: any; // IProperty\r\n  propertyName: string;\r\n  isServerError: boolean;\r\n\r\n  constructor(validator: Validator | null, context: ValidationContext, errorMessage: string, key?: string) {\r\n    // Error is with isInstanceOf(Validator)\r\n    assertParam(validator, \"validator\").isOptional().isInstanceOf(Validator).check();\r\n    assertParam(errorMessage, \"errorMessage\").isNonEmptyString().check();\r\n    assertParam(key, \"key\").isOptional().isNonEmptyString().check();\r\n    this.validator = validator || undefined;\r\n    context = context || {};\r\n    this.context = context;\r\n    this.errorMessage = errorMessage;\r\n\r\n    this.property = context.property;\r\n    this.propertyName = context.propertyName || (context.property && context.property.name);\r\n\r\n    if (key) {\r\n      this.key = key;\r\n    } else {\r\n      this.key = ValidationError.getKey(validator || errorMessage, this.propertyName);\r\n    }\r\n    this.isServerError = false;\r\n  }\r\n\r\n\r\n  /**\r\n  The Validator associated with this ValidationError.\r\n\r\n  __readOnly__\r\n  @property validator {Validator}\r\n  **/\r\n\r\n  /**\r\n  A 'context' object associated with this ValidationError.\r\n\r\n  __readOnly__\r\n  @property context {Object}\r\n  **/\r\n\r\n  /**\r\n  The DataProperty or NavigationProperty associated with this ValidationError.\r\n\r\n  __readOnly__\r\n  @property property {DataProperty|NavigationProperty}\r\n  **/\r\n\r\n  /**\r\n  The property name associated with this ValidationError. This will be a \"property path\" for any properties of a complex object.\r\n\r\n  __readOnly__\r\n  @property propertyName {String}\r\n  **/\r\n\r\n  /**\r\n  The error message associated with the ValidationError.\r\n\r\n  __readOnly__\r\n  @property errorMessage {string}\r\n  **/\r\n\r\n  /**\r\n  The key by which this validation error may be removed from a collection of ValidationErrors.\r\n\r\n  __readOnly__\r\n  @property key {string}\r\n  **/\r\n\r\n  /**\r\n  Whether this is a server error.\r\n\r\n  __readOnly__\r\n  @property isServerError {bool}\r\n  **/\r\n\r\n\r\n  /**\r\n  Composes a ValidationError 'key' given a validator or an errorName and an optional propertyName\r\n  @method getKey\r\n  @static\r\n  @param validator {ValidatorOrErrorKey} A Validator or an \"error name\" if no validator is available.\r\n  @param [propertyName] A property name\r\n  @return {String} A ValidationError 'key'\r\n  **/\r\n  public static getKey(validatorOrErrorName: Validator | string, propertyName?: string) {\r\n    let name = (typeof validatorOrErrorName === 'string') ? validatorOrErrorName : validatorOrErrorName.name;\r\n    return name + (propertyName ? \":\" + propertyName : \"\");\r\n  }\r\n\r\n}\r\n\r\n\r\n","import { core } from './core';\r\nimport { BreezeEnum } from './enum';\r\nimport { Validator } from './validate';\r\n\r\nlet _localTimeRegex = /.\\d{3}$/;\r\n\r\n/**  \r\nDataType is an 'Enum' containing all of the supported data types.\r\n@dynamic\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  /** Whether to quote the json value when formatting this DataType for OData. */\r\n  declare quoteJsonOData?: boolean;\r\n\r\n  /** The constructor function to create a [[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  @return 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  @return 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  @return value appropriate for this DataType \r\n  **/\r\n  parse?(source: any, sourceTypeName: string): any;\r\n  /** \r\n  Optional function to format this DataType for OData queries.\r\n  @return value appropriate for OData query   \r\n  **/\r\n  fmtOData?(value: any): 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  @return 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  @return the next concurrency value, which may be a function of the previousValue.\r\n  **/\r\n  getConcurrencyValue?(previousValue?: any): any;\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  static String = new DataType({\r\n    defaultValue: \"\",\r\n    parse: coerceToString,\r\n    fmtOData: fmtString,\r\n    getNext: getNextString\r\n  });\r\n\r\n  static Int64 = new DataType({\r\n    defaultValue: 0,\r\n    isNumeric: true,\r\n    isInteger: true,\r\n    quoteJsonOData: true,\r\n    parse: coerceToInt,\r\n    fmtOData: makeFloatFmt(\"L\"),\r\n    getNext: getNextNumber\r\n  });\r\n\r\n  static Int32 = new DataType({\r\n    defaultValue: 0,\r\n    isNumeric: true,\r\n    isInteger: true,\r\n    parse: coerceToInt,\r\n    fmtOData: fmtInt,\r\n    getNext: getNextNumber\r\n  });\r\n\r\n  static Int16 = new DataType({\r\n    defaultValue: 0,\r\n    isNumeric: true,\r\n    isInteger: true,\r\n    parse: coerceToInt,\r\n    fmtOData: fmtInt,\r\n    getNext: getNextNumber\r\n  });\r\n\r\n  static Byte = new DataType({\r\n    defaultValue: 0,\r\n    isNumeric: true,\r\n    isInteger: true,\r\n    parse: coerceToInt,\r\n    fmtOData: fmtInt\r\n  });\r\n\r\n  static Decimal = new DataType({\r\n    defaultValue: 0,\r\n    isNumeric: true,\r\n    quoteJsonOData: true,\r\n    isFloat: true,\r\n    parse: coerceToFloat,\r\n    fmtOData: makeFloatFmt(\"m\"),\r\n    getNext: getNextNumber\r\n  });\r\n\r\n  static Double = new DataType({\r\n    defaultValue: 0,\r\n    isNumeric: true,\r\n    isFloat: true,\r\n    parse: coerceToFloat,\r\n    fmtOData: makeFloatFmt(\"d\"),\r\n    getNext: getNextNumber\r\n  });\r\n\r\n  static Single = new DataType({\r\n    defaultValue: 0,\r\n    isNumeric: true,\r\n    isFloat: true,\r\n    parse: coerceToFloat,\r\n    fmtOData: makeFloatFmt(\"f\"),\r\n    getNext: getNextNumber\r\n  });\r\n\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: function (value: any) { return value && value.getTime && (new Date(value.getYear(), value.getMonth(), value.getDate())).getTime(); }, // dates don't perform equality comparisons properly\r\n    fmtOData: fmtDateOnly,\r\n    getNext: getNextDateTime,\r\n    getConcurrencyValue: getConcurrencyDateTime\r\n  });\r\n\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    fmtOData: fmtDateTime,\r\n    getNext: getNextDateTime,\r\n    getConcurrencyValue: getConcurrencyDateTime\r\n  });\r\n\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    fmtOData: fmtDateTimeOffset,\r\n    getNext: getNextDateTime,\r\n    getConcurrencyValue: getConcurrencyDateTime\r\n  });\r\n\r\n  static Time = new DataType({\r\n    defaultValue: \"PT0S\",\r\n    fmtOData: fmtTime,\r\n    parseRawValue: DataType.parseTimeFromServer\r\n  });\r\n\r\n  static Boolean = new DataType({\r\n    defaultValue: false,\r\n    parse: coerceToBool,\r\n    fmtOData: fmtBoolean\r\n  });\r\n\r\n  static Guid = new DataType({\r\n    defaultValue: \"00000000-0000-0000-0000-000000000000\",\r\n    parse: coerceToGuid,\r\n    fmtOData: fmtGuid,\r\n    getNext: getNextGuid,\r\n    parseRawValue: function (val: string) { return val.toLowerCase(); },\r\n    getConcurrencyValue: core.getUuid\r\n  });\r\n\r\n  static Binary = new DataType({\r\n    defaultValue: null,\r\n    fmtOData: fmtBinary,\r\n    parseRawValue: parseRawBinary\r\n  });\r\n\r\n  static Undefined = new DataType({\r\n    defaultValue: undefined,\r\n    fmtOData: fmtUndefined\r\n  });\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  /** Returns the DataType for a specified EDM type name.\r\n  **/\r\n  static fromEdmDataType(typeName: string) {\r\n    let dt: DataType | undefined;\r\n    let parts = typeName.split(\".\");\r\n    if (parts.length > 1) {\r\n      let simpleName = parts[1];\r\n      if (simpleName === \"image\") {\r\n        // hack\r\n        dt = DataType.Byte;\r\n      } else if (parts.length === 2) {\r\n        dt = DataType.fromName(simpleName) || DataType.Undefined;\r\n      } else {\r\n        // enum\r\n        // dt = DataType.Int32;\r\n        dt = DataType.String;\r\n      }\r\n    }\r\n\r\n    return dt;\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  static parseTimeFromServer(source: any) {\r\n    if (typeof source === 'string') {\r\n      return source;\r\n    }\r\n    // ODATA v3 format\r\n    if (source && source.__edmType === 'Edm.Time') {\r\n      let seconds = Math.floor(source.ms / 1000);\r\n      return 'PT' + seconds + 'S';\r\n    }\r\n    return source;\r\n  }\r\n\r\n  static parseDateAsUTC(source: any) {\r\n    if (typeof source === 'string') {\r\n      // convert to UTC string if no time zone specifier.\r\n      let isLocalTime = _localTimeRegex.test(source);\r\n      // var isLocalTime = !hasTimeZone(source);\r\n      source = isLocalTime ? source + 'Z' : source;\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\nError['x'] = DataType._resetConstants();\r\nError['x'] = DataType.resolveSymbols();\r\nError['x'] = DataType.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.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.Undefined:\r\n      return Validator.none;\r\n  }\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 core.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(val);\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\nfunction fmtString(val: any) {\r\n  return val == null ? null : \"'\" + val.replace(/'/g, \"''\") + \"'\";\r\n}\r\n\r\nfunction fmtInt(val: any) {\r\n  return val == null ? null : ((typeof val === \"string\") ? parseInt(val, 10) : val);\r\n}\r\n\r\nfunction makeFloatFmt(fmtSuffix: string) {\r\n  return function (val: any) {\r\n    if (val == null) return null;\r\n    if (typeof val === \"string\") {\r\n      val = parseFloat(val);\r\n    }\r\n    return val + fmtSuffix;\r\n  };\r\n}\r\n\r\nfunction fmtDateTime(val: Date) {\r\n  if (val == null) return null;\r\n  try {\r\n    return \"datetime'\" + val.toISOString() + \"'\";\r\n  } catch (e) {\r\n    throwError(\"'%1' is not a valid dateTime\", val);\r\n  }\r\n}\r\n\r\nfunction fmtDateOnly(val: Date) {\r\n  if (val == null) return null;\r\n  try {\r\n    return \"date'\" + val.toISOString().substring(0, 10) + \"'\";\r\n  } catch (e) {\r\n    throwError(\"'%1' is not a valid dateTime\", val);\r\n  }\r\n}\r\n\r\nfunction fmtDateTimeOffset(val: Date) {\r\n  if (val == null) return null;\r\n  try {\r\n    return \"datetimeoffset'\" + val.toISOString() + \"'\";\r\n  } catch (e) {\r\n    throwError(\"'%1' is not a valid dateTime\", val);\r\n  }\r\n}\r\n\r\nfunction fmtTime(val: any) {\r\n  if (val == null) return null;\r\n  if (!core.isDuration(val)) {\r\n    throwError(\"'%1' is not a valid ISO 8601 duration\", val);\r\n  }\r\n  return \"time'\" + val + \"'\";\r\n}\r\n\r\nfunction fmtGuid(val: any) {\r\n  if (val == null) return null;\r\n  if (!core.isGuid(val)) {\r\n    throwError(\"'%1' is not a valid guid\", val);\r\n  }\r\n  return \"guid'\" + val + \"'\";\r\n}\r\n\r\nfunction fmtBoolean(val: any) {\r\n  if (val == null) return null;\r\n  if (typeof val === \"string\") {\r\n    return val.trim().toLowerCase() === \"true\";\r\n  } else {\r\n    return !!val;\r\n  }\r\n}\r\n\r\nfunction fmtBinary(val: any) {\r\n  if (val == null) return val;\r\n  return \"binary'\" + val + \"'\";\r\n}\r\n\r\n// TODO: use __identity instead;\r\nfunction fmtUndefined(val: any) {\r\n  return val;\r\n}\r\n\r\nfunction throwError(msg: string, val: any) {\r\n  msg = core.formatString(msg, val);\r\n  throw new Error(msg);\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","import { BreezeEnum } from './enum';\r\n\r\n/**\r\nEntityState is an 'Enum' containing all of the valid states for an 'Entity'.\r\n**/\r\nexport class EntityState extends BreezeEnum {\r\n\r\n  /** The 'Unchanged' state. **/\r\n  static Unchanged = new EntityState();\r\n  /**  The 'Added' state.  **/\r\n  static Added = new EntityState();\r\n  /**  The 'Modified' state.   **/\r\n  static Modified = new EntityState();\r\n  /**  The 'Deleted' state.  **/\r\n  static Deleted = new EntityState();\r\n  /**  The 'Detached' state.  **/\r\n  static Detached = new EntityState();\r\n\r\n  /**\r\n  Returns whether an entityState instance is EntityState.Unchanged.\r\n  >     var es = anEntity.entityAspect.entityState;\r\n  >     return es.isUnchanged();\r\n\r\n  is the same as\r\n  >     return es === EntityState.Unchanged;\r\n  **/\r\n  isUnchanged() {\r\n    return this === EntityState.Unchanged;\r\n  }\r\n\r\n  /**\r\n  Return whether an entityState instance is EntityState.Added.\r\n  \r\n  >     var es = anEntity.entityAspect.entityState;\r\n  >     return es.isAdded();\r\n\r\n  is the same as\r\n  >     return es === EntityState.Added;\r\n  **/\r\n  isAdded() {\r\n    return this === EntityState.Added;\r\n  }\r\n\r\n  /**\r\n  Returns whether an entityState instance is EntityState.Modified.\r\n  >     var es = anEntity.entityAspect.entityState;\r\n  >     return es.isModified();\r\n\r\n  is the same as\r\n  >     return es === EntityState.Modified;\r\n  **/\r\n  isModified() {\r\n    return this === EntityState.Modified;\r\n  }\r\n\r\n  /**\r\n  Returns whether an entityState instance is EntityState.Deleted.\r\n  >     var es = anEntity.entityAspect.entityState;\r\n  >     return es.isDeleted();\r\n\r\n  is the same as\r\n  \r\n  >     return es === EntityState.Deleted;\r\n  **/\r\n  isDeleted() {\r\n    return this === EntityState.Deleted;\r\n  }\r\n\r\n  /**\r\n  Returns whether an entityState instance is EntityState.Detached.\r\n  >     var es = anEntity.entityAspect.entityState;\r\n  >     return es.isDetached();\r\n\r\n  is the same as\r\n  >     return es === EntityState.Detached;\r\n  **/\r\n  isDetached() {\r\n    return this === EntityState.Detached;\r\n  }\r\n\r\n  /** Return true if EntityState is Deleted or Detached */\r\n  isDeletedOrDetached() {\r\n    return this === EntityState.Detached || this === EntityState.Detached;\r\n  }\r\n\r\n  /**\r\n  Returns whether an entityState instance is EntityState.Unchanged or EntityState.Modified.\r\n  >     var es = anEntity.entityAspect.entityState;\r\n  >     return es.isUnchangedOrModified();\r\n\r\n  is the same as\r\n  >     return es === EntityState.Unchanged || es === EntityState.Modified\r\n  **/\r\n  isUnchangedOrModified() {\r\n    return this === EntityState.Unchanged || this === EntityState.Modified;\r\n  }\r\n\r\n  /** Return true if EntityStatis is Added or Modified */\r\n  isAddedOrModified() {\r\n    return this === EntityState.Added || this === EntityState.Modified;\r\n  }\r\n\r\n  /** Returns whether an entityState instance is EntityState.Added or EntityState.Modified or EntityState.Deleted.\r\n  >     var es = anEntity.entityAspect.entityState;\r\n  >     return es.isAddedModifiedOrDeleted();\r\n\r\n  is the same as\r\n  >     return es === EntityState.Added || es === EntityState.Modified || es === EntityState.Deleted\r\n  **/\r\n  isAddedModifiedOrDeleted() {\r\n    return this === EntityState.Added ||\r\n      this === EntityState.Modified ||\r\n      this === EntityState.Deleted;\r\n  }\r\n\r\n}\r\nEntityState.prototype._$typeName = \"EntityState\";\r\nError['x'] = EntityState.resolveSymbols();\r\n","import { BreezeEnum} from './enum';\r\n\r\n/** EntityAction is an 'Enum' containing all of the valid actions that can occur to an 'Entity'. \r\n \r\n*/\r\n\r\nexport class EntityAction extends BreezeEnum {\r\n\r\n  /** Entity was attached via an AttachEntity call. */\r\n  static Attach = new EntityAction( { _isAttach: true });\r\n  /**  Entity was attached as a result of a query. */\r\n  static AttachOnQuery = new EntityAction({ _isAttach: true});\r\n  /**  Entity was attached as a result of an import. */\r\n  static AttachOnImport = new EntityAction({ _isAttach: true});\r\n\r\n  /** Entity was detached */\r\n  static Detach = new EntityAction( { _isDetach: true });\r\n\r\n  /** Properties on the entity were merged as a result of a query. */\r\n  static MergeOnQuery = new EntityAction({ _isModification: true });\r\n  /** Properties on the entity were merged as a result of an import. */\r\n  static MergeOnImport = new EntityAction({ _isModification: true });\r\n  /** Properties on the entity were merged as a result of a save */\r\n  static MergeOnSave = new EntityAction({ _isModification: true });\r\n\r\n  /** A property on the entity was changed. */\r\n  static PropertyChange = new EntityAction({ _isModification: true});\r\n\r\n  /** The EntityState of the entity was changed. */\r\n  static EntityStateChange = new EntityAction();\r\n\r\n  /** AcceptChanges was called on the entity, or its entityState was set to Unmodified. */\r\n  static AcceptChanges = new EntityAction();\r\n  /** RejectChanges was called on the entity. */\r\n  static RejectChanges = new EntityAction({ _isModification: true});\r\n\r\n  /** The EntityManager was cleared.  All entities detached. */\r\n  static Clear = new EntityAction({ _isDetach: true});\r\n\r\n  /** @hidden @internal */\r\n  declare _isAttach?: boolean;\r\n  /** @hidden @internal */\r\n  declare _isDetach?: boolean;\r\n  /** @hidden @internal */\r\n  declare _isModification: boolean;\r\n  /** Is this an 'attach' operation? ( Attach, AttachOnQuery or AttachOnImport) */\r\n  isAttach() {\r\n    return !!this._isAttach;\r\n  }\r\n  /** Is this a 'detach' operation? ( Detach, Clear) */\r\n  isDetach() {\r\n    return !!this._isDetach;\r\n  }\r\n  /** Is this a 'modification' operation? ( PropertyChange, MergeOnQuery, MergeOnSave, MergeOnImport, RejectChanges) */\r\n  isModification() {\r\n    return !!this._isModification;\r\n  }\r\n}\r\nEntityAction.prototype._$typeName = \"EntityAction\";\r\nError['x'] = EntityAction.resolveSymbols();\r\n\r\n\r\n\r\n","import { core } from './core';\r\nimport { assertParam } from './assert-param';\r\nimport { EntityType, MetadataStore } from './entity-metadata';\r\nimport { DataType } from './data-type';\r\n\r\n/**\r\nAn EntityKey is an object that represents the unique identity of an entity.  EntityKey's are immutable.\r\n\r\n\r\n**/\r\nexport class EntityKey {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // actually placed on prototype\r\n  /** @hidden @internal */\r\n  static ENTITY_KEY_DELIMITER = \":::\";\r\n  /**  The 'EntityType' that this is a key for. __Read Only__ */\r\n  entityType: EntityType;\r\n  /**  An array of the values for this key. This will usually only have a single element, \r\n  unless the entity type has a multipart key. __Read Only__ */\r\n  values: any[];\r\n  /** @hidden @internal */\r\n  _keyInGroup: string;\r\n  /** @hidden @internal */\r\n  _subtypes: EntityType[];\r\n\r\n  /**\r\n  Constructs a new EntityKey.  Each entity within an EntityManager will have a unique EntityKey.\r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     var empType = em1.metadataStore.getEntityType(\"Employee\");\r\n  >     var entityKey = new EntityKey(empType, 1);\r\n\r\n  EntityKey's may also be found by calling EntityAspect.getKey()\r\n  >     // assume employee1 is an existing Employee entity\r\n  >     var empKey = employee1.entityAspect.getKey();\r\n\r\n  Multipart keys are created by passing an array as the 'keyValues' parameter\r\n  >     var empTerrType = em1.metadataStore.getEntityType(\"EmployeeTerritory\");\r\n  >     var empTerrKey = new EntityKey(empTerrType, [ 1, 77]);\r\n  >     // The order of the properties in the 'keyValues' array must be the same as that\r\n  >     // returned by empTerrType.keyProperties\r\n  @param entityType - The [[EntityType]] of the entity.\r\n  @param keyValues - A single value or an array of values. \r\n  */\r\n  constructor(entityType: EntityType, keyValues: any) {\r\n    assertParam(entityType, \"entityType\").isInstanceOf(EntityType).check();\r\n    let subtypes = entityType.getSelfAndSubtypes();\r\n    if (subtypes.length > 1) {\r\n      this._subtypes = subtypes.filter(function (st) {\r\n        return st.isAbstract === false;\r\n      });\r\n    }\r\n\r\n    if (!Array.isArray(keyValues)) {\r\n      keyValues = [keyValues];\r\n    }\r\n\r\n    this.entityType = entityType;\r\n    entityType.keyProperties.forEach(function (kp, i) {\r\n      // insure that guid keys are comparable.\r\n      if (kp.dataType === DataType.Guid) {\r\n        keyValues[i] = keyValues[i] && keyValues[i].toLowerCase ? keyValues[i].toLowerCase() : keyValues[i];\r\n      }\r\n    });\r\n\r\n    this.values = keyValues;\r\n    this._keyInGroup = EntityKey.createKeyString(keyValues);\r\n\r\n  }\r\n\r\n\r\n  toJSON() {\r\n    return {\r\n      entityType: this.entityType.name,\r\n      values: this.values\r\n    };\r\n  }\r\n\r\n  static fromJSON(json: any, metadataStore: MetadataStore) {\r\n    let et = metadataStore._getStructuralType(json.entityType, true) as EntityType;\r\n    return new EntityKey(et, json.values);\r\n  }\r\n\r\n  /**\r\n  Used to compare EntityKeys are determine if they refer to the same Entity.\r\n  There is also an static version of 'equals' with the same functionality.\r\n  \r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      var empType = em1.metadataStore.getEntityType(\"Employee\");\r\n  >      var empKey1 = new EntityKey(empType, 1);\r\n  >      // assume employee1 is an existing Employee entity\r\n  >      var empKey2 = employee1.entityAspect.getKey();\r\n  >      if (empKey1.equals(empKey2)) {\r\n  >          // do something  ...\r\n  >      }\r\n  **/\r\n  equals(entityKey: EntityKey): boolean {\r\n    if (!(entityKey instanceof EntityKey)) return false;\r\n    return (this.entityType === entityKey.entityType) &&\r\n      core.arrayEquals(this.values, entityKey.values);\r\n  }\r\n\r\n  /*\r\n  Returns a human readable representation of this EntityKey.\r\n  */\r\n  toString(altEntityType?: EntityType) {\r\n    return (altEntityType || this.entityType).name + '-' + this._keyInGroup;\r\n  }\r\n\r\n  /**\r\n  Used to compare EntityKeys are determine if they refer to the same Entity.\r\n  There is also an instance version of 'equals' with the same functionality.\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      var empType = em1.metadataStore.getEntityType(\"Employee\");\r\n  >      var empKey1 = new EntityKey(empType, 1);\r\n  >      // assume employee1 is an existing Employee entity\r\n  >      var empKey2 = employee1.entityAspect.getKey();\r\n  >      if (EntityKey.equals(empKey1, empKey2)) {\r\n  >          // do something  ...\r\n  >      }\r\n  **/\r\n  static equals(k1: EntityKey, k2: EntityKey) {\r\n    if (!(k1 instanceof EntityKey)) return false;\r\n    return k1.equals(k2);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  // TODO: we may want to compare to default values later.\r\n  _isEmpty() {\r\n    return this.values.join(\"\").length === 0;\r\n  }\r\n\r\n  /** hidden */\r\n  // TODO: think about giving _ prefix or documenting.\r\n  static createKeyString(keyValues: any[]) {\r\n    return keyValues.join(EntityKey.ENTITY_KEY_DELIMITER);\r\n  }\r\n\r\n}\r\nEntityKey.prototype._$typeName = \"EntityKey\";\r\n\r\n\r\n","import { core } from './core';\r\nimport { BreezeEnum } from './enum';\r\nimport { assertConfig } from './assert-param';\r\n\r\n/**\r\nMergeStrategy is an 'Enum' that determines how entities are merged into an EntityManager.\r\n\r\n@class MergeStrategy\r\n@static\r\n**/\r\nexport class MergeStrategy extends BreezeEnum {\r\n\r\n  /**\r\n  MergeStrategy.PreserveChanges updates the cached entity with the incoming values unless the cached entity is in a changed\r\n  state (added, modified, deleted) in which case the incoming values are ignored. The updated cached entity’s EntityState will\r\n  remain [[EntityState.Unchanged]] unless you’re importing entities in which case the new EntityState will\r\n  be that of the imported entities.\r\n  **/\r\n  static PreserveChanges = new MergeStrategy();\r\n  /**\r\n  MergeStrategy.OverwriteChanges always updates the cached entity with incoming values even if the entity is in\r\n  a changed state (added, modified, deleted). After the merge, the pending changes are lost.\r\n  The new EntityState will be  [[EntityState/Unchanged]] unless you’re importing entities\r\n  in which case the new EntityState will be that of the imported entities.\r\n  **/\r\n  static OverwriteChanges = new MergeStrategy();\r\n\r\n  /**\r\n  SkipMerge is used to ignore incoming values. Adds the incoming entity to the cache only if there is no cached entity with the same key.\r\n  This is the fastest merge strategy but your existing cached data will remain “stale”.\r\n  **/\r\n  static SkipMerge = new MergeStrategy();\r\n\r\n  /**\r\n  Disallowed is used to throw an exception if there is an incoming entity with the same key as an entity already in the cache.\r\n  Use this strategy when you want to be sure that the incoming entity is not already in cache.\r\n  This is the default strategy for EntityManager.attachEntity.\r\n  **/\r\n  static Disallowed = new MergeStrategy();\r\n\r\n\r\n}\r\nMergeStrategy.prototype._$typeName = \"MergeStrategy\";\r\nError['x'] = MergeStrategy.resolveSymbols();\r\n\r\n/**\r\nFetchStrategy is an 'Enum' that determines how and where entities are retrieved from as a result of a query.\r\n**/\r\nexport class FetchStrategy extends BreezeEnum {\r\n\r\n  /**\r\n  FromServer is used to tell the query to execute the query against a remote data source on the server.\r\n  **/\r\n  static FromServer = new FetchStrategy();\r\n  /**\r\n  FromLocalCache is used to tell the query to execute the query against a local EntityManager instead of going to a remote server.\r\n  **/\r\n  static FromLocalCache = new FetchStrategy();\r\n\r\n}\r\nFetchStrategy.prototype._$typeName = \"FetchStrategy\";\r\nError['x'] = FetchStrategy.resolveSymbols();\r\n\r\n/** Configuration info to be passed to the [[QueryOptions]] constructor. */\r\nexport interface QueryOptionsConfig {\r\n  /** The [[FetchStrategy]] to use with any queries.*/\r\n  fetchStrategy?: FetchStrategy;\r\n  /** The [[MergeStrategy]] to use with any queries.*/\r\n  mergeStrategy?: MergeStrategy;\r\n  /** Whether to include cached deleted entities in a query result (false by default). __Read Only__ */\r\n  includeDeleted?: boolean;\r\n}\r\n\r\n/**\r\nA QueryOptions instance is used to specify the 'options' under which a query will occur.\r\n**/\r\nexport class QueryOptions {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string;\r\n  /** The [[FetchStrategy]] to use with any queries. __Read Only__ */\r\n  declare fetchStrategy: FetchStrategy;\r\n  /** The [[MergeStrategy]] to use with any queries. __Read Only__ */\r\n  declare mergeStrategy: MergeStrategy;\r\n  /** Whether to include cached deleted entities in a query result (false by default). __Read Only__ */\r\n  declare includeDeleted: boolean;\r\n\r\n  /**\r\n  The default instance for use whenever QueryOptions are not specified.\r\n  **/\r\n  static defaultInstance = new QueryOptions({\r\n    fetchStrategy: FetchStrategy.FromServer,\r\n    mergeStrategy: MergeStrategy.PreserveChanges,\r\n    includeDeleted: false\r\n  });\r\n\r\n  /**\r\n  QueryOptions constructor\r\n  >     var newQo = new QueryOptions( { mergeStrategy: MergeStrategy.OverwriteChanges });\r\n  >     // assume em1 is a preexisting EntityManager\r\n  >     em1.setProperties( { queryOptions: newQo });\r\n  Any QueryOptions property that is not defined will be defaulted from any QueryOptions defined at a higher level in the breeze hierarchy, i.e.\r\n  -  from query.queryOptions\r\n  -  to   entityManager.queryOptions\r\n  -  to   QueryOptions.defaultInstance;\r\n\r\n  @param config - A configuration object.\r\n  **/\r\n  constructor(config?: QueryOptionsConfig) {\r\n    QueryOptions._updateWithConfig(this, config);\r\n  }\r\n\r\n  static resolve(queryOptionsArray: any[]) {\r\n    return new QueryOptions(core.resolveProperties(queryOptionsArray, [\"fetchStrategy\", \"mergeStrategy\", \"includeDeleted\"]));\r\n  }\r\n\r\n  /**\r\n  Returns a copy of this QueryOptions with the specified [[MergeStrategy]],\r\n  [[FetchStrategy]], or 'includeDeleted' option applied.\r\n  >     // Given an EntityManager instance, em\r\n  >     var queryOptions = em.queryOptions.using(MergeStrategy.PreserveChanges);\r\n\r\n  or\r\n  >     var queryOptions = em.queryOptions.using(FetchStrategy.FromLocalCache);\r\n\r\n  or\r\n  >     var queryOptions = em.queryOptions.using({ mergeStrategy: MergeStrategy.OverwriteChanges });\r\n\r\n  or\r\n  >     var queryOptions = em.queryOptions.using({\r\n  >        includeDeleted: true,\r\n  >        fetchStrategy:  FetchStrategy.FromLocalCache \r\n  >     });\r\n  @param config - A configuration object or a standalone [[MergeStrategy]] or [[FetchStrategy]] \r\n  @return A new QueryOptions instance.\r\n  **/\r\n  using(qoConfig: QueryOptionsConfig | MergeStrategy | FetchStrategy) {\r\n    if (!qoConfig) return this;\r\n    let result = new QueryOptions(this);\r\n    if ( qoConfig instanceof MergeStrategy) {\r\n      qoConfig = { mergeStrategy: qoConfig };\r\n    } else if ( qoConfig instanceof FetchStrategy) {\r\n      qoConfig = { fetchStrategy: qoConfig };\r\n    }\r\n    return QueryOptions._updateWithConfig(result, qoConfig);\r\n  }\r\n\r\n  /**\r\n  Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.\r\n  The current instance is returned unchanged.\r\n  >     var newQo = new QueryOptions( { mergeStrategy: MergeStrategy.OverwriteChanges });\r\n  >     newQo.setAsDefault();\r\n  **/\r\n  setAsDefault() {\r\n    return core.setAsDefault(this, QueryOptions);\r\n  }\r\n\r\n  toJSON() {\r\n    return core.toJson(this, {\r\n      fetchStrategy: null,\r\n      mergeStrategy: null,\r\n      includeDeleted: false\r\n    });\r\n  }\r\n\r\n  static fromJSON(json: any) {\r\n    return new QueryOptions({\r\n      fetchStrategy: FetchStrategy.fromName(json.fetchStrategy),\r\n      mergeStrategy: MergeStrategy.fromName(json.mergeStrategy),\r\n      includeDeleted: json.includeDeleted === true\r\n    });\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  private static _updateWithConfig(obj: QueryOptions, config?: QueryOptionsConfig) {\r\n    if (config) {\r\n      assertConfig(config)\r\n        .whereParam(\"fetchStrategy\").isEnumOf(FetchStrategy).isOptional()\r\n        .whereParam(\"mergeStrategy\").isEnumOf(MergeStrategy).isOptional()\r\n        .whereParam(\"includeDeleted\").isBoolean().isOptional()\r\n        .applyAll(obj);\r\n    }\r\n    return obj;\r\n  }\r\n\r\n}\r\nQueryOptions.prototype._$typeName = \"QueryOptions\";\r\n","import { core } from './core';\r\nimport { EntityType, StructuralType, DataProperty  } from './entity-metadata';\r\nimport { QueryOp } from './entity-query';\r\nimport { DataType  } from './data-type';\r\nimport { EntityAspect, Entity } from './entity-aspect';\r\nimport { LocalQueryComparisonOptions } from './local-query-comparison-options';\r\n\r\nexport interface Op {\r\n  key: string;\r\n  aliases?: string[];\r\n  isFunction?: boolean;\r\n}\r\n\r\n/** @hidden @internal */\r\nexport interface OpMap {\r\n  [key: string]: Op;\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport interface Visitor {\r\n\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport interface VisitContext {\r\n  entityType?: EntityType;\r\n  // usesNameOnServer?: boolean;\r\n  toNameOnServer?: boolean;\r\n  useExplicitDataType?: boolean;\r\n  visitor?: Visitor;\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport interface ExpressionContext {\r\n  entityType?: EntityType;\r\n  usesNameOnServer?: boolean;\r\n  dataType?: DataType | string;\r\n  isRHS?: boolean;\r\n  isFnArg?: boolean;\r\n}\r\n\r\n/**\r\nUsed to define a 'where' predicate for an [[EntityQuery]].  Predicates are immutable, which means that any\r\nmethod that would modify a Predicate actually returns a new Predicate.\r\n**/\r\nexport class Predicate {\r\n  declare op: Op;\r\n  /** @hidden @internal */\r\n  declare _entityType?: EntityType;\r\n  /** @hidden @internal */\r\n  declare aliasMap: OpMap;\r\n  declare visitorMethodName: string;\r\n\r\n\r\n  /**\r\n  Predicate constructor\r\n  >     let p1 = new Predicate(\"CompanyName\", \"StartsWith\", \"B\");\r\n  >     let query = new EntityQuery(\"Customers\").where(p1);\r\n\r\n  or\r\n  >     let p2 = new Predicate(\"Region\", FilterQueryOp.Equals, null);\r\n  >     let query = new EntityQuery(\"Customers\").where(p2);\r\n  @param property - A property name, a nested property name or an expression involving a property name.\r\n  @param operator - \r\n  @param value - This will be treated as either a property expression or a literal depending on context.  In general,\r\n  if the value can be interpreted as a property expression it will be, otherwise it will be treated as a literal.\r\n  In most cases this works well, but you can also force the interpretation by making the value argument itself an object with a 'value'\r\n  property and an 'isLiteral' property set to either true or false.  Breeze also tries to infer the dataType of any\r\n  literal based on context, if this fails you can force this inference by making the value argument an object with a\r\n  'value' property and a 'dataType' property set to one of the breeze.DataType enumeration instances.\r\n  **/\r\n  constructor(...args: any[]) {\r\n    if (args.length === 0) return;\r\n    if (!(this instanceof Predicate)) {\r\n      return new Predicate(...<any>args);\r\n    }\r\n    return Predicate.create(...<any>args);\r\n  }\r\n\r\n  /**\r\n  Same as using the ctor.\r\n  >      // so \r\n  >      let p = Predicate.create(a, b, c);\r\n  >      // is the same as \r\n  >      let p = new Predicate(a, b, c); \r\n  @param property -  A property name, a nested property name or an expression involving a property name.\r\n  @param operator - the filter query operator.\r\n  @param value - This will be treated as either a property expression or a literal depending on context.  In general,\r\n  if the value can be interpreted as a property expression it will be, otherwise it will be treated as a literal.\r\n  In most cases this works well, but you can also force the interpretation by making the value argument itself an object with a 'value'\r\n  property and an 'isLiteral' property set to either true or false.  Breeze also tries to infer the dataType of any\r\n  literal based on context, if this fails you can force this inference by making the value argument an object with a\r\n  'value' property and a 'dataType' property set to one of the breeze.DataType enumeration instances.\r\n  **/\r\n  static create(...args: any[]) {\r\n    // can be called from std javascript without new ( legacy )\r\n\r\n    // empty ctor is used by all subclasses.\r\n    if (args.length === 0) return new Predicate();\r\n    if (args.length === 1) {\r\n      // possibilities:\r\n      //      Predicate([ aPredicate ]) or  Predicate([\"freight\", \">\", 100]) - an array\r\n      //      Predicate(aPredicate) - a predicate\r\n      //      Predicate( \"freight gt 100\" }  // passthru ( i.e. maybe an odata string) - a string\r\n      //      Predicate( { freight: { \">\": 100 } }) - an object\r\n      let arg = arguments[0];\r\n      if (Array.isArray(arg)) {\r\n        if (arg.length === 1) {\r\n          // recurse\r\n          return new Predicate(arg[0]);\r\n        } else {\r\n          return createPredicateFromArray(arg);\r\n        }\r\n      } else if (arg instanceof Predicate) {\r\n        return arg;\r\n      } else if (typeof arg === 'string') {\r\n        return new PassthruPredicate(arg);\r\n      } else {\r\n        return createPredicateFromObject(arg);\r\n      }\r\n    } else {\r\n      // 2 possibilities\r\n      //      Predicate(\"freight\", \">\", 100\");\r\n      //      Predicate(\"orders\", \"any\", \"freight\",  \">\", 950);\r\n      return createPredicateFromArray(args);\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\r\n    // noop here;\r\n  }\r\n\r\n  /**\r\n  Creates a 'composite' Predicate by 'and'ing a set of specified Predicates together.\r\n  >      let dt = new Date(88, 9, 12);\r\n  >      let p1 = Predicate.create(\"OrderDate\", \"ne\", dt);\r\n  >      let p2 = Predicate.create(\"ShipCity\", \"startsWith\", \"C\");\r\n  >      let p3 = Predicate.create(\"Freight\", \">\", 100);\r\n  >      let newPred = Predicate.and(p1, p2, p3);\r\n\r\n  or\r\n  >      let preds = [p1, p2, p3];\r\n  >      let newPred = Predicate.and(preds);\r\n  @param predicates - multiple Predicates or an array of Predicate. \r\n  Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\r\n  **/\r\n  static and(...args: any[]) {\r\n    let pred = new AndOrPredicate(\"and\", args);\r\n    // TODO removed below\r\n    // return undefined if empty\r\n    // return pred.op && pred;\r\n    return pred;\r\n  }\r\n\r\n  /**\r\n  Creates a 'composite' Predicate by 'or'ing a set of specified Predicates together.\r\n  >      let dt = new Date(88, 9, 12);\r\n  >      let p1 = Predicate.create(\"OrderDate\", \"ne\", dt);\r\n  >      let p2 = Predicate.create(\"ShipCity\", \"startsWith\", \"C\");\r\n  >      let p3 = Predicate.create(\"Freight\", \">\", 100);\r\n  >      let newPred = Predicate.or(p1, p2, p3);\r\n\r\n  or\r\n  >      let preds = [p1, p2, p3];\r\n  >      let newPred = Predicate.or(preds);\r\n  @param predicates - multiple Predicates or an array of Predicate.\r\n  Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\r\n  **/\r\n  static or(...args: any[]) {\r\n    let pred = new AndOrPredicate(\"or\", args);\r\n    // return pred.op && pred;\r\n    return pred;\r\n  }\r\n\r\n  /**\r\n  Creates a 'composite' Predicate by 'negating' a specified predicate.\r\n  >      let p1 = Predicate.create(\"Freight\", \"gt\", 100);\r\n  >      let not_p1 = Predicate.not(p1);\r\n\r\n  This can also be accomplished using the 'instance' version of the 'not' method\r\n  >      let not_p1 = p1.not();\r\n\r\n  Both of which would be the same as\r\n  >      let not_p1 = Predicate.create(\"Freight\", \"le\", 100);\r\n  **/\r\n  static not(pred: Predicate) {\r\n    return pred.not();\r\n  }\r\n\r\n  // TODO: determine if/where this is used.\r\n  // static extendBinaryPredicateFn(opMap: IOpMap, visitorFn: any) {\r\n  //   let baseVisitorFn = toFunctionVisitor.binaryPredicate;\r\n  //   for (let op in (opMap || {})) {\r\n  //     let config = opMap[op];\r\n  //     config.visitorFn = visitorFn;\r\n  //     updateAliasMap(BinaryPredicate.prototype.aliasMap, op, opMap[op]);\r\n  //   }\r\n  //   if (!toFunctionVisitor.isExtended) {\r\n  //     toFunctionVisitor.binaryPredicate = function (context, expr1Val, expr2Val) {\r\n  //       let visitorFn = this.aliasMap[this.op.key].visitorFn;\r\n  //       if (visitorFn) {\r\n  //         return visitorFn(context, expr1Val, expr2Val);\r\n  //       } else {\r\n  //         return baseVisitorFn(context, expr1Val, expr2Val);\r\n  //       }\r\n  //     };\r\n  //     toFunctionVisitor.isExtended = true;\r\n  //   }\r\n  // };\r\n\r\n  static extendFuncMap (funcMap: {[key: string]: {fn: (...args: any[]) => any, dataType: DataType}}): void {\r\n    for (let func in (funcMap || {})) {\r\n      let config = funcMap[func];\r\n      FnExpr._funcMap[func] = config;\r\n    }\r\n  };\r\n\r\n  /**\r\n  'And's this Predicate with one or more other Predicates and returns a new 'composite' Predicate\r\n  >      let dt = new Date(88, 9, 12);\r\n  >      let p1 = Predicate.create(\"OrderDate\", \"ne\", dt);\r\n  >      let p2 = Predicate.create(\"ShipCity\", \"startsWith\", \"C\");\r\n  >      let p3 = Predicate.create(\"Freight\", \">\", 100);\r\n  >      let newPred = p1.and(p2, p3);\r\n\r\n  or\r\n  >      let preds = [p2, p3];\r\n  >      let newPred = p1.and(preds);\r\n\r\n  The 'and' method is also used to write \"fluent\" expressions\r\n  >      let p4 = Predicate.create(\"ShipCity\", \"startswith\", \"F\")\r\n  >        .and(\"Size\", \"gt\", 2000);\r\n  @param predicates - multiple Predicates or an array of Predicates. \r\n  Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\r\n  **/\r\n  and(...args: any[]) {\r\n    return new AndOrPredicate(\"and\", argsForAndOrPredicates(this, args));\r\n  }\r\n\r\n  /**\r\n  'Or's this Predicate with one or more other Predicates and returns a new 'composite' Predicate\r\n  >      let dt = new Date(88, 9, 12);\r\n  >      let p1 = Predicate.create(\"OrderDate\", \"ne\", dt);\r\n  >      let p2 = Predicate.create(\"ShipCity\", \"startsWith\", \"C\");\r\n  >      let p3 = Predicate.create(\"Freight\", \">\", 100);\r\n  >      let newPred = p1.or(p2, p3);\r\n\r\n  or\r\n  >      let preds = [p2, p3];\r\n  >      let newPred = p1.or(preds);\r\n\r\n  The 'or' method is also used to write \"fluent\" expressions\r\n  >      let p4 = Predicate.create(\"ShipCity\", \"startswith\", \"F\")\r\n  >        .or(\"Size\", \"gt\", 2000);\r\n  @param predicates - multiple Predicates or an array of Predicates. \r\n  Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.\r\n  **/\r\n  or(...args: any[]) {\r\n    return new AndOrPredicate(\"or\", argsForAndOrPredicates(this, args));\r\n  }\r\n\r\n  /**\r\n  Returns the 'negated' version of this Predicate\r\n  >      let p1 = Predicate.create(\"Freight\", \"gt\", 100);\r\n  >      let not_p1 = p1.not();\r\n\r\n  This can also be accomplished using the 'static' version of the 'not' method\r\n  >      let p1 = Predicate.create(\"Freight\", \"gt\", 100);\r\n  >      let not_p1 = Predicate.not(p1);\r\n\r\n  which would be the same as\r\n  >      let not_p1 = Predicate.create(\"Freight\", \"le\", 100);\r\n  **/\r\n  not() {\r\n    return new UnaryPredicate(\"not\", this);\r\n  }\r\n\r\n  //\r\n  toJSON() {\r\n    // toJSON ( part of js standard - takes a single parameter\r\n    // that is either \"\" or the name of the property being serialized.\r\n    return this.toJSONExt({ entityType: this._entityType });\r\n  }\r\n\r\n  /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n  @adapter (see [[IUriBuilderAdapter]])    \r\n  @hidden @internal \r\n  */\r\n  toJSONExt(context: VisitContext) {\r\n    return this.visit(context, toJSONVisitor);\r\n  }\r\n\r\n  /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n  @adapter (see [[IUriBuilderAdapter]])    \r\n  @hidden @internal \r\n  */\r\n  toFunction(context: VisitContext) {\r\n    return this.visit(context, toFunctionVisitor);\r\n  }\r\n\r\n  toString() {\r\n    return JSON.stringify(this);\r\n  }\r\n\r\n  /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n  @adapter (see [[IUriBuilderAdapter]])    \r\n  @hidden @internal \r\n  */\r\n  visit(context: VisitContext, visitor?: Visitor) {\r\n    if (core.isEmpty(context)) {\r\n      context = { entityType: undefined };\r\n    } else if (context instanceof EntityType) {\r\n      context = { entityType: context };\r\n    } else if (!core.hasOwnProperty(context, \"entityType\")) {\r\n      throw new Error(\"All visitor methods must be called with a context object containing at least an 'entityType' property\");\r\n    }\r\n\r\n    if (visitor) {\r\n      context.visitor = visitor;\r\n    }\r\n    let tVisitor = visitor || context.visitor!;\r\n    let fn = tVisitor[this.visitorMethodName];\r\n    if (fn == null) {\r\n      throw new Error(\"Unable to locate method: \" + this.visitorMethodName + \" on visitor\");\r\n    }\r\n\r\n    let entityType = context.entityType;\r\n    // don't bother validating if already done so ( or if no _validate method\r\n    if (this._validate && (entityType == null || this._entityType !== entityType)) {\r\n      // don't need to capture return value because validation fn doesn't have one.\r\n      // TODO: this was old code\r\n      // this._validate(entityType, context.usesNameOnServer);\r\n      this._validate(entityType, context.toNameOnServer);\r\n      this._entityType = entityType;\r\n    }\r\n\r\n    return fn.call(this, context);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _initialize(visitorMethodName: string, opMap: { [key: string]: { aliases?: string[], isFunction?: boolean }} = {}) {\r\n    this.visitorMethodName = visitorMethodName;\r\n    let aliasMap = this.aliasMap = {};\r\n    for (let op in opMap ) {\r\n      updateAliasMap(aliasMap, op, opMap[op] as Op);\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _resolveOp(op: string | QueryOp, okIfNotFound?: boolean) {\r\n    let opStr = (typeof op === \"string\") ? op : op.operator;\r\n    let result = this.aliasMap[opStr.toLowerCase()];\r\n    if (!result && !okIfNotFound) {\r\n      throw new Error(\"Unable to resolve operator: \" + opStr);\r\n    }\r\n    return result;\r\n  }\r\n\r\n}\r\n\r\nfunction createPredicateFromArray(arr: any[]) {\r\n  // TODO: assert that length of the array should be > 3\r\n  // Needs to handle:\r\n  //      [ \"freight\", \">\", 100\"];\r\n  //      [ \"orders\", \"any\", \"freight\",  \">\", 950 ]\r\n  //      [ \"orders\", \"and\", anotherPred ]\r\n  //      [ \"orders\", \"and\", [ \"freight, \">\", 950 ]]\r\n  let json = {};\r\n  let value = {};\r\n  json[arr[0]] = value;\r\n  let op = arr[1];\r\n  op = op.operator || op;  // incoming op will be either a string or a FilterQueryOp\r\n  if (arr.length === 3) {\r\n    value[op] = arr[2];\r\n  } else {\r\n    value[op] = createPredicateFromArray(arr.splice(2));\r\n  }\r\n  return createPredicateFromObject(json);\r\n}\r\n\r\nfunction createPredicateFromObject(obj: Object) {\r\n  if (obj instanceof Predicate) return obj;\r\n\r\n  if (typeof obj !== 'object') {\r\n    throw new Error(\"Unable to convert to a Predicate: \" + obj);\r\n  }\r\n  let keys = Object.keys(obj);\r\n  let preds = keys.map(function (key) {\r\n    return createPredicateFromKeyValue(key, obj[key]);\r\n  });\r\n  return (preds.length === 1) ? preds[0] : new AndOrPredicate(\"and\", preds);\r\n}\r\n\r\nfunction createPredicateFromKeyValue(key: string, value: any): Predicate {\r\n  // { and: [a,b] } key='and', value = [a,b]\r\n  if (AndOrPredicate.prototype._resolveOp(key, true)) {\r\n    return new AndOrPredicate(key, value);\r\n  }\r\n\r\n  // { not: a }  key= 'not', value = a\r\n  if (UnaryPredicate.prototype._resolveOp(key, true)) {\r\n    return new UnaryPredicate(key, value);\r\n  }\r\n\r\n  if ((typeof value !== 'object') || value == null || core.isDate(value)) {\r\n    // { foo: bar } key='foo', value = bar ( where bar is a literal i.e. a string, a number, a boolean or a date.\r\n    return new BinaryPredicate(\"eq\", key, value);\r\n  } else if (core.hasOwnProperty(value, 'value')) {\r\n    // { foo: { value: bar, dataType: xxx} } key='foo', value = bar ( where bar is an object representing a literal\r\n    return new BinaryPredicate(\"eq\", key, value);\r\n  }\r\n\r\n  if (Array.isArray(value)) {\r\n    throw new Error(\"Unable to resolve predicate after the phrase: \" + key);\r\n  }\r\n\r\n  let expr = key;\r\n  let keys = Object.keys(value);\r\n  let preds = keys.map(function (op) {\r\n\r\n    // { a: { any: b } op = 'any', expr=a, value[op] = b\r\n    if (AnyAllPredicate.prototype._resolveOp(op, true)) {\r\n      return new AnyAllPredicate(op, expr, value[op]);\r\n    }\r\n\r\n    if (BinaryPredicate.prototype._resolveOp(op, true)) {\r\n      // { a: { \">\": b }} op = \">\", expr=a, value[op] = b\r\n      return new BinaryPredicate(op, expr, value[op]);\r\n    } else if (core.hasOwnProperty(value[op], 'value')) {\r\n      // { a: { \">\": { value: b, dataType: 'Int32' }} expr = a value[op] = { value: b, dataType: 'Int32' }\r\n      return new BinaryPredicate(\"eq\", expr, value[op]);\r\n    }\r\n\r\n    let msg = core.formatString(\"Unable to resolve predicate after the phrase: '%1' for operator: '%2'  and value: '%3'\", expr, op, value[op]);\r\n    throw new Error(msg);\r\n\r\n  });\r\n\r\n  return (preds.length === 1) ? preds[0] : new AndOrPredicate(\"and\", preds);\r\n}\r\n\r\nfunction argsForAndOrPredicates(obj: {}, args: any[]) {\r\n  let preds = args[0];\r\n  if (preds instanceof Predicate) {\r\n    preds = core.arraySlice(args);\r\n  } else if (!Array.isArray(preds)) {\r\n    preds = [new Predicate(core.arraySlice(args))];\r\n  }\r\n  return [obj].concat(preds);\r\n}\r\n\r\nfunction updateAliasMap(aliasMap: OpMap, opStr: string, op: Op) {\r\n  let key = opStr.toLowerCase();\r\n  op.key = key;\r\n  aliasMap[key] = op;\r\n\r\n  op.aliases && op.aliases.forEach((alias: any) => {\r\n    aliasMap[alias.toLowerCase()] = op;\r\n  });\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden @internal \r\n*/\r\nclass PassthruPredicate extends Predicate {\r\n  value: any;\r\n  constructor(value: any) {\r\n    super();\r\n    this.value = value;\r\n  }\r\n\r\n  // _validate = core.noop;\r\n}\r\nError['x'] = PassthruPredicate.prototype._initialize('passthruPredicate');\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport class UnaryPredicate extends Predicate {\r\n  pred: Predicate;\r\n  constructor(op: string | QueryOp, ...args: any[]) {\r\n    super();\r\n    this.op = this._resolveOp(op);\r\n    this.pred = new Predicate(args);\r\n  }\r\n\r\n  _validate(entityType: EntityType, usesNameOnServer?: boolean) {\r\n    this.pred._validate(entityType, usesNameOnServer);\r\n  }\r\n}\r\n\r\nError['x'] = UnaryPredicate.prototype._initialize('unaryPredicate', {\r\n  'not': { aliases: ['!', '~'] },\r\n});\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport class BinaryPredicate extends Predicate {\r\n  expr1Source: any;\r\n  expr2Source: any;\r\n  expr1?: PredicateExpression;\r\n  expr2?: PredicateExpression;\r\n  constructor(op: string | QueryOp, expr1: any, expr2: any) {\r\n    super();\r\n    // 5 public props op, expr1Source, expr2Source, expr1, expr2\r\n    this.op = this._resolveOp(op);\r\n    this.expr1Source = expr1;\r\n    this.expr2Source = expr2;\r\n    // this.expr1 and this.expr2 won't be\r\n    // determined until validate is run\r\n  }\r\n\r\n\r\n  _validate(entityType: EntityType, usesNameOnServer?: boolean) {\r\n    let expr1Context = { entityType: entityType, usesNameOnServer: usesNameOnServer };\r\n    this.expr1 = createExpr(this.expr1Source, expr1Context);\r\n    if (this.expr1 == null) {\r\n      throw new Error(\"Unable to validate 1st expression: \" + this.expr1Source);\r\n    }\r\n    if (this.expr1 instanceof LitExpr) {\r\n      // lhs must be either a property or a function.\r\n      throw new Error(\"The left hand side of a binary predicate cannot be a literal expression, it must be a valid property or functional predicate expression: \" + this.expr1Source);\r\n    }\r\n\r\n    if (this.op.key === 'in' && !Array.isArray(this.expr2Source)) {\r\n      throw new Error(\"The 'in' operator requires that its right hand argument be an array\");\r\n    }\r\n    let expr2Context = core.extend(expr1Context, { isRHS: true, dataType: this.expr1.dataType });\r\n    this.expr2 = createExpr(this.expr2Source, expr2Context);\r\n    if (this.expr2 == null) {\r\n      throw new Error(\"Unable to validate 2nd expression: \" + this.expr2Source);\r\n    }\r\n\r\n    if (this.expr1.dataType == null) {\r\n      this.expr1.dataType = this.expr2.dataType;\r\n    }\r\n  }\r\n\r\n\r\n}\r\n\r\nError['x'] = BinaryPredicate.prototype._initialize('binaryPredicate', {\r\n  'eq': {\r\n    aliases: [\"==\", \"equals\", \"equal\"]\r\n  },\r\n  'ne': {\r\n    aliases: [\"!=\", \"~=\", \"notequals\", \"notequal\"]\r\n  },\r\n  'lt': {\r\n    aliases: [\"<\", \"lessthan\"]\r\n  },\r\n  'le': {\r\n    aliases: [\"<=\", \"lessthanorequal\"]\r\n  },\r\n  'gt': {\r\n    aliases: [\">\", \"greaterthan\"]\r\n  },\r\n  'ge': {\r\n    aliases: [\">=\", \"greaterthanorequal\"]\r\n  },\r\n  'startswith': {\r\n    isFunction: true\r\n  },\r\n  'endswith': {\r\n    isFunction: true\r\n  },\r\n  'contains': {\r\n    aliases: [\"substringof\"],\r\n    isFunction: true\r\n  },\r\n  'in': {\r\n\r\n  }\r\n});\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden\r\n*/\r\nexport class AndOrPredicate extends Predicate {\r\n  preds: Predicate[];\r\n  constructor(op: string | QueryOp, preds: any[]) {\r\n    super();\r\n    this.op = this._resolveOp(op);\r\n    if (preds.length === 1 && Array.isArray(preds[0])) {\r\n      preds = preds[0];\r\n    }\r\n    this.preds = preds.filter(function (pred) {\r\n      return pred != null;\r\n    }).map(function (pred) {\r\n      return new Predicate(pred);\r\n    });\r\n    // TODO: this was removed - test if really needed.\r\n    // if (this.preds.length === 0) {\r\n    //   // marker for an empty predicate\r\n    //   this.op = null;\r\n    // }\r\n    if (this.preds.length === 1) {\r\n      return this.preds[0] as AndOrPredicate; // HACK: this.preds[0] is actually NOT a AndOrPredicate but some other kind of pred.\r\n    }\r\n  }\r\n\r\n  _validate(entityType: EntityType, usesNameOnServer?: boolean) {\r\n    this.preds.forEach((pred) => {\r\n      pred._validate(entityType, usesNameOnServer);\r\n    });\r\n  }\r\n}\r\n\r\nError['x'] = AndOrPredicate.prototype._initialize(\"andOrPredicate\", {\r\n  'and': { aliases: ['&&'] },\r\n  'or': { aliases: ['||'] }\r\n} );\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport class AnyAllPredicate extends Predicate {\r\n  /** @internal */\r\n  expr: PredicateExpression;\r\n  exprSource: string;\r\n  pred: Predicate;\r\n  // 4 public props: op, exprSource, expr, pred\r\n  constructor(op: string | QueryOp, expr: string, pred: any) {\r\n    super();\r\n    this.op = this._resolveOp(op);\r\n    this.exprSource = expr;\r\n    // this.expr will not be resolved until validate is called\r\n    this.pred = new Predicate(pred);\r\n  }\r\n\r\n  _validate(entityType: EntityType, usesNameOnServer: boolean) {\r\n    this.expr = createExpr(this.exprSource, { entityType: entityType, usesNameOnServer: usesNameOnServer } as ExpressionContext);\r\n    // can't really know the predicateEntityType unless the original entity type was known.\r\n    if (entityType == null || entityType.isAnonymous) {\r\n      this.expr.dataType = undefined;\r\n    }\r\n    this.pred._validate(this.expr.dataType as EntityType | undefined, usesNameOnServer);\r\n  }\r\n\r\n}\r\n\r\nError['x'] = AnyAllPredicate.prototype._initialize(\"anyAllPredicate\", {\r\n  'any': { aliases: ['some'] },\r\n  'all': { aliases: [\"every\"] }\r\n});\r\n\r\n/** @hidden */\r\nexport class PredicateExpression {\r\n  visitorMethodName: string;\r\n  visit: Function; // TODO\r\n  dataType?: DataType | StructuralType;\r\n  constructor(visitorMethodName: string) {\r\n    this.visitorMethodName = visitorMethodName;\r\n    // give expressions the Predicate prototype method\r\n    this.visit = Predicate.prototype.visit;\r\n  }\r\n\r\n  // default impls - may/will be overridden be subclass expressions\r\n  _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\r\n    // noop;\r\n  }\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport class LitExpr extends PredicateExpression {\r\n  value: any;\r\n  hasExplicitDataType: boolean;\r\n  // 2 public props: value, dataType\r\n  constructor(value: any, dataType: string | DataType | undefined, hasExplicitDataType?: boolean) {\r\n    super(\"litExpr\");\r\n    // dataType may come is an a string\r\n    let dt1 = resolveDataType(dataType);\r\n    // if the DataType comes in as Undefined this means\r\n    // that we should NOT attempt to parse it but just leave it alone\r\n    // for now - this is usually because it is part of a Func expr.\r\n    // TODO: cast as DataType seems to be needed by early version of TypeDoc - may be able to remove later\r\n    let dt2 = (dt1 || DataType.fromValue(value)) as DataType;\r\n\r\n    if (dt2.parse) {\r\n      if (Array.isArray(value)) {\r\n        this.value = value.map((v) => { return dt2.parse!(v, typeof v); });\r\n      } else {\r\n        this.value = dt2.parse(value, typeof value);\r\n      }\r\n    } else {\r\n      this.value = value;\r\n    }\r\n    this.dataType = dt2;\r\n    this.hasExplicitDataType = !!hasExplicitDataType;\r\n  }\r\n\r\n  toString() {\r\n    return \" LitExpr - value: \" + this.value.toString() + \" dataType: \" + this.dataType.toString();\r\n  }\r\n\r\n}\r\n\r\nfunction resolveDataType(dataType?: DataType | string) {\r\n  if (dataType == null) return dataType;\r\n  // if (DataType.contains(dataType)) {\r\n  if (dataType instanceof DataType) {\r\n    return dataType;\r\n  }\r\n  if (typeof dataType === 'string') {\r\n    let dt = DataType.fromName(dataType) as DataType;\r\n    if (dt) return dt;\r\n    throw new Error(\"Unable to resolve a dataType named: \" + dataType);\r\n  }\r\n\r\n  throw new Error(\"The dataType parameter passed into this literal expression is not a 'DataType'\" + dataType);\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n*/\r\nexport class PropExpr extends PredicateExpression {\r\n  propertyPath: string;\r\n  // two public props: propertyPath, dateType\r\n  constructor(propertyPath: string) {\r\n    super('propExpr');\r\n    this.propertyPath = propertyPath;\r\n    //this.dataType = DataType.Undefined;\r\n    // this.dataType resolved after validate ( if not on an anon type }\r\n  }\r\n\r\n  toString() {\r\n    return \" PropExpr - \" + this.propertyPath;\r\n  }\r\n\r\n  _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\r\n\r\n    if (entityType == null || entityType.isAnonymous) return;\r\n    let props = entityType.getPropertiesOnPath(this.propertyPath, null, false);\r\n\r\n    if (!props) {\r\n      let msg = core.formatString(\"Unable to resolve propertyPath.  EntityType: '%1'   PropertyPath: '%2'\", entityType.name, this.propertyPath);\r\n      throw new Error(msg);\r\n    }\r\n    // get the last property\r\n    let prop = props[props.length - 1];\r\n    if (prop instanceof DataProperty) {\r\n      this.dataType = prop.dataType;\r\n    } else {\r\n      this.dataType = prop.entityType;\r\n    }\r\n  }\r\n\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation. \r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden @dynamic\r\n*/\r\nexport class FnExpr extends PredicateExpression {\r\n  fnName: string;\r\n  exprs: PredicateExpression[];\r\n  localFn: any; // TODO:\r\n  constructor(fnName: string, exprs: PredicateExpression[]) {\r\n    super('fnExpr');\r\n    // 4 public props: fnName, exprs, localFn, dataType\r\n    this.fnName = fnName;\r\n    this.exprs = exprs;\r\n    let qf = FnExpr._funcMap[fnName];\r\n    if (qf == null) {\r\n      throw new Error(\"Unknown function: \" + fnName);\r\n    }\r\n    this.localFn = qf.fn;\r\n    this.dataType = qf.dataType;\r\n  }\r\n\r\n  toString() {\r\n    let exprStr = this.exprs.map(function (expr) {\r\n      expr.toString();\r\n    }).toString();\r\n    return \"FnExpr - \" + this.fnName + \"(\" + exprStr + \")\";\r\n  }\r\n\r\n  _validate(entityType: EntityType | undefined, usesNameOnServer?: boolean) {\r\n    this.exprs.forEach(function (expr) {\r\n      expr._validate(entityType, usesNameOnServer);\r\n    });\r\n  }\r\n\r\n  static _funcMap = {\r\n    toupper: {\r\n      fn: function (source: string) {\r\n        return source.toUpperCase();\r\n      }, dataType: DataType.String\r\n    },\r\n    tolower: {\r\n      fn: function (source: string) {\r\n        return source.toLowerCase();\r\n      }, dataType: DataType.String\r\n    },\r\n    substring: {\r\n      fn: function (source: string, pos: number, length: number) {\r\n        return source.substring(pos, length);\r\n      }, dataType: DataType.String\r\n    },\r\n    substringof: {\r\n      fn: function (find: string, source: string) {\r\n        return source.indexOf(find) >= 0;\r\n      }, dataType: DataType.Boolean\r\n    },\r\n    length: {\r\n      fn: function (source: any) {\r\n        return source.length;\r\n      }, dataType: DataType.Int32\r\n    },\r\n    trim: {\r\n      fn: function (source: string) {\r\n        return source.trim();\r\n      }, dataType: DataType.String\r\n    },\r\n    concat: {\r\n      fn: function (s1: string, s2: string) {\r\n        return s1.concat(s2);\r\n      }, dataType: DataType.String\r\n    },\r\n    replace: {\r\n      fn: function (source: string, find: string, replace: string) {\r\n        return source.replace(find, replace);\r\n      }, dataType: DataType.String\r\n    },\r\n    startswith: {\r\n      fn: function (source: string, find: string) {\r\n        return core.stringStartsWith(source, find);\r\n      }, dataType: DataType.Boolean\r\n    },\r\n    endswith: {\r\n      fn: function (source: string, find: string) {\r\n        return core.stringEndsWith(source, find);\r\n      }, dataType: DataType.Boolean\r\n    },\r\n    indexof: {\r\n      fn: function (source: any, find: any) {\r\n        return source.indexOf(find);\r\n      }, dataType: DataType.Int32\r\n    },\r\n    round: {\r\n      fn: function (source: number) {\r\n        return Math.round(source);\r\n      }, dataType: DataType.Int32\r\n    },\r\n    ceiling: {\r\n      fn: function (source: number) {\r\n        return Math.ceil(source);\r\n      }, dataType: DataType.Int32\r\n    },\r\n    floor: {\r\n      fn: function (source: number) {\r\n        return Math.floor(source);\r\n      }, dataType: DataType.Int32\r\n    },\r\n    second: {\r\n      fn: function (source: Date) {\r\n        return source.getSeconds();\r\n      }, dataType: DataType.Int32\r\n    },\r\n    minute: {\r\n      fn: function (source: Date) {\r\n        return source.getMinutes();\r\n      }, dataType: DataType.Int32\r\n    },\r\n    hour: {\r\n      fn: function (source: Date) {\r\n        return source.getHours();\r\n      }, dataType: DataType.Int32\r\n    },\r\n    day: {\r\n      fn: function (source: Date) {\r\n        return source.getDate();\r\n      }, dataType: DataType.Int32\r\n    },\r\n    month: {\r\n      fn: function (source: Date) {\r\n        return source.getMonth() + 1;\r\n      }, dataType: DataType.Int32\r\n    },\r\n    year: {\r\n      fn: function (source: Date) {\r\n        return source.getFullYear();\r\n      }, dataType: DataType.Int32\r\n    }\r\n  };\r\n\r\n}\r\n\r\n// TODO: add dataTypes for the args next - will help to infer other dataTypes.\r\n\r\n\r\nlet RX_IDENTIFIER = /^[a-z_][\\w.$]*$/i;\r\n// comma delimited expressions ignoring commas inside of both single and double quotes.\r\nlet RX_COMMA_DELIM1 = /('[^']*'|[^,]+)/g;\r\nlet RX_COMMA_DELIM2 = /(\"[^\"]*\"|[^,]+)/g;\r\nlet DELIM = String.fromCharCode(191);\r\n\r\nfunction createExpr(source: any, exprContext: ExpressionContext) {\r\n  let entityType = exprContext.entityType;\r\n\r\n  // the right hand side of an 'in' clause\r\n  if (Array.isArray(source)) {\r\n    if (!exprContext.isRHS) {\r\n      throw new Error(\"Array expressions are only permitted on the right hand side of a BinaryPredicate\");\r\n    }\r\n    return new LitExpr(source, exprContext.dataType!);\r\n  }\r\n\r\n  if (!(typeof source === 'string')) {\r\n    if (source != null && typeof source === 'object' && !source.toISOString) {\r\n      // source is an object but not a Date-like thing such as a JS or MomentJS Date\r\n      if (source.value === undefined) {\r\n        throw new Error(\"Unable to resolve an expression for: \" + source + \" on entityType: \" + (entityType ? entityType.name : 'null'));\r\n      }\r\n      if (source.isProperty) {\r\n        return new PropExpr(source.value);\r\n      } else {\r\n        // we want to insure that any LitExpr created this way is tagged with 'hasExplicitDataType: true'\r\n        // because we want to insure that if we roundtrip thru toJSON that we don't\r\n        // accidentally reinterpret this node as a PropExpr.\r\n        // return new LitExpr(source.value, source.dataType || context.dataType, !!source.dataType);\r\n        return new LitExpr(source.value, source.dataType || exprContext.dataType, true);\r\n      }\r\n    } else {\r\n      return new LitExpr(source, exprContext.dataType);\r\n    }\r\n  }\r\n\r\n  if (exprContext.isRHS) {\r\n    if (entityType == null || entityType.isAnonymous) {\r\n      // if entityType is unknown then assume that the rhs is a literal\r\n      return new LitExpr(source, exprContext.dataType);\r\n    } else {\r\n      return parseLitOrPropExpr(source, exprContext);\r\n    }\r\n  } else {\r\n    let regex = /\\([^()]*\\)/;\r\n    let m: RegExpExecArray | null;\r\n    let tokens: string[] = [];\r\n    let i = 0;\r\n    while (m = regex.exec(source)) {\r\n      let token = m[0];\r\n      tokens.push(token);\r\n      let repl = DELIM + i++;\r\n      source = source.replace(token, repl);\r\n    }\r\n\r\n    let expr = parseExpr(source, tokens, exprContext);\r\n    expr._validate(entityType, exprContext.usesNameOnServer);\r\n    return expr;\r\n  }\r\n}\r\n\r\nfunction parseExpr(source: string, tokens: string[], exprContext: ExpressionContext): PredicateExpression {\r\n  let parts = source.split(DELIM);\r\n  if (parts.length === 1) {\r\n    return parseLitOrPropExpr(parts[0], exprContext);\r\n  } else {\r\n    return parseFnExpr(source, parts, tokens, exprContext);\r\n  }\r\n}\r\n\r\nfunction parseLitOrPropExpr(value: string, exprContext: ExpressionContext): PredicateExpression {\r\n  value = value.trim();\r\n  // value is either a string, a quoted string, a number, a bool value, or a date\r\n  // if a string ( not a quoted string) then this represents a property name ( 1st ) or a lit string ( 2nd)\r\n  let firstChar = value.substr(0, 1);\r\n  let isQuoted = (firstChar === \"'\" || firstChar === '\"') && value.length > 1 && value.substr(value.length - 1) === firstChar;\r\n  if (isQuoted) {\r\n    let unquotedValue = value.substr(1, value.length - 2);\r\n    return new LitExpr(unquotedValue, exprContext.dataType || DataType.String);\r\n  } else {\r\n    let entityType = exprContext.entityType;\r\n    // TODO: get rid of isAnonymous below when we get the chance.\r\n    if (entityType == null || entityType.isAnonymous) {\r\n      // this fork will only be reached on the LHS of an BinaryPredicate -\r\n      // a RHS expr cannot get here with an anon type\r\n      return new PropExpr(value);\r\n    } else {\r\n      let mayBeIdentifier = RX_IDENTIFIER.test(value);\r\n      if (mayBeIdentifier) {\r\n        // if (entityType.getProperty(value, false) != null) {\r\n        if (entityType.getPropertiesOnPath(value, null, false) != null) {\r\n          return new PropExpr(value);\r\n        }\r\n      }\r\n    }\r\n    // we don't really know the datatype here because even though it comes in as a string\r\n    // its usually a string BUT it might be a number  i.e. the \"1\" or the \"2\" from an expr\r\n    // like \"toUpper(substring(companyName, 1, 2))\"\r\n    return new LitExpr(value, exprContext.dataType);\r\n  }\r\n}\r\n\r\nfunction parseFnExpr(source: string, parts: string[], tokens: string[], exprContext: ExpressionContext) {\r\n  try {\r\n    let fnName = parts[0].trim().toLowerCase();\r\n\r\n    let argSource = tokens[parts[1]].trim() as string;\r\n    if (argSource.substr(0, 1) === \"(\") {\r\n      argSource = argSource.substr(1, argSource.length - 2);\r\n    }\r\n    let commaMatchStr = source.indexOf(\"'\") >= 0 ? RX_COMMA_DELIM1 : RX_COMMA_DELIM2;\r\n    let args = argSource.match(commaMatchStr);\r\n    let newContext = core.extend({}, exprContext) as ExpressionContext;\r\n    // a dataType of Undefined on a context basically means not to try parsing\r\n    // the value if the expr is a literal\r\n    newContext.dataType = DataType.Undefined;\r\n    newContext.isFnArg = true;\r\n    let exprs = args!.map(function (a) {\r\n      return parseExpr(a, tokens, newContext);\r\n    });\r\n    return new FnExpr(fnName, exprs);\r\n  } catch (e) {\r\n    // TODO: removed old code here\r\n    // return null;\r\n    // and replaced with \r\n    throw e;\r\n  }\r\n}\r\n\r\n// toFunctionVisitor\r\n\r\nlet toFunctionVisitor = {\r\n\r\n  isExtended: false,\r\n\r\n  passthruPredicate: function (this: PassthruPredicate) {\r\n    throw new Error(\"Cannot execute an PassthruPredicate expression against the local cache: \" + this.value);\r\n  },\r\n\r\n  unaryPredicate: function (this: UnaryPredicate, context: VisitContext) {\r\n    let predFn = this.pred.visit(context);\r\n    switch (this.op.key) {\r\n      case \"not\":\r\n        return function (entity: any) {\r\n          return !predFn(entity);\r\n        };\r\n      default:\r\n        throw new Error(\"Invalid unary operator:\" + this.op.key);\r\n    }\r\n  },\r\n\r\n  binaryPredicate: function (this: BinaryPredicate, context: VisitContext) {\r\n    let expr1Fn = this.expr1!.visit(context);\r\n    let expr2Fn = this.expr2!.visit(context);\r\n    let dataType = this.expr1!.dataType || this.expr2!.dataType;\r\n    let lqco = context.entityType!.metadataStore.localQueryComparisonOptions;\r\n    let predFn = getBinaryPredicateFn(this, dataType as DataType, lqco);\r\n    if (predFn == null) {\r\n      throw new Error(\"Invalid binaryPredicate operator:\" + this.op.key);\r\n    }\r\n    return function (entity: Entity) {\r\n      return predFn!(expr1Fn(entity), expr2Fn(entity));\r\n    };\r\n  },\r\n\r\n  andOrPredicate: function (this: AndOrPredicate, context: VisitContext) {\r\n    let predFns = this.preds.map((pred) => {\r\n      return pred.visit(context);\r\n    });\r\n    switch (this.op!.key) {\r\n      case \"and\":\r\n        return function (entity: any) {\r\n          let result = predFns.reduce(function (prev, cur) {\r\n            return prev && cur(entity);\r\n          }, true);\r\n          return result;\r\n        };\r\n      case \"or\":\r\n        return function (entity: any) {\r\n          let result = predFns.reduce(function (prev, cur) {\r\n            return prev || cur(entity);\r\n          }, false);\r\n          return result;\r\n        };\r\n      default:\r\n        throw new Error(\"Invalid boolean operator:\" + this.op!.key);\r\n    }\r\n  },\r\n\r\n  anyAllPredicate: function (this: AnyAllPredicate, context: VisitContext) {\r\n    let exprFn = this.expr.visit(context);\r\n    let newContext = core.extend({}, context) as VisitContext;\r\n    newContext.entityType = this.expr.dataType as EntityType;\r\n    let predFn = this.pred.visit(newContext);\r\n    let anyAllPredFn = getAnyAllPredicateFn(this.op);\r\n    return function (entity: any) {\r\n      return anyAllPredFn(exprFn(entity), predFn);\r\n    };\r\n  },\r\n\r\n  litExpr: function (this: LitExpr) {\r\n    let value = this.value;\r\n    return function (entity: any) {\r\n      return value;\r\n    };\r\n  },\r\n\r\n  propExpr: function (this: PropExpr) {\r\n    let propertyPath = this.propertyPath;\r\n    let properties = propertyPath.split('.');\r\n    if (properties.length === 1) {\r\n      return function (entity: any) {\r\n        return entity.getProperty(propertyPath);\r\n      };\r\n    } else {\r\n      return function (entity: Entity) {\r\n        return EntityAspect.getPropertyPathValue(entity, properties);\r\n      };\r\n    }\r\n  },\r\n\r\n  fnExpr: function (this: FnExpr, context: ExpressionContext) {\r\n    let exprFns = this.exprs.map(function (expr) {\r\n      return expr.visit(context);\r\n    });\r\n    let that = this;\r\n    return function (entity: any) {\r\n      let values = exprFns.map(function (exprFn) {\r\n        let value = exprFn(entity);\r\n        return value;\r\n      });\r\n      let result = that.localFn.apply(null, values);\r\n      return result;\r\n    };\r\n  }\r\n\r\n};\r\n\r\nfunction getAnyAllPredicateFn(op: Op): (v1: any[], v2: any) => boolean {\r\n  switch (op.key) {\r\n    case \"any\":\r\n      return function (v1, v2) {\r\n        return v1.some(function (v) {\r\n          return v2(v);\r\n        });\r\n      };\r\n    case \"all\":\r\n      return function (v1, v2) {\r\n        return v1.every(function (v) {\r\n          return v2(v);\r\n        });\r\n      };\r\n    default:\r\n      throw new Error(\"Unknown operator: \" + op.key);\r\n  }\r\n}\r\n\r\nfunction getBinaryPredicateFn(binaryPredicate: BinaryPredicate, dataType: DataType, lqco: LocalQueryComparisonOptions) {\r\n  let op = binaryPredicate.op;\r\n  let mc = DataType.getComparableFn(dataType);\r\n  let predFn: (v1: any, v2: any) => boolean;\r\n  switch (op.key) {\r\n    case 'eq':\r\n      predFn = function (v1, v2) {\r\n        if (v1 && typeof v1 === 'string') {\r\n          return stringEquals(v1, v2, lqco);\r\n        } else {\r\n          return mc(v1) === mc(v2);\r\n        }\r\n      };\r\n      break;\r\n    case 'ne':\r\n      predFn = function (v1, v2) {\r\n        if (v1 && typeof v1 === 'string') {\r\n          return !stringEquals(v1, v2, lqco);\r\n        } else {\r\n          return mc(v1) !== mc(v2);\r\n        }\r\n      };\r\n      break;\r\n    case 'gt':\r\n      predFn = function (v1, v2) {\r\n        return mc(v1) > mc(v2);\r\n      };\r\n      break;\r\n    case 'ge':\r\n      predFn = function (v1, v2) {\r\n        return mc(v1) >= mc(v2);\r\n      };\r\n      break;\r\n    case 'lt':\r\n      predFn = function (v1, v2) {\r\n        return mc(v1) < mc(v2);\r\n      };\r\n      break;\r\n    case 'le':\r\n      predFn = function (v1, v2) {\r\n        return mc(v1) <= mc(v2);\r\n      };\r\n      break;\r\n    case 'startswith':\r\n      predFn = function (v1, v2) {\r\n        return stringStartsWith(v1, v2, lqco);\r\n      };\r\n      break;\r\n    case 'endswith':\r\n      predFn = function (v1, v2) {\r\n        return stringEndsWith(v1, v2, lqco);\r\n      };\r\n      break;\r\n    case 'contains':\r\n      predFn = function (v1, v2) {\r\n        return stringContains(v1, v2, lqco);\r\n      };\r\n      break;\r\n    case 'in':\r\n      predFn = function (v1: any, v2: any[]) {\r\n        v1 = mc(v1);\r\n        v2 = v2.map(function (v) { return mc(v); });\r\n        return v2.indexOf(v1) >= 0;\r\n      };\r\n      break;\r\n    default:\r\n      return null;\r\n  }\r\n  return predFn;\r\n}\r\n\r\nfunction stringEquals(a: any, b: any, lqco: LocalQueryComparisonOptions) {\r\n  if (b == null) return false;\r\n  if (typeof b !== 'string') {\r\n    b = b.toString();\r\n  }\r\n  if (lqco.usesSql92CompliantStringComparison) {\r\n    a = (a || \"\").trim();\r\n    b = (b || \"\").trim();\r\n  }\r\n  if (!lqco.isCaseSensitive) {\r\n    a = (a || \"\").toLowerCase();\r\n    b = (b || \"\").toLowerCase();\r\n  }\r\n  return a === b;\r\n}\r\n\r\nfunction stringStartsWith(a: any, b: any, lqco: LocalQueryComparisonOptions) {\r\n  if (!lqco.isCaseSensitive) {\r\n    a = (a || \"\").toLowerCase();\r\n    b = (b || \"\").toLowerCase();\r\n  }\r\n  return core.stringStartsWith(a, b);\r\n}\r\n\r\nfunction stringEndsWith(a: any, b: any, lqco: LocalQueryComparisonOptions) {\r\n  if (!lqco.isCaseSensitive) {\r\n    a = (a || \"\").toLowerCase();\r\n    b = (b || \"\").toLowerCase();\r\n  }\r\n  return core.stringEndsWith(a, b);\r\n}\r\n\r\nfunction stringContains(a: any, b: any, lqco: LocalQueryComparisonOptions) {\r\n  if (!lqco.isCaseSensitive) {\r\n    a = (a || \"\").toLowerCase();\r\n    b = (b || \"\").toLowerCase();\r\n  }\r\n  return a.indexOf(b) >= 0;\r\n}\r\n\r\n// toJSONVisitor\r\n\r\nlet toJSONVisitor = {\r\n\r\n  passthruPredicate: function (this: PassthruPredicate) {\r\n    return this.value;\r\n  },\r\n\r\n  unaryPredicate: function (this: UnaryPredicate, context: VisitContext) {\r\n    let predVal = this.pred.visit(context);\r\n    let json = {};\r\n    json[this.op.key] = predVal;\r\n    return json;\r\n  },\r\n\r\n  binaryPredicate: function (this: BinaryPredicate, context: VisitContext) {\r\n    let expr1Val = this.expr1!.visit(context);\r\n    let expr2Val = this.expr2!.visit(context);\r\n    let json = {};\r\n    if (this.expr2 instanceof PropExpr) {\r\n      expr2Val = { value: expr2Val, isProperty: true };\r\n    }\r\n    if (this.op.key === \"eq\") {\r\n      json[expr1Val] = expr2Val;\r\n    } else {\r\n      let value = {};\r\n      json[expr1Val] = value;\r\n      value[this.op.key] = expr2Val;\r\n    }\r\n    return json;\r\n  },\r\n\r\n  andOrPredicate: function (this: AndOrPredicate, context: VisitContext) {\r\n    let predVals = this.preds.map(function (pred) {\r\n      return pred.visit(context);\r\n    });\r\n    if (!predVals || !predVals.length) {\r\n      return {};\r\n    }\r\n    let json: Object | undefined;\r\n    // normalizeAnd clauses if possible.\r\n    // passthru predicate will appear as string and their 'ands' can't be 'normalized'\r\n    if (this.op!.key === 'and' && predVals.length === 2 && !predVals.some((v) => v.or || typeof(v) === 'string')) {\r\n      // normalize 'and' clauses - will return null if can't be combined.\r\n      json = predVals.reduce(combine);\r\n    }\r\n    if (json == null) {\r\n      json = {};\r\n      json[this.op!.key!] = predVals;\r\n    }\r\n    return json;\r\n  },\r\n\r\n  anyAllPredicate: function (this: AnyAllPredicate, context: VisitContext) {\r\n    let exprVal = this.expr.visit(context);\r\n    let newContext = core.extend({}, context) as VisitContext;\r\n    newContext.entityType = this.expr.dataType as EntityType;\r\n    let predVal = this.pred.visit(newContext);\r\n    let json = {};\r\n    let value = {};\r\n    value[this.op.key] = predVal;\r\n    json[exprVal] = value;\r\n    return json;\r\n  },\r\n\r\n  litExpr: function (this: LitExpr, context: VisitContext) {\r\n    // special handling for DateOnly because it serializes improperly\r\n    const value = (this.dataType === DataType.DateOnly) ? DataType.toDateOnlyString(this.value) : this.value;\r\n    if (this.hasExplicitDataType || context.useExplicitDataType) {\r\n      return { value: value, dataType: this.dataType.name };\r\n    } else {\r\n      return value;\r\n    }\r\n  },\r\n\r\n  propExpr: function (this: PropExpr, context: VisitContext) {\r\n    if (context.toNameOnServer) {\r\n      if (!context.entityType) {\r\n        console.warn(`No EntityType for propertyPath \"${this.propertyPath}\".  ${core.strings.TO_TYPE}`);\r\n        return this.propertyPath;\r\n      }\r\n      return context.entityType!.clientPropertyPathToServer(this.propertyPath);\r\n    } else {\r\n      return this.propertyPath;\r\n    }\r\n  },\r\n\r\n  fnExpr: function (this: FnExpr, context: VisitContext) {\r\n    let exprVals = this.exprs.map(function (expr) {\r\n      return expr.visit(context);\r\n    });\r\n    return this.fnName + \"(\" + exprVals.join(\",\") + \")\";\r\n  }\r\n\r\n};\r\n\r\nfunction combine(j1: Object, j2: Object) {\r\n  let ok = Object.keys(j2).every(function (key) {\r\n    if (j1.hasOwnProperty(key)) {\r\n      if (typeof (j2[key]) !== 'object') {\r\n        // exit and indicate that we can't combine\r\n        return false;\r\n      }\r\n      if (combine(j1[key], j2[key]) == null) {\r\n        return false;\r\n      }\r\n    } else if (typeof (j1) !== 'object') {\r\n      // cannot assign to j1[key]\r\n      return false;\r\n    } else {\r\n      j1[key] = j2[key];\r\n    }\r\n    return true;\r\n  });\r\n  return ok ? j1 : null;\r\n}\r\n\r\n\r\n\r\n\r\n","import { core, Callback, ErrorCallback } from './core';\r\nimport { assertParam } from './assert-param';\r\nimport { DataType } from './data-type';\r\nimport { EntityAspect, Entity } from './entity-aspect';\r\nimport { EntityKey } from './entity-key';\r\nimport { BreezeEnum } from './enum';\r\nimport { DataService, JsonResultsAdapter } from './data-service';\r\nimport { EntityManager, QueryResult } from './entity-manager';\r\nimport { MetadataStore, EntityType, NavigationProperty, EntityProperty } from './entity-metadata';\r\nimport { QueryOptions, MergeStrategy, FetchStrategy } from './query-options';\r\nimport { Predicate } from './predicate';\r\n\r\nexport interface RecursiveArray<T> {\r\n  [i: number]: T | RecursiveArray<T>;\r\n}\r\n\r\nexport interface EntityQueryJsonContext {\r\n  entityType?: EntityType;\r\n  propertyPathFn?: Function; // TODO\r\n  toNameOnServer?: boolean;\r\n}\r\n/**\r\nAn EntityQuery instance is used to query entities either from a remote datasource or from a local [[EntityManager]].\r\n\r\nEntityQueries are immutable - this means that all EntityQuery methods that return an EntityQuery actually create a new EntityQuery.  This means that\r\nEntityQueries can be 'modified' without affecting any current instances.\r\n@dynamic\r\n**/\r\nexport class EntityQuery {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // actually placed on prototype\r\n  // top = this.take; // TODO: consider\r\n  /** The resource name used by this query. __Read Only__ */\r\n  declare resourceName?: string;\r\n  /** The [[EntityType]] that is associated with the 'from' clause ( resourceName) of the query.  This is only guaranteed to be be set AFTER the query\r\n  has been executed because it depends on the [[MetadataStore]] associated with the [[EntityManager]] that the query was executed against.\r\n  This value may be null if the entityType cannot be associated with a resourceName. __Read Only__ */\r\n  declare fromEntityType?: EntityType;\r\n  /** The 'where' [[Predicate]] used by this query. __Read Only__ */\r\n  declare wherePredicate: Predicate; // TODO\r\n  /** The [[OrderByClause]] used by this query. __Read Only__ */\r\n  declare orderByClause?: OrderByClause;\r\n  /** The [[ExpandClause]] used by this query. __Read Only__ */\r\n  declare expandClause?: ExpandClause;\r\n  /** The [[SelectClause]] used by this query. __Read Only__ */\r\n  declare selectClause?: SelectClause;\r\n  /** The number of entities to 'skip' for this query. __Read Only__ */\r\n  declare skipCount?: number;\r\n  /** The number of entities to 'take' for this query. __Read Only__ */\r\n  declare takeCount?: number;\r\n  /** Any additional parameters that were added to the query via the 'withParameters' method. __Read Only__ */\r\n  declare parameters: Object;\r\n  /** Whether an inline count is returned for this query. __Read Only__ */\r\n  declare inlineCountEnabled: boolean;\r\n  /** Whether entity tracking has been disabled for this query. __Read Only__ */\r\n  declare noTrackingEnabled: boolean;\r\n  /** Whether to send query as the body of a POST request.  (Server needs to accomodate POST). __Read Only__ */\r\n  declare usePostEnabled: boolean;\r\n  /** The [[QueryOptions]] for this query. __Read Only__  **/\r\n  // default is to get queryOptions and dataService from the entityManager.\r\n  declare queryOptions?: QueryOptions;\r\n  /** The [[DataService]] for this query. __Read Only__  **/\r\n  declare dataService?: DataService;\r\n  /** The [[EntityManager]] for this query. This may be null and can be set via the 'using' method.  **/\r\n  declare entityManager?: EntityManager;\r\n  /**  The entityType that will be returned by this query. \r\n  This property will only be set if the 'toType' method was called. __Read Only__ */\r\n  declare resultEntityType: EntityType | string;\r\n  declare usesNameOnServer?: boolean;\r\n\r\n  /** Constructor\r\n  >    let query = new EntityQuery(\"Customers\")\r\n\r\n  Usually this constructor will be followed by calls to filtering, ordering or selection methods\r\n  >      let query = new EntityQuery(\"Customers\")\r\n  >        .where(\"CompanyName\", \"startsWith\", \"C\")\r\n  >        .orderBy(\"Region\");\r\n  @param resourceName - either a resource name or a serialized EntityQuery ( created by [[EntityQuery.toJSON]])\r\n  **/\r\n  constructor(resourceName?: string | Object) {\r\n    if (resourceName != null && (typeof resourceName !== 'string')) {\r\n      return fromJSON(this, resourceName);\r\n    }\r\n    // TODO: cast as string below needed for early versions of TypeDoc - but not for regular compile - check later\r\n    this.resourceName = resourceName as string;\r\n    this.fromEntityType = undefined;\r\n    this.wherePredicate = undefined;\r\n    this.orderByClause = undefined;\r\n    this.selectClause = undefined;\r\n    this.skipCount = undefined;\r\n    this.takeCount = undefined;\r\n    this.expandClause = undefined;\r\n    this.parameters = {};\r\n    this.inlineCountEnabled = false;\r\n    this.noTrackingEnabled = false;\r\n    this.usePostEnabled = false;\r\n    // default is to get queryOptions and dataService from the entityManager.\r\n    // this.queryOptions = new QueryOptions();\r\n    // this.dataService = new DataService();\r\n    this.entityManager = undefined;\r\n\r\n  }\r\n\r\n\r\n  /**\r\n  Specifies the resource to query for this EntityQuery.\r\n  >      let query = new EntityQuery()\r\n  >        .from(\"Customers\");\r\n\r\n  is the same as\r\n  >      let query = new EntityQuery(\"Customers\");\r\n  @param resourceName - The resource to query.\r\n  **/\r\n  from(resourceName: string) {\r\n    // TODO: think about allowing entityType as well\r\n    assertParam(resourceName, \"resourceName\").isString().check();\r\n    return clone(this, \"resourceName\", resourceName);\r\n  }\r\n\r\n  /**\r\n  This is a static version of the \"from\" method and it creates a 'base' entityQuery for the specified resource name.\r\n  >      let query = EntityQuery.from(\"Customers\");\r\n\r\n  is the same as\r\n  >      let query = new EntityQuery(\"Customers\");\r\n  @param resourceName - The resource to query.\r\n  **/\r\n  static from(resourceName: string) {\r\n    assertParam(resourceName, \"resourceName\").isString().check();\r\n    return new EntityQuery(resourceName);\r\n  }\r\n\r\n  /**\r\n  Specifies the top level EntityType that this query will return.  Only needed when a query returns a json result that does not include type information,\r\n  or when using a resource name that is not associated to an EntityType.\r\n  >      let query = new EntityQuery()\r\n  >        .from(\"MyCustomMethod\")\r\n  >        .toType(\"Customer\")\r\n  @param entityType - The top level EntityType that this query will return.\r\n  @summary If the json result consists of more than a simple entity or array of entities, consider using a [[JsonResultsAdapter]] instead.\r\n  **/\r\n  toType(entityType: string | EntityType) {\r\n    assertParam(entityType, \"entityType\").isString().or().isInstanceOf(EntityType).check();\r\n    return clone(this, \"resultEntityType\", entityType);\r\n  }\r\n\r\n\r\n  where(predicate?: Predicate): EntityQuery;\r\n  where(predicate: Object): EntityQuery;\r\n  where(property: string, operator: string, value: any): EntityQuery;\r\n  where(property: string, operator: FilterQueryOp, value: any): EntityQuery;\r\n  where(property: string, filterop: FilterQueryOp, property2: string, filterop2: FilterQueryOp, value: any): EntityQuery;  // for any/all clauses\r\n  where(property: string, filterop: string, property2: string, filterop2: string, value: any): EntityQuery;  // for any/all clauses\r\n  where(property: string, filterop: string, property2: string, filterop2: string, property3: string, filterop3: string, value: any): EntityQuery;  // for any/all clauses\r\n  where(anArray: RecursiveArray<string | number | FilterQueryOp | Predicate>): EntityQuery;\r\n  /**\r\n  Returns a new query with an added filter criteria; Can be called multiple times which means to 'and' with any existing\r\n  Predicate or can be called with null to clear all predicates.\r\n  >      let query = new EntityQuery(\"Customers\")\r\n  >          .where(\"CompanyName\", \"startsWith\", \"C\");\r\n\r\n  This can also be expressed using an explicit [[FilterQueryOp]] as\r\n  >      let query = new EntityQuery(\"Customers\")\r\n  >          .where(\"CompanyName\", FilterQueryOp.StartsWith, \"C\");\r\n\r\n  or a preconstructed [[Predicate]] may be used\r\n  >      let pred = new Predicate(\"CompanyName\", FilterQueryOp.StartsWith, \"C\");\r\n  >      let query = new EntityQuery(\"Customers\").where(pred);\r\n\r\n  Predicates are often useful when you want to combine multiple conditions in a single filter, such as\r\n  >      let pred = Predicate.create(\"CompanyName\", \"startswith\", \"C\").and(\"Region\", FilterQueryOp.Equals, null);\r\n  >      let query = new EntityQuery(\"Customers\")\r\n  >          .where(pred);\r\n\r\n  More complicated queries can make use of nested property paths\r\n  >      let query = new EntityQuery(\"Products\")\r\n  >          .where(\"Category.CategoryName\", \"startswith\", \"S\");\r\n\r\n  or OData functions - A list of valid OData functions can be found within the [[Predicate]] documentation.\r\n  \r\n  >      let query = new EntityQuery(\"Customers\")\r\n  >          .where(\"toLower(CompanyName)\", \"startsWith\", \"c\");\r\n\r\n  or to be even more baroque\r\n  >      let query = new EntityQuery(\"Customers\")\r\n  >          .where(\"toUpper(substring(CompanyName, 1, 2))\", FilterQueryOp.Equals, \"OM\");\r\n  @param predicate -  Can be either\r\n    - a single [[Predicate]]\r\n\r\n    - the parameters to create a 'simple' Predicate\r\n    - -  a property name, a property path with '.' as path seperators or a property expression {String}\r\n    - -  an operator - [[FilterQueryOp]] or it's string representation. Case is ignored\r\n    when if a string is provided and any string that matches one of the FilterQueryOp aliases will be accepted.\r\n    - -  a value {Object} - This will be treated as either a property expression or a literal depending on context.  \r\n    In general, if the value can be interpreted as a property expression it will be, otherwise it will be treated as a literal.\r\n    In most cases this works well, but you can also force the interpretation by making the value argument itself an object \r\n    with a 'value' property and an 'isLiteral' property set to either true or false.\r\n    Breeze also tries to infer the dataType of any literal based on context, if this fails you can force this inference by making the value argument \r\n    an object with a 'value' property and a 'dataType'property set to one of the DataType enumeration instances.\r\n\r\n    - a null or undefined ( this causes any existing where clause to be removed)\r\n  **/\r\n  where(...args: any[]) {\r\n    let wherePredicate: Predicate | undefined;\r\n    if (args.length > 0 && args[0] != null) {\r\n      wherePredicate = Predicate.create(...<any>args);\r\n      if (this.fromEntityType) wherePredicate._validate(this.fromEntityType);\r\n      if (this.wherePredicate) {\r\n        wherePredicate = this.wherePredicate.and(wherePredicate);\r\n      }\r\n    }\r\n    return clone(this, \"wherePredicate\", wherePredicate);\r\n  }\r\n\r\n\r\n  orderBy(propertyPaths?: string, isDescending?: boolean): EntityQuery;\r\n  orderBy(propertyPaths: string[], isDescending?: boolean): EntityQuery;\r\n  /**\r\n  Returns a new query that orders the results of the query by property name.  By default sorting occurs is ascending order, but sorting in descending order is supported as well.\r\n  OrderBy clauses may be chained.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .orderBy(\"CompanyName\");\r\n\r\n  or to sort across multiple properties\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .orderBy(\"Region, CompanyName\");\r\n\r\n  Nested property paths are also supported\r\n  >     let query = new EntityQuery(\"Products\")\r\n  >        .orderBy(\"Category.CategoryName\");\r\n\r\n  Sorting in descending order is supported via the addition of ' desc' to the end of any property path.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .orderBy(\"CompanyName desc\");\r\n\r\n  or\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .orderBy(\"Region desc, CompanyName desc\");\r\n  @param propertyPaths - A comma-separated (',') string of property paths or an array of property paths.\r\n  Each property path can optionally end with \" desc\" to force a descending sort order. If 'propertyPaths' is either null or omitted then all ordering is removed.\r\n  @param isDescending - If specified, overrides all of the embedded 'desc' tags in the previously specified property paths.\r\n  **/\r\n  orderBy(propertyPaths: string | string[], isDescending?: boolean) {\r\n    // propertyPaths: can pass in create(\"A.X,B\") or create(\"A.X desc, B\") or create(\"A.X desc,B\", true])\r\n    // isDesc parameter trumps isDesc in propertyName.\r\n    let orderByClause = propertyPaths == null ? null : new OrderByClause(normalizePropertyPaths(propertyPaths), isDescending);\r\n    if (this.orderByClause && orderByClause) {\r\n      orderByClause = new OrderByClause([this.orderByClause, orderByClause]);\r\n    }\r\n    return clone(this, \"orderByClause\", orderByClause);\r\n  }\r\n\r\n\r\n  orderByDesc(propertyPaths: string): EntityQuery;\r\n  orderByDesc(propertyPaths: string[]): EntityQuery;\r\n  /**\r\n  Returns a new query that orders the results of the query by property name in descending order.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .orderByDesc(\"CompanyName\");\r\n\r\n  or to sort across multiple properties\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .orderByDesc(\"Region, CompanyName\");\r\n\r\n  Nested property paths are also supported\r\n  >     let query = new EntityQuery(\"Products\")\r\n  >        .orderByDesc(\"Category.CategoryName\");\r\n  @param propertyPaths - A comma-separated (',') string of property paths or an array of property paths.\r\n  If 'propertyPaths' is either null or omitted then all ordering is removed.\r\n  **/\r\n  orderByDesc(propertyPaths: string | string[]) {\r\n    return this.orderBy(propertyPaths as any, true);\r\n  }\r\n\r\n  /**\r\n  Returns a new query that selects a list of properties from the results of the original query and returns the values of just these properties. This\r\n  will be referred to as a projection.\r\n  If the result of this selection \"projection\" contains entities, these entities will automatically be added to EntityManager's cache and will\r\n  be made 'observable'.\r\n  Any simple properties, i.e. strings, numbers or dates within a projection will not be cached are will NOT be made 'observable'.\r\n  \r\n  Simple data properties can be projected\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >         .where(\"CompanyName\", \"startsWith\", \"C\")\r\n  >         .select(\"CompanyName\");\r\n\r\n  This will return an array of objects each with a single \"CompanyName\" property of type string.\r\n  A similar query could return a navigation property instead\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .where(\"CompanyName\", \"startsWith\", \"C\")\r\n  >        .select(\"Orders\");\r\n\r\n  where the result would be an array of objects each with a single \"Orders\" property that would itself be an array of \"Order\" entities.\r\n  Composite projections are also possible:\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .where(\"CompanyName\", \"startsWith\", \"C\")\r\n  >        .select(\"CompanyName, Orders\");\r\n\r\n  As well as projections involving nested property paths\r\n  >     let query = EntityQuery(\"Orders\")\r\n  >        .where(\"Customer.CompanyName\", \"startsWith\", \"C\")\r\n  >        .select(\"Customer.CompanyName, Customer, OrderDate\");\r\n  @param propertyPaths - A comma-separated (',') string of property paths or an array of property paths.\r\n  If 'propertyPaths' is either null or omitted then any existing projection on the query is removed.\r\n  **/\r\n  select(propertyPaths?: string | string[]) {\r\n    let selectClause = propertyPaths == null ? null : new SelectClause(normalizePropertyPaths(propertyPaths));\r\n    return clone(this, \"selectClause\", selectClause);\r\n  }\r\n\r\n  /**\r\n  Returns a new query that skips the specified number of entities when returning results.\r\n  Any existing 'skip' can be cleared by calling 'skip' with no arguments.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >       .where(\"CompanyName\", \"startsWith\", \"C\")\r\n  >       .skip(5);\r\n  @param count - The number of entities to skip over. If omitted or null any existing skip count on the query is removed.\r\n  **/\r\n  skip(count?: number) {\r\n    assertParam(count, \"count\").isOptional().isNumber().check();\r\n    return clone(this, \"skipCount\", (count == null) ? null : count);\r\n  }\r\n\r\n  /**\r\n  Returns a new query that returns only the specified number of entities when returning results. - Same as 'take'.\r\n  Any existing 'top' can be cleared by calling 'top' with no arguments.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .top(5);\r\n  @param count - The number of entities to return.\r\n  If 'count' is either null or omitted then any existing 'top' count on the query is removed.\r\n  **/\r\n  top(count?: number) {\r\n    return this.take(count);\r\n  }\r\n\r\n  /**\r\n  Returns a new query that returns only the specified number of entities when returning results - Same as 'top'.\r\n  Any existing take can be cleared by calling take with no arguments.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .take(5);\r\n  @param count - The number of entities to return.\r\n  If 'count' is either null or omitted then any existing 'take' count on the query is removed.\r\n  **/\r\n  take(count?: number) {\r\n    assertParam(count, \"count\").isOptional().isNumber().check();\r\n    return clone(this, \"takeCount\", (count == null) ? null : count);\r\n  }\r\n\r\n  /**\r\n  Returns a new query that will return related entities nested within its results. The expand method allows you to identify related entities, via navigation property\r\n  names such that a graph of entities may be retrieved with a single request. Any filtering occurs before the results are 'expanded'.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .where(\"CompanyName\", \"startsWith\", \"C\")\r\n  >        .expand(\"Orders\");\r\n\r\n  will return the filtered customers each with its \"Orders\" properties fully resolved.\r\n  Multiple paths may be specified by separating the paths by a ','\r\n  >     let query = new EntityQuery(\"Orders\")\r\n  >        .expand(\"Customer, Employee\")\r\n\r\n  and nested property paths my be specified as well\r\n  >     let query = new EntityQuery(\"Orders\")\r\n  >        .expand(\"Customer, OrderDetails, OrderDetails.Product\")\r\n  @param propertyPaths - A comma-separated list of navigation property names or an array of navigation property names. Each Navigation Property name can be followed\r\n  by a '.' and another navigation property name to enable identifying a multi-level relationship.\r\n  If 'propertyPaths' is either null or omitted then any existing 'expand' clause on the query is removed.\r\n  **/\r\n  expand(propertyPaths?: string | string[]) {\r\n    let expandClause = propertyPaths == null ? null : new ExpandClause(normalizePropertyPaths(propertyPaths));\r\n    return clone(this, \"expandClause\", expandClause);\r\n  }\r\n\r\n  /**\r\n  Returns a new query that includes a collection of parameters to pass to the server.\r\n  >     let query = EntityQuery.from(\"EmployeesFilteredByCountryAndBirthdate\")\r\n  >        .withParameters({ BirthDate: \"1/1/1960\", Country: \"USA\" });\r\n   \r\n  will call the 'EmployeesFilteredByCountryAndBirthdate' method on the server and pass in 2 parameters. This\r\n  query will be uri encoded as\r\n  >      {serviceApi}/EmployeesFilteredByCountryAndBirthdate?birthDate=1%2F1%2F1960&country=USA\r\n\r\n  Parameters may also be mixed in with other query criteria.\r\n  >     let query = EntityQuery.from(\"EmployeesFilteredByCountryAndBirthdate\")\r\n  >        .withParameters({ BirthDate: \"1/1/1960\", Country: \"USA\" })\r\n  >        .where(\"LastName\", \"startsWith\", \"S\")\r\n  >        .orderBy(\"BirthDate\");\r\n  @param parameters - A parameters object where the keys are the parameter names and the values are the parameter values.\r\n  **/\r\n  withParameters(parameters: Object) {\r\n    assertParam(parameters, \"parameters\").isObject().check();\r\n    return clone(this, \"parameters\", parameters);\r\n  }\r\n\r\n  /**\r\n  Returns a query with the `inlineCount` capability either enabled or disabled.  With `inlineCount` enabled, an additional 'inlineCount' property\r\n  will be returned with the query results that will contain the number of entities that would have been returned by this\r\n  query with only the 'where'/'filter' clauses applied, i.e. without any 'skip'/'take' operators applied. For local queries this clause is ignored.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >        .take(20)\r\n  >        .orderBy(\"CompanyName\")\r\n  >        .inlineCount(true);\r\n\r\n  will return the first 20 customers as well as a count of _all_ of the customers in the remote store.\r\n  @param enabled - (default = true) Whether or not inlineCount capability should be enabled. If this parameter is omitted, true is assumed.\r\n  **/\r\n  inlineCount(enabled?: boolean) {\r\n    assertParam(enabled, \"enabled\").isBoolean().isOptional().check();\r\n    enabled = (enabled === undefined) ? true : !!enabled;\r\n    return clone(this, \"inlineCountEnabled\", enabled);\r\n  }\r\n\r\n  useNameOnServer(usesNameOnServer?: boolean) {\r\n    assertParam(usesNameOnServer, \"usesNameOnServer\").isBoolean().isOptional().check();\r\n    usesNameOnServer = (usesNameOnServer === undefined) ? true : !!usesNameOnServer;\r\n    return clone(this, \"usesNameOnServer\", usesNameOnServer);\r\n  }\r\n\r\n  /**\r\n  Returns a query with the `noTracking` capability either enabled or disabled.  With `noTracking` enabled, the results of this query\r\n  will not be coerced into entities but will instead look like raw javascript projections. i.e. simple javascript objects.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >         .take(20)\r\n  >         .orderBy(\"CompanyName\")\r\n  >         .noTracking(true);\r\n  @param enabled - (default = true) Whether or not the noTracking capability should be enabled. If this parameter is omitted, true is assumed.\r\n  **/\r\n  noTracking(enabled?: boolean) {\r\n    assertParam(enabled, \"enabled\").isBoolean().isOptional().check();\r\n    enabled = (enabled === undefined) ? true : !!enabled;\r\n    return clone(this, \"noTrackingEnabled\", enabled);\r\n  }\r\n\r\n  /**\r\n  Returns a query with the `usePost` capability either enabled or disabled.  With `usePost` enabled, the query is sent\r\n  as a POST request (instead of GET) and the query expression will be sent as JSON in the body of the post.\r\n  Note that the server must be able to parse the body of the request; otherwise the query expression will be ignored.\r\n  >     let query = new EntityQuery(\"Customers\")\r\n  >         .where(\"companyId\", \"eq\", 1)\r\n  >         .usePost(true);\r\n  results in a POST request to `{host}/{path}/Customers`\r\n  with body `{\"where\": {\"companyId\":{\"eq\":1}}}`\r\n  @param enabled - (default = true) Whether or not usePost should be enabled. If this parameter is omitted, true is assumed.\r\n  **/\r\n  usePost(enabled?: boolean) {\r\n    assertParam(enabled, \"enabled\").isBoolean().isOptional().check();\r\n    enabled = (enabled === undefined) ? true : !!enabled;\r\n    return clone(this, \"usePostEnabled\", enabled);\r\n  }\r\n\r\n  using(obj: EntityManager): EntityQuery;\r\n  using(obj: DataService): EntityQuery;\r\n  using(obj: JsonResultsAdapter): EntityQuery;\r\n  using(obj: QueryOptions): EntityQuery;\r\n  using(obj: MergeStrategy): EntityQuery;\r\n  using(obj: FetchStrategy): EntityQuery;\r\n  /**\r\n  Returns a copy of this EntityQuery with the specified [[EntityManager]], [[DataService]],\r\n  [[JsonResultsAdapter]], [[MergeStrategy]] or [[FetchStrategy]] applied.\r\n  >      // 'using' can be used to return a new query with a specified EntityManager.\r\n  >      let em = new EntityManager(serviceName);\r\n  >      let query = new EntityQuery(\"Orders\")\r\n  >        .using(em);\r\n\r\n  or with a specified [[MergeStrategy]]\r\n  >      let em = new EntityManager(serviceName);\r\n  >      let query = new EntityQuery(\"Orders\")\r\n  >        .using(MergeStrategy.PreserveChanges);\r\n\r\n  or with a specified [[FetchStrategy]]\r\n  >      let em = new EntityManager(serviceName);\r\n  >      let query = new EntityQuery(\"Orders\")\r\n  >        .using(FetchStrategy.FromLocalCache);\r\n  @param obj - The object to update in creating a new EntityQuery from an existing one.\r\n  **/\r\n  using(obj: any) {\r\n    if (!obj) return this;\r\n    let eq = clone(this);\r\n    processUsing(eq, {\r\n      \"entityManager\": null,\r\n      \"dataService\": null,\r\n      \"queryOptions\": null,\r\n      \"fetchStrategy\": (eq: EntityQuery, val: any) => {\r\n        eq.queryOptions = (eq.queryOptions || new QueryOptions()).using(val);\r\n      },\r\n      \"mergeStrategy\": (eq: EntityQuery, val: any) => {\r\n        eq.queryOptions = (eq.queryOptions || new QueryOptions()).using(val);\r\n      },\r\n      \"jsonResultsAdapter\": (eq: EntityQuery, val: any) => {\r\n        eq.dataService = (eq.dataService || new DataService()).using({ jsonResultsAdapter: val });\r\n      }\r\n    }, obj);\r\n    return eq;\r\n  }\r\n\r\n  /**\r\n  Executes this query.  This method requires that an EntityManager has been previously specified via the \"using\" method.\r\n  \r\n  This method can be called using a 'promises' syntax ( recommended)\r\n  >      let em = new EntityManager(serviceName);\r\n  >      let query = new EntityQuery(\"Orders\").using(em);\r\n  >      query.execute().then( function(data) {\r\n  >          ... query results processed here\r\n  >      }).catch( function(err) {\r\n  >          ... query failure processed here\r\n  >      });\r\n\r\n  or with callbacks\r\n  >      let em = new EntityManager(serviceName);\r\n  >      let query = new EntityQuery(\"Orders\").using(em);\r\n  >      query.execute(\r\n  >        function(data) {\r\n  >                    let orders = data.results;\r\n  >                    ... query results processed here\r\n  >                },\r\n  >        function(err) {\r\n  >                    ... query failure processed here\r\n  >                });\r\n\r\n  Either way this method is the same as calling the EntityManager 'execute' method.\r\n  >      let em = new EntityManager(serviceName);\r\n  >      let query = new EntityQuery(\"Orders\");\r\n  >      em.executeQuery(query).then( function(data) {\r\n  >         let orders = data.results;\r\n  >          ... query results processed here\r\n  >      }).catch( function(err) {\r\n  >         ... query failure processed here\r\n  >      });\r\n\r\n  @param callback -  Function called on success.\r\n  @param errorCallback - Function called on failure.\r\n  @return Promise\r\n  **/\r\n  execute(callback?: Callback, errorCallback?: ErrorCallback): Promise<QueryResult> {\r\n    if (!this.entityManager) {\r\n      throw new Error(\"An EntityQuery must have its EntityManager property set before calling 'execute'\");\r\n    }\r\n    return this.entityManager.executeQuery(this, callback, errorCallback);\r\n  }\r\n\r\n  /**\r\n  Executes this query against the local cache.  This method requires that an EntityManager have been previously specified via the \"using\" method.\r\n  >      // assume em is an entityManager already filled with order entities;\r\n  >      let query = new EntityQuery(\"Orders\").using(em);\r\n  >      let orders = query.executeLocally();\r\n\r\n  Note that calling this method is the same as calling [[EntityManager.executeQueryLocally]].\r\n  **/\r\n  executeLocally() {\r\n    if (!this.entityManager) {\r\n      throw new Error(\"An EntityQuery must have its EntityManager property set before calling 'executeLocally'\");\r\n    }\r\n    return this.entityManager.executeQueryLocally(this);\r\n  }\r\n\r\n  toJSON() {\r\n    return this.toJSONExt();\r\n  }\r\n\r\n  /** Typically only for use when building UriBuilderAdapters.  \r\n  @hidden @internal  \r\n  */\r\n  toJSONExt(context?: EntityQueryJsonContext) {\r\n    context = context || {};\r\n    context.entityType = context.entityType || this.fromEntityType;\r\n    context.propertyPathFn = context.toNameOnServer ? context.entityType!.clientPropertyPathToServer.bind(context.entityType) : core.identity;\r\n\r\n    let toJSONExtFn = function (v: any) {\r\n      return v ? v.toJSONExt(context) : undefined;\r\n    };\r\n    return core.toJson(this, {\r\n      \"from,resourceName\": null,\r\n      \"toType,resultEntityType\": function (v: any) {\r\n        // resultEntityType can be either a string or an entityType\r\n        return v ? (typeof v === 'string' ? v : v.name) : undefined;\r\n      },\r\n      \"where,wherePredicate\": toJSONExtFn,\r\n      \"orderBy,orderByClause\": toJSONExtFn,\r\n      \"select,selectClause\": toJSONExtFn,\r\n      \"expand,expandClause\": toJSONExtFn,\r\n      \"skip,skipCount\": null,\r\n      \"take,takeCount\": null,\r\n      parameters: function (v: any) {\r\n        return core.isEmpty(v) ? undefined : v;\r\n      },\r\n      \"inlineCount,inlineCountEnabled\": false,\r\n      \"noTracking,noTrackingEnabled\": false,\r\n      queryOptions: null\r\n    });\r\n\r\n  }\r\n\r\n  static fromEntities(entity: Entity): EntityQuery;\r\n  static fromEntities(entities: Entity[]): EntityQuery;\r\n  /**\r\n  Static method that creates an EntityQuery that will allow 'requerying' an entity or a collection of entities by primary key. This can be useful\r\n  to force a requery of selected entities, or to restrict an existing collection of entities according to some filter.\r\n\r\n  Works for a single entity or an array of entities of the SAME type.\r\n  Does not work for an array of entities of different types.\r\n  >      // assuming 'customers' is an array of 'Customer' entities retrieved earlier.\r\n  >      let customersQuery = EntityQuery.fromEntities(customers);\r\n\r\n  The resulting query can, of course, be extended\r\n  >      // assuming 'customers' is an array of 'Customer' entities retrieved earlier.\r\n  >      let customersQuery = EntityQuery.fromEntities(customers)\r\n  >        .where(\"Region\", FilterQueryOp.NotEquals, null);\r\n\r\n  Single entities can requeried as well.\r\n  >      // assuming 'customer' is a 'Customer' entity retrieved earlier.\r\n  >      let customerQuery = EntityQuery.fromEntities(customer);\r\n\r\n  will create a query that will return an array containing a single customer entity.\r\n  @param entities - The entities for which we want to create an EntityQuery.\r\n  **/\r\n  static fromEntities(entities: Entity | Entity[]) {\r\n    assertParam(entities, \"entities\").isEntity().or().isNonEmptyArray().isEntity().check();\r\n    let ents = (Array.isArray(entities)) ? entities : [entities];\r\n\r\n    let firstEntity = ents[0];\r\n    let type = firstEntity.entityType;\r\n    if (ents.some(function (e) {\r\n      return e.entityType !== type;\r\n    })) {\r\n      throw new Error(\"All 'fromEntities' must be the same type; at least one is not of type \" +\r\n        type.name);\r\n    }\r\n    let q = new EntityQuery(type.defaultResourceName);\r\n    let preds = ents.map(function (entity) {\r\n      return buildPredicate(entity);\r\n    });\r\n    let pred = Predicate.or(preds);\r\n    q = q.where(pred);\r\n    let em = firstEntity.entityAspect.entityManager;\r\n    if (em) {\r\n      q = q.using(em);\r\n    }\r\n    return q;\r\n  }\r\n\r\n  /**\r\n  Creates an EntityQuery for the specified [[EntityKey]].\r\n  >      let empType = metadataStore.getEntityType(\"Employee\");\r\n  >      let entityKey = new EntityKey(empType, 1);\r\n  >      let query = EntityQuery.fromEntityKey(entityKey);\r\n\r\n  or\r\n  >      // 'employee' is a previously queried employee\r\n  >      let entityKey = employee.entityAspect.getKey();\r\n  >      let query = EntityQuery.fromEntityKey(entityKey);\r\n  @param entityKey - The [[EntityKey]] for which a query will be created.\r\n  **/\r\n  static fromEntityKey(entityKey: EntityKey) {\r\n    assertParam(entityKey, \"entityKey\").isInstanceOf(EntityKey).check();\r\n    let q = new EntityQuery(entityKey.entityType.defaultResourceName);\r\n    let pred = buildKeyPredicate(entityKey);\r\n    q = q.where(pred).toType(entityKey.entityType);\r\n    return q;\r\n  }\r\n\r\n  /**\r\n  Creates an EntityQuery for the specified entity and [[NavigationProperty]].\r\n  >      // 'employee' is a previously queried employee\r\n  >      let ordersNavProp = employee.entityType.getProperty(\"Orders\");\r\n  >      let query = EntityQuery.fromEntityNavigation(employee, ordersNavProp);\r\n\r\n  will return a query for the \"Orders\" of the specified 'employee'.\r\n  @param entity - The Entity whose navigation property will be queried.\r\n  @param navigationProperty - The [[NavigationProperty]] or name of the NavigationProperty to be queried.\r\n  **/\r\n  static fromEntityNavigation = function (entity: Entity, navigationProperty: NavigationProperty | string) {\r\n    assertParam(entity, \"entity\").isEntity().check();\r\n    let navProperty = entity.entityType._checkNavProperty(navigationProperty);\r\n    let q = new EntityQuery(navProperty.entityType.defaultResourceName);\r\n    let pred = buildNavigationPredicate(entity, navProperty);\r\n    if (pred == null) {\r\n      throw new Error(\"Unable to create a NavigationQuery for navigationProperty: \" + navProperty.name );\r\n    }\r\n    q = q.where(pred);\r\n    let em = entity.entityAspect.entityManager;\r\n    return em ? q.using(em) : q;\r\n  };\r\n\r\n  // protected methods\r\n  /** @hidden @internal */\r\n  _getFromEntityType(metadataStore: MetadataStore, throwErrorIfNotFound?: boolean) {\r\n    // Uncomment next two lines if we make this method public.\r\n    // assertParam(metadataStore, \"metadataStore\").isInstanceOf(MetadataStore).check();\r\n    // assertParam(throwErrorIfNotFound, \"throwErrorIfNotFound\").isBoolean().isOptional().check();\r\n    let entityType = this.fromEntityType;\r\n    if (entityType) return entityType;\r\n\r\n    let resourceName = this.resourceName;\r\n    if (!resourceName) {\r\n      throw new Error(\"There is no resourceName for this query\");\r\n    }\r\n\r\n    if (metadataStore.isEmpty()) {\r\n      if (throwErrorIfNotFound) {\r\n        throw new Error(\"There is no metadata available for this query. \" +\r\n          \"Are you querying the local cache before you've fetched metadata?\");\r\n      } else {\r\n        return undefined;\r\n      }\r\n    }\r\n\r\n    let entityTypeName = metadataStore.getEntityTypeNameForResourceName(resourceName);\r\n    if (entityTypeName) {\r\n      entityType = metadataStore._getStructuralType(entityTypeName) as EntityType;\r\n    } else {\r\n      entityType = this._getToEntityType(metadataStore, true);\r\n    }\r\n\r\n    if (!entityType) {\r\n      if (throwErrorIfNotFound) {\r\n        throw new Error(core.formatString(\"Cannot find an entityType for resourceName: '%1'. \", resourceName) + core.strings.TO_TYPE);\r\n      } else {\r\n        return undefined;\r\n      }\r\n    }\r\n\r\n    this.fromEntityType = entityType;\r\n    return entityType;\r\n\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _getToEntityType(metadataStore: MetadataStore, skipFromCheck?: boolean): EntityType | undefined {\r\n    // skipFromCheck is to avoid recursion if called from _getFromEntityType;\r\n    if (this.resultEntityType instanceof EntityType) {\r\n      return this.resultEntityType;\r\n    } else if (this.resultEntityType) {\r\n      // resultEntityType is a string\r\n      this.resultEntityType = metadataStore._getStructuralType(this.resultEntityType, false) as EntityType;\r\n      return this.resultEntityType;\r\n    } else {\r\n      // resolve it, if possible, via the resourceName\r\n      // do not cache this value in this case\r\n      // cannot determine the resultEntityType if a selectClause is present.\r\n      // return skipFromCheck ? null : (!this.selectClause) && this._getFromEntityType(metadataStore, false);\r\n      if (skipFromCheck || this.selectClause) {\r\n        return undefined;\r\n      } else {\r\n        this._getFromEntityType(metadataStore, false);\r\n      }\r\n\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  // for testing\r\n  _toUri(em: EntityManager) {\r\n    let ds = DataService.resolve([em.dataService]);\r\n    return ds!.uriBuilder!.buildUri(this, em.metadataStore);\r\n  }\r\n\r\n}\r\nEntityQuery.prototype._$typeName = \"EntityQuery\";\r\n\r\n// private functions\r\n\r\nfunction fromJSON(eq: EntityQuery, json: Object) {\r\n  core.toJson(json, {\r\n    \"resourceName,from\": null,\r\n    // just the name comes back and will be resolved later\r\n    \"resultEntityType,toType\": null,\r\n    \"wherePredicate,where\": function (v: any) {\r\n      return v ? new Predicate(v) : undefined;\r\n    },\r\n    \"orderByClause,orderBy\": function (v: any) {\r\n      return v ? new OrderByClause(v) : undefined;\r\n    },\r\n    \"selectClause,select\": function (v: any) {\r\n      return v ? new SelectClause(v) : undefined;\r\n    },\r\n    \"expandClause,expand\": function (v: any) {\r\n      return v ? new ExpandClause(v) : undefined;\r\n    },\r\n    \"skipCount,skip\": null,\r\n    \"takeCount,take\": null,\r\n    parameters: function (v: any) {\r\n      return core.isEmpty(v) ? undefined : v;\r\n    },\r\n    \"inlineCountEnabled,inlineCount\": false,\r\n    \"noTrackingEnabled,noTracking\": false,\r\n    \"usePostEnabled,usePost\": false,\r\n    queryOptions: function (v: any) {\r\n      return v ? QueryOptions.fromJSON(v) : undefined;\r\n    }\r\n  }, eq);\r\n  return eq;\r\n}\r\n\r\nfunction clone(eq: EntityQuery, propName?: string, value?: any) {\r\n  // immutable queries mean that we don't need to clone if no change in value.\r\n  if (propName) {\r\n    if (eq[propName] === value) return eq;\r\n  }\r\n  // copying QueryOptions is safe because they are are immutable;\r\n  let copy = core.extend(new EntityQuery(), eq, [\r\n    \"resourceName\",\r\n    \"fromEntityType\",\r\n    \"wherePredicate\",\r\n    \"orderByClause\",\r\n    \"selectClause\",\r\n    \"skipCount\",\r\n    \"takeCount\",\r\n    \"expandClause\",\r\n    \"inlineCountEnabled\",\r\n    \"noTrackingEnabled\",\r\n    \"usePostEnabled\",\r\n    \"usesNameOnServer\",\r\n    \"queryOptions\",\r\n    \"entityManager\",\r\n    \"dataService\",\r\n    \"resultEntityType\"\r\n  ]) as EntityQuery;\r\n  copy.parameters = core.extend({}, eq.parameters);\r\n  if (propName) {\r\n    copy[propName] = value;\r\n  }\r\n  return copy;\r\n}\r\n\r\nfunction processUsing(eq: EntityQuery, map: Object, value: any, propertyName?: string) {\r\n  let typeName = value._$typeName || ((value instanceof BreezeEnum) && (value.constructor as any).name);\r\n  let key = typeName && typeName.substr(0, 1).toLowerCase() + typeName.substr(1);\r\n  if (propertyName && key !== propertyName) {\r\n    throw new Error(\"Invalid value for property: \" + propertyName);\r\n  }\r\n  if (key) {\r\n    let fn = map[key];\r\n    if (fn === undefined) {\r\n      throw new Error(\"Invalid config property: \" + key);\r\n    } else if (fn === null) {\r\n      eq[key] = value;\r\n    } else {\r\n      fn(eq, value);\r\n    }\r\n  } else {\r\n    core.objectForEach(value, (propName, val) => {\r\n      processUsing(eq, map, val, propName);\r\n    });\r\n  }\r\n}\r\n\r\nfunction normalizePropertyPaths(propertyPaths: string | string[]) {\r\n  assertParam(propertyPaths, \"propertyPaths\").isOptional().isString().or().isArray().isString().check();\r\n  if (typeof propertyPaths === 'string') {\r\n    propertyPaths = propertyPaths.split(\",\");\r\n  }\r\n\r\n  propertyPaths = propertyPaths.map(function (pp) {\r\n    return pp.trim();\r\n  });\r\n  return propertyPaths;\r\n}\r\n\r\nfunction buildPredicate(entity: Entity) {\r\n  let entityType = entity.entityType;\r\n  let predParts = entityType.keyProperties.map(function (kp) {\r\n    return Predicate.create(kp.name, FilterQueryOp.Equals, entity.getProperty(kp.name));\r\n  });\r\n  let pred = Predicate.and(predParts);\r\n  return pred;\r\n}\r\n\r\nfunction buildKeyPredicate(entityKey: EntityKey) {\r\n  let keyProps = entityKey.entityType.keyProperties;\r\n  let preds = core.arrayZip(keyProps, entityKey.values, function (kp, v) {\r\n    return Predicate.create(kp.name, FilterQueryOp.Equals, v);\r\n  });\r\n  let pred = Predicate.and(preds);\r\n  return pred;\r\n}\r\n\r\nfunction buildNavigationPredicate(entity: Entity, navigationProperty: NavigationProperty) {\r\n  if (navigationProperty.isScalar) {\r\n    if (navigationProperty.foreignKeyNames.length === 0) return null;\r\n    let relatedKeyValues = navigationProperty.foreignKeyNames.map((fkName) => {\r\n      return entity.getProperty(fkName);\r\n    });\r\n    let entityKey = new EntityKey(navigationProperty.entityType, relatedKeyValues);\r\n    return buildKeyPredicate(entityKey);\r\n  } else {\r\n    let inverseNp = navigationProperty.inverse;\r\n    let foreignKeyNames = inverseNp ? inverseNp.foreignKeyNames : navigationProperty.invForeignKeyNames;\r\n    if (foreignKeyNames.length === 0) return null;\r\n    let keyValues = entity.entityAspect.getKey().values;\r\n    let predParts = core.arrayZip(foreignKeyNames, keyValues, (fkName, kv) => {\r\n      return Predicate.create(fkName, FilterQueryOp.Equals, kv);\r\n    });\r\n    return Predicate.and(predParts);\r\n  }\r\n}\r\n\r\n/** Base class for BooleanQueryOp and FilterQueryOp */\r\nexport interface QueryOp {\r\n  /** The operator for this enum. */\r\n  operator: string;\r\n}\r\n\r\n\r\n\r\n/**\r\nFilterQueryOp is an 'Enum' containing all of the valid  [[Predicate]]\r\nfilter operators for an [[EntityQuery]].\r\n**/\r\nexport class FilterQueryOp extends BreezeEnum implements QueryOp {\r\n  /** The operator for this enum. */\r\n  declare operator: string;\r\n\r\n  /** Aliases: \"eq\", \"==\" **/\r\n  static Equals = new FilterQueryOp({ operator: \"eq\" });\r\n  /**  Aliases: \"ne\", \"!=\"  **/\r\n  static NotEquals = new FilterQueryOp({ operator: \"ne\" });\r\n  /** Aliases: \"gt\", \">\"   **/\r\n  static GreaterThan = new FilterQueryOp({ operator: \"gt\" });\r\n  /** Aliases: \"lt\", \"<\"  **/\r\n  static LessThan = new FilterQueryOp({ operator: \"lt\" });\r\n  /**  Aliases: \"ge\", \">=\"  **/\r\n  static GreaterThanOrEqual = new FilterQueryOp({ operator: \"ge\" });\r\n  /**  Aliases: \"le\", \"<=\"  **/\r\n  static LessThanOrEqual = new FilterQueryOp({ operator: \"le\" });\r\n  /**  String operation: Is a string a substring of another string.  Aliases: \"substringof\"   **/\r\n  static Contains = new FilterQueryOp({ operator: \"contains\" });\r\n  /** No aliases */\r\n  static StartsWith = new FilterQueryOp({ operator: \"startswith\" });\r\n  /** No aliases */\r\n  static EndsWith = new FilterQueryOp({ operator: \"endswith\" });\r\n  /**  Aliases: \"some\"  **/\r\n  static Any = new FilterQueryOp({ operator: \"any\" });\r\n  /**  Aliases: \"every\"  **/\r\n  static All = new FilterQueryOp({ operator: \"all\" });\r\n  /** No aliases */\r\n  static In = new FilterQueryOp({ operator: \"in\" });\r\n  /** No aliases */\r\n  static IsTypeOf = new FilterQueryOp({ operator: \"isof\" });\r\n}\r\nFilterQueryOp.prototype._$typeName = \"FilterQueryOp\";\r\nError['x'] = FilterQueryOp.resolveSymbols();\r\n\r\n\r\n/**\r\n BooleanQueryOp is an 'Enum' containing all of the valid  boolean\r\noperators for an [[EntityQuery]].\r\n**/\r\nexport class BooleanQueryOp extends BreezeEnum implements QueryOp {\r\n  /** The operator for this enum. */\r\n  declare operator: string;\r\n\r\n  static And = new BooleanQueryOp({ operator: \"and\" });\r\n  static Or = new BooleanQueryOp({ operator: \"or\" });\r\n  static Not = new BooleanQueryOp({ operator: \"not\" });\r\n\r\n}\r\nBooleanQueryOp.prototype._$typeName = \"BooleanQueryOp\";\r\nError['x'] = BooleanQueryOp.resolveSymbols();\r\n\r\n\r\n/** For use by breeze plugin authors only.  The class is used in most [[IUriBuilderAdapter]] implementations\r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden\r\n\r\nAn OrderByClause is a description of the properties and direction that the result\r\nof a query should be sorted in.  OrderByClauses are immutable, which means that any\r\nmethod that would modify an OrderByClause actually returns a new OrderByClause.\r\n\r\nFor example for an Employee object with properties of 'Company' and 'LastName' the following would be valid expressions:\r\n>     let obc = new OrderByClause(\"Company.CompanyName, LastName\")\r\n\r\nor\r\n>     let obc = new OrderByClause(\"Company.CompanyName desc, LastName\")\r\n\r\nor\r\n>     let obc = new OrderByClause(\"Company.CompanyName, LastName\", true);\r\n*/\r\nexport class OrderByClause {\r\n  /** @hidden @internal */\r\n  items: OrderByItem[];\r\n\r\n  constructor(propertyPaths: string[] | OrderByClause[], isDesc?: boolean) {\r\n    if (propertyPaths.length === 0) {\r\n      throw new Error(\"OrderByClause cannot be empty\");\r\n    }\r\n\r\n    // you can also pass in an array of orderByClauses\r\n    if (propertyPaths[0] instanceof OrderByClause) {\r\n      let clauses = propertyPaths as OrderByClause[];\r\n      this.items = core.arrayFlatMap(clauses, c => c.items);\r\n      // this.items = Array.prototype.concat.apply(clauses[0].items, clauses.slice(1).map(core.pluck(\"items\")));\r\n      // this.items = Array.prototype.concat.apply([], clauses.map(core.pluck(\"items\")));\r\n    } else {\r\n      this.items = (propertyPaths as string[]).map(function (pp) {\r\n        return new OrderByItem(pp, isDesc);\r\n      });\r\n    }\r\n\r\n  }\r\n\r\n  validate(entityType: EntityType) {\r\n    if (entityType == null || entityType.isAnonymous) return;\r\n    this.items.forEach((item) => {\r\n      item.validate(entityType);\r\n    });\r\n  }\r\n\r\n  getComparer(entityType: EntityType) {\r\n    let orderByFuncs = this.items.map(function (obc) {\r\n      return obc.getComparer(entityType);\r\n    });\r\n    return function (entity1: any, entity2: any) {\r\n      for (let i = 0; i < orderByFuncs.length; i++) {\r\n        let result = orderByFuncs[i](entity1, entity2);\r\n        if (result !== 0) {\r\n          return result;\r\n        }\r\n      }\r\n      return 0;\r\n    };\r\n  }\r\n\r\n  toJSONExt(context: EntityQueryJsonContext) {\r\n    return this.items.map(function (item) {\r\n      return context.propertyPathFn!(item.propertyPath) + (item.isDesc ? \" desc\" : \"\");\r\n    });\r\n  }\r\n\r\n}\r\n\r\n/** @hidden @internal */\r\nexport class OrderByItem {\r\n  propertyPath: string;\r\n  isDesc: boolean;\r\n  lastProperty: EntityProperty;\r\n\r\n  constructor(propertyPath: string, isDesc?: boolean) {\r\n    if (!(typeof propertyPath === 'string')) {\r\n      throw new Error(\"propertyPath is not a string\");\r\n    }\r\n    propertyPath = propertyPath.trim();\r\n\r\n    let parts = propertyPath.split(' ');\r\n    // parts[0] is the propertyPath; [1] would be whether descending or not.\r\n    // if (parts.length > 1 && isDesc !== true && isDesc !== false) {\r\n    if (parts.length > 1 && isDesc == null) {\r\n      isDesc = core.stringStartsWith(parts[1].toLowerCase(), \"desc\");\r\n      if (!isDesc) {\r\n        // isDesc is false but check to make sure its intended.\r\n        let isAsc = core.stringStartsWith(parts[1].toLowerCase(), \"asc\");\r\n        if (!isAsc) {\r\n          throw new Error(\"the second word in the propertyPath must begin with 'desc' or 'asc'\");\r\n        }\r\n\r\n      }\r\n    }\r\n    this.propertyPath = parts[0];\r\n    this.isDesc = isDesc || false;\r\n  }\r\n\r\n  validate(entityType: EntityType): EntityProperty | undefined {\r\n    if (entityType == null || entityType.isAnonymous) return;\r\n    // will throw an exception on bad propertyPath\r\n    this.lastProperty = entityType.getProperty(this.propertyPath, true) as EntityProperty;\r\n    return this.lastProperty;\r\n  }\r\n\r\n  getComparer(entityType: EntityType) {\r\n    let propDataType: DataType;\r\n    let isCaseSensitive: boolean;\r\n    if (!this.lastProperty) this.validate(entityType);\r\n    if (this.lastProperty) {\r\n      propDataType = (this.lastProperty as any).dataType;\r\n      isCaseSensitive = this.lastProperty.parentType.metadataStore.localQueryComparisonOptions.isCaseSensitive;\r\n    }\r\n\r\n    let propertyPath = this.propertyPath;\r\n    let isDesc = this.isDesc;\r\n\r\n    return function (entity1: any, entity2: any) {\r\n      let value1 = EntityAspect.getPropertyPathValue(entity1, propertyPath);\r\n      let value2 = EntityAspect.getPropertyPathValue(entity2, propertyPath);\r\n      let dataType = propDataType || (value1 && DataType.fromValue(value1)) || DataType.fromValue(value2);\r\n      if (dataType === DataType.String) {\r\n        if (isCaseSensitive) {\r\n          value1 = value1 || \"\";\r\n          value2 = value2 || \"\";\r\n        } else {\r\n          value1 = (value1 || \"\").toLowerCase();\r\n          value2 = (value2 || \"\").toLowerCase();\r\n        }\r\n      } else {\r\n        let normalize = DataType.getComparableFn(dataType);\r\n        value1 = normalize(value1);\r\n        value2 = normalize(value2);\r\n      }\r\n      if (value1 === value2) {\r\n        return 0;\r\n      } else if (value1 > value2 || value2 === undefined) {\r\n        return isDesc ? -1 : 1;\r\n      } else {\r\n        return isDesc ? 1 : -1;\r\n      }\r\n    };\r\n  }\r\n}\r\n\r\n/** For use by breeze plugin authors only.  The class is used in most [[IUriBuilderAdapter]] implementations\r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n**/\r\nexport class SelectClause {\r\n  propertyPaths: string[];\r\n  /** @hidden @internal */\r\n  _pathNames: string[];\r\n\r\n  constructor(propertyPaths: string[]) {\r\n    this.propertyPaths = propertyPaths;\r\n    this._pathNames = propertyPaths.map(function (pp) {\r\n      return pp.replace(\".\", \"_\");\r\n    });\r\n  }\r\n\r\n  validate(entityType: EntityType) {\r\n    if (entityType == null || entityType.isAnonymous) return; // can't validate yet\r\n    // will throw an exception on bad propertyPath\r\n    this.propertyPaths.forEach(function (path) {\r\n      entityType.getProperty(path, true);\r\n    });\r\n  }\r\n\r\n  toFunction(/* config */) {\r\n    let that = this;\r\n    return function (entity: Entity) {\r\n      let result = {};\r\n      that.propertyPaths.forEach(function (path, i) {\r\n        result[that._pathNames[i]] = EntityAspect.getPropertyPathValue(entity, path);\r\n      });\r\n      return result;\r\n    };\r\n  }\r\n\r\n  toJSONExt(context: EntityQueryJsonContext) {\r\n    return this.propertyPaths.map(function (pp) {\r\n      return context.propertyPathFn!(pp);\r\n    });\r\n  }\r\n}\r\n\r\n/** For use by breeze plugin authors only.  The class is used in most [[IUriBuilderAdapter]] implementations\r\n@adapter (see [[IUriBuilderAdapter]])    \r\n@hidden \r\n**/\r\nexport class ExpandClause {\r\n  propertyPaths: string[];\r\n\r\n  constructor(propertyPaths: string[]) {\r\n    this.propertyPaths = propertyPaths;\r\n  }\r\n\r\n  toJSONExt(context: EntityQueryJsonContext) {\r\n    return this.propertyPaths.map(function (pp) {\r\n      return context.propertyPathFn!(pp);\r\n    });\r\n  }\r\n\r\n}\r\n\r\n\r\n","import { core } from './core';\r\nimport { config } from './config';\r\nimport { BreezeEvent } from './event';\r\nimport { assertParam } from './assert-param';\r\nimport { EntityState  } from './entity-state';\r\nimport { EntityAction } from './entity-action';\r\nimport { EntityType, ComplexType, DataProperty, NavigationProperty, EntityProperty } from './entity-metadata';\r\nimport { EntityKey } from './entity-key';\r\nimport { EntityGroup } from './entity-group';\r\nimport { EntityManager, QueryResult, QueryErrorCallback, QuerySuccessCallback } from './entity-manager';\r\nimport { Validator, ValidationError } from './validate';\r\nimport { EntityQuery } from './entity-query';\r\n\r\nexport interface Entity {\r\n  entityAspect: EntityAspect;\r\n  entityType: EntityType;\r\n  /** Get the property with the given name */\r\n  getProperty?(prop: string): any;\r\n  /** Set the property with the given name */\r\n  setProperty?(prop: any, value: any): void;\r\n  /** @hidden @internal */\r\n  prototype?: { _$typeName: string };\r\n  /** @hidden @internal */\r\n  _$entityType?: EntityType;\r\n}\r\n\r\nexport interface ComplexObject {\r\n  complexAspect: ComplexAspect;\r\n  complexType: ComplexType;\r\n  getProperty?(prop: string): any;\r\n  setProperty?(prop: any, value: any): void;\r\n  /** @hidden @internal */\r\n  prototype?: { _$typeName: string };\r\n}\r\n\r\nexport type StructuralObject = Entity | ComplexObject;\r\n\r\nexport interface PropertyChangedEventArgs {\r\n  entity: Entity;\r\n  propertyName: string | null;\r\n  parent?: StructuralObject;\r\n  property?: EntityProperty;\r\n  oldValue?: any;\r\n  newValue?: any;\r\n}\r\n\r\nexport interface ValidationErrorsChangedEventArgs {\r\n  entity: Entity;\r\n  added: ValidationError[];\r\n  removed: ValidationError[];\r\n}\r\n\r\n/**\r\nAn EntityAspect instance is associated with every attached entity and is accessed via the entity's 'entityAspect' property.\r\n\r\nThe EntityAspect itself provides properties to determine and modify the EntityState of the entity and has methods\r\nthat provide a variety of services including validation and change tracking.\r\n\r\nAn EntityAspect will almost never need to be constructed directly. You will usually get an EntityAspect by accessing\r\nan entities 'entityAspect' property.  This property will be automatically attached when an entity is created via either\r\na query, import or [[EntityManager.createEntity]] call.\r\n>      // assume order is an order entity attached to an EntityManager.\r\n>      var aspect = order.entityAspect;\r\n>      var currentState = aspect.entityState;\r\n\r\n**/\r\nexport class EntityAspect {\r\n  /** The Entity that this aspect is associated with. __Read Only__  **/\r\n  entity?: Entity;\r\n  /** The [[EntityManager]] that contains this entity. __Read Only__ **/\r\n  entityManager?: EntityManager;\r\n  /**  @hidden @internal */\r\n  entityGroup?: EntityGroup;\r\n  /** The [[EntityState]] of this entity. __Read Only__ **/\r\n  entityState: EntityState;\r\n  /**   Whether this entity is in the process of being saved. __Read Only__ */\r\n  isBeingSaved: boolean;\r\n  /** The 'original values' of this entity where they are different from the 'current values'.\r\n  This is a map where the key is a property name and the value is the 'original value' of the property. */\r\n  originalValues: Record<string, any>;\r\n  /**  Whether this entity has any validation errors. __Read Only__ */\r\n  hasValidationErrors: boolean;\r\n  /** Whether this entity has a temporary [[EntityKey]]. */\r\n  hasTempKey: boolean;\r\n  /** Whether this entity was created by being loaded from the database */\r\n  wasLoaded?: boolean;\r\n  /** Extra metadata about this entity such as the entity's etag.\r\n  You may extend this object with your own metadata information.\r\n  Breeze (de)serializes this object when importing/exporting the entity. **/\r\n  extraMetadata?: any;\r\n  /**\r\n  A [[BreezeEvent]] that fires whenever any of the validation errors on this entity change.\r\n  Note that this might be the removal of an error when some data on the entity is fixed.\r\n  @eventArgs - \r\n    - entity - The entity on which the validation errors are being added or removed.\r\n    - added - An array containing any newly added [[ValidationError]]s\r\n    - removed - An array containing any newly removed [[ValidationError]]s. This is those\r\n      errors that have been 'fixed'.\r\n\r\n>      // assume order is an order entity attached to an EntityManager.\r\n>      order.entityAspect.validationErrorsChanged.subscribe(\r\n>      function (validationChangeArgs) {\r\n>          // this code will be executed anytime a property value changes on the 'order' entity.\r\n>          var entity == validationChangeArgs.entity; // Note: entity === order\r\n>          var errorsAdded = validationChangeArgs.added;\r\n>          var errorsCleared = validationChangeArgs.removed;\r\n>      });\r\n  @event\r\n  **/\r\n  validationErrorsChanged: BreezeEvent<ValidationErrorsChangedEventArgs>;\r\n  /**\r\n  A [[BreezeEvent]] that fires whenever a value of one of this entity's properties change.\r\n  @eventArgs -\r\n    - entity - The entity whose property has changed.\r\n    - property - The [[DataProperty]] that changed.\r\n    - propertyName - The name of the property that changed. This value will be 'null' for operations that replace the entire entity.  This includes\r\n      queries, imports and saves that require a merge. The remaining parameters will not exist in this case either. This will actually be a \"property path\"\r\n      for any properties of a complex type.\r\n    - oldValue - The old value of this property before the change.\r\n    - newValue - The new value of this property after the change.\r\n    - parent - The immediate parent object for the changed property.  This will be a ComplexType instance as opposed to an Entity \r\n      for any complex type or nested complex type properties.\r\n\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.propertyChanged.subscribe(\r\n  >      function (propertyChangedArgs) {\r\n  >          // this code will be executed anytime a property value changes on the 'order' entity.\r\n  >          var entity = propertyChangedArgs.entity; // Note: entity === order\r\n  >          var propertyNameChanged = propertyChangedArgs.propertyName;\r\n  >          var oldValue = propertyChangedArgs.oldValue;\r\n  >          var newValue = propertyChangedArgs.newValue;\r\n  >      });\r\n  @event\r\n  **/\r\n  propertyChanged: BreezeEvent<PropertyChangedEventArgs>;\r\n\r\n  /** @hidden @internal */\r\n  _validationErrors: { [index: string]: ValidationError };\r\n  /** @hidden @internal */\r\n  _pendingValidationResult: any;\r\n  /** @hidden @internal */\r\n  _entityKey: EntityKey;\r\n  /** @hidden @internal */\r\n  _loadedNps: any[];\r\n  /** @hidden @internal */\r\n  _initialized?: boolean;\r\n  /** @hidden @internal */\r\n  _inProcess: any[]; // used in defaultPropertyInterceptor for temp storage.\r\n  /** @hidden @internal */\r\n  _inProcessEntity?: Entity; // used in EntityManager\r\n  /** @hidden @internal */\r\n  static _nullInstance = new EntityAspect(); // TODO: determine if this works\r\n  /** @hidden @internal */\r\n  constructor(entity?: Entity) {\r\n\r\n    // if called without new\r\n    // if (!(this instanceof EntityAspect)) {\r\n    //   return new EntityAspect(entity);\r\n    // }\r\n\r\n    this.entity = entity;\r\n    // TODO: keep public or not?\r\n    this.entityGroup = undefined;\r\n    this.entityManager = undefined;\r\n    this.entityState = EntityState.Detached;\r\n    this.isBeingSaved = false;\r\n    this.originalValues = {};\r\n    this.hasValidationErrors = false;\r\n    this._validationErrors = {};\r\n\r\n    // Uncomment when we implement entityAspect.isNavigationPropertyLoaded method\r\n    // this._loadedNavPropMap = {};\r\n\r\n    this.validationErrorsChanged = new BreezeEvent(\"validationErrorsChanged\", this);\r\n    this.propertyChanged = new BreezeEvent(\"propertyChanged\", this);\r\n    // in case this is the NULL entityAspect. - used with ComplexAspects that have no parent.\r\n\r\n    if (entity != null) {\r\n      // remove properties that should be on prototype but placed on instance by Babel\r\n      if (entity.hasOwnProperty('entityType')) {\r\n        // throw new Error(\"Entity instance has entityType property; should only be on prototype\");\r\n        delete(entity.entityType);\r\n      }\r\n      entity.entityAspect = this;\r\n\r\n      // entityType should already be on the entity from 'watch'\r\n      let entityType = entity.entityType || entity._$entityType;\r\n      if (!entityType) {\r\n        let typeName = entity.prototype._$typeName;\r\n        if (!typeName) {\r\n          throw new Error(\"This entity is not registered as a valid EntityType\");\r\n        } else {\r\n          throw new Error(\"Metadata for this entityType has not yet been resolved: \" + typeName);\r\n        }\r\n      }\r\n      let entityCtor = entityType.getCtor();\r\n      config.interfaceRegistry.modelLibrary.getDefaultInstance().startTracking(entity, entityCtor.prototype);\r\n    }\r\n  }\r\n\r\n  /** @hidden */\r\n  // type-guard\r\n  static isEntity(obj: StructuralObject): obj is Entity {\r\n    return (obj as any).entityAspect != null;\r\n  }\r\n\r\n  // No longer used\r\n  // static createFrom(entity: Entity): EntityAspect {\r\n  //   if (entity == null) {\r\n  //     return EntityAspect._nullInstance;\r\n  //   } else if (entity.entityAspect) {\r\n  //     return entity.entityAspect;\r\n  //   }\r\n  //   return new EntityAspect(entity);\r\n  // }\r\n\r\n  // TODO: refactor this and the instance getPropertyValue method.\r\n  /**\r\n  Returns the value of a specified 'property path' for a specified entity.\r\n\r\n  The propertyPath can be either a string delimited with '.' or a string array.  \r\n  **/\r\n  // used by EntityQuery and Predicate\r\n  static getPropertyPathValue(obj: Entity, propertyPath: string | string[]) {\r\n    let properties = Array.isArray(propertyPath) ? propertyPath : propertyPath.split(\".\");\r\n    if (properties.length === 1) {\r\n      return obj.getProperty(propertyPath as string);\r\n    } else {\r\n      let nextValue = obj;\r\n      // hack use of some to perform mapFirst operation.\r\n      properties.some((prop) => {\r\n        nextValue = nextValue.getProperty(prop);\r\n        return nextValue == null;\r\n      });\r\n      return nextValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n  Returns the [[EntityKey]] for this Entity.\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      var entityKey = order.entityAspect.getKey();\r\n  @param forceRefresh - (boolean=false) Forces the recalculation of the key.  This should normally be unnecessary.\r\n  @return The [[EntityKey]] associated with this Entity.\r\n  **/\r\n  getKey(forceRefresh: boolean = false) {\r\n    forceRefresh = assertParam(forceRefresh, \"forceRefresh\").isBoolean().isOptional().check(false);\r\n    if (forceRefresh || !this._entityKey) {\r\n      let entityType = this.entity!.entityType;\r\n      let keyProps = entityType.keyProperties;\r\n      let values = keyProps.map(function (p) {\r\n        return this.entity.getProperty(p.name);\r\n      }, this);\r\n      this._entityKey = new EntityKey(entityType, values);\r\n    }\r\n    return this._entityKey;\r\n  }\r\n\r\n  /**\r\n  Returns the entity to an [[EntityState]] of 'Unchanged' by committing all changes made since the entity was last queried\r\n  had 'acceptChanges' called on it.\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.acceptChanges();\r\n  >      // The 'order' entity will now be in an 'Unchanged' state with any changes committed.\r\n  **/\r\n  acceptChanges() {\r\n    if (!this.entity) return;\r\n    this._checkOperation(\"acceptChanges\");\r\n    let em = this.entityManager!;\r\n    if (this.entityState.isDeleted()) {\r\n      em.detachEntity(this.entity);\r\n    } else {\r\n      this.setUnchanged();\r\n    }\r\n    em.entityChanged.publish({ entityAction: EntityAction.AcceptChanges, entity: this.entity });\r\n  }\r\n\r\n  /**\r\n  Returns the entity to an [[EntityState]] of 'Unchanged' by rejecting all changes made to it since the entity was last queried\r\n  had 'rejectChanges' called on it.\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.rejectChanges();\r\n  >      // The 'order' entity will now be in an 'Unchanged' state with any changes rejected.\r\n  **/\r\n  rejectChanges() {\r\n    this._checkOperation(\"rejectChanges\");\r\n    let entity = this.entity!;\r\n    let entityManager = this.entityManager!;\r\n    // we do not want PropertyChange or EntityChange events to occur here\r\n    core.using(entityManager, \"isRejectingChanges\", true, function () {\r\n      rejectChangesCore(entity);\r\n    });\r\n    if (this.entityState.isAdded()) {\r\n      // next line is needed because the following line will cause this.entityManager -> null;\r\n      entityManager.detachEntity(entity);\r\n      // need to tell em that an entity that needed to be saved no longer does.\r\n      entityManager._notifyStateChange(entity, false);\r\n    } else {\r\n      if (this.entityState.isDeleted()) {\r\n        entityManager._linkRelatedEntities(entity);\r\n      }\r\n      this.setUnchanged();\r\n      // propertyChanged propertyName is not specified because more than one property may have changed.\r\n      this.propertyChanged.publish({ entity: entity, propertyName: null });\r\n      entityManager.entityChanged.publish({ entityAction: EntityAction.RejectChanges, entity: entity });\r\n    }\r\n  }\r\n\r\n  /**  @hidden @internal */\r\n  // TODO: rename - and use '_'; used on both EntityAspect and ComplexAspect for polymorphic reasons.\r\n  getPropertyPath(propName: string) {\r\n    return propName;\r\n  }\r\n\r\n  /**\r\n  Sets the entity to an EntityState of 'Added'.  This is NOT the equivalent of calling [[EntityManager.addEntity]]\r\n  because no key generation will occur for autogenerated keys as a result of this operation. As a result this operation can be problematic\r\n  unless you are certain that the entity being marked 'Added' does not already exist in the database and does not have an autogenerated key.\r\n  The same operation can be performed by calling [[EntityAspect.setEntityState]].\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.setAdded();\r\n  >      // The 'order' entity will now be in an 'Added' state.\r\n  **/\r\n  setAdded() {\r\n    return this.setEntityState(EntityState.Added);\r\n  }\r\n\r\n  /**\r\n  Sets the entity to an EntityState of 'Unchanged'.  This is also the equivalent of calling [[EntityAspect.acceptChanges]].\r\n  The same operation can be performed by calling [[EntityAspect.setEntityState]].\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.setUnchanged();\r\n  >      // The 'order' entity will now be in an 'Unchanged' state with any changes committed.\r\n  **/\r\n  setUnchanged = function () {\r\n    return this.setEntityState(EntityState.Unchanged);\r\n  };\r\n\r\n\r\n  /**\r\n  Sets the entity to an EntityState of 'Modified'.  This can also be achieved by changing the value of any property on an 'Unchanged' entity.\r\n  The same operation can be performed by calling [[EntityAspect.setEntityState]].\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.setModified();\r\n  >      // The 'order' entity will now be in a 'Modified' state.\r\n  **/\r\n  setModified = function () {\r\n    return this.setEntityState(EntityState.Modified);\r\n  };\r\n\r\n  /**\r\n  Sets the entity to an EntityState of 'Deleted'.  This both marks the entity as being scheduled for deletion during the next 'Save' call\r\n  but also removes the entity from all of its related entities.  If the current entityState is 'Added', then `setDeleted()` will mark it 'Detached'\r\n  The same operation can be performed by calling [[EntityAspect.setEntityState]].\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.setDeleted();\r\n  >      // The 'order' entity will now be in a 'Deleted' state and it will no longer have any 'related' entities.\r\n  **/\r\n  setDeleted = function () {\r\n    return this.setEntityState(EntityState.Deleted);\r\n  };\r\n\r\n  /**\r\n  Sets the entity to an EntityState of 'Detached'.  This removes the entity from all of its related entities, but does NOT change the EntityState of any existing entities.\r\n  The same operation can be performed by calling [[EntityAspect.setEntityState]].\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.setDetached();\r\n  >      // The 'order' entity will now be in a 'Detached' state and it will no longer have any 'related' entities.\r\n  **/\r\n  setDetached = function () {\r\n    return this.setEntityState(EntityState.Detached);\r\n  };\r\n\r\n  /**\r\n  Sets the entity to the specified EntityState. See also 'setUnchanged', 'setModified', 'setDetached', etc.\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      order.entityAspect.setEntityState(EntityState.Unchanged);\r\n  >      // The 'order' entity will now be in a 'Unchanged' state.\r\n  **/\r\n  setEntityState(entityState: EntityState) {\r\n    if (this.entityState === entityState) return false;\r\n    this._checkOperation(\"setEntityState\");\r\n    if (this.entityState.isDetached()) {\r\n      throw new Error(\"You cannot set the 'entityState' of an entity when it is detached - except by first attaching it to an EntityManager\");\r\n    }\r\n    let entity = this.entity!;\r\n    let em = this.entityManager!;\r\n    let needsSave = true;\r\n    if (entityState === EntityState.Unchanged) {\r\n      clearOriginalValues(entity);\r\n      delete this.hasTempKey;\r\n      needsSave = false;\r\n    } else if (entityState === EntityState.Added) {\r\n      clearOriginalValues(entity);\r\n      // TODO: more to do here... like regenerating key ???\r\n    } else if (entityState === EntityState.Deleted) {\r\n      if (this.entityState.isAdded()) {\r\n        // turn it into a detach and exit early\r\n        this.setEntityState(EntityState.Detached);\r\n        return true;\r\n      } else {\r\n        // TODO: think about cascade deletes\r\n        // entityState needs to be set it early in this one case to insure that fk's are not cleared.\r\n        this.entityState = EntityState.Deleted;\r\n        removeFromRelations(entity, EntityState.Deleted);\r\n      }\r\n    } else if (entityState === EntityState.Modified) {\r\n      // nothing extra needed\r\n    } else if (entityState === EntityState.Detached) {\r\n      let group = this.entityGroup;\r\n      // no group === already detached.\r\n      if (!group) return false;\r\n      group.detachEntity(entity);\r\n      // needs to occur early here - so this IS deliberately redundent with the same code later in this method.\r\n      this.entityState = entityState;\r\n      removeFromRelations(entity, EntityState.Detached);\r\n      this._detach();\r\n      em.entityChanged.publish({ entityAction: EntityAction.Detach, entity: entity });\r\n      needsSave = false;\r\n    }\r\n    this.entityState = entityState;\r\n    em._notifyStateChange(entity, needsSave);\r\n    return true;\r\n  }\r\n\r\n  loadNavigationProperty(navigationProperty: string, callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback): Promise<QueryResult>;\r\n  loadNavigationProperty(navigationProperty: NavigationProperty, callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback): Promise<QueryResult>;\r\n  /**\r\n  Performs a query for the value of a specified [[NavigationProperty]]. __Async__\r\n  >      emp.entityAspect.loadNavigationProperty(\"Orders\").then(function (data) {\r\n  >          var orders = data.results;\r\n  >      }).catch(function (exception) {\r\n  >          // handle exception here;\r\n  >      });\r\n  @param navigationProperty - The NavigationProperty or the name of the NavigationProperty to 'load'.\r\n  @param callback - Function to call on success.\r\n  @param errorCallback - Function to call on failure.\r\n  @return Promise with shape\r\n    - results {Array of Entity}\r\n    - query {EntityQuery} The original query\r\n    - httpResponse {httpResponse} The HttpResponse returned from the server.\r\n  **/\r\n  loadNavigationProperty(navigationProperty: NavigationProperty | string, callback: QuerySuccessCallback, errorCallback: QueryErrorCallback) {\r\n    let entity = this.entity!;\r\n    let navProperty = entity.entityType._checkNavProperty(navigationProperty);\r\n    let query = EntityQuery.fromEntityNavigation(entity, navProperty);\r\n    // return entity.entityAspect.entityManager.executeQuery(query, callback, errorCallback);\r\n    let promise = entity.entityAspect.entityManager!.executeQuery(query);\r\n\r\n    return promise.then((data) => {\r\n      this._markAsLoaded(navProperty.name);\r\n      if (callback) callback(data);\r\n      return Promise.resolve(data);\r\n    }, (error) => {\r\n      if (errorCallback) errorCallback(error);\r\n      return Promise.reject(error);\r\n    });\r\n\r\n  }\r\n\r\n  /**\r\n  Marks this navigationProperty on this entity as already having been loaded.\r\n  >      emp.entityAspect.markNavigationPropertyAsLoaded(\"Orders\");\r\n  @param navigationProperty - The NavigationProperty or name of NavigationProperty to 'load'.\r\n  **/\r\n  markNavigationPropertyAsLoaded(navigationProperty: NavigationProperty | string) {\r\n    if (!this.entity) return;\r\n    let navProperty = this.entity.entityType._checkNavProperty(navigationProperty);\r\n    this._markAsLoaded(navProperty.name);\r\n  }\r\n\r\n  isNavigationPropertyLoaded(navigationProperty: string): boolean;\r\n  isNavigationPropertyLoaded(navigationProperty: NavigationProperty): boolean;\r\n  /**\r\n  Determines whether a navigationProperty on this entity has already been loaded.\r\n\r\n  A navigation property is considered loaded when any of the following three conditions applies:\r\n\r\n    1. It was fetched from the backend server.\r\n        <br/>   This can be the result of an expand query or a call to the [[EntityAspect.loadNavigationProperty]] method.\r\n        <br/>   Note that even if the fetch returns nothing the property is still marked as loaded in this case.\r\n    1. The property is scalar and has been set to a nonnull value.\r\n    1. The [[EntityAspect.markNavigationPropertyAsLoaded]] was called.\r\n  \r\n  >     var wasLoaded = emp.entityAspect.isNavigationPropertyLoaded(\"Orders\");\r\n  @param navigationProperty - The NavigationProperty or name of NavigationProperty to 'load'.\r\n  **/\r\n  isNavigationPropertyLoaded(navigationProperty: NavigationProperty | string) {\r\n    if (!this.entity) return;\r\n    let navProperty = this.entity.entityType._checkNavProperty(navigationProperty);\r\n    if (navProperty.isScalar && this.entity.getProperty(navProperty.name) != null) {\r\n      return true;\r\n    }\r\n    return this._loadedNps && this._loadedNps.indexOf(navProperty.name) >= 0;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _markAsLoaded(navPropName: string) {\r\n    this._loadedNps = this._loadedNps || [];\r\n    core.arrayAddItemUnique(this._loadedNps, navPropName);\r\n  }\r\n\r\n\r\n  /**\r\n  Performs validation on the entity, any errors encountered during the validation are available via the\r\n  [[EntityAspect.getValidationErrors]] method. Validating an entity means executing\r\n  all of the validators on both the entity itself as well as those on each of its properties.\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      var isOk = order.entityAspect.validateEntity();\r\n  >      // isOk will be 'true' if there are no errors on the entity.\r\n  >      if (!isOk) {\r\n  >          var errors = order.entityAspect.getValidationErrors();\r\n  >      }\r\n  @return Whether the entity passed validation.\r\n  **/\r\n  validateEntity() {\r\n    let ok = true;\r\n    this._processValidationOpAndPublish(function (that: any) {\r\n      ok = validateTarget(that.entity);\r\n    });\r\n    return ok;\r\n  }\r\n\r\n  validateProperty(property: string, context?: any): boolean;\r\n  validateProperty(property: DataProperty, context?: any): boolean;\r\n  validateProperty(property: NavigationProperty, context?: any): boolean;\r\n  /**\r\n  Performs validation on a specific property of this entity, any errors encountered during the validation are available via the\r\n  [[EntityAspect.getValidationErrors]] method. Validating a property means executing\r\n  all of the validators on the specified property.  This call is also made automatically anytime a property\r\n  of an entity is changed.\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      var isOk = order.entityAspect.validateProperty(\"Order\");\r\n\r\n  or\r\n  >      var orderDateProperty = order.entityType.getProperty(\"OrderDate\");\r\n  >      var isOk = order.entityAspect.validateProperty(OrderDateProperty);\r\n  @param property - The [[DataProperty]] or [[NavigationProperty]] to validate or a string \r\n  with the name of the property or a property path with the path to a property of a complex object.\r\n  @param context -  A context object used to pass additional information to each [[Validator]].\r\n  @return Whether the entity passed validation.\r\n  **/\r\n  validateProperty(property: EntityProperty | string, context: any) {\r\n    let value = this.getPropertyValue(property); // performs validations\r\n    if (value && value.complexAspect) {\r\n      return validateTarget(value);\r\n    }\r\n    context = context || {};\r\n    context.entity = this.entity;\r\n    if (typeof property === \"string\") {\r\n      context.property = this.entity!.entityType.getProperty(property, true);\r\n      context.propertyName = property;\r\n    } else {\r\n      context.property = property;\r\n      context.propertyName = property.name;\r\n    }\r\n\r\n    return this._validateProperty(value, context);\r\n  }\r\n\r\n  getValidationErrors(): ValidationError[];\r\n  getValidationErrors(property: string): ValidationError[];\r\n  getValidationErrors(property: EntityProperty): ValidationError[];\r\n  /**\r\n  Returns the validation errors associated with either the entire entity or any specified property.\r\n  \r\n  This method can return all of the errors for an Entity\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      var valErrors = order.entityAspect.getValidationErrors();\r\n\r\n  as well as those for just a specific property.\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      var orderDateErrors = order.entityAspect.getValidationErrors(\"OrderDate\");\r\n\r\n  which can also be expressed as\r\n  >      // assume order is an order entity attached to an EntityManager.\r\n  >      var orderDateProperty = order.entityType.getProperty(\"OrderDate\");\r\n  >      var orderDateErrors = order.entityAspect.getValidationErrors(orderDateProperty);\r\n  @param property - The property for which validation errors should be retrieved.\r\n  If omitted, all of the validation errors for this entity will be returned.\r\n  @return A array of validation errors.\r\n  **/\r\n  getValidationErrors(property?: DataProperty | NavigationProperty | string) {\r\n    assertParam(property, \"property\").isOptional().isEntityProperty().or().isString().check();\r\n    let result = core.getOwnPropertyValues(this._validationErrors);\r\n    if (property) {\r\n      let propertyName = typeof (property) === 'string' ? property : property.name;\r\n      result = result.filter(function (ve: ValidationError) {\r\n        return ve.property && (ve.property.name === propertyName || (propertyName.indexOf(\".\") !== -1 && ve.propertyName === propertyName));\r\n      });\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n  Adds a validation error.\r\n  **/\r\n  addValidationError(validationError: ValidationError) {\r\n    assertParam(validationError, \"validationError\").isInstanceOf(ValidationError).check();\r\n    this._processValidationOpAndPublish(function (that: any) {\r\n      that._addValidationError(validationError);\r\n    });\r\n  }\r\n\r\n  removeValidationError(validationError: ValidationError): void;\r\n  removeValidationError(validationKey: string): void;\r\n  /**\r\n  Removes a validation error.\r\n  @param validationErrorOrKey - Either a ValidationError or a ValidationError 'key' value\r\n  **/\r\n  removeValidationError(validationErrorOrKey: ValidationError | string) {\r\n    assertParam(validationErrorOrKey, \"validationErrorOrKey\").isString().or().isInstanceOf(ValidationError).or().isInstanceOf(Validator).check();\r\n\r\n    let key = (typeof (validationErrorOrKey) === \"string\") ? validationErrorOrKey : validationErrorOrKey.key;\r\n    this._processValidationOpAndPublish(function (that: any) {\r\n      that._removeValidationError(key);\r\n    });\r\n  }\r\n\r\n  /**\r\n  Removes all of the validation errors for a specified entity\r\n  **/\r\n  clearValidationErrors() {\r\n    this._processValidationOpAndPublish(function (that: any) {\r\n      core.objectForEach(that._validationErrors, function (key: string, valError: ValidationError) {\r\n        if (valError) {\r\n          delete that._validationErrors[key];\r\n          that._pendingValidationResult.removed.push(valError);\r\n        }\r\n      });\r\n      that.hasValidationErrors = !core.isEmpty(that._validationErrors);\r\n    });\r\n  }\r\n\r\n  /**\r\n  Returns an [[EntityKey]] for the entity pointed to by the specified scalar NavigationProperty.\r\n  This only returns an EntityKey if the current entity is a 'child' entity along the specified NavigationProperty. \r\n  i.e. has a single parent.\r\n\r\n  @param navigationProperty - The [[NavigationProperty]] ( pointing to a parent). \r\n  @returns Either a parent EntityKey if this is a 'child' entity or null;  \r\n  */\r\n  getParentKey(navigationProperty: NavigationProperty) {\r\n    if (!this.entity) return null;\r\n    // TODO: review this - not sure about the comment.\r\n    // NavigationProperty doesn't yet exist\r\n    // assertParam(navigationProperty, \"navigationProperty\").isInstanceOf(NavigationProperty).check();\r\n    let fkNames = navigationProperty.foreignKeyNames;\r\n    if (fkNames.length === 0) return null;\r\n    let that = this;\r\n    let fkValues = fkNames.map(function (fkn) {\r\n      return that.entity!.getProperty(fkn);\r\n    });\r\n    return new EntityKey(navigationProperty.entityType, fkValues);\r\n  }\r\n\r\n  // TODO: refactor this and the static getPropertyPathValue.\r\n  /**\r\n  Returns the value of a specified DataProperty or NavigationProperty or 'property path'.  \r\n  **/\r\n  getPropertyValue(property: string | DataProperty | NavigationProperty) {\r\n    assertParam(property, \"property\").isString().or().isEntityProperty().check();\r\n    let value: any;\r\n    if (typeof (property) === 'string') {\r\n      let propNames = property.trim().split(\".\");\r\n      let propName = propNames.shift();\r\n      value = this.entity;\r\n      value = value.getProperty(propName);\r\n      while (propNames.length > 0) {\r\n        propName = propNames.shift();\r\n        value = value.getProperty(propName);\r\n      }\r\n    } else {\r\n      if (!(property.parentType instanceof EntityType)) {\r\n        throw new Error(\"The validateProperty method does not accept a 'property' parameter whose parentType is a ComplexType; \" +\r\n          \"Pass a 'property path' string as the 'property' parameter instead \");\r\n      }\r\n      value = this.entity!.getProperty(property.name);\r\n    }\r\n    return value;\r\n  }\r\n\r\n  // internal methods\r\n  /** @hidden @internal */\r\n  _checkOperation(operationName: string) {\r\n    if (this.isBeingSaved) {\r\n      throw new Error(\"Cannot perform a '\" + operationName + \"' on an entity that is in the process of being saved\");\r\n    }\r\n    // allows chaining\r\n    return this;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _detach() {\r\n    this.entityGroup = undefined;\r\n    this.entityManager = undefined;\r\n    this.entityState = EntityState.Detached;\r\n    this.originalValues = {};\r\n    this._validationErrors = {};\r\n    this.hasValidationErrors = false;\r\n    this.validationErrorsChanged.clear();\r\n    this.propertyChanged.clear();\r\n\r\n  }\r\n\r\n\r\n  // called from defaultInterceptor.\r\n  /** @hidden @internal */\r\n  _validateProperty(value: any, context: any) {\r\n    let ok = true;\r\n    this._processValidationOpAndPublish(function (that: any) {\r\n      context.property.getAllValidators().forEach(function (validator: Validator) {\r\n        ok = validate(that, validator, value, context) && ok;\r\n      });\r\n    });\r\n    return ok;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _processValidationOpAndPublish(validationFn: any) {\r\n    if (this._pendingValidationResult) {\r\n      // only top level processValidations call publishes\r\n      validationFn(this);\r\n    } else {\r\n      try {\r\n        this._pendingValidationResult = { entity: this.entity, added: [], removed: [] };\r\n        validationFn(this);\r\n        if (this._pendingValidationResult.added.length > 0 || this._pendingValidationResult.removed.length > 0) {\r\n          this.validationErrorsChanged.publish(this._pendingValidationResult);\r\n          // this might be a detached entity hence the guard below.\r\n          this.entityManager && this.entityManager.validationErrorsChanged.publish(this._pendingValidationResult);\r\n\r\n        }\r\n      } finally {\r\n        this._pendingValidationResult = undefined;\r\n      }\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  // TODO: add/use a ValidationError type\r\n  _addValidationError(validationError: any) {\r\n    this._validationErrors[validationError.key] = validationError;\r\n    this.hasValidationErrors = true;\r\n    this._pendingValidationResult.added.push(validationError);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _removeValidationError(key: string) {\r\n    let valError = this._validationErrors[key];\r\n    if (valError) {\r\n      delete this._validationErrors[key];\r\n      this.hasValidationErrors = !core.isEmpty(this._validationErrors);\r\n      this._pendingValidationResult.removed.push(valError);\r\n    }\r\n  }\r\n\r\n}\r\n\r\nBreezeEvent.bubbleEvent(EntityAspect.prototype, function () {\r\n  return this.entityManager;\r\n});\r\n\r\nfunction rejectChangesCore(target: any) {\r\n  let aspect = target.entityAspect || target.complexAspect;\r\n  let stype = target.entityType || target.complexType;\r\n  let originalValues = aspect.originalValues;\r\n  for (let propName in originalValues) {\r\n    target.setProperty(propName, originalValues[propName]);\r\n  }\r\n  stype.complexProperties.forEach(function (cp: any) {\r\n    let cos = target.getProperty(cp.name);\r\n    if (cp.isScalar) {\r\n      rejectChangesCore(cos);\r\n    } else {\r\n      cos._rejectChanges();\r\n      cos.forEach(rejectChangesCore);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeFromRelations(entity: Entity, entityState: EntityState) {\r\n  // remove this entity from any collections.\r\n  // mark the entity deleted or detached\r\n\r\n  let isDeleted = entityState.isDeleted();\r\n  if (isDeleted) {\r\n    removeFromRelationsCore(entity);\r\n  } else {\r\n    core.using(entity.entityAspect.entityManager!, \"isLoading\", true, function () {\r\n      removeFromRelationsCore(entity);\r\n    });\r\n  }\r\n}\r\n\r\nfunction removeFromRelationsCore(entity: Entity) {\r\n  entity.entityType.navigationProperties.forEach(function (np) {\r\n    let inverseNp = np.inverse;\r\n    let npValue = entity.getProperty(np.name);\r\n    if (np.isScalar) {\r\n      if (npValue) {\r\n        if (inverseNp) {\r\n          if (inverseNp.isScalar) {\r\n            npValue.setProperty(inverseNp.name, null);\r\n          } else {\r\n            let collection = npValue.getProperty(inverseNp.name);\r\n            if (collection.length) {\r\n              core.arrayRemoveItem(collection, entity);\r\n            }\r\n          }\r\n        }\r\n        entity.setProperty(np.name, null);\r\n      }\r\n    } else {\r\n      if (inverseNp != null) {\r\n        // npValue is a live list so we need to copy it first.\r\n        npValue.slice(0).forEach((v: any) => {\r\n          if (inverseNp!.isScalar) {\r\n            v.setProperty(inverseNp!.name, null);\r\n          } else {\r\n            // TODO: many to many - not yet handled.\r\n          }\r\n        });\r\n      }\r\n      // now clear it.\r\n      npValue.length = 0;\r\n    }\r\n  });\r\n\r\n}\r\n\r\n// note entityAspect only - ( no complex aspect allowed on the call).\r\nfunction validate(entityAspect: EntityAspect, validator: Validator, value: any, context?: any) {\r\n  let ve = validator.validate(value, context);\r\n  if (ve) {\r\n    entityAspect._addValidationError(ve);\r\n    return false;\r\n  } else {\r\n    let key = ValidationError.getKey(validator, context ? context.propertyName : null);\r\n    entityAspect._removeValidationError(key);\r\n    return true;\r\n  }\r\n}\r\n\r\n// coIndex is only used where target is a complex object that is part of an array of complex objects\r\n// in which case ctIndex is the index of the target within the array.\r\nfunction validateTarget(target: any, coIndex?: number) {\r\n  let ok = true;\r\n  let stype = target.entityType || target.complexType;\r\n  let aspect = target.entityAspect || target.complexAspect;\r\n  let entityAspect = target.entityAspect || target.complexAspect.getEntityAspect();\r\n  let context = <any>{ entity: entityAspect.entity };\r\n  if (coIndex !== undefined) {\r\n    context.index = coIndex;\r\n  }\r\n\r\n  stype.getProperties().forEach(function (p: any) {\r\n    let value = target.getProperty(p.name);\r\n    let validators = p.getAllValidators();\r\n    if (validators.length > 0) {\r\n      context.property = p;\r\n      context.propertyName = aspect.getPropertyPath(p.name);\r\n      ok = entityAspect._validateProperty(value, context) && ok;\r\n    }\r\n    if (p.isComplexProperty) {\r\n      if (p.isScalar) {\r\n        ok = validateTarget(value) && ok;\r\n      } else {\r\n        ok = value.reduce(function (pv: any, cv: any, ix: number) {\r\n          return validateTarget(cv, ix) && pv;\r\n        }, ok);\r\n      }\r\n    }\r\n  });\r\n\r\n\r\n  // then target level\r\n  stype.getAllValidators().forEach(function (validator: Validator) {\r\n    ok = validate(entityAspect, validator, target) && ok;\r\n  });\r\n  return ok;\r\n}\r\n\r\n/**\r\nAn ComplexAspect instance is associated with every complex object instance and is accessed via the complex object's 'complexAspect' property.\r\n\r\nThe ComplexAspect itself provides properties to determine the parent object, parent property and original values for the complex object.\r\n\r\nA ComplexAspect will almost never need to be constructed directly. You will usually get an ComplexAspect by accessing\r\nan entities 'complexAspect' property.  This property will be automatically attached when an complex object is created as part of an\r\nentity via either a query, import or EntityManager.createEntity call.\r\n>      // assume address is a complex property on the 'Customer' type\r\n>      var aspect = aCustomer.address.complexAspect;\r\n>      // aCustomer === aspect.parent;\r\n**/\r\nexport class ComplexAspect {\r\n\r\n  /** The complex object that this aspect is associated with. __Read Only__ */\r\n  complexObject: ComplexObject;\r\n  /** The 'original values' of this complex object where they are different from the 'current values'.\r\n  This is a map where the key is a property name and the value is the 'original value' of the property.\r\n  __Read Only__ */\r\n  originalValues: Record<string, any>;\r\n  /** The parent object that to which this aspect belongs; this will either be an entity or another complex object. __Read Only__ */\r\n  parent?: StructuralObject;\r\n  /** The [[DataProperty]] on the 'parent' that contains this complex object. __Read Only__ */\r\n  parentProperty?: DataProperty;\r\n  extraMetadata?: any;\r\n\r\n  /** You will rarely, if ever, create a ComplexAspect directly. */\r\n  constructor(complexObject: ComplexObject, parent: StructuralObject, parentProperty: DataProperty) {\r\n    if (!complexObject) {\r\n      throw new Error(\"The  ComplexAspect ctor requires an entity as its only argument.\");\r\n    }\r\n    if (complexObject.complexAspect) {\r\n      return complexObject.complexAspect;\r\n    }\r\n    // if called without new\r\n    if (!(this instanceof ComplexAspect)) {\r\n      return new ComplexAspect(complexObject, parent, parentProperty);\r\n    }\r\n\r\n    // entityType should already be on the entity from 'watch'\r\n    this.complexObject = complexObject;\r\n    complexObject.complexAspect = this;\r\n\r\n    // TODO: keep public or not?\r\n    this.originalValues = {};\r\n\r\n    // if a standalone complexObject\r\n    if (parent != null) {\r\n      this.parent = parent;\r\n      this.parentProperty = parentProperty;\r\n    }\r\n\r\n    let complexType = complexObject.complexType;\r\n    if (!complexType) {\r\n      let typeName = complexObject.prototype._$typeName;\r\n      if (!typeName) {\r\n        throw new Error(\"This entity is not registered as a valid ComplexType\");\r\n      } else {\r\n        throw new Error(\"Metadata for this complexType has not yet been resolved: \" + typeName);\r\n      }\r\n    }\r\n    let complexCtor = complexType.getCtor();\r\n    config.interfaceRegistry.modelLibrary.getDefaultInstance().startTracking(complexObject, complexCtor.prototype);\r\n\r\n  }\r\n\r\n\r\n  /**\r\n  Returns the EntityAspect for the top level entity that contains this complex object.\r\n  **/\r\n  getEntityAspect() {\r\n    let parent = <any>this.parent;\r\n    if (!parent) return new EntityAspect();\r\n    let entityAspect = parent.entityAspect;\r\n    while (parent && !entityAspect) {\r\n      parent = parent.complexAspect && parent.complexAspect.parent;\r\n      entityAspect = parent && parent.entityAspect;\r\n    }\r\n    return entityAspect || new EntityAspect();\r\n  }\r\n\r\n  /**  @hidden @internal */\r\n  // TODO: rename - and use '_'; used on both EntityAspect and ComplexAspect for polymorphic reasons.\r\n  getPropertyPath(propName: string) {\r\n    let parent = <any>this.parent;\r\n    if (!parent) return null;\r\n    let aspect = parent.complexAspect || parent.entityAspect;\r\n    return aspect.getPropertyPath(this.parentProperty!.name + \".\" + propName);\r\n  }\r\n\r\n}\r\n\r\nfunction clearOriginalValues(target: any) {\r\n  let aspect = target.entityAspect || target.complexAspect;\r\n  aspect.originalValues = {};\r\n  let stype = target.entityType || target.complexType;\r\n  stype.complexProperties.forEach(function (cp: any) {\r\n    let cos = target.getProperty(cp.name);\r\n    if (cp.isScalar) {\r\n      clearOriginalValues(cos);\r\n    } else {\r\n      cos._acceptChanges();\r\n      cos.forEach(clearOriginalValues);\r\n    }\r\n  });\r\n}\r\n\r\n\r\n","import { assertConfig } from './assert-param';\r\nimport { core } from './core';\r\nimport { config } from './config';\r\n\r\n// TODO: strongly type context object passed to naming convention converter fns.\r\n\r\n/** Configuration info to be passed to the [[NamingConvention]] constructor */\r\nexport interface NamingConventionConfig {\r\n  /** The name of this NamingConvention */\r\n  name?: string;\r\n  /** Function that takes a server property name add converts it into a client side property name.  */\r\n  serverPropertyNameToClient?: (nm: string, context?: any) => string;\r\n  /** Function that takes a client property name add converts it into a server side property name. */\r\n  clientPropertyNameToServer?: (nm: string, context?: any) => string;\r\n}\r\n\r\n/**\r\nA NamingConvention instance is used to specify the naming conventions under which a MetadataStore\r\nwill translate property names between the server and the javascript client.\r\n\r\nThe default NamingConvention does not perform any translation, it simply passes property names thru unchanged.\r\n@dynamic\r\n**/\r\nexport class NamingConvention {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string;\r\n  /** The name of this NamingConvention. __Read Only__ */\r\n  declare name: string;\r\n  /** Function that takes a server property name add converts it into a client side property name.  __Read Only__ */\r\n  serverPropertyNameToClient: (nm: string, context?: any) => string;\r\n  /** Function that takes a client property name add converts it into a server side property name. __Read Only__ */\r\n  clientPropertyNameToServer: (nm: string, context?: any) => string;\r\n\r\n  /**\r\n  NamingConvention constructor\r\n  >      // A naming convention that converts the first character of every property name to uppercase on the server\r\n  >      // and lowercase on the client.\r\n  >      var namingConv = new NamingConvention({\r\n  >          serverPropertyNameToClient: function(serverPropertyName) {\r\n  >              return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);\r\n  >          },\r\n  >          clientPropertyNameToServer: function(clientPropertyName) {\r\n  >              return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);\r\n  >          }            \r\n  >      });\r\n  >      var ms = new MetadataStore({ namingConvention: namingConv });\r\n  >      var em = new EntityManager( { metadataStore: ms });\r\n  **/\r\n  constructor(ncConfig: NamingConventionConfig ) {\r\n    assertConfig(ncConfig || {})\r\n        .whereParam(\"name\").isOptional().isString()\r\n        .whereParam(\"serverPropertyNameToClient\").isFunction()\r\n        .whereParam(\"clientPropertyNameToServer\").isFunction()\r\n        .applyAll(this);\r\n    if (!this.name) {\r\n      this.name = core.getUuid();\r\n    }\r\n    config._storeObject(this, \"NamingConvention\", this.name);\r\n  }\r\n\r\n  /**\r\n\r\n\r\n  /**\r\n  A noop naming convention - This is the default unless another is specified.\r\n  **/\r\n  static none = new NamingConvention({\r\n    name: \"noChange\",\r\n    serverPropertyNameToClient: (serverPropertyName) => {\r\n      return serverPropertyName;\r\n    },\r\n    clientPropertyNameToServer: (clientPropertyName) => {\r\n      return clientPropertyName;\r\n    }\r\n  });\r\n\r\n  /**\r\n  The \"camelCase\" naming convention - This implementation only lowercases the first character of the server property name\r\n  but leaves the rest of the property name intact.  If a more complicated version is needed then one should be created via the ctor.\r\n  **/\r\n  static camelCase = new NamingConvention({\r\n    name: \"camelCase\",\r\n    serverPropertyNameToClient: (serverPropertyName) => {\r\n      return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);\r\n    },\r\n    clientPropertyNameToServer: (clientPropertyName) => {\r\n      return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);\r\n    }\r\n  });\r\n\r\n  /**\r\n  The default value whenever NamingConventions are not specified.\r\n  **/\r\n  static defaultInstance = new NamingConvention(NamingConvention.none);\r\n\r\n  /**\r\n  Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.\r\n  The current instance is returned unchanged.\r\n  >      var namingConv = new NamingConvention({\r\n  >          serverPropertyNameToClient: function(serverPropertyName) {\r\n  >              return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);\r\n  >          },\r\n  >          clientPropertyNameToServer: function(clientPropertyName) {\r\n  >              return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);\r\n  >          }            \r\n  >      });\r\n  >      namingConv.setAsDefault();\r\n  **/\r\n  setAsDefault() {\r\n    return core.setAsDefault(this, NamingConvention);\r\n  }\r\n\r\n}\r\n\r\nNamingConvention.prototype._$typeName = \"NamingConvention\";\r\n\r\n\r\n\r\n\r\n","import { core } from './core';\r\nimport { MetadataStore, EntityType, ComplexType, DataProperty, NavigationProperty, AutoGeneratedKeyType } from './entity-metadata';\r\nimport { DataType  } from './data-type';\r\nimport { Validator } from './validate';\r\n\r\ninterface IAssociation {\r\n  name: string;\r\n  end: IEnd[];\r\n  referentialConstraint: any;\r\n}\r\n\r\ninterface IEnd {\r\n  multiplicity: string;\r\n  type: string;\r\n  role: string;\r\n}\r\n\r\nconst RX_COLLECTION =  /Collection\\((.*)\\)/;\r\n\r\nfunction parse(metadataStore: MetadataStore, schemas: any, altMetadata: any) {\r\n\r\n  metadataStore._entityTypeResourceMap = {};\r\n  schemas = core.toArray(schemas);\r\n  schemas.forEach(function (schema: any) {\r\n    if (schema.cSpaceOSpaceMapping) {\r\n      // Web api only - not avail in OData.\r\n      // TODO throw informative error if already parsed and converted to map on a previous pass\r\n      let mappings = JSON.parse(schema.cSpaceOSpaceMapping);\r\n      let newMap = {};\r\n      mappings.forEach(function (mapping: any) {\r\n        newMap[mapping[0]] = mapping[1];\r\n      });\r\n      schema.cSpaceOSpaceMapping = newMap;\r\n    }\r\n\r\n    if (schema.entityContainer) {\r\n      core.toArray(schema.entityContainer).forEach(function (container) {\r\n        core.toArray(container.entitySet).forEach(function (entitySet) {\r\n          let entityTypeName = parseTypeNameWithSchema(entitySet.entityType, schema).typeName;\r\n          metadataStore.setEntityTypeForResourceName(entitySet.name, entityTypeName);\r\n          metadataStore._entityTypeResourceMap[entityTypeName] = entitySet.name;\r\n        });\r\n      });\r\n    }\r\n\r\n    // process complextypes before entity types.\r\n    if (schema.complexType) {\r\n      core.toArray(schema.complexType).forEach(function (ct) {\r\n        parseCsdlComplexType(ct, schema, metadataStore);\r\n      });\r\n    }\r\n    if (schema.entityType) {\r\n      core.toArray(schema.entityType).forEach(function (et) {\r\n        parseCsdlEntityType(et, schema, schemas, metadataStore);\r\n\r\n      });\r\n    }\r\n\r\n  });\r\n  let badNavProps = metadataStore.getIncompleteNavigationProperties();\r\n  if (badNavProps.length > 0) {\r\n    let msg = badNavProps.map(function (npa) {\r\n      if (Array.isArray(npa)) {\r\n        return npa.map(function (np) {\r\n          return np.parentType.name + \":\" + np.name;\r\n        }).join(', ');\r\n      }\r\n      return npa.parentType.name + \":\" + npa.name;\r\n    }).join(', ');\r\n    throw new Error(\"Incomplete navigation properties: \" + msg);\r\n  }\r\n  if (altMetadata) {\r\n    metadataStore.importMetadata(altMetadata, true);\r\n  }\r\n  return metadataStore;\r\n}\r\n\r\nfunction parseCsdlEntityType(csdlEntityType: any, schema: any, schemas: any, metadataStore: MetadataStore) {\r\n  let shortName = csdlEntityType.name;\r\n  let ns = getNamespaceFor(shortName, schema);\r\n  let entityType = new EntityType({\r\n    shortName: shortName,\r\n    namespace: ns,\r\n    isAbstract: csdlEntityType.abstract && csdlEntityType.abstract === 'true'\r\n  });\r\n  if (csdlEntityType.baseType) {\r\n    let baseTypeName = parseTypeNameWithSchema(csdlEntityType.baseType, schema).typeName;\r\n    entityType.baseTypeName = baseTypeName;\r\n    let baseEntityType = metadataStore._getStructuralType(baseTypeName, true);\r\n    if (baseEntityType) {\r\n      completeParseCsdlEntityType(entityType, csdlEntityType, schema, schemas, metadataStore);\r\n    } else {\r\n      let deferrals = metadataStore._deferredTypes[baseTypeName];\r\n      if (!deferrals) {\r\n        deferrals = [];\r\n        metadataStore._deferredTypes[baseTypeName] = deferrals;\r\n      }\r\n      deferrals.push({ entityType: entityType, csdlEntityType: csdlEntityType });\r\n    }\r\n  } else {\r\n    completeParseCsdlEntityType(entityType, csdlEntityType, schema, schemas, metadataStore);\r\n  }\r\n  // entityType may or may not have been added to the metadataStore at this point.\r\n  return entityType;\r\n\r\n}\r\n\r\nfunction completeParseCsdlEntityType(entityType: EntityType, csdlEntityType: any, schema: any, schemas: any, metadataStore: MetadataStore) {\r\n  let keyNamesOnServer = csdlEntityType.key ? core.toArray(csdlEntityType.key.propertyRef).map(core.pluck(\"name\")) : [];\r\n\r\n  core.toArray(csdlEntityType.property).forEach(function (prop) {\r\n    parseCsdlDataProperty(entityType, prop, schema, keyNamesOnServer);\r\n  });\r\n\r\n  core.toArray(csdlEntityType.navigationProperty).forEach(function (prop) {\r\n    parseCsdlNavProperty(entityType, prop, schema, schemas);\r\n  });\r\n\r\n  metadataStore.addEntityType(entityType);\r\n  entityType.defaultResourceName = metadataStore._entityTypeResourceMap[entityType.name];\r\n\r\n  let deferredTypes = metadataStore._deferredTypes;\r\n  let deferrals = deferredTypes[entityType.name];\r\n  if (deferrals) {\r\n    deferrals.forEach(function (d: any) {\r\n      completeParseCsdlEntityType(d.entityType, d.csdlEntityType, schema, schemas, metadataStore);\r\n    });\r\n    delete deferredTypes[entityType.name];\r\n  }\r\n\r\n}\r\n\r\nfunction parseCsdlComplexType(csdlComplexType: any, schema: any, metadataStore: MetadataStore) {\r\n  let shortName = csdlComplexType.name;\r\n  let ns = getNamespaceFor(shortName, schema);\r\n  let complexType = new ComplexType({\r\n    shortName: shortName,\r\n    namespace: ns\r\n  });\r\n\r\n  core.toArray(csdlComplexType.property).forEach(function (prop) {\r\n    parseCsdlDataProperty(complexType, prop, schema);\r\n  });\r\n\r\n  metadataStore.addEntityType(complexType);\r\n  return complexType;\r\n}\r\n\r\nfunction parseCsdlDataProperty(parentType: EntityType | ComplexType, csdlProperty: any, schema: any, keyNamesOnServer?: string[]) {\r\n  let dp: DataProperty | undefined;\r\n  let typeParts = csdlProperty.type.split(\".\");\r\n  // Both tests on typeParts are necessary because of differing metadata conventions for OData and Edmx feeds.\r\n  if (typeParts[0].endsWith(\"Edm\") && typeParts.length === 2) {\r\n    dp = parseCsdlSimpleProperty(parentType, csdlProperty, keyNamesOnServer);\r\n  } else {\r\n    if (isEnumType(csdlProperty, schema)) {\r\n      dp = parseCsdlSimpleProperty(parentType, csdlProperty, keyNamesOnServer);\r\n      if (dp) {\r\n        dp.enumType = csdlProperty.type;\r\n      }\r\n    } else {\r\n      dp = parseCsdlComplexProperty(parentType, csdlProperty, schema);\r\n    }\r\n  }\r\n  if (dp) {\r\n    parentType._addPropertyCore(dp);\r\n    addValidators(dp);\r\n  }\r\n  return dp;\r\n}\r\n\r\nfunction parseCsdlSimpleProperty(parentType: EntityType | ComplexType, csdlProperty: any, keyNamesOnServer?: string[]) {\r\n  let isCollectionType = isCollection(csdlProperty.type);\r\n  let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;\r\n  let dataType = DataType.fromEdmDataType(propertyType);\r\n  if (dataType == null) {\r\n    parentType.warnings.push(\"Unable to recognize DataType for property: \" + csdlProperty.name + \" DateType: \" + csdlProperty.type);\r\n    return undefined;\r\n  }\r\n  let isNullable = csdlProperty.nullable === 'true' || csdlProperty.nullable == null;\r\n  // let fixedLength = csdlProperty.fixedLength ? csdlProperty.fixedLength === true : undefined;\r\n  let isPartOfKey = keyNamesOnServer != null && keyNamesOnServer.indexOf(csdlProperty.name) >= 0;\r\n  if (isPartOfKey && parentType instanceof EntityType && parentType.autoGeneratedKeyType === AutoGeneratedKeyType.None) {\r\n    if (isIdentityProperty(csdlProperty)) {\r\n      parentType.autoGeneratedKeyType = AutoGeneratedKeyType.Identity;\r\n    }\r\n  }\r\n  // TODO: nit - don't set maxLength if null;\r\n  let maxLength = csdlProperty.maxLength;\r\n  maxLength = (maxLength == null || maxLength === \"Max\") ? null : parseInt(maxLength, 10);\r\n  // can't set the name until we go thru namingConventions and these need the dp.\r\n\r\n  let dp = new DataProperty({\r\n    nameOnServer: csdlProperty.name,\r\n    dataType: dataType,\r\n    isNullable: isNullable,\r\n    isPartOfKey: isPartOfKey,\r\n    isScalar: !isCollectionType,\r\n    maxLength: maxLength,\r\n    defaultValue: csdlProperty.defaultValue,\r\n    // fixedLength: fixedLength,\r\n    concurrencyMode: csdlProperty.concurrencyMode\r\n  });\r\n\r\n  if (dataType === DataType.Undefined) {\r\n    dp.rawTypeName = csdlProperty.type;\r\n  }\r\n  return dp;\r\n}\r\n\r\nfunction parseCsdlComplexProperty(parentType: EntityType | ComplexType, csdlProperty: any, schema: any) {\r\n\r\n  // Complex properties are never nullable ( per EF specs)\r\n  // let isNullable = csdlProperty.nullable === 'true' || csdlProperty.nullable == null;\r\n  // let complexTypeName = csdlProperty.type.split(\"Edm.\")[1];\r\n  let isCollectionType = isCollection(csdlProperty.type);\r\n  let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;\r\n  let complexTypeName = parseTypeNameWithSchema(propertyType, schema).typeName;\r\n  // can't set the name until we go thru namingConventions and these need the dp.\r\n  let dp = new DataProperty({\r\n    nameOnServer: csdlProperty.name,\r\n    complexTypeName: complexTypeName,\r\n    isNullable: false,\r\n    isScalar: !isCollectionType\r\n  });\r\n\r\n  return dp;\r\n}\r\n\r\nfunction parseCsdlNavProperty(entityType: EntityType, csdlProperty: any, schema: any, schemas: any[]) {\r\n  let association = getAssociation(csdlProperty, schema, schemas);\r\n  if (!association) {\r\n    throw new Error(\"Unable to resolve Foreign Key Association: \" + csdlProperty.relationship);\r\n  }\r\n  let toEnd = core.arrayFirst(association.end, (assocEnd) => {\r\n    return assocEnd.role === csdlProperty.toRole;\r\n  });\r\n\r\n  let isScalar = toEnd!.multiplicity !== \"*\";\r\n  let dataType = parseTypeNameWithSchema(toEnd!.type, schema).typeName;\r\n\r\n  let constraint = association.referentialConstraint;\r\n  if (!constraint) {\r\n    // TODO: Revisit this later - right now we just ignore many-many and assocs with missing constraints.\r\n\r\n    // Think about adding this back later.\r\n    if (association.end[0].multiplicity === \"*\" && association.end[1].multiplicity === \"*\") {\r\n      // ignore many to many relations for now\r\n      return;\r\n    } else {\r\n      // For now assume it will be set later directly on the client.\r\n      // other alternative is to throw an error:\r\n      // throw new Error(\"Foreign Key Associations must be turned on for this model\");\r\n    }\r\n  }\r\n\r\n\r\n\r\n  let cfg = {\r\n    nameOnServer: csdlProperty.name,\r\n    entityTypeName: dataType,\r\n    isScalar: isScalar,\r\n    associationName: association.name,\r\n  };\r\n\r\n  if (constraint) {\r\n    let principal = constraint.principal;\r\n    let dependent = constraint.dependent;\r\n\r\n    let propRefs = core.toArray(dependent.propertyRef);\r\n    let fkNames = propRefs.map(core.pluck(\"name\"));\r\n    if (csdlProperty.fromRole === principal.role) {\r\n      (cfg as any).invForeignKeyNamesOnServer = fkNames;\r\n    } else {\r\n      // will be used later by np._update\r\n      (cfg as any).foreignKeyNamesOnServer = fkNames;\r\n    }\r\n  }\r\n\r\n  let np = new NavigationProperty(cfg);\r\n  entityType._addPropertyCore(np);\r\n  return np;\r\n}\r\n\r\nfunction isCollection(propertyType: string): boolean {\r\n  return RX_COLLECTION.test(propertyType);\r\n}\r\n\r\nfunction isEnumType(csdlProperty: any, schema: any) {\r\n  if (schema.enumType) return isEdmxEnumType(csdlProperty, schema);\r\n  else if (schema.extensions) return isODataEnumType(csdlProperty, schema);\r\n  else return false;\r\n}\r\n\r\nfunction isEdmxEnumType(csdlProperty: any, schema: any) {\r\n  let enumTypes = core.toArray(schema.enumType);\r\n  let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;\r\n  let typeParts = propertyType.split(\".\");\r\n  let baseTypeName = typeParts[typeParts.length - 1];\r\n  return enumTypes.some(function (enumType) {\r\n    return enumType.name === baseTypeName;\r\n  });\r\n}\r\n\r\nfunction isODataEnumType(csdlProperty: any, schema: any) {\r\n  let enumTypes = schema.extensions.filter((ext: any) => {\r\n    return ext.name === \"EnumType\";\r\n  });\r\n  let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;\r\n  let typeParts = propertyType.split(\".\");\r\n  let baseTypeName = typeParts[typeParts.length - 1];\r\n  return enumTypes.some((enumType: any) => {\r\n    return enumType.attributes.some((attr: any) => {\r\n      return attr.name === \"Name\" && attr.value === baseTypeName;\r\n    });\r\n  });\r\n}\r\n\r\nfunction addValidators(dataProperty: DataProperty) {\r\n  let typeValidator: Validator;\r\n  if (!dataProperty.isNullable) {\r\n    dataProperty.validators.push(Validator.required());\r\n  }\r\n\r\n  if (dataProperty.isComplexProperty) return;\r\n\r\n  if (dataProperty.dataType === DataType.String) {\r\n    if (dataProperty.maxLength) {\r\n      let validatorArgs = { maxLength: dataProperty.maxLength };\r\n      typeValidator = Validator.maxLength(validatorArgs);\r\n    } else {\r\n      typeValidator = Validator.string();\r\n    }\r\n  } else {\r\n      let validatorCtor = (dataProperty.dataType as any).validatorCtor;\r\n      if (!validatorCtor) return;\r\n      typeValidator = validatorCtor();\r\n  }\r\n\r\n  dataProperty.validators.push(typeValidator);\r\n\r\n}\r\n\r\nfunction isIdentityProperty(csdlProperty: any) {\r\n  // see if web api feed\r\n  let propName = core.arrayFirst(Object.keys(csdlProperty), (pn) => {\r\n    return pn.indexOf(\"StoreGeneratedPattern\") >= 0;\r\n  });\r\n  if (propName) {\r\n    return (csdlProperty[propName] === \"Identity\");\r\n  } else {\r\n    // see if Odata feed\r\n    let extensions = csdlProperty.extensions;\r\n    if (!extensions) {\r\n      return false;\r\n    }\r\n    let identityExtn = core.arrayFirst(extensions, (extension) => {\r\n      return extension.name === \"StoreGeneratedPattern\" && extension.value === \"Identity\";\r\n    });\r\n    return !!identityExtn;\r\n  }\r\n}\r\n\r\n// Fast version\r\n// np: schema.entityType[].navigationProperty.relationship -> schema.association\r\n//   match( shortName(np.relationship) == schema.association[].name\r\n//      --> association__\r\n\r\n// Correct version\r\n// np: schema.entityType[].navigationProperty.relationship -> schema.association\r\n//   match( np.relationship == schema.entityContainer[0].associationSet[].association )\r\n//      -> associationSet.name\r\n//   match ( associationSet.name == schema.association[].name )\r\n//      -> association\r\n\r\nfunction getAssociation(csdlNavProperty: any, containingSchema: any, schemas: any[]) {\r\n  let assocFullName = parseTypeNameWithSchema(csdlNavProperty.relationship, containingSchema);\r\n  let assocNamespace = assocFullName.namespace;\r\n  let assocSchema = core.arrayFirst(schemas, (schema) => {\r\n    return schema.namespace === assocNamespace;\r\n  });\r\n  if (!assocSchema) return null;\r\n\r\n  let assocName = assocFullName.shortTypeName;\r\n  let assocs = assocSchema.association;\r\n  if (!assocs) return null;\r\n  if (!Array.isArray(assocs)) {\r\n    assocs = [assocs];\r\n  }\r\n  let association = core.arrayFirst(assocs, (assoc) => {\r\n    return assoc.name === assocName;\r\n  });\r\n  return association as IAssociation;\r\n}\r\n\r\n// schema is only needed for navProperty type name\r\nfunction parseTypeNameWithSchema(entityTypeName: string, schema: any) {\r\n  let result = MetadataStore.parseTypeName(entityTypeName);\r\n  if (schema && schema.cSpaceOSpaceMapping) {\r\n    let ns = getNamespaceFor(result!.shortTypeName, schema);\r\n    if (ns) {\r\n      result = MetadataStore.makeTypeHash(result!.shortTypeName, ns);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction getCollectionType(propertyType: string): string {\r\n  const match = propertyType.match(RX_COLLECTION);\r\n  return match ? match[1] : null;\r\n}\r\n\r\nfunction getNamespaceFor(shortName: string, schema: any) {\r\n  let ns: string;\r\n  let mapping = schema.cSpaceOSpaceMapping;\r\n  if (mapping) {\r\n    let fullName = mapping[schema.namespace + \".\" + shortName];\r\n    ns = fullName && fullName.substr(0, fullName.length - (shortName.length + 1));\r\n    if (ns) return ns;\r\n  }\r\n  // if schema does not also have an entityType node then\r\n  // this is an WebApi2 OData schema which is usually equal to 'Default'; which is useless.\r\n  if (schema.entityType || schema.namespace !== 'Default') {\r\n    return schema.namespace;\r\n  }\r\n  return null;\r\n}\r\n\r\n/** @hidden @internal */\r\nexport const CsdlMetadataParser = {\r\n  parse: parse\r\n};\r\n","import { core } from './core';\r\nimport { assertConfig } from './assert-param';\r\nimport { config } from './config';\r\n\r\n\r\n/** Configuration info to be passed to the [[LocalQueryComparisonOptions]] constructor. */\r\nexport interface LocalQueryComparisonOptionsConfig {\r\n  /** The name of this collection of configuration settings. */\r\n  name?: string;\r\n  /** Whether predicates that involve strings will be interpreted in a \"caseSensitive\" manner. Default is 'false'. */\r\n  isCaseSensitive?: boolean;\r\n  /* Whether or not to enforce the ANSI SQL standard\r\n  of padding strings of unequal lengths before comparison with spaces. Note that per the standard, padding only occurs with equality and\r\n  inequality predicates, and not with operations like 'startsWith', 'endsWith' or 'contains'.  Default is true. */\r\n  usesSql92CompliantStringComparison?: boolean;\r\n}\r\n\r\n/**\r\nA LocalQueryComparisonOptions instance is used to specify the \"comparison rules\" used when performing \"local queries\" in order\r\nto match the semantics of these same queries when executed against a remote service.  These options should be set based on the\r\nmanner in which your remote service interprets certain comparison operations.\r\n\r\nThe default LocalQueryComparisonOptions stipulates 'caseInsensitive\" queries with ANSI SQL rules regarding comparisons of unequal\r\nlength strings.\r\n**/\r\nexport class LocalQueryComparisonOptions {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on prototype\r\n  /** The name for this instance. */\r\n  declare name: string;\r\n  /** Whether predicates that involve strings will be interpreted in a \"caseSensitive\" manner. (default = false).  */\r\n  declare isCaseSensitive: boolean;\r\n  /* Whether or not to enforce the ANSI SQL standard\r\n  of padding strings of unequal lengths before comparison with spaces. Note that per the standard, padding only occurs with equality and\r\n  inequality predicates, and not with operations like 'startsWith', 'endsWith' or 'contains'.  Default is true. */\r\n  declare usesSql92CompliantStringComparison: boolean;\r\n\r\n  /**\r\n  LocalQueryComparisonOptions constructor\r\n  >      // create a 'caseSensitive - non SQL' instance.\r\n  >      var lqco = new LocalQueryComparisonOptions({\r\n  >              name: \"caseSensitive-nonSQL\"\r\n  >              isCaseSensitive: true;\r\n  >              usesSql92CompliantStringComparison: false;\r\n  >          });\r\n  >      // either apply it globally\r\n  >      lqco.setAsDefault();\r\n  >      // or to a specific MetadataStore\r\n  >      var ms = new MetadataStore({ localQueryComparisonOptions: lqco });\r\n  >      var em = new EntityManager( { metadataStore: ms });\r\n  @param config - A configuration object.\r\n  **/\r\n  constructor(lqcoConfig: LocalQueryComparisonOptionsConfig) {\r\n    assertConfig(lqcoConfig || {})\r\n        .whereParam(\"name\").isOptional().isString()\r\n        .whereParam(\"isCaseSensitive\").isOptional().isBoolean()\r\n        .whereParam(\"usesSql92CompliantStringComparison\").isBoolean()\r\n        .applyAll(this);\r\n    if (!this.name) {\r\n      this.name = core.getUuid();\r\n    }\r\n    config._storeObject(this, \"LocalQueryComparisonOptions\", this.name);\r\n  }\r\n\r\n  /**\r\n  Case insensitive SQL compliant options - this is also the default unless otherwise changed.\r\n  **/\r\n  static caseInsensitiveSQL = new LocalQueryComparisonOptions({\r\n    name: \"caseInsensitiveSQL\",\r\n    isCaseSensitive: false,\r\n    usesSql92CompliantStringComparison: true\r\n  });\r\n\r\n  /**\r\n  The default value whenever LocalQueryComparisonOptions are not specified. By default this is 'caseInsensitiveSQL'.\r\n  **/\r\n  static defaultInstance = new LocalQueryComparisonOptions(LocalQueryComparisonOptions.caseInsensitiveSQL);\r\n\r\n  /**\r\n  Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.\r\n  The current instance is returned unchanged.\r\n  >     var lqco = new LocalQueryComparisonOptions({\r\n  >        isCaseSensitive: false;\r\n  >        usesSql92CompliantStringComparison: true;\r\n  >     });\r\n  >     lqco.setAsDefault();\r\n  **/\r\n  setAsDefault() {\r\n    return core.setAsDefault(this, LocalQueryComparisonOptions);\r\n  }\r\n\r\n}\r\nLocalQueryComparisonOptions.prototype._$typeName = \"LocalQueryComparisonOptions\";\r\n","import { core } from './core';\r\nimport { ComplexType, DataProperty, NavigationProperty, EntityProperty } from './entity-metadata';\r\nimport { EntityKey } from './entity-key';\r\nimport { EntityAspect, ComplexAspect, Entity, StructuralObject } from './entity-aspect';\r\nimport { EntityState } from './entity-state';\r\nimport { EntityAction } from './entity-action';\r\nimport { EntityQuery } from './entity-query';\r\n\r\n/** @hidden @internal */\r\nexport function defaultPropertyInterceptor(this: StructuralObject, property: EntityProperty, newValue: any, rawAccessorFn: Function) {\r\n  // 'this' is the entity itself in this context.\r\n\r\n  if (newValue === undefined) newValue = null; // remove? to allow assignment to undefined in Babel constructors?\r\n  let oldValue = rawAccessorFn();\r\n\r\n  let dataType = (property as any).dataType;\r\n  if (dataType && dataType.parse) {\r\n    // attempts to coerce a value to the correct type - if this fails return the value unchanged\r\n    if (Array.isArray(newValue) && !property.isScalar) {\r\n      newValue = newValue.map(function (nv) {\r\n        return dataType.parse(nv, typeof nv);\r\n      });\r\n    } else {\r\n      newValue = dataType.parse(newValue, typeof newValue);\r\n    }\r\n  }\r\n\r\n  // exit if no change - extra cruft is because dateTimes don't compare cleanly.\r\n  if (newValue === oldValue || (newValue === null && oldValue === undefined) || \r\n    (dataType && dataType.normalize && newValue && oldValue && dataType.normalize(newValue) === dataType.normalize(oldValue))) {\r\n    return;\r\n  }\r\n\r\n  // CANNOT DO NEXT LINE because it has the possibility of creating a new property\r\n  // 'entityAspect' on 'this'.  - Not permitted by IE inside of a defined property on a prototype.\r\n  // let entityAspect = new EntityAspect(this);\r\n\r\n  let propertyName: string;\r\n  let entityAspect = (this as any).entityAspect as EntityAspect;\r\n  if (entityAspect) {\r\n    propertyName = property.name;\r\n  } else {\r\n    let localAspect = (this as any).complexAspect as ComplexAspect;\r\n    if (localAspect) {\r\n      entityAspect = localAspect.getEntityAspect();\r\n      propertyName = localAspect.getPropertyPath(property.name);\r\n    } else {\r\n      // does not yet have an EntityAspect so just set the prop\r\n      rawAccessorFn(newValue);\r\n      return;\r\n    }\r\n  }\r\n\r\n  // Note that we need to handle multiple properties in process, not just one in order to avoid recursion.\r\n  // ( except in the case of null propagation with fks where null -> 0 in some cases.)\r\n  // (this may not be needed because of the newValue === oldValue test above)\r\n  let inProcess = entityAspect._inProcess = entityAspect._inProcess || [];\r\n  // check for recursion\r\n  if (inProcess.indexOf(property) >= 0) return;\r\n  inProcess.push(property);\r\n\r\n  try {\r\n\r\n    let context: IContext = {\r\n      parent: this,\r\n      property: property,\r\n      newValue: newValue,\r\n      oldValue: oldValue,\r\n      propertyName: propertyName,\r\n      entityAspect: entityAspect\r\n    };\r\n\r\n    if ((property as any).isComplexProperty) {\r\n      setDpValueComplex(context, rawAccessorFn);\r\n    } else if (property.isDataProperty) {\r\n      setDpValueSimple(context, rawAccessorFn);\r\n    } else {\r\n      setNpValue(context, rawAccessorFn);\r\n    }\r\n\r\n    postChangeEvents(context);\r\n\r\n  } finally {\r\n    inProcess.pop();\r\n  }\r\n}\r\n\r\ninterface IContext {\r\n  parent: StructuralObject;\r\n  property: EntityProperty;\r\n  propertyName: string;\r\n  entityAspect: EntityAspect;\r\n  oldValue: any;\r\n  newValue: any;\r\n}\r\n\r\nfunction setDpValueSimple(context: IContext, rawAccessorFn: any) {\r\n  let parent = context.parent;\r\n  let property = context.property as DataProperty;\r\n  let entityAspect = context.entityAspect;\r\n  let oldValue = context.oldValue;\r\n  let newValue = context.newValue;\r\n\r\n  let entityManager = entityAspect.entityManager;\r\n\r\n  if (!property.isScalar) {\r\n    throw new Error(\"Nonscalar data properties are readonly - items may be added or removed but the collection may not be changed.\");\r\n  }\r\n\r\n  // store an original value for this property if not already set\r\n  if (entityAspect.entityState.isUnchangedOrModified()) {\r\n    let propName = property.name;\r\n    // localAspect is not the same as entityAspect for complex props\r\n    let localAspect = EntityAspect.isEntity(parent) ? parent.entityAspect : parent.complexAspect;\r\n    if (localAspect.originalValues[propName] === undefined) {\r\n      // otherwise this entry will be skipped during serialization\r\n      localAspect.originalValues[propName] = oldValue !== undefined ? oldValue : property.defaultValue;\r\n    }\r\n  }\r\n\r\n  // if we are changing the key update our internal entityGroup indexes.\r\n  if (property.isPartOfKey && entityManager && !entityManager.isLoading) {\r\n    // 'entityType' on the next line be null for complex properties but it will only be ref'd within this\r\n    // fn when the property is part of the key\r\n    let entityType = (parent as Entity).entityType;\r\n    let keyProps = entityType.keyProperties;\r\n    let values = keyProps.map(function (p) {\r\n      if (p === property) {\r\n        return newValue;\r\n      } else {\r\n        return parent.getProperty(p.name);\r\n      }\r\n    });\r\n    let newKey = new EntityKey(entityType, values);\r\n    if (entityManager.getEntityByKey(newKey)) {\r\n      throw new Error(\"An entity with this key is already in the cache: \" + newKey.toString());\r\n    }\r\n    let oldKey = (parent as Entity).entityAspect.getKey();\r\n    let eg = entityManager._findEntityGroup(entityType);\r\n    eg._replaceKey(oldKey, newKey);\r\n  }\r\n\r\n  // process related updates ( the inverse relationship) first so that collection dups check works properly.\r\n  // update inverse relationship\r\n\r\n  let relatedNavProp = property.relatedNavigationProperty;\r\n  if (relatedNavProp && entityManager) {\r\n    // Example: bidirectional fkDataProperty: 1->n: order -> orderDetails\r\n    // orderDetail.orderId <- newOrderId || null\r\n    //    ==> orderDetail.order = lookupOrder(newOrderId)\r\n    //    ==> (see set navProp above)\r\n    //       and\r\n    // Example: bidirectional fkDataProperty: 1->1: order -> internationalOrder\r\n    // internationalOrder.orderId <- newOrderId || null\r\n    //    ==> internationalOrder.order = lookupOrder(newOrderId)\r\n    //    ==> (see set navProp above)\r\n\r\n    if (newValue != null) {\r\n      let relatedEntity: Entity;\r\n      let key: EntityKey;\r\n      if (relatedNavProp.invForeignKeyNames.length) {\r\n        // property is related by field which is not the PK\r\n        const query = new EntityQuery(relatedNavProp.entityType.defaultResourceName).where(relatedNavProp.invForeignKeyNames[0], 'eq', newValue);\r\n        const qresult = entityManager.executeQueryLocally(query);\r\n        if (qresult.length === 1) {\r\n          relatedEntity = qresult[0];\r\n        }\r\n      } else {\r\n        // property is related by the PK\r\n        key = new EntityKey(relatedNavProp.entityType, [newValue]);\r\n        relatedEntity = entityManager.getEntityByKey(key);\r\n      }\r\n\r\n      if (relatedEntity) {\r\n        parent.setProperty(relatedNavProp.name, relatedEntity);\r\n      } else {\r\n        // it may not have been fetched yet in which case we want to add it as an unattachedChild.\r\n        if (key) {\r\n          // TODO currently _linkRelatedentities only works with PK relations, so we only add those.\r\n          entityManager._unattachedChildrenMap.addChild(key, relatedNavProp, parent as Entity);\r\n        }\r\n        parent.setProperty(relatedNavProp.name, null);\r\n      }\r\n    } else {\r\n      parent.setProperty(relatedNavProp.name, null);\r\n    }\r\n  } else if (property.inverseNavigationProperty && entityManager && !entityManager._inKeyFixup) {\r\n    // Example: unidirectional fkDataProperty: 1->n: region -> territories\r\n    // territory.regionId <- newRegionId\r\n    //    ==> lookupRegion(newRegionId).territories.push(territory)\r\n    //                and\r\n    // Example: unidirectional fkDataProperty: 1->1: order -> internationalOrder\r\n    // internationalOrder.orderId <- newOrderId\r\n    //    ==> lookupOrder(newOrderId).internationalOrder = internationalOrder\r\n    //                and\r\n    // Example: unidirectional fkDataProperty: 1->n: region -> territories\r\n    // territory.regionId <- null\r\n    //    ==> lookupRegion(territory.oldRegionId).territories.remove(oldTerritory);\r\n    //                and\r\n    // Example: unidirectional fkDataProperty: 1->1: order -> internationalOrder\r\n    // internationalOrder.orderId <- null\r\n    //    ==> lookupOrder(internationalOrder.oldOrderId).internationalOrder = null;\r\n\r\n    let invNavProp = property.inverseNavigationProperty;\r\n\r\n    if (oldValue != null) {\r\n      let key = new EntityKey(invNavProp.parentType, [oldValue]);\r\n      let relatedEntity = entityManager.getEntityByKey(key);\r\n      if (relatedEntity) {\r\n        if (invNavProp.isScalar) {\r\n          relatedEntity.setProperty(invNavProp.name, null);\r\n        } else {\r\n          // remove 'this' from old related nav prop\r\n          let relatedArray = relatedEntity.getProperty(invNavProp.name);\r\n          // arr.splice(arr.indexOf(value_to_remove), 1);\r\n          relatedArray.splice(relatedArray.indexOf(parent), 1);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (newValue != null) {\r\n      let key = new EntityKey(invNavProp.parentType, [newValue]);\r\n      let relatedEntity = entityManager.getEntityByKey(key);\r\n\r\n      if (relatedEntity) {\r\n        if (invNavProp.isScalar) {\r\n          relatedEntity.setProperty(invNavProp.name, parent);\r\n        } else {\r\n          relatedEntity.getProperty(invNavProp.name).push(parent);\r\n        }\r\n      } else {\r\n        // it may not have been fetched yet in which case we want to add it as an unattachedChild.\r\n        entityManager._unattachedChildrenMap.addChild(key, invNavProp, parent as Entity);\r\n      }\r\n    }\r\n\r\n  }\r\n\r\n  rawAccessorFn(newValue);\r\n\r\n  updateStateAndValidate(context);\r\n\r\n  // if (property.isPartOfKey && (!this.complexAspect)) {\r\n  if (property.isPartOfKey) {\r\n    // propogate pk change to all related entities;\r\n    let entityType = (parent as Entity).entityType;\r\n    let propertyIx = entityType.keyProperties.indexOf(property);\r\n    // this part handles order.orderId => orderDetail.orderId\r\n    // but won't handle product.productId => orderDetail.productId because product\r\n    // doesn't have an orderDetails property.\r\n    entityType.navigationProperties.forEach(function (np) {\r\n      let inverseNp = np.inverse;\r\n      let fkNames = inverseNp ? inverseNp.foreignKeyNames : np.invForeignKeyNames;\r\n\r\n      if (fkNames.length === 0) return;\r\n      let npValue = parent.getProperty(np.name);\r\n      if (!npValue) return;\r\n      let fkName = fkNames[propertyIx];\r\n      if (np.isScalar) {\r\n        npValue.setProperty(fkName, newValue);\r\n      } else {\r\n        npValue.slice(0).forEach(function (iv: any) {\r\n          iv.setProperty(fkName, newValue);\r\n        });\r\n      }\r\n    });\r\n    // this handles unidirectional problems not covered above.\r\n    if (entityManager) {\r\n      let inverseForeignKeyProperties = entityType.inverseForeignKeyProperties;\r\n      let baseEntityType = entityType.baseEntityType;\r\n      while (baseEntityType) {\r\n        inverseForeignKeyProperties = inverseForeignKeyProperties.concat(baseEntityType.inverseForeignKeyProperties);\r\n        baseEntityType = baseEntityType.baseEntityType;\r\n      }\r\n      inverseForeignKeyProperties.forEach((invFkProp) => {\r\n        if (invFkProp.relatedNavigationProperty!.inverse == null) {\r\n          // this next step may be slow - it iterates over all of the entities in a group;\r\n          // hopefully it doesn't happen often.\r\n          entityManager!._updateFkVal(invFkProp, oldValue, newValue);\r\n        }\r\n        \r\n      });\r\n    }\r\n\r\n    // insure that cached key is updated.\r\n    entityAspect.getKey(true);\r\n  }\r\n}\r\n\r\nfunction setDpValueComplex(context: IContext, rawAccessorFn: Function) {\r\n  let property = context.property as DataProperty;\r\n  let oldValue = context.oldValue;\r\n  let newValue = context.newValue;\r\n\r\n  // To get here it must be a ComplexProperty\r\n  // 'dataType' will be a complexType\r\n  let dataType = property.dataType as ComplexType;\r\n  if (property.isScalar) {\r\n    if (!newValue) {\r\n      throw new Error(core.formatString(\"You cannot set the '%1' property to null because its datatype is the ComplexType: '%2'\", property.name, property.dataType.name));\r\n    }\r\n\r\n    if (!oldValue) {\r\n      let ctor = dataType.getCtor();\r\n      oldValue = new ctor();\r\n      rawAccessorFn(oldValue);\r\n    }\r\n    dataType.dataProperties.forEach(function (dp) {\r\n      let pn = dp.name;\r\n      let nv = newValue.getProperty(pn);\r\n      oldValue.setProperty(pn, nv);\r\n    });\r\n  } else {\r\n    throw new Error(core.formatString(\"You cannot set the non-scalar complex property: '%1' on the type: '%2'.\" +\r\n            \"Instead get the property and use array functions like 'push' or 'splice' to change its contents.\",\r\n        property.name, property.parentType.name));\r\n  }\r\n}\r\n\r\n\r\nfunction setNpValue(context: IContext, rawAccessorFn: Function) {\r\n\r\n  let parent = context.parent as Entity;\r\n  let property = context.property as NavigationProperty;\r\n  let entityAspect = context.entityAspect;\r\n  let oldValue = context.oldValue;\r\n  let newValue = context.newValue;\r\n\r\n  if (!property.isScalar) {\r\n    throw new Error(\"Nonscalar navigation properties are readonly - entities can be added or removed but the collection may not be changed.\");\r\n  }\r\n\r\n  let entityManager = entityAspect.entityManager;\r\n  let inverseProp = property.inverse;\r\n\r\n  // manage attachment -\r\n  if (newValue != null) {\r\n    if (!newValue.entityAspect) {\r\n      return;\r\n    }\r\n    let newAspect = newValue.entityAspect;\r\n    if (entityManager) {\r\n      if (newAspect.entityState.isDetached()) {\r\n        if (!entityManager.isLoading) {\r\n          entityManager.attachEntity(newValue, EntityState.Added);\r\n        }\r\n      } else {\r\n        if (newAspect.entityManager !== entityManager) {\r\n          throw new Error(\"An Entity cannot be attached to an entity in another EntityManager. One of the two entities must be detached first.\");\r\n        }\r\n      }\r\n    } else {\r\n      if (newAspect && newAspect.entityManager) {\r\n        entityManager = newAspect.entityManager;\r\n        if (!entityManager!.isLoading) {\r\n          entityManager!.attachEntity(entityAspect.entity!, EntityState.Added);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // process related updates ( the inverse relationship) first so that collection dups check works properly.\r\n  // update inverse relationship\r\n  if (inverseProp) {\r\n    ///\r\n    if (inverseProp.isScalar) {\r\n      // Example: bidirectional navProperty: 1->1: order -> internationalOrder\r\n      // order.internationalOrder <- internationalOrder || null\r\n      //    ==> (oldInternationalOrder.order = null)\r\n      //    ==> internationalOrder.order = order\r\n      if (oldValue != null) {\r\n        // TODO: null -> NullEntity later\r\n        oldValue.setProperty(inverseProp.name, null);\r\n      }\r\n      if (newValue != null) {\r\n        newValue.setProperty(inverseProp.name, parent);\r\n      }\r\n    } else {\r\n      // Example: bidirectional navProperty: 1->n: order -> orderDetails\r\n      // orderDetail.order <- newOrder || null\r\n      //    ==> (oldOrder).orderDetails.remove(orderDetail)\r\n      //    ==> order.orderDetails.push(newOrder)\r\n      if (oldValue != null) {\r\n        let oldSiblings = oldValue.getProperty(inverseProp.name);\r\n        let ix = oldSiblings.indexOf(parent);\r\n        if (ix !== -1) {\r\n          oldSiblings.splice(ix, 1);\r\n        }\r\n      }\r\n      if (newValue != null) {\r\n        let siblings = newValue.getProperty(inverseProp.name);\r\n        // recursion check if already in the collection is performed by the relationArray\r\n        siblings.push(parent);\r\n      }\r\n    }\r\n  } else if (property.invForeignKeyNames && entityManager && !entityManager._inKeyFixup) {\r\n    let invForeignKeyNames = property.invForeignKeyNames;\r\n    if (newValue != null) {\r\n      // Example: unidirectional navProperty: 1->1: order -> internationalOrder\r\n      // order.InternationalOrder <- internationalOrder\r\n      //    ==> internationalOrder.orderId = orderId\r\n      //      and\r\n      // Example: unidirectional navProperty: 1->n: order -> orderDetails\r\n      // orderDetail.order <-xxx newOrder\r\n      //    ==> CAN'T HAPPEN because if unidirectional because orderDetail will not have an order prop\r\n      let pkValues = parent.entityAspect.getKey().values;\r\n      invForeignKeyNames.forEach( (fkName, i) => {\r\n        newValue!.setProperty(fkName, pkValues[i]);\r\n      });\r\n    } else {\r\n      // Example: unidirectional navProperty: 1->1: order -> internationalOrder\r\n      // order.internationalOrder <- null\r\n      //    ==> (old internationalOrder).orderId = null\r\n      //        and\r\n      // Example: unidirectional navProperty: 1->n: order -> orderDetails\r\n      // orderDetail.order <-xxx newOrder\r\n      //    ==> CAN'T HAPPEN because if unidirectional because orderDetail will not have an order prop\r\n      if (oldValue != null) {\r\n        invForeignKeyNames.forEach( (fkName) => {\r\n          let fkProp = oldValue.entityType.getProperty(fkName);\r\n          if (!fkProp.isPartOfKey) {\r\n            // don't update with null if fk is part of the key\r\n            oldValue.setProperty(fkName, null);\r\n          }\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  rawAccessorFn(newValue);\r\n\r\n  updateStateAndValidate(context);\r\n\r\n  // update fk data property - this can only occur if this navProperty has\r\n  // a corresponding fk on this entity.\r\n  if (property.relatedDataProperties) {\r\n    let entityState = entityAspect.entityState;\r\n    // if either side of nav prop is detached don't clear fks. Note: oldValue in next line cannot be null so no check is needed.\r\n    if (newValue == null && (entityState.isDetached() || oldValue.entityAspect.entityState.isDetached())) return;\r\n    if (entityState.isDeleted()) return;\r\n\r\n    // we may have inverse props indicating the related prop on the other entity, if it is not the other entity's PK\r\n    let inverseKeyProps = property.invForeignKeyNames;\r\n    if (!(inverseKeyProps && inverseKeyProps.length)) {\r\n      // otherwise, this prop is related to the other entity's PK\r\n      inverseKeyProps = property.entityType.keyProperties.map(k => k.name);\r\n    }\r\n    inverseKeyProps.forEach(function (keyProp, i) {\r\n      let relatedDataProp = property.relatedDataProperties[i];\r\n      // Do not trash related property if it is part of that entity's key\r\n      if (newValue || !relatedDataProp.isPartOfKey) {\r\n        let relatedValue = newValue ? newValue.getProperty(keyProp) : relatedDataProp.defaultValue;\r\n        parent.setProperty(relatedDataProp.name, relatedValue);\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nfunction postChangeEvents(context: IContext) {\r\n  let entityAspect = context.entityAspect;\r\n\r\n  let entityManager = entityAspect.entityManager;\r\n  let entity = entityAspect.entity;\r\n\r\n  let propChangedArgs = { entity: entity!, parent: context.parent, property: context.property, propertyName: context.propertyName, oldValue: context.oldValue, newValue: context.newValue };\r\n  if (entityManager) {\r\n    // propertyChanged will be fired during loading but we only want to fire it once per entity, not once per property.\r\n    // so propertyChanged is fired in the entityManager mergeEntity method if not fired here.\r\n    if ((!entityManager.isLoading) && (!entityManager.isRejectingChanges)) {\r\n      entityAspect.propertyChanged.publish(propChangedArgs);\r\n      // don't fire entityChanged event if propertyChanged is suppressed.\r\n      entityManager.entityChanged.publish({ entityAction: EntityAction.PropertyChange, entity: entity, args: propChangedArgs });\r\n    }\r\n  } else {\r\n    entityAspect.propertyChanged.publish(propChangedArgs);\r\n  }\r\n}\r\n\r\nfunction updateStateAndValidate(context: IContext) {\r\n  let entityAspect = context.entityAspect;\r\n  let entityManager = entityAspect.entityManager;\r\n  if (entityManager == null || entityManager.isLoading) return;\r\n  let property = context.property;\r\n\r\n  if (entityAspect.entityState.isUnchanged() && !property.isUnmapped) {\r\n    entityAspect.setModified();\r\n  }\r\n\r\n  if (entityManager.validationOptions.validateOnPropertyChange) {\r\n    // entityAspect.entity is NOT the same as parent in the code below. It's use is deliberate.\r\n    entityAspect._validateProperty(context.newValue,\r\n        { entity: entityAspect.entity, property: property, propertyName: context.propertyName, oldValue: context.oldValue });\r\n  }\r\n}\r\n","import { core, ErrorCallback } from './core';\r\nimport { config } from './config';\r\nimport { BreezeEvent } from './event';\r\nimport { assertParam, assertConfig, Param } from './assert-param';\r\nimport { DataType } from './data-type';\r\nimport { EntityAspect, ComplexAspect, Entity, ComplexObject, StructuralObject } from './entity-aspect';\r\nimport { EntityKey } from './entity-key';\r\nimport { Validator } from './validate';\r\nimport { BreezeEnum } from './enum';\r\nimport { DataService } from './data-service';\r\nimport { NamingConvention } from './naming-convention';\r\nimport { CsdlMetadataParser } from './csdl-metadata-parser'; // TODO isolate this later;\r\nimport { LocalQueryComparisonOptions } from './local-query-comparison-options';\r\nimport { defaultPropertyInterceptor } from './default-property-interceptor';\r\n\r\nexport type EntityProperty = DataProperty | NavigationProperty;\r\nexport type StructuralType = EntityType | ComplexType;\r\n\r\n/** @hidden @internal */\r\nexport interface IStructuralTypeMap {\r\n  [index: string]: StructuralType;\r\n}\r\n/** Keep track of constructors and initializers for StructuralTypes */\r\ninterface CtorRecord { \r\n  ctor: { new (): StructuralObject };\r\n  initFn?: Function | string; \r\n  noTrackingFn?: Function;\r\n}\r\n\r\n// TODO: consider exposing later\r\n/** @hidden @internal */\r\nexport interface IMetadataJson {\r\n  metadataVersion: string;\r\n  name: string;\r\n  namingConvention: string;\r\n  localQueryComparisonOptions: string;\r\n  dataServices: Object[]; // IDataServiceJson[]\r\n  structuralTypes: Object[]; // IStructuralTypeJson[]; \r\n  resourceEntityTypeMap: Object[]; // IResourceEntityTypeJson[]\r\n  incompleteTypeMap: Object[];\r\n}\r\n\r\n/** Configuration info to be passed to the [[MetadataStore]] constructor */\r\nexport interface MetadataStoreConfig {\r\n  /** The  [[NamingConvention]] associated with this MetadataStore. */\r\n  namingConvention?: NamingConvention;\r\n  /** The  [[LocalQueryComparisonOptions]] associated with this MetadataStore. */\r\n  localQueryComparisonOptions?: LocalQueryComparisonOptions;\r\n  serializerFn?: (prop: EntityProperty, val: any) => any;\r\n  name?: string;\r\n}\r\n\r\nexport interface MetadataFetchedEventArgs {\r\n  metadataStore: MetadataStore;\r\n  dataService: DataService | string;\r\n  rawMetadata: any;\r\n}\r\n\r\n/**\r\nAn instance of the MetadataStore contains all of the metadata about a collection of [[EntityType]]'s.\r\nMetadataStores may be shared across [[EntityManager]]'s.  If an EntityManager is created without an\r\nexplicit MetadataStore, the MetadataStore from the MetadataStore.defaultInstance property will be used.\r\n@dynamic\r\n**/\r\nexport class MetadataStore {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on proto\r\n\r\n  /** @hidden @internal */\r\n  static __id = 0;\r\n  /** @hidden @internal */\r\n  static ANONTYPE_PREFIX = \"_IB_\";\r\n  /** The version of any MetadataStores created by this class */\r\n  static metadataVersion = '1.0.5';\r\n\r\n  name: string;\r\n  dataServices: DataService[];\r\n\r\n  /** The  [[NamingConvention]] associated with this MetadataStore. __Read Only__ */\r\n  namingConvention: NamingConvention;\r\n  /** The  [[LocalQueryComparisonOptions]] associated with this MetadataStore. __Read Only__ */\r\n  localQueryComparisonOptions: LocalQueryComparisonOptions;\r\n  serializerFn?: (prop: EntityProperty, val: any) => any;\r\n  /**\r\n  An [[BreezeEvent]] that fires after a MetadataStore has completed fetching metadata from a remote service.\r\n  \r\n  @eventArgs -\r\n    - metadataStore - The MetadataStore into which the metadata was fetched.\r\n    - dataService - The [[DataService]] that metadata was fetched from.\r\n    - rawMetadata - {Object} The raw metadata returned from the service. (It will have already been processed by this point).\r\n  >      let ms = myEntityManager.metadataStore;\r\n  >      ms.metadataFetched.subscribe(function(args) {\r\n  >          let metadataStore = args.metadataStore;\r\n  >          let dataService = args.dataService;\r\n  >      });\r\n  @event\r\n  **/\r\n  metadataFetched: BreezeEvent<MetadataFetchedEventArgs>;\r\n  /** @hidden @internal */\r\n  _resourceEntityTypeMap: Record<string, string>;\r\n  /** @hidden @internal */\r\n  _entityTypeResourceMap: Record<string, string>;\r\n  /** @hidden @internal key is qualified structuraltype name - value is structuralType. ( structural = entityType or complexType). */\r\n  _structuralTypeMap: IStructuralTypeMap;\r\n  /** @hidden @internal key is shortName, value is qualified name - does not need to be serialized. **/\r\n  _shortNameMap: Record<string, string>;\r\n  /** @hidden @internal key is either short or qual type name - value is ctor; **/\r\n  _ctorRegistry: Record<string, CtorRecord>;\r\n  /** @hidden @internal key is entityTypeName; value is array of nav props **/\r\n  _incompleteTypeMap: Record<string, NavigationProperty[]>;\r\n  /** @hidden @internal **/\r\n  _incompleteComplexTypeMap: Record<string, DataProperty[]>;\r\n  /** @hidden @internal { json: any, stype: StructuralType }[] | { entityType: EntityType, csdlEntityType: any }[] **/\r\n  _deferredTypes: Record<string, any>;\r\n  /** @hidden @internal **/\r\n  _id: number;\r\n\r\n  /**\r\n  Constructs a new MetadataStore.\r\n  \r\n  >     let ms = new MetadataStore();\r\n\r\n  The store can then be associated with an EntityManager\r\n  >     let entityManager = new EntityManager( {\r\n  >         serviceName: \"breeze/NorthwindIBModel\", \r\n  >         metadataStore: ms \r\n  >     });\r\n\r\n  or for an existing EntityManager\r\n  >    // Assume em1 is an existing EntityManager\r\n  >    em1.setProperties( { metadataStore: ms });\r\n  \r\n  @param config - Configuration settings .\r\n    - namingConvention - (default=NamingConvention.defaultInstance) NamingConvention to be used in mapping property names\r\n  between client and server. Uses the NamingConvention.defaultInstance if not specified.\r\n    - localQueryComparisonOptions - (default=LocalQueryComparisonOptions.defaultInstance) The LocalQueryComparisonOptions to be\r\n  used when performing \"local queries\" in order to match the semantics of queries against a remote service.\r\n    - serializerFn - A function that is used to mediate the serialization of instances of this type.\r\n  **/\r\n  constructor(config?: MetadataStoreConfig) {\r\n    config = config || {};\r\n    assertConfig(config)\r\n      .whereParam(\"namingConvention\").isOptional().isInstanceOf(NamingConvention).withDefault(NamingConvention.defaultInstance)\r\n      .whereParam(\"localQueryComparisonOptions\").isOptional().isInstanceOf(LocalQueryComparisonOptions).withDefault(LocalQueryComparisonOptions.defaultInstance)\r\n      .whereParam(\"serializerFn\").isOptional().isFunction()\r\n      .applyAll(this);\r\n    this.dataServices = []; // array of dataServices;\r\n    this._resourceEntityTypeMap = {}; // key is resource name - value is qualified entityType name\r\n    this._structuralTypeMap = {}; // key is qualified structuraltype name - value is structuralType. ( structural = entityType or complexType).\r\n    this._shortNameMap = {}; // key is shortName, value is qualified name - does not need to be serialized.\r\n    this._ctorRegistry = {}; // key is either short or qual type name - value is ctor;\r\n\r\n    this._incompleteTypeMap = {}; // key is entityTypeName; value is array of nav props\r\n    this._incompleteComplexTypeMap = {}; // key is complexTypeName; value is array of complexType props\r\n    this._id = MetadataStore.__id++;\r\n    this.metadataFetched = new BreezeEvent(\"metadataFetched\", this);\r\n\r\n  }\r\n\r\n  // needs to be made avail to dataService.xxx files\r\n  static normalizeTypeName = core.memoize(function (rawTypeName: string) {\r\n    return rawTypeName && MetadataStore.parseTypeName(rawTypeName).typeName;\r\n  });\r\n  // for debugging use the line below instead.\r\n  //ctor.normalizeTypeName = function (rawTypeName) { return parseTypeName(rawTypeName).typeName; };\r\n\r\n  /**\r\n  General purpose property set method\r\n  \r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     em1.metadataStore.setProperties( {\r\n  >         version: \"6.1.3\",\r\n  >         serializerFn: function(prop, value) {\r\n  >         return (prop.isUnmapped) ? undefined : value;\r\n  >         }\r\n  >     )};\r\n  @param config -  An object containing the selected properties and values to set.\r\n  **/\r\n  setProperties(config: MetadataStoreConfig) {\r\n    assertConfig(config)\r\n      .whereParam(\"name\").isString().isOptional()\r\n      .whereParam(\"serializerFn\").isFunction().isOptional()\r\n      .applyAll(this);\r\n  }\r\n\r\n  /**\r\n  Adds a DataService to this MetadataStore. If a DataService with the same serviceName is already\r\n  in the MetadataStore an exception will be thrown.\r\n  @param dataService - The [[DataService]] to add\r\n  @param shouldOverwrite - (default=false) Permit overwrite of existing DataService rather than throw exception\r\n  **/\r\n  addDataService(dataService: DataService, shouldOverwrite?: boolean) {\r\n    assertParam(dataService, \"dataService\").isInstanceOf(DataService).check();\r\n    assertParam(shouldOverwrite, \"shouldOverwrite\").isBoolean().isOptional().check();\r\n    let ix = this._getDataServiceIndex(dataService.serviceName);\r\n    if (ix >= 0) {\r\n      if (!!shouldOverwrite) {\r\n        this.dataServices[ix] = dataService;\r\n      } else {\r\n        throw new Error(\"A dataService with this name '\" + dataService.serviceName + \"' already exists in this MetadataStore\");\r\n      }\r\n    } else {\r\n      this.dataServices.push(dataService);\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _getDataServiceIndex(serviceName: string) {\r\n    return core.arrayIndexOf(this.dataServices, function (ds) {\r\n      return ds.serviceName === serviceName;\r\n    });\r\n  }\r\n\r\n  /**\r\n  Adds an EntityType to this MetadataStore.  No additional properties may be added to the EntityType after its has\r\n  been added to the MetadataStore.\r\n  @param structuralType - The EntityType or ComplexType to add\r\n  **/\r\n  addEntityType(stype: StructuralType | EntityTypeConfig | ComplexTypeConfig) {\r\n    let structuralType: StructuralType;\r\n    if (stype instanceof EntityType || stype instanceof ComplexType) {\r\n      structuralType = stype;\r\n    } else {\r\n      structuralType = (stype as any).isComplexType ? new ComplexType(stype) : new EntityType(stype);\r\n    }\r\n\r\n    // if (!structuralType.isComplexType) { // same as below but isn't a 'type guard'\r\n    if (structuralType instanceof EntityType) {\r\n      if (structuralType.baseTypeName && !structuralType.baseEntityType) {\r\n        let baseEntityType = this._getStructuralType(structuralType.baseTypeName, true);\r\n        // safe cast because we know that baseEntityType must be an EntityType if the structuralType is an EntityType\r\n        structuralType._updateFromBase(baseEntityType as EntityType);\r\n      }\r\n      if (structuralType.keyProperties.length === 0 && !structuralType.isAbstract) {\r\n        throw new Error(\"Unable to add \" + structuralType.name +\r\n          \" to this MetadataStore.  An EntityType must have at least one property designated as a key property - See the 'DataProperty.isPartOfKey' property.\");\r\n      }\r\n    }\r\n\r\n    structuralType.metadataStore = this;\r\n    // don't register anon types\r\n    if (!(structuralType as any).isAnonymous) {\r\n      if (this._structuralTypeMap[structuralType.name]) {\r\n        throw new Error(\"Type \" + structuralType.name + \" already exists in this MetadataStore.\");\r\n      }\r\n\r\n      this._structuralTypeMap[structuralType.name] = structuralType;\r\n      this._shortNameMap[structuralType.shortName] = structuralType.name;\r\n    }\r\n\r\n    structuralType.getProperties().forEach(p => {\r\n      structuralType._updateNames(p);\r\n      if (!p.isUnmapped) {\r\n        structuralType._mappedPropertiesCount++;\r\n      }\r\n    });\r\n\r\n    structuralType._updateCps();\r\n\r\n    // 'isEntityType' is a type guard\r\n    if (structuralType instanceof EntityType) {\r\n      structuralType._updateNps();\r\n      // give the type it's base's resource name if it doesn't have its own.\r\n      let defResourceName = structuralType.defaultResourceName || (structuralType.baseEntityType && structuralType.baseEntityType.defaultResourceName);\r\n      if (defResourceName && !this.getEntityTypeNameForResourceName(defResourceName)) {\r\n        this.setEntityTypeForResourceName(defResourceName, structuralType.name);\r\n      }\r\n      structuralType.defaultResourceName = defResourceName;\r\n      // check if this structural type's name, short version or qualified version has a registered ctor.\r\n      structuralType.getEntityCtor();\r\n    }\r\n\r\n  }\r\n\r\n\r\n  /**\r\n  Exports this MetadataStore to a serialized string appropriate for local storage.   This operation is also called\r\n  internally when exporting an EntityManager.\r\n  >      // assume ms is a previously created MetadataStore\r\n  >      let metadataAsString = ms.exportMetadata();\r\n  >      window.localStorage.setItem(\"metadata\", metadataAsString);\r\n  >      // and later, usually in a different session imported\r\n  >      let metadataFromStorage = window.localStorage.getItem(\"metadata\");\r\n  >      let newMetadataStore = new MetadataStore();\r\n  >      newMetadataStore.importMetadata(metadataFromStorage);\r\n  @return A serialized version of this MetadataStore that may be stored locally and later restored.\r\n  **/\r\n  exportMetadata() {\r\n    let result = JSON.stringify({\r\n      \"metadataVersion\": MetadataStore.metadataVersion,\r\n      \"name\": this.name,\r\n      \"namingConvention\": this.namingConvention.name,\r\n      \"localQueryComparisonOptions\": this.localQueryComparisonOptions.name,\r\n      \"dataServices\": this.dataServices,\r\n      \"structuralTypes\": core.objectMap(this._structuralTypeMap),\r\n      \"resourceEntityTypeMap\": this._resourceEntityTypeMap\r\n    }, null, config.stringifyPad);\r\n    return result;\r\n  }\r\n\r\n  /**\r\n  Imports a previously exported serialized MetadataStore into this MetadataStore.\r\n    \r\n  >      // assume ms is a previously created MetadataStore\r\n  >      let metadataAsString = ms.exportMetadata();\r\n  >      window.localStorage.setItem(\"metadata\", metadataAsString);\r\n  >      // and later, usually in a different session\r\n  >      let metadataFromStorage = window.localStorage.getItem(\"metadata\");\r\n  >      let newMetadataStore = new MetadataStore();\r\n  >      newMetadataStore.importMetadata(metadataFromStorage);\r\n  @param exportedMetadata - A previously exported MetadataStore.\r\n  @param allowMerge -  Allows custom metadata to be merged into existing metadata types.\r\n  @return This MetadataStore.\r\n  @chainable\r\n  **/\r\n  importMetadata(exportedMetadata: string | Object, allowMerge: boolean = false) {\r\n    assertParam(allowMerge, \"allowMerge\").isOptional().isBoolean().check();\r\n    this._deferredTypes = {};\r\n    // insure that we don't mutate incoming exportedMetadata ( if its an object)\r\n    let metadataAsString = (typeof (exportedMetadata) === \"string\") ? exportedMetadata : JSON.stringify(exportedMetadata);\r\n    const metadataJson = JSON.parse(metadataAsString);\r\n\r\n    if (metadataJson.schema) {\r\n      return CsdlMetadataParser.parse(this, metadataJson.schema, metadataJson.altMetadata);\r\n    }\r\n\r\n    let json = metadataJson as IMetadataJson;\r\n    if (json.metadataVersion && json.metadataVersion !== MetadataStore.metadataVersion) {\r\n      let msg = core.formatString(\"Cannot import metadata with a different 'metadataVersion' (%1) than the current 'MetadataStore.metadataVersion' (%2) \",\r\n        json.metadataVersion, MetadataStore.metadataVersion);\r\n      throw new Error(msg);\r\n    }\r\n\r\n    let ncName = json.namingConvention;\r\n    let lqcoName = json.localQueryComparisonOptions;\r\n    if (this.isEmpty()) {\r\n      this.namingConvention = config._fetchObject(NamingConvention, ncName) || this.namingConvention;\r\n      this.localQueryComparisonOptions = config._fetchObject(LocalQueryComparisonOptions, lqcoName) || this.localQueryComparisonOptions;\r\n    } else {\r\n      if (ncName && this.namingConvention.name !== ncName) {\r\n        throw new Error(\"Cannot import metadata with a different 'namingConvention' from the current MetadataStore\");\r\n      }\r\n      if (lqcoName && this.localQueryComparisonOptions.name !== lqcoName) {\r\n        throw new Error(\"Cannot import metadata with different 'localQueryComparisonOptions' from the current MetadataStore\");\r\n      }\r\n    }\r\n\r\n    //noinspection JSHint\r\n    json.dataServices && json.dataServices.forEach((ds) => {\r\n      let realDs = DataService.fromJSON(ds);\r\n      this.addDataService(realDs, true);\r\n    });\r\n\r\n    json.structuralTypes && json.structuralTypes.forEach((stype) => {\r\n      structuralTypeFromJson(this, stype, allowMerge);\r\n    });\r\n    core.extend(this._resourceEntityTypeMap, json.resourceEntityTypeMap);\r\n    core.extend(this._incompleteTypeMap, json.incompleteTypeMap);\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n  Creates a new MetadataStore from a previously exported serialized MetadataStore\r\n  >      // assume ms is a previously created MetadataStore\r\n  >      let metadataAsString = ms.exportMetadata();\r\n  >      window.localStorage.setItem(\"metadata\", metadataAsString);\r\n  >      // and later, usually in a different session\r\n  >      let metadataFromStorage = window.localStorage.getItem(\"metadata\");\r\n  >      let newMetadataStore = MetadataStore.importMetadata(metadataFromStorage);\r\n  @param exportedString - A previously exported MetadataStore.\r\n  @return A new MetadataStore.\r\n  **/\r\n  static importMetadata(exportedString: string) {\r\n    let ms = new MetadataStore();\r\n    ms.importMetadata(exportedString);\r\n    return ms;\r\n  }\r\n\r\n  /**\r\n  Returns whether Metadata has been retrieved for a specified service name.\r\n  >      // Assume em1 is an existing EntityManager.\r\n  >      if (!em1.metadataStore.hasMetadataFor(\"breeze/NorthwindIBModel\"))) {\r\n  >          // do something interesting\r\n  >      }\r\n  @param serviceName - The service name.\r\n  @return Whether metadata has already been retrieved for the specified service name.\r\n  **/\r\n  hasMetadataFor(serviceName: string) {\r\n    return !!this.getDataService(serviceName);\r\n  }\r\n\r\n  /**\r\n  Returns the DataService for a specified service name\r\n  >      // Assume em1 is an existing EntityManager.\r\n  >      let ds = em1.metadataStore.getDataService(\"breeze/NorthwindIBModel\");\r\n  >      let adapterName = ds.adapterName; // may be null\r\n  @param serviceName - The service name.\r\n  @return The DataService with the specified name.\r\n  **/\r\n  getDataService(serviceName: string) {\r\n    assertParam(serviceName, \"serviceName\").isString().check();\r\n\r\n    serviceName = DataService._normalizeServiceName(serviceName);\r\n    return core.arrayFirst(this.dataServices, function (ds: DataService) {\r\n      return ds.serviceName === serviceName;\r\n    });\r\n  }\r\n\r\n  /**\r\n  Fetches the metadata for a specified 'service'. This method is automatically called\r\n  internally by an EntityManager before its first query against a new service. __Async__\r\n\r\n  Usually you will not actually process the results of a fetchMetadata call directly, but will instead\r\n  ask for the metadata from the EntityManager after the fetchMetadata call returns.\r\n  >      let ms = new MetadataStore();\r\n  >      // or more commonly\r\n  >      // let ms = anEntityManager.metadataStore;\r\n  >      ms.fetchMetadata(\"breeze/NorthwindIBModel\").then(function(rawMetadata) {\r\n  >            // do something with the metadata\r\n  >      }).catch(function(exception) {\r\n  >          // handle exception here\r\n  >      });\r\n  @param dataService -  Either a DataService or just the name of the DataService to fetch metadata for.\r\n  @param callback - Function called on success.\r\n  @param errorCallback - Function called on failure.\r\n  @return Promise\r\n  **/\r\n  fetchMetadata(dataService: string | DataService, callback?: (schema: any) => void, errorCallback?: ErrorCallback) {\r\n    try {\r\n      assertParam(dataService, \"dataService\").isString().or().isInstanceOf(DataService).check();\r\n      assertParam(callback, \"callback\").isFunction().isOptional().check();\r\n      assertParam(errorCallback, \"errorCallback\").isFunction().isOptional().check();\r\n\r\n      if (typeof dataService === \"string\") {\r\n        // use the dataService with a matching name or create a new one.\r\n        dataService = this.getDataService(dataService) || new DataService({ serviceName: dataService });\r\n      }\r\n\r\n      dataService = DataService.resolve([dataService]);\r\n\r\n      if (this.hasMetadataFor(dataService.serviceName)) {\r\n        throw new Error(\"Metadata for a specific serviceName may only be fetched once per MetadataStore. ServiceName: \" + dataService.serviceName);\r\n      }\r\n\r\n      return dataService.adapterInstance!.fetchMetadata(this, dataService).then((rawMetadata: any) => {\r\n        this.metadataFetched.publish({ metadataStore: this, dataService: dataService, rawMetadata: rawMetadata });\r\n        if (callback) callback(rawMetadata);\r\n        return Promise.resolve(rawMetadata);\r\n      }, function (error: any) {\r\n        if (errorCallback) errorCallback(error);\r\n        return Promise.reject(error);\r\n      });\r\n    } catch (e) {\r\n      return Promise.reject(e);\r\n    }\r\n  }\r\n\r\n\r\n  // TODO: strongly type interceptor below.\r\n  /**\r\n  Used to register a constructor for an EntityType that is not known via standard Metadata discovery;\r\n  i.e. an unmapped type.\r\n  @param entityCtor - The constructor function for the 'unmapped' type.\r\n  @param interceptor - An interceptor function\r\n  **/\r\n  trackUnmappedType(entityCtor: any, interceptor: any) {\r\n    assertParam(entityCtor, \"entityCtor\").isFunction().check();\r\n    assertParam(interceptor, \"interceptor\").isFunction().isOptional().check();\r\n    // TODO: think about adding this to the MetadataStore.\r\n    let entityType = new EntityType(this);\r\n    entityType._setCtor(entityCtor, interceptor);\r\n  }\r\n\r\n  /**\r\n  Provides a mechanism to register a 'custom' constructor to be used when creating new instances\r\n  of the specified entity type.  If this call is not made, a default constructor is created for\r\n  the entity as needed.\r\n  This call may be made before or after the corresponding EntityType has been discovered via\r\n  Metadata discovery.\r\n  >      let Customer = function () {\r\n  >              this.miscData = \"asdf\";\r\n  >          };\r\n  >      Customer.prototype.doFoo() {\r\n  >              ...\r\n  >          }\r\n  >      // assume em1 is a preexisting EntityManager;\r\n  >      em1.metadataStore.registerEntityTypeCtor(\"Customer\", Customer);\r\n  >      // any queries or EntityType.create calls from this point on will call the Customer constructor\r\n  >      // registered above.\r\n  @param structuralTypeName - The name of the EntityType or ComplexType.\r\n  @param aCtor - The constructor for this EntityType or ComplexType; may be null if all you want to do is set the next parameter.\r\n  @param initFn - A function or the name of a function on the entity that is to be executed immediately after the entity has been created\r\n  and populated with any initial values. Called with 'initFn(entity)'\r\n  @param noTrackingFn - A function that is executed immediately after a noTracking entity has been created and whose return\r\n  value will be used in place of the noTracking entity.\r\n  **/\r\n  registerEntityTypeCtor(structuralTypeName: string, aCtor?: any, initFn?: Function | string, noTrackingFn?: Function) {\r\n    assertParam(structuralTypeName, \"structuralTypeName\").isString().check();\r\n    assertParam(aCtor, \"aCtor\").isFunction().isOptional().check();\r\n    assertParam(initFn, \"initFn\").isOptional().isFunction().or().isString().check();\r\n    assertParam(noTrackingFn, \"noTrackingFn\").isOptional().isFunction().check();\r\n\r\n    let qualifiedTypeName = getQualifiedTypeName(this, structuralTypeName, false);\r\n    let typeName = qualifiedTypeName || structuralTypeName;\r\n\r\n    if (aCtor) {\r\n      if (aCtor._$typeName && aCtor._$typeName !== typeName) {\r\n        // TODO: wrap this - console and especially console.warn does not exist in all browsers.\r\n        console.warn(\"Registering a constructor for \" + typeName + \" that is already used for \" + aCtor._$typeName + \".\");\r\n      }\r\n      aCtor._$typeName = typeName;\r\n    }\r\n\r\n    this._ctorRegistry[typeName] = { ctor: aCtor, initFn: initFn, noTrackingFn: noTrackingFn };\r\n    if (qualifiedTypeName) {\r\n      let stype = this._structuralTypeMap[qualifiedTypeName];\r\n      stype && stype.getCtor(true); // this will complete the registration if avail now.\r\n    }\r\n\r\n  }\r\n\r\n  /**\r\n  Returns whether this MetadataStore contains any metadata yet.\r\n  >      // assume em1 is a preexisting EntityManager;\r\n  >      if (em1.metadataStore.isEmpty()) {\r\n  >          // do something interesting\r\n  >      }\r\n  **/\r\n  isEmpty() {\r\n    return core.isEmpty(this._structuralTypeMap);\r\n  }\r\n\r\n  /**\r\n  Returns an [[EntityType]] or null given its name.\r\n  >      // assume em1 is a preexisting EntityManager\r\n  >      let odType = em1.metadataStore.getAsEntityType(\"OrderDetail\");\r\n\r\n  or to throw an error if the type is not found\r\n  >      let badType = em1.metadataStore.getAsEntityType(\"Foo\", false);\r\n  >      // badType will not get set and an exception will be thrown.\r\n  @param structuralTypeName - Either the fully qualified name or a short name may be used. If a short name is specified and multiple types share\r\n  that same short name an exception will be thrown.\r\n  @param okIfNotFound - (default=false) Whether to throw an error if the specified EntityType is not found.\r\n  @return The EntityType. ComplexType or 'null' if not not found.\r\n  **/\r\n  getAsEntityType(typeName: string, okIfNotFound: boolean = false) {\r\n    const st = this.getStructuralType(typeName, okIfNotFound);\r\n    if (st instanceof EntityType) {\r\n      return st as EntityType;\r\n    } else if (okIfNotFound) {\r\n      return null;\r\n    } else {\r\n      let msg = core.formatString(\"Unable to locate an 'EntityType' by the name: '%1'. Be sure to execute a query or call fetchMetadata first.\", typeName);\r\n      throw new Error(msg);\r\n    }\r\n  }\r\n\r\n  /**\r\n  Returns an [[EntityType]] or null given its name.\r\n  >      // assume em1 is a preexisting EntityManager\r\n  >      let locType = em1.metadataStore.getAsComplexType(\"Location\");\r\n\r\n  or to throw an error if the type is not found\r\n  >      let badType = em1.metadataStore.getAsComplexType(\"Foo\", false);\r\n  >      // badType will not get set and an exception will be thrown.\r\n  @param structuralTypeName - Either the fully qualified name or a short name may be used. If a short name is specified and multiple types share\r\n  that same short name an exception will be thrown.\r\n  @param okIfNotFound - (default=false) Whether to throw an error if the specified EntityType is not found.\r\n  @return The EntityType. ComplexType or 'null' if not not found.\r\n  **/\r\n getAsComplexType(typeName: string, okIfNotFound: boolean = false) {\r\n  const st = this.getStructuralType(typeName, okIfNotFound);\r\n  if (st instanceof ComplexType) {\r\n    return st as ComplexType;\r\n  } else if (okIfNotFound) {\r\n    return null;\r\n  } else {\r\n    let msg = core.formatString(\"Unable to locate an 'ComplexType' by the name: '%1'. Be sure to execute a query or call fetchMetadata first.\", typeName);\r\n    throw new Error(msg);\r\n  }\r\n}\r\n\r\n\r\n  /**\r\n  Returns an [[EntityType]] or a [[ComplexType]] given its name.\r\n  @deprecated Replaced by getStructuralType but ... it is probably more usefull to call either getAsEntityType or getAsComplexType instead\r\n  @param typeName - Either the fully qualified name or a short name may be used. If a short name is specified and multiple types share\r\n  that same short name an exception will be thrown.\r\n  @param okIfNotFound - (default=false) Whether to throw an error if the specified EntityType is not found.\r\n  @return The EntityType. ComplexType or 'null' if not not found.\r\n  **/\r\n  getEntityType(typeName: string, okIfNotFound: boolean = false) {\r\n    return this.getStructuralType(typeName, okIfNotFound);\r\n  }\r\n\r\n  /**\r\n  Returns an [[EntityType]] or a [[ComplexType]] given its name.\r\n  >      // assume em1 is a preexisting EntityManager\r\n  >      let odType = em1.metadataStore.getStructuralType(\"OrderDetail\");\r\n\r\n  or to throw an error if the type is not found\r\n  >      let badType = em1.metadataStore.getStructuralType(\"Foo\", false);\r\n  >      // badType will not get set and an exception will be thrown.\r\n  @deprecated Preferably use either getAsEntityType or getAsComplexType.  Get\r\n  @param typeName - Either the fully qualified name or a short name may be used. If a short name is specified and multiple types share\r\n  that same short name an exception will be thrown.\r\n  @param okIfNotFound - (default=false) Whether to throw an error if the specified EntityType is not found.\r\n  @return The EntityType. ComplexType or 'null' if not not found.\r\n  **/\r\n  getStructuralType(typeName: string, okIfNotFound: boolean = false) {\r\n    assertParam(typeName, \"typeName\").isString().check();\r\n    assertParam(okIfNotFound, \"okIfNotFound\").isBoolean().isOptional().check(false);\r\n    return this._getStructuralType(typeName, okIfNotFound);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _getStructuralType(typeName: string, okIfNotFound: boolean = false) {\r\n    let qualTypeName = getQualifiedTypeName(this, typeName, false);\r\n    let type = this._structuralTypeMap[qualTypeName];\r\n    if (!type) {\r\n      if (okIfNotFound) return null;\r\n      let msg = core.formatString(\"Unable to locate a 'Type' by the name: '%1'. Be sure to execute a query or call fetchMetadata first.\", typeName);\r\n      throw new Error(msg);\r\n    }\r\n    return type;\r\n  }\r\n\r\n  /**\r\n  Returns an array containing all of the [[EntityType]]s or [[ComplexType]]s in this MetadataStore.\r\n  >      // assume em1 is a preexisting EntityManager\r\n  >      let allTypes = em1.metadataStore.getEntityTypes();\r\n  **/\r\n  getEntityTypes() {\r\n    return getTypesFromMap(this._structuralTypeMap);\r\n  }\r\n\r\n  getIncompleteNavigationProperties() {\r\n    return core.objectMap(this._incompleteTypeMap, function (key, value) {\r\n      return value;\r\n    });\r\n  }\r\n\r\n  /**\r\n  Returns a fully qualified entityTypeName for a specified resource name.  The reverse of this operation\r\n  can be obtained via the  [[EntityType.defaultResourceName]] property\r\n  **/\r\n  getEntityTypeNameForResourceName(resourceName: string) {\r\n    assertParam(resourceName, \"resourceName\").isString().check();\r\n    return this._resourceEntityTypeMap[resourceName];\r\n  }\r\n\r\n  /**\r\n  Associates a resourceName with an entityType.\r\n\r\n  This method is only needed in those cases where multiple resources return the same\r\n  entityType.  In this case Metadata discovery will only determine a single resource name for\r\n  each entityType.\r\n  @param resourceName - The resource name\r\n  @param entityTypeOrName - If passing a string either the fully qualified name or a short name may be used. If a short name is specified and multiple types share\r\n  that same short name an exception will be thrown. If the entityType has not yet been discovered then a fully qualified name must be used.\r\n  **/\r\n  setEntityTypeForResourceName(resourceName: string, entityTypeOrName: EntityType | string) {\r\n    assertParam(resourceName, \"resourceName\").isString().check();\r\n    assertParam(entityTypeOrName, \"entityTypeOrName\").isInstanceOf(EntityType).or().isString().check();\r\n\r\n    let entityTypeName: string;\r\n    if (entityTypeOrName instanceof EntityType) {\r\n      entityTypeName = entityTypeOrName.name;\r\n    } else {\r\n      entityTypeName = getQualifiedTypeName(this, entityTypeOrName, true);\r\n    }\r\n\r\n    this._resourceEntityTypeMap[resourceName] = entityTypeName;\r\n    let entityType = this._getStructuralType(entityTypeName, true);\r\n    if (entityType && entityType instanceof EntityType && !entityType.defaultResourceName) {\r\n      entityType.defaultResourceName = resourceName;\r\n    }\r\n  }\r\n\r\n  /** __Dev Only__ - for use when creating a new MetadataParserAdapter  */\r\n  static parseTypeName(entityTypeName: string) {\r\n    // TODO: removed \r\n    // if (!entityTypeName) {\r\n    //   return null;\r\n    // }\r\n\r\n    let typeParts = entityTypeName.split(\":#\");\r\n    if (typeParts.length > 1) {\r\n      return MetadataStore.makeTypeHash(typeParts[0], typeParts[1]);\r\n    }\r\n\r\n    if (core.stringStartsWith(entityTypeName, MetadataStore.ANONTYPE_PREFIX)) {\r\n      let typeHash = MetadataStore.makeTypeHash(entityTypeName);\r\n      (typeHash as any).isAnonymous = true;\r\n      return typeHash;\r\n    }\r\n    let entityTypeNameNoAssembly = entityTypeName.split(\",\")[0];\r\n    typeParts = entityTypeNameNoAssembly.split(\".\");\r\n    if (typeParts.length > 1) {\r\n      let shortName = typeParts[typeParts.length - 1];\r\n      let namespaceParts = typeParts.slice(0, typeParts.length - 1);\r\n      let ns = namespaceParts.join(\".\");\r\n      return MetadataStore.makeTypeHash(shortName, ns);\r\n    } else {\r\n      return MetadataStore.makeTypeHash(entityTypeName);\r\n    }\r\n  }\r\n\r\n  /** __Dev Only__ - for use when creating a new MetadataParserAdapter  */\r\n  static makeTypeHash(shortName: string, ns?: string) {\r\n    return {\r\n      shortTypeName: shortName,\r\n      namespace: ns,\r\n      typeName: qualifyTypeName(shortName, ns)\r\n    };\r\n  }\r\n\r\n  // protected methods\r\n  /** @hidden @internal */\r\n  _checkEntityType(entity: Entity) {\r\n    if (entity.entityType) return;\r\n    let typeName = entity.prototype._$typeName;\r\n    if (!typeName) {\r\n      throw new Error(\"This entity has not been registered. See the MetadataStore.registerEntityTypeCtor method\");\r\n    }\r\n    // we know that it is an EntityType ( as opposed to a ComplexType)\r\n    let entityType = this._getStructuralType(typeName) as EntityType;\r\n    if (entityType) {\r\n      entity.entityType = entityType;\r\n    }\r\n  }\r\n\r\n\r\n}\r\nMetadataStore.prototype._$typeName = \"MetadataStore\";\r\n\r\nBreezeEvent.bubbleEvent(MetadataStore.prototype);\r\n\r\nfunction getTypesFromMap(typeMap: IStructuralTypeMap) {\r\n  let types: (StructuralType)[] = [];\r\n  for (let key in typeMap) {\r\n    let value = typeMap[key];\r\n    // skip 'shortName' entries\r\n    if (key === value.name) {\r\n      types.push(typeMap[key]);\r\n    }\r\n  }\r\n  return types;\r\n}\r\n\r\nfunction structuralTypeFromJson(metadataStore: MetadataStore, json: any, allowMerge: boolean) {\r\n  let typeName = qualifyTypeName(json.shortName, json.namespace);\r\n  let stype = metadataStore._getStructuralType(typeName, true);\r\n  if (stype) {\r\n    if (allowMerge) {\r\n      return mergeStructuralType(stype, json);\r\n    } else {\r\n      // allow it but don't replace anything.\r\n      return stype;\r\n    }\r\n  }\r\n  let config = {\r\n    shortName: json.shortName,\r\n    namespace: json.namespace,\r\n    isAbstract: json.isAbstract,\r\n    autoGeneratedKeyType: AutoGeneratedKeyType.fromName(json.autoGeneratedKeyType),\r\n    defaultResourceName: json.defaultResourceName,\r\n    custom: json.custom\r\n  };\r\n\r\n  stype = json.isComplexType ? new ComplexType(config) : new EntityType(config);\r\n\r\n  // baseType may not have been imported yet so we need to defer handling this type until later.\r\n  if (json.baseTypeName && stype instanceof EntityType) {\r\n    stype.baseTypeName = json.baseTypeName;\r\n    let baseEntityType = metadataStore._getStructuralType(json.baseTypeName, true);\r\n    if (baseEntityType) {\r\n      completeStructuralTypeFromJson(metadataStore, json, stype);\r\n    } else {\r\n      core.getArray(metadataStore._deferredTypes, json.baseTypeName).push({ json: json, stype: stype });\r\n\r\n    }\r\n  } else {\r\n    completeStructuralTypeFromJson(metadataStore, json, stype);\r\n  }\r\n\r\n  // stype may or may not have been added to the metadataStore at this point.\r\n  return stype;\r\n}\r\n\r\nfunction mergeStructuralType(stype: StructuralType, json: any) {\r\n  if (json.custom) {\r\n    stype.custom = json.custom;\r\n  }\r\n\r\n  mergeProps(stype, json.dataProperties);\r\n  mergeProps(stype, json.navigationProperties);\r\n  return stype;\r\n}\r\n\r\nfunction mergeProps(stype: StructuralType, jsonProps: any[]) {\r\n  if (!jsonProps) return;\r\n  jsonProps.forEach((jsonProp) => {\r\n    let propName = jsonProp.name;\r\n    if (!propName) {\r\n      if (jsonProp.nameOnServer) {\r\n        propName = stype.metadataStore.namingConvention.serverPropertyNameToClient(jsonProp.nameOnServer, {});\r\n      } else {\r\n        // backslash-quote works around compiler bug\r\n        const msg = \"Unable to complete \\'importMetadata\\' - cannot locate a \\'name\\' or \\'nameOnServer\\' for one of the imported property nodes\";\r\n        throw new Error(msg);\r\n      }\r\n    }\r\n    if (jsonProp.custom) {\r\n      let prop = stype.getProperty(propName, true);\r\n      prop!.custom = jsonProp.custom;\r\n    }\r\n  });\r\n}\r\n\r\nfunction completeStructuralTypeFromJson(metadataStore: MetadataStore, json: any, stype: any) {\r\n\r\n  // validators from baseType work because validation walks thru base types\r\n  // so no need to copy down.\r\n  if (json.validators) {\r\n    stype.validators = json.validators.map(Validator.fromJSON);\r\n  }\r\n\r\n  json.dataProperties.forEach(function (dp: Object) {\r\n    stype._addPropertyCore(DataProperty.fromJSON(dp));\r\n  });\r\n\r\n\r\n  let isEntityType = !json.isComplexType;\r\n  if (isEntityType) {\r\n    //noinspection JSHint\r\n    json.navigationProperties && json.navigationProperties.forEach(function (np: Object) {\r\n      stype._addPropertyCore(NavigationProperty.fromJSON(np));\r\n    });\r\n  }\r\n\r\n  metadataStore.addEntityType(stype);\r\n\r\n  let deferredTypes = metadataStore._deferredTypes;\r\n  let deferrals = deferredTypes[stype.name];\r\n  if (deferrals) {\r\n    deferrals.forEach(function (d: any) {\r\n      completeStructuralTypeFromJson(metadataStore, d.json, d.stype);\r\n    });\r\n    delete deferredTypes[stype.name];\r\n  }\r\n}\r\n\r\nfunction getQualifiedTypeName(metadataStore: MetadataStore, structTypeName: string, throwIfNotFound?: boolean) {\r\n  if (isQualifiedTypeName(structTypeName)) return structTypeName;\r\n  let result = metadataStore._shortNameMap[structTypeName];\r\n  if (!result && throwIfNotFound) {\r\n    throw new Error(\"Unable to locate 'entityTypeName' of: \" + structTypeName);\r\n  }\r\n  return result;\r\n}\r\n\r\n/** Configuration info to be passed to the [[EntityType]] constructor */\r\nexport interface EntityTypeConfig {\r\n  shortName?: string;\r\n  namespace?: string;\r\n  baseTypeName?: string;\r\n  isAbstract?: boolean;\r\n  autoGeneratedKeyType?: AutoGeneratedKeyType;\r\n  defaultResourceName?: string;\r\n  dataProperties?: DataProperty[] | Object[] | Object;  // TODO: see if we can't qualify Object[] a little better.\r\n  navigationProperties?: NavigationProperty[] | Object[] | Object;\r\n  serializerFn?: (prop: EntityProperty, val: any) => any;\r\n  custom?: any;\r\n}\r\n\r\n/** Configuration info to be passed to the [[EntityType.setProperties]] method */\r\nexport interface EntityTypeSetConfig {\r\n  autoGeneratedKeyType?: AutoGeneratedKeyType;\r\n  defaultResourceName?: string;\r\n  serializerFn?: (prop: EntityProperty, val: any) => any;\r\n  custom?: any;\r\n}\r\n\r\n/** Container for all of the metadata about a specific type of Entity.\r\n**/\r\nexport class EntityType {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on proto\r\n  /** @hidden @internal */\r\n  static __nextAnonIx = 0;\r\n  /** Always false for an EntityType. **/\r\n  isComplexType = false;\r\n  /** The [[MetadataStore]] that contains this EntityType. __Read Only__ **/\r\n  metadataStore: MetadataStore;\r\n  /** The DataProperties (see [[DataProperty]] associated with this EntityType. __Read Only__  **/\r\n  dataProperties: DataProperty[];\r\n  /**  The NavigationProperties (see [[NavigationProperty]] associated with this EntityType. __Read Only__  **/\r\n  navigationProperties: NavigationProperty[];\r\n  /**\r\n  The DataProperties associated with this EntityType that make up it's [[EntityKey]]. __Read Only__ **/\r\n  keyProperties: DataProperty[];\r\n  /** The DataProperties associated with this EntityType that are foreign key properties. __Read Only__ **/\r\n  foreignKeyProperties: DataProperty[];\r\n  inverseForeignKeyProperties: DataProperty[];\r\n  /**  The DataProperties associated with this EntityType that are concurrency properties. __Read Only__ **/\r\n  concurrencyProperties: DataProperty[];\r\n  /** The DataProperties for this EntityType that contain instances of a [[ComplexType]]. __Read Only__   **/\r\n  complexProperties: DataProperty[];\r\n  /** The DataProperties associated with this EntityType that are not mapped to any backend datastore. These are effectively free standing\r\n  properties. __Read Only__ **/\r\n  unmappedProperties: DataProperty[];\r\n\r\n  /** The fully qualified name of this EntityType. __Read Only__  **/\r\n  name: string;\r\n  /** The short, unqualified, name for this EntityType. __Read Only__  **/\r\n  shortName: string;\r\n  /** The namespace for this EntityType. __Read Only__  **/\r\n  namespace: string;\r\n  /** The name of this EntityType's base EntityType  (if any) */\r\n  baseTypeName?: string;\r\n  /** The base EntityType (if any) for this EntityType. __Read Only__   **/\r\n  baseEntityType: EntityType;\r\n  subtypes: EntityType[];\r\n\r\n  /**  Whether this EntityType is abstract. __Read Only__ **/\r\n  isAbstract: boolean;\r\n  /**  Whether this EntityType is anonymous. Anonymous types will never be communicated to or from the server. They are purely for\r\n  client side use and are given an automatically generated name.  __Read Only__ **/\r\n  isAnonymous: boolean;\r\n  /** Whether this EntityType has been 'frozen'.  EntityTypes become frozen after the first instance \r\n  of that type has been created and attached to an EntityManager. */\r\n  isFrozen: boolean;\r\n\r\n  /** The [[AutoGeneratedKeyType]] for this EntityType. __Read Only__ **/\r\n  autoGeneratedKeyType: AutoGeneratedKeyType;\r\n  /**   The default resource name associated with this EntityType.  An EntityType may be queried via a variety of 'resource names' but this one\r\n  is used as the default when no resource name is provided.  This will occur when calling [[EntityAspect.loadNavigationProperty]]\r\n  or when executing any [[EntityQuery]] that was created via an [[EntityKey]]. __Read Only__ **/\r\n  defaultResourceName: string;\r\n  /** A function that is used to customize the serialization of any EntityProperties of this type. */\r\n  serializerFn?: (prop: EntityProperty, val: any) => any;\r\n  /**  A free form object that can be used to define any custom metadata for this EntityType. __Read Only__  **/\r\n  custom?: any;\r\n  /** The entity level validators associated with this EntityType. Validators can be added and\r\n  removed from this collection. __Read Only__.   **/\r\n  validators: Validator[];\r\n\r\n  warnings: any[];\r\n  initFn: Function | string;\r\n  noTrackingFn: Function;\r\n\r\n  /** @hidden @internal */\r\n  _extra: any;\r\n  /** @hidden @internal */\r\n  _ctor: { new (): StructuralObject };\r\n  /** @hidden @internal */\r\n  _mappedPropertiesCount: number;\r\n\r\n  /** \r\n  @deprecated Use [[getCtor]] instead.   \r\n  */\r\n  getEntityCtor = this.getCtor;\r\n\r\n  /** @hidden @internal */\r\n  static qualifyTypeName = qualifyTypeName;\r\n\r\n\r\n  /** EntityType constructor  \r\n  >      let entityType = new EntityType( {\r\n  >          shortName: \"person\",\r\n  >          namespace: \"myAppNamespace\"\r\n  >      });\r\n  @param config - Configuration settings or a MetadataStore.  If this parameter is just a MetadataStore\r\n  then what will be created is an 'anonymous' type that will never be communicated to or from the server. It is purely for\r\n  client side use and will be given an automatically generated name. Normally, however, you will use a configuration object.\r\n  **/\r\n  constructor(config: MetadataStore | EntityTypeConfig) {\r\n    if (arguments.length > 1) {\r\n      throw new Error(\"The EntityType ctor has a single argument that is either a 'MetadataStore' or a configuration object.\");\r\n    }\r\n    // let etConfig =  <EntityTypeConfig> <any> undefined;\r\n    let etConfig: EntityTypeConfig | undefined = undefined;\r\n\r\n    if ((config as any)._$typeName === \"MetadataStore\") {\r\n      this.metadataStore = config as MetadataStore;\r\n      this.shortName = \"Anon_\" + (++EntityType.__nextAnonIx);\r\n      this.namespace = \"\";\r\n      this.isAnonymous = true;\r\n      // etConfig = undefined;\r\n    } else {\r\n      etConfig = config as EntityTypeConfig;\r\n      assertConfig(config)\r\n        .whereParam(\"shortName\").isNonEmptyString()\r\n        .whereParam(\"namespace\").isString().isOptional().withDefault(\"\")\r\n        .whereParam(\"baseTypeName\").isString().isOptional()\r\n        .whereParam(\"isAbstract\").isBoolean().isOptional().withDefault(false)\r\n        .whereParam(\"autoGeneratedKeyType\").isEnumOf(AutoGeneratedKeyType).isOptional().withDefault(AutoGeneratedKeyType.None)\r\n        .whereParam(\"defaultResourceName\").isNonEmptyString().isOptional().withDefault(null)\r\n        .whereParam(\"dataProperties\").isOptional()\r\n        .whereParam(\"navigationProperties\").isOptional()\r\n        .whereParam(\"serializerFn\").isOptional().isFunction()\r\n        .whereParam(\"custom\").isOptional()\r\n        .applyAll(this);\r\n    }\r\n\r\n    this.name = qualifyTypeName(this.shortName, this.namespace);\r\n\r\n    // the defaultResourceName may also be set up either via metadata lookup or first query or via the 'setProperties' method\r\n    this.dataProperties = [];\r\n    this.navigationProperties = [];\r\n    this.complexProperties = [];\r\n    this.keyProperties = [];\r\n    this.foreignKeyProperties = [];\r\n    this.inverseForeignKeyProperties = [];\r\n    this.concurrencyProperties = [];\r\n    this.unmappedProperties = []; // will be updated later.\r\n    this.validators = [];\r\n    this.warnings = [];\r\n    this._mappedPropertiesCount = 0;\r\n    this.subtypes = [];\r\n    // now process any data/nav props\r\n    if (etConfig && etConfig.dataProperties) {\r\n      addProperties(this, etConfig.dataProperties, DataProperty);\r\n    }\r\n    if (etConfig && etConfig.navigationProperties) {\r\n      addProperties(this, etConfig.navigationProperties, NavigationProperty);\r\n    }\r\n  }\r\n\r\n  /**\r\n  General purpose property set method\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      custType.setProperties( {\r\n  >          autoGeneratedKeyType: AutoGeneratedKeyType.Identity;\r\n  >          defaultResourceName: \"CustomersAndIncludedOrders\"\r\n  >      )};\r\n  @param config - a configuration object\r\n  **/\r\n  setProperties(config: EntityTypeSetConfig) {\r\n    assertConfig(config)\r\n      .whereParam(\"autoGeneratedKeyType\").isEnumOf(AutoGeneratedKeyType).isOptional()\r\n      .whereParam(\"defaultResourceName\").isString().isOptional()\r\n      .whereParam(\"serializerFn\").isFunction().isOptional()\r\n      .whereParam(\"custom\").isOptional()\r\n      .applyAll(this);\r\n    if (config.defaultResourceName) {\r\n      this.defaultResourceName = config.defaultResourceName;\r\n    }\r\n  }\r\n\r\n  /**\r\n  Returns whether this type is a subtype of a specified type.\r\n  **/\r\n  isSubtypeOf(entityType: EntityType) {\r\n    assertParam(entityType, \"entityType\").isInstanceOf(EntityType).check();\r\n    let baseType: EntityType = this;\r\n    do {\r\n      if (baseType === entityType) return true;\r\n      baseType = baseType.baseEntityType;\r\n    } while (baseType);\r\n    return false;\r\n  }\r\n\r\n  /**\r\n  Returns an array containing this type and any/all subtypes of this type down thru the hierarchy.\r\n  **/\r\n  getSelfAndSubtypes() {\r\n    let result = [this];\r\n    this.subtypes.forEach(function (st) {\r\n      let subtypes = st.getSelfAndSubtypes();\r\n      result.push.apply(result, subtypes);\r\n    });\r\n    return result;\r\n  }\r\n\r\n  getAllValidators() {\r\n    let result = this.validators.slice(0);\r\n    let bt = this.baseEntityType;\r\n    while (bt) {\r\n      result.push.apply(result, bt.validators);\r\n      bt = bt.baseEntityType;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n  Adds a  [[DataProperty]] or a [[NavigationProperty]] to this EntityType.\r\n  >      // assume myEntityType is a newly constructed EntityType.\r\n  >      myEntityType.addProperty(dataProperty1);\r\n  >      myEntityType.addProperty(dataProperty2);\r\n  >      myEntityType.addProperty(navigationProperty1);\r\n  **/\r\n  addProperty(property: EntityProperty) {\r\n    assertParam(property, \"property\").isInstanceOf(DataProperty).or().isInstanceOf(NavigationProperty).check();\r\n\r\n    // true is 2nd arg to force resolve of any navigation properties.\r\n    let newprop = this._addPropertyCore(property, true);\r\n\r\n    if (this.subtypes && this.subtypes.length) {\r\n      let stype = this;\r\n      stype.getSelfAndSubtypes().forEach(function (st) {\r\n        if (st !== stype) {\r\n          if (property.isNavigationProperty) {\r\n            st._addPropertyCore(new NavigationProperty(property), true);\r\n          } else {\r\n            st._addPropertyCore(new DataProperty(property as DataProperty), true);\r\n          }\r\n        }\r\n      });\r\n    }\r\n    return newprop;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _updateFromBase(baseEntityType: EntityType) {\r\n    this.baseEntityType = baseEntityType;\r\n    if (this.autoGeneratedKeyType === AutoGeneratedKeyType.None) {\r\n      this.autoGeneratedKeyType = baseEntityType.autoGeneratedKeyType;\r\n    }\r\n\r\n    baseEntityType.dataProperties.forEach((dp) => {\r\n      let newDp = new DataProperty(dp);\r\n      // don't need to copy validators becaue we will walk the hierarchy to find them\r\n      newDp.validators = [];\r\n      newDp.baseProperty = dp;\r\n      this._addPropertyCore(newDp);\r\n    }, this);\r\n    baseEntityType.navigationProperties.forEach((np) => {\r\n      let newNp = new NavigationProperty(np);\r\n      // don't need to copy validators becaue we will walk the hierarchy to find them\r\n      newNp.validators = [];\r\n      newNp.baseProperty = np;\r\n      this._addPropertyCore(newNp);\r\n    }, this);\r\n    baseEntityType.subtypes.push(this);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _addPropertyCore(property: EntityProperty, shouldResolve: boolean = false) {\r\n    if (this.isFrozen) {\r\n      throw new Error(\"The '\" + this.name + \"' EntityType/ComplexType has been frozen. You can only add properties to an EntityType/ComplexType before any instances of that type have been created and attached to an entityManager.\");\r\n    }\r\n    let parentType = property.parentType;\r\n    if (parentType) {\r\n      if (parentType !== this) {\r\n        throw new Error(\"This property: \" + property.name + \" has already been added to \" + property.parentType.name);\r\n      } else {\r\n        // adding the same property more than once to the same entityType is just ignored.\r\n        return;\r\n      }\r\n    }\r\n    property.parentType = this;\r\n    let ms = this.metadataStore;\r\n    // if (property.isDataProperty) { // modified because doesn't act as a type guard \r\n    if (property instanceof DataProperty) {\r\n      this._addDataProperty(property);\r\n    } else {\r\n      this._addNavigationProperty(property);\r\n      // metadataStore can be undefined if this entityType has not yet been added to a MetadataStore.\r\n      if (shouldResolve && ms) {\r\n        tryResolveNp(property, ms);\r\n      }\r\n    }\r\n    // unmapped properties can be added AFTER entityType has already resolved all property names.\r\n    if (ms && !(property.name && property.nameOnServer)) {\r\n      updateClientServerNames(ms.namingConvention, property, \"name\");\r\n    }\r\n    // props can be added after entity prototype has already been wrapped.\r\n    if (ms && this._extra) {\r\n      if (this._extra.alreadyWrappedProps) {\r\n        let proto = this._ctor.prototype;\r\n        config.interfaceRegistry.modelLibrary.getDefaultInstance().initializeEntityPrototype(proto);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n  Create a new entity of this type.\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      let custType = em1.metadataStore.getAsEntityType(\"Customer\");\r\n  >      let cust1 = custType.createEntity();\r\n  >      em1.addEntity(cust1);\r\n  @param initialValues- Configuration object of the properties to set immediately after creation.\r\n  @return The new entity.\r\n  **/\r\n  createEntity(initialValues?: any): any {\r\n    // ignore the _$eref once the entity is attached to an entityManager.\r\n    if (initialValues && initialValues._$eref && !initialValues._$eref.entityAspect.entityManager) return initialValues._$eref;\r\n\r\n    let instance = this._createInstanceCore();\r\n\r\n    if (initialValues) {\r\n      // only assign an _eref if the object is fully \"keyed\"\r\n      if (this.keyProperties.every(function (kp) {\r\n        return initialValues[kp.name] != null;\r\n      })) {\r\n        initialValues._$eref = instance;\r\n      }\r\n\r\n      this._updateTargetFromRaw(instance, initialValues, getRawValueFromConfig);\r\n\r\n      this.navigationProperties.forEach(function (np) {\r\n        let relatedEntity: any;\r\n        let val = initialValues[np.name];\r\n        if (val != undefined) {\r\n          let navEntityType = np.entityType;\r\n          if (np.isScalar) {\r\n            relatedEntity = val.entityAspect ? val : navEntityType.createEntity(val);\r\n            instance.setProperty(np.name, relatedEntity);\r\n          } else {\r\n            let relatedEntities = instance.getProperty(np.name);\r\n            val.forEach((v: any) => {\r\n              relatedEntity = v.entityAspect ? v : navEntityType.createEntity(v);\r\n              relatedEntities.push(relatedEntity);\r\n            });\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    this._initializeInstance(instance);\r\n    return instance;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _createInstanceCore() {\r\n    let aCtor = this.getCtor();\r\n    let instance = new aCtor();\r\n    new EntityAspect(instance as Entity);\r\n    return instance;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _initializeInstance(instance: any) {\r\n    if (this.baseEntityType) {\r\n      this.baseEntityType._initializeInstance(instance);\r\n    }\r\n    let initFn = this.initFn;\r\n    if (initFn) {\r\n      let fn = (typeof initFn === \"string\") ? instance[initFn] : initFn;\r\n      fn(instance);\r\n    }\r\n    this.complexProperties && this.complexProperties.forEach(function (cp) {\r\n      let complexType = cp.dataType as ComplexType;\r\n      let ctInstance = instance.getProperty(cp.name);\r\n      if (Array.isArray(ctInstance)) {\r\n        ctInstance.forEach((ctInst) => {\r\n          complexType._initializeInstance(ctInst);\r\n        });\r\n      } else {\r\n        complexType._initializeInstance(ctInstance);\r\n      }\r\n    });\r\n    // not needed for complexObjects\r\n    if (instance.entityAspect) {\r\n      instance.entityAspect._initialized = true;\r\n    }\r\n  }\r\n\r\n  /**\r\n  Returns the constructor for this EntityType.\r\n  @param forceRefresh - Whether to ignore any cached version of this constructor. (default == false)\r\n  @return The constructor for this EntityType.\r\n  **/\r\n  getCtor(forceRefresh: boolean = false): { new (): StructuralObject } {\r\n    if (this._ctor && !forceRefresh) return this._ctor;\r\n\r\n    let ctorRegistry = this.metadataStore._ctorRegistry;\r\n    let r = ctorRegistry[this.name] || ctorRegistry[this.shortName] || {} as CtorRecord;\r\n    let aCtor = r.ctor || this._ctor;\r\n\r\n    let ctorType = aCtor && aCtor.prototype && (aCtor.prototype.entityType || aCtor.prototype.complexType);\r\n    if (ctorType && ctorType.metadataStore !== this.metadataStore) {\r\n      // We can't risk a mismatch between the ctor and the type info in a specific metadatastore\r\n      // because modelLibraries rely on type info to intercept ctor properties\r\n      throw new Error(\"Cannot register the same constructor for \" + this.name + \" in different metadata stores.  Please define a separate constructor for each metadata store.\");\r\n    }\r\n\r\n\r\n    if (r.ctor && forceRefresh) {\r\n      this._extra = undefined;\r\n    }\r\n\r\n    if (!aCtor) {\r\n      let createCtor = config.interfaceRegistry.modelLibrary.getDefaultInstance().createCtor;\r\n      aCtor = createCtor ? createCtor(this) : createEmptyCtor(this);\r\n    }\r\n\r\n    this.initFn = r.initFn;\r\n    this.noTrackingFn = r.noTrackingFn;\r\n\r\n    aCtor.prototype._$typeName = this.name;\r\n    this._setCtor(aCtor);\r\n    return aCtor;\r\n  }\r\n\r\n\r\n  /** @hidden @internal */\r\n  // May make public later.\r\n  _setCtor(aCtor: { new (): StructuralObject }, interceptor?: any) {\r\n\r\n    let instanceProto = aCtor.prototype;\r\n\r\n    // place for extra breeze related data\r\n    this._extra = this._extra || {};\r\n\r\n    let instance = new aCtor();\r\n    calcUnmappedProperties(this, instance);\r\n\r\n    if (this._$typeName === \"EntityType\") {\r\n      // insure that all of the properties are on the 'template' instance before watching the class.\r\n      instanceProto.entityType = this;\r\n    } else {\r\n      instanceProto.complexType = this;\r\n    }\r\n\r\n    // defaultPropertyInterceptor is a 'global' (but internal to breeze) function;\r\n    (instanceProto as any)._$interceptor = interceptor || defaultPropertyInterceptor;\r\n    config.interfaceRegistry.modelLibrary.getDefaultInstance().initializeEntityPrototype(instanceProto);\r\n    this._ctor = aCtor;\r\n  }\r\n\r\n  /**\r\n  Adds either an entity or property level validator to this EntityType.\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let countryProp = custType.getProperty(\"Country\");\r\n  >      let valFn = function (v) {\r\n  >              if (v == null) return true;\r\n  >              return (core.stringStartsWith(v, \"US\"));\r\n  >          };\r\n  >      let countryValidator = new Validator(\"countryIsUS\", valFn,\r\n  >      { displayName: \"Country\", messageTemplate: \"'%displayName%' must start with 'US'\" });\r\n  >      custType.addValidator(countryValidator, countryProp);\r\n\r\n  This is the same as adding an entity level validator via the 'validators' property of DataProperty or NavigationProperty\r\n  >      countryProp.validators.push(countryValidator);\r\n\r\n  Entity level validators can also be added by omitting the 'property' parameter.\r\n  >      custType.addValidator(someEntityLevelValidator);\r\n\r\n  or\r\n  >      custType.validators.push(someEntityLevelValidator);\r\n  @param validator - Validator to add.\r\n  @param property - Property to add this validator to.  If omitted, the validator is assumed to be an\r\n  entity level validator and is added to the EntityType's 'validators'.\r\n  **/\r\n  addValidator(validator: Validator, property?: EntityProperty | string) {\r\n    assertParam(validator, \"validator\").isInstanceOf(Validator).check();\r\n    assertParam(property, \"property\").isOptional().isString().or().isEntityProperty().check();\r\n    if (property != null) {\r\n      let prop = (typeof property === 'string') ? this.getProperty(property, true) : property;\r\n      prop!.validators.push(validator);\r\n    } else {\r\n      this.validators.push(validator);\r\n    }\r\n  }\r\n\r\n  /**\r\n  Returns all of the properties ( dataProperties and navigationProperties) for this EntityType.\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let arrayOfProps = custType.getProperties();\r\n  @return An array of Data and Navigation properties.\r\n  **/\r\n  getProperties(): EntityProperty[] {\r\n    return (this.dataProperties as EntityProperty[]).concat(this.navigationProperties);\r\n  }\r\n\r\n  /**\r\n  Returns all of the property names ( for both dataProperties and navigationProperties) for this EntityType.\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let arrayOfPropNames = custType.getPropertyNames();\r\n  **/\r\n  getPropertyNames() {\r\n    return this.getProperties().map(core.pluck('name'));\r\n  }\r\n\r\n  /**\r\n  Returns a data property with the specified name or null.\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let customerNameDataProp = custType.getDataProperty(\"CustomerName\");\r\n  @return A DataProperty or null if not found.\r\n  **/\r\n  getDataProperty(propertyName: string) {\r\n    return core.arrayFirst(this.dataProperties, core.propEq('name', propertyName));\r\n  }\r\n\r\n  /**\r\n  Returns a navigation property with the specified name or null.\r\n  >      // assume em1 is an EntityManager containing a number of existing entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let customerOrdersNavProp = custType.getDataProperty(\"Orders\");\r\n  @return A NavigationProperty or null if not found.\r\n  **/\r\n  getNavigationProperty(propertyName: string) {\r\n    return core.arrayFirst(this.navigationProperties, core.propEq('name', propertyName));\r\n  }\r\n\r\n  /**\r\n  Returns either a DataProperty or a NavigationProperty with the specified name or null.\r\n  \r\n  This method also accepts a '.' delimited property path and will return the 'property' at the\r\n  end of the path.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let companyNameProp = custType.getProperty(\"CompanyName\");\r\n\r\n  This method can also walk a property path to return a property\r\n  >      let orderDetailType = em1.metadataStore.getEntityType(\"OrderDetail\");\r\n  >      let companyNameProp2 = orderDetailType.getProperty(\"Order.Customer.CompanyName\");\r\n  >      // companyNameProp === companyNameProp2\r\n  @param [throwIfNotFound=false] {Boolean} Whether to throw an exception if not found.\r\n  @return A DataProperty or NavigationProperty or null if not found.\r\n  **/\r\n  getProperty(propertyPath: string, throwIfNotFound: boolean = false) {\r\n    let props = this.getPropertiesOnPath(propertyPath, false, throwIfNotFound);\r\n    return (props && props.length > 0) ? props[props.length - 1] : null;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  // TODO: have this return empty array instead of null and fix consumers.\r\n  // TODO: think about renaming with '_' prefix.\r\n  getPropertiesOnPath(propertyPath: string, useServerName: boolean | null, throwIfNotFound: boolean = false) {\r\n    let propertyNames: string[] = (Array.isArray(propertyPath)) ? propertyPath : propertyPath.trim().split('.');\r\n\r\n    let ok = true;\r\n    let key = useServerName === true ? \"nameOnServer\" : useServerName === false ? \"name\" : null;\r\n    let parentType = this as StructuralType;\r\n    \r\n    const getProps = (propName: string) => { \r\n      const fn = key === null ? core.propsEq(\"name\", \"nameOnServer\", propName) : core.propEq(key, propName);\r\n      let prop = core.arrayFirst(parentType.getProperties(), fn);\r\n      if (prop) {\r\n        parentType = (prop instanceof NavigationProperty) ? prop.entityType : prop.dataType as ComplexType;\r\n        // parentType = prop.isNavigationProperty ? prop.entityType : prop.dataType;\r\n      } else if (throwIfNotFound) {\r\n        throw new Error(\"unable to locate property: \" + propName + \" on entityType: \" + parentType.name);\r\n      } else {\r\n        ok = false;\r\n      }\r\n      return prop;\r\n    };\r\n\r\n    let props = propertyNames.map(getProps) as EntityProperty[];\r\n    return ok ? props : null;\r\n  }\r\n\r\n  /** For use in pluggable adapters. */\r\n  // TODO: document use\r\n  clientPropertyPathToServer(propertyPath: string, delimiter: string = '.') {\r\n    let propNames: string[];\r\n    if (this.isAnonymous) {\r\n      let fn = this.metadataStore.namingConvention.clientPropertyNameToServer;\r\n      propNames = propertyPath.split(\".\").map(function (propName) {\r\n        return fn(propName);\r\n      });\r\n    } else {\r\n      let props = this.getPropertiesOnPath(propertyPath, false, true);\r\n      propNames = props!.map((prop: EntityProperty) => prop.nameOnServer);\r\n    }\r\n    return propNames.join(delimiter);\r\n  }\r\n\r\n  /** For use in pluggable adapters. */\r\n  // TODO: document use\r\n  getEntityKeyFromRawEntity(rawEntity: any, rawValueFn: Function) {\r\n    let keyValues = this.keyProperties.map((dp) => {\r\n      let val = rawValueFn(rawEntity, dp);\r\n      return DataType.parseRawValue(val, dp.dataType as DataType);\r\n    });\r\n    return new EntityKey(this, keyValues);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _updateTargetFromRaw(target: StructuralObject, raw: any, rawValueFn: Function) {\r\n    // called recursively for complex properties\r\n    this.dataProperties.forEach((dp) => {\r\n      if (!dp.isSettable) return;\r\n      let rawVal = rawValueFn(raw, dp);\r\n      if (rawVal === undefined) return;\r\n      let dataType = dp.dataType; // this will be a complexType when dp is a complexProperty\r\n      let oldVal: any;\r\n      if (dp.isComplexProperty) {\r\n        let complexType = dp.dataType as ComplexType;\r\n        if (rawVal === null) return; // rawVal may be null in nosql dbs where it was never defined for the given row.\r\n        oldVal = target.getProperty(dp.name);\r\n        if (dp.isScalar) {\r\n          complexType._updateTargetFromRaw(oldVal, rawVal, rawValueFn);\r\n        } else {\r\n          if (Array.isArray(rawVal)) {\r\n            let newVal = rawVal.map(function (rawCo) {\r\n              let newCo = complexType._createInstanceCore(target, dp);\r\n              complexType._updateTargetFromRaw(newCo, rawCo, rawValueFn);\r\n              complexType._initializeInstance(newCo);\r\n              return newCo;\r\n            });\r\n            if (!core.arrayEquals(oldVal, newVal, coEquals)) {\r\n              // clear the old array and push new objects into it.\r\n              oldVal.length = 0;\r\n              newVal.forEach(function (nv) {\r\n                oldVal.push(nv);\r\n              });\r\n            }\r\n          } else {\r\n            oldVal.length = 0;\r\n          }\r\n        }\r\n      } else {\r\n        if (dp.isScalar) {\r\n          let newVal = DataType.parseRawValue(rawVal, dataType as DataType);\r\n          target.setProperty(dp.name, newVal);\r\n        } else {\r\n          oldVal = target.getProperty(dp.name);\r\n          if (Array.isArray(rawVal)) {\r\n            // need to compare values\r\n            let newVal = rawVal.map((rv) => {\r\n              return DataType.parseRawValue(rv, dataType as DataType);\r\n            });\r\n            if (!core.arrayEquals(oldVal, newVal)) {\r\n              // clear the old array and push new objects into it.\r\n              oldVal.length = 0;\r\n              newVal.forEach(function (nv) {\r\n                oldVal.push(nv);\r\n              });\r\n            }\r\n          } else {\r\n            oldVal.length = 0;\r\n          }\r\n\r\n        }\r\n      }\r\n    });\r\n\r\n    // if merging from an import then raw will have an entityAspect or a complexAspect\r\n    let rawAspect = raw.entityAspect || raw.complexAspect;\r\n    if (rawAspect) {\r\n\r\n      let targetAspect = EntityAspect.isEntity(target) ? target.entityAspect : target.complexAspect;\r\n      if (rawAspect.originalValuesMap) {\r\n        targetAspect.originalValues = rawAspect.originalValuesMap;\r\n      }\r\n      if (rawAspect.extraMetadata) {\r\n        targetAspect.extraMetadata = rawAspect.extraMetadata;\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n\r\n  /**\r\n  Returns a string representation of this EntityType.\r\n  **/\r\n  toString() {\r\n    return this.name;\r\n  }\r\n\r\n  toJSON() {\r\n    return core.toJson(this, {\r\n      shortName: null,\r\n      namespace: null,\r\n      baseTypeName: null,\r\n      isAbstract: false,\r\n      autoGeneratedKeyType: null, // do not suppress default value\r\n      defaultResourceName: null,\r\n      dataProperties: localPropsOnly,\r\n      navigationProperties: localPropsOnly,\r\n      validators: null,\r\n      custom: null\r\n    });\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _updateNames(property: EntityProperty) {\r\n    let nc = this.metadataStore.namingConvention;\r\n    updateClientServerNames(nc, property, \"name\");\r\n\r\n    if (property.isNavigationProperty) {\r\n      updateClientServerNames(nc, property, \"foreignKeyNames\");\r\n      updateClientServerNames(nc, property, \"invForeignKeyNames\");\r\n\r\n      // these will get set later via _updateNps\r\n      // this.inverse\r\n      // this.entityType\r\n      // this.relatedDataProperties\r\n      //    dataProperty.relatedNavigationProperty\r\n      //    dataProperty.inverseNavigationProperty\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _checkNavProperty(navigationProperty: NavigationProperty | string) {\r\n    // if (navigationProperty.isNavigationProperty) {\r\n    if (navigationProperty instanceof NavigationProperty) {\r\n      if (navigationProperty.parentType !== this) {\r\n        throw new Error(core.formatString(\"The navigationProperty '%1' is not a property of entity type '%2'\",\r\n          navigationProperty.name, this.name));\r\n      }\r\n      return navigationProperty;\r\n    }\r\n\r\n    if (typeof (navigationProperty) === 'string') {\r\n      let np = this.getProperty(navigationProperty);\r\n      // if (np && np.isNavigationProperty) return np;\r\n      if (np && np instanceof NavigationProperty) return np;\r\n    }\r\n    throw new Error(\"The 'navigationProperty' parameter must either be a NavigationProperty or the name of a NavigationProperty\");\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _addDataProperty(dp: DataProperty) {\r\n\r\n    this.dataProperties.push(dp);\r\n\r\n    if (dp.isPartOfKey) {\r\n      this.keyProperties.push(dp);\r\n    }\r\n\r\n    if (dp.isComplexProperty) {\r\n      this.complexProperties.push(dp);\r\n    }\r\n\r\n    if (dp.concurrencyMode && dp.concurrencyMode !== \"None\") {\r\n      this.concurrencyProperties.push(dp);\r\n    }\r\n\r\n    if (dp.isUnmapped) {\r\n      this.unmappedProperties.push(dp);\r\n    }\r\n\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _addNavigationProperty(np: NavigationProperty) {\r\n\r\n    this.navigationProperties.push(np);\r\n\r\n    if (!isQualifiedTypeName(np.entityTypeName)) {\r\n      np.entityTypeName = qualifyTypeName(np.entityTypeName, this.namespace);\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _updateCps() {\r\n    let metadataStore = this.metadataStore;\r\n    let incompleteTypeMap = metadataStore._incompleteComplexTypeMap;\r\n    this.complexProperties.forEach(function (cp) {\r\n      if (cp.complexType) return;\r\n      if (!resolveCp(cp, metadataStore)) {\r\n        core.getArray(incompleteTypeMap, cp.complexTypeName).push(cp);\r\n      }\r\n    });\r\n\r\n    if (this.isComplexType) {\r\n      (incompleteTypeMap[this.name] || []).forEach(function (cp: DataProperty) {\r\n        resolveCp(cp, metadataStore);\r\n      });\r\n      delete incompleteTypeMap[this.name];\r\n    }\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _updateNps() {\r\n    let metadataStore = this.metadataStore;\r\n\r\n    // resolve all navProps for this entityType\r\n    this.navigationProperties.forEach(function (np) {\r\n      tryResolveNp(np, metadataStore);\r\n    });\r\n    let incompleteTypeMap = metadataStore._incompleteTypeMap;\r\n    // next resolve all navProp that point to this entityType.\r\n    (incompleteTypeMap[this.name] || []).forEach(function (np: NavigationProperty) {\r\n      tryResolveNp(np, metadataStore);\r\n    });\r\n    // every navProp that pointed to this type should now be resolved\r\n    delete incompleteTypeMap[this.name];\r\n  }\r\n}\r\n\r\nEntityType.prototype._$typeName = \"EntityType\";\r\n\r\nfunction getRawValueFromConfig(rawEntity: any, dp: DataProperty) {\r\n  // 'true' fork can happen if an initializer contains an actaul instance of an already created complex object.\r\n  return (rawEntity.entityAspect || rawEntity.complexAspect) ? rawEntity.getProperty(dp.name) : rawEntity[dp.name];\r\n}\r\n\r\nfunction updateClientServerNames(nc: NamingConvention, parent: any, clientPropName: string) {\r\n  let serverPropName = clientPropName + \"OnServer\";\r\n  let clientName = parent[clientPropName];\r\n  if (clientName && clientName.length) {\r\n    // if (parent.isUnmapped) return;\r\n    let serverNames = core.toArray(clientName).map(function (cName) {\r\n      let sName = nc.clientPropertyNameToServer(cName, parent);\r\n      let testName = nc.serverPropertyNameToClient(sName, parent);\r\n      if (cName !== testName) {\r\n        throw new Error(\"NamingConvention for this client property name does not roundtrip properly:\" + cName + \"-->\" + testName);\r\n      }\r\n      return sName;\r\n    });\r\n    parent[serverPropName] = Array.isArray(clientName) ? serverNames : serverNames[0];\r\n  } else {\r\n    let serverName = parent[serverPropName];\r\n    if ((!serverName) || serverName.length === 0) return;\r\n    let clientNames = core.toArray(serverName).map(function (sName) {\r\n      let cName = nc.serverPropertyNameToClient(sName, parent);\r\n      let testName = nc.clientPropertyNameToServer(cName, parent);\r\n      if (sName !== testName) {\r\n        throw new Error(\"NamingConvention for this server property name does not roundtrip properly:\" + sName + \"-->\" + testName);\r\n      }\r\n      return cName;\r\n    });\r\n    parent[clientPropName] = Array.isArray(serverName) ? clientNames : clientNames[0];\r\n  }\r\n}\r\n\r\nfunction createEmptyCtor(type: any) {\r\n  if (config.noEval) {\r\n    let Entity = function() {};\r\n    return Entity;\r\n  } else {\r\n    let name = type.name.replace(/\\W/g, '_');\r\n    return Function('return function ' + name + '(){}')();\r\n  }\r\n}\r\n\r\nfunction coEquals(co1: ComplexObject, co2: ComplexObject): boolean {\r\n  let complexType = co1.complexAspect!.parentProperty!.dataType as ComplexType;\r\n  let dataProps = complexType.dataProperties;\r\n  let areEqual = dataProps.every(function (dp) {\r\n    if (!dp.isSettable) return true;\r\n    let v1 = co1.getProperty(dp.name);\r\n    let v2 = co2.getProperty(dp.name);\r\n    if (dp.isComplexProperty && dp.isScalar) {\r\n      return coEquals(v1, v2);\r\n    }\r\n    else if (dp.isComplexProperty && !dp.isScalar) {\r\n      return core.arrayEquals(v1, v2, coEquals);\r\n    } else {\r\n      let dataType = <any>dp.dataType; // this will be a complexType when dp is a complexProperty\r\n      return (v1 === v2 || (dataType && dataType.normalize && v1 && v2 && dataType.normalize(v1) === dataType.normalize(v2)));\r\n    }\r\n  });\r\n  return areEqual;\r\n}\r\n\r\nfunction localPropsOnly(props: EntityProperty[]) {\r\n  return props.filter(function (prop) {\r\n    return prop.baseProperty == null;\r\n  });\r\n}\r\n\r\n\r\nfunction resolveCp(cp: DataProperty, metadataStore: MetadataStore) {\r\n  let complexType = metadataStore._getStructuralType(cp.complexTypeName, true);\r\n  if (!complexType) return false;\r\n  if (!(complexType instanceof ComplexType)) {\r\n    throw new Error(\"Unable to resolve ComplexType with the name: \" + cp.complexTypeName + \" for the property: \" + cp.name);\r\n  }\r\n  cp.dataType = complexType;\r\n  cp.defaultValue = null;\r\n  return true;\r\n}\r\n\r\nfunction tryResolveNp(np: NavigationProperty, metadataStore: MetadataStore) {\r\n  if (np.entityType) return true;\r\n\r\n  let entityType = metadataStore._getStructuralType(np.entityTypeName, true) as EntityType;\r\n  if (entityType) {\r\n    np.entityType = entityType;\r\n    np._resolveNp();\r\n    // don't bother removing - _updateNps will do it later.\r\n    // __arrayRemoveItem(incompleteNps, np, false);\r\n  } else {\r\n    let incompleteNps = core.getArray(metadataStore._incompleteTypeMap, np.entityTypeName);\r\n    core.arrayAddItemUnique(incompleteNps, np);\r\n  }\r\n  return !!entityType;\r\n}\r\n\r\nfunction calcUnmappedProperties(stype: StructuralType, instance: any) {\r\n  let metadataPropNames = stype.getPropertyNames();\r\n  let modelLib = config.interfaceRegistry.modelLibrary.getDefaultInstance();\r\n  let trackablePropNames = modelLib.getTrackablePropertyNames(instance);\r\n  trackablePropNames.forEach(function (pn: string) {\r\n    if (metadataPropNames.indexOf(pn) === -1) {\r\n      let val = instance[pn];\r\n      try {\r\n        if (typeof val === \"function\") val = val();\r\n      } catch (e) {\r\n      }\r\n      let dt = DataType.fromValue(val);\r\n      let newProp = new DataProperty({\r\n        name: pn,\r\n        dataType: dt,\r\n        isNullable: true,\r\n        isUnmapped: true\r\n      });\r\n      newProp.isSettable = core.isSettable(instance, pn);\r\n      if (stype instanceof EntityType && stype.subtypes != null && stype.subtypes.length) {\r\n        stype.getSelfAndSubtypes().forEach((st) => {\r\n          st._addPropertyCore(new DataProperty(newProp));\r\n        });\r\n      } else {\r\n        stype._addPropertyCore(newProp);\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nexport interface ComplexTypeConfig {\r\n  shortName?: string;\r\n  namespace?: string;\r\n  dataProperties?: DataProperty[] | Object[] | Object;\r\n  isComplexType?: boolean;  // needed because this ctor can get called from the addEntityType method which needs the isComplexType prop\r\n  custom?: any;\r\n}\r\n\r\n/**  Container for all of the metadata about a specific type of Complex object.\r\n>     let complexType = new ComplexType( {\r\n>         shortName: \"address\",\r\n>         namespace: \"myAppNamespace\"\r\n>     });\r\n@param config - Configuration settings\r\n**/\r\nexport class ComplexType {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on proto\r\n  /** For polymorphic purpose only - always true here */\r\n  isComplexType = true;\r\n\r\n  /** The [[MetadataStore]] containing this ComplexType. */\r\n  metadataStore: MetadataStore;\r\n\r\n  /**  The fully qualifed name of this ComplexType. __Read Only__  **/\r\n  name: string;\r\n  /**  The short, unqualified, name for this ComplexType. __Read Only__ **/\r\n  shortName: string;\r\n\r\n  /** The namespace for this ComplexType. __Read Only__ **/\r\n  namespace: string;\r\n  /** The DataProperties (see [[DataProperty]] associated with this ComplexType. __Read Only__ */\r\n  dataProperties: DataProperty[];\r\n  /** The DataProperties for this ComplexType that contain instances of a [[ComplexType]]. __Read Only__ */\r\n  complexProperties: DataProperty[];\r\n\r\n  /**\r\n  The entity level validators associated with this ComplexType. Validators can be added and\r\n  removed from this collection. __Read Only__  **/\r\n  validators: Validator[];\r\n  /** For polymorphic purpose only - always empty here */\r\n  concurrencyProperties: DataProperty[];\r\n  /** The DataProperties associated with this ComplexType that are not mapped to any backend datastore. These are effectively free standing\r\n  properties. __Read Only__   **/\r\n  unmappedProperties: DataProperty[];\r\n\r\n  // keyProperties and navigationProperties are not used on complexTypes - but here to allow sharing of code between EntityType and ComplexType.\r\n  navigationProperties: DataProperty[];\r\n  // and may be used later to enforce uniqueness on arrays of complextypes.\r\n  keyProperties: DataProperty[];\r\n  warnings: any[];\r\n  serializerFn?: (prop: EntityProperty, val: any) => any;\r\n\r\n  /** A free form object that can be used to define any custom metadata for this ComplexType. ***/\r\n  custom?: any;\r\n  /** @hidden @internal */\r\n  _mappedPropertiesCount: number;\r\n  /** @hidden @internal */\r\n  _extra?: any;\r\n\r\n  // copy entityType methods onto complexType\r\n  /** See [[EntityType.getCtor]] */\r\n  getCtor = EntityType.prototype.getCtor;\r\n  // note the name change.\r\n  createInstance = EntityType.prototype.createEntity;\r\n  /** See [EntityType.addValidator] */\r\n  addValidator = EntityType.prototype.addValidator;\r\n  getProperty = EntityType.prototype.getProperty;\r\n  getPropertiesOnPath = EntityType.prototype.getPropertiesOnPath;\r\n  getPropertyNames = EntityType.prototype.getPropertyNames;\r\n  /** @hidden @internal */\r\n  _addPropertyCore = EntityType.prototype._addPropertyCore;\r\n  /** @hidden @internal */\r\n  _addDataProperty = EntityType.prototype._addDataProperty;\r\n  /** @hidden @internal */\r\n  _updateNames = EntityType.prototype._updateNames;\r\n  /** @hidden @internal */\r\n  _updateCps = EntityType.prototype._updateCps;\r\n  /** @hidden @internal */\r\n  _initializeInstance = EntityType.prototype._initializeInstance;\r\n  /** @hidden @internal */\r\n  _updateTargetFromRaw = EntityType.prototype._updateTargetFromRaw;\r\n  /** @hidden @internal */\r\n  _setCtor = EntityType.prototype._setCtor;\r\n\r\n  constructor(config: ComplexTypeConfig) {\r\n    if (arguments.length > 1) {\r\n      throw new Error(\"The ComplexType ctor has a single argument that is a configuration object.\");\r\n    }\r\n\r\n    assertConfig(config)\r\n      .whereParam(\"shortName\").isNonEmptyString()\r\n      .whereParam(\"namespace\").isString().isOptional().withDefault(\"\")\r\n      .whereParam(\"dataProperties\").isOptional()\r\n      .whereParam(\"isComplexType\").isOptional().isBoolean()   // needed because this ctor can get called from the addEntityType method which needs the isComplexType prop\r\n      .whereParam(\"custom\").isOptional()\r\n      .applyAll(this);\r\n\r\n    this.name = qualifyTypeName(this.shortName, this.namespace);\r\n    this.isComplexType = true;\r\n    this.dataProperties = [];\r\n    this.complexProperties = [];\r\n    this.validators = [];\r\n    this.concurrencyProperties = [];\r\n    this.unmappedProperties = [];\r\n    this._mappedPropertiesCount = 0;\r\n    // keyProperties and navigationProperties are not used on complexTypes - but here to allow sharing of code between EntityType and ComplexType.\r\n    this.navigationProperties = [];\r\n    this.keyProperties = []; // may be used later to enforce uniqueness on arrays of complextypes.\r\n    if (config.dataProperties) {\r\n      addProperties(this, config.dataProperties, DataProperty);\r\n    }\r\n  }\r\n\r\n  /**\r\n  General purpose property set method\r\n  >      // assume em1 is an EntityManager\r\n  >      let addresstType = em1.metadataStore.getEntityType(\"Address\");\r\n  >      addressType.setProperties( {\r\n  >          custom: { foo: 7, bar: \"test\" }\r\n  >      });\r\n  @param config - Custom config object\r\n  @param config.custom - {Object}\r\n  **/\r\n  setProperties(config: { custom?: any }) {\r\n    assertConfig(config)\r\n      .whereParam(\"custom\").isOptional()\r\n      .applyAll(this);\r\n  }\r\n\r\n\r\n  getAllValidators() {\r\n    // ComplexType inheritance is not YET supported.\r\n    return this.validators;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _createInstanceCore(parent: StructuralObject, parentProperty: DataProperty) {\r\n    let aCtor = this.getCtor();\r\n    let instance = new aCtor() as ComplexObject;\r\n    new ComplexAspect(instance, parent, parentProperty);\r\n    // initialization occurs during either attach or in createInstance call.\r\n    return instance;\r\n  }\r\n\r\n\r\n  addProperty(dataProperty: DataProperty) {\r\n    assertParam(dataProperty, \"dataProperty\").isInstanceOf(DataProperty).check();\r\n    return this._addPropertyCore(dataProperty);\r\n  }\r\n\r\n  getProperties(): EntityProperty[] {\r\n    return this.dataProperties;\r\n  }\r\n\r\n  toJSON() {\r\n    return core.toJson(this, {\r\n      shortName: null,\r\n      namespace: null,\r\n      isComplexType: null,\r\n      dataProperties: null,\r\n      validators: null,\r\n      custom: null\r\n    });\r\n  }\r\n\r\n}\r\nComplexType.prototype._$typeName = \"ComplexType\";\r\n/** Creates an instance of this complexType */\r\nComplexType.prototype.createInstance = EntityType.prototype.createEntity;\r\n\r\nexport interface DataPropertyConfig {\r\n  name?: string;\r\n  nameOnServer?: string;\r\n  dataType?: DataType | string | ComplexType;\r\n  complexTypeName?: string;\r\n  isNullable?: boolean;\r\n  isScalar?: boolean; // will be false for some NoSQL databases.\r\n  defaultValue?: any;\r\n  isPartOfKey?: boolean;\r\n  isUnmapped?: boolean;\r\n  isSettable?: boolean;\r\n  concurrencyMode?: string;\r\n  maxLength?: number;\r\n  validators?: Validator[];\r\n  displayName?: string;\r\n  enumType?: string;\r\n  rawTypeName?: string;  // occurs with undefined datatypes\r\n  custom?: any;\r\n}\r\n\r\n/**\r\nA DataProperty describes the metadata for a single property of an  [[EntityType]] that contains simple data.\r\n\r\nInstances of the DataProperty class are constructed automatically during Metadata retrieval. However it is also possible to construct them\r\ndirectly via the constructor.\r\n**/\r\nexport class DataProperty {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on proto\r\n  /** Is this a DataProperty? - always true here. Allows polymorphic treatment of DataProperties and NavigationProperties. __Read Only__ */\r\n  isDataProperty = true;\r\n  /** Is this a NavigationProperty? - always false here.  Allows polymorphic treatment of DataProperties and NavigationProperties. __Read Only__ */\r\n  isNavigationProperty = false;\r\n  /** The name of this property. __Read Only__  **/\r\n  declare name: string;\r\n  /** The name of this property on the server. __Read Only__ **/\r\n  declare nameOnServer: string;\r\n  /** The [[DataType]] of this property. __Read Only__ */\r\n  declare dataType: DataType | ComplexType; // this will be a complexType when dp is a complexProperty\r\n  /** The name of the [[ComplexType]] associated with this property; may be null. __Read Only__ */\r\n  declare complexTypeName: string;\r\n  /** The [[ComplexType]] associated with this property; may be undefined. __Read Only__ */\r\n  declare complexType?: ComplexType;\r\n  /**  Whether the contents of this property is an instance of a [[ComplexType]]. __Read Only__ */\r\n  declare isComplexProperty: boolean;\r\n  /** Whether this property is nullable. __Read Only__ */\r\n  declare isNullable: boolean;\r\n  /**  Whether this property is scalar (i.e., returns a single value as opposed to an array). __Read Only__ */\r\n  declare isScalar: boolean; // will be false for some NoSQL databases.\r\n  /** The default value for this property. __Read Only__ */\r\n  declare defaultValue: any;\r\n  /**  Whether this property is a 'key' property. __Read Only__ */\r\n  declare isPartOfKey: boolean;\r\n  /** Whether this property is an 'unmapped' property. __Read Only__ */\r\n  declare isUnmapped: boolean;\r\n  /** Whether this property is 'settable'. __Read Only__ */\r\n  declare isSettable: boolean;\r\n  // TODO: doc this\r\n  declare concurrencyMode: string;\r\n  /**  The maximum length for the value of this property. Only meaningful for strings. __Read Only__ */\r\n  declare maxLength?: number;\r\n  /** The [[Validator]] instances that are associated with this property. Validators can be added and\r\n  removed from this collection. __Read Only__ */\r\n  declare validators: Validator[];\r\n  /** The display name of this property. __Read Only__ */\r\n  declare displayName: string;\r\n  /** The full name of the enum type */\r\n  declare enumType?: string;\r\n  /** The raw type name of this property. will only be defined for properties with a DataType of 'Undefined' */\r\n  declare rawTypeName?: string;  // occurs with undefined datatypes\r\n  /**  A free form object that can be used to define any custom metadata for this DataProperty. __Read Only__ */\r\n  declare custom?: any;\r\n  // TODO: doc this\r\n  declare inverseNavigationProperty?: NavigationProperty;\r\n  /**\r\n  The navigation property related to this property.  Will only be set if this is a foreign key property. __Read Only__ */\r\n  declare relatedNavigationProperty?: NavigationProperty;\r\n  /** The parent type that this property belongs to - will be either a [[EntityType]] or a [[ComplexType]]. __Read Only__ */\r\n  declare parentType: StructuralType;\r\n  /** Property on the base type that this property is inherited from. Will be null if the property is not on the base type. __Read Only__ */\r\n  declare baseProperty?: DataProperty;\r\n\r\n  /** DataProperty constructor\r\n  >      let lastNameProp = new DataProperty( {\r\n  >          name: \"lastName\",\r\n  >          dataType: DataType.String,\r\n  >          isNullable: true,\r\n  >          maxLength: 20\r\n  >      });\r\n  >      // assuming personEntityType is a newly constructed EntityType\r\n  >      personEntityType.addProperty(lastNameProperty);\r\n  @param config - A configuration Object or a DataProperty\r\n  */\r\n  constructor(config: DataPropertyConfig | DataProperty) {\r\n    assertConfig(config)\r\n      .whereParam(\"name\").isString().isOptional()\r\n      .whereParam(\"nameOnServer\").isString().isOptional()\r\n      .whereParam(\"dataType\").isEnumOf(DataType).isOptional().or().isString().or().isInstanceOf(ComplexType)\r\n      .whereParam(\"complexTypeName\").isOptional()\r\n      .whereParam(\"isNullable\").isBoolean().isOptional().withDefault(true)\r\n      .whereParam(\"isScalar\").isOptional().withDefault(true)// will be false for some NoSQL databases.\r\n      .whereParam(\"defaultValue\").isOptional()\r\n      .whereParam(\"isPartOfKey\").isBoolean().isOptional()\r\n      .whereParam(\"isUnmapped\").isBoolean().isOptional()\r\n      .whereParam(\"isSettable\").isBoolean().isOptional().withDefault(true)\r\n      .whereParam(\"concurrencyMode\").isString().isOptional()\r\n      .whereParam(\"maxLength\").isNumber().isOptional()\r\n      .whereParam(\"validators\").isInstanceOf(Validator).isArray().isOptional().withDefault([])\r\n      .whereParam(\"displayName\").isOptional()\r\n      .whereParam(\"enumType\").isOptional()\r\n      .whereParam(\"rawTypeName\").isOptional() // occurs with undefined datatypes\r\n      .whereParam(\"custom\").isOptional()\r\n      .applyAll(this);\r\n    let hasName = !!(this.name || this.nameOnServer);\r\n    if (!hasName) {\r\n      throw new Error(\"A DataProperty must be instantiated with either a 'name' or a 'nameOnServer' property\");\r\n    }\r\n    // name/nameOnServer is resolved later when a metadataStore is available.\r\n\r\n    if (this.complexTypeName) {\r\n      this.isComplexProperty = true;\r\n      // this.dataType = null; // TODO: would like to remove this line because dataType will be set later.\r\n    } else if (typeof (this.dataType) === \"string\") {\r\n      let dt = DataType.fromName(this.dataType);\r\n      if (!dt) {\r\n        throw new Error(\"Unable to find a DataType enumeration by the name of: \" + this.dataType);\r\n      }\r\n      this.dataType = dt;\r\n    } else if (!this.dataType) {\r\n      this.dataType = DataType.String;\r\n    }\r\n\r\n    // == as opposed to === is deliberate here.\r\n    if (this.defaultValue == null) {\r\n      if (this.isNullable) {\r\n        this.defaultValue = null;\r\n      } else {\r\n        if (this.isComplexProperty) {\r\n          // what to do? - shouldn't happen from EF - but otherwise ???\r\n        } else if (this.dataType === DataType.Binary) {\r\n          this.defaultValue = \"AAAAAAAAJ3U=\"; // hack for all binary fields but value is specifically valid for timestamp fields - arbitrary valid 8 byte base64 value.\r\n        } else {\r\n          this.defaultValue = (this.dataType as any).defaultValue;\r\n          const msg = \"A nonnullable DataProperty cannot have a null defaultValue. Name: \" + (this.name || this.nameOnServer);\r\n          if (this.defaultValue === null) {\r\n            throw new Error(msg);  // if defaultValue is explicity set to null, that's an error\r\n          } else if (this.defaultValue == null) {\r\n            console.warn(msg);  // if defaultValue is not set, that's a warning\r\n          }\r\n        }\r\n      }\r\n    } else if ((this.dataType as any).isNumeric) {\r\n      // in case the defaultValue comes in as a string ( which it does in EF6).\r\n      if (typeof (this.defaultValue) === \"string\") {\r\n        this.defaultValue = parseFloat(this.defaultValue);\r\n      }\r\n    }\r\n\r\n    if (this.isComplexProperty) {\r\n      this.isScalar = this.isScalar == null || this.isScalar === true;\r\n    }\r\n\r\n  }\r\n\r\n  static getRawValueFromServer(rawEntity: Object & Record<string, any>, dp: DataProperty) {\r\n    if (dp.isUnmapped) {\r\n      return rawEntity[dp.nameOnServer || dp.name];\r\n    } else {\r\n      let val = rawEntity[dp.nameOnServer];\r\n      return val !== undefined ? val : dp.defaultValue;\r\n    }\r\n  }\r\n\r\n  static getRawValueFromClient(rawEntity: Object & Record<string, any>, dp: DataProperty) {\r\n    let val = rawEntity[dp.name];\r\n    return val !== undefined ? val : dp.defaultValue;\r\n  }\r\n\r\n  resolveProperty(propName: string) {\r\n    let result = this[propName];\r\n    let baseProp = this.baseProperty;\r\n    while (result == undefined && baseProp != null) {\r\n      result = baseProp[propName];\r\n      baseProp = baseProp.baseProperty;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  formatName() {\r\n    return this.parentType.name + \"--\" + this.name;\r\n  }\r\n\r\n\r\n  /**\r\n  General purpose property set method\r\n  >      // assume em1 is an EntityManager\r\n  >      let prop = myEntityType.getProperty(\"myProperty\");\r\n  >      prop.setProperties( {\r\n  >          custom: { foo: 7, bar: \"test\" }\r\n  >      });\r\n  @param config - A configuration object.\r\n  **/\r\n  setProperties(config: { displayName?: string, custom?: Object }) {\r\n    assertConfig(config)\r\n      .whereParam(\"displayName\").isOptional()\r\n      .whereParam(\"custom\").isOptional()\r\n      .applyAll(this);\r\n  }\r\n\r\n  getAllValidators() {\r\n    let validators = this.validators.slice(0);\r\n    let baseProp = this.baseProperty;\r\n    while (baseProp) {\r\n      validators.push.apply(validators, baseProp.validators);\r\n      baseProp = baseProp.baseProperty;\r\n    }\r\n    return validators;\r\n  }\r\n\r\n  toJSON() {\r\n    // do not serialize dataTypes that are complexTypes\r\n    return core.toJson(this, {\r\n      name: null,\r\n      dataType: function (v: any) {\r\n        return (v && v instanceof DataType) ? v.name : undefined;\r\n      }, // do not serialize dataTypes that are complexTypes\r\n      complexTypeName: null,\r\n      isNullable: true,\r\n      defaultValue: null,\r\n      isPartOfKey: false,\r\n      isUnmapped: false,\r\n      isSettable: true,\r\n      concurrencyMode: null,\r\n      maxLength: null,\r\n      validators: null,\r\n      displayName: null,\r\n      enumType: null,\r\n      rawTypeName: null,\r\n      isScalar: true,\r\n      custom: null\r\n    });\r\n  }\r\n\r\n  static fromJSON(json: any) {\r\n    json.dataType = DataType.fromName(json.dataType);\r\n    // Parse default value into correct data type. (dateTime instances require extra work to deserialize properly.)\r\n    if (json.defaultValue && json.dataType && json.dataType.parse) {\r\n      json.defaultValue = json.dataType.parse(json.defaultValue, typeof json.defaultValue);\r\n    }\r\n\r\n    if (json.validators) {\r\n      json.validators = json.validators.map(Validator.fromJSON);\r\n    }\r\n\r\n    return new DataProperty(json);\r\n  }\r\n\r\n}\r\nDataProperty.prototype._$typeName = \"DataProperty\";\r\n\r\nexport interface NavigationPropertyConfig {\r\n  name?: string;\r\n  nameOnServer?: string;\r\n  entityTypeName?: string;\r\n  isScalar?: boolean;\r\n  associationName?: string;\r\n  foreignKeyNames?: string[];\r\n  foreignKeyNamesOnServer?: string[];\r\n  invForeignKeyNames?: string[];\r\n  invForeignKeyNamesOnServer?: string[];\r\n  validators?: Validator[];\r\n  displayName?: string;\r\n  custom?: any;\r\n}\r\n\r\n/**   A NavigationProperty describes the metadata for a single property of an [[EntityType]] that return instances of other EntityTypes.\r\n\r\nInstances of the NavigationProperty class are constructed automatically during Metadata retrieval.   However it is also possible to construct them\r\ndirectly via the constructor.\r\n**/\r\nexport class NavigationProperty {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string;\r\n  /** Is this a DataProperty? - always false here \r\n  Allows polymorphic treatment of DataProperties and NavigationProperties. __Read Only__ */\r\n  isDataProperty = false;\r\n  /** Is this a NavigationProperty? - always true here\r\n  Allows polymorphic treatment of DataProperties and NavigationProperties. __Read Only__ */\r\n  isNavigationProperty = true;\r\n\r\n  formatName = DataProperty.prototype.formatName;\r\n  getAllValidators = DataProperty.prototype.getAllValidators;\r\n  resolveProperty = DataProperty.prototype.resolveProperty;\r\n\r\n  /** The [[EntityType]] returned by this property. __Read Only__ */\r\n  declare entityType: EntityType;\r\n  /** The name of the [[EntityType]] returned by this property. __Read Only__ */\r\n  declare entityTypeName: string;\r\n  /** The [[EntityType]] that this property belongs to. ( same as entityType). __Read Only__ */\r\n  declare parentType: EntityType; // ?? same as entityType\r\n  /** The [[EntityType]] that this property belongs to. ( same as entityType). __Read Only__ */\r\n  declare parentEntityType: EntityType; // ?? same as above\r\n  /** Property on the base type that this property is inherited from. Will be null if the property is not on the base type. __Read Only__ */\r\n  declare baseProperty?: NavigationProperty;\r\n  /** The inverse of this NavigationProperty.  The NavigationProperty that represents a navigation in the opposite direction\r\n  to this NavigationProperty. May be undefined for a undirectional NavigationProperty. __Read Only__ */\r\n  declare private _inverse?: NavigationProperty;\r\n  /** The name of this property. __Read Only__ */\r\n  declare name: string;\r\n  /** The name of this property on the server. __Read Only__ */\r\n  declare nameOnServer: string;\r\n  /**\r\n  Whether this property returns a single entity as opposed to  an array of entities. __Read Only__ */\r\n  declare isScalar: boolean;\r\n  /** The name of the association to which that this property belongs.  This associationName will be shared with this\r\n  properties 'inverse'. __Read Only__ */\r\n  declare associationName: string;\r\n  /** The names of the foreign key DataProperties associated with this NavigationProperty. There will usually only be a single DataProperty associated\r\n  with a Navigation property except in the case of entities with multipart keys. __Read Only__ */\r\n  declare foreignKeyNames: string[];\r\n  /** The server side names of the foreign key DataProperties associated with this NavigationProperty. There will usually only be a single DataProperty associated\r\n  with a Navigation property except in the case of entities with multipart keys. __Read Only__ */\r\n  declare foreignKeyNamesOnServer: string[];\r\n  /** The names of the foreign key DataProperties at the other end of the relationship. __Read Only__ */\r\n  declare invForeignKeyNames: string[];\r\n  /** The server side names of the foreign key DataProperties at the other end of the relationship. __Read Only__ */\r\n  declare invForeignKeyNamesOnServer: string[];\r\n  /** The 'foreign key' DataProperties associated with this NavigationProperty. There will usually only be a single DataProperty associated\r\n  with a Navigation property except in the case of entities with multipart keys. __Read Only__ */\r\n  declare relatedDataProperties: DataProperty[];\r\n  /** The [[Validator]] instances that are associated with this property. Validators can be added and\r\n  removed from this collection. __Read Only__ */\r\n  declare validators: Validator[];\r\n  /** The display name of this property. __Read Only__ */\r\n  declare displayName: string;\r\n  declare isUnmapped: boolean;\r\n  /** A free form object that can be used to define any custom metadata for this NavigationProperty.   **/\r\n  declare custom: any;\r\n\r\n  /** NavigationProperty constructor\r\n  >      let homeAddressProp = new NavigationProperty( {\r\n  >          name: \"homeAddress\",\r\n  >          entityTypeName: \"Address:#myNamespace\",\r\n  >          isScalar: true,\r\n  >          associationName: \"address_person\",\r\n  >          foreignKeyNames: [\"homeAddressId\"]\r\n  >      });\r\n  >      let homeAddressIdProp = new DataProperty( {\r\n  >          name: \"homeAddressId\"\r\n  >          dataType: DataType.Integer\r\n  >      });\r\n  >      // assuming personEntityType is a newly constructed EntityType\r\n  >      personEntityType.addProperty(homeAddressProp);\r\n  >      personEntityType.addProperty(homeAddressIdProp);\r\n  @param config - A configuration object.\r\n  **/\r\n  constructor(config: NavigationPropertyConfig) {\r\n    assertConfig(config)\r\n      .whereParam(\"name\").isString().isOptional()\r\n      .whereParam(\"nameOnServer\").isString().isOptional()\r\n      .whereParam(\"entityTypeName\").isString()\r\n      .whereParam(\"isScalar\").isBoolean().isOptional().withDefault(true)\r\n      .whereParam(\"associationName\").isString().isOptional()\r\n      .whereParam(\"foreignKeyNames\").isArray().isString().isOptional().withDefault([])\r\n      .whereParam(\"foreignKeyNamesOnServer\").isArray().isString().isOptional().withDefault([])\r\n      .whereParam(\"invForeignKeyNames\").isArray().isString().isOptional().withDefault([])\r\n      .whereParam(\"invForeignKeyNamesOnServer\").isArray().isString().isOptional().withDefault([])\r\n      .whereParam(\"validators\").isInstanceOf(Validator).isArray().isOptional().withDefault([])\r\n      .whereParam(\"displayName\").isOptional()\r\n      .whereParam(\"custom\").isOptional()\r\n      .applyAll(this);\r\n    let hasName = !!(this.name || this.nameOnServer);\r\n\r\n    if (!hasName) {\r\n      throw new Error(\"A Navigation property must be instantiated with either a 'name' or a 'nameOnServer' property\");\r\n    }\r\n  }\r\n\r\n  /**\r\n  General purpose property set method\r\n  >      // assume myEntityType is an EntityType\r\n  >      let prop = myEntityType.getProperty(\"myProperty\");\r\n  >      prop.setProperties( {\r\n  >          custom: { foo: 7, bar: \"test\" }\r\n  >      });\r\n  @param config - A config object\r\n  **/\r\n  // TODO: create an interface for this.\r\n  setProperties(config: {\r\n    displayName?: string,\r\n    foreignKeyNames?: string[],\r\n    invForeignKeyNames?: string[],\r\n    inverse?: NavigationProperty | string,\r\n    custom?: any\r\n  }) {\r\n    if (!this.parentType) {\r\n      throw new Error(\"Cannot call NavigationProperty.setProperties until the parent EntityType of the NavigationProperty has been set.\");\r\n    }\r\n    let inverse = config.inverse;\r\n    if (inverse) delete config.inverse;\r\n    assertConfig(config)\r\n      .whereParam(\"displayName\").isOptional()\r\n      .whereParam(\"foreignKeyNames\").isArray().isString().isOptional().withDefault([])\r\n      .whereParam(\"invForeignKeyNames\").isArray().isString().isOptional().withDefault([])\r\n      .whereParam(\"custom\").isOptional()\r\n      .applyAll(this);\r\n    this.parentType._updateNames(this);\r\n\r\n    this._resolveNp();\r\n    if (inverse) {\r\n      this.setInverse(inverse);\r\n    }\r\n\r\n  }\r\n\r\n  /** The inverse of this NavigationProperty.  The NavigationProperty that represents a navigation in the opposite direction\r\n  to this NavigationProperty. May be undefined for a undirectional NavigationProperty. __Read Only__ */\r\n  get inverse(): NavigationProperty | undefined {\r\n    return this.getInverse();\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  getInverse(): NavigationProperty | undefined {\r\n    let np: NavigationProperty = this;\r\n    while (!np._inverse && np.baseProperty) {\r\n      np = np.baseProperty;\r\n    }\r\n    return np._inverse;\r\n  }\r\n\r\n  setInverse(inverseNp: NavigationProperty | string) {\r\n    // let invNp: NavigationProperty;\r\n    let invNp = (inverseNp instanceof NavigationProperty) ? inverseNp : this.entityType.getNavigationProperty(inverseNp);\r\n\r\n    if (!invNp) {\r\n      throw throwSetInverseError(this, \"Unable to find inverse property: \" + inverseNp);\r\n    }\r\n\r\n    if (this._inverse || invNp._inverse) {\r\n      throwSetInverseError(this, \"It has already been set on one side or the other.\");\r\n    }\r\n    if (invNp.entityType !== this.parentType) {\r\n      throwSetInverseError(this, invNp.formatName + \" is not a valid inverse property for this.\");\r\n    }\r\n    if (this.associationName) {\r\n      invNp.associationName = this.associationName;\r\n    } else {\r\n      if (!invNp.associationName) {\r\n        invNp.associationName = this.formatName() + \"_\" + invNp.formatName();\r\n      }\r\n      this.associationName = invNp.associationName;\r\n    }\r\n    this._resolveNp();\r\n    invNp._resolveNp();\r\n  }\r\n\r\n  // // In progress - will be used for manual metadata config\r\n  // createInverse(config: any) {\r\n\r\n  //   if (!this.entityType) {\r\n  //     throwCreateInverseError(this, \"has not yet been defined.\");\r\n  //   }\r\n  //   if (this.entityType.isFrozen) {\r\n  //     throwCreateInverseError(this, \"is frozen.\");\r\n  //   }\r\n  //   let metadataStore = this.entityType.metadataStore;\r\n  //   if (metadataStore == null) {\r\n  //     throwCreateInverseError(this, \"has not yet been added to the metadataStore.\");\r\n  //   }\r\n\r\n  //   config.entityTypeName = this.parentEntityType.name;\r\n  //   config.associationName = this.associationName;\r\n  //   let invNp = new NavigationProperty(config);\r\n  //   this.parentEntityType.addNavigationProperty(invNp);\r\n  //   return invNp;\r\n  // };\r\n\r\n\r\n\r\n  toJSON() {\r\n    return core.toJson(this, {\r\n      name: null,\r\n      entityTypeName: null,\r\n      isScalar: null,\r\n      associationName: null,\r\n      validators: null,\r\n      displayName: null,\r\n      foreignKeyNames: null,\r\n      invForeignKeyNames: null,\r\n      custom: null\r\n    });\r\n  }\r\n\r\n  static fromJSON(json: any) {\r\n    if (json.validators) {\r\n      json.validators = json.validators.map(Validator.fromJSON);\r\n    }\r\n    return new NavigationProperty(json);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _resolveNp() {\r\n    let np = this;\r\n    let entityType = np.entityType;\r\n    let invNp = core.arrayFirst(entityType.navigationProperties, (altNp) => {\r\n      // Can't do this because of possibility of comparing a base class np with a subclass altNp.\r\n      // return altNp.associationName === np.associationName\r\n      //    && altNp !== np;\r\n      // So use this instead.\r\n      return altNp.associationName === np.associationName &&\r\n        (altNp.name !== np.name || altNp.entityTypeName !== np.entityTypeName);\r\n    });\r\n    np._inverse = invNp || undefined;\r\n    //if (invNp && invNp.inverse == null) {\r\n    //    invNp._resolveNp();\r\n    //}\r\n    if (!invNp) {\r\n      // unidirectional 1-n relationship\r\n      np.invForeignKeyNames.forEach(function (invFkName) {\r\n        let fkProp = entityType.getDataProperty(invFkName);\r\n        if (fkProp == null) {\r\n          throw new Error(\"EntityType '\" + np.entityTypeName + \"' has no foreign key matching '\" + invFkName + \"'\");\r\n        }\r\n        let invEntityType = np.parentType;\r\n        invNp = core.arrayFirst(invEntityType.navigationProperties, (np2) => {\r\n          return np2.invForeignKeyNames && np2.invForeignKeyNames.indexOf(fkProp!.name) >= 0 && np2.entityType === fkProp!.parentType;\r\n        });\r\n        fkProp.inverseNavigationProperty = invNp || undefined;\r\n        core.arrayAddItemUnique(entityType.foreignKeyProperties, fkProp);\r\n      });\r\n    }\r\n\r\n    resolveRelated(np);\r\n  }\r\n\r\n}\r\nNavigationProperty.prototype._$typeName = \"NavigationProperty\";\r\n\r\nfunction throwSetInverseError(np: NavigationProperty, message: string) {\r\n  throw new Error(\"Cannot set the inverse property for: \" + np.formatName() + \". \" + message);\r\n}\r\n\r\n// Not current used.\r\n// function throwCreateInverseError(np: NavigationProperty, message: string) {\r\n//   throw new Error(\"Cannot create inverse for: \" + np.formatName() + \". The entityType for this navigation property \" + message);\r\n// }\r\n\r\n// sets navigation property: relatedDataProperties and dataProperty: relatedNavigationProperty\r\nfunction resolveRelated(np: NavigationProperty) {\r\n\r\n  let fkNames = np.foreignKeyNames;\r\n  if (fkNames.length === 0) return;\r\n\r\n  let parentEntityType = np.parentType;\r\n  let fkProps = fkNames.map(function (fkName) {\r\n    return parentEntityType.getDataProperty(fkName);\r\n  });\r\n  let fkPropCollection = parentEntityType.foreignKeyProperties;\r\n\r\n  fkProps.forEach((dp: DataProperty) => {\r\n    core.arrayAddItemUnique(fkPropCollection, dp);\r\n    dp.relatedNavigationProperty = np;\r\n    // now update the inverse\r\n    core.arrayAddItemUnique(np.entityType.inverseForeignKeyProperties, dp);\r\n    if (np.relatedDataProperties) {\r\n      core.arrayAddItemUnique(np.relatedDataProperties, dp);\r\n    } else {\r\n      np.relatedDataProperties = [dp];\r\n    }\r\n  });\r\n}\r\n\r\n\r\n/**\r\nAutoGeneratedKeyType is an 'Enum' containing all of the valid states for an automatically generated key.\r\n**/\r\nexport class AutoGeneratedKeyType extends BreezeEnum {\r\n\r\n  /**\r\n  This entity does not have an autogenerated key.\r\n  The client must set the key before adding the entity to the EntityManager\r\n  **/\r\n  static None = new AutoGeneratedKeyType();\r\n  /** \r\n  This entity's key is an Identity column and is set by the backend database.\r\n  Keys for new entities will be temporary until the entities are saved at which point the keys will\r\n  be converted to their 'real' versions.\r\n  **/\r\n  static Identity = new AutoGeneratedKeyType();\r\n  /**\r\n  This entity's key is generated by a KeyGenerator and is set by the backend database.\r\n  Keys for new entities will be temporary until the entities are saved at which point the keys will\r\n  be converted to their 'real' versions.\r\n  **/\r\n  static KeyGenerator = new AutoGeneratedKeyType();\r\n\r\n}\r\nAutoGeneratedKeyType.prototype._$typeName = \"AutoGeneratedKeyType\";\r\nError['x'] = AutoGeneratedKeyType.resolveSymbols();\r\n\r\n\r\n// mixin methods\r\n/** @hidden @internal */\r\ndeclare module \"./assert-param\" {\r\n  interface Param {\r\n    isEntity(): Param;\r\n    isEntityProperty(): Param;\r\n  }\r\n}\r\n\r\nlet proto = Param.prototype;\r\n\r\n// 'this' below is TS annotation \r\nproto.isEntity = function (this: Param) {\r\n  return this._addContext({\r\n    fn: isEntity,\r\n    msg: \" must be an entity\"\r\n  });\r\n};\r\n\r\nfunction isEntity(context: any, v: any) {\r\n  if (v == null) return false;\r\n  return (v.entityType !== undefined);\r\n}\r\n\r\nproto.isEntityProperty = function (this: Param) {\r\n  return this._addContext({\r\n    fn: isEntityProperty,\r\n    msg: \" must be either a DataProperty or a NavigationProperty\"\r\n  });\r\n};\r\n\r\nfunction isEntityProperty(context: any, v: any) {\r\n  if (v == null) return false;\r\n  return (v.isDataProperty || v.isNavigationProperty);\r\n}\r\n\r\n// functions shared between classes related to Metadata\r\n\r\nfunction isQualifiedTypeName(entityTypeName: string) {\r\n  return entityTypeName.indexOf(\":#\") >= 0;\r\n}\r\n\r\nexport function qualifyTypeName(shortName: string, ns?: string) {\r\n  if (ns && ns.length > 0) {\r\n    return shortName + \":#\" + ns;\r\n  } else {\r\n    return shortName;\r\n  }\r\n}\r\n\r\n// Used by both ComplexType and EntityType\r\nfunction addProperties(entityType: StructuralType, propObj: Object | undefined, ctor: any) {\r\n  if (propObj == null) return;\r\n  if (Array.isArray(propObj)) {\r\n    propObj.forEach(entityType._addPropertyCore.bind(entityType));\r\n  } else if (typeof (propObj) === 'object') {\r\n    for (let key in propObj) {\r\n      if (core.hasOwnProperty(propObj, key)) {\r\n        let value = propObj[key];\r\n        value.name = key;\r\n        let prop = new ctor(value);\r\n        entityType._addPropertyCore(prop);\r\n      }\r\n    }\r\n  } else {\r\n    throw new Error(\"The 'dataProperties' or 'navigationProperties' values must be either an array of data/nav properties or an object where each property defines a data/nav property\");\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { core } from './core';\r\nimport { config } from './config';\r\nimport { EntityQuery } from './entity-query';\r\nimport { DataServiceAdapter, AjaxAdapter, ChangeRequestInterceptorCtor, ChangeRequestInterceptor } from './interface-registry';\r\nimport { Entity } from './entity-aspect';\r\nimport { MappingContext } from './mapping-context';\r\nimport { DataService, JsonResultsAdapter } from './data-service';\r\nimport { HttpResponse, SaveContext, SaveBundle, ServerError, SaveResult, SaveErrorFromServer, QueryResult } from './entity-manager';\r\nimport { EntityType, MetadataStore } from './entity-metadata';\r\n\r\n/** For use by breeze plugin authors only.  The class is used as the base class for most [[IDataServiceAdapter]] implementations\r\n@adapter (see [[IDataServiceAdapter]])    \r\n@hidden\r\n*/\r\nexport abstract class AbstractDataServiceAdapter implements DataServiceAdapter {\r\n  /** @hidden @internal */\r\n  declare _$impl?: any;\r\n  /** The name of this adapter. */\r\n  declare name: string;\r\n  /** The [[IAjaxAdapter]] used by this [[IDataServiceAdapter]]. */\r\n  declare ajaxImpl: AjaxAdapter;\r\n\r\n  // TODO use interface\r\n  checkForRecomposition(interfaceInitializedArgs: any) {\r\n    if (interfaceInitializedArgs.interfaceName === \"ajax\" && interfaceInitializedArgs.isDefault) {\r\n      this.initialize();\r\n    }\r\n  }\r\n\r\n  initialize() {\r\n    this.ajaxImpl = config.getAdapterInstance<AjaxAdapter>(\"ajax\") !;\r\n\r\n    // don't cache 'ajax' because then we would need to \".bind\" it, and don't want to because of brower support issues.\r\n    if (this.ajaxImpl && this.ajaxImpl.ajax) {\r\n      return;\r\n    }\r\n    throw new Error(\"Unable to find ajax adapter for dataservice adapter '\" + (this.name || '') + \"'.\");\r\n  }\r\n\r\n  fetchMetadata(metadataStore: MetadataStore, dataService: DataService) {\r\n    let serviceName = dataService.serviceName;\r\n    let url = dataService.qualifyUrl(\"Metadata\");\r\n\r\n    let promise = new Promise((resolve, reject) => {\r\n\r\n      this.ajaxImpl.ajax({\r\n        type: \"GET\",\r\n        url: url,\r\n        dataType: 'json',\r\n        success: (httpResponse: HttpResponse) => {\r\n\r\n          // might have been fetched by another query\r\n          if (metadataStore.hasMetadataFor(serviceName)) {\r\n            return resolve(\"already fetched\");\r\n          }\r\n          let data = httpResponse.data;\r\n          let metadata: any;\r\n          try {\r\n            metadata = typeof (data) === \"string\" ? JSON.parse(data) : data;\r\n            metadataStore.importMetadata(metadata);\r\n          } catch (e) {\r\n            let errMsg = \"Unable to either parse or import metadata: \" + e.message;\r\n            handleHttpError(reject, httpResponse, \"Metadata query failed for: \" + url + \". \" + errMsg);\r\n          }\r\n\r\n          // import may have brought in the service.\r\n          if (!metadataStore.hasMetadataFor(serviceName)) {\r\n            metadataStore.addDataService(dataService);\r\n          }\r\n\r\n          resolve(metadata);\r\n\r\n        },\r\n        error: (httpResponse: HttpResponse) => {\r\n          handleHttpError(reject, httpResponse, \"Metadata query failed for: \" + url);\r\n        }\r\n      });\r\n    });\r\n    return promise;\r\n  }\r\n\r\n  /** Execute the query in the mappingContext using the ajaxImpl. */\r\n  executeQuery(mappingContext: MappingContext) {\r\n    mappingContext.adapter = this;\r\n\r\n    const usePost = (mappingContext.query as EntityQuery).usePostEnabled;\r\n    const params = usePost ? this._makeQueryPostParams(mappingContext) : this._makeQueryGetParams(mappingContext) as any;\r\n\r\n    let promise = new Promise<QueryResult>((resolve, reject) => {\r\n      params.success = function (httpResponse: HttpResponse) {\r\n        let data = httpResponse.data;\r\n        try {\r\n          let rData: QueryResult;\r\n          let results = data && (data.results || data.Results);\r\n          if (results) {\r\n            rData = { results: results, inlineCount: data.inlineCount || data.InlineCount, \r\n              httpResponse: httpResponse, query: mappingContext.query };\r\n          } else {\r\n            rData = { results: data, httpResponse: httpResponse, query: mappingContext.query };\r\n          }\r\n\r\n          resolve(rData);\r\n        } catch (e) {\r\n          if (e instanceof Error) {\r\n            reject(e);\r\n          } else {\r\n            handleHttpError(reject, httpResponse);\r\n          }\r\n        }\r\n      };\r\n      params.error = function (httpResponse: HttpResponse) {\r\n        handleHttpError(reject, httpResponse);\r\n      };\r\n      this.ajaxImpl.ajax(params);\r\n    });\r\n    return promise;\r\n  }\r\n\r\n  /** Set up ajax parameters for query GET.  This puts the query into the request querystring in either JSON or OData-style syntax, depending upon the UriBuilder. */\r\n  _makeQueryGetParams(mappingContext: MappingContext) {\r\n    const url = mappingContext.getUrl();\r\n\r\n    const params = {\r\n      type: \"GET\",\r\n      url: url,\r\n      params: (mappingContext.query as EntityQuery).parameters,\r\n      dataType: 'json',\r\n      crossDomain: false,\r\n    };\r\n    if (mappingContext.dataService.useJsonp) {\r\n      params.dataType = 'jsonp';\r\n      params.crossDomain = true;\r\n    }\r\n    return params;\r\n  }\r\n\r\n  /** Set up ajax parameters for query POST.  This put the query into the request body as JSON. */\r\n  _makeQueryPostParams(mappingContext: MappingContext) {\r\n    const entityQuery = mappingContext.query as EntityQuery;\r\n    const metadataStore = mappingContext.entityManager.metadataStore;\r\n    const url = mappingContext.dataService.qualifyUrl(entityQuery.resourceName);\r\n\r\n    let entityType = entityQuery._getFromEntityType(metadataStore, false);\r\n    if (!entityType) { entityType = new EntityType(metadataStore); }\r\n    const json = entityQuery.toJSONExt({ entityType: entityType, toNameOnServer: true}) as any;\r\n    json.from = undefined;\r\n    json.queryOptions = undefined;\r\n\r\n    const params = {\r\n      type: \"POST\",\r\n      url: url,\r\n      params: (mappingContext.query as EntityQuery).parameters,\r\n      dataType: 'json',\r\n      processData: false, // don't let JQuery form-encode it\r\n      contentType: \"application/json; charset=UTF-8\",\r\n      data: JSON.stringify(json),\r\n      crossDomain: false,\r\n    };\r\n    return params;\r\n  }\r\n\r\n  saveChanges(saveContext: SaveContext, saveBundle: SaveBundle) {\r\n    let adapter = saveContext.adapter = this;\r\n\r\n    let saveBundleSer = adapter._prepareSaveBundle(saveContext, saveBundle);\r\n    let bundle = JSON.stringify(saveBundleSer);\r\n\r\n    let url = saveContext.dataService.qualifyUrl(saveContext.resourceName);\r\n    let promise = new Promise<SaveResult>((resolve, reject) => {\r\n      this.ajaxImpl.ajax({\r\n        type: \"POST\",\r\n        url: url,\r\n        dataType: 'json',\r\n        contentType: \"application/json\",\r\n        data: bundle,\r\n        success: function (httpResponse: HttpResponse) {\r\n          httpResponse.saveContext = saveContext;\r\n          let data = httpResponse.data;\r\n          if (data.Errors || data.errors) {\r\n            handleHttpError(reject, httpResponse);\r\n          } else {\r\n            let saveResult = adapter._prepareSaveResult(saveContext, data);\r\n            saveResult.httpResponse = httpResponse;\r\n            resolve(saveResult);\r\n          }\r\n        },\r\n        error: function (httpResponse: HttpResponse) {\r\n          httpResponse.saveContext = saveContext;\r\n          handleHttpError(reject, httpResponse);\r\n        }\r\n      });\r\n    });\r\n\r\n    return promise;\r\n  }\r\n\r\n  /** Abstract method that needs to be overwritten in any concrete DataServiceAdapter subclass. \r\n  The return value from this method should be a serializable object that will be sent to the server after calling JSON.stringify on it.\r\n  */\r\n  _prepareSaveBundle(saveContext: SaveContext, saveBundle: SaveBundle): any {\r\n    // The implementor should call _createChangeRequestInterceptor\r\n    throw new Error(\"Need a concrete implementation of _prepareSaveBundle\");\r\n  }\r\n\r\n  /**\r\n  Returns a constructor function for a \"ChangeRequestInterceptor\"\r\n  that can tweak the saveBundle both as it is built and when it is completed\r\n  by a concrete DataServiceAdapater.\r\n\r\n  Initialized with a default, no-op implementation that developers can replace with a\r\n  substantive implementation that changes the individual entity change requests\r\n  or aspects of the entire 'saveBundle' without having to write their own DataService adapters.\r\n  >     let adapter = breeze.config.getAdapterInstance('dataService');\r\n  >     adapter.changeRequestInterceptor = function (saveContext, saveBundle) {\r\n  >         this.getRequest = function (request, entity, index) {\r\n  >            // alter the request that the adapter prepared for this entity\r\n  >            // based on the entity, saveContext, and saveBundle\r\n  >            // e.g., add a custom header or prune the originalValuesMap\r\n  >            return request;\r\n  >        };\r\n  >        this.done = function (requests) {\r\n  >            // alter the array of requests representing the entire change-set\r\n  >            // based on the saveContext and saveBundle\r\n  >        };\r\n  >     }\r\n\r\n  @param saveContext - The BreezeJS \"context\" for the save operation.\r\n  @param saveBundle - Contains the array of entities-to-be-saved (AKA, the entity change-set).\r\n  @return Constructor for a \"ChangeRequestInterceptor\".\r\n  **/\r\n  changeRequestInterceptor: ChangeRequestInterceptorCtor = DefaultChangeRequestInterceptor;\r\n\r\n  /** @hidden @internal */\r\n  _createChangeRequestInterceptor(saveContext: SaveContext, saveBundle: SaveBundle) {\r\n    let adapter = saveContext.adapter!;\r\n    let cri = adapter.changeRequestInterceptor;\r\n    let isFn = core.isFunction;\r\n\r\n    if (isFn(cri)) {\r\n      let pre = adapter.name + \" DataServiceAdapter's ChangeRequestInterceptor\";\r\n      let post = \" is missing or not a function.\";\r\n      let interceptor = new cri(saveContext, saveBundle);\r\n      if (!isFn(interceptor.getRequest)) {\r\n        throw new Error(pre + '.getRequest' + post);\r\n      }\r\n      if (!isFn(interceptor.done)) {\r\n        throw new Error(pre + '.done' + post);\r\n      }\r\n      return interceptor;\r\n    } else {\r\n      return new DefaultChangeRequestInterceptor(saveContext, saveBundle) as ChangeRequestInterceptor;\r\n    }\r\n  }\r\n\r\n  /** Abstract method that needs to be overwritten in any concrete DataServiceAdapter sublclass. \r\n  This method needs to take the result returned the server and convert it into an ISaveResult. \r\n  */\r\n  _prepareSaveResult(saveContext: SaveContext, data: any): SaveResult {\r\n    throw new Error(\"Need a concrete implementation of _prepareSaveResult\");\r\n  }\r\n\r\n\r\n  /** Utility method that may be used in any concrete DataServiceAdapter sublclass to handle any \r\n  http connection issues. \r\n  */\r\n  // Put this at the bottom of your http error analysis\r\n  static _catchNoConnectionError(err: ServerError) {\r\n    if (err.status === 0 && err.message == null) {\r\n      err.message = \"HTTP response status 0 and no message.  \" +\r\n        \"Likely did not or could not reach server. Is the server running?\";\r\n    }\r\n  }\r\n\r\n  jsonResultsAdapter = new JsonResultsAdapter({\r\n    name: \"noop\",\r\n\r\n    visitNode: function (/* node, mappingContext, nodeContext */) {\r\n      return {};\r\n    }\r\n  });\r\n}\r\n\r\nfunction handleHttpError(reject: (reason?: any) => void, httpResponse: HttpResponse, messagePrefix?: string) {\r\n  let err = createError(httpResponse);\r\n  AbstractDataServiceAdapter._catchNoConnectionError(err);\r\n  if (messagePrefix) {\r\n    err.message = messagePrefix + \"; \" + err.message;\r\n  }\r\n  reject(err);\r\n}\r\n\r\nfunction createError(httpResponse: HttpResponse) {\r\n  let err = new Error() as ServerError;\r\n  err.httpResponse = httpResponse;\r\n  err.status = httpResponse.status;\r\n\r\n  let errObj = httpResponse.data;\r\n\r\n  if (!errObj) {\r\n    err.message = httpResponse.error && httpResponse.error.toString();\r\n    return err;\r\n  }\r\n\r\n  // some ajax providers will convert errant result into an object (angularjs), others will not (jQuery)\r\n  // if not do it here.\r\n  if (typeof errObj === \"string\") {\r\n    try {\r\n      errObj = JSON.parse(errObj);\r\n    } catch (e) {\r\n      // sometimes httpResponse.data is just the error message itself\r\n      err.message = errObj;\r\n      return err;\r\n    }\r\n  }\r\n\r\n  let saveContext = httpResponse.saveContext;\r\n\r\n  // if any of the follow properties exist the source is .NET\r\n  let tmp = errObj.Message || errObj.ExceptionMessage || errObj.EntityErrors || errObj.Errors;\r\n  let isDotNet = !!tmp;\r\n  let message: string, entityErrors: any[];\r\n  if (!isDotNet) {\r\n    message = errObj.message;\r\n    entityErrors = errObj.errors || errObj.entityErrors;\r\n  } else {\r\n    let tmp = errObj;\r\n    do {\r\n      // .NET exceptions can provide both ExceptionMessage and Message but ExceptionMethod if it\r\n      // exists has a more detailed message.\r\n      message = tmp.ExceptionMessage || tmp.Message;\r\n      tmp = tmp.InnerException;\r\n    } while (tmp);\r\n    // .EntityErrors will only occur as a result of an EntityErrorsException being deliberately thrown on the server\r\n    entityErrors = errObj.Errors || errObj.EntityErrors;\r\n    entityErrors = entityErrors && entityErrors.map(function (e) {\r\n      return {\r\n        errorName: e.ErrorName,\r\n        entityTypeName: MetadataStore.normalizeTypeName(e.EntityTypeName),\r\n        keyValues: e.KeyValues,\r\n        propertyName: e.PropertyName,\r\n        errorMessage: e.ErrorMessage,\r\n        custom: e.Custom\r\n      };\r\n    });\r\n  }\r\n\r\n  if (saveContext && entityErrors) {\r\n\r\n    let propNameFn = saveContext.entityManager.metadataStore.namingConvention.serverPropertyNameToClient;\r\n    entityErrors.forEach(function (e) {\r\n      e.propertyName = e.propertyName && propNameFn(e.propertyName);\r\n    });\r\n    (err as SaveErrorFromServer).entityErrors = entityErrors;\r\n  }\r\n\r\n  err.message = message || \"Server side errors encountered - see the entityErrors collection on this object for more detail\";\r\n  return err;\r\n}\r\n\r\n\r\n/** This is a default, no-op implementation that developers can replace. */\r\nclass DefaultChangeRequestInterceptor {\r\n  constructor(saveContext: SaveContext, saveBundle: SaveBundle) {\r\n\r\n  }\r\n\r\n  getRequest(request: any, entity: Entity, index: number) {\r\n    return request;\r\n  }\r\n\r\n  done(requests: Object[]) {\r\n  }\r\n}\r\n","import { core  } from './core';\r\nimport { assertConfig } from './assert-param';\r\n\r\n/** Configuration info to be passed to the [[ValidationOptions]] constructor */\r\nexport interface ValidationOptionsConfig {\r\n  /** Whether entity and property level validation should occur when entities are attached to the EntityManager \r\n  other than via a query. (default = true) */\r\n  validateOnAttach?: boolean;\r\n  /**  Whether entity and property level validation should occur before entities are saved. \r\n  A failed validation will force the save to fail early. (default = true)  */\r\n  validateOnSave?: boolean;\r\n  /** Whether entity and property level validation should occur after entities are queried from a remote server.\r\n  (default = false)  **/\r\n  validateOnQuery?: boolean;\r\n  /** Whether property level validation should occur after entities are modified.\r\n  (default = true)  **/\r\n  validateOnPropertyChange?: boolean;\r\n}\r\n\r\n/**\r\nA ValidationOptions instance is used to specify the conditions under which validation will be executed.\r\n\r\n*/\r\nexport class ValidationOptions implements ValidationOptionsConfig {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on proto\r\n  /** Whether entity and property level validation should occur when entities are attached to the EntityManager \r\n  other than via a query. (default = true) __Read Only__ */\r\n  declare validateOnAttach: boolean;\r\n  /** Whether entity and property level validation should occur before entities are saved. \r\n  A failed validation will force the save to fail early. (default = true) __Read Only__ */\r\n  declare validateOnSave: boolean;\r\n  /** Whether entity and property level validation should occur after entities are queried from a remote server.\r\n  (default = false) __Read Only__  **/\r\n  declare validateOnQuery: boolean;\r\n  /** Whether property level validation should occur after entities are modified.\r\n  (default = true) __Read Only__ **/\r\n  declare validateOnPropertyChange: boolean;\r\n\r\n\r\n\r\n  /** \r\n  ValidationOptions constructor\r\n  >     var newVo = new ValidationOptions( { validateOnSave: false, validateOnAttach: false });\r\n  >     // assume em1 is a preexisting EntityManager\r\n  >     em1.setProperties( { validationOptions: newVo });\r\n  @param config - A configuration object.\r\n  **/\r\n  constructor(config?: ValidationOptionsConfig) {\r\n    updateWithConfig(this, config);\r\n  }\r\n\r\n\r\n  /**\r\n  Returns a copy of this ValidationOptions with changes to the specified config properties.\r\n  >     var validationOptions = new ValidationOptions();\r\n  >     var newOptions = validationOptions.using( { validateOnQuery: true, validateOnSave: false} );\r\n  @param config - A configuration object\r\n  @return A new ValidationOptions instance.\r\n  **/\r\n  using(config: ValidationOptionsConfig) {\r\n    if (!config) return this;\r\n    let result = new ValidationOptions(this);\r\n    updateWithConfig(result, config);\r\n    return result;\r\n  }\r\n\r\n  /**\r\n  Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.\r\n  The current instance is returned unchanged.\r\n  >     var validationOptions = new ValidationOptions()\r\n  >     var newOptions = validationOptions.using( { validateOnQuery: true, validateOnSave: false} );\r\n  >     var newOptions.setAsDefault();\r\n  **/\r\n  setAsDefault() {\r\n    return core.setAsDefault(this, ValidationOptions);\r\n  }\r\n\r\n  /**\r\n  The default instance for use whenever ValidationOptions are not specified.\r\n  **/\r\n  static defaultInstance = new ValidationOptions({\r\n    validateOnAttach: true,\r\n    validateOnSave: true,\r\n    validateOnQuery: false,\r\n    validateOnPropertyChange: true\r\n  });\r\n}\r\nValidationOptions.prototype._$typeName = \"ValidationOptions\";\r\n\r\nfunction updateWithConfig(options: ValidationOptions, config: ValidationOptionsConfig) {\r\n  if (config) {\r\n    assertConfig(config)\r\n        .whereParam(\"validateOnAttach\").isBoolean().isOptional()\r\n        .whereParam(\"validateOnSave\").isBoolean().isOptional()\r\n        .whereParam(\"validateOnQuery\").isBoolean().isOptional()\r\n        .whereParam(\"validateOnPropertyChange\").isBoolean().isOptional()\r\n        .applyAll(options);\r\n  }\r\n  return options;\r\n}\r\n","import { core } from './core';\r\nimport { assertConfig } from './assert-param';\r\nimport { DataService } from './data-service';\r\n\r\n/** Configuration info to be passed to the [[SaveOptions]] constructor */\r\nexport interface SaveOptionsConfig {\r\n  /** Resource name to be used during the save - this defaults to \"SaveChanges\" */\r\n  resourceName?: string;\r\n  /** The DataService to be used for this save. */\r\n  dataService?: DataService;\r\n  /** Whether multiple saves can be in-flight at the same time. The default is false. */\r\n  allowConcurrentSaves?: boolean;\r\n  /** Free form value that will be sent to the server during the save. */\r\n  tag?: any;\r\n}\r\n\r\n/**\r\nA SaveOptions instance is used to specify the 'options' under which a save will occur.\r\n**/\r\nexport class SaveOptions {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on proto\r\n  /** Resource name to be used during the save - this defaults to \"SaveChanges\". __Read Only__ */\r\n  declare resourceName: string;\r\n  /** The DataService to be used for this save. __Read Only__ */\r\n  declare dataService: DataService;\r\n  /** Whether multiple saves can be in-flight at the same time. The default is false. __Read Only__ */\r\n  declare allowConcurrentSaves: boolean;\r\n  /** Free form value that will be sent to the server during the save. __Read Only__ */\r\n  declare tag: any;\r\n\r\n  /** The default value whenever SaveOptions are not specified. */\r\n  static defaultInstance = new SaveOptions({ allowConcurrentSaves: false});\r\n\r\n  constructor(config?: SaveOptionsConfig) {\r\n    SaveOptions._updateWithConfig(this, config);\r\n  }\r\n\r\n\r\n  /**\r\n  Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.\r\n  The current instance is returned unchanged.\r\n  **/\r\n  setAsDefault() {\r\n    return core.setAsDefault(this, SaveOptions);\r\n  }\r\n\r\n  /**\r\n  Returns a copy of this SaveOptions with the specified config options applied.\r\n  >     var saveOptions = em1.saveOptions.using( {resourceName: \"anotherResource\" });\r\n  **/\r\n  using(config: SaveOptionsConfig) {\r\n    return SaveOptions._updateWithConfig(this, config);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  private static _updateWithConfig(obj: SaveOptions, config: SaveOptionsConfig) {\r\n    if (config) {\r\n      assertConfig(config)\r\n          .whereParam(\"resourceName\").isOptional().isString()\r\n          .whereParam(\"dataService\").isOptional().isInstanceOf(DataService)\r\n          .whereParam(\"allowConcurrentSaves\").isBoolean().isOptional()\r\n          .whereParam(\"tag\").isOptional()\r\n          .applyAll(obj);\r\n    }\r\n    return obj;\r\n  }\r\n\r\n}\r\nSaveOptions.prototype._$typeName = \"SaveOptions\";\r\n\r\n\r\n\r\n","import { EntityType, DataProperty } from './entity-metadata';\r\nimport { EntityKey } from './entity-key';\r\nimport { config } from './config';\r\n\r\ninterface IPropEntry {\r\n  entityType: EntityType;\r\n  propertyName: string;\r\n  keyMap: Record<string, any>;\r\n}\r\n\r\ninterface ITempIdMap {\r\n  [index: string]: IPropEntry;\r\n}\r\n\r\n/*\r\n  @class KeyGenerator\r\n  */\r\nexport class KeyGenerator {\r\n  /** @hidden @internal */\r\n  private _tempIdMap: ITempIdMap;\r\n\r\n\r\n  constructor() {\r\n    // key is dataProperty.name + || + entityType.name, value is propEntry\r\n    // propEntry = { entityType, propertyName, keyMap }\r\n    // keyMap has key of the actual value ( as a string) and a value of null or the real id.\r\n    this._tempIdMap = {};\r\n  }\r\n\r\n\r\n  /*\r\n  Returns a unique 'temporary' id for the specified [[EntityType]].\r\n  Uniqueness is defined for this purpose as being unique within each instance of a KeyGenerator. This is sufficient\r\n  because each EntityManager will have its own instance of a KeyGenerator and any entities imported into\r\n  the EntityManager with temporary keys will have them regenerated and remapped on import.\r\n\r\n  The return value of this method must be of the correct type as determined by the keyProperties of the\r\n  specified EntityType\r\n  @example\r\n      // Assume em1 is a preexisting EntityManager\r\n      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n      let cust1 = custType.createEntity();\r\n      // next line both sets cust1's 'CustomerId' property but also returns the value\r\n      let cid1 = em1.generateTempKeyValue(cust1);\r\n      em1.saveChanges().then( function( data) {\r\n        let sameCust1 = data.results[0];\r\n        // cust1 === sameCust1;\r\n        // but cust1.getProperty(\"CustomerId\") != cid1\r\n        // because the server will have generated a new id\r\n        // and the client will have been updated with this\r\n        // new id.\r\n      });\r\n  @method generateTempKeyValue\r\n  @param entityType {EntityType}\r\n  */\r\n  generateTempKeyValue(entityType: EntityType, valueIfAvail?: boolean) {\r\n    let keyProps = entityType.keyProperties;\r\n    if (keyProps.length > 1) {\r\n      throw new Error(\"Ids can not be autogenerated for entities with multipart keys\");\r\n    }\r\n    let keyProp = keyProps[0];\r\n    let propEntry = this._getPropEntry(keyProp, true);\r\n    let nextId: any;\r\n    if (valueIfAvail != null) {\r\n      if (!propEntry.keyMap[valueIfAvail.toString()]) {\r\n        nextId = valueIfAvail;\r\n      }\r\n    }\r\n\r\n    if (nextId === undefined) {\r\n      let dataType = keyProp.dataType;\r\n      let getNextFn = (dataType as any).getNext;\r\n      if (getNextFn) {\r\n        nextId = getNextFn(this);\r\n        // need to watch out for collision with previously imported ids that might also get generated.\r\n        while (propEntry.keyMap[nextId.toString()] != null) {\r\n          nextId = getNextFn(this);\r\n        }\r\n      } else {\r\n        throw new Error(\"Cannot use a property with a dataType of: \" + dataType.toString() + \" for id generation\");\r\n      }\r\n    }\r\n\r\n    propEntry.keyMap[nextId.toString()] = true;\r\n    return nextId;\r\n  }\r\n\r\n  getTempKeys() {\r\n    let results: EntityKey[] = [];\r\n    //noinspection JSHint\r\n    for (let key in this._tempIdMap) {\r\n      let propEntry = this._tempIdMap[key];\r\n      let entityType = propEntry.entityType;\r\n      // let propName = propEntry.propertyName;\r\n      //noinspection JSHint\r\n      for (let keyValue in propEntry.keyMap) {\r\n        results.push(new EntityKey(entityType, [keyValue]));\r\n      }\r\n    }\r\n    return results;\r\n  }\r\n\r\n\r\n  // proto methods below are not part of the KeyGenerator interface.\r\n\r\n  isTempKey(entityKey: EntityKey) {\r\n    let keyProps = entityKey.entityType.keyProperties;\r\n    if (keyProps.length > 1) return false;\r\n    let keyProp = keyProps[0];\r\n    let propEntry = this._getPropEntry(keyProp);\r\n    if (!propEntry) {\r\n      return false;\r\n    }\r\n    return (propEntry.keyMap[entityKey.values[0].toString()] !== undefined);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  private _getPropEntry(keyProp: DataProperty, createIfMissing = false) {\r\n    let key = keyProp.name + \"..\" + keyProp.parentType.name;\r\n    let propEntry = this._tempIdMap[key];\r\n    if (!propEntry) {\r\n      if (createIfMissing) {\r\n        propEntry = { entityType: keyProp.parentType as EntityType, propertyName: keyProp.name, keyMap: {} };\r\n        this._tempIdMap[key] = propEntry;\r\n      }\r\n    }\r\n    return propEntry;\r\n  }\r\n\r\n}\r\n\r\nconfig.registerType(KeyGenerator, \"KeyGenerator\");\r\n\r\n","import { Entity } from './entity-aspect';\r\nimport { EntityType, DataProperty  } from './entity-metadata';\r\nimport { EntityKey } from './entity-key';\r\nimport { EntityState } from './entity-state';\r\nimport { EntityManager } from './entity-manager';\r\nimport { MergeStrategy } from './query-options';\r\n\r\n/** @hidden @internal */\r\nexport class EntityGroup {\r\n  entityManager: EntityManager;\r\n  entityType: EntityType;\r\n  _indexMap: { [index: string]: number };\r\n  _entities: (Entity | null)[];\r\n  _emptyIndexes: number[];\r\n\r\n  constructor(entityManager: EntityManager, entityType: EntityType) {\r\n    this.entityManager = entityManager;\r\n    this.entityType = entityType;\r\n    // freeze the entityType after the first instance of this type is either created or queried.\r\n    this.entityType.isFrozen = true;\r\n    this._indexMap = {};\r\n    this._entities = [];\r\n    this._emptyIndexes = [];\r\n  }\r\n\r\n\r\n  attachEntity(entity: Entity, entityState: EntityState, mergeStrategy?: MergeStrategy) {\r\n    // entity should already have an aspect.\r\n    let aspect = entity.entityAspect;\r\n\r\n    if (!aspect._initialized) {\r\n      this.entityType._initializeInstance(entity);\r\n    }\r\n    delete aspect._initialized;\r\n\r\n    let keyInGroup = aspect.getKey()._keyInGroup;\r\n    let ix = this._indexMap[keyInGroup];\r\n    if (ix >= 0) {\r\n      // safecast because key was found not ix will not return a null\r\n      let targetEntity = this._entities[ix] as Entity;\r\n      let targetEntityState = targetEntity.entityAspect.entityState;\r\n      let wasUnchanged = targetEntityState.isUnchanged();\r\n      if (targetEntity === entity) {\r\n        aspect.entityState = entityState;\r\n      } else if (mergeStrategy === MergeStrategy.Disallowed) {\r\n        throw new Error(\"A MergeStrategy of 'Disallowed' does not allow you to attach an entity when an entity with the same key is already attached: \" + aspect.getKey());\r\n      } else if (mergeStrategy === MergeStrategy.OverwriteChanges || (mergeStrategy === MergeStrategy.PreserveChanges && wasUnchanged)) {\r\n        // unwrapInstance returns an entity with server side property names - so we need to use DataProperty.getRawValueFromServer these when we apply\r\n        // the property values back to the target.\r\n        let rawServerEntity = this.entityManager.helper.unwrapInstance(entity);\r\n        this.entityType._updateTargetFromRaw(targetEntity, rawServerEntity, DataProperty.getRawValueFromServer);\r\n        targetEntity.entityAspect.setEntityState(entityState);\r\n      }\r\n      return targetEntity;\r\n    } else {\r\n      if (this._emptyIndexes.length === 0) {\r\n        ix = this._entities.push(entity) - 1;\r\n      } else {\r\n        ix = this._emptyIndexes.pop();\r\n        this._entities[ix] = entity;\r\n      }\r\n      this._indexMap[keyInGroup] = ix;\r\n      aspect.entityState = entityState;\r\n      aspect.entityGroup = this;\r\n      aspect.entityManager = this.entityManager;\r\n      return entity;\r\n    }\r\n  }\r\n\r\n  detachEntity(entity: Entity) {\r\n    // by this point we have already determined that this entity\r\n    // belongs to this group.\r\n    let aspect = entity.entityAspect;\r\n    let keyInGroup = aspect.getKey()._keyInGroup;\r\n    let ix = this._indexMap[keyInGroup];\r\n    if (ix === undefined) {\r\n      // shouldn't happen.\r\n      throw new Error(\"internal error - entity cannot be found in group\");\r\n    }\r\n    delete this._indexMap[keyInGroup];\r\n    this._emptyIndexes.push(ix);\r\n    this._entities[ix] = null;\r\n    return entity;\r\n  }\r\n\r\n\r\n  // returns entity based on an entity key defined either as an array of key values or an EntityKey\r\n  findEntityByKey(entityKey: EntityKey) {\r\n    let keyInGroup: string;\r\n    if (entityKey instanceof EntityKey) {\r\n      keyInGroup = entityKey._keyInGroup;\r\n    } else {\r\n      keyInGroup = EntityKey.createKeyString(entityKey);\r\n    }\r\n    let ix = this._indexMap[keyInGroup];\r\n    // can't use just (ix) below because 0 is valid\r\n    let r = (ix !== undefined) ? this._entities[ix] : undefined;\r\n    // coerce null to undefined\r\n    return r == null ? undefined : r;\r\n  }\r\n\r\n  hasChanges() {\r\n    let entities = this._entities;\r\n    let unchanged = EntityState.Unchanged;\r\n    for (let i = 0, len = entities.length; i < len; i++) {\r\n      let e = entities[i];\r\n      if (e && e.entityAspect.entityState !== unchanged) {\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  getChanges() {\r\n    let entities = this._entities;\r\n    let unchanged = EntityState.Unchanged;\r\n    let changes: Entity[] = [];\r\n    for (let i = 0, len = entities.length; i < len; i++) {\r\n      let e = entities[i];\r\n      if (e && e.entityAspect.entityState !== unchanged) {\r\n        changes.push(e);\r\n      }\r\n    }\r\n    return changes;\r\n  }\r\n\r\n  getEntities(entityStates: EntityState[]) {\r\n    let filter = getFilter(entityStates);\r\n    return this._entities.filter(filter) as Entity[];\r\n  }\r\n\r\n  _checkOperation(operationName: string) {\r\n    this._entities.forEach(function (entity) {\r\n      entity && entity.entityAspect._checkOperation(operationName);\r\n    });\r\n    // for chaining;\r\n    return this;\r\n  }\r\n\r\n  // do not expose this method. It is doing a special purpose INCOMPLETE fast detach operation\r\n  // just for the entityManager clear method - the entityGroup will be in an inconsistent state\r\n  // after this op, which is ok because it will be thrown away.\r\n  // TODO: rename this to be clear that it is UNSAFE...\r\n  _clear() {\r\n    this._entities.forEach(function (entity) {\r\n      if (entity != null) {\r\n        entity.entityAspect._detach();\r\n      }\r\n    });\r\n    (this as any)._entities = null;\r\n    (this as any)._indexMap = null;\r\n    (this as any)._emptyIndexes = null;\r\n  }\r\n\r\n  _updateFkVal(fkProp: DataProperty, oldValue: any, newValue: any) {\r\n    let fkPropName = fkProp.name;\r\n    this._entities.forEach(function (entity) {\r\n      if (entity != null) {\r\n        if (entity.getProperty(fkPropName) === oldValue) {\r\n          entity.setProperty(fkPropName, newValue);\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  _fixupKey(tempValue: any, realValue: any) {\r\n    // single part keys appear directly in map\r\n    let ix = this._indexMap[tempValue];\r\n    if (ix === undefined) {\r\n      throw new Error(\"Internal Error in key fixup - unable to locate entity\");\r\n    }\r\n    let entity = this._entities[ix] as Entity;\r\n    let keyPropName = entity.entityType.keyProperties[0].name;\r\n    // fks on related entities will automatically get updated by this as well\r\n    entity.setProperty(keyPropName, realValue);\r\n    delete entity.entityAspect.hasTempKey;\r\n    delete this._indexMap[tempValue];\r\n    this._indexMap[realValue] = ix;\r\n  }\r\n\r\n  _replaceKey(oldKey: EntityKey, newKey: EntityKey) {\r\n    let ix = this._indexMap[oldKey._keyInGroup];\r\n    delete this._indexMap[oldKey._keyInGroup];\r\n    this._indexMap[newKey._keyInGroup] = ix;\r\n  }\r\n\r\n}\r\n\r\nfunction getFilter(entityStates: EntityState[]) {\r\n  if (entityStates.length === 0) {\r\n    return function (e: Entity) {\r\n      return !!e;\r\n    };\r\n  } else if (entityStates.length === 1) {\r\n    let entityState = entityStates[0];\r\n    return function (e: Entity) {\r\n      return !!e && e.entityAspect.entityState === entityState;\r\n    };\r\n  } else {\r\n    return function (e: Entity) {\r\n      return !!e && -1 !== entityStates.indexOf(e.entityAspect.entityState);\r\n    };\r\n  }\r\n}\r\n\r\n\r\n// do not expose EntityGroup - internal only\r\n\r\n\r\n","import { DataServiceAdapter } from './interface-registry';\r\nimport { core } from './core';\r\nimport { DataType  } from './data-type';\r\nimport { DataService, JsonResultsAdapter, NodeContext, NodeMeta } from './data-service';\r\nimport { EntityState  } from './entity-state';\r\nimport { EntityAction } from './entity-action';\r\nimport { MetadataStore, EntityType, StructuralType, DataProperty, NavigationProperty } from './entity-metadata';\r\nimport { EntityManager } from './entity-manager';\r\nimport { MergeStrategy } from './query-options';\r\nimport { Entity } from './entity-aspect';\r\nimport { EntityQuery } from './entity-query';\r\n\r\n\r\n/**\r\nFor use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation. \r\n@adapter (see [[IDataServiceAdapter]])    \r\n@hidden \r\n*/\r\nexport interface MergeOptions {\r\n  mergeStrategy: MergeStrategy;\r\n  includeDeleted?: boolean;\r\n  noTracking?: boolean;\r\n}\r\n\r\n/** @hidden */\r\nexport interface MappingContextConfig {\r\n  dataService: DataService;\r\n  query?: EntityQuery | string;\r\n  entityManager: EntityManager;\r\n  mergeOptions: MergeOptions;\r\n}\r\n\r\n/**\r\nFor use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation. \r\n@adapter (see [[IDataServiceAdapter]])    \r\n@hidden \r\n*/\r\nexport class MappingContext {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // on prototype\r\n\r\n  rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.\r\n\r\n  declare dataService: DataService;\r\n  declare query: EntityQuery | string;\r\n  declare entityManager: EntityManager;\r\n  declare mergeOptions: MergeOptions;\r\n  declare adapter: DataServiceAdapter;  // assigned in the AbstractDataServiceAdapter.\r\n\r\n  declare refMap: Record<string, any>; // TODO\r\n  declare deferredFns: Function[]; // TODO\r\n  declare jsonResultsAdapter: JsonResultsAdapter;\r\n  declare metadataStore: MetadataStore;\r\n\r\n  constructor(config: MappingContextConfig) {\r\n\r\n    core.extend(this, config, [\r\n      \"query\", \"entityManager\", \"dataService\", \"mergeOptions\"\r\n    ]);\r\n\r\n    // calc'd props\r\n    this.refMap = {};\r\n    this.deferredFns = [];\r\n    this.jsonResultsAdapter = this.dataService.jsonResultsAdapter;\r\n    this.metadataStore = this.entityManager.metadataStore;\r\n    this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.\r\n  }\r\n\r\n  getUrl() {\r\n    let query = this.query;\r\n    if (!query) {\r\n      throw new Error(\"query cannot be empty\");\r\n    }\r\n    let uriString: string;\r\n    if (typeof query === 'string') {\r\n      uriString = query;\r\n    } else if (query instanceof EntityQuery) {\r\n      uriString = this.dataService.uriBuilder!.buildUri(query, this.metadataStore);\r\n    } else {\r\n      throw new Error(\"unable to recognize query parameter as either a string or an EntityQuery\");\r\n    }\r\n    return this.dataService.qualifyUrl(uriString);\r\n  }\r\n\r\n  visitAndMerge(nodes: any[], nodeContext: any) {\r\n    let query = this.query;\r\n    let jra = this.jsonResultsAdapter;\r\n    nodeContext = nodeContext || {};\r\n    let that = this;\r\n    let result = core.map(nodes, function (node) {\r\n      if (query == null && node.entityAspect) {\r\n        // don't bother merging a result from a save that was not returned from the server.\r\n        if (node.entityAspect.entityState.isDeleted()) {\r\n          that.entityManager.detachEntity(node);\r\n        } else {\r\n          node.entityAspect.acceptChanges();\r\n        }\r\n        return node;\r\n      }\r\n\r\n      let meta = jra.visitNode(node, that, nodeContext) || {};\r\n      node = meta.node || node;\r\n      if (query && nodeContext.nodeType === \"root\" && !meta.entityType) {\r\n        meta.entityType = query instanceof EntityQuery &&  query._getToEntityType && query._getToEntityType(that.metadataStore);\r\n      }\r\n      return processMeta(that, node, meta);\r\n    }, this.mergeOptions.includeDeleted);\r\n\r\n    if (result.filter && !this.mergeOptions.includeDeleted) {\r\n      // result may have deleted entities because related nodes were processed\r\n      result = result.filter((x: any) => x && (!x.entityAspect || !x.entityAspect.entityState.isDeleted()));\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  processDeferred() {\r\n    if (this.deferredFns.length > 0) {\r\n      this.deferredFns.forEach((fn) => {\r\n        fn();\r\n      });\r\n    }\r\n  }\r\n}\r\nMappingContext.prototype._$typeName = \"MappingContext\";\r\n\r\n\r\nfunction processMeta(mc: MappingContext, node: any, meta: NodeMeta, assignFn?: (val: any) => void) {\r\n  // == is deliberate here instead of ===\r\n  if (meta.ignore || node == null) {\r\n    return null;\r\n  } else if (meta.nodeRefId) {\r\n    let refValue = resolveEntityRef(mc, meta.nodeRefId);\r\n    if (typeof refValue === \"function\" && assignFn != null) {\r\n      mc.deferredFns.push(function () {\r\n        assignFn(refValue);\r\n      });\r\n      return undefined; // deferred and will be set later;\r\n    }\r\n    return refValue;\r\n  } else if (meta.entityType) {\r\n    let entityType = meta.entityType;\r\n    if (mc.mergeOptions.noTracking) {\r\n      node = processNoMerge(mc, entityType, node);\r\n      if (entityType.noTrackingFn) {\r\n        node = entityType.noTrackingFn(node, entityType);\r\n      }\r\n      if (meta.nodeId) {\r\n        mc.refMap[meta.nodeId] = node;\r\n      }\r\n      return node;\r\n    } else {\r\n      if (entityType.isComplexType) {\r\n        // because we still need to do serverName to client name processing\r\n        return processNoMerge(mc, entityType, node);\r\n      } else {\r\n        return mergeEntity(mc, node, meta);\r\n      }\r\n    }\r\n  } else {\r\n\r\n    if ((!meta.passThru) && typeof node === 'object' && ! core.isDate(node)) {\r\n      node = processAnonType(mc, node);\r\n    }\r\n\r\n    // updating the refMap for entities is handled by updateEntityRef for entities.\r\n    if (meta.nodeId) {\r\n      mc.refMap[meta.nodeId] = node;\r\n    }\r\n    return node;\r\n  }\r\n}\r\n\r\nfunction processNoMerge(mc: MappingContext, stype: StructuralType, node: any) {\r\n  let result = {} as Record<string, any>;\r\n\r\n  stype.dataProperties.forEach(function (dp) {\r\n    if (dp.isComplexProperty) {\r\n      result[dp.name] = core.map(node[dp.nameOnServer], (v: any) => {\r\n        return processNoMerge(mc, dp.dataType as any, v);\r\n      });\r\n    } else {\r\n      result[dp.name] = DataType.parseRawValue(node[dp.nameOnServer], dp.dataType as DataType);\r\n    }\r\n  });\r\n\r\n  (stype instanceof EntityType) && stype.navigationProperties.forEach( (np) => {\r\n    let nodeContext = { nodeType: \"navProp\", navigationProperty: np };\r\n    visitNode(node[np.nameOnServer], mc, nodeContext, result, np.name);\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction processAnonType(mc: MappingContext, node: any) {\r\n  // node is guaranteed to be an object by this point, i.e. not a scalar\r\n  let keyFn = mc.metadataStore.namingConvention.serverPropertyNameToClient;\r\n  let result = {};\r\n\r\n  core.objectForEach(node, function (key, value) {\r\n    let newKey = keyFn(key);\r\n    let nodeContext = { nodeType: \"anonProp\", propertyName: newKey };\r\n    visitNode(value, mc, nodeContext, result, newKey);\r\n  });\r\n  return result;\r\n}\r\n\r\nfunction visitNode(node: any, mc: MappingContext, nodeContext: NodeContext, result: Record<string, any>, key: string) {\r\n  let jra = mc.jsonResultsAdapter;\r\n  let meta = jra.visitNode(node, mc, nodeContext) || {};\r\n  // allows visitNode to change the value;\r\n  node = meta.node || node;\r\n\r\n  if (meta.ignore) return;\r\n  if (meta.passThru) return node;\r\n  if (Array.isArray(node)) {\r\n    nodeContext.nodeType = nodeContext.nodeType + \"Item\";\r\n    result[key] = node.map(function (v, ix) {\r\n      meta = jra.visitNode(v, mc, nodeContext) || {};\r\n      v = meta.node || v;\r\n      return processMeta(mc, v, meta, function (refValue) {\r\n        result[key][ix] = refValue();\r\n      });\r\n    });\r\n  } else {\r\n    result[key] = processMeta(mc, node, meta, function (refValue) {\r\n      result[key] = refValue();\r\n    });\r\n  }\r\n}\r\n\r\nfunction resolveEntityRef(mc: MappingContext, nodeRefId: string) {\r\n  let entity = mc.refMap[nodeRefId];\r\n  if (entity === undefined) {\r\n    return function () {\r\n      return mc.refMap[nodeRefId];\r\n    };\r\n  } else {\r\n    return entity;\r\n  }\r\n}\r\n\r\nfunction updateEntityRef(mc: MappingContext, targetEntity: any, node: any) {\r\n  let nodeId = node._$meta.nodeId;\r\n  if (!nodeId && node._$meta.extraMetadata) {\r\n    // odata case.  refMap isn't really used, but is returned as data.retrievedEntities, so we populated it anyway.\r\n    nodeId = node._$meta.extraMetadata.uriKey;\r\n  }\r\n  if (nodeId != null) {\r\n    mc.refMap[nodeId] = targetEntity;\r\n  }\r\n}\r\n\r\n// can return null for a deleted entity if includeDeleted == false\r\nfunction mergeEntity(mc: MappingContext, node: any, meta: NodeMeta) {\r\n  node._$meta = meta;\r\n  let em = mc.entityManager;\r\n\r\n  let entityType = meta.entityType as EntityType;\r\n  if (typeof (entityType) === 'string') {\r\n    entityType = mc.metadataStore._getStructuralType(entityType, false) as EntityType;\r\n  }\r\n  node.entityType = entityType;\r\n\r\n  let mergeStrategy = mc.mergeOptions.mergeStrategy;\r\n  let isSaving = mc.query == null;\r\n\r\n  let entityKey = entityType.getEntityKeyFromRawEntity(node, mc.rawValueFn);\r\n  let targetEntity = em.getEntityByKey(entityKey);\r\n  if (targetEntity) {\r\n    if (isSaving && targetEntity.entityAspect.entityState.isDeleted()) {\r\n      em.detachEntity(targetEntity);\r\n      return targetEntity;\r\n    }\r\n    let targetEntityState = targetEntity.entityAspect.entityState;\r\n    if (mergeStrategy === MergeStrategy.Disallowed) {\r\n      throw new Error(\"A MergeStrategy of 'Disallowed' prevents \" + entityKey.toString() + \" from being merged\");\r\n    } else if (mergeStrategy === MergeStrategy.SkipMerge) {\r\n      updateEntityNoMerge(mc, targetEntity, node);\r\n    } else {\r\n      if (mergeStrategy === MergeStrategy.OverwriteChanges\r\n        || targetEntityState.isUnchanged()) {\r\n        updateEntity(mc, targetEntity, node);\r\n        targetEntity.entityAspect.wasLoaded = true;\r\n        if (meta.extraMetadata) {\r\n          targetEntity.entityAspect.extraMetadata = meta.extraMetadata;\r\n        }\r\n        targetEntity.entityAspect.entityState = EntityState.Unchanged;\r\n        clearOriginalValues(targetEntity);\r\n        // propertyName not specified because multiple props EntityChangedEventArgs\r\n        targetEntity.entityAspect.propertyChanged.publish({ entity: targetEntity, propertyName: null });\r\n        let action = isSaving ? EntityAction.MergeOnSave : EntityAction.MergeOnQuery;\r\n        em.entityChanged.publish({ entityAction: action, entity: targetEntity });\r\n        // this is needed to handle an overwrite of a modified entity with an unchanged entity\r\n        // which might in turn cause _hasChanges to change.\r\n        if (!targetEntityState.isUnchanged()) {\r\n          em._notifyStateChange(targetEntity, false);\r\n        }\r\n      } else {\r\n        // process targetEntity (even if deleted) to ensure related nodes are handled\r\n        updateEntityNoMerge(mc, targetEntity, node);\r\n        if (targetEntityState === EntityState.Deleted && !mc.mergeOptions.includeDeleted) {\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n  } else {\r\n    targetEntity = entityType._createInstanceCore() as Entity;\r\n\r\n    updateEntity(mc, targetEntity, node);\r\n\r\n    if (meta.extraMetadata) {\r\n      targetEntity.entityAspect.extraMetadata = meta.extraMetadata;\r\n    }\r\n    // em._attachEntityCore(targetEntity, EntityState.Unchanged, MergeStrategy.Disallowed);\r\n    em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy);\r\n    targetEntity.entityAspect.wasLoaded = true;\r\n    em.entityChanged.publish({ entityAction: EntityAction.AttachOnQuery, entity: targetEntity });\r\n  }\r\n  return targetEntity;\r\n}\r\n\r\n// copied from entityAspect\r\nfunction clearOriginalValues(target: any) {\r\n  let aspect = target.entityAspect || target.complexAspect;\r\n  aspect.originalValues = {};\r\n  let stype = target.entityType || target.complexType;\r\n  stype.complexProperties.forEach(function (cp: any) {\r\n    let cos = target.getProperty(cp.name);\r\n    if (cp.isScalar) {\r\n      clearOriginalValues(cos);\r\n    } else {\r\n      cos._acceptChanges();\r\n      cos.forEach(clearOriginalValues);\r\n    }\r\n  });\r\n}\r\n\r\n\r\nfunction updateEntityNoMerge(mc: MappingContext, targetEntity: Entity, node: any) {\r\n  updateEntityRef(mc, targetEntity, node);\r\n  // we still need to merge related entities even if top level entity wasn't modified.\r\n  node.entityType.navigationProperties.forEach(function (np: NavigationProperty) {\r\n    if (np.isScalar) {\r\n      mergeRelatedEntityCore(mc, node, np);\r\n    } else {\r\n      mergeRelatedEntitiesCore(mc, node, np);\r\n    }\r\n  });\r\n}\r\n\r\nfunction updateEntity(mc: MappingContext, targetEntity: Entity, node: any) {\r\n  updateEntityRef(mc, targetEntity, node);\r\n  let entityType = targetEntity.entityType;\r\n  entityType._updateTargetFromRaw(targetEntity, node, mc.rawValueFn);\r\n\r\n  entityType.navigationProperties.forEach(function (np) {\r\n    if (np.isScalar) {\r\n      mergeRelatedEntity(mc, np, targetEntity, node);\r\n    } else {\r\n      mergeRelatedEntities(mc, np, targetEntity, node);\r\n    }\r\n  });\r\n}\r\n\r\nfunction mergeRelatedEntity(mc: MappingContext, navigationProperty: NavigationProperty, targetEntity: Entity, rawEntity: any) {\r\n\r\n  let relatedEntity = mergeRelatedEntityCore(mc, rawEntity, navigationProperty);\r\n  if (relatedEntity == null) return;\r\n  if (typeof relatedEntity === 'function') {\r\n    mc.deferredFns.push(function () {\r\n      relatedEntity = relatedEntity();\r\n      updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);\r\n    });\r\n  } else {\r\n    updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);\r\n  }\r\n}\r\n\r\nfunction mergeRelatedEntities(mc: MappingContext, navigationProperty: NavigationProperty, targetEntity: Entity, rawEntity: any) {\r\n  let relatedEntities = mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty);\r\n  if (relatedEntities == null) return;\r\n\r\n  let inverseProperty = navigationProperty.inverse;\r\n  if (!inverseProperty) return;\r\n\r\n  let originalRelatedEntities = targetEntity.getProperty(navigationProperty.name);\r\n  originalRelatedEntities.wasLoaded = true;\r\n\r\n  relatedEntities.forEach(function (relatedEntity: any) {\r\n    if (typeof relatedEntity === 'function') {\r\n      mc.deferredFns.push(function () {\r\n        relatedEntity = relatedEntity();\r\n        updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty as NavigationProperty);\r\n      });\r\n    } else {\r\n      updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty as NavigationProperty);\r\n    }\r\n  });\r\n}\r\n\r\nfunction mergeRelatedEntityCore(mc: MappingContext, rawEntity: any, navigationProperty: NavigationProperty) {\r\n  let relatedRawEntity = rawEntity[navigationProperty.nameOnServer];\r\n  if (!relatedRawEntity) return null;\r\n\r\n  let relatedEntity = mc.visitAndMerge(relatedRawEntity, { nodeType: \"navProp\", navigationProperty: navigationProperty });\r\n  return relatedEntity;\r\n}\r\n\r\nfunction mergeRelatedEntitiesCore(mc: MappingContext, rawEntity: any, navigationProperty: NavigationProperty) {\r\n  let relatedRawEntities = rawEntity[navigationProperty.nameOnServer];\r\n  if (!relatedRawEntities) return null;\r\n\r\n  // needed if what is returned is not an array and we expect one - this happens with __deferred in OData.\r\n  if (!Array.isArray(relatedRawEntities)) {\r\n    // return null;\r\n    relatedRawEntities = relatedRawEntities.results; // OData v3 will look like this with an expand\r\n    if (!relatedRawEntities) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  let relatedEntities = mc.visitAndMerge(relatedRawEntities, { nodeType: \"navPropItem\", navigationProperty: navigationProperty });\r\n  return relatedEntities;\r\n}\r\n\r\nfunction updateRelatedEntity(relatedEntity: Entity, targetEntity: Entity, navigationProperty: NavigationProperty) {\r\n  if (!relatedEntity) return;\r\n  let propName = navigationProperty.name;\r\n  let currentRelatedEntity = targetEntity.getProperty(propName);\r\n\r\n  // check if the related entity is already hooked up\r\n  if (currentRelatedEntity !== relatedEntity) {\r\n    // if not hook up both directions.\r\n    targetEntity.setProperty(propName, relatedEntity);\r\n    let inverseProperty = navigationProperty.inverse;\r\n    if (!inverseProperty) return;\r\n    if (inverseProperty.isScalar) {\r\n      relatedEntity.setProperty(inverseProperty.name, targetEntity);\r\n    } else {\r\n      let collection = relatedEntity.getProperty(inverseProperty.name);\r\n      collection.push(targetEntity);\r\n\r\n    }\r\n  }\r\n}\r\n\r\nfunction updateRelatedEntityInCollection(mc: MappingContext, relatedEntity: Entity | undefined,\r\n    relatedEntities: Entity[], targetEntity: Entity, inverseProperty: NavigationProperty) {\r\n  if (!relatedEntity) return;\r\n\r\n  // don't update relatedCollection if preserveChanges & relatedEntity has an fkChange.\r\n  if (relatedEntity.entityAspect.entityState === EntityState.Modified\r\n    && mc.mergeOptions.mergeStrategy === MergeStrategy.PreserveChanges) {\r\n    let origValues = relatedEntity.entityAspect.originalValues;\r\n    let fkWasModified = inverseProperty.relatedDataProperties.some(function (dp) {\r\n      return origValues[dp.name] != undefined;\r\n    });\r\n    if (fkWasModified) return;\r\n  }\r\n  // check if the related entity is already hooked up\r\n  let thisEntity = relatedEntity.getProperty(inverseProperty.name);\r\n\r\n  if (thisEntity !== targetEntity) {\r\n    // if not - hook it up.\r\n    relatedEntities.push(relatedEntity);\r\n    relatedEntity.setProperty(inverseProperty.name, targetEntity);\r\n  }\r\n}\r\n\r\n\r\n","import { core } from './core';\r\nimport { Entity } from './entity-aspect';\r\nimport { NavigationProperty } from './entity-metadata';\r\nimport { EntityKey } from './entity-key';\r\n\r\n/** @hidden @internal */\r\nexport interface INavTuple {\r\n  navigationProperty: NavigationProperty;\r\n  children: Entity[];\r\n}\r\n\r\n/** @hidden @internal */\r\n// Represents entities not yet attached to navigationProperties. \r\nexport class UnattachedChildrenMap {\r\n  // key is EntityKey.toString(), value is array of { navigationProperty, children }\r\n  map: { [index: string]: INavTuple[] } = {};\r\n\r\n\r\n  addChild(parentEntityKey: EntityKey, navigationProperty: NavigationProperty, child: Entity) {\r\n    let tuple = this.getTuple(parentEntityKey, navigationProperty);\r\n    if (!tuple) {\r\n      tuple = { navigationProperty: navigationProperty, children: [] };\r\n      core.getArray(this.map, parentEntityKey.toString()).push(tuple);\r\n    }\r\n    tuple.children.push(child);\r\n  }\r\n\r\n  removeChildren(parentEntityKeyString: string, navigationProperty: NavigationProperty) {\r\n    let tuples = this.map[parentEntityKeyString];\r\n    if (!tuples) return;\r\n    core.arrayRemoveItem(tuples, (t: any) => {\r\n      return t.navigationProperty === navigationProperty;\r\n    });\r\n    if (!tuples.length) {\r\n      delete this.map[parentEntityKeyString];\r\n    }\r\n  }\r\n\r\n  getTuple(parentEntityKey: EntityKey, navigationProperty: NavigationProperty) {\r\n    let tuples = this.getTuples(parentEntityKey);\r\n    if (!tuples) return null;\r\n    let tuple = core.arrayFirst(tuples, function (t) {\r\n      return t.navigationProperty === navigationProperty;\r\n    });\r\n    return tuple;\r\n  }\r\n\r\n  getTuples(parentEntityKey: EntityKey) {\r\n    let allTuples: INavTuple[] = [];\r\n    let tuples = this.map[parentEntityKey.toString()];\r\n    if (tuples) {\r\n      allTuples = allTuples.concat(tuples);\r\n    }\r\n    let entityType = parentEntityKey.entityType;\r\n    while (entityType.baseEntityType) {\r\n      entityType = entityType.baseEntityType;\r\n      let baseKey = parentEntityKey.toString(entityType);\r\n      tuples = this.map[baseKey];\r\n      if (tuples) {\r\n        allTuples = allTuples.concat(tuples);\r\n      }\r\n    }\r\n    return (allTuples.length) ? allTuples : undefined;\r\n  }\r\n\r\n  getTuplesByString(parentEntityKeyString: string) {\r\n    return this.map[parentEntityKeyString];\r\n  }\r\n\r\n}\r\n","import { DataServiceAdapter } from './interface-registry';\r\nimport { core, Callback, ErrorCallback } from './core';\r\nimport { assertParam, assertConfig } from './assert-param';\r\nimport { config } from './config';\r\nimport { BreezeEvent } from './event';\r\nimport { EntityAspect, Entity, ComplexObject, StructuralObject, PropertyChangedEventArgs } from './entity-aspect';\r\nimport { MetadataStore, EntityType, ComplexType, DataProperty, NavigationProperty, AutoGeneratedKeyType } from './entity-metadata';\r\nimport { EntityKey } from './entity-key';\r\nimport { EntityAction  } from './entity-action';\r\nimport { EntityState } from './entity-state';\r\nimport { DataService } from './data-service';\r\nimport { DataType } from './data-type';\r\nimport { ValidationError } from './validate';\r\nimport { ValidationOptions } from './validation-options';\r\nimport { QueryOptions, MergeStrategy, FetchStrategy } from './query-options';\r\nimport { SaveOptions } from './save-options';\r\nimport { KeyGenerator } from './key-generator';\r\nimport { EntityGroup } from './entity-group';\r\nimport { MappingContext } from './mapping-context';\r\nimport { EntityQuery } from './entity-query';\r\nimport { UnattachedChildrenMap } from './unattached-children-map';\r\n\r\nexport interface HttpResponse {\r\n  config: any;\r\n  data: any;\r\n  error?: any;\r\n  saveContext?: any;\r\n  status: number;\r\n  getHeaders(headerName: string): string;\r\n}\r\n\r\nexport interface ImportResult {\r\n  entities: Entity[];\r\n  tempKeyMapping: ITempKeyMap;\r\n}\r\n\r\n// subclasses of Error\r\n\r\n/** Base shape of any errors returned from the server. */\r\nexport interface ServerError extends Error {\r\n  httpResponse: HttpResponse;\r\n  status: number;\r\n  message: string;\r\n  statusText?: string;\r\n  body?: any;\r\n  url?: string;\r\n}\r\n\r\n/** Shape of a save error returned from the server. \r\nFor use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation. \r\n@adapter (see [[IDataServiceAdapter]])    \r\n@hidden @internal \r\n*/\r\nexport interface SaveErrorFromServer extends ServerError {\r\n  entityErrors: EntityErrorFromServer[];\r\n}\r\n\r\n/** Shape of a save error when returned to the client. */\r\nexport interface SaveError extends ServerError {\r\n  entityErrors: EntityError[];\r\n}\r\n\r\n// not subclasses of Error\r\n/** \r\nFor use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation. \r\n@adapter (see [[IDataServiceAdapter]])    \r\n@hidden @internal \r\n*/\r\nexport interface EntityErrorFromServer {\r\n  entityTypeName: string;\r\n  keyValues: any[];\r\n\r\n  errorName: string;\r\n  errorMessage: string;\r\n  propertyName: string;\r\n  custom?: any;\r\n}\r\n\r\n/** Shape of an error on a specific entity.  Part of a [[ISaveError]] */\r\nexport interface EntityError {\r\n  entity: Entity;\r\n  errorName: string;\r\n  errorMessage: string;\r\n  propertyName: string;\r\n  isServerError: boolean;\r\n  custom?: any;\r\n}\r\n\r\n/** The shape of the Promise returned by an [[EntityManager.executeQuery]] call. */\r\nexport interface QueryResult {\r\n  /** Top level entities returned.  Excludes entities that are Deleted. */\r\n  results: any[];\r\n  /** Query that was executed */\r\n  query: EntityQuery | string;\r\n  /** EntityManager that executed the query */\r\n  entityManager?: EntityManager;\r\n  /** Total number of results available on the server */\r\n  inlineCount?: number;\r\n  /** All entities returned by the query.  Differs from `results` when an expand is used.  Includes entities that are Deleted. */\r\n  retrievedEntities?: Entity[];\r\n    /** Raw response from the server */\r\n  httpResponse?: HttpResponse;\r\n}\r\n\r\nexport interface QuerySuccessCallback {\r\n  (data: QueryResult): void;\r\n}\r\n\r\nexport interface QueryErrorCallback {\r\n  (error: { query: EntityQuery; httpResponse: HttpResponse; entityManager: EntityManager; message?: string; stack?: string }): void;\r\n}\r\n\r\n/** Key mapping information returned as part of an [[ISaveResult]]. */\r\nexport interface KeyMapping {\r\n  entityTypeName: string;\r\n  tempValue: any;\r\n  realValue: any;\r\n}\r\n\r\ninterface ITempKeyMap {\r\n  [index: string]: EntityKey;\r\n}\r\n\r\n/** Configuration info to be passed to the [[EntityManager.importEntities]] method */\r\nexport interface ImportConfig {\r\n  /** If true, merge Added entities (with temp keys) as well.  This can be dangerous. */\r\n  mergeAdds?: boolean;\r\n  mergeStrategy?: MergeStrategy;  \r\n  metadataVersionFn?: (arg: { metadataVersion: any, metadataStoreName: any }) => void;\r\n}\r\n\r\ninterface ImportConfigExt extends ImportConfig {\r\n  tempKeyMap?: ITempKeyMap;\r\n}\r\n\r\n/** The shape of the Promise returned by an [[EntityManager.saveChanges]] call. */\r\nexport interface SaveResult {\r\n  entities: Entity[];\r\n  keyMappings: KeyMapping[];\r\n  deletedKeys?: { entityTypeName: string, keyValues: any[]}[];\r\n  httpResponse?: HttpResponse;\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation. \r\n@adapter (see [[IDataServiceAdapter]])    \r\n@hidden \r\n*/\r\nexport interface SaveContext {\r\n  entityManager: EntityManager;\r\n  dataService: DataService;\r\n  processSavedEntities: (saveResult: SaveResult) => Entity[];\r\n  resourceName: string;\r\n  adapter?: DataServiceAdapter;\r\n  routePrefix?: string;\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation. \r\n@adapter (see [[IDataServiceAdapter]])    \r\n@hidden \r\n*/\r\nexport interface SaveBundle {\r\n  entities: Entity[];\r\n  saveOptions: SaveOptions;\r\n}\r\n\r\n/** Configuration info to be passed to the [[EntityManager]] constructor */\r\nexport interface EntityManagerConfig {\r\n  /** The service name associated with this EntityManager.  **/\r\n  serviceName?: string;\r\n  /** The DataService associated with this EntityManager. **/\r\n  dataService?: DataService;\r\n  /** The [[QueryOptions]] associated with this EntityManager.  **/\r\n  queryOptions?: QueryOptions;\r\n  /** The [[SaveOptions]] associated with this EntityManager. **/\r\n  saveOptions?: SaveOptions;\r\n  /** The [[ValidationOptions]] associated with this EntityManager.  **/\r\n  validationOptions?: ValidationOptions;\r\n  /** The [[KeyGenerator]] associated with this EntityManager. **/\r\n  keyGenerator?: KeyGenerator;\r\n  /** The [[KeyGenerator]] constructor associated with this EntityManager. **/\r\n  keyGeneratorCtor?: { new (): KeyGenerator }; // TODO: review this\r\n  /** The [[MetadataStore]] associated with this EntityManager. **/\r\n  metadataStore?: MetadataStore;\r\n}\r\n\r\n/** The shape returned by callbacks registered with [[EntityManager.entityChanged]] event */\r\nexport interface EntityChangedEventArgs {\r\n  entityAction: EntityAction;\r\n  entity?: Entity;\r\n  args?: PropertyChangedEventArgs;\r\n}\r\n\r\nexport interface ValidationErrorsChangedEventArgs {\r\n  entity: Entity; \r\n  added: ValidationError[]; \r\n  removed: ValidationError[];\r\n}\r\n\r\nexport interface HasChangesChangedEventArgs {\r\n  entityManager: EntityManager; \r\n  hasChanges: boolean;\r\n}\r\n\r\n/**\r\nInstances of the EntityManager contain and manage collections of entities, either retrieved from a backend datastore or created on the client.\r\n**/\r\nexport class EntityManager {\r\n  /** @hidden @internal */\r\n  declare _$typeName: string; // actually defined on prototype\r\n\r\n  /** The service name associated with this EntityManager. __Read Only__ **/\r\n  declare serviceName: string;\r\n  /** The DataService associated with this EntityManager. __Read Only__ **/\r\n  declare dataService: DataService;\r\n  /** The [[QueryOptions]] associated with this EntityManager. __Read Only__ **/\r\n  declare queryOptions: QueryOptions;\r\n  /** The [[SaveOptions]] associated with this EntityManager. __Read Only__ **/\r\n  declare saveOptions: SaveOptions;\r\n  /** The [[ValidationOptions]] associated with this EntityManager. __Read Only__ **/\r\n  declare validationOptions: ValidationOptions;\r\n  /** The [[KeyGenerator]] associated with this EntityManager. __Read Only__ **/\r\n  declare keyGenerator: KeyGenerator;\r\n  /** The [[KeyGenerator]] constructor associated with this EntityManager. __Read Only__ **/\r\n  declare keyGeneratorCtor: { new (): KeyGenerator }; // TODO: review this\r\n  /** The [[MetadataStore]] associated with this EntityManager. __Read Only__ **/\r\n  declare metadataStore: MetadataStore;\r\n  declare isLoading: boolean;\r\n  declare isRejectingChanges: boolean;\r\n\r\n  // events\r\n  /**\r\n  A [[BreezeEvent]] that fires whenever a change to any entity in this EntityManager occurs. __Read Only__\r\n\r\n  @eventArgs - \r\n  - entityAction - The [[EntityAction]] that occured.\r\n  - entity - The entity that changed.  If this is null, then all entities in the entityManager were affected.\r\n  - args - Additional information about this event. This will differ based on the entityAction.\r\n\r\n  >      let em = new EntityManager( {serviceName: \"breeze/NorthwindIBModel\" });\r\n  >      em.entityChanged.subscribe(function(changeArgs) {\r\n  >          // This code will be executed any time any entity within the entityManager \r\n  >          // is added, modified, deleted or detached for any reason.\r\n  >          let action = changeArgs.entityAction;\r\n  >          let entity = changeArgs.entity;\r\n  >          // .. do something to this entity when it is changed.\r\n  >      });\r\n  >  });\r\n  @event\r\n  **/\r\n  entityChanged: BreezeEvent<EntityChangedEventArgs>;\r\n\r\n  /**\r\n  An [[BreezeEvent]] that fires whenever validationErrors change for any entity in this EntityManager. __Read Only__\r\n  @eventArgs -\r\n    - entity - The entity on which the validation errors have been added or removed.\r\n    - added - An array containing any newly added [[ValidationError]]s\r\n    - removed - An array containing any newly removed [[ValidationError]]s. This is those errors that have been 'fixed'  \r\n\r\n  >      let em = new EntityManager( {serviceName: \"breeze/NorthwindIBModel\" });\r\n  >      em.validationErrorsChanged.subscribe(function(changeArgs) {\r\n  >              // This code will be executed any time any entity within the entityManager experiences a change to its validationErrors collection.\r\n  >              function (validationChangeArgs) {\r\n  >                  let entity == validationChangeArgs.entity;\r\n  >                  let errorsAdded = validationChangeArgs.added;\r\n  >                  let errorsCleared = validationChangeArgs.removed;\r\n  >                  // ... do something interesting with the order.\r\n  >              });\r\n  >          });\r\n  >      });\r\n  @event\r\n  **/\r\n  validationErrorsChanged: BreezeEvent<ValidationErrorsChangedEventArgs>;\r\n\r\n  /**\r\n  A [[BreezeEvent]] that fires whenever an EntityManager transitions to or from having changes. __Read Only__\r\n  @eventArgs -\r\n    - entityManager - The EntityManager whose 'hasChanges' status has changed.\r\n    - hasChanges - Whether or not this EntityManager has changes.\r\n\r\n  >      let em = new EntityManager( {serviceName: \"breeze/NorthwindIBModel\" });\r\n  >      em.hasChangesChanged.subscribe(function(args) {\r\n  >              let hasChangesChanged = args.hasChanges;\r\n  >              let entityManager = args.entityManager;\r\n  >          });\r\n  >      });\r\n  @event \r\n  **/\r\n  hasChangesChanged: BreezeEvent<HasChangesChangedEventArgs>;\r\n\r\n\r\n  /** @hidden @internal */\r\n  _pendingPubs?: any[]; // TODO: refine later\r\n  /** @hidden @internal */\r\n  _hasChangesAction?: (() => boolean); // TODO refine later\r\n  /** @hidden @internal */\r\n  _hasChanges: boolean;\r\n  /** @hidden @internal */\r\n  _entityGroupMap: { [index: string]: EntityGroup };\r\n  /** @hidden @internal */\r\n  _unattachedChildrenMap: UnattachedChildrenMap;\r\n  /** @hidden @internal */\r\n  _inKeyFixup: boolean;\r\n\r\n  helper = {\r\n    unwrapInstance: unwrapInstance,\r\n    unwrapOriginalValues: unwrapOriginalValues,\r\n    unwrapChangedValues: unwrapChangedValues\r\n  };\r\n\r\n  /**\r\n  EntityManager constructor.\r\n\r\n  At its most basic an EntityManager can be constructed with just a service name\r\n  >     let entityManager = new EntityManager( \"breeze/NorthwindIBModel\");\r\n\r\n  This is the same as calling it with the following configuration object\r\n  >     let entityManager = new EntityManager( {serviceName: \"breeze/NorthwindIBModel\" });\r\n\r\n  Usually however, configuration objects will contain more than just the 'serviceName';\r\n  >     let metadataStore = new MetadataStore();\r\n  >     let entityManager = new EntityManager( {\r\n  >       serviceName: \"breeze/NorthwindIBModel\",\r\n  >       metadataStore: metadataStore\r\n  >     });\r\n\r\n  or\r\n  >     return new QueryOptions({\r\n  >         mergeStrategy: obj,\r\n  >         fetchStrategy: this.fetchStrategy\r\n  >     });\r\n  >     let queryOptions = new QueryOptions({\r\n  >         mergeStrategy: MergeStrategy.OverwriteChanges,\r\n  >         fetchStrategy: FetchStrategy.FromServer\r\n  >     });\r\n  >     let validationOptions = new ValidationOptions({\r\n  >         validateOnAttach: true,\r\n  >         validateOnSave: true,\r\n  >         validateOnQuery: false\r\n  >     });\r\n  >     let entityManager = new EntityManager({\r\n  >         serviceName: \"breeze/NorthwindIBModel\",\r\n  >         queryOptions: queryOptions,\r\n  >         validationOptions: validationOptions\r\n  >     });\r\n  @param emConfig - Configuration settings or a service name.  \r\n  **/\r\n  constructor(emConfig?: EntityManagerConfig | string) {\r\n\r\n    if (arguments.length > 1) {\r\n      throw new Error(\"The EntityManager ctor has a single optional argument that is either a 'serviceName' or a configuration object.\");\r\n    }\r\n    let config: EntityManagerConfig;\r\n    if (arguments.length === 0) {\r\n      config = { serviceName: \"\" };\r\n    } else if (typeof emConfig === 'string') {\r\n      config = { serviceName: emConfig };\r\n    } else {\r\n      config = emConfig || {};\r\n    }\r\n\r\n    EntityManager._updateWithConfig(this, config, true);\r\n\r\n    this.entityChanged = new BreezeEvent(\"entityChanged\", this);\r\n    this.validationErrorsChanged = new BreezeEvent(\"validationErrorsChanged\", this);\r\n    this.hasChangesChanged = new BreezeEvent(\"hasChangesChanged\", this);\r\n\r\n    this.clear();\r\n\r\n  }\r\n\r\n  /**\r\n  General purpose property set method.  Any of the properties in the [[EntityManagerConfig]]\r\n  may be set.\r\n  >      // assume em1 is a previously created EntityManager\r\n  >      // where we want to change some of its settings.\r\n  >      em1.setProperties( {\r\n  >          serviceName: \"breeze/foo\"\r\n  >      });\r\n  @param config - An object containing the selected properties and values to set.\r\n  **/\r\n  setProperties(config: EntityManagerConfig) {\r\n    EntityManager._updateWithConfig(this, config, false);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  static _updateWithConfig(em: EntityManager, config: EntityManagerConfig, isCtor: boolean) {\r\n    let defaultQueryOptions = isCtor ? QueryOptions.defaultInstance : em.queryOptions;\r\n    let defaultSaveOptions = isCtor ? SaveOptions.defaultInstance : em.saveOptions;\r\n    let defaultValidationOptions = isCtor ? ValidationOptions.defaultInstance : em.validationOptions;\r\n\r\n    let configParam = assertConfig(config)\r\n      .whereParam(\"serviceName\").isOptional().isString()\r\n      .whereParam(\"dataService\").isOptional().isInstanceOf(DataService)\r\n      .whereParam(\"queryOptions\").isInstanceOf(QueryOptions).isOptional().withDefault(defaultQueryOptions)\r\n      .whereParam(\"saveOptions\").isInstanceOf(SaveOptions).isOptional().withDefault(defaultSaveOptions)\r\n      .whereParam(\"validationOptions\").isInstanceOf(ValidationOptions).isOptional().withDefault(defaultValidationOptions)\r\n      .whereParam(\"keyGeneratorCtor\").isFunction().isOptional();\r\n    if (isCtor) {\r\n      configParam = configParam\r\n        .whereParam(\"metadataStore\").isInstanceOf(MetadataStore).isOptional().withDefault(new MetadataStore());\r\n    }\r\n    configParam.applyAll(em);\r\n\r\n    // insure that entityManager's options versions are completely populated\r\n    core.updateWithDefaults(em.queryOptions, defaultQueryOptions);\r\n    core.updateWithDefaults(em.saveOptions, defaultSaveOptions);\r\n    core.updateWithDefaults(em.validationOptions, defaultValidationOptions);\r\n\r\n    if (config.serviceName) {\r\n      em.dataService = new DataService({\r\n        serviceName: em.serviceName\r\n      });\r\n    }\r\n    em.serviceName = em.dataService && em.dataService.serviceName;\r\n\r\n    em.keyGeneratorCtor = em.keyGeneratorCtor || KeyGenerator;\r\n    if (isCtor || config.keyGeneratorCtor) {\r\n      em.keyGenerator = new em.keyGeneratorCtor();\r\n    }\r\n  }\r\n\r\n  createEntity(typeName: string, initialValues?: Object, entityState?: EntityState, mergeStrategy?: MergeStrategy): Entity;\r\n  createEntity(entityType: EntityType, initialValues?: Object, entityState?: EntityState, mergeStrategy?: MergeStrategy): Entity;\r\n  /**\r\n  Creates a new entity of a specified type and optionally initializes it. By default the new entity is created with an EntityState of Added\r\n  but you can also optionally specify an EntityState.  An EntityState of 'Detached' will insure that the entity is created but not yet added\r\n  to the EntityManager. \r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      // create and add an entity;\r\n  >      let emp1 = em1.createEntity(\"Employee\");\r\n  >      // create and add an initialized entity;\r\n  >      let emp2 = em1.createEntity(\"Employee\", { lastName: \"Smith\", firstName: \"John\" });\r\n  >      // create and attach (not add) an initialized entity\r\n  >      let emp3 = em1.createEntity(\"Employee\", { id: 435, lastName: \"Smith\", firstName: \"John\" }, EntityState.Unchanged);\r\n  >      // create but don't attach an entity;\r\n  >      let emp4 = em1.createEntity(\"Employee\", { id: 435, lastName: \"Smith\", firstName: \"John\" }, EntityState.Detached);\r\n  @param typeName - The name of the EntityType for which an instance should be created.\r\n  @param entityType - The EntityType of the type for which an instance should be created.\r\n  @param initialValues - (default=null) Configuration object of the properties to set immediately after creation.\r\n  @param entityState - (default = [[EntityState.Added]]) The EntityState of the entity after being created and added to this EntityManager.\r\n  @param mergeStrategy - (default = [[MergeStrategy.Disallowed]]) - How to handle conflicts if an entity with the same key already exists within this EntityManager.\r\n  @return {Entity} A new Entity of the specified type. \r\n  */\r\n  createEntity(entityType: EntityType | string, initialValues: Object, entityState: EntityState, mergeStrategy: MergeStrategy) {\r\n    assertParam(entityType, \"entityType\").isString().or().isInstanceOf(EntityType).check();\r\n    assertParam(entityState, \"entityState\").isEnumOf(EntityState).isOptional().check();\r\n    assertParam(mergeStrategy, \"mergeStrategy\").isEnumOf(MergeStrategy).isOptional().check();\r\n\r\n    let et = (typeof entityType === \"string\") ? this.metadataStore._getStructuralType(entityType) as EntityType : entityType;\r\n    entityState = entityState || EntityState.Added;\r\n    let entity = {} as Entity;\r\n    core.using(this, \"isLoading\", true, function () {\r\n      entity = et.createEntity(initialValues);\r\n    });\r\n    if (entityState !== EntityState.Detached) {\r\n      entity = this.attachEntity(entity, entityState, mergeStrategy);\r\n    }\r\n    return entity;\r\n  }\r\n\r\n  static importEntities(exportedString: string, config?: ImportConfig): EntityManager;\r\n  static importEntities(exportedData: Object, config?: ImportConfig): EntityManager;\r\n  /**\r\n  Creates a new EntityManager and imports a previously exported result into it.\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let bundle = em1.exportEntities();\r\n  >      // can be stored via the web storage api\r\n  >      window.localStorage.setItem(\"myEntityManager\", bundle);\r\n  >      // assume the code below occurs in a different session.\r\n  >      let bundleFromStorage = window.localStorage.getItem(\"myEntityManager\");\r\n  >      // and imported\r\n  >      let em2 = EntityManager.importEntities(bundleFromStorage);\r\n  >      // em2 will now have a complete copy of what was in em1\r\n  @param exportedString - The result of a previous 'exportEntities' call as a string\r\n  @param exportedData - The result of a previous 'exportEntities' call as an Object.\r\n  @param config - A configuration object.\r\n  @param config.mergeStrategy - A  [[MergeStrategy]] to use when \r\n  merging into an existing EntityManager.\r\n  @param config.metadataVersionFn - A function that takes two arguments (the current metadataVersion and the imported store's 'name')\r\n  and may be used to perform version checking.\r\n  @return A new EntityManager.  Note that the return value of this method call is different from that\r\n  provided by the same named method on an EntityManager instance. Use that method if you need additional information\r\n  regarding the imported entities.\r\n  **/\r\n  static importEntities(exported: string | Object, config?: ImportConfig) {\r\n    let em = new EntityManager();\r\n    em.importEntities(exported, config);\r\n    return em;\r\n  }\r\n\r\n  // instance methods\r\n\r\n  /**\r\n  Calls [[EntityAspect.acceptChanges]] on every changed entity in this EntityManager.\r\n  **/\r\n  acceptChanges() {\r\n    this.getChanges().map(function (entity) {\r\n      return entity.entityAspect._checkOperation(\"acceptChanges\");\r\n    }).forEach(function (aspect) {\r\n      aspect.acceptChanges();\r\n    });\r\n  }\r\n\r\n  /**\r\n  Exports selected entities, all entities of selected types, or an entire EntityManager cache.\r\n\r\n  This method takes a snapshot of an EntityManager that can be stored offline or held in memory.\r\n  Use the [[EntityManager.importEntities]] method to restore or merge the snapshot\r\n  into another EntityManager at some later time.\r\n  >      // let em1 be an EntityManager containing a number of existing entities.\r\n  >     // export every entity in em1.\r\n  >     let bundle = em1.exportEntities();\r\n  >     // save to the browser's local storage\r\n  >     window.localStorage.setItem(\"myEntityManager\", bundle);\r\n  >     // later retrieve the export\r\n  >     let bundleFromStorage = window.localStorage.getItem(\"myEntityManager\");\r\n  >     // import the retrieved export bundle into another manager\r\n  >     let em2 = em1.createEmptyCopy();\r\n  >     em2.importEntities(bundleFromStorage);\r\n  >     // em2 now has a complete, faithful copy of the entities that were in em1\r\n\r\n  You can also control exactly which entities are exported.\r\n  >     // get em1's unsaved changes (an array) and export them.\r\n  >     let changes = em1.getChanges();\r\n  >     let bundle = em1.exportEntities(changes);\r\n  >     // merge these entities into em2 which may contains some of the same entities.\r\n  >     // do NOT overwrite the entities in em2 if they themselves have unsaved changes.\r\n  >     em2.importEntities(bundle, { mergeStrategy: MergeStrategy.PreserveChanges} );\r\n\r\n  Metadata are included in an export by default. You may want to exclude the metadata\r\n  especially if you're exporting just a few entities for local storage.\r\n  >     let bundle = em1.exportEntities(arrayOfSelectedEntities, {includeMetadata: false});\r\n  >     window.localStorage.setItem(\"goodStuff\", bundle);\r\n\r\n  You may still express this option as a boolean value although this older syntax is deprecated.\r\n  >     // Exclude the metadata (deprecated syntax)\r\n  >     let bundle = em1.exportEntities(arrayOfSelectedEntities, false);\r\n\r\n  You can export all entities of one or more specified EntityTypes.\r\n  >     // Export all Customer and Employee entities (and also exclude metadata)\r\n  >     let bundle = em1.exportEntities(['Customer', 'Employee'], {includeMetadata: false});\r\n\r\n  All of the above examples return an export bundle as a string which is the default format.\r\n  You can export the bundle as JSON if you prefer by setting the `asString` option to false.\r\n  >     // Export all Customer and Employee entities as JSON and exclude the metadata\r\n  >     let bundle = em1.exportEntities(['Customer', 'Employee'],\r\n  >                                     {asString: false, includeMetadata: false});\r\n  >     // store JSON bundle somewhere ... perhaps indexDb ... and later import as we do here.\r\n  >     em2.importEntities(bundle);\r\n  @param entities - The entities to export or the EntityType(s) of the entities to export;\r\n    all entities are exported if this parameter is omitted or null.\r\n  @param exportConfig - Export configuration options or a boolean\r\n    - asString - (boolean) - If true (default), return export bundle as a string.\r\n    - includeMetadata - (boolean) - If true (default), include metadata in the export bundle.\r\n  @return The export bundle either serialized as a string (default) or as a JSON object.\r\n  The bundle contains the metadata (unless excluded) and the entity data grouped by type.\r\n  The entity data include property values, change-state, and temporary key mappings (if any).\r\n\r\n  The export bundle internals are deliberately undocumented.  This Breeze-internal representation of entity data is\r\n  suitable for export, storage, and import. The schema and contents of the bundle may change in future versions of Breeze.\r\n  Manipulate it at your own risk with appropriate caution.\r\n  **/\r\n  exportEntities(entities?: Entity[] | EntityType[] | string[], exportConfig?: { asString?: boolean, includeMetadata?: boolean } | boolean): string | Object {\r\n    assertParam(entities, \"entities\").isArray().isEntity()\r\n      .or().isNonEmptyArray().isInstanceOf(EntityType)\r\n      .or().isNonEmptyArray().isString()\r\n      .or().isOptional().check();\r\n\r\n    // assertParam(exportConfig, \"exportConfig\").isObject()\r\n    //   .or().isBoolean()\r\n    //   .or().isOptional().check();\r\n\r\n    if (exportConfig == null) {\r\n      exportConfig = { includeMetadata: true, asString: true };\r\n    } else if (typeof exportConfig === 'boolean') { // deprecated\r\n      exportConfig = { includeMetadata: exportConfig, asString: true };\r\n    }\r\n\r\n    assertConfig(exportConfig)\r\n      .whereParam(\"asString\").isBoolean().isOptional().withDefault(true)\r\n      .whereParam(\"includeMetadata\").isBoolean().isOptional().withDefault(true)\r\n      .applyAll(exportConfig);\r\n\r\n    let exportBundle = exportEntityGroups(this, entities);\r\n    let json = core.extend({}, exportBundle, [\"tempKeys\", \"entityGroupMap\"]);\r\n\r\n    if (exportConfig.includeMetadata) {\r\n      json = core.extend(json, this, [\"dataService\", \"saveOptions\", \"queryOptions\", \"validationOptions\"]);\r\n      (json as any).metadataStore = this.metadataStore.exportMetadata();\r\n    } else {\r\n      (json as any).metadataVersion = MetadataStore.metadataVersion;\r\n      (json as any).metadataStoreName = this.metadataStore.name;\r\n    }\r\n\r\n    let result = exportConfig.asString ? JSON.stringify(json, null, config.stringifyPad) : json;\r\n    return result;\r\n  }\r\n\r\n  // TODO: type the return value { entities: entitiesToLink, tempKeyMapping: tempKeyMap }\r\n  importEntities(exportedString: string, config?: ImportConfig): ImportResult;\r\n  importEntities(exportedData: Object, config?: ImportConfig): ImportResult;\r\n  /**\r\n  Imports a previously exported result into this EntityManager.\r\n\r\n  This method can be used to make a complete copy of any previously created entityManager, even if created\r\n  in a previous session and stored in localStorage. The static version of this method performs a\r\n  very similar process.\r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     let bundle = em1.exportEntities();\r\n  >     // bundle can be stored in window.localStorage or just held in memory.\r\n  >     let em2 = new EntityManager({\r\n  >         serviceName: em1.serviceName,\r\n  >         metadataStore: em1.metadataStore\r\n  >     });\r\n  >     em2.importEntities(bundle);\r\n  >     // em2 will now have a complete copy of what was in em1\r\n\r\n  It can also be used to merge the contents of a previously created EntityManager with an\r\n  existing EntityManager with control over how the two are merged.\r\n  >     let bundle = em1.exportEntities();\r\n  >     // assume em2 is another entityManager containing some of the same entities possibly with modifications.\r\n  >     em2.importEntities(bundle, { mergeStrategy: MergeStrategy.PreserveChanges} );\r\n  >     // em2 will now contain all of the entities from both em1 and em2.  Any em2 entities with previously\r\n  >     // made modifications will not have been touched, but all other entities from em1 will have been imported.\r\n  @param exportedString - The result of a previous 'export' call.\r\n  @param importConfig - A configuration object.\r\n  @param importConfig.mergeStrategy -  A [[MergeStrategy]] to use when\r\n  merging into an existing EntityManager.\r\n  @param importConfig.metadataVersionFn - A function that takes two arguments (the current metadataVersion and the imported store's 'name')\r\n  and may be used to perform version checking.\r\n  @return result \r\n    - result.entities {Array of Entities} The entities that were imported.\r\n    - result.tempKeyMap {Object} Mapping from original EntityKey in the import bundle to its corresponding EntityKey in this EntityManager.\r\n  **/\r\n  importEntities(exported: string | Object, importConfig?: ImportConfig) {\r\n    importConfig = importConfig || {};\r\n    assertConfig(importConfig)\r\n      .whereParam(\"mergeStrategy\").isEnumOf(MergeStrategy).isOptional().withDefault(this.queryOptions.mergeStrategy)\r\n      .whereParam(\"metadataVersionFn\").isFunction().isOptional()\r\n      .whereParam(\"mergeAdds\").isBoolean().isOptional()\r\n      .applyAll(importConfig);\r\n\r\n    let json = (typeof exported === \"string\") ? JSON.parse(exported) : exported;\r\n    if (json.metadataStore) {\r\n      this.metadataStore.importMetadata(json.metadataStore);\r\n      // the || clause is for backwards compat with an earlier serialization format.\r\n      this.dataService = (json.dataService && DataService.fromJSON(json.dataService)) || new DataService({ serviceName: json.serviceName });\r\n\r\n      this.saveOptions = new SaveOptions(json.saveOptions);\r\n      this.queryOptions = QueryOptions.fromJSON(json.queryOptions);\r\n      this.validationOptions = new ValidationOptions(json.validationOptions);\r\n    } else {\r\n      importConfig.metadataVersionFn && importConfig.metadataVersionFn({\r\n        metadataVersion: json.metadataVersion,\r\n        metadataStoreName: json.metadataStoreName\r\n      });\r\n    }\r\n\r\n    let tempKeyMap: ITempKeyMap = {};\r\n    json.tempKeys.forEach((k: any) => {\r\n      let oldKey = EntityKey.fromJSON(k, this.metadataStore);\r\n      // try to use oldKey if not already used in this keyGenerator.\r\n      tempKeyMap[oldKey.toString()] = new EntityKey(oldKey.entityType, this.keyGenerator.generateTempKeyValue(oldKey.entityType, oldKey.values[0]));\r\n    });\r\n\r\n    let entitiesToLink: Entity[] = [];\r\n    let impConfig = importConfig as ImportConfigExt;\r\n\r\n    impConfig.tempKeyMap = tempKeyMap;\r\n    core.wrapExecution(() => {\r\n      this._pendingPubs = [];\r\n    }, (state) => {\r\n      this._pendingPubs!.forEach((fn) => fn());\r\n      this._pendingPubs = undefined;\r\n      this._hasChangesAction && this._hasChangesAction();\r\n    }, () => {\r\n      core.objectForEach(json.entityGroupMap, (entityTypeName, jsonGroup) => {\r\n        let entityType = this.metadataStore._getStructuralType(entityTypeName, false) as EntityType;\r\n        let targetEntityGroup = findOrCreateEntityGroup(this, entityType);\r\n        let entities = importEntityGroup(targetEntityGroup, jsonGroup, impConfig);\r\n        if (entities && entities.length) {\r\n          entitiesToLink = entitiesToLink.concat(entities);\r\n        }\r\n      });\r\n      entitiesToLink.forEach((entity) => {\r\n        if (!entity.entityAspect.entityState.isDeleted()) {\r\n          this._linkRelatedEntities(entity);\r\n        }\r\n      });\r\n    });\r\n    return {\r\n      entities: entitiesToLink,\r\n      tempKeyMapping: tempKeyMap\r\n    };\r\n  }\r\n\r\n  /**\r\n  Clears this EntityManager's cache but keeps all other settings. Note that this\r\n  method is not as fast as creating a new EntityManager via 'new EntityManager'.\r\n  This is because clear actually detaches all of the entities from the EntityManager.\r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     em1.clear();\r\n  >     // em1 is will now contain no entities, but all other setting will be maintained.\r\n  **/\r\n  clear() {\r\n    core.objectMap(this._entityGroupMap, function (key: string, entityGroup: EntityGroup) {\r\n      return entityGroup._checkOperation('clear');\r\n    }).forEach((entityGroup: EntityGroup) => {\r\n      entityGroup._clear();\r\n    });\r\n\r\n    this._entityGroupMap = {};\r\n    this._unattachedChildrenMap = new UnattachedChildrenMap();\r\n    this.keyGenerator = new this.keyGeneratorCtor();\r\n    this.entityChanged.publish({ entityAction: EntityAction.Clear });\r\n    this._setHasChanges(false);\r\n  }\r\n\r\n  /**\r\n  Creates an empty copy of this EntityManager but with the same DataService, MetadataStore, QueryOptions, SaveOptions, ValidationOptions, etc. \r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     let em2 = em1.createEmptyCopy();\r\n  >     // em2 is a new EntityManager with all of em1's settings\r\n  >     // but no entities.\r\n  @return A new EntityManager.\r\n  **/\r\n  createEmptyCopy() {\r\n    let copy = new EntityManager(core.extend({}, this,\r\n      [\"dataService\", \"metadataStore\", \"queryOptions\", \"saveOptions\", \"validationOptions\", \"keyGeneratorCtor\"]));\r\n    return copy;\r\n  }\r\n\r\n  /**\r\n  Attaches an entity to this EntityManager with an  [[EntityState]] of 'Added'.\r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >     let cust1 = custType.createEntity();\r\n  >     em1.addEntity(cust1);\r\n\r\n  Note that this is the same as using 'attachEntity' with an [[EntityState]] of 'Added'.\r\n\r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >     let cust1 = custType.createEntity();\r\n  >     em1.attachEntity(cust1, EntityState.Added);\r\n  @param entity - The entity to add.\r\n  @return The added entity.\r\n  **/\r\n  addEntity(entity: Entity) {\r\n    return this.attachEntity(entity, EntityState.Added);\r\n  }\r\n\r\n  /**\r\n  Attaches an entity to this EntityManager with a specified [[EntityState]].\r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >     let cust1 = custType.createEntity();\r\n  >     em1.attachEntity(cust1, EntityState.Added);\r\n  @param entity - The entity to add.\r\n  @param entityState - (default=EntityState.Unchanged) The EntityState of the newly attached entity. If omitted this defaults to EntityState.Unchanged.\r\n  @param mergeStrategy - (default = MergeStrategy.Disallowed) How the specified entity should be merged into the EntityManager if this EntityManager already contains an entity with the same key.\r\n  @return The attached entity.\r\n  **/\r\n  attachEntity(entity: Entity, entityState?: EntityState, mergeStrategy?: MergeStrategy) {\r\n    assertParam(entity, \"entity\").isRequired().check();\r\n    this.metadataStore._checkEntityType(entity);\r\n    let esSymbol = assertParam(entityState, \"entityState\").isEnumOf(EntityState).isOptional().check(EntityState.Unchanged) as EntityState;\r\n    let msSymbol = assertParam(mergeStrategy, \"mergeStrategy\").isEnumOf(MergeStrategy).isOptional().check(MergeStrategy.Disallowed) as MergeStrategy;\r\n\r\n    if (entity.entityType.metadataStore !== this.metadataStore) {\r\n      throw new Error(\"Cannot attach this entity because the EntityType (\" + entity.entityType.name +\r\n        \") and MetadataStore associated with this entity does not match this EntityManager's MetadataStore.\");\r\n    }\r\n    let aspect = entity.entityAspect;\r\n    if (aspect) {\r\n      // to avoid reattaching an entity in progress\r\n      if (aspect._inProcessEntity) return aspect._inProcessEntity;\r\n    } else {\r\n      // this occur's when attaching an entity created via new instead of via createEntity.\r\n      aspect = new EntityAspect(entity);\r\n    }\r\n    let manager = aspect.entityManager;\r\n    if (manager) {\r\n      if (manager === this) {\r\n        return entity;\r\n      } else {\r\n        throw new Error(\"This entity already belongs to another EntityManager\");\r\n      }\r\n    }\r\n\r\n    let attachedEntity = {} as Entity;\r\n    core.using(this, \"isLoading\", true, () => {\r\n      if (esSymbol.isAdded()) {\r\n        checkEntityKey(this, entity);\r\n      }\r\n      // attachedEntity === entity EXCEPT in the case of a merge.\r\n      attachedEntity = this._attachEntityCore(entity, esSymbol, msSymbol);\r\n      aspect._inProcessEntity = attachedEntity;\r\n      try {\r\n        // entity ( not attachedEntity) is deliberate here.\r\n        attachRelatedEntities(this, entity, esSymbol, msSymbol);\r\n      } finally {\r\n        // insure that _inProcessEntity is cleared.\r\n        aspect._inProcessEntity = undefined;\r\n      }\r\n    });\r\n    if (this.validationOptions.validateOnAttach) {\r\n      attachedEntity.entityAspect.validateEntity();\r\n    }\r\n    if (!esSymbol.isUnchanged()) {\r\n      this._notifyStateChange(attachedEntity, true);\r\n    }\r\n    this.entityChanged.publish({ entityAction: EntityAction.Attach, entity: attachedEntity });\r\n\r\n    return attachedEntity;\r\n  }\r\n\r\n\r\n  /**\r\n  Detaches an entity from this EntityManager.\r\n  >     // assume em1 is an EntityManager containing a number of existing entities.\r\n  >     // assume cust1 is a customer Entity previously attached to em1\r\n  >     em1.detachEntity(cust1);\r\n  >     // em1 will now no longer contain cust1 and cust1 will have an\r\n  >     // entityAspect.entityState of EntityState.Detached\r\n  @param entity - The entity to detach.\r\n  @return Whether the entity could be detached. This will return false if the entity is already detached or was never attached.\r\n  **/\r\n  detachEntity(entity: Entity) {\r\n    assertParam(entity, \"entity\").isEntity().check();\r\n    let aspect = entity.entityAspect;\r\n    if (!aspect) {\r\n      // no aspect means in couldn't appear in any group\r\n      return false;\r\n    }\r\n\r\n    if (aspect.entityManager !== this) {\r\n      throw new Error(\"This entity does not belong to this EntityManager.\");\r\n    }\r\n    return aspect.setDetached();\r\n  }\r\n\r\n  /**\r\n  Fetches the metadata associated with the EntityManager's current 'serviceName'.  This call\r\n  occurs internally before the first query to any service if the metadata hasn't already been\r\n  loaded. __Async__\r\n\r\n  Usually you will not actually process the results of a fetchMetadata call directly, but will instead\r\n  ask for the metadata from the EntityManager after the fetchMetadata call returns.\r\n  >     let em1 = new EntityManager( \"breeze/NorthwindIBModel\");\r\n  >     em1.fetchMetadata()\r\n  >       .then(function() {\r\n  >           let metadataStore = em1.metadataStore;\r\n  >           // do something with the metadata\r\n  >       }).catch(function(exception) {\r\n  >           // handle exception here\r\n  >       });\r\n  \r\n  @param callback - Function called on success.\r\n  @param errorCallback - Function called on failure.\r\n  @return {Promise}\r\n    - schema {Object} The raw Schema object from metadata provider - Because this schema will differ depending on the metadata provider\r\n        it is usually better to access metadata via the 'metadataStore' property of the EntityManager instead of using this 'raw' data.\r\n  **/\r\n  fetchMetadata(dataService?: DataService, callback?: Callback, errorCallback?: ErrorCallback) {\r\n    if (typeof (dataService) === \"function\") {\r\n      // legacy support for when dataService was not an arg. i.e. first arg was callback\r\n      errorCallback = callback;\r\n      callback = dataService;\r\n      dataService = undefined;\r\n    } else {\r\n      assertParam(dataService, \"dataService\").isInstanceOf(DataService).isOptional().check();\r\n      assertParam(callback, \"callback\").isFunction().isOptional().check();\r\n      assertParam(errorCallback, \"errorCallback\").isFunction().isOptional().check();\r\n    }\r\n\r\n    let promise = this.metadataStore.fetchMetadata(dataService || this.dataService);\r\n    return promiseWithCallbacks(promise, callback, errorCallback);\r\n  }\r\n\r\n\r\n  executeQuery(query: string, callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback): Promise<QueryResult>;\r\n  executeQuery(query: EntityQuery, callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback): Promise<QueryResult>;\r\n  /**\r\n  Executes the specified query. __Async__ \r\n  \r\n  >     let em = new EntityManager(serviceName);\r\n  >     let query = new EntityQuery(\"Orders\");\r\n  >     em.executeQuery(query).then( function(data) {\r\n  >         let orders = data.results;\r\n  >         ... query results processed here\r\n  >     }).catch( function(err) {\r\n  >         ... query failure processed here\r\n  >     });\r\n\r\n  or with callbacks\r\n  >     let em = new EntityManager(serviceName);\r\n  >     let query = new EntityQuery(\"Orders\");\r\n  >     em.executeQuery(query,\r\n  >         function(data) {\r\n  >             let orders = data.results;\r\n  >             ... query results processed here\r\n  >         },\r\n  >         function(err) {\r\n  >             ... query failure processed here\r\n  >         });\r\n\r\n  Either way this method is the same as calling the The [[EntityQuery]] 'execute' method.\r\n  >     let em = new EntityManager(serviceName);\r\n  >     let query = new EntityQuery(\"Orders\").using(em);\r\n  >     query.execute().then( function(data) {\r\n  >         let orders = data.results;\r\n  >         ... query results processed here\r\n  >     }).catch( function(err) {\r\n  >         ... query failure processed here\r\n  >     });\r\n  @param query - The [[EntityQuery]] or OData query string to execute.\r\n  @param callback - Function called on success.\r\n  @param errorCallback - {Function} Function called on failure.\r\n  @return Promise of \r\n    - results - An array of entities\r\n    - retrievedEntities - A array of all of the entities returned by the query.  Differs from results (above) when .expand() is used.\r\n    - query - The original [[EntityQuery]] or query string\r\n    - entityManager -  The EntityManager.\r\n    - httpResponse - The [[IHttpResponse]] returned from the server.\r\n    - inlineCount -  Only available if 'inlineCount(true)' was applied to the query.  Returns the count of\r\n    items that would have been returned by the query before applying any skip or take operators, but after any filter/where predicates\r\n    would have been applied.\r\n  **/\r\n  executeQuery(query: EntityQuery | string, callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback) {\r\n    assertParam(query, \"query\").isInstanceOf(EntityQuery).or().isString().check();\r\n    assertParam(callback, \"callback\").isFunction().isOptional().check();\r\n    assertParam(errorCallback, \"errorCallback\").isFunction().isOptional().check();\r\n    let promise: Promise<any>;\r\n    // 'resolve' methods create a new typed object with all of its properties fully resolved against a list of sources.\r\n    // Thought about creating a 'normalized' query with these 'resolved' objects\r\n    // but decided not to because the 'query' may not be an EntityQuery (it can be a string) and hence might not have a queryOptions or dataServices property on it.\r\n    let queryOptions = QueryOptions.resolve([(query as any).queryOptions, this.queryOptions, QueryOptions.defaultInstance]);\r\n    let dataService = DataService.resolve([(query as any).dataService!, this.dataService]);\r\n\r\n    if ((!dataService.hasServerMetadata) || this.metadataStore.hasMetadataFor(dataService.serviceName)) {\r\n      promise = executeQueryCore(this, query, queryOptions, dataService);\r\n    } else {\r\n      promise = this.fetchMetadata(dataService).then(() => {\r\n        return executeQueryCore(this, query, queryOptions, dataService);\r\n      });\r\n    }\r\n\r\n    return promiseWithCallbacks(promise, callback, errorCallback as ErrorCallback);\r\n  }\r\n\r\n  /**\r\n  Executes the specified query against this EntityManager's local cache.\r\n\r\n  Because this method is executed immediately there is no need for a promise or a callback\r\n  >     let em = new EntityManager(serviceName);\r\n  >     let query = new EntityQuery(\"Orders\");\r\n  >     let orders = em.executeQueryLocally(query);\r\n\r\n  Note that this can also be accomplished using the 'executeQuery' method with\r\n  a FetchStrategy of FromLocalCache and making use of the Promise or callback\r\n  >     let em = new EntityManager(serviceName);\r\n  >     let query = new EntityQuery(\"Orders\").using(FetchStrategy.FromLocalCache);\r\n  >     em.executeQuery(query).then( function(data) {\r\n  >         let orders = data.results;\r\n  >         ... query results processed here\r\n  >     }).catch( function(err) {\r\n  >         ... query failure processed here\r\n  >     });\r\n  @param query - The [[EntityQuery]] to execute.\r\n  @return  {Array of Entity}  Array of entities from cache that satisfy the query\r\n  **/\r\n  executeQueryLocally(query: EntityQuery) {\r\n    return executeQueryLocallyCore(this, query).results;\r\n  }\r\n\r\n  /**\r\n  Saves either a list of specified entities or all changed entities within this EntityManager. If there are no changes to any of the entities\r\n  specified then there will be no server side call made but a valid 'empty' saveResult will still be returned. __Async__\r\n\r\n  Often we will be saving all of the entities within an EntityManager that are either added, modified or deleted\r\n  and we will let the 'saveChanges' call determine which entities these are.\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      // This could include added, modified and deleted entities.\r\n  >      em.saveChanges().then(function(saveResult) {\r\n  >          let savedEntities = saveResult.entities;\r\n  >          let keyMappings = saveResult.keyMappings;\r\n  >      }).catch(function (e) {\r\n  >          // e is any exception that was thrown.\r\n  >      });\r\n\r\n  But we can also control exactly which entities to save and can specify specific SaveOptions\r\n\r\n  >      // assume entitiesToSave is an array of entities to save.\r\n  >      let saveOptions = new SaveOptions({ allowConcurrentSaves: true });\r\n  >      em.saveChanges(entitiesToSave, saveOptions).then(function(saveResult) {\r\n  >          let savedEntities = saveResult.entities;\r\n  >          let keyMappings = saveResult.keyMappings;\r\n  >      }).catch(function (e) {\r\n  >          // e is any exception that was thrown.\r\n  >      });\r\n\r\n  Callback methods can also be used\r\n  >      em.saveChanges(entitiesToSave, null,\r\n  >          function(saveResult) {\r\n  >              let savedEntities = saveResult.entities;\r\n  >              let keyMappings = saveResult.keyMappings;\r\n  >          }, function (e) {\r\n  >              // e is any exception that was thrown.\r\n  >          }\r\n  >      );\r\n\r\n  @param entities - The list of entities to save.\r\n  Every entity in that list will be sent to the server, whether changed or unchanged,\r\n  as long as it is attached to this EntityManager.\r\n  If this parameter is omitted, null or empty (the usual case),\r\n  every entity with pending changes in this EntityManager will be saved.\r\n  @param saveOptions - [[SaveOptions]] for the save - will default to\r\n  [[EntityManager.saveOptions]] if null.\r\n  @param callback -  Function called on success.\r\n  @param errorCallback - Function called on failure.\r\n  @return {Promise} Promise\r\n  **/\r\n  saveChanges(entities?: Entity[] | null, saveOptions?: SaveOptions, callback?: Function, errorCallback?: Function) {\r\n    assertParam(entities, \"entities\").isOptional().isArray().isEntity().check();\r\n    assertParam(saveOptions, \"saveOptions\").isInstanceOf(SaveOptions).isOptional().check();\r\n    assertParam(callback, \"callback\").isFunction().isOptional().check();\r\n    assertParam(errorCallback, \"errorCallback\").isFunction().isOptional().check();\r\n\r\n    saveOptions = saveOptions || this.saveOptions || SaveOptions.defaultInstance;\r\n\r\n    let entitiesToSave = getEntitiesToSave(this, entities ? entities : undefined);\r\n\r\n    if (entitiesToSave.length === 0) {\r\n      let result = { entities: [], keyMappings: [] } as SaveResult;\r\n      if (callback) callback(result);\r\n      return Promise.resolve(result);\r\n    }\r\n\r\n    if (!saveOptions.allowConcurrentSaves) {\r\n      let anyPendingSaves = entitiesToSave.some(function (entity) {\r\n        return entity.entityAspect.isBeingSaved;\r\n      });\r\n      if (anyPendingSaves) {\r\n        let err = new Error(\"Concurrent saves not allowed - SaveOptions.allowConcurrentSaves is false\");\r\n        if (errorCallback) errorCallback(err);\r\n        return Promise.reject(err);\r\n      }\r\n    }\r\n\r\n    clearServerErrors(entitiesToSave);\r\n\r\n    let valError = this.saveChangesValidateOnClient(entitiesToSave);\r\n    if (valError) {\r\n      if (errorCallback) errorCallback(valError);\r\n      return Promise.reject(valError);\r\n    }\r\n\r\n    let dataService = DataService.resolve([saveOptions.dataService, this.dataService]);\r\n    let saveContext: SaveContext = {\r\n      entityManager: this,\r\n      dataService: dataService,\r\n      processSavedEntities: processSavedEntities,\r\n      resourceName: saveOptions.resourceName || this.saveOptions.resourceName || \"SaveChanges\"\r\n    };\r\n\r\n    // TODO: need to check that if we are doing a partial save that all entities whose temp keys\r\n    // are referenced are also in the partial save group\r\n\r\n    let saveBundle = { entities: entitiesToSave, saveOptions: saveOptions };\r\n\r\n\r\n    try { // Guard against exception thrown in dataservice adapter before it goes async\r\n      updateConcurrencyProperties(entitiesToSave);\r\n      return dataService.adapterInstance!.saveChanges(saveContext, saveBundle)\r\n        .then(saveSuccess).then((r) => r, saveFail);\r\n    } catch (err) {\r\n      // undo the marking by updateConcurrencyProperties\r\n      markIsBeingSaved(entitiesToSave, false);\r\n      if (errorCallback) errorCallback(err);\r\n      return Promise.reject(err);\r\n    }\r\n\r\n    function saveSuccess(saveResult: SaveResult) {\r\n      let em = saveContext.entityManager;\r\n      markIsBeingSaved(entitiesToSave, false);\r\n      let savedEntities = saveContext.processSavedEntities(saveResult);\r\n      saveResult.entities = savedEntities;\r\n\r\n      // update _hasChanges after save.\r\n      em._setHasChanges();\r\n\r\n      // can't do this anymore because other changes might have been made while saved entities in flight.\r\n      //      let hasChanges = (isFullSave && haveSameContents(entitiesToSave, savedEntities)) ? false : null;\r\n      //      em._setHasChanges(hasChanges);\r\n\r\n      if (callback) callback(saveResult);\r\n      return Promise.resolve(saveResult);\r\n    }\r\n\r\n    function processSavedEntities(saveResult: SaveResult) {\r\n      let savedEntities = saveResult.entities;\r\n      let deletedKeys = saveResult.deletedKeys || [];\r\n      if (savedEntities.length === 0 && deletedKeys.length === 0) {\r\n        return [];\r\n      }\r\n      let keyMappings = saveResult.keyMappings;\r\n      let em = saveContext.entityManager;\r\n\r\n      // must occur outside of isLoading block\r\n      fixupKeys(em, keyMappings);\r\n\r\n      core.using(em, \"isLoading\", true, () => {\r\n\r\n        let mappingContext = new MappingContext({\r\n          query: undefined, // tells visitAndMerge this is a save instead of a query\r\n          entityManager: em,\r\n          mergeOptions: { mergeStrategy: MergeStrategy.OverwriteChanges },\r\n          dataService: dataService\r\n        });\r\n\r\n        // The visitAndMerge operation has been optimized so that we do not actually perform a merge if the\r\n        // the save operation did not actually return the entity - i.e. during OData and Mongo updates and deletes.\r\n        savedEntities = mappingContext.visitAndMerge(savedEntities, { nodeType: \"root\" });\r\n      });\r\n\r\n      // detach any entities found in the em that appear in the deletedKeys list. \r\n      deletedKeys.forEach(key => {\r\n        let entityType = em.metadataStore._getStructuralType(key.entityTypeName) as EntityType;\r\n        let ekey = new EntityKey(entityType, key.keyValues);\r\n        let entity = em.getEntityByKey(ekey);\r\n        if (entity) {\r\n          entity.entityAspect.setDetached();\r\n        }\r\n      });\r\n\r\n      return savedEntities;\r\n    }\r\n\r\n    function saveFail(serverError: SaveErrorFromServer) {\r\n      markIsBeingSaved(entitiesToSave, false);\r\n      let clientError = processServerErrors(saveContext, serverError);\r\n      if (errorCallback) errorCallback(clientError);\r\n      return Promise.reject(clientError);\r\n    }\r\n  }\r\n\r\n  /**\r\n  Run the \"saveChanges\" pre-save client validation logic.\r\n  \r\n  This is NOT a general purpose validation method.\r\n  It is intended for utilities that must know if saveChanges\r\n  would reject the save due to client validation errors.\r\n  \r\n  It only validates entities if the EntityManager's\r\n  [[ValidationOptions]].validateOnSave is true.\r\n  \r\n  @param entitiesToSave {Array of Entity} The list of entities to save (to validate).\r\n  @return {Error} Validation error or null if no error\r\n  **/\r\n  saveChangesValidateOnClient(entitiesToSave: Entity[]) {\r\n\r\n    if (this.validationOptions.validateOnSave) {\r\n      let failedEntities = entitiesToSave.filter(function (entity) {\r\n        let aspect = entity.entityAspect;\r\n        let isValid = aspect.entityState.isDeleted() || aspect.validateEntity();\r\n        return !isValid;\r\n      });\r\n      if (failedEntities.length > 0) {\r\n        let valError = new Error(\"Client side validation errors encountered - see the entityErrors collection on this object for more detail\");\r\n        (valError as any).entityErrors = createEntityErrors(failedEntities);\r\n        return valError; // TODO: type this.\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _findEntityGroup(entityType: EntityType) {\r\n    return this._entityGroupMap[entityType.name];\r\n  }\r\n\r\n  /**\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let employeeType = em1.metadataStore.getEntityType(\"Employee\");\r\n  >      let employeeKey = new EntityKey(employeeType, 1);\r\n  >      let employee = em1.getEntityByKey(employeeKey);\r\n  >      // employee will either be an entity or null.\r\n  **/\r\n  getEntityByKey(entityKey: EntityKey): Entity | null;\r\n\r\n  /**  \r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let employee = em1.getEntityByKey(\"Employee\", 1);\r\n  >      // employee will either be an entity or null.\r\n  **/\r\n  getEntityByKey(typeName: string, keyValues: any | any[]): Entity | null;\r\n\r\n  /**  \r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let employeeType = em1.metadataStore.getEntityType(\"Employee\");\r\n  >      let employee = em1.getEntityByKey(employeeType, 1);\r\n  >      // employee will either be an entity or null.\r\n  **/\r\n  getEntityByKey(type: EntityType, keyValues: any | any[]): Entity | null;\r\n\r\n  /**  \r\n  Attempts to locate an entity within this EntityManager by its [EntityKey].\r\n  @param entityKey - The [[EntityKey]] of the Entity to be located.\r\n  @param type - The [[EntityType]] for this key.\r\n  @param typeName - The EntityType name for this key.\r\n  @param keyValues - The values for this key - will usually just be a single value; an array is only needed for multipart keys.  \r\n  @return An Entity or null;\r\n  **/\r\n  getEntityByKey(...args: any[]) {\r\n    let entityKey = createEntityKey(this, args).entityKey;\r\n    let entityTypes = entityKey._subtypes || [entityKey.entityType];\r\n    let e: Entity | undefined;\r\n    // hack use of some to simulate mapFirst logic.\r\n    entityTypes.some((et) => {\r\n      let group = this._findEntityGroup(et);\r\n      // group version of findEntityByKey doesn't care about entityType\r\n      e = group && group.findEntityByKey(entityKey);\r\n      return e != null;\r\n    });\r\n    return e || null;\r\n  }\r\n\r\n  fetchEntityByKey(typeName: string, keyValues: any | any[], checkLocalCacheFirst?: boolean): Promise<IEntityByKeyResult>;\r\n  fetchEntityByKey(entityType: EntityType, keyValues: any | any[], checkLocalCacheFirst?: boolean): Promise<IEntityByKeyResult>;\r\n  fetchEntityByKey(entityKey: EntityKey, checkLocalCacheFirst?: boolean): Promise<IEntityByKeyResult>;\r\n  /**\r\n  Attempts to fetch an entity from the server by its [[EntityKey]] with\r\n  an option to check the local cache first. Note the this EntityManager's queryOptions.mergeStrategy\r\n  will be used to merge any server side entity returned by this method.\r\n  >     // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >     let employeeType = em1.metadataStore.getEntityType(\"Employee\");\r\n  >     let employeeKey = new EntityKey(employeeType, 1);\r\n  >     em1.fetchEntityByKey(employeeKey).then(function(result) {\r\n  >       let employee = result.entity;\r\n  >       let entityKey = result.entityKey;\r\n  >       let fromCache = result.fromCache;\r\n  >     });\r\n  @param typeName  - The EntityType name for this key.\r\n  @param entityType  - The EntityType for this key.\r\n  @param keyValues - The values for this key - will usually just be a single value; an array is only needed for multipart keys.\r\n  @param entityKey - The [[EntityKey]] of the Entity to be located.\r\n  @param checkLocalCacheFirst - (default = false) - Whether to check this EntityManager first before going to the server. By default, the query will NOT do this.\r\n  @return {Promise}\r\n    - Properties on the promise success result\r\n      - entity {Object} The entity returned or null\r\n      - entityKey {EntityKey} The entityKey of the entity to fetch.\r\n      - fromCache {Boolean} Whether this entity was fetched from the server or was found in the local cache.\r\n  **/\r\n  fetchEntityByKey(...args: any[]) {\r\n    let dataService = DataService.resolve([this.dataService]);\r\n    if ((!dataService.hasServerMetadata) || this.metadataStore.hasMetadataFor(dataService.serviceName)) {\r\n      return fetchEntityByKeyCore(this, args);\r\n    } else {\r\n      return this.fetchMetadata(dataService).then(() => {\r\n        return fetchEntityByKeyCore(this, args);\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n  [Deprecated] - Attempts to locate an entity within this EntityManager by its  [[EntityKey]].\r\n  >     // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >     let employeeType = em1.metadataStore.getEntityType(\"Employee\");\r\n  >     let employeeKey = new EntityKey(employeeType, 1);\r\n  >     let employee = em1.findEntityByKey(employeeKey);\r\n  >     // employee will either be an entity or null.\r\n  @deprecated    Use getEntityByKey instead\r\n  @param entityKey - The  [[EntityKey]] of the Entity to be located.\r\n  @return An Entity or null;\r\n  **/\r\n  findEntityByKey(entityKey: EntityKey) {\r\n    return this.getEntityByKey(entityKey);\r\n  }\r\n\r\n  /**\r\n  Generates a temporary key for the specified entity.  This is used to insure that newly\r\n  created entities have unique keys and to register that these keys are temporary and\r\n  need to be automatically replaced with 'real' key values once these entities are saved.\r\n  \r\n  The [[EntityManager.keyGeneratorCtor]] property is used internally by this method to actually generate\r\n  the keys - See the  KeyGenerator interface interface description to see\r\n  how a custom key generator can be plugged in.\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let customer = custType.createEntity();\r\n  >      let customerId = em.generateTempKeyValue(customer);\r\n  >      // The 'customer' entity 'CustomerID' property is now set to a newly generated unique id value\r\n  >      // This property will change again after a successful save of the 'customer' entity.\r\n  >  \r\n  >      em1.saveChanges().then( function( data) {\r\n  >          let sameCust1 = data.results[0];\r\n  >          // cust1 === sameCust1;\r\n  >          // but cust1.getProperty(\"CustomerId\") != customerId\r\n  >          // because the server will have generated a new id\r\n  >          // and the client will have been updated with this\r\n  >          // new id.\r\n  >      })\r\n  @param entity - The Entity to generate a key for.\r\n  @return The new key value\r\n  **/\r\n  generateTempKeyValue(entity: Entity) {\r\n    // TODO - check if this entity is attached to this EntityManager.\r\n    assertParam(entity, \"entity\").isEntity().check();\r\n    let entityType = entity.entityType;\r\n    let nextKeyValue = this.keyGenerator.generateTempKeyValue(entityType);\r\n    let keyProp = entityType.keyProperties[0];\r\n    entity.setProperty(keyProp.name, nextKeyValue);\r\n    entity.entityAspect.hasTempKey = true;\r\n    return nextKeyValue;\r\n  }\r\n\r\n  hasChanges(): boolean;\r\n  hasChanges(entityTypeNames: string | string[]): boolean;\r\n  hasChanges(entityTypes: EntityType | EntityType[]): boolean;\r\n  /**\r\n  Returns whether there are any changed entities of the specified [[EntityType]]s. A 'changed' Entity has\r\n  has an [[EntityState]] of either Added, Modified or Deleted.\r\n\r\n  This method can be used to determine if an EntityManager has any changes\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      if ( em1.hasChanges() {\r\n  >          // do something interesting\r\n  >      }\r\n\r\n  or if it has any changes on to a specific [[EntityType]].\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      if ( em1.hasChanges(custType) {\r\n  >          // do something interesting\r\n  >      }\r\n\r\n  or to a collection of [[EntityType]]s\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let orderType = em1.metadataStore.getEntityType(\"Order\");\r\n  >      if ( em1.hasChanges( [custType, orderType]) {\r\n  >          // do something interesting\r\n  >      }\r\n  @param entityTypes - The [[EntityType]] or EntityTypes for which 'changed' entities will be found.\r\n  @param entityTypeNames - The [[EntityType]] name or names for which 'changed' entities will be found.\r\n  @return Whether there are any changed entities that match the types specified..\r\n  **/\r\n  hasChanges(entityTypes?: EntityType | EntityType[] | string | string[]) {\r\n    if (!this._hasChanges) return false;\r\n    if (entityTypes === undefined) return this._hasChanges;\r\n    return this._hasChangesCore(entityTypes);\r\n  }\r\n\r\n\r\n  /** @hidden @internal */\r\n  // backdoor to \"really\" check for changes.\r\n  _hasChangesCore(entityTypes?: EntityType | EntityType[] | string | string[]) {\r\n    let ets = checkEntityTypes(this, entityTypes);\r\n    let entityGroups = getEntityGroups(this, ets);\r\n    return entityGroups.some(function (eg) {\r\n      return eg && eg.hasChanges();\r\n    });\r\n  }\r\n\r\n  getChanges(): Entity[];\r\n  getChanges(entityTypeNames: string | string[]): Entity[];\r\n  getChanges(entityTypes: EntityType | EntityType[]): Entity[];\r\n  /**\r\n  Returns a array of all changed entities of the specified [[EntityType]]s. A 'changed' Entity has\r\n  has an [[EntityState]] of either Added, Modified or Deleted.\r\n  \r\n  This method can be used to get all of the changed entities within an EntityManager\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let changedEntities = em1.getChanges();\r\n\r\n  or you can specify that you only want the changes on a specific [[EntityType]]\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let changedCustomers = em1.getChanges(custType);\r\n\r\n  or to a collection of [[EntityType]]s\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let orderType = em1.metadataStore.getEntityType(\"Order\");\r\n  >      let changedCustomersAndOrders = em1.getChanges([custType, orderType]);\r\n  @param entityTypes - The [[EntityType]] or EntityTypes for which 'changed' entities will be found.\r\n  @param entityTypeNames - The [[EntityType]] name or names for which 'changed' entities will be found.\r\n  @return An array of Entities\r\n  **/\r\n  getChanges(entityTypes?: EntityType | EntityType[] | string | string[]) {\r\n    let ets = checkEntityTypes(this, entityTypes);\r\n    return getChangesCore(this, ets);\r\n  }\r\n\r\n  /**\r\n  Rejects (reverses the effects) all of the additions, modifications and deletes from this EntityManager.\r\n  Calls [[EntityAspect.rejectChanges]] on every changed entity in this EntityManager.\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let entities = em1.rejectChanges();\r\n  @return The entities whose changes were rejected. These entities will all have EntityStates of\r\n  either 'Unchanged' or 'Detached'\r\n  **/\r\n  rejectChanges() {\r\n    if (!this._hasChanges) return [];\r\n    let changes = getChangesCore(this);\r\n    // next line stops individual reject changes from each calling _hasChangesCore\r\n    let aspects = changes.map(function (e) {\r\n      return e.entityAspect._checkOperation(\"rejectChanges\");\r\n    });\r\n    this._hasChanges = false;\r\n    aspects.forEach(function (aspect) {\r\n      aspect.rejectChanges();\r\n    });\r\n    this.hasChangesChanged.publish({ entityManager: this, hasChanges: false });\r\n    return changes;\r\n  }\r\n\r\n  getEntities(entityTypeNames?: string | string[], entityStates?: EntityState | EntityState[]): Entity[];\r\n  getEntities(entityTypes?: EntityType | EntityType[], entityStates?: EntityState | EntityState[]): Entity[];\r\n  /**\r\n  Returns a array of all entities of the specified [[EntityType]]s with the specified [[EntityState]]s.\r\n\r\n  This method can be used to get all of the entities within an EntityManager\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let entities = em1.getEntities();\r\n\r\n  or you can specify that you only want the changes on a specific [[EntityType]]\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let customers = em1.getEntities(custType);\r\n\r\n  or to a collection of [[EntityType]]s\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let orderType = em1.metadataStore.getEntityType(\"Order\");\r\n  >      let customersAndOrders = em1.getChanges([custType, orderType]);\r\n\r\n  You can also ask for entities with a particular [[EntityState]] or EntityStates.\r\n  >      // assume em1 is an EntityManager containing a number of preexisting entities.\r\n  >      let custType = em1.metadataStore.getEntityType(\"Customer\");\r\n  >      let orderType = em1.metadataStore.getEntityType(\"Order\");\r\n  >      let addedCustomersAndOrders = em1.getEntities([custType, orderType], EntityState.Added);\r\n \r\n  @param entityTypeName - The [[EntityType]] name or names for which entities will be found.\r\n  If this parameter is omitted, all EntityTypes are searched.  \r\n  @param entityTypes - The [[EntityType]] or EntityTypes for which entities will be found.\r\n  If this parameter is omitted, all EntityTypes are searched. \r\n  @param entityStates - The [[EntityState]]s for which entities will be found.\r\n  If this parameter is omitted, entities of all EntityStates are returned.\r\n  @return An array of Entities\r\n  **/\r\n  getEntities(entityTypes?: EntityType | EntityType[] | string | string[], entityStates?: EntityState | EntityState[]) {\r\n    let entTypes = checkEntityTypes(this, entityTypes);\r\n    assertParam(entityStates, \"entityStates\").isOptional().isEnumOf(EntityState).or().isNonEmptyArray().isEnumOf(EntityState).check();\r\n\r\n    let states = validateEntityStates(this, entityStates);\r\n    return getEntitiesCore(this, entTypes, states);\r\n  }\r\n\r\n\r\n  // protected methods\r\n  /** @hidden @internal */\r\n  _notifyStateChange(entity: Entity, needsSave: boolean) {\r\n    let ecArgs = { entityAction: EntityAction.EntityStateChange, entity: entity };\r\n\r\n    if (needsSave) {\r\n      if (!this._hasChanges) this._setHasChanges(true);\r\n    } else {\r\n      // called when rejecting a change or merging an unchanged record.\r\n      // NOTE: this can be slow with lots of entities in the cache.\r\n      // so defer it during a query/import or save and call it once when complete ( if needed).\r\n      if (this._hasChanges) {\r\n        if (this.isLoading) {\r\n          this._hasChangesAction = this._hasChangesAction || function () {\r\n            this._setHasChanges(null);\r\n            this.entityChanged.publish(ecArgs);\r\n          }.bind(this);\r\n          return;\r\n        } else {\r\n          this._setHasChanges();\r\n        }\r\n      }\r\n    }\r\n    this.entityChanged.publish(ecArgs);\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _setHasChanges(hasChanges?: boolean) {\r\n    if (hasChanges == null) hasChanges = this._hasChangesCore();\r\n    let hadChanges = this._hasChanges;\r\n    this._hasChanges = hasChanges;\r\n    if (hasChanges !== hadChanges) {\r\n      this.hasChangesChanged.publish({ entityManager: this, hasChanges: hasChanges });\r\n    }\r\n    this._hasChangesAction = undefined;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _linkRelatedEntities(entity: Entity) {\r\n    let em = this;\r\n    let entityAspect = entity.entityAspect;\r\n    // we do not want entityState to change as a result of linkage.\r\n    core.using(em, \"isLoading\", true, function () {\r\n\r\n      let unattachedMap = em._unattachedChildrenMap;\r\n      let entityKey = entityAspect.getKey();\r\n      let entityType = entityKey.entityType;\r\n\r\n      while (entityType) {\r\n        let keystring = entityKey.toString(entityType);\r\n\r\n        // attach any unattachedChildren\r\n        let tuples = unattachedMap.getTuplesByString(keystring);\r\n        if (tuples) {\r\n          tuples.slice(0).forEach(function (tpl) {\r\n\r\n            let unattachedChildren = tpl.children.filter(function (e) {\r\n              return e.entityAspect.entityState !== EntityState.Detached;\r\n            });\r\n\r\n            let childToParentNp: NavigationProperty;\r\n            let parentToChildNp: NavigationProperty;\r\n\r\n            // np is usually childToParentNp\r\n            // except with unidirectional 1-n where it is parentToChildNp;\r\n            let np = tpl.navigationProperty;\r\n\r\n            let inverseNp = np.inverse;\r\n            if (inverseNp) {\r\n              // bidirectional\r\n              childToParentNp = np;\r\n              parentToChildNp = inverseNp;\r\n\r\n              if (parentToChildNp.isScalar) {\r\n                let onlyChild = unattachedChildren[0];\r\n                entity.setProperty(parentToChildNp.name, onlyChild);\r\n                onlyChild.setProperty(childToParentNp.name, entity);\r\n              } else {\r\n                let currentChildren = entity.getProperty(parentToChildNp.name);\r\n                unattachedChildren.forEach(function (child) {\r\n                  currentChildren.push(child);\r\n                  child.setProperty(childToParentNp.name, entity);\r\n                });\r\n              }\r\n              unattachedMap.removeChildren(keystring, childToParentNp);\r\n            } else {\r\n              // unidirectional\r\n              // if (np.isScalar || np.parentType !== entity.entityType) {\r\n              if (np.isScalar) {\r\n                // n -> 1  eg: child: OrderDetail parent: Product\r\n                // 1 -> 1 eg child: Employee parent: Employee ( only Manager, no DirectReports property)\r\n                childToParentNp = np;\r\n                unattachedChildren.forEach(function (child) {\r\n                  child.setProperty(childToParentNp.name, entity);\r\n                });\r\n                unattachedMap.removeChildren(keystring, childToParentNp);\r\n              } else {\r\n                // 1 -> n  eg: parent: Region child: Terr\r\n                // TODO: need to remove unattached children from the map after this; only a perf issue.\r\n                parentToChildNp = np;\r\n                let currentChildren = entity.getProperty(parentToChildNp.name);\r\n                unattachedChildren.forEach(function (child) {\r\n                  // we know if can't already be there.\r\n                  currentChildren._push(child);\r\n                });\r\n              }\r\n            }\r\n          });\r\n        }\r\n        entityType = entityType.baseEntityType; // look for relationships up the hierarchy\r\n      }\r\n\r\n\r\n      // now add to unattachedMap if needed.\r\n      entity.entityType.navigationProperties.forEach(function (np) {\r\n        if (np.isScalar) {\r\n          let value = entity.getProperty(np.name);\r\n          // property is already linked up\r\n          if (value) return;\r\n        }\r\n\r\n        // first determine if np contains a parent or child\r\n        // having a parentKey means that this is a child\r\n        // if a parent then no need for more work because children will attach to it.\r\n        let parentKey = entityAspect.getParentKey(np);\r\n        if (parentKey) {\r\n          // check for empty keys - meaning that parent id's are not yet set.\r\n          if (parentKey._isEmpty()) return;\r\n          // if a child - look for parent in the em cache\r\n          if (np.invForeignKeyNames.length) {\r\n            // np relates to non-PK property of parent entity\r\n            const query = new EntityQuery(parentKey.entityType.defaultResourceName).where(np.invForeignKeyNames[0], 'eq', parentKey.values[0]);\r\n            const qresult = em.executeQueryLocally(query);\r\n            if (qresult.length === 1) {\r\n              let parent = qresult[0];\r\n              entity.setProperty(np.name, parent);\r\n            }\r\n          } else {\r\n            // np relates to PK of parent entity\r\n            let parent = em.getEntityByKey(parentKey);\r\n            if (parent) {\r\n              // if found hook it up\r\n              entity.setProperty(np.name, parent);\r\n            } else {\r\n              // else add parent to unresolvedParentMap;\r\n              unattachedMap.addChild(parentKey, np, entity);\r\n            }\r\n          }\r\n        } else if (np.inverse && np.inverse.invForeignKeyNames.length) {\r\n          // np relates to non-PK property of parent entity; query entities by FK\r\n          const akValue = entity.getProperty(np.inverse.invForeignKeyNames[0]);\r\n          const query = new EntityQuery(np.entityType.defaultResourceName).where(np.invForeignKeyNames[0], 'eq', akValue);\r\n          const qresult = em.executeQueryLocally(query);\r\n          qresult.forEach((child: Entity) => {\r\n            child.setProperty(np.inverse.name, entity);\r\n          });\r\n        }\r\n      });\r\n\r\n      // handle unidirectional 1-x where we set x.fk\r\n      entity.entityType.foreignKeyProperties.forEach(function (fkProp) {\r\n        let invNp = fkProp.inverseNavigationProperty;\r\n        if (!invNp) return;\r\n        // unidirectional fk props only\r\n        let fkValue = entity.getProperty(fkProp.name);\r\n        let parentKey = new EntityKey(invNp.parentType, [fkValue]);\r\n        let parent = em.getEntityByKey(parentKey);\r\n\r\n        if (parent) {\r\n          if (invNp.isScalar) {\r\n            parent.setProperty(invNp.name, entity);\r\n          } else {\r\n            if (em.isLoading) {\r\n              parent.getProperty(invNp.name)._push(entity);\r\n            } else {\r\n              parent.getProperty(invNp.name).push(entity);\r\n            }\r\n          }\r\n        } else {\r\n          // else add parent to unresolvedParentMap;\r\n          unattachedMap.addChild(parentKey, invNp, entity);\r\n        }\r\n      });\r\n    });\r\n\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _attachEntityCore(entity: Entity, entityState: EntityState, mergeStrategy: MergeStrategy) {\r\n    let group = findOrCreateEntityGroup(this, entity.entityType);\r\n    let attachedEntity = group.attachEntity(entity, entityState, mergeStrategy);\r\n    this._linkRelatedEntities(attachedEntity);\r\n    return attachedEntity;\r\n  }\r\n\r\n  /** @hidden @internal */\r\n  _updateFkVal(fkProp: DataProperty, oldValue: any, newValue: any) {\r\n    let group = this._entityGroupMap[fkProp.parentType.name];\r\n    if (!group) return;\r\n    group._updateFkVal(fkProp, oldValue, newValue);\r\n  }\r\n}\r\n\r\nEntityManager.prototype._$typeName = \"EntityManager\";\r\n\r\nBreezeEvent.bubbleEvent(EntityManager.prototype);\r\n\r\nfunction clearServerErrors(entities: Entity[]) {\r\n  entities.forEach(function (entity) {\r\n    let serverKeys: string[] = [];\r\n    let aspect = entity.entityAspect;\r\n    core.objectForEach(aspect._validationErrors, function (key, ve) {\r\n      if (ve.isServerError) serverKeys.push(key);\r\n    });\r\n    if (serverKeys.length === 0) return;\r\n    aspect._processValidationOpAndPublish(function () {\r\n      serverKeys.forEach(function (key) {\r\n        aspect._removeValidationError(key);\r\n      });\r\n    });\r\n  });\r\n}\r\n\r\nfunction createEntityErrors(entities: Entity[]) {\r\n  let entityErrors: EntityError[] = [];\r\n  entities.forEach((entity) => {\r\n    core.objectForEach(entity.entityAspect._validationErrors, function (key, ve) {\r\n      let cfg = core.extend({\r\n        entity: entity,\r\n        errorName: ve.validator.name\r\n      }, ve, [\"errorMessage\", \"propertyName\", \"isServerError\", \"custom\"]) as EntityError;\r\n      entityErrors.push(cfg);\r\n    });\r\n  });\r\n  return entityErrors;\r\n}\r\n\r\n\r\nfunction processServerErrors(saveContext: SaveContext, saveError: SaveErrorFromServer) {\r\n  // converting ISaveErrorFromServer -> ISaveError\r\n  let serverErrors = saveError.entityErrors;\r\n  if (!serverErrors) return <SaveError> <any> saveError;\r\n  let entityManager = saveContext.entityManager;\r\n  let metadataStore = entityManager.metadataStore;\r\n  let entityErrors = serverErrors.map((serr) => {\r\n    let entity: Entity | null = null;\r\n    let entityType: EntityType | undefined;\r\n    if (serr.keyValues) {\r\n      entityType = metadataStore._getStructuralType(serr.entityTypeName) as EntityType;\r\n      let ekey = new EntityKey(entityType, serr.keyValues);\r\n      entity = entityManager.getEntityByKey(ekey);\r\n    }\r\n\r\n    if (entityType && entity) {\r\n      let context = serr.propertyName ?\r\n        {\r\n          propertyName: serr.propertyName,\r\n          property: entityType.getProperty(serr.propertyName)\r\n        } : {\r\n        };\r\n      let key = ValidationError.getKey(serr.errorName || serr.errorMessage, serr.propertyName);\r\n\r\n      let ve = new ValidationError(null, context, serr.errorMessage, key);\r\n      ve.isServerError = true;\r\n      entity.entityAspect.addValidationError(ve);\r\n    }\r\n\r\n    let entityError = core.extend({\r\n      entity: entity,\r\n      isServerError: true\r\n    }, serr, [\"errorName\", \"errorMessage\", \"propertyName\", \"custom\"]) as EntityError;\r\n    return entityError;\r\n  });\r\n  // converting ISaveErrorFromServer -> ISaveError \r\n  saveError.entityErrors = entityErrors as any;\r\n  return <SaveError> <any> saveError;\r\n}\r\n\r\nexport interface IEntityByKeyResult {\r\n  entity?: Entity;\r\n  entityKey: EntityKey;\r\n  fromCache: boolean;\r\n}\r\n\r\nfunction fetchEntityByKeyCore(em: EntityManager, args: any[]): Promise<IEntityByKeyResult> {\r\n  let tpl = createEntityKey(em, args);\r\n  let entityKey = tpl.entityKey;\r\n\r\n  let checkLocalCacheFirst = tpl.remainingArgs.length === 0 ? false : !!tpl.remainingArgs[0];\r\n  let entity: Entity | null = null;\r\n  let foundIt = false;\r\n  if (checkLocalCacheFirst) {\r\n    entity = em.getEntityByKey(entityKey);\r\n    foundIt = entity != null;\r\n    if (entity != null &&\r\n      // null the entity if it is deleted and we should exclude deleted entities\r\n      !em.queryOptions.includeDeleted && entity.entityAspect.entityState.isDeleted()) {\r\n      entity = null;\r\n      // but resume looking if we'd overwrite deleted entity with a remote entity\r\n      // note: em.queryOptions is always fully resolved by now\r\n      foundIt = em.queryOptions.mergeStrategy !== MergeStrategy.OverwriteChanges;\r\n    }\r\n  }\r\n  if (foundIt) {\r\n    return Promise.resolve({ entity: entity || undefined, entityKey: entityKey, fromCache: true });\r\n  } else {\r\n    return EntityQuery.fromEntityKey(entityKey).using(em).execute().then(function (data: any) {\r\n      entity = (data.results.length === 0) ? null : data.results[0];\r\n      return Promise.resolve({ entity: entity || undefined, entityKey: entityKey, fromCache: false });\r\n    });\r\n  }\r\n}\r\n\r\n\r\n// private fns\r\n\r\n// takes in entityTypes as either strings or entityTypes or arrays of either\r\n// and returns either an entityType or an array of entityTypes or throws an error\r\nfunction checkEntityTypes(em: EntityManager, entityTypes?: EntityType | EntityType[] | string | string[]) {\r\n  assertParam(entityTypes, \"entityTypes\").isString().isOptional().or().isNonEmptyArray().isString()\r\n    .or().isInstanceOf(EntityType).or().isNonEmptyArray().isInstanceOf(EntityType).check();\r\n  let resultTypes: EntityType | EntityType[] | undefined;\r\n  if (typeof entityTypes === \"string\") {\r\n    resultTypes = em.metadataStore._getStructuralType(entityTypes, false) as (EntityType | EntityType[]);\r\n  } else if (Array.isArray(entityTypes) && typeof entityTypes[0] === \"string\") {\r\n    resultTypes = (entityTypes as string[]).map(function (etName) {\r\n      return em.metadataStore._getStructuralType(etName, false) as EntityType;\r\n    });\r\n  } else {\r\n    resultTypes = entityTypes as (EntityType | EntityType[] | undefined);\r\n  }\r\n\r\n  return resultTypes;\r\n}\r\n\r\nfunction getChangesCore(em: EntityManager, entityTypes?: EntityType | EntityType[]) {\r\n  let entityGroups = getEntityGroups(em, entityTypes);\r\n\r\n  // TODO: think about writing a core.mapMany method if we see more of these.\r\n  let selected: Entity[] = [];\r\n  entityGroups.forEach(function (eg) {\r\n    // eg may be undefined or null\r\n    if (!eg) return;\r\n    let entities = eg.getChanges();\r\n    if (selected && selected.length) {\r\n      selected = selected.concat(entities);\r\n    } else {\r\n      selected = entities;\r\n    }\r\n  });\r\n  return selected;\r\n}\r\n\r\nfunction getEntitiesCore(em: EntityManager, entityTypes: EntityType | EntityType[] | undefined, entityStates: EntityState[]) {\r\n  let entityGroups = getEntityGroups(em, entityTypes);\r\n\r\n  // TODO: think about writing a core.mapMany method if we see more of these.\r\n  let selected: Entity[] = [];\r\n  entityGroups.forEach(function (eg) {\r\n    // eg may be undefined or null\r\n    if (!eg) return;\r\n    let entities = eg.getEntities(entityStates);\r\n    if (selected && selected.length) {\r\n      selected = selected.concat(entities);\r\n    } else {\r\n      selected = entities;\r\n    }\r\n  });\r\n  return selected;\r\n}\r\n\r\n\r\nfunction createEntityKey(em: EntityManager, args: any[]) {\r\n  try {\r\n    if (args[0] instanceof EntityKey) {\r\n      return { entityKey: args[0] as EntityKey, remainingArgs: core.arraySlice(args, 1) };\r\n    } else if (args.length >= 2) {\r\n      let entityType = (typeof args[0] === 'string') ? em.metadataStore._getStructuralType(args[0], false) : args[0];\r\n      return { entityKey: new EntityKey(entityType, args[1]), remainingArgs: core.arraySlice(args, 2) };\r\n    }\r\n  } catch (e) {/* throw below */\r\n    // throw new Error(\"Must supply an EntityKey OR an EntityType name or EntityType followed by a key value or an array of key values.\");\r\n  }\r\n  throw new Error(\"Must supply an EntityKey OR an EntityType name or EntityType followed by a key value or an array of key values.\");\r\n}\r\n\r\nfunction markIsBeingSaved(entities: Entity[], flag: boolean) {\r\n  entities.forEach(function (entity) {\r\n    entity.entityAspect.isBeingSaved = flag;\r\n  });\r\n}\r\n\r\nfunction exportEntityGroups(em: EntityManager, entitiesOrEntityTypes: Entity[] | EntityType[] | string[]) {\r\n  let entityGroupMap: { [index: string]: EntityGroup };\r\n  let first = entitiesOrEntityTypes && entitiesOrEntityTypes[0];\r\n  // check if array\r\n  if (first) {\r\n    // group entities by entityType and\r\n    // create 'groups' that look like entityGroups.\r\n    entityGroupMap = {};\r\n    if ((first as any).entityType) {\r\n      let entities = entitiesOrEntityTypes as Entity[];\r\n      // assume \"entities\" is an array of entities;\r\n      entities.forEach(function (e) {\r\n        if (e.entityAspect.entityState === EntityState.Detached) {\r\n          throw new Error(\"Unable to export an entity with an EntityState of 'Detached'\");\r\n        }\r\n        let group = entityGroupMap[e.entityType.name];\r\n        if (!group) {\r\n          group = {} as EntityGroup;\r\n          group.entityType = e.entityType;\r\n          group._entities = [];\r\n          entityGroupMap[e.entityType.name] = group;\r\n        }\r\n        group._entities.push(e);\r\n      });\r\n    } else {\r\n      // assume \"entities\" is an array of EntityTypes (or names)\r\n      let entityTypes = checkEntityTypes(em, entitiesOrEntityTypes as EntityType[] | string[]) as EntityType[];\r\n      if (entityTypes != null) {\r\n        entityTypes.forEach((et) => {\r\n          let group = em._entityGroupMap[et.name];\r\n          if (group && group._entities.length) {\r\n            entityGroupMap[et.name] = group;\r\n          }\r\n        });\r\n      }\r\n    }\r\n  } else if (entitiesOrEntityTypes && entitiesOrEntityTypes.length === 0) {\r\n    // empty array = export nothing\r\n    entityGroupMap = {};\r\n  } else {\r\n    entityGroupMap = em._entityGroupMap;\r\n  }\r\n\r\n  let tempKeys: ITempKey[] = [];\r\n  let newGroupMap = {};\r\n  core.objectForEach(entityGroupMap, (entityTypeName, entityGroup) => {\r\n    newGroupMap[entityTypeName] = exportEntityGroup(entityGroup, tempKeys);\r\n  });\r\n\r\n  return { entityGroupMap: newGroupMap, tempKeys: tempKeys };\r\n}\r\n\r\nfunction exportEntityGroup(entityGroup: EntityGroup, tempKeys: ITempKey[]) {\r\n  let resultGroup = {} as { entities: any[] };\r\n  let entityType = entityGroup.entityType;\r\n  let dps = entityType.dataProperties;\r\n  let serializerFn = getSerializerFn(entityType);\r\n  let rawEntities: any[] = [];\r\n  entityGroup._entities.forEach((entity) => {\r\n    if (entity) {\r\n      let rawEntity = structuralObjectToJson(entity, dps, serializerFn, tempKeys);\r\n      rawEntities.push(rawEntity);\r\n    }\r\n  });\r\n  resultGroup.entities = rawEntities;\r\n  return resultGroup;\r\n}\r\n\r\nfunction structuralObjectToJson(so: StructuralObject, dps: DataProperty[], serializerFn?: (dp: DataProperty, value: any) => any, tempKeys?: ITempKey[]) {\r\n\r\n  let result = {};\r\n  dps.forEach(function (dp) {\r\n    let dpName = dp.name;\r\n    let value = so.getProperty(dpName);\r\n    if (value == null && dp.defaultValue == null) return;\r\n\r\n    if (value && dp.isComplexProperty) {\r\n      let coDps = (dp.dataType as ComplexType).dataProperties;\r\n      value = core.map(value, function (v: ComplexObject) {\r\n        return structuralObjectToJson(v, coDps, serializerFn);\r\n      });\r\n    } else {\r\n      value = serializerFn ? serializerFn(dp, value) : value;\r\n      if (dp.isUnmapped) {\r\n        value = core.toJSONSafe(value, core.toJSONSafeReplacer);\r\n      }\r\n    }\r\n    if (value === undefined) return;\r\n    result[dpName] = value;\r\n  });\r\n\r\n  // if (so.entityAspect) {\r\n  if (EntityAspect.isEntity(so)) {\r\n    let aspect = so.entityAspect;\r\n    let entityState = aspect.entityState;\r\n    let newAspect = {\r\n      tempNavPropNames: exportTempKeyInfo(aspect, tempKeys || []),\r\n      entityState: entityState.name\r\n    } as any;\r\n    if (aspect.extraMetadata) {\r\n      newAspect.extraMetadata = aspect.extraMetadata;\r\n    }\r\n    if (entityState.isModified() || entityState.isDeleted()) {\r\n      newAspect.originalValuesMap = aspect.originalValues;\r\n    }\r\n    (result as any).entityAspect = newAspect;\r\n  } else {\r\n    let aspect = so.complexAspect;\r\n    let newAspect = {} as any;\r\n    if (aspect.originalValues && !core.isEmpty(aspect.originalValues)) {\r\n      newAspect.originalValuesMap = aspect.originalValues;\r\n    }\r\n\r\n    (result as any).complexAspect = newAspect;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\ninterface ITempKey {\r\n  entityType: string;\r\n  values: any[];\r\n}\r\n\r\nfunction exportTempKeyInfo(entityAspect: EntityAspect, tempKeys: ITempKey[]) {\r\n  let entity = entityAspect.entity as Entity;\r\n  if (entityAspect.hasTempKey) {\r\n    tempKeys.push(entityAspect.getKey().toJSON());\r\n  }\r\n  // create map for this entity with foreignKeys that are 'temporary'\r\n  // map -> key: tempKey, value: fkPropName\r\n  let tempNavPropNames: string[] = [];\r\n  entity.entityType.navigationProperties.forEach(function (np) {\r\n    if (np.relatedDataProperties) {\r\n      let relatedValue = entity.getProperty(np.name);\r\n      if (relatedValue && relatedValue.entityAspect.hasTempKey) {\r\n        tempNavPropNames.push(np.name);\r\n      }\r\n    }\r\n  });\r\n  return tempNavPropNames;\r\n}\r\n\r\nfunction importEntityGroup(entityGroup: EntityGroup, jsonGroup: { entities: any[] }, importConfig: ImportConfigExt) {\r\n\r\n  let tempKeyMap = importConfig.tempKeyMap;\r\n  let mergeAdds = !!importConfig.mergeAdds;\r\n\r\n  let entityType = entityGroup.entityType;\r\n  let mergeStrategy = importConfig.mergeStrategy;\r\n\r\n  let targetEntity: Entity | undefined;\r\n\r\n  let em = entityGroup.entityManager;\r\n  let entityChanged = em.entityChanged;\r\n  let entitiesToLink: Entity[] = [];\r\n  let rawValueFn = DataProperty.getRawValueFromClient;\r\n  jsonGroup.entities.forEach(function (rawEntity: any) {\r\n    let newAspect = rawEntity.entityAspect;\r\n\r\n    let entityKey = entityType.getEntityKeyFromRawEntity(rawEntity, rawValueFn);\r\n    let entityState = EntityState.fromName(newAspect.entityState) as EntityState;\r\n    if (!entityState || entityState === EntityState.Detached) {\r\n      throw new Error(\"Only entities with a non detached entity state may be imported.\");\r\n    }\r\n\r\n    // Merge if raw entity is in cache UNLESS this is a new entity w/ a temp key\r\n    // Cannot safely merge such entities even if could match temp key to an entity in cache.\r\n    // Can enable merge of entities w/temp key using \"mergeAdds\" - use at your own risk!\r\n    let newTempKey = !mergeAdds && entityState.isAdded() && getMappedKey(tempKeyMap!, entityKey);\r\n    targetEntity = newTempKey ? undefined : entityGroup.findEntityByKey(entityKey);\r\n\r\n    if (targetEntity) {\r\n      if (mergeStrategy === MergeStrategy.SkipMerge) {\r\n        // deliberate fall thru\r\n      } else if (mergeStrategy === MergeStrategy.Disallowed) {\r\n        throw new Error(\"A MergeStrategy of 'Disallowed' prevents \" + entityKey.toString() + \" from being merged\");\r\n      } else {\r\n        let targetEntityState = targetEntity.entityAspect.entityState;\r\n        let wasUnchanged = targetEntityState.isUnchanged();\r\n        if (mergeStrategy === MergeStrategy.OverwriteChanges || wasUnchanged) {\r\n          entityType._updateTargetFromRaw(targetEntity, rawEntity, rawValueFn);\r\n          targetEntity.entityAspect.setEntityState(entityState);\r\n          entityChanged.publish({ entityAction: EntityAction.MergeOnImport, entity: targetEntity });\r\n        }\r\n      }\r\n    } else {\r\n      targetEntity = entityType._createInstanceCore() as Entity;\r\n      entityType._updateTargetFromRaw(targetEntity, rawEntity, rawValueFn);\r\n      if (newTempKey) {\r\n        targetEntity.entityAspect.hasTempKey = true;\r\n        // fixup pk\r\n        targetEntity.setProperty(entityType.keyProperties[0].name, newTempKey.values[0]);\r\n\r\n        // fixup foreign keys\r\n        // This is safe because the entity is detached here and therefore originalValues will not be updated.\r\n        if (newAspect.tempNavPropNames) {\r\n          newAspect.tempNavPropNames.forEach(function (npName: string) {\r\n            let np = entityType.getNavigationProperty(npName);\r\n            let fkPropName = np!.relatedDataProperties[0].name;\r\n            let oldFkValue = targetEntity!.getProperty(fkPropName);\r\n            let fk = new EntityKey(np!.entityType, [oldFkValue]);\r\n            let newFk = getMappedKey(tempKeyMap!, fk);\r\n            targetEntity!.setProperty(fkPropName, newFk!.values[0]);\r\n          });\r\n        }\r\n      }\r\n      // Now performed in attachEntity\r\n      targetEntity = entityGroup.attachEntity(targetEntity, entityState);\r\n      entityChanged.publish({ entityAction: EntityAction.AttachOnImport, entity: targetEntity });\r\n      if (!entityState.isUnchanged()) {\r\n        em._notifyStateChange(targetEntity, true);\r\n      }\r\n    }\r\n\r\n    entitiesToLink.push(targetEntity);\r\n  });\r\n  return entitiesToLink;\r\n}\r\n\r\nfunction getMappedKey(tempKeyMap: ITempKeyMap, entityKey: EntityKey) {\r\n  let newKey = tempKeyMap[entityKey.toString()];\r\n  if (newKey) return newKey;\r\n  let subtypes = entityKey._subtypes;\r\n  if (!subtypes) return null;\r\n  for (let i = 0, j = subtypes.length; i < j; i++) {\r\n    newKey = tempKeyMap[entityKey.toString(subtypes[i])];\r\n    if (newKey) return newKey;\r\n  }\r\n  return null;\r\n}\r\n\r\nfunction promiseWithCallbacks<T>(promise: Promise<T>, callback?: Callback, errorCallback?: ErrorCallback) {\r\n  promise = promise.then(function (data) {\r\n    if (callback) callback(data);\r\n    return Promise.resolve(data);\r\n  }, function (error) {\r\n    if (errorCallback) errorCallback(error);\r\n    return Promise.reject(error);\r\n  });\r\n  return promise;\r\n}\r\n\r\nfunction getEntitiesToSave(em: EntityManager, entities?: Entity[]) {\r\n  let entitiesToSave: Entity[];\r\n  if (entities) {\r\n    entitiesToSave = entities.filter(function (e) {\r\n      if (e.entityAspect.entityManager !== em) {\r\n        throw new Error(\"Only entities in this entityManager may be saved\");\r\n      }\r\n      return !e.entityAspect.entityState.isDetached();\r\n    });\r\n  } else {\r\n    entitiesToSave = em.getChanges();\r\n  }\r\n  return entitiesToSave;\r\n}\r\n\r\nfunction fixupKeys(em: EntityManager, keyMappings: KeyMapping[]) {\r\n  em._inKeyFixup = true;\r\n  keyMappings.forEach(function (km) {\r\n    let group = em._entityGroupMap[km.entityTypeName];\r\n    if (!group) {\r\n      throw new Error(\"Unable to locate the following fully qualified EntityType name: \" + km.entityTypeName);\r\n    }\r\n    group._fixupKey(km.tempValue, km.realValue);\r\n  });\r\n  em._inKeyFixup = false;\r\n}\r\n\r\nfunction getEntityGroups(em: EntityManager, entityTypes?: EntityType | EntityType[]) {\r\n  let groupMap = em._entityGroupMap;\r\n  if (entityTypes) {\r\n    return core.toArray(entityTypes).map(function (et: EntityType) {\r\n      if (et instanceof EntityType) {\r\n        return groupMap[et.name];\r\n      } else {\r\n        throw new Error(\"The EntityManager.getChanges() 'entityTypes' parameter must be either an entityType or an array of entityTypes or null\");\r\n      }\r\n    });\r\n  } else {\r\n    return core.getOwnPropertyValues(groupMap) as EntityGroup[];\r\n  }\r\n}\r\n\r\nfunction checkEntityKey(em: EntityManager, entity: Entity) {\r\n  let ek = entity.entityAspect.getKey();\r\n  // return properties that are = to defaultValues\r\n  let keyPropsWithDefaultValues = core.arrayZip(entity.entityType.keyProperties, ek.values, function (kp, kv) {\r\n    return (kp.defaultValue === kv) ? kp : null;\r\n  }).filter(function (kp) {\r\n    return kp !== null;\r\n  });\r\n  if (keyPropsWithDefaultValues.length) {\r\n    if (entity.entityType.autoGeneratedKeyType !== AutoGeneratedKeyType.None) {\r\n      em.generateTempKeyValue(entity);\r\n    } else {\r\n      // we will allow attaches of entities where only part of the key is set.\r\n      if (keyPropsWithDefaultValues.length === ek.values.length) {\r\n        throw new Error(\"Cannot attach an object of type  (\" + entity.entityType.name + \") to an EntityManager without first setting its key or setting its entityType 'AutoGeneratedKeyType' property to something other than 'None'\");\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nfunction validateEntityStates(em: EntityManager, entityStates?: EntityState | EntityState[]) {\r\n  if (!entityStates) return [] as EntityState[];\r\n  let entStates = core.toArray(entityStates) as EntityState[];\r\n  entStates.forEach((es) => {\r\n    if (!(es instanceof EntityState)) {\r\n      throw new Error(\"The EntityManager.getChanges() 'entityStates' parameter must either be null, an entityState or an array of entityStates\");\r\n    }\r\n  });\r\n  return entStates;\r\n}\r\n\r\nfunction attachRelatedEntities(em: EntityManager, entity: Entity, entityState: EntityState, mergeStrategy: MergeStrategy) {\r\n  let navProps = entity.entityType.navigationProperties;\r\n  navProps.forEach(function (np) {\r\n    let related = entity.getProperty(np.name);\r\n    if (np.isScalar) {\r\n      if (!related) return;\r\n      em.attachEntity(related, entityState, mergeStrategy);\r\n    } else {\r\n      related.forEach(function (e: Entity) {\r\n        em.attachEntity(e, entityState, mergeStrategy);\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\n// returns a promise\r\nfunction executeQueryCore(em: EntityManager, query: EntityQuery | string, queryOptions: QueryOptions, dataService: DataService): Promise<QueryResult> {\r\n  try {\r\n    let results: any[];\r\n    let metadataStore = em.metadataStore;\r\n\r\n    if (metadataStore.isEmpty() && dataService.hasServerMetadata) {\r\n      throw new Error(\"cannot execute _executeQueryCore until metadataStore is populated.\");\r\n    }\r\n\r\n    if (queryOptions.fetchStrategy === FetchStrategy.FromLocalCache) {\r\n      try {\r\n        if (typeof query === 'string') {\r\n          throw new Error(\"cannot execute 'string' EntityQuery locally.\");\r\n        }\r\n        let qr = executeQueryLocallyCore(em, query);\r\n        return Promise.resolve({ results: qr.results, entityManager: em, inlineCount: qr.inlineCount, query: query });\r\n      } catch (e) {\r\n        return Promise.reject(e);\r\n      }\r\n    }\r\n\r\n    let mappingContext: MappingContext | undefined = new MappingContext({\r\n      query: query,\r\n      entityManager: em,\r\n      dataService: dataService,\r\n      mergeOptions: {\r\n        mergeStrategy: queryOptions.mergeStrategy,\r\n        noTracking: !!(query as any).noTrackingEnabled,\r\n        includeDeleted: queryOptions.includeDeleted\r\n      }\r\n    });\r\n\r\n    let validateOnQuery = em.validationOptions.validateOnQuery;\r\n\r\n    return dataService.adapterInstance!.executeQuery(mappingContext).then(function (data: any) {\r\n      let result = core.wrapExecution(function () {\r\n        let state = { isLoading: em.isLoading };\r\n        em.isLoading = true;\r\n        em._pendingPubs = [];\r\n        return state;\r\n      }, function (state) {\r\n        // cleanup\r\n        em.isLoading = state.isLoading;\r\n        em._pendingPubs!.forEach(function (fn) {\r\n          fn();\r\n        });\r\n        em._pendingPubs = undefined;\r\n        em._hasChangesAction && em._hasChangesAction();\r\n        // TODO: removed - not sure why needed in first place...\r\n        // // HACK for GC\r\n        // query = undefined;\r\n        mappingContext = undefined;\r\n        // HACK: some errors thrown in next function do not propogate properly - this catches them.\r\n\r\n        if (state.error) {\r\n          return Promise.reject(state.error);\r\n        }\r\n\r\n      }, function () {\r\n        let nodes = dataService.jsonResultsAdapter.extractResults(data);\r\n        nodes = core.toArray(nodes);\r\n\r\n        results = mappingContext!.visitAndMerge(nodes, { nodeType: \"root\" });\r\n        if (validateOnQuery) {\r\n          results.forEach(function (r: any) {\r\n            // anon types and simple types will not have an entityAspect.\r\n            r.entityAspect && r.entityAspect.validateEntity();\r\n          });\r\n        }\r\n        mappingContext!.processDeferred();\r\n        // if query has expand clauses walk each of the 'results' and mark the expanded props as loaded.\r\n        if (query instanceof EntityQuery) {\r\n          markLoadedNavProps(results, query);\r\n        }\r\n        let retrievedEntities = core.objectMap(mappingContext!.refMap);\r\n        return { results: results, query: query, entityManager: em, httpResponse: data.httpResponse, inlineCount: data.inlineCount, retrievedEntities: retrievedEntities };\r\n      });\r\n      return Promise.resolve(result);\r\n    }, function (e: any) {\r\n      if (e) {\r\n        e.query = query;\r\n        e.entityManager = em;\r\n      }\r\n      return Promise.reject(e);\r\n    });\r\n\r\n  } catch (e) {\r\n    if (e) {\r\n      e.query = query;\r\n    }\r\n    return Promise.reject(e);\r\n  }\r\n}\r\n\r\nfunction markLoadedNavProps(entities: Entity[], query: EntityQuery) {\r\n  if (query.noTrackingEnabled) return;\r\n  let expandClause = query.expandClause;\r\n  if (expandClause == null) return;\r\n  expandClause.propertyPaths.forEach(function (propertyPath) {\r\n    let propNames = propertyPath.split('.');\r\n    markLoadedNavPath(entities, propNames);\r\n  });\r\n}\r\n\r\nfunction markLoadedNavPath(entities: Entity[], propNames: string[]) {\r\n  let propName = propNames[0];\r\n  entities.forEach((entity) => {\r\n    let ea = entity.entityAspect;\r\n    if (!ea) return; // entity may not be a 'real' entity in the case of a projection.\r\n    ea._markAsLoaded(propName);\r\n    if (propNames.length === 1) return;\r\n    let next = entity.getProperty(propName);\r\n    if (!next) return; // no children to process.\r\n    // strange logic because nonscalar nav values are NOT really arrays\r\n    // otherwise we could use Array.isArray\r\n    if (!next.arrayChanged) next = [next];\r\n    markLoadedNavPath(next, propNames.slice(1));\r\n  });\r\n}\r\n\r\nfunction updateConcurrencyProperties(entities: Entity[]) {\r\n  let candidates = entities.filter((e) => {\r\n    e.entityAspect.isBeingSaved = true;\r\n    return e.entityAspect.entityState.isModified()\r\n      && e.entityType.concurrencyProperties.length > 0;\r\n\r\n  });\r\n  if (candidates.length === 0) return;\r\n  candidates.forEach(function (c) {\r\n    c.entityType.concurrencyProperties.forEach(function (cp) {\r\n      updateConcurrencyProperty(c, cp);\r\n    });\r\n  });\r\n}\r\n\r\nfunction updateConcurrencyProperty(entity: Entity, property: DataProperty) {\r\n  // check if property has already been updated\r\n  if (entity.entityAspect.originalValues[property.name]) return;\r\n  let value = entity.getProperty(property.name);\r\n  let dataType = property.dataType as DataType;\r\n  if (!value) value = dataType.defaultValue;\r\n  if (dataType.isNumeric) {\r\n    entity.setProperty(property.name, value + 1);\r\n  } else if (dataType.getConcurrencyValue) {\r\n    // DataType has its own implementation\r\n    let nextValue = dataType.getConcurrencyValue(value);\r\n    entity.setProperty(property.name, nextValue);\r\n  } else if (dataType === DataType.Binary) {\r\n    // best guess - that this is a timestamp column and is computed on the server during save\r\n    // - so no need to set it here.\r\n    return;\r\n  } else {\r\n    // this just leaves DataTypes of Boolean, String and Byte - none of which should be the\r\n    // type for a concurrency column.\r\n    // NOTE: thought about just returning here but would rather be safe for now.\r\n    throw new Error(\"Unable to update the value of concurrency property before saving: \" + property.name);\r\n  }\r\n}\r\n\r\n\r\nfunction findOrCreateEntityGroup(em: EntityManager, entityType: EntityType) {\r\n  let group = em._entityGroupMap[entityType.name];\r\n  if (!group) {\r\n    group = new EntityGroup(em, entityType);\r\n    em._entityGroupMap[entityType.name] = group;\r\n  }\r\n  return group;\r\n}\r\n\r\nfunction findOrCreateEntityGroups(em: EntityManager, entityType: EntityType) {\r\n  let entityTypes = entityType.getSelfAndSubtypes();\r\n  return entityTypes.map((et) => {\r\n    return findOrCreateEntityGroup(em, et);\r\n  });\r\n}\r\n\r\nfunction unwrapInstance(structObj: StructuralObject, transformFn?: (dp: DataProperty, val: any) => any) {\r\n\r\n  let rawObject: any = {};\r\n  let stype = EntityAspect.isEntity(structObj) ? structObj.entityType : structObj.complexType;\r\n  let serializerFn = getSerializerFn(stype);\r\n  let unmapped = {};\r\n  stype.dataProperties.forEach(function (dp) {\r\n    if (dp.isComplexProperty) {\r\n      rawObject[dp.nameOnServer] = core.map(structObj.getProperty(dp.name), function (co) {\r\n        return unwrapInstance(co, transformFn);\r\n      });\r\n    } else {\r\n      let val = structObj.getProperty(dp.name);\r\n      val = transformFn ? transformFn(dp, val) : val;\r\n      if (val === undefined) return;\r\n      val = serializerFn ? serializerFn(dp, val) : val;\r\n      if (val !== undefined) {\r\n        if (dp.isUnmapped) {\r\n          unmapped[dp.nameOnServer] = core.toJSONSafe(val, core.toJSONSafeReplacer);\r\n        } else {\r\n          rawObject[dp.nameOnServer] = val;\r\n        }\r\n      }\r\n    }\r\n  });\r\n\r\n  if (!core.isEmpty(unmapped)) {\r\n    // TODO: review this.\r\n    (rawObject as any).__unmapped = unmapped;\r\n  }\r\n  return rawObject;\r\n}\r\n\r\nfunction unwrapOriginalValues(target: StructuralObject, metadataStore: MetadataStore, transformFn?: (dp: DataProperty, val: any) => any) {\r\n  let stype = EntityAspect.isEntity(target) ? target.entityType : target.complexType;\r\n  let aspect = EntityAspect.isEntity(target) ? target.entityAspect : target.complexAspect;\r\n  let fn = metadataStore.namingConvention.clientPropertyNameToServer;\r\n  let result = {} as Record<string, any>;\r\n  core.objectForEach(aspect.originalValues, function (propName, val) {\r\n    let prop = stype.getProperty(propName) as DataProperty;\r\n    val = transformFn ? transformFn(prop, val) : val;\r\n    if (val !== undefined) {\r\n      result[fn(propName, prop)] = val;\r\n    }\r\n  });\r\n  stype.complexProperties.forEach(function (cp) {\r\n    let nextTarget = target.getProperty(cp.name);\r\n    if (cp.isScalar) {\r\n      let unwrappedCo = unwrapOriginalValues(nextTarget, metadataStore, transformFn);\r\n      if (!core.isEmpty(unwrappedCo)) {\r\n        result[fn(cp.name, cp)] = unwrappedCo;\r\n      }\r\n    } else {\r\n      let unwrappedCos = nextTarget.map((item: any) => {\r\n        return unwrapOriginalValues(item, metadataStore, transformFn);\r\n      });\r\n      result[fn(cp.name, cp)] = unwrappedCos;\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\nfunction unwrapChangedValues(entity: Entity, metadataStore: MetadataStore, transformFn: (dp: DataProperty, val: any) => any) {\r\n  let stype = entity.entityType;\r\n  let serializerFn = getSerializerFn(stype);\r\n  let fn = metadataStore.namingConvention.clientPropertyNameToServer;\r\n  let result = {} as Record<string, any>;\r\n  core.objectForEach(entity.entityAspect.originalValues, function (propName, value) {\r\n    let prop = stype.getProperty(propName) as DataProperty;\r\n    let val = entity.getProperty(propName);\r\n    val = transformFn ? transformFn(prop, val) : val;\r\n    if (val === undefined) return;\r\n    val = serializerFn ? serializerFn(prop, val) : val;\r\n    if (val !== undefined) {\r\n      result[fn(propName, prop)] = val;\r\n    }\r\n  });\r\n  // any change to any complex object or array of complex objects returns the ENTIRE\r\n  // current complex object or complex object array.  This is by design. Complex Objects\r\n  // are atomic.\r\n  stype.complexProperties.forEach((cp) => {\r\n    if (cpHasOriginalValues(entity, cp)) {\r\n      let coOrCos = entity.getProperty(cp.name);\r\n      result[fn(cp.name, cp)] = core.map(coOrCos, function (co) {\r\n        return unwrapInstance(co, transformFn);\r\n      });\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\nfunction cpHasOriginalValues(structuralObject: StructuralObject, cp: DataProperty): boolean {\r\n  let coOrCos = structuralObject.getProperty(cp.name);\r\n  if (cp.isScalar) {\r\n    return coHasOriginalValues(coOrCos);\r\n  } else {\r\n    // this occurs when a nonscalar co array has had cos added or removed.\r\n    if (coOrCos._origValues) return true;\r\n    return coOrCos.some(function (co: ComplexObject) {\r\n      return coHasOriginalValues(co);\r\n    });\r\n  }\r\n}\r\n\r\nfunction executeQueryLocallyCore(em: EntityManager, query: EntityQuery) {\r\n  assertParam(query, \"query\").isInstanceOf(EntityQuery).check();\r\n\r\n  let metadataStore = em.metadataStore;\r\n  let entityType = query._getFromEntityType(metadataStore, true);\r\n  // there may be multiple groups is this is a base entity type.\r\n  let groups = findOrCreateEntityGroups(em, entityType!);\r\n  // filter then order then skip then take\r\n  let filterFunc = query.wherePredicate && query.wherePredicate.toFunction({ entityType: entityType });\r\n\r\n  let queryOptions = QueryOptions.resolve([query.queryOptions, em.queryOptions, QueryOptions.defaultInstance]);\r\n  let includeDeleted = queryOptions.includeDeleted === true;\r\n\r\n  let newFilterFunc = function (entity: Entity) {\r\n    return entity && (includeDeleted || !entity.entityAspect.entityState.isDeleted()) && (filterFunc ? filterFunc(entity) : true);\r\n  };\r\n\r\n  let result: any[] = [];\r\n  // TODO: mapMany\r\n  groups.forEach((group) => {\r\n    let entities = group._entities.filter(newFilterFunc) as Entity[];\r\n    if (entities.length) {\r\n      result = result.length ? result.concat(entities) : entities;\r\n    }\r\n  });\r\n\r\n  let orderByComparer = query.orderByClause && query.orderByClause.getComparer(entityType!);\r\n  if (orderByComparer) {\r\n    result.sort(orderByComparer);\r\n  }\r\n\r\n  let inlineCount = query.inlineCountEnabled ? result.length : undefined;\r\n\r\n  let skipCount = query.skipCount;\r\n  if (skipCount) {\r\n    result = result.slice(skipCount);\r\n  }\r\n  let takeCount = query.takeCount;\r\n  if (takeCount) {\r\n    result = result.slice(0, takeCount);\r\n  }\r\n\r\n  let selectClause = query.selectClause;\r\n  if (selectClause) {\r\n    let selectFn = selectClause.toFunction();\r\n    result = result.map(selectFn);\r\n  }\r\n  return { results: result, inlineCount: inlineCount };\r\n}\r\n\r\nfunction coHasOriginalValues(co: ComplexObject) {\r\n  // next line checks all non complex properties of the co.\r\n  if (!core.isEmpty(co.complexAspect.originalValues)) return true;\r\n  // now need to recursively check each of the cps\r\n  return co.complexType.complexProperties.some(function (cp) {\r\n    return cpHasOriginalValues(co, cp);\r\n  });\r\n}\r\n\r\nfunction getSerializerFn(stype: EntityType | ComplexType) {\r\n  return stype.serializerFn || (stype.metadataStore && stype.metadataStore.serializerFn);\r\n}\r\n\r\n","import { core } from './core';\r\nimport { assertConfig } from './assert-param';\r\nimport { config, InterfaceDef, BaseAdapter } from './config';\r\nimport { MappingContext } from './mapping-context';\r\nimport { EntityQuery } from './entity-query';\r\nimport { MetadataStore } from './entity-metadata';\r\nimport { JsonResultsAdapter, DataService } from './data-service';\r\nimport { Entity } from './entity-aspect';\r\nimport { SaveContext, SaveBundle, QueryResult, SaveResult, HttpResponse } from './entity-manager';\r\n\r\nexport interface InterfaceRegistryConfig {\r\n    ajax?: InterfaceDef<AjaxAdapter>;\r\n    modelLibrary?: InterfaceDef<ModelLibraryAdapter>;\r\n    dataService?: InterfaceDef<DataServiceAdapter>;\r\n    uriBuilder?: InterfaceDef<UriBuilderAdapter>;\r\n}\r\n\r\n/** Registers adapters used by Breeze */\r\nexport class InterfaceRegistry {\r\n    ajax = new InterfaceDef<AjaxAdapter>(\"ajax\");\r\n    modelLibrary = new InterfaceDef<ModelLibraryAdapter>(\"modelLibrary\");\r\n    dataService = new InterfaceDef<DataServiceAdapter>(\"dataService\");\r\n    uriBuilder = new InterfaceDef<UriBuilderAdapter>(\"uriBuilder\");\r\n}\r\n\r\n// This module describes the interfaceRegistry by extending config\r\n/** @hidden @internal */\r\ndeclare module \"./config\" {\r\n    interface BreezeConfig {\r\n        /**\r\n        Initializes a collection of adapter implementations and makes each one the default for its corresponding interface.\r\n        @method initializeAdapterInstances\r\n        @param config {Object}\r\n        @param [config.ajax] {String} - the name of a previously registered \"ajax\" adapter\r\n        @param [config.dataService] {String} - the name of a previously registered \"dataService\" adapter\r\n        @param [config.modelLibrary] {String} - the name of a previously registered \"modelLibrary\" adapter\r\n        @param [config.uriBuilder] {String} - the name of a previously registered \"uriBuilder\" adapter\r\n        @return [array of instances]\r\n        **/\r\n        initializeAdapterInstances(irConfig: InterfaceRegistryConfig): void;\r\n\r\n        // strongly typed version\r\n        interfaceRegistry: InterfaceRegistry;\r\n    }\r\n}\r\n\r\nconfig.interfaceRegistry = new InterfaceRegistry();\r\nconfig._interfaceRegistry = config.interfaceRegistry;\r\nconfig.interfaceRegistry.modelLibrary.getDefaultInstance = function() {\r\n    if (!this.defaultInstance) {\r\n        throw new Error(\"Unable to locate the default implementation of the '\" + this.name +\r\n            \"' interface.  Possible options are 'ko', 'backingStore' or 'backbone'. See the breeze.config.initializeAdapterInstances method.\");\r\n    }\r\n    return this.defaultInstance;\r\n};\r\n\r\n/**\r\nInitializes a collection of adapter implementations and makes each one the default for its corresponding interface.\r\n@method initializeAdapterInstances\r\n@param config {Object}\r\n@param [config.ajax] {String} - the name of a previously registered \"ajax\" adapter\r\n@param [config.dataService] {String} - the name of a previously registered \"dataService\" adapter\r\n@param [config.modelLibrary] {String} - the name of a previously registered \"modelLibrary\" adapter\r\n@param [config.uriBuilder] {String} - the name of a previously registered \"uriBuilder\" adapter\r\n@return [array of instances]\r\n**/\r\nconfig.initializeAdapterInstances = function (irConfig: InterfaceRegistryConfig) {\r\n    assertConfig(irConfig)\r\n        .whereParam(\"dataService\").isOptional()\r\n        .whereParam(\"modelLibrary\").isOptional()\r\n        .whereParam(\"ajax\").isOptional()\r\n        .whereParam(\"uriBuilder\").isOptional()\r\n        .applyAll(this, false);\r\n    return core.objectMap(config, this.initializeAdapterInstance);\r\n};\r\n\r\n/** DataServiceAdapter Ajax request configuration */\r\nexport interface AjaxConfig {\r\n    url: string;\r\n    /** GET, POST, etc. */\r\n    type?: string;\r\n    /** json, etc. */\r\n    dataType?: string;\r\n    contentType?: string;\r\n    crossDomain?: string | boolean;\r\n    headers?: {};\r\n    data?: any;\r\n    params?: {};\r\n    success: (res: HttpResponse) => void;\r\n    error: (res: (HttpResponse | Error)) => void;\r\n}\r\n\r\n/** Request sent by AjaxAdapter */\r\nexport interface AjaxRequest {\r\n    /** AjaxAdapter that initiated the request */\r\n    adapter: AjaxAdapter;\r\n    /** Request configuration */\r\n    config: RequestInit;\r\n    /** config from the DataServiceAdapter that called the AjaxAdapter */\r\n    dsaConfig: AjaxConfig;\r\n    /** Function called on response error */\r\n    error: (status: number, statusText: string, body: string, response: Response, errorThrown: any) => void;\r\n    /** Function called on response success */\r\n    success: (data: any, statusText: string, response: Response) => void;\r\n}\r\n\r\n/** Handles AJAX requests to server */\r\nexport interface AjaxAdapter extends BaseAdapter {\r\n    /** Function that performs the ajax request and calls the success or error function */\r\n    ajax(config: AjaxConfig): void;\r\n    /** Container for headers to be added to each request */\r\n    defaultSettings: { headers?: { [name: string]: string } };\r\n    /** Function to allow manipulating the request before sending */\r\n    requestInterceptor?: (req: AjaxRequest) => void;\r\n}\r\n\r\n/** Adapts breeze change-tracking to the UI framework */\r\nexport interface ModelLibraryAdapter extends BaseAdapter {\r\n    getTrackablePropertyNames: (entity: any) => string[];\r\n    initializeEntityPrototype(proto: Object): void;\r\n    startTracking(entity: any, entityCtor: Function): void;\r\n    createCtor?: Function;\r\n}\r\n\r\n/** Reshapes data moving between breeze and server */\r\nexport interface DataServiceAdapter extends BaseAdapter {\r\n    fetchMetadata(metadataStore: MetadataStore, dataService: DataService): Promise<any>;  // result of Promise is either rawMetadata or a string explaining why not.\r\n    executeQuery(mappingContext: MappingContext): Promise<QueryResult>;   // result of executeQuery will get passed to JsonResultsAdapter extractResults method\r\n    saveChanges(saveContext: SaveContext, saveBundle: SaveBundle): Promise<SaveResult>;\r\n    changeRequestInterceptor: ChangeRequestInterceptorCtor;\r\n    jsonResultsAdapter: JsonResultsAdapter;\r\n}\r\n\r\n/** Function called by AjaxAdapter before sending request */\r\nexport interface AjaxRequestInterceptor {\r\n    (req: AjaxRequest) : void;\r\n    /** Whether to remove the interceptor after it is called */\r\n    oneTime: boolean;\r\n}\r\n\r\n/** Builds URI for performing queries.  Serializes the EntityQuery according to the URI syntax. */\r\nexport interface UriBuilderAdapter extends BaseAdapter {\r\n    buildUri(query: EntityQuery, metadataStore: MetadataStore): string;\r\n}\r\n\r\n// -----------------------------------\r\n\r\nexport interface ChangeRequestInterceptorCtor {\r\n    new (saveContext: SaveContext, saveBundle: SaveBundle): ChangeRequestInterceptor;\r\n}\r\n\r\n/** Allows manipulating data in DataServiceAdapter before sending to server */\r\nexport interface ChangeRequestInterceptor {\r\n    oneTime?: boolean;\r\n    /**\r\n     Prepare and return the save data for an entity change-set.\r\n  \r\n     The adapter calls this method for each entity in the change-set,\r\n     after it has prepared a \"change request\" for that object.\r\n  \r\n     The method can do anything to the request but it must return a valid, non-null request.\r\n     @example\r\n     this.getRequest = function (request, entity, index) {\r\n            // alter the request that the adapter prepared for this entity\r\n            // based on the entity, saveContext, and saveBundle\r\n            // e.g., add a custom header or prune the originalValuesMap\r\n            return request;\r\n        };\r\n     @method getRequest\r\n     @param request {Object} The object representing the adapter's request to save this entity.\r\n     @param entity {Entity} The entity-to-be-save as it is in cache\r\n     @param index {Integer} The zero-based index of this entity in the change-set array\r\n     @return {Function} The potentially revised request.\r\n     **/\r\n    getRequest(request: any, entity: Entity, index: number): any;\r\n\r\n    /**\r\n     Last chance to change anything about the 'requests' array\r\n     after it has been built with requests for all of the entities-to-be-saved.\r\n  \r\n     The 'requests' array is the same as 'saveBundle.entities' in many implementations\r\n  \r\n     This method can do anything to the array including add and remove requests.\r\n     It's up to you to ensure that server will accept the requests array data as valid.\r\n  \r\n     Returned value is ignored.\r\n     @example\r\n     this.done = function (requests) {\r\n            // alter the array of requests representing the entire change-set\r\n            // based on the saveContext and saveBundle\r\n        };\r\n     @method done\r\n     @param requests {Array of Object} The adapter's array of request for this changeset.\r\n     **/\r\n    done(requests: Object[]): void;\r\n}","import { core } from './core';\r\nimport { BreezeEvent } from './event';\r\nimport { EntityAspect } from './entity-aspect';\r\nimport { DataProperty } from './entity-metadata';\r\n\r\n/** @hidden */\r\nexport interface ObservableArray {\r\n  push: (...args: any[]) => number;\r\n  _push: (...args: any[]) => number;\r\n  unshift: (...args: any[]) =>  number;\r\n  pop: () => any;\r\n  shift: () => any;\r\n  splice: (...args: any[]) => any[];\r\n  slice: (a: number, b?: number) => any[]; // implemented on the native array\r\n  length: number;\r\n  \r\n  getEntityAspect: () => EntityAspect;\r\n  arrayChanged: BreezeEvent<ArrayChangedArgs>;\r\n  parent?: Object;\r\n  parentProperty?: DataProperty;\r\n  _getEventParent: () => Object;\r\n  _getPendingPubs: () => any[]; // TODO: Pub[]\r\n  _beforeChange: () => void;\r\n  _processAdds(items: any[]): void;\r\n  _processRemoves(items: any[]): void;\r\n  _origValues: any[];\r\n  _pendingArgs: any;\r\n}\r\n\r\nexport interface ArrayChangedArgs {\r\n  array: any[];\r\n  added?: any[]; \r\n  removed?: any[];\r\n}\r\n\r\nlet mixin = {\r\n  push: function(...args: any[]) {\r\n    if (this._inProgress) {\r\n      return -1;\r\n    }\r\n\r\n    let goodAdds = this._getGoodAdds(args);\r\n    if (!goodAdds.length) {\r\n      return this.length;\r\n    }\r\n    this._beforeChange();\r\n    let result;\r\n    let objPrototype = Object.getPrototypeOf(this);\r\n    if (objPrototype.push) {\r\n        result = objPrototype.push.apply(this, goodAdds);\r\n    } else {\r\n        result = Array.prototype.push.apply(this, goodAdds);\r\n    }\r\n    processAdds(this, goodAdds);\r\n    return result;\r\n  },\r\n\r\n  _push: function(...args: any[]) {\r\n    if (this._inProgress) {\r\n      return -1;\r\n    }\r\n    let goodAdds = args;\r\n    this._beforeChange();\r\n    let result;\r\n    let objPrototype = Object.getPrototypeOf(this);\r\n    if (objPrototype.push) {\r\n        result = objPrototype.push.apply(this, goodAdds);\r\n    } else {\r\n        result = Array.prototype.push.apply(this, goodAdds);\r\n    }\r\n    processAdds(this, goodAdds);\r\n    return result;\r\n  },\r\n\r\n  unshift: function(...args: any[]) {\r\n    let goodAdds = this._getGoodAdds(args);\r\n    if (!goodAdds.length) {\r\n      return this.length;\r\n    }\r\n    this._beforeChange();\r\n    let result;\r\n    let objPrototype = Object.getPrototypeOf(this);\r\n    if (objPrototype.unshift) {\r\n        result = objPrototype.unshift.apply(this, goodAdds);\r\n    } else {\r\n        result = Array.prototype.unshift.apply(this, goodAdds);\r\n    }\r\n    processAdds(this, goodAdds);\r\n    return result;\r\n  },\r\n\r\n  pop: function() {\r\n    this._beforeChange();\r\n    let result;\r\n    let objPrototype = Object.getPrototypeOf(this);\r\n    if (objPrototype.pop) {\r\n        result = objPrototype.pop.apply(this);\r\n    } else {\r\n        result = Array.prototype.pop.apply(this);\r\n    }\r\n    processRemoves(this, [result]);\r\n    return result;\r\n  },\r\n\r\n  shift: function() {\r\n    this._beforeChange();\r\n    let result;\r\n    let objPrototype = Object.getPrototypeOf(this);\r\n    if (objPrototype.shift) {\r\n        result = objPrototype.shift.apply(this);\r\n    } else {\r\n        result = Array.prototype.shift.apply(this);\r\n    }    \r\n    processRemoves(this, [result]);\r\n    return result;\r\n  },\r\n\r\n  splice: function(...args: any[]) {\r\n    let goodAdds = this._getGoodAdds(core.arraySlice(args, 2));\r\n    let newArgs = core.arraySlice(args, 0, 2).concat(goodAdds);\r\n    this._beforeChange();\r\n    let result;\r\n    let objPrototype = Object.getPrototypeOf(this);\r\n    if (objPrototype.splice) {\r\n        result = objPrototype.splice.apply(this, newArgs);\r\n    } else {\r\n        result = Array.prototype.splice.apply(this, newArgs);\r\n    }\r\n    processRemoves(this, result);\r\n\r\n    if (goodAdds.length) {\r\n      processAdds(this, goodAdds);\r\n    }\r\n    return result;\r\n  },\r\n\r\n  getEntityAspect: function() {\r\n    return this.parent.entityAspect || this.parent.complexAspect.getEntityAspect();\r\n  },\r\n\r\n  _getEventParent: function() {\r\n    return this.getEntityAspect();\r\n  },\r\n\r\n  _getPendingPubs: function () {\r\n    let em = this.getEntityAspect().entityManager;\r\n    return em && em._pendingPubs;\r\n  },\r\n\r\n  _beforeChange:  function () {\r\n    // default is to do nothing\r\n  }\r\n};\r\n\r\nfunction updateEntityState(obsArray: ObservableArray) {\r\n  let entityAspect = obsArray.getEntityAspect();\r\n  if (entityAspect.entityState.isUnchanged()) {\r\n    entityAspect.setModified();\r\n  }\r\n  if (entityAspect.entityState.isModified() && !obsArray._origValues) {\r\n    obsArray._origValues = obsArray.slice(0);\r\n  }\r\n}\r\n\r\nfunction publish(publisher: ObservableArray, eventName: string, eventArgs: any) {\r\n  let pendingPubs = publisher._getPendingPubs();\r\n  if (pendingPubs) {\r\n    if (!publisher._pendingArgs) {\r\n      publisher._pendingArgs = eventArgs;\r\n      pendingPubs.push(function () {\r\n        publisher[eventName].publish(publisher._pendingArgs);\r\n        publisher._pendingArgs = null;\r\n      });\r\n    } else {\r\n      combineArgs(publisher._pendingArgs, eventArgs);\r\n    }\r\n  } else {\r\n    publisher[eventName].publish(eventArgs);\r\n  }\r\n}\r\n\r\nfunction initializeParent(obsArray: any, parent: Object, parentProperty: DataProperty) {\r\n  obsArray.parent = parent;\r\n  obsArray.parentProperty = parentProperty;\r\n}\r\n\r\nfunction processAdds(obsArray: ObservableArray, adds: any[]) {\r\n  obsArray._processAdds(adds);\r\n  // this is referencing the name of the method on the complexArray not the name of the event\r\n  //var args = { added: adds };\r\n  //args[obsArray._typeName] = obsArray;\r\n  publish(obsArray, \"arrayChanged\", { array: obsArray, added: adds });\r\n}\r\n\r\nfunction processRemoves(obsArray: ObservableArray, removes: any[]) {\r\n  obsArray._processRemoves(removes);\r\n  // this is referencing the name of the method on the array not the name of the event\r\n  publish(obsArray, \"arrayChanged\", { array: obsArray, removed: removes });\r\n}\r\n\r\n// TODO: see if this function already exists in core and can be imported.\r\nfunction combineArgs(target: Object, source: Object) {\r\n  for (let key in source) {\r\n    if (key !== \"array\" && target.hasOwnProperty(key)) {\r\n      let sourceValue = source[key];\r\n      let targetValue = target[key];\r\n      if (targetValue) {\r\n        if (!Array.isArray(targetValue)) {\r\n          throw new Error(\"Cannot combine non array args\");\r\n        }\r\n        Array.prototype.push.apply(targetValue, sourceValue);\r\n      } else {\r\n        target[key] = sourceValue;\r\n      }\r\n    }\r\n  }\r\n}\r\n/** @hidden @internal */\r\nexport const observableArray = {\r\n  mixin: mixin,\r\n  updateEntityState: updateEntityState,\r\n  publish: publish,\r\n  initializeParent: initializeParent\r\n};\r\n","import { core } from './core';\r\nimport { Entity } from './entity-aspect';\r\nimport { QueryErrorCallback, QueryResult, QuerySuccessCallback } from './entity-manager';\r\nimport { DataProperty, NavigationProperty } from './entity-metadata';\r\nimport { EntityQuery } from './entity-query';\r\nimport { EntityState } from './entity-state';\r\nimport { BreezeEvent } from './event';\r\nimport { ObservableArray, observableArray } from './observable-array';\r\n\r\n// TODO: mixin impl is not very typesafe\r\n\r\nexport interface RelationArray extends ObservableArray {\r\n  [index: number]: Entity;\r\n  parentEntity: Entity;\r\n  parentProperty?: DataProperty;\r\n  navigationProperty: NavigationProperty;\r\n  _inProgress?: boolean;\r\n  _addsInProcess: Entity[];\r\n  load(querySuccessCallback?: QuerySuccessCallback, queryErrorCallback?: QueryErrorCallback): Promise<QueryResult>; \r\n}\r\n\r\nlet relationArrayMixin = {\r\n\r\n  /**\r\n  Relation arrays are not actually classes, they are objects that mimic arrays. A relation array is collection of\r\n  entities associated with a navigation property on a single entity. i.e. customer.orders or order.orderDetails.\r\n  This collection looks like an array in that the basic methods on arrays such as 'push', 'pop', 'shift', 'unshift', 'splice'\r\n  are all provided as well as several special purpose methods.\r\n  @class {relationArray}\r\n  **/\r\n\r\n  /**\r\n  An [[Event]] that fires whenever the contents of this array changed.  This event\r\n  is fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection.\r\n  Adds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual\r\n  collections are collected into a single notification event for each relation array.\r\n  @example\r\n      // assume order is an order entity attached to an EntityManager.\r\n      orders.arrayChanged.subscribe(\r\n      function (arrayChangedArgs) {\r\n          let addedEntities = arrayChangedArgs.added;\r\n          let removedEntities = arrayChanged.removed;\r\n      });\r\n  @event arrayChanged\r\n  @param added {Array of Entity} An array of all of the entities added to this collection.\r\n  @param removed {Array of Entity} An array of all of the removed from this collection.\r\n  @readOnly\r\n  **/\r\n\r\n\r\n  /**\r\n  Performs an asynchronous load of all other the entities associated with this relationArray.\r\n  @example\r\n      // assume orders is an empty, as yet unpopulated, relation array of orders\r\n      // associated with a specific customer.\r\n      orders.load().then(...)\r\n  @method load\r\n  @param [callback] {Function}\r\n  @param [errorCallback] {Function}\r\n  @return {Promise}\r\n  **/\r\n  load: function(callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback): Promise<QueryResult> {\r\n    let parent = this.parentEntity;\r\n    let query = EntityQuery.fromEntityNavigation(this.parentEntity, this.navigationProperty);\r\n    let em = parent.entityAspect.entityManager;\r\n    return em.executeQuery(query, callback, errorCallback);\r\n  },\r\n\r\n  _getEventParent: function() {\r\n    return this.parentEntity.entityAspect;\r\n  },\r\n\r\n  _getPendingPubs: function() {\r\n    let em = this.parentEntity.entityAspect.entityManager;\r\n    return em && em._pendingPubs;\r\n  },\r\n\r\n  // virtual impls\r\n  _getGoodAdds: function(adds: Entity[]) {\r\n    return getGoodAdds(this, adds);\r\n  },\r\n\r\n  _processAdds: function(adds: Entity[]) {\r\n    processAdds(this, adds);\r\n  },\r\n\r\n  _processRemoves: function(removes: Entity[]) {\r\n    processRemoves(this, removes);\r\n  }\r\n\r\n};\r\n\r\nfunction getGoodAdds(relationArray: RelationArray, adds: Entity[]) {\r\n  let goodAdds = checkForDups(relationArray, adds);\r\n  if (!goodAdds.length) {\r\n    return goodAdds;\r\n  }\r\n  let parentEntity = relationArray.parentEntity;\r\n  let entityManager = parentEntity.entityAspect.entityManager;\r\n  // we do not want to attach an entity during loading\r\n  // because these will all be 'attached' at a later step.\r\n  if (entityManager && !entityManager.isLoading) {\r\n    goodAdds.forEach(function (add) {\r\n      if (add.entityAspect.entityState.isDetached()) {\r\n        relationArray._inProgress = true;\r\n        try {\r\n          entityManager!.attachEntity(add, EntityState.Added);\r\n        } finally {\r\n          relationArray._inProgress = false;\r\n        }\r\n      }\r\n    });\r\n  }\r\n  return goodAdds;\r\n}\r\n\r\nfunction processAdds(relationArray: RelationArray, adds: Entity[]) {\r\n  let parentEntity = relationArray.parentEntity;\r\n  let np = relationArray.navigationProperty;\r\n  let addsInProcess = relationArray._addsInProcess;\r\n\r\n  let invNp = np.inverse;\r\n  let startIx = addsInProcess.length;\r\n  try {\r\n    adds.forEach(function (childEntity) {\r\n      addsInProcess.push(childEntity);\r\n      if (invNp) {\r\n        childEntity.setProperty(invNp.name, parentEntity);\r\n      } else {\r\n        // This occurs with a unidirectional 1-n navigation - in this case\r\n        // we need to update the fks instead of the navProp\r\n        let pks = parentEntity.entityType.keyProperties;\r\n        np.invForeignKeyNames.forEach(function (fk, i) {\r\n          childEntity.setProperty(fk, parentEntity.getProperty(pks[i].name));\r\n        });\r\n      }\r\n    });\r\n  } finally {\r\n    addsInProcess.splice(startIx, adds.length);\r\n  }\r\n\r\n}\r\n\r\nfunction processRemoves(relationArray: RelationArray, removes: Entity[]) {\r\n  let inp = relationArray.navigationProperty.inverse;\r\n  if (inp) {\r\n    removes.forEach(function (childEntity) {\r\n      childEntity.setProperty(inp!.name, null);\r\n    });\r\n  }\r\n}\r\n\r\nfunction checkForDups(relationArray: RelationArray, adds: Entity[]) {\r\n  // don't allow dups in this array. - also prevents recursion\r\n  let parentEntity = relationArray.parentEntity;\r\n  let navProp = relationArray.navigationProperty;\r\n  let inverseProp = navProp.inverse;\r\n  let goodAdds: Entity[];\r\n  if (inverseProp) {\r\n    goodAdds = adds.filter(function (a) {\r\n      if (relationArray._addsInProcess.indexOf(a) >= 0) {\r\n        return false;\r\n      }\r\n      let inverseValue = a.getProperty(inverseProp!.name);\r\n      return inverseValue !== parentEntity;\r\n    });\r\n  } else {\r\n    // This occurs with a unidirectional 1->N relation ( where there is no n -> 1)\r\n    // in this case we compare fks.\r\n    let fkPropNames = navProp.invForeignKeyNames;\r\n    let keyProps = parentEntity.entityType.keyProperties;\r\n    goodAdds = adds.filter(function (a) {\r\n      if (relationArray._addsInProcess.indexOf(a) >= 0) {\r\n        return false;\r\n      }\r\n      return fkPropNames.some(function (fk, i) {\r\n        let keyProp = keyProps[i].name;\r\n        let keyVal = parentEntity.getProperty(keyProp);\r\n        let fkVal = a.getProperty(fk);\r\n        return keyVal !== fkVal;\r\n      });\r\n    });\r\n  }\r\n  return goodAdds;\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IModelLibraryAdapter]] implementation. \r\n@adapter (see [[IModelLibraryAdapter]])    \r\n@hidden \r\n*/\r\nexport function makeRelationArray(arr: any[], parentEntity: Entity, navigationProperty: NavigationProperty): RelationArray {\r\n  let arrX = arr as any;\r\n  arrX.parentEntity = parentEntity;\r\n  arrX.navigationProperty = navigationProperty;\r\n  arrX.arrayChanged = new BreezeEvent(\"arrayChanged\", arrX);\r\n  // array of pushes currently in process on this relation array - used to prevent recursion.\r\n  arrX._addsInProcess = [];\r\n  // need to use mixins here instead of inheritance because we are starting from an existing array object.\r\n  core.extend(arrX, observableArray.mixin);\r\n  return core.extend(arrX, relationArrayMixin) as RelationArray;\r\n}\r\n","import { core  } from './core';\r\nimport { ObservableArray, observableArray } from './observable-array';\r\nimport { BreezeEvent } from './event';\r\nimport { ComplexObject, StructuralObject } from './entity-aspect';\r\nimport { DataProperty } from './entity-metadata';\r\n\r\n// TODO: mixin impl is not very typesafe\r\n\r\nexport interface ComplexArray extends ObservableArray {\r\n  [index: number]: ComplexObject;\r\n  parent?: StructuralObject;\r\n  parentProperty?: DataProperty;\r\n}\r\n\r\nlet complexArrayMixin = {\r\n\r\n  // complexArray will have the following props\r\n  //    parent\r\n  //    propertyPath\r\n  //    parentProperty\r\n  //    addedItems  - only if modified\r\n  //    removedItems  - only if modified\r\n  //  each complexAspect of any entity within a complexArray\r\n  //  will have its own _complexState = \"A/M\";\r\n\r\n  /**\r\n   Complex arrays are not actually classes, they are objects that mimic arrays. A complex array is collection of\r\n   complexTypes associated with a data property on a single entity or other complex object. i.e. customer.orders or order.orderDetails.\r\n   This collection looks like an array in that the basic methods on arrays such as 'push', 'pop', 'shift', 'unshift', 'splice'\r\n   are all provided as well as several special purpose methods.\r\n   @class {complexArray}\r\n   **/\r\n\r\n  /**\r\n  An [[Event]] that fires whenever the contents of this array changed.  This event\r\n  is fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection.\r\n  Adds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual\r\n  collections are collected into a single notification event for each relation array.\r\n  @example\r\n      // assume order is an order entity attached to an EntityManager.\r\n      orders.arrayChanged.subscribe(\r\n      function (arrayChangedArgs) {\r\n          var addedEntities = arrayChangedArgs.added;\r\n          var removedEntities = arrayChanged.removed;\r\n      });\r\n  @event arrayChanged\r\n  @param added {Array of Entity} An array of all of the entities added to this collection.\r\n  @param removed {Array of Entity} An array of all of the removed from this collection.\r\n  @readOnly\r\n  **/\r\n\r\n    // virtual impls\r\n  _getGoodAdds: function(adds: any[]) {\r\n    return getGoodAdds(this, adds);\r\n  },\r\n\r\n  _beforeChange: function() {\r\n    observableArray.updateEntityState(this);\r\n  },\r\n\r\n  _processAdds: function(adds: any[]) {\r\n    processAdds(this, adds);\r\n  },\r\n\r\n  _processRemoves: function(removes: any[]) {\r\n    processRemoves(this, removes);\r\n  },\r\n\r\n  _rejectChanges: function() {\r\n    if (!this._origValues) return;\r\n    let that = this;\r\n    this.forEach(function (co: ComplexObject) {\r\n      clearAspect(co, that);\r\n    });\r\n    this.length = 0;\r\n    this._origValues.forEach(function (co: ComplexObject) {\r\n      that.push(co);\r\n    });\r\n  },\r\n\r\n  _acceptChanges: function() {\r\n    this._origValues = null;\r\n  }\r\n};\r\n\r\n// local functions\r\n\r\n\r\nfunction getGoodAdds(complexArray: ComplexArray, adds: ComplexObject[]) {\r\n  // remove any that are already added here\r\n  return adds.filter(function (a) {\r\n    // return a.parent !== complexArray.parent;  // TODO: check if this is actually a bug in original breezejs ???\r\n    return a.complexAspect == null || a.complexAspect.parent !== complexArray.parent;\r\n  });\r\n}\r\n\r\nfunction processAdds(complexArray: ComplexArray, adds: ComplexObject[]) {\r\n  adds.forEach(function (a) {\r\n    // if (a.parent != null) { // TODO: check if this is actually a bug in original breezejs ???\r\n    if (a.complexAspect && a.complexAspect.parent != null) {\r\n      throw new Error(\"The complexObject is already attached. Either clone it or remove it from its current owner\");\r\n    }\r\n    setAspect(a, complexArray);\r\n  });\r\n}\r\n\r\nfunction processRemoves(complexArray: ComplexArray, removes: ComplexObject[]) {\r\n  removes.forEach(function (a) {\r\n    clearAspect(a, complexArray);\r\n  });\r\n}\r\n\r\nfunction clearAspect(co: ComplexObject, arr: ComplexArray) {\r\n  let coAspect = co.complexAspect;\r\n  // if not already attached - exit\r\n  if (coAspect.parent !== arr.parent) return null;\r\n\r\n  coAspect.parent = undefined;\r\n  coAspect.parentProperty = undefined;\r\n  return coAspect;\r\n}\r\n\r\nfunction setAspect(co: ComplexObject, arr: ComplexArray) {\r\n  let coAspect = co.complexAspect;\r\n  // if already attached - exit\r\n  if (coAspect.parent === arr.parent) return null;\r\n  coAspect.parent = arr.parent;\r\n  coAspect.parentProperty = arr.parentProperty;\r\n\r\n  return coAspect;\r\n}\r\n\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IModelLibraryAdapter]] implementation. \r\n@adapter (see [[IModelLibraryAdapter]])    \r\n@hidden \r\n*/\r\nexport function makeComplexArray(arr: any[], parent: StructuralObject, parentProperty: DataProperty) {\r\n  let arrX = arr as any;\r\n  observableArray.initializeParent(arrX, parent, parentProperty);\r\n  arrX.arrayChanged = new BreezeEvent(\"arrayChanged\", arrX);\r\n  core.extend(arrX, observableArray.mixin);\r\n  return core.extend(arrX, complexArrayMixin) as ComplexArray;\r\n}\r\n\r\n","import { core  } from './core';\r\nimport { observableArray } from './observable-array';\r\nimport { BreezeEvent } from './event';\r\nimport { StructuralObject } from './entity-aspect';\r\nimport { DataProperty } from './entity-metadata';\r\n\r\n// TODO: mixin impl is not very typesafe\r\n\r\n// Not needed\r\n// interface IPrimitiveArray extends IObservableArray {\r\n//   [index: number]: any;\r\n//   parent?: IStructuralObject;\r\n//   parentProperty?: DataProperty;\r\n// }\r\n\r\nlet primitiveArrayMixin = {\r\n\r\n  // complexArray will have the following props\r\n  //    parent\r\n  //    propertyPath\r\n  //    parentProperty\r\n  //    addedItems  - only if modified\r\n  //    removedItems  - only if modified\r\n  //  each complexAspect of any entity within a complexArray\r\n  //  will have its own _complexState = \"A/M\";\r\n\r\n  /**\r\n  Primitive arrays are not actually classes, they are objects that mimic arrays. A primitive array is collection of\r\n  primitive types associated with a data property on a single entity or complex object. i.e. customer.invoiceNumbers.\r\n  This collection looks like an array in that the basic methods on arrays such as 'push', 'pop', 'shift', 'unshift', 'splice'\r\n  are all provided as well as several special purpose methods.\r\n  @class {primitiveArray}\r\n  **/\r\n\r\n  /**\r\n  An [[Event]] that fires whenever the contents of this array changed.  This event\r\n  is fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection.\r\n  Adds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual\r\n  collections are collected into a single notification event for each relation array.\r\n  @example\r\n      // assume order is an order entity attached to an EntityManager.\r\n      orders.arrayChanged.subscribe(\r\n      function (arrayChangedArgs) {\r\n          let addedEntities = arrayChangedArgs.added;\r\n          let removedEntities = arrayChanged.removed;\r\n      });\r\n  @event arrayChanged\r\n  @param added {Array of Primitives} An array of all of the items added to this collection.\r\n  @param removed {Array of Primitives} An array of all of the items removed from this collection.\r\n  @readOnly\r\n  **/\r\n\r\n    // virtual impls\r\n  _getGoodAdds:  function(adds: any[]) {\r\n    return adds;\r\n  },\r\n\r\n  _beforeChange: function() {\r\n    let entityAspect = this.getEntityAspect();\r\n    if (entityAspect.entityState.isUnchanged()) {\r\n      entityAspect.setModified();\r\n    }\r\n    if (entityAspect.entityState.isModified() && !this._origValues) {\r\n      this._origValues = this.slice(0);\r\n    }\r\n  },\r\n\r\n  _processAdds: function(adds: any[]) {\r\n    // nothing needed\r\n  },\r\n\r\n  _processRemoves: function(removes: any[]) {\r\n    // nothing needed;\r\n  },\r\n\r\n\r\n  _rejectChanges: function() {\r\n    if (!this._origValues) return;\r\n    this.length = 0;\r\n    Array.prototype.push.apply(this, this._origValues);\r\n  },\r\n\r\n  _acceptChanges: function() {\r\n    this._origValues = null;\r\n  }\r\n};\r\n  // local functions\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a [[IModelLibraryAdapter]] implementation. \r\n@adapter (see [[IModelLibraryAdapter]])    \r\n@hidden \r\n*/\r\nexport function makePrimitiveArray(arr: any[], parent: StructuralObject, parentProperty: DataProperty) {\r\n  let arrX = arr as any;\r\n  observableArray.initializeParent(arrX, parent, parentProperty);\r\n  arrX.arrayChanged = new BreezeEvent(\"arrayChanged\", arrX);\r\n  core.extend(arrX, observableArray.mixin);\r\n  return core.extend(arrX, primitiveArrayMixin);\r\n}\r\n\r\n\r\n","\r\nimport { AbstractDataServiceAdapter} from './abstract-data-service-adapter';\r\nimport { assertParam, assertConfig, Param } from './assert-param';\r\nimport { BreezeConfig } from './config';\r\nimport { BreezeEnum} from './enum';\r\nimport { BreezeEvent } from './event';\r\nimport { ComplexArray } from './complex-array';\r\nimport { DataService, DataServiceConfig, JsonResultsAdapter, JsonResultsAdapterConfig, NodeContext, NodeMeta } from './data-service';\r\nimport { DataType  } from './data-type';\r\nimport { EntityAction } from './entity-action';\r\nimport { EntityAspect, ComplexAspect, Entity, ComplexObject, StructuralObject, PropertyChangedEventArgs } from './entity-aspect';\r\nimport { EntityKey } from './entity-key';\r\nimport { EntityManager, EntityManagerConfig, EntityError, EntityChangedEventArgs, SaveContext, SaveBundle, HttpResponse, KeyMapping, ServerError, SaveResult, QueryResult, ValidationErrorsChangedEventArgs, HasChangesChangedEventArgs } from './entity-manager';\r\nimport { EntityQuery, FilterQueryOp, BooleanQueryOp, OrderByClause, ExpandClause, SelectClause } from './entity-query';\r\nimport { EntityState } from './entity-state';\r\nimport { InterfaceRegistry, AjaxAdapter, AjaxConfig, DataServiceAdapter, ModelLibraryAdapter, ChangeRequestInterceptor, UriBuilderAdapter, InterfaceRegistryConfig, AjaxRequestInterceptor } from './interface-registry';\r\nimport { KeyGenerator } from './key-generator';\r\nimport { LocalQueryComparisonOptions } from './local-query-comparison-options';\r\nimport { MappingContext } from './mapping-context';\r\nimport { MetadataStore, EntityType, ComplexType, StructuralType, DataProperty, EntityProperty, NavigationProperty, AutoGeneratedKeyType   } from './entity-metadata';\r\nimport { NamingConvention } from './naming-convention';\r\nimport { Predicate, VisitContext, Visitor, ExpressionContext, UnaryPredicate, BinaryPredicate, AnyAllPredicate, AndOrPredicate, LitExpr, FnExpr, PropExpr } from './predicate';\r\nimport { QueryOptions,  FetchStrategy, MergeStrategy } from './query-options';\r\nimport { SaveOptions } from './save-options';\r\nimport { ValidationError, Validator } from './validate';\r\nimport { ValidationOptions } from './validation-options';\r\n\r\nimport { config, BaseAdapter } from './config';\r\nimport { core, Callback, ErrorCallback } from './core';\r\nimport { makeRelationArray, makePrimitiveArray, makeComplexArray } from './array';\r\n\r\nimport { RelationArray } from './relation-array';\r\nimport { ArrayChangedArgs } from './observable-array';\r\nexport { BreezeConfig, ComplexArray, RelationArray };\r\n\r\nexport {\r\n  AbstractDataServiceAdapter,\r\n  AjaxAdapter,\r\n  AjaxConfig,\r\n  AjaxRequestInterceptor,\r\n  AndOrPredicate,\r\n  AnyAllPredicate,\r\n  ArrayChangedArgs,\r\n  assertConfig,\r\n  assertParam,\r\n  AutoGeneratedKeyType,\r\n  BaseAdapter,\r\n  BinaryPredicate,\r\n  BreezeEnum,\r\n  BreezeEvent, \r\n  Callback,\r\n  ChangeRequestInterceptor,\r\n  ComplexAspect,\r\n  ComplexObject,\r\n  ComplexType,\r\n  config,\r\n  core,\r\n  DataProperty,\r\n  DataService,\r\n  DataServiceAdapter,\r\n  DataServiceConfig,\r\n  DataType,\r\n  Entity,\r\n  EntityAction,\r\n  EntityAspect,\r\n  EntityChangedEventArgs,\r\n  EntityError,\r\n  EntityKey,\r\n  EntityManager,\r\n  EntityManagerConfig,\r\n  EntityProperty,\r\n  EntityQuery,\r\n  EntityState,\r\n  EntityType,\r\n  ErrorCallback,\r\n  ExpandClause,\r\n  ExpressionContext,\r\n  FetchStrategy,\r\n  FilterQueryOp,\r\n  FnExpr,\r\n  HasChangesChangedEventArgs,\r\n  HttpResponse,\r\n  InterfaceRegistry,\r\n  InterfaceRegistryConfig,\r\n  JsonResultsAdapter,\r\n  JsonResultsAdapterConfig,\r\n  KeyGenerator,\r\n  KeyMapping,\r\n  LitExpr,\r\n  LocalQueryComparisonOptions,\r\n  makeComplexArray,\r\n  makePrimitiveArray,\r\n  makeRelationArray,\r\n  MappingContext,\r\n  MergeStrategy,\r\n  MetadataStore,\r\n  ModelLibraryAdapter,\r\n  NamingConvention,\r\n  NavigationProperty,\r\n  NodeContext,\r\n  NodeMeta,\r\n  OrderByClause,\r\n  Predicate,\r\n  PropertyChangedEventArgs,\r\n  PropExpr,\r\n  QueryOptions,\r\n  QueryResult,\r\n  SaveBundle,\r\n  SaveContext,\r\n  SaveOptions,\r\n  SaveResult,\r\n  SelectClause,\r\n  ServerError,\r\n  StructuralObject,\r\n  StructuralType,\r\n  UnaryPredicate,\r\n  UriBuilderAdapter,\r\n  ValidationErrorsChangedEventArgs,\r\n  ValidationError,\r\n  ValidationOptions,\r\n  Validator,\r\n  VisitContext,\r\n  Visitor,\r\n};\r\n\r\n// create a breeze variable here\r\nexport const breeze = {\r\n  AbstractDataServiceAdapter: AbstractDataServiceAdapter,\r\n  assertConfig: null as any,\r\n  assertParam: null as any,\r\n  AutoGeneratedKeyType: AutoGeneratedKeyType,\r\n  BooleanQueryOp: BooleanQueryOp,\r\n  ComplexAspect: ComplexAspect,\r\n  ComplexType: ComplexType,\r\n  config: config,\r\n  core: core,\r\n  DataProperty: DataProperty,\r\n  DataService: DataService,\r\n  DataType: DataType,\r\n  EntityAction: EntityAction,\r\n  EntityAspect: EntityAspect,\r\n  EntityKey: EntityKey,\r\n  EntityManager: EntityManager,\r\n  EntityQuery: EntityQuery,\r\n  EntityState: EntityState,\r\n  EntityType: EntityType,\r\n  Event: BreezeEvent,\r\n  FetchStrategy: FetchStrategy,\r\n  FilterQueryOp: FilterQueryOp,\r\n  InterfaceRegistry: InterfaceRegistry,\r\n  JsonResultsAdapter: JsonResultsAdapter,\r\n  KeyGenerator: KeyGenerator,\r\n  LocalQueryComparisonOptions: LocalQueryComparisonOptions,\r\n  makeComplexArray: makeComplexArray,\r\n  makePrimitiveArray: makePrimitiveArray,\r\n  makeRelationArray: makeRelationArray,\r\n  MergeStrategy: MergeStrategy,\r\n  MetadataStore: MetadataStore,\r\n  NamingConvention: NamingConvention,\r\n  NavigationProperty: NavigationProperty,\r\n  OrderByClause: OrderByClause, // for testing only\r\n  Param,\r\n  Predicate: Predicate,\r\n  QueryOptions: QueryOptions,\r\n  SaveOptions: SaveOptions,\r\n  ValidationError: ValidationError,\r\n  ValidationOptions: ValidationOptions,\r\n  Validator: Validator,\r\n  version: \"2.1.5\"\r\n};\r\n\r\n// breeze.assertConfig = assertConfig as any;\r\n// breeze.assertParam = assertParam as any;\r\n\r\nexport namespace promises {\r\n  /** no-op for backward compatibility with breeze-bridge2-angular */\r\n  export interface IPromiseService {}\r\n}\r\n\r\n/** @hidden @internal */\r\ndeclare var window: any;\r\n\r\n/** @hidden @internal */\r\ndeclare var global: any;\r\n\r\n/** @hidden @internal */\r\nlet win: any;\r\ntry {\r\n  win = window ? window : (global ? global.window : undefined);\r\n} catch (e) {\r\n\r\n}\r\nif (win) {\r\n  win.breeze = breeze;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["stringStartsWith","stringEndsWith","updateWithConfig","clearOriginalValues","processAdds","processRemoves","getGoodAdds"],"mappings":"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"}