UNPKG

jaydata

Version:

Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)

1,189 lines (1,062 loc) 48.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.MemberDefinition = exports.Container = exports.$C = undefined; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; var _initializeJayData = require('./initializeJayData.js'); var _initializeJayData2 = _interopRequireDefault(_initializeJayData); var _jaydataErrorHandler = require('jaydata-error-handler'); var _Extensions = require('./Extensions.js'); var _Container = require('./Container.js'); require('./PreHtml5Compatible.js'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /*$data.Class.MixinParameter = MixinParameter = $data.Class.define('MixinParameter', null, null, { constructor: function (typeName) { ///<param name="paramIndex" type="integer"> this.typeName = typeName; }, typeName: {} });*/ //var e = new Entity(); /*$data.Interface = Class.define("Interface", null, null, { constructor: function() { Guard.raise("Can not create an interface"); } }, { define: function (name, definition) { var result = Class.define(name, $data.Interface, null, null, definition); delete result.__class; result.__interface = true; return result; } }); $data.Observable = Observable = Class.define("Observable", null, null, { propertyChanged: { dataType: $data.Event } }, { createFromInstance: function(instance) { var propNames = instance.getClass().memberDefinitions.f } });*/ _initializeJayData2.default.StringFunctions = _Extensions.StringFunctions; var _modelHolder = null; _initializeJayData2.default.setModelContainer = function (modelHolder) { _modelHolder = modelHolder; }; _initializeJayData2.default.getModelContainer = function () { return _modelHolder; }; _initializeJayData2.default.defaults = _initializeJayData2.default.defaults || {}; _initializeJayData2.default.defaults.openTypeDefaultPropertyName = "dynamicProperties"; _initializeJayData2.default.defaults.openTypeDefaultType = '$data.Object'; _initializeJayData2.default.defaults.openTypeDefaultValue = function () { return {}; }; _initializeJayData2.default.__global = process.browser ? window : global; _initializeJayData2.default.setGlobal = function (obj) { _initializeJayData2.default.__global = obj; }; (function init($data) { function il(msg) { if (typeof intellisense !== 'undefined') { if (!intellisense.i) { intellisense.i = 0; } intellisense.i = intellisense.i + 1; intellisense.logMessage(msg + ":" + intellisense.i); } } function MemberDefinition(memberDefinitionData, definedClass) { ///<field name="name" type="String">*</field> ///<field name="dataType" type="Object">*</field> ///<field name="elementType" type="Object"></field> ///<field name="kind" type="String" /> ///<field name="classMember" type="Boolean" /> ///<field name="set" type="Function" /> ///<field name="get" type="Function" /> ///<field name="value" type="Object" /> ///<field name="initialValue" type="Object" /> ///<field name="method" type="Function" /> ///<field name="enumerable" type="Boolean" /> ///<field name="configurable" type="Boolean" /> ///<field name="key" type="Boolean" /> ///<field name="computed" type="Boolean" /> ///<field name="storeOnObject" type="Boolean">[false] if false value is stored in initData, otherwise on the object</field> ///<field name="monitorChanges" type="Boolean">[true] if set to false propertyChange events are not raise and property tracking is disabled</field> this.kind = MemberTypes.property; //this.definedBy = definedClass; Object.defineProperty(this, 'definedBy', { value: definedClass, enumerable: false, configurable: false, writable: false }); if (memberDefinitionData) { if (typeof memberDefinitionData === 'function' || typeof memberDefinitionData.asFunction === 'function') { this.method = memberDefinitionData; this.kind = MemberTypes.method; } else { this.enumerable = true; this.configurable = true; if (typeof memberDefinitionData === "number") { this.value = memberDefinitionData; this.type = $data.Number; this.dataType = $data.Number; } else if (typeof memberDefinitionData === "string") { this.value = memberDefinitionData; this.dataType = $data.String; this.type = $data.String; } else { for (var item in memberDefinitionData) { if (memberDefinitionData.hasOwnProperty(item)) { this[item] = memberDefinitionData[item]; } } } } if (this.type !== undefined) { this.dataType = this.dataType || this.type; } else { this.type = this.dataType; } this.originalType = this.type; if (this.elementType !== undefined) { this.originalElementType = this.elementType; } } } MemberDefinition.prototype.createPropertyDescriptor = function (classFunction, value) { ///<returns type="Object" /> var pd = this; var result = { enumerable: this.enumerable == undefined ? true : this.enumerable, configurable: this.configurable == undefined ? true : this.configurable }; if (this.set && this.get) { result.set = this.set; result.get = this.get; } else if ("value" in this || value) { result.value = value || this.value; //TODO //result.writable = this.writable; result.writable = true; } else { result.set = function (value) { this.storeProperty(pd, value); }; result.get = function () { return this.retrieveProperty(pd); }; } return result; }; MemberDefinition.prototype.createStorePropertyDescriptor = function (value) { var pd = this; return { enumerable: false, writable: true, configurable: pd.configurable, value: value }; }; MemberDefinition.prototype.createGetMethod = function () { var pd = this; return { enumerable: false, writable: false, configurable: false, value: function value(callback, tran) { return this.getProperty(pd, callback, tran); } }; }; MemberDefinition.prototype.createSetMethod = function () { var pd = this; return { enumerable: false, writable: false, configurable: false, value: function value(_value, callback, tran) { return this.setProperty(pd, _value, callback, tran); } }; }; MemberDefinition.translateDefinition = function (memDef, name, classFunction) { var holder = classFunction; var memberDefinition; if (memDef.type && Container.isTypeRegistered(memDef.type)) { holder = Container.resolveType(memDef.type); if (typeof holder.translateDefinition === 'function') { memberDefinition = holder.translateDefinition.apply(holder, arguments); memberDefinition.name = memberDefinition.name || name; } else { holder = classFunction; } } if (!(memberDefinition instanceof MemberDefinition)) { memberDefinition = new MemberDefinition(memberDefinition || memDef, holder); memberDefinition.name = name; } classFunction.resolverThunks = classFunction.resolverThunks || []; classFunction.childResolverThunks = classFunction.childResolverThunks || []; var t = memberDefinition.type; var et = memberDefinition.elementType; function addChildThunk(referencedType) { if (referencedType && referencedType.isAssignableTo && $data.Entity && referencedType.isAssignableTo($data.Entity)) { classFunction.childResolverThunks.push(function () { if (referencedType.resolveForwardDeclarations) { referencedType.resolveForwardDeclarations(); } }); } } addChildThunk(t); addChildThunk(et); if ("string" === typeof t) { if ("@" === t[0]) { memberDefinition.type = t.substr(1); memberDefinition.dataType = t.substr(1); } else { //forward declared types get this callback when type is registered classFunction.resolverThunks.push(function () { var rt = classFunction.container.resolveType(t); addChildThunk(rt); memberDefinition.type = rt; memberDefinition.dataType = rt; }); } } if (et) { if ("string" === typeof et) { if ("@" === et[0]) { memberDefinition.elementType = et.substr(1); } else { //forward declared types get this callback when type is registered classFunction.resolverThunks.push(function () { var rt = classFunction.container.resolveType(et); addChildThunk(rt); memberDefinition.elementType = rt; }); } } } //if (!classFunction) classFunction.resolveForwardDeclarations = function () { classFunction.resolveForwardDeclarations = function () {}; $data.Trace.log("resolving: " + classFunction.fullName); this.resolverThunks.forEach(function (thunk) { thunk(); }); //this.resolverThunks = []; this.childResolverThunks.forEach(function (thunk) { thunk(); }); //this.childResolverThunks = []; }; return memberDefinition; }; MemberDefinition.prototype.toJSON = function () { var property = {}; for (var name in this) { if (name !== 'defineBy' && name !== 'storageModel') { if ((name === 'type' || name === 'dataType') && this[name] && typeof this[name] === 'function') { try { property[name] = Container.resolveName(this[name]); } catch (e) { property[name] = this[name]; } } else { property[name] = this[name]; } } } return property; }; $data.MemberDefinition = MemberDefinition; var memberDefinitionPrefix = '$'; function MemberDefinitionCollection() {}; MemberDefinitionCollection.prototype = { clearCache: function clearCache() { this.arrayCache = undefined; this.pubMapPropsCache = undefined; this.keyPropsCache = undefined; this.propByTypeCache = undefined; this.pubMapMethodsCache = undefined; this.pubMapPropNamesCache = undefined; }, asArray: function asArray() { if (!this.arrayCache) { this.arrayCache = []; for (var i in this) { if (i.indexOf(memberDefinitionPrefix) === 0) this.arrayCache.push(this[i]); } } return this.arrayCache; }, getPublicMappedProperties: function getPublicMappedProperties() { if (!this.pubMapPropsCache) { this.pubMapPropsCache = []; for (var i in this) { if (i.indexOf(memberDefinitionPrefix) === 0 && this[i].kind == 'property' && !this[i].notMapped && this[i].enumerable) this.pubMapPropsCache.push(this[i]); } } return this.pubMapPropsCache; // || (this.pubMapPropsCache = this.asArray().filter(function (m) { return m.kind == 'property' && !m.notMapped && m.enumerable; })); }, getPublicMappedPropertyNames: function getPublicMappedPropertyNames() { if (!this.pubMapPropNamesCache) { this.pubMapPropNamesCache = []; for (var i in this) { if (i.indexOf(memberDefinitionPrefix) === 0 && this[i].kind == 'property' && !this[i].notMapped && this[i].enumerable) this.pubMapPropNamesCache.push(this[i].name); } } return this.pubMapPropNamesCache; }, getKeyProperties: function getKeyProperties() { if (!this.keyPropsCache) { this.keyPropsCache = []; for (var i in this) { if (i.indexOf(memberDefinitionPrefix) === 0 && this[i].kind == 'property' && this[i].key) this.keyPropsCache.push(this[i]); } } return this.keyPropsCache; //return this.keyPropsCache || (this.keyPropsCache = this.asArray().filter(function (m) { return m.kind == 'property' && m.key; })); }, getPublicMappedMethods: function getPublicMappedMethods() { if (!this.pubMapMethodsCache) { this.pubMapMethodsCache = []; for (var i in this) { if (i.indexOf(memberDefinitionPrefix) === 0 && this[i].kind == 'method' && this[i].method /* && this.hasOwnProperty(i)*/) this.pubMapMethodsCache.push(this[i]); } } return this.pubMapMethodsCache; }, getPropertyByType: function getPropertyByType(type) { if (!this.propByTypeCache) { this.propByTypeCache = []; for (var i in this) { if (i.indexOf(memberDefinitionPrefix) === 0 && this[i].dataType == type) this.propByTypeCache.push(this[i]); } } return this.propByTypeCache; //return this.propByTypeCache || (this.propByTypeCache = this.asArray().filter(function (m) { return m.dataType == type; })); }, getMember: function getMember(name) { return this[memberDefinitionPrefix + name]; }, setMember: function setMember(value) { this[memberDefinitionPrefix + value.name] = value; } }; MemberDefinitionCollection.prototype.constructor = MemberDefinitionCollection; $data.MemberDefinitionCollection = MemberDefinitionCollection; function ClassEngineBase() { this.classNames = {}; } function MemberTypes() { ///<field name="method" type="string" /> ///<field name="property" type="string" /> ///<field name="field" type="string" /> ///<field name="complexProperty" type="string" /> } MemberTypes.__enum = true; MemberTypes.method = "method"; MemberTypes.property = "property"; MemberTypes.navProperty = "navProperty"; MemberTypes.complexProperty = "complexProperty"; MemberTypes.field = "field"; $data.MemberTypes = MemberTypes; //function classToJSON() { // var ret = {}; // for (var i in this) { // if (this.hasOwnProperty(i)) { // ret[i] = this[i]; // } // } // return ret; //} //$data.Base.toJSON = classToJSON; ClassEngineBase.prototype = { //getClass: function (classReference) { //}, //getProperties: function (classFunction) { // return classFunction.propertyDefinitions; //}, define: function define(className, baseClass, container, instanceDefinition, classDefinition) { /// <signature> /// <summary>Creates a Jaydata type</summary> /// <param name="className" type="String">Name of the class</param> /// <param name="baseClass" type="Function">Basetype of the class</param> /// <param name="interfaces" type="Object" elementType="Function" /> /// <param name="instanceDefinition" type="Object">Class definition (properties, methods, etc)</param> /// <param name="classDefinition" type="Object">Class static definition</param> /// <example> /// /// var t = new $data.Class.define('Types.A', $data.Base, null, { /// constructor: function(){ }, /// func1: function(){ }, /// member1: { type: 'string' } /// }, { /// staticFunc1: function() {} /// }) /// /// </example> /// </signature> return this.defineEx(className, [{ type: baseClass }], container, instanceDefinition, classDefinition); }, defineEx: function defineEx(className, baseClasses, container, instanceDefinition, classDefinition) { /// <signature> /// <summary>Creates a Jaydata type</summary> /// <param name="className" type="String">Name of the class</param> /// <param name="baseClasses" type="Array" elementType="Functions">Basetypes of the class. First is a real base, others are mixins</param> /// <param name="interfaces" type="Object" elementType="Function" /> /// <param name="instanceDefinition" type="Object">Class definition (properties, methods, etc)</param> /// <param name="classDefinition" type="Object">Class static definition</param> /// <example> /// /// var t = new $data.Class.define('Types.A', [$data.Base, $data.Mixin1, $data.Mixin2], null, { /// constructor: function(){ }, /// func1: function(){ }, /// member1: { type: 'string' } /// }, { /// staticFunc1: function() {} /// }) /// /// </example> /// </signature> /// <signature> /// <summary>Creates a Jaydata type</summary> /// <param name="className" type="String">Name of the class</param> /// <param name="baseClasses" type="Array" elementType="Object">Basetypes of the class. First is a real base, others are mixins or propagations</param> /// <param name="interfaces" type="Object" elementType="Function" /> /// <param name="instanceDefinition" type="Object">Class definition (properties, methods, etc)</param> /// <param name="classDefinition" type="Object">Class static definition</param> /// <example> /// /// var t = new $data.Class.define('Types.A', [ /// { type: $data.Base, params: [1, 'secondParameterValue', new $data.Class.ConstructorParameter(0)] }, /// { type: $data.Mixin1, }, /// { type: $data.Mixin2, }, /// { type: $data.Propagation1, params: [new $data.Class.ConstructorParameter(1)], propagateTo:'Propagation1' }, /// { type: $data.Propagation2, params: ['firstParameterValue'], propagateTo:'Propagation2' } /// ], null, { /// constructor: function(){ }, /// func1: function(){ }, /// member1: { type: 'string' } /// }, { /// staticFunc1: function() {} /// }) /// /// </example> /// </signature> container = container || $data.Container; if (baseClasses.length == 0) { baseClasses.push({ type: $data.Base }); } else if (baseClasses.length > 0 && !baseClasses[0].type) { baseClasses[0].type = $data.Base; } for (var i = 0, l = baseClasses.length; i < l; i++) { if (typeof baseClasses[i] === 'function') baseClasses[i] = { type: baseClasses[i] }; } var providedCtor = instanceDefinition ? instanceDefinition.constructor : undefined; var classNameParts = className.split('.'); var shortClassName = classNameParts.splice(classNameParts.length - 1, 1)[0]; $data.models = $data.models || {}; var root = container === $data.Container ? $data.models : container; root = $data.Container.createOrGetNamespace(classNameParts, root); var classFunction = null; classFunction = this.classFunctionBuilder(shortClassName, baseClasses, classDefinition, instanceDefinition); classFunction.fullName = className; classFunction.namespace = classNameParts.join('.'); //classname splitted //classFunction.name = shortClassName; classFunction.container = container; classFunction.container.registerType(className, classFunction); this.buildType(classFunction, baseClasses, instanceDefinition, classDefinition); if (typeof intellisense !== 'undefined') { if (instanceDefinition && instanceDefinition.constructor) { intellisense.annotate(classFunction, instanceDefinition.constructor); } } root[shortClassName] = this.classNames[className] = classFunction; if (classNameParts[0] == '$data') { var _classNameParts = [].concat(classNameParts); _classNameParts.shift(); var _root = $data.Container.createOrGetNamespace(_classNameParts, $data); _root[shortClassName] = classFunction; } if (_modelHolder && container == $data.Container) { var innerNS = $data.Container.createOrGetNamespace(classNameParts, _modelHolder); innerNS[shortClassName] = classFunction; } //classFunction.toJSON = classToJSON; var baseCount = classFunction.baseTypes.length; for (var i = 0; i < baseCount; i++) { var b = classFunction.baseTypes[i]; if ("inheritedTypeProcessor" in b) { b.inheritedTypeProcessor(classFunction); } } //classFunction.prototype.constructor = instanceDefinition.constructor; //classFunction.constructor = instanceDefinition.constructor; //classFunction.toJSON = function () { return classFunction.memberDefinitions.filter( function(md) { return md; }; return classFunction; }, classFunctionBuilder: function classFunctionBuilder(name, base, classDefinition, instanceDefinition) { var body = this.bodyBuilder(base, classDefinition, instanceDefinition); return new Function('base', 'classDefinition', 'instanceDefinition', 'name', '$data', 'return function ' + name + ' (){ ' + body + ' \n}; ')(base, classDefinition, instanceDefinition, name, $data); }, bodyBuilder: function bodyBuilder(bases, classDefinition, instanceDefinition) { var mixin = ''; var body = ''; var propagation = ''; for (var i = 0, l = bases.length; i < l; i++) { var base = bases[i]; var index = i; if (index == 0) { //ctor func if (base && base.type && base.type !== $data.Base && base.type.fullName) { body += ' var baseArguments = $data.typeSystem.createCtorParams(arguments, base[' + index + '].params, this); \n'; body += ' $data.models.' + base.type.fullName + '.apply(this, baseArguments); \n'; } } else { if (base && base.type && base.propagateTo) { //propagation propagation += ' ' + (!propagation ? 'var ' : '' + '') + 'propagationArguments = $data.typeSystem.createCtorParams(arguments, base[' + index + '].params, this); \n'; propagation += ' this["' + base.propagateTo + '"] = Object.create($data.models.' + base.type.fullName + '.prototype); \n' + ' $data.models.' + base.type.fullName + '.apply(this["' + base.propagateTo + '"], propagationArguments); \n'; } else if (base && base.type && base.type.memberDefinitions && base.type.memberDefinitions.$constructor && !base.propagateTo) { //mixin mixin += ' $data.models.' + base.type.fullName + '.memberDefinitions.$constructor.method.apply(this); \n'; } } } if (instanceDefinition && instanceDefinition.constructor != Object) body += " instanceDefinition.constructor.apply(this, arguments); \n"; return '\n //mixins \n' + mixin + '\n //construction \n' + body + '\n //propagations \n' + propagation; }, buildType: function buildType(classFunction, baseClasses, instanceDefinition, classDefinition) { var baseClass = baseClasses[0].type; classFunction.inheritsFrom = baseClass; baseClass.inheritedTo = baseClass.inheritedTo || []; baseClass.inheritedTo.push(classFunction); if (baseClass) { classFunction.prototype = Object.create(baseClass.prototype); classFunction.memberDefinitions = Object.create(baseClass.memberDefinitions || new MemberDefinitionCollection()); classFunction.memberDefinitions.clearCache(); var staticDefs = baseClass.staticDefinitions; if (staticDefs) { staticDefs = staticDefs.asArray(); if (staticDefs) { for (var i = 0; i < staticDefs.length; i++) { this.buildMember(classFunction, staticDefs[i], undefined, 'staticDefinitions'); } } } classFunction.baseTypes = (baseClass.baseTypes || []).slice(); for (var i = 0; i < baseClasses.length; i++) { classFunction.baseTypes.push(baseClasses[i].type); } //classFunction.baseTypes = (baseClass.baseTypes || []).concat(baseClasses.map(function (base) { return base.type; })); if (!classFunction.isAssignableTo) { Object.defineProperty(classFunction, "isAssignableTo", { value: function value(type) { return this === type || this.baseTypes.indexOf(type) >= 0; }, writable: false, enumerable: false, configurable: false }); } } var openTypeDefinition = classFunction.staticDefinitions && classFunction.staticDefinitions.getMember('openType'); if (classDefinition) { if (openTypeDefinition) delete classDefinition.openType; this.buildStaticMembers(classFunction, classDefinition); if (classDefinition.constructor) classFunction.classConstructor = classDefinition.constructor; } if (instanceDefinition) { //build open type member if (!openTypeDefinition && classDefinition && (typeof classFunction.openType === "string" || classFunction.openType === true) && classFunction.isAssignableTo($data.Entity)) { var openTypePropertyName = $data.defaults.openTypeDefaultPropertyName; var openTypeDefaultType = Container.resolveType($data.defaults.openTypeDefaultType); var openTypeDefaultValue = $data.defaults.openTypeDefaultValue; if (typeof classFunction.openType == "string") { openTypePropertyName = classFunction.openType; } var definedOpenTypeMember = classFunction.getMemberDefinition(openTypePropertyName); if (definedOpenTypeMember && Container.resolveType(definedOpenTypeMember.type || definedOpenTypeMember.dataType) !== openTypeDefaultType) { _jaydataErrorHandler.Guard.raise(new _jaydataErrorHandler.Exception("Type Error", "OpenType default type missmatch")); } if (!definedOpenTypeMember && instanceDefinition[openTypePropertyName]) { var memberType = Container.resolveType(instanceDefinition[openTypePropertyName].type || instanceDefinition[openTypePropertyName].dataType); if (memberType !== openTypeDefaultType) { _jaydataErrorHandler.Guard.raise(new _jaydataErrorHandler.Exception("Type Error", "OpenType default type missmatch")); } } if (!definedOpenTypeMember && !instanceDefinition[openTypePropertyName]) { var defaultValue = typeof openTypeDefaultValue !== "undefined" ? openTypeDefaultValue : function () { return {}; }; instanceDefinition[openTypePropertyName] = { type: openTypeDefaultType, defaultValue: defaultValue }; } } this.buildInstanceMembers(classFunction, instanceDefinition); } var mixins = [].concat(baseClasses); mixins.shift(); if (Object.keys(mixins).length > 0) this.buildInstanceMixins(classFunction, mixins); classFunction.__class = true; classFunction.prototype.constructor = classFunction; Object.defineProperty(classFunction.prototype, "getType", { value: function value() { return classFunction; }, writable: false, enumerable: false, configurable: false }); }, addMethod: function addMethod(holder, name, method, propagation) { if (!propagation || typeof intellisense !== 'undefined') { holder[name] = method; } else { holder[name] = function () { return method.apply(this[propagation], arguments); }; } }, addProperty: function addProperty(holder, name, propertyDescriptor, propagation) { //holder[name] = {}; if (propagation) { propertyDescriptor.configurable = true; if (propertyDescriptor.get) { var origGet = propertyDescriptor.get; propertyDescriptor.get = function () { if (!this[propagation]) _jaydataErrorHandler.Guard.raise(new _jaydataErrorHandler.Exception("not inicialized")); return origGet.apply(this[propagation], arguments); }; } if (propertyDescriptor.set) { var origSet = propertyDescriptor.set; propertyDescriptor.set = function () { if (!this[propagation]) _jaydataErrorHandler.Guard.raise(new _jaydataErrorHandler.Exception("not inicialized")); origSet.apply(this[propagation], arguments); }; } } Object.defineProperty(holder, name, propertyDescriptor); }, addField: function addField(holder, name, field) { _jaydataErrorHandler.Guard.raise("not implemented"); }, buildMethod: function buildMethod(classFunction, memberDefinition, propagation) { ///<param name="classFunction" type="Function">The object that will receive member</param> ///<param name="memberDefinition" type="MemberDefinition">the newly added member</param> var holder = memberDefinition.classMember ? classFunction : classFunction.prototype; this.addMethod(holder, memberDefinition.name, memberDefinition.method, propagation); for (var meta in memberDefinition) { if (typeof Reflect !== 'undefined' && Reflect.defineMetadata && typeof memberDefinition[meta] !== 'undefined' && memberDefinition.hasOwnProperty(meta)) { Reflect.defineMetadata('definition:' + meta, memberDefinition[meta], holder, memberDefinition.name); } } }, buildProperty: function buildProperty(classFunction, memberDefinition, propagation) { ///<param name="classFunction" type="Function">The object that will receive member</param> ///<param name="memberDefinition" type="MemberDefinition">the newly added member</param> var holder = memberDefinition.classMember ? classFunction : classFunction.prototype; var pd = memberDefinition.createPropertyDescriptor(classFunction); this.addProperty(holder, memberDefinition.name, pd, propagation); for (var meta in memberDefinition) { if (typeof Reflect !== 'undefined' && Reflect.defineMetadata && typeof memberDefinition[meta] !== 'undefined' && memberDefinition.hasOwnProperty(meta)) { Reflect.defineMetadata('definition:' + meta, memberDefinition[meta], holder, memberDefinition.name); } } //if lazyload TODO if (!memberDefinition.classMember && classFunction.__setPropertyfunctions == true && memberDefinition.withoutGetSetMethod !== true && !('get_' + memberDefinition.name in holder || 'set_' + memberDefinition.name in holder)) { var pdGetMethod = memberDefinition.createGetMethod(); this.addProperty(holder, 'get_' + memberDefinition.name, pdGetMethod, propagation); var pdSetMethod = memberDefinition.createSetMethod(); this.addProperty(holder, 'set_' + memberDefinition.name, pdSetMethod, propagation); } }, buildMember: function buildMember(classFunction, memberDefinition, propagation, memberCollectionName) { ///<param name="memberDefinition" type="MemberDefinition" /> memberCollectionName = memberCollectionName || 'memberDefinitions'; classFunction[memberCollectionName] = classFunction[memberCollectionName] || new MemberDefinitionCollection(); classFunction[memberCollectionName].setMember(memberDefinition); switch (memberDefinition.kind) { case MemberTypes.method: this.buildMethod(classFunction, memberDefinition, propagation); break; case MemberTypes.navProperty: case MemberTypes.complexProperty: case MemberTypes.property: this.buildProperty(classFunction, memberDefinition, propagation); break; default: _jaydataErrorHandler.Guard.raise("Unknown member type: " + memberDefinition.kind + "," + memberDefinition.name); } }, buildStaticMembers: function buildStaticMembers(classFunction, memberListDefinition) { ///<param name="classFunction" type="Object">The class constructor that will be extended</param> ///<param name="memberListDefinition" type="Object"></param> var t = this; for (var item in memberListDefinition) { if (memberListDefinition.hasOwnProperty(item)) { var memberDefinition = MemberDefinition.translateDefinition(memberListDefinition[item], item, classFunction); memberDefinition.classMember = true; t.buildMember(classFunction, memberDefinition, undefined, 'staticDefinitions'); } } }, buildInstanceMembers: function buildInstanceMembers(classFunction, memberListDefinition) { ///<param name="classFunction" type="Function">The class constructor whose prototype will be extended</param> ///<param name="memberListDefinition" type="Object"></param> ///pinning t outside of the closure seems actually faster then passing in the this and referencing var t = this; for (var item in memberListDefinition) { if (memberListDefinition.hasOwnProperty(item)) { var memberDefinition = MemberDefinition.translateDefinition(memberListDefinition[item], item, classFunction); t.buildMember(classFunction, memberDefinition, undefined, 'memberDefinitions'); } } }, copyMembers: function copyMembers(sourceType, targetType) { ///<param name="sourceType" type="Function" /> ///<param name="targetType" type="Function" /> function il(msg) { if (typeof intellisense === 'undefined') { return; } intellisense.logMessage(msg); } Object.keys(sourceType.prototype).forEach(function (item, i, src) { if (item !== 'constructor' && item !== 'toString') { il("copying item:" + item); targetType.prototype[item] = sourceType[item]; } }); }, buildInstanceMixins: function buildInstanceMixins(classFunction, mixinList) { ///<param name="classFunction" type="Function">The class constructor whose prototype will be extended</param> ///<param name="mixinList" type="Array"></param> classFunction.mixins = classFunction.mixins || []; classFunction.propagations = classFunction.propagations || []; for (var i = 0; i < mixinList.length; i++) { var item = mixinList[i]; //if (classFunction.memberDefinitions.getMember(item.type.name)) { if (item.propagateTo) { this.buildInstancePropagation(classFunction, item); classFunction.propagations.push(item); classFunction.propagations[item.type.name] = true; } else { this.buildInstanceMixin(classFunction, item); classFunction.mixins.push(item); classFunction.mixins[item.type.name] = true; } }; }, buildInstanceMixin: function buildInstanceMixin(classFunction, typeObj) { ///<param name="classFunction" type="Function">The class constructor whose prototype will be extended</param> ///<param name="typeObj" type="Object"></param> var memberDefs = typeObj.type.memberDefinitions.asArray(); for (var i = 0, l = memberDefs.length; i < l; i++) { var itemName = memberDefs[i].name; if (itemName !== 'constructor' && !classFunction.memberDefinitions.getMember(itemName)) { this.buildMember(classFunction, memberDefs[i]); } } if (typeObj.type.staticDefinitions) { var staticDefs = typeObj.type.staticDefinitions.asArray(); for (var i = 0, l = staticDefs.length; i < l; i++) { var itemName = staticDefs[i].name; if (itemName !== 'constructor' && !classFunction.memberDefinitions.getMember(itemName)) { this.buildMember(classFunction, staticDefs[i], undefined, 'staticDefinitions'); } } } }, buildInstancePropagation: function buildInstancePropagation(classFunction, typeObj) { ///<param name="classFunction" type="Function">The class constructor whose prototype will be extended</param> ///<param name="typeObj" type="Object"></param> var memberDefs = typeObj.type.memberDefinitions.asArray(); for (var i = 0, l = memberDefs.length; i < l; i++) { var itemName = memberDefs[i].name; if (itemName !== 'constructor' && !classFunction.memberDefinitions.getMember(itemName)) { this.buildMember(classFunction, memberDefs[i], typeObj.propagateTo); } } } }; var Class; $data.Class = Class = new ClassEngineBase(); $data.ContainerClass = _Container.ContainerCtor; var c; $data.Container = c = _Container.ContainerInstance; $data.createContainer = function () { return new _Container.ContainerCtor($data.Container); }; var storeProperty = function storeProperty(memberDefinition, value) { var backingFieldName = "_" + memberDefinition.name; if (!this[backingFieldName]) { Object.defineProperty(this, backingFieldName, memberDefinition.createStorePropertyDescriptor(value)); } else { this[backingFieldName] = value; } }; var retrieveProperty = function retrieveProperty(memberDefinition) { var backingFieldName = "_" + memberDefinition.name; return this[backingFieldName]; }; $data.Class.define('$data.Base', function Base() {}, null, { storeProperty: storeProperty, retrieveProperty: retrieveProperty, setProperty: function setProperty(memberDefinition, value, callback) { this[memberDefinition.name] = value; callback(); }, getProperty: function getProperty(memberDefinition, callback) { callback.apply(this, [this[memberDefinition.name]]); } }, { create: function create() { return Container.createInstance(this, arguments); }, extend: function extend(name, container, instanceDefinition, classDefinition) { if (container && !(container instanceof _Container.ContainerCtor)) { classDefinition = instanceDefinition; instanceDefinition = container; container = undefined; } return $data.Class.define(name, this, container, instanceDefinition, classDefinition); }, getMemberDefinition: function getMemberDefinition(name) { return this.memberDefinitions.getMember(name); }, addProperty: function addProperty(name, getterOrType, setterOrGetter, setter) { var _getter = getterOrType; var _setter = setterOrGetter; var _type; if (typeof _getter === 'string') { _type = getterOrType; _getter = setterOrGetter; _setter = setter; } var propDef = { notMapped: true, storeOnObject: true, get: typeof _getter === 'function' ? _getter : function () {}, set: typeof _setter === 'function' ? _setter : function () {}, type: _type }; var memberDefinition = MemberDefinition.translateDefinition(propDef, name, this); $data.Class.buildMember(this, memberDefinition); this.memberDefinitions.clearCache(); return this; }, addMember: function addMember(name, definition, isClassMember) { var memberDefinition = MemberDefinition.translateDefinition(definition, name, this); if (isClassMember) { memberDefinition.classMember = true; $data.Class.buildMember(this, memberDefinition, undefined, 'staticDefinitions'); this.staticDefinitions.clearCache(); } else { $data.Class.buildMember(this, memberDefinition); this.memberDefinitions.clearCache(); } return this; }, describeField: function describeField(name, definition) { var memDef = this.memberDefinitions.getMember(name); if (!memDef) { this.addMember(name, definition); } else { _jaydataErrorHandler.Guard.raise(new _jaydataErrorHandler.Exception("Field '" + name + "' already defined!", "Invalid operation")); } return this; }, storeProperty: storeProperty, retrieveProperty: retrieveProperty, 'from$data.Object': function from$dataObject(value) { return value; }, hasMetadata: function hasMetadata(key, property) { return typeof Reflect !== 'undefined' && Reflect.hasMetadata && Reflect.hasMetadata(key, this.prototype, property); }, getAllMetadata: function getAllMetadata(property) { var _this = this; var result = {}; if (typeof Reflect !== 'undefined' && Reflect.getMetadataKeys && Reflect.getMetadata) { var keys = Reflect.getMetadataKeys(this.prototype, property); keys.forEach(function (key) { result[key] = Reflect.getMetadata(key, _this.prototype, property); }); } return result; }, getMetadata: function getMetadata(key, property) { return typeof Reflect !== 'undefined' && Reflect.getMetadata ? Reflect.getMetadata(key, this.prototype, property) : undefined; }, setMetadata: function setMetadata(key, value, property) { return typeof Reflect !== 'undefined' && Reflect.defineMetadata && Reflect.defineMetadata(key, value, this.prototype, property); } }); //override after typeSystem initialized $data.Class.ConstructorParameter = $data.Class.define('ConstructorParameter', null, null, { constructor: function constructor(paramIndex) { ///<param name="paramIndex" type="integer" /> this.paramIndex = paramIndex; }, paramIndex: {} }); })(_initializeJayData2.default); _initializeJayData2.default.defaultErrorCallback = function () { //console.log('DEFAULT ERROR CALLBACK:'); /*if (console.dir) console.dir(arguments); else console.log(arguments);*/ if (arguments.length > 0 && arguments[arguments.length - 1] && typeof arguments[arguments.length - 1].reject === 'function') { (console.error || console.log).call(console, arguments[0]); arguments[arguments.length - 1].reject.apply(arguments[arguments.length - 1], arguments); } else { if (arguments[0] instanceof Error) { _jaydataErrorHandler.Guard.raise(arguments[0]); } else { _jaydataErrorHandler.Guard.raise(new _jaydataErrorHandler.Exception("DEFAULT ERROR CALLBACK!", "DefaultError", arguments)); } } }; _initializeJayData2.default.defaultSuccessCallback = function () {/*console.log('DEFAULT SUCCES CALLBACK');*/}; _initializeJayData2.default.defaultNotifyCallback = function () {/*console.log('DEFAULT NOTIFY CALLBACK');*/}; _initializeJayData2.default.typeSystem = { __namespace: true, /*inherit: function (ctor, baseType) { var proto = new baseType(); ctor.prototype = $.extend(proto, ctor.prototype); //console.dir(proto); ctor.prototype.base = new baseType(); //console.dir(ctor.prototype.base); ctor.prototype.constructor = ctor; return ctor; },*/ //mix: function (type, mixin) { // type.prototype = $.extend(type.prototype || {}, mixin.prototype || {}); // type.mixins = type.mixins || []; // type.mixins.push(mixin); // return type; //}, extend: function extend(target) { /// <summary> /// Extends an object with properties of additional parameters. /// </summary> /// <signature> /// <param name="target" type="Object">Object that will be extended.</param> /// <param name="object" type="Object">Object to extend target with.</param> /// <param name="objectN" optional="true" parameterArray="true" type="Object">Object to extend target with.</param> /// </signature> /// <returns></returns> if ((typeof target === 'undefined' ? 'undefined' : _typeof(target)) !== 'object' && typeof target !== 'function') _jaydataErrorHandler.Guard.raise('Target must be object or function'); for (var i = 1; i < arguments.length; i++) { var obj = arguments[i]; if (obj === null || typeof obj === 'undefined') continue; for (var key in obj) { target[key] = obj[key]; } } return target; }, createCallbackSetting: function createCallbackSetting(callBack, defaultSetting) { var setting = { success: _initializeJayData2.default.defaultSuccessCallback, error: _initializeJayData2.default.defaultErrorCallback, notify: _initializeJayData2.default.defaultNotifyCallback }; if (defaultSetting != undefined && defaultSetting != null) { setting = defaultSetting; } var result; if (callBack == null || callBack == undefined) { result = setting; } else if (typeof callBack == 'function') { result = this.extend(setting, { success: callBack }); } else { result = this.extend(setting, callBack); } function wrapCode(fn) { var t = this; function r() { fn.apply(t, arguments); fn = function fn() {}; } return r; } if (typeof result.error === 'function') result.error = wrapCode(result.error); return result; }, createCtorParams: function createCtorParams(source, indexes, thisObj) { ///<param name="source" type="Array" />Paramerter array ///<param name="indexes" type="Array" /> ///<param name="thisObj" type="Object" /> if (indexes) { var paramArray = []; for (var i = 0, l = indexes.length; i < l; i++) { var item = i; if (indexes[item] instanceof _initializeJayData2.default.Class.ConstructorParameter) paramArray.push(source[indexes[item].paramIndex]);else if (typeof indexes[item] === "function") paramArray.push(indexes[item].apply(thisObj));else paramArray.push(indexes[item]); } return paramArray; } return source; }, writePropertyValues: function writePropertyValues(obj) { if (obj && obj.getType && obj.getType().memberDefinitions) { this.writeProperties(obj, obj.getType().memberDefinitions.asArray().filter(function (md) { return (md.kind == "property" || md.kind == "navProperty" || md.kind == "complexProperty") && !md.prototypeProperty; })); } }, writeProperties: function writeProperties(obj, members) { var defines = {}; for (var i = 0, l = members.length; i < l; i++) { var memDef = members[i]; defines[memDef.name] = memDef.createPropertyDescriptor(null, memDef.value); } Object.defineProperties(obj, defines); }, writeProperty: function writeProperty(obj, member, value) { var memDef = typeof member === 'string' ? obj.getType().memberDefinitions.getMember(member) : member; if (memDef) { var propDef = memDef.createPropertyDescriptor(null, value); //////OPTIMIZATION Object.defineProperty(obj, memDef.name, propDef); } } }; _initializeJayData2.default.debug = function () { (console.debug || console.log).apply(console, arguments); }; _initializeJayData2.default.debugWith = function () { var cArgs = arguments; return function (r) { (console.debug || console.log).apply(console, cArgs); if (typeof Error !== 'undefined' && r instanceof Error || typeof _jaydataErrorHandler.Exception !== 'undefined' && r instanceof _jaydataErrorHandler.Exception) { (console.error || console.log).apply(console, arguments); } else { (console.debug || console.log).apply(console, arguments); } }; }; _initializeJayData2.default.fdebug = { success: _initializeJayData2.default.debugWith('success'), error: _initializeJayData2.default.debugWith('error') }; var $C = exports.$C = function $C() { _initializeJayData2.default.Class.define.apply(_initializeJayData2.default.Class, arguments); }; var Container = exports.Container = _initializeJayData2.default.Container; var MemberDefinition = exports.MemberDefinition = _initializeJayData2.default.MemberDefinition; exports.default = _initializeJayData2.default;