ember-data-source 1.0.0.beta.7 → 1.0.0.beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/dist/ember-data.js +1484 -563
- data/dist/ember-data.min.js +4 -4
- data/dist/ember-data.prod.js +1478 -559
- data/lib/ember/data/version.rb +5 -1
- data/package.json +34 -0
- metadata +8 -9
- data/VERSION +0 -1
data/dist/ember-data.min.js
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
* @copyright Copyright 2011-2014 Tilde Inc. and contributors.
|
4
4
|
* Portions Copyright 2011 LivingSocial Inc.
|
5
5
|
* @license Licensed under MIT license (see license.js)
|
6
|
-
* @version 1.0.0-beta.
|
6
|
+
* @version 1.0.0-beta.8.2a68c63a
|
7
7
|
*/
|
8
|
-
!function(a){var b,c,d,e;!function(){var a={},f={};b=function(b,c,d){a[b]={deps:c,callback:d}},e=d=c=function(b){function d(a){if("."!==a.charAt(0))return a;for(var c=a.split("/"),d=b.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(e._eak_seen=a,f[b])return f[b];if(f[b]={},!a[b])throw new Error("Could not find module "+b);for(var g,h=a[b],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)k.push("exports"===i[l]?g={}:c(d(i[l])));var n=j.apply(this,k);return f[b]=g||n}}(),b("activemodel-adapter/lib/initializers",["../../ember-data/lib/system/container_proxy","./system/active_model_serializer","./system/active_model_adapter"],function(a,b,c){"use strict";var d=a["default"],e=b["default"],f=c["default"];Ember.onLoad("Ember.Application",function(a){a.initializer({name:"activeModelAdapter",initialize:function(a,b){var c=new d(a);c.registerDeprecations([{deprecated:"serializer:_ams",valid:"serializer:-active-model"},{deprecated:"adapter:_ams",valid:"adapter:-active-model"}]),b.register("serializer:-active-model",e),b.register("adapter:-active-model",f)}})})}),b("activemodel-adapter/lib/main",["./system","./initializers","exports"],function(a,b,c){"use strict";var d=a.ActiveModelAdapter,e=a.ActiveModelSerializer,f=a.EmbeddedRecordsMixin;c.ActiveModelAdapter=d,c.ActiveModelSerializer=e,c.EmbeddedRecordsMixin=f}),b("activemodel-adapter/lib/system",["./system/embedded_records_mixin","./system/active_model_adapter","./system/active_model_serializer","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"],g=c["default"];d.EmbeddedRecordsMixin=e,d.ActiveModelAdapter=f,d.ActiveModelSerializer=g}),b("activemodel-adapter/lib/system/active_model_adapter",["../../../ember-data/lib/adapters","../../../ember-data/lib/system/adapter","../../../ember-inflector/lib/main","./active_model_serializer","./embedded_records_mixin","exports"],function(a,b,c,d,e,f){"use strict";var g=a.RESTAdapter,h=b.InvalidError,i=c.pluralize,j=(d["default"],e["default"],Ember.EnumerableUtils.forEach),k=Ember.String.decamelize,l=Ember.String.underscore,m=g.extend({defaultSerializer:"-active-model",pathForType:function(a){var b=k(a),c=l(b);return i(c)},ajaxError:function(a){var b=this._super(a);if(a&&422===a.status){var c=Ember.$.parseJSON(a.responseText),d={};if(void 0!==c.errors){var e=c.errors;j(Ember.keys(e),function(a){d[Ember.String.camelize(a)]=e[a]})}return new h(d)}return b}});f["default"]=m}),b("activemodel-adapter/lib/system/active_model_serializer",["../../../ember-inflector/lib/main","../../../ember-data/lib/serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a.singularize,e=b["default"],f=Ember.get,g=Ember.EnumerableUtils.forEach,h=Ember.String.camelize,i=Ember.String.capitalize,j=Ember.String.decamelize,k=Ember.String.underscore,l=e.extend({keyForAttribute:function(a){return j(a)},keyForRelationship:function(a,b){return a=j(a),"belongsTo"===b?a+"_id":"hasMany"===b?d(a)+"_ids":a},serializeHasMany:Ember.K,serializeIntoHash:function(a,b,c,d){var e=k(j(b.typeKey));a[e]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,e=f(a,d);d=this.keyForAttribute(d),b[d+"_type"]=i(h(e.constructor.typeKey))},typeForRoot:function(a){var b=h(a);return d(b)},normalize:function(a,b,c){return this.normalizeLinks(b),this._super(a,b,c)},normalizeLinks:function(a){if(a.links){var b=a.links;for(var c in b){var d=h(c);d!==c&&(b[d]=b[c],delete b[c])}}},normalizeRelationships:function(a,b){var c,d;this.keyForRelationship&&a.eachRelationship(function(a,e){if(e.options.polymorphic){if(c=this.keyForAttribute(a),d=b[c],d&&d.type)d.type=this.typeForRoot(d.type);else if(d&&"hasMany"===e.kind){var f=this;g(d,function(a){a.type=f.typeForRoot(a.type)})}}else c=this.keyForRelationship(a,e.kind),d=b[c];b[a]=d,a!==c&&delete b[c]},this)}});c["default"]=l}),b("activemodel-adapter/lib/system/embedded_records_mixin",["../../../ember-inflector/lib/main","exports"],function(a,b){"use strict";function c(a,b,f,g,h){var i=d(b,"attrs");i&&f.eachRelationship(function(b,f){var j,k,l,m,n=i[b],o=a.serializerFor(f.type.typeKey),p=d(o,"primaryKey");if("hasMany"===f.kind&&n&&("always"===n.embedded||"load"===n.embedded)){if(k="_"+Ember.String.pluralize(f.type.typeKey),j=this.keyForRelationship(b,f.kind),l=this.keyForAttribute(b),m=[],!g[l])return;h[k]=h[k]||[],e(g[l],function(b){var d=a.modelFor(f.type.typeKey);c(a,o,d,b,h),m.push(b[p]),h[k].push(b)}),g[j]=m,delete g[l]}},b)}var d=Ember.get,e=Ember.EnumerableUtils.forEach,f=a.pluralize,g=Ember.Mixin.create({serializeHasMany:function(a,b,c){var e=c.key,f=d(this,"attrs"),g=f&&f[e]&&"always"===f[e].embedded;g&&(b[this.keyForAttribute(e)]=d(a,e).map(function(a){var b=a.serialize(),c=d(this,"primaryKey");return b[c]=d(a,c),b},this))},extractSingle:function(a,b,d,e,f){var g=this.keyForAttribute(b.typeKey),h=d[g];return c(a,this,b,h,d),this._super(a,b,d,e,f)},extractArray:function(a,b,d){var g=this.keyForAttribute(b.typeKey),h=d[f(g)];return e(h,function(e){c(a,this,b,e,d)},this),this._super(a,b,d)}});b["default"]=g}),b("ember-data/lib/adapters",["./adapters/fixture_adapter","./adapters/rest_adapter","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.RESTAdapter=e,c.FixtureAdapter=d}),b("ember-data/lib/adapters/fixture_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=Ember.get,d=Ember.String.fmt,e=Ember.EnumerableUtils.indexOf,f=0,g=a["default"],h=g.extend({serializer:null,simulateRemoteResponse:!0,latency:50,fixturesForType:function(a){if(a.FIXTURES){var b=Ember.A(a.FIXTURES);return b.map(function(a){var b=typeof a.id;if("number"!==b&&"string"!==b)throw new Error(d("the id property must be defined as a number or string for fixture %@",[a]));return a.id=a.id+"",a})}return null},queryFixtures:function(){},updateFixtures:function(a,b){a.FIXTURES||(a.FIXTURES=[]);var c=a.FIXTURES;this.deleteLoadedFixture(a,b),c.push(b)},mockJSON:function(a,b,c){return a.serializerFor(b).serialize(c,{includeId:!0})},generateIdForRecord:function(){return"fixture-"+f++},find:function(a,b,c){var d,e=this.fixturesForType(b);return e&&(d=Ember.A(e).findProperty("id",c)),d?this.simulateRemoteCall(function(){return d},this):void 0},findMany:function(a,b,c){var d=this.fixturesForType(b);return d&&(d=d.filter(function(a){return-1!==e(c,a.id)})),d?this.simulateRemoteCall(function(){return d},this):void 0},findAll:function(a,b){var c=this.fixturesForType(b);return this.simulateRemoteCall(function(){return c},this)},findQuery:function(a,b,c){var d=this.fixturesForType(b);return d=this.queryFixtures(d,c,b),d?this.simulateRemoteCall(function(){return d},this):void 0},createRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},updateRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},deleteRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.deleteLoadedFixture(b,d),this.simulateRemoteCall(function(){return null})},deleteLoadedFixture:function(a,b){var c=this.findExistingFixture(a,b);if(c){var d=e(a.FIXTURES,c);return a.FIXTURES.splice(d,1),!0}},findExistingFixture:function(a,b){var d=this.fixturesForType(a),e=c(b,"id");return this.findFixtureById(d,e)},findFixtureById:function(a,b){return Ember.A(a).find(function(a){return""+c(a,"id")==""+b?!0:!1})},simulateRemoteCall:function(a,b){var d=this;return new Ember.RSVP.Promise(function(e){c(d,"simulateRemoteResponse")?Ember.run.later(function(){e(a.call(b))},c(d,"latency")):Ember.run.schedule("actions",null,function(){e(a.call(b))})},"DS: FixtureAdapter#simulateRemoteCall")}});b["default"]=h}),b("ember-data/lib/adapters/rest_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=(Ember.set,Ember.ArrayPolyfills.forEach),f=c.extend({defaultSerializer:"-rest",find:function(a,b,c){return this.ajax(this.buildURL(b.typeKey,c),"GET")},findAll:function(a,b,c){var d;return c&&(d={since:c}),this.ajax(this.buildURL(b.typeKey),"GET",{data:d})},findQuery:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:c})},findMany:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:{ids:c}})},findHasMany:function(a,b,c){var e=d(this,"host"),f=d(b,"id"),g=b.constructor.typeKey;return e&&"/"===c.charAt(0)&&"/"!==c.charAt(1)&&(c=e+c),this.ajax(this.urlPrefix(c,this.buildURL(g,f)),"GET")},findBelongsTo:function(a,b,c){var e=d(b,"id"),f=b.constructor.typeKey;return this.ajax(this.urlPrefix(c,this.buildURL(f,e)),"GET")},createRecord:function(a,b,c){var d={},e=a.serializerFor(b.typeKey);return e.serializeIntoHash(d,b,c,{includeId:!0}),this.ajax(this.buildURL(b.typeKey),"POST",{data:d})},updateRecord:function(a,b,c){var e={},f=a.serializerFor(b.typeKey);f.serializeIntoHash(e,b,c);var g=d(c,"id");return this.ajax(this.buildURL(b.typeKey,g),"PUT",{data:e})},deleteRecord:function(a,b,c){var e=d(c,"id");return this.ajax(this.buildURL(b.typeKey,e),"DELETE")},buildURL:function(a,b){var c=[],e=d(this,"host"),f=this.urlPrefix();return a&&c.push(this.pathForType(a)),b&&c.push(b),f&&c.unshift(f),c=c.join("/"),!e&&c&&(c="/"+c),c},urlPrefix:function(a,b){var c=d(this,"host"),e=d(this,"namespace"),f=[];return a?"/"===a.charAt(0)?c&&(a=a.slice(1),f.push(c)):/^http(s)?:\/\//.test(a)||f.push(b):(c&&f.push(c),e&&f.push(e)),a&&f.push(a),f.join("/")},pathForType:function(a){var b=Ember.String.camelize(a);return Ember.String.pluralize(b)},ajaxError:function(a){return a&&(a.then=null),a},ajax:function(a,b,c){var d=this;return new Ember.RSVP.Promise(function(e,f){c=d.ajaxOptions(a,b,c),c.success=function(a){Ember.run(null,e,a)},c.error=function(a){Ember.run(null,f,d.ajaxError(a))},Ember.$.ajax(c)},"DS: RestAdapter#ajax "+b+" to "+a)},ajaxOptions:function(a,b,c){if(c=c||{},c.url=a,c.type=b,c.dataType="json",c.context=this,c.data&&"GET"!==b&&(c.contentType="application/json; charset=utf-8",c.data=JSON.stringify(c.data)),void 0!==this.headers){var d=this.headers;c.beforeSend=function(a){e.call(Ember.keys(d),function(b){a.setRequestHeader(b,d[b])})}}return c}});b["default"]=f}),b("ember-data/lib/core",["exports"],function(a){"use strict";var b;"undefined"==typeof b&&(b=Ember.Namespace.create({VERSION:"1.0.0-beta.7+canary.f482da04"}),"undefined"!=typeof window&&(window.DS=b),Ember.libraries&&Ember.libraries.registerCoreLibrary("Ember Data",b.VERSION)),a["default"]=b}),b("ember-data/lib/ext/date",[],function(){"use strict";Ember.Date=Ember.Date||{};var a=Date.parse,b=[1,4,5,6,7,10,11];Ember.Date.parse=function(c){var d,e,f=0;if(e=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(c)){for(var g,h=0;g=b[h];++h)e[g]=+e[g]||0;e[2]=(+e[2]||1)-1,e[3]=+e[3]||1,"Z"!==e[8]&&void 0!==e[9]&&(f=60*e[10]+e[11],"+"===e[9]&&(f=0-f)),d=Date.UTC(e[1],e[2],e[3],e[4],e[5]+f,e[6],e[7])}else d=a?a(c):0/0;return d},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Date)&&(Date.parse=Ember.Date.parse)}),b("ember-data/lib/initializers",["./system/store","./serializers","./adapters","./system/debug/debug_adapter","./system/container_proxy","./transforms"],function(a,b,c,d,e,f){"use strict";{var g=a["default"],h=b.JSONSerializer,i=b.RESTSerializer,j=c.RESTAdapter,k=d["default"],l=e["default"],m=f.BooleanTransform,n=f.DateTransform,o=f.StringTransform,p=f.NumberTransform;Ember.set}Ember.onLoad("Ember.Application",function(a){a.initializer({name:"store",initialize:function(a,b){b.register("store:main",b.Store||g);var c=new l(a);c.registerDeprecations([{deprecated:"serializer:_default",valid:"serializer:-default"},{deprecated:"serializer:_rest",valid:"serializer:-rest"},{deprecated:"adapter:_rest",valid:"adapter:-rest"}]),b.register("serializer:-default",h),b.register("serializer:-rest",i),b.register("adapter:-rest",j),a.lookup("store:main")}}),a.initializer({name:"transforms",before:"store",initialize:function(a,b){b.register("transform:boolean",m),b.register("transform:date",n),b.register("transform:number",p),b.register("transform:string",o)}}),a.initializer({name:"data-adapter",before:"store",initialize:function(a,b){b.register("data-adapter:main",k)}}),a.initializer({name:"injectStore",before:"store",initialize:function(a,b){b.inject("controller","store","store:main"),b.inject("route","store","store:main"),b.inject("serializer","store","store:main"),b.inject("data-adapter","store","store:main")}})})}),b("ember-data/lib/main",["./core","./ext/date","./system/store","./system/model","./system/changes","./system/adapter","./system/debug","./system/record_arrays","./system/record_array_manager","./adapters","./serializers/json_serializer","./serializers/rest_serializer","../../ember-inflector/lib/main","../../activemodel-adapter/lib/main","./transforms","./system/relationships","./initializers","./system/container_proxy","exports"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){"use strict";Ember.RSVP.Promise.cast=Ember.RSVP.Promise.cast||Ember.RSVP.resolve;var t=a["default"],u=c.Store,v=c.PromiseArray,w=c.PromiseObject,x=d.Model,y=d.Errors,z=d.RootState,A=d.attr,B=e.AttributeChange,C=e.RelationshipChange,D=e.RelationshipChangeAdd,E=(e.RelationshipChangeRemove,e.OneToManyChange),F=(e.ManyToNoneChange,e.OneToOneChange),G=e.ManyToManyChange,H=f.InvalidError,I=f.Adapter,J=g["default"],K=h.RecordArray,L=h.FilteredRecordArray,M=h.AdapterPopulatedRecordArray,N=h.ManyArray,O=i["default"],P=j.RESTAdapter,Q=j.FixtureAdapter,R=k["default"],S=l["default"],T=n.ActiveModelAdapter,U=n.ActiveModelSerializer,V=n.EmbeddedRecordsMixin,W=o.Transform,X=o.DateTransform,Y=o.NumberTransform,Z=o.StringTransform,$=o.BooleanTransform,_=p.hasMany,ab=p.belongsTo,bb=r["default"];t.Store=u,t.PromiseArray=v,t.PromiseObject=w,t.Model=x,t.RootState=z,t.attr=A,t.Errors=y,t.AttributeChange=B,t.RelationshipChange=C,t.RelationshipChangeAdd=D,t.OneToManyChange=E,t.ManyToNoneChange=E,t.OneToOneChange=F,t.ManyToManyChange=G,t.Adapter=I,t.InvalidError=H,t.DebugAdapter=J,t.RecordArray=K,t.FilteredRecordArray=L,t.AdapterPopulatedRecordArray=M,t.ManyArray=N,t.RecordArrayManager=O,t.RESTAdapter=P,t.FixtureAdapter=Q,t.RESTSerializer=S,t.JSONSerializer=R,t.Transform=W,t.DateTransform=X,t.StringTransform=Z,t.NumberTransform=Y,t.BooleanTransform=$,t.ActiveModelAdapter=T,t.ActiveModelSerializer=U,t.EmbeddedRecordsMixin=V,t.belongsTo=ab,t.hasMany=_,t.ContainerProxy=bb,s["default"]=t}),b("ember-data/lib/serializers",["./serializers/json_serializer","./serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.JSONSerializer=d,c.RESTSerializer=e}),b("ember-data/lib/serializers/json_serializer",["exports"],function(a){"use strict";var b=Ember.get,c=(Ember.set,Ember.isNone),d=Ember.Object.extend({primaryKey:"id",applyTransforms:function(a,b){return a.eachTransformedAttribute(function(a,c){var d=this.transformFor(c);b[a]=d.deserialize(b[a])},this),b},normalize:function(a,b){return b?(this.applyTransforms(a,b),b):b},serialize:function(a,c){var d={};if(c&&c.includeId){var e=b(a,"id");e&&(d[b(this,"primaryKey")]=e)}return a.eachAttribute(function(b,c){this.serializeAttribute(a,d,b,c)},this),a.eachRelationship(function(b,c){"belongsTo"===c.kind?this.serializeBelongsTo(a,d,c):"hasMany"===c.kind&&this.serializeHasMany(a,d,c)},this),d},serializeAttribute:function(a,c,d,e){var f=b(this,"attrs"),g=b(a,d),h=e.type;if(h){var i=this.transformFor(h);g=i.serialize(g)}d=f&&f[d]||(this.keyForAttribute?this.keyForAttribute(d):d),c[d]=g},serializeBelongsTo:function(a,d,e){var f=e.key,g=b(a,f);f=this.keyForRelationship?this.keyForRelationship(f,"belongsTo"):f,d[f]=c(g)?g:b(g,"id"),e.options.polymorphic&&this.serializePolymorphicType(a,d,e)},serializeHasMany:function(a,c,d){var e=d.key,f=DS.RelationshipChange.determineRelationshipType(a.constructor,d);("manyToNone"===f||"manyToMany"===f)&&(c[e]=b(a,e).mapBy("id"))},serializePolymorphicType:Ember.K,extract:function(a,b,c,d,e){this.extractMeta(a,b,c);var f="extract"+e.charAt(0).toUpperCase()+e.substr(1);return this[f](a,b,c,d,e)},extractFindAll:function(a,b,c){return this.extractArray(a,b,c)},extractFindQuery:function(a,b,c){return this.extractArray(a,b,c)},extractFindMany:function(a,b,c){return this.extractArray(a,b,c)},extractFindHasMany:function(a,b,c){return this.extractArray(a,b,c)},extractCreateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractUpdateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractDeleteRecord:function(a,b,c){return this.extractSave(a,b,c)},extractFind:function(a,b,c){return this.extractSingle(a,b,c)},extractFindBelongsTo:function(a,b,c){return this.extractSingle(a,b,c)},extractSave:function(a,b,c){return this.extractSingle(a,b,c)},extractSingle:function(a,b,c){return this.normalize(b,c)},extractArray:function(a,b,c){return this.normalize(b,c)},extractMeta:function(a,b,c){c&&c.meta&&(a.metaForType(b,c.meta),delete c.meta)},transformFor:function(a){var b=this.container.lookup("transform:"+a);return b}});a["default"]=d}),b("ember-data/lib/serializers/rest_serializer",["./json_serializer","exports"],function(a,b){"use strict";function c(a){return null==a?null:a+""}var d=a["default"],e=Ember.get,f=(Ember.set,Ember.ArrayPolyfills.forEach),g=Ember.ArrayPolyfills.map,h=d.extend({normalize:function(a,b,c){return this.normalizeId(b),this.normalizeAttributes(a,b),this.normalizeRelationships(a,b),this.normalizeUsingDeclaredMapping(a,b),this.normalizeHash&&this.normalizeHash[c]&&this.normalizeHash[c](b),this._super(a,b,c)},normalizePayload:function(a,b){return b},normalizeId:function(a){var b=e(this,"primaryKey");"id"!==b&&(a.id=a[b],delete a[b])},normalizeUsingDeclaredMapping:function(a,b){var c,d,f=e(this,"attrs");if(f)for(d in f)c=f[d],c&&c.key&&(c=c.key),"string"==typeof c&&(b[d]=b[c],delete b[c])},normalizeAttributes:function(a,b){var c;this.keyForAttribute&&a.eachAttribute(function(a){c=this.keyForAttribute(a),a!==c&&(b[a]=b[c],delete b[c])},this)},normalizeRelationships:function(a,b){var c;this.keyForRelationship&&a.eachRelationship(function(a,d){c=this.keyForRelationship(a,d.kind),a!==c&&(b[a]=b[c],delete b[c])},this)},extractSingle:function(a,b,d,e){d=this.normalizePayload(b,d);var g,h=b.typeKey;for(var i in d){var j=this.typeForRoot(i),k=a.modelFor(j),l=k.typeKey===h;l&&"array"!==Ember.typeOf(d[i])?g=this.normalize(b,d[i],i):f.call(d[i],function(b){var d=this.typeForRoot(i),f=a.modelFor(d),h=a.serializerFor(f);b=h.normalize(f,b,i);var j=l&&!e&&!g,k=l&&c(b.id)===e;j||k?g=b:a.push(d,b)},this)}return g},extractArray:function(a,b,c){c=this.normalizePayload(b,c);var d,e=b.typeKey;for(var f in c){var h=f,i=!1;"_"===f.charAt(0)&&(i=!0,h=f.substr(1));var j=this.typeForRoot(h),k=a.modelFor(j),l=a.serializerFor(k),m=!i&&k.typeKey===e,n=g.call(c[f],function(a){return l.normalize(k,a,f)},this);m?d=n:a.pushMany(j,n)}return d},pushPayload:function(a,b){b=this.normalizePayload(null,b);for(var c in b){var d=this.typeForRoot(c),e=a.modelFor(d),f=g.call(Ember.makeArray(b[c]),function(a){return this.normalize(e,a,c)},this);a.pushMany(d,f)}},typeForRoot:function(a){return Ember.String.singularize(a)},serialize:function(){return this._super.apply(this,arguments)},serializeIntoHash:function(a,b,c,d){var e=Ember.String.camelize(b.typeKey);a[e]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,f=e(a,d);d=this.keyForAttribute?this.keyForAttribute(d):d,b[d+"Type"]=Ember.String.camelize(f.constructor.typeKey)}});b["default"]=h}),b("ember-data/lib/system/adapter",["exports"],function(a){"use strict";var b=Ember.get,c=(Ember.set,Ember.ArrayPolyfills.map),d=["description","fileName","lineNumber","message","name","number","stack"],e=function(a){var b=Error.prototype.constructor.call(this,"The backend rejected the commit because it was invalid: "+Ember.inspect(a));this.errors=a;for(var c=0,e=d.length;e>c;c++)this[d[c]]=b[d[c]]};e.prototype=Ember.create(Error.prototype);var f=Ember.Object.extend({find:Ember.required(Function),findAll:null,findQuery:null,generateIdForRecord:null,serialize:function(a,c){return b(a,"store").serializerFor(a.constructor.typeKey).serialize(a,c)},createRecord:Ember.required(Function),updateRecord:Ember.required(Function),deleteRecord:Ember.required(Function),findMany:function(a,b,d){var e=c.call(d,function(c){return this.find(a,b,c)},this);return Ember.RSVP.all(e)}});a.InvalidError=e,a.Adapter=f,a["default"]=f}),b("ember-data/lib/system/changes",["./changes/attribute_change","./changes/relationship_change","exports"],function(a,b,c){"use strict";var d=a["default"],e=b.RelationshipChange,f=b.RelationshipChangeAdd,g=b.RelationshipChangeRemove,h=b.OneToManyChange,i=b.ManyToNoneChange,j=b.OneToOneChange,k=b.ManyToManyChange;c.AttributeChange=d,c.RelationshipChange=e,c.RelationshipChangeAdd=f,c.RelationshipChangeRemove=g,c.OneToManyChange=h,c.ManyToNoneChange=i,c.OneToOneChange=j,c.ManyToManyChange=k}),b("ember-data/lib/system/changes/attribute_change",["exports"],function(a){"use strict";function b(a){this.record=a.record,this.store=a.store,this.name=a.name,this.value=a.value,this.oldValue=a.oldValue}b.createChange=function(a){return new b(a)},b.prototype={sync:function(){this.value!==this.oldValue&&(this.record.send("becomeDirty"),this.record.updateRecordArraysLater()),this.destroy()},destroy:function(){delete this.record._changesToSync[this.name]}},a["default"]=b}),b("ember-data/lib/system/changes/relationship_change",["../model","exports"],function(a,b){"use strict";function c(a){return"object"==typeof a&&(!a.then||"function"!=typeof a.then)}var d=a.Model,e=Ember.get,f=Ember.set,g=Ember.EnumerableUtils.forEach,h=function(a){this.parentRecord=a.parentRecord,this.childRecord=a.childRecord,this.firstRecord=a.firstRecord,this.firstRecordKind=a.firstRecordKind,this.firstRecordName=a.firstRecordName,this.secondRecord=a.secondRecord,this.secondRecordKind=a.secondRecordKind,this.secondRecordName=a.secondRecordName,this.changeType=a.changeType,this.store=a.store,this.committed={}},i=function(a){h.call(this,a)},j=function(a){h.call(this,a)};h.create=function(a){return new h(a)},i.create=function(a){return new i(a)},j.create=function(a){return new j(a)};var k={},l={},m={},n={},o={};h._createChange=function(a){return"add"===a.changeType?i.create(a):"remove"===a.changeType?j.create(a):void 0},h.determineRelationshipType=function(a,b){var c,d,e=b.key,f=b.kind,g=a.inverseFor(e);return g&&(c=g.name,d=g.kind),g?"belongsTo"===d?"belongsTo"===f?"oneToOne":"manyToOne":"belongsTo"===f?"oneToMany":"manyToMany":"belongsTo"===f?"oneToNone":"manyToNone"},h.createChange=function(a,b,c,d){var e,f=a.constructor;return e=h.determineRelationshipType(f,d),"oneToMany"===e?k.createChange(a,b,c,d):"manyToOne"===e?k.createChange(b,a,c,d):"oneToNone"===e?l.createChange(a,b,c,d):"manyToNone"===e?m.createChange(a,b,c,d):"oneToOne"===e?n.createChange(a,b,c,d):"manyToMany"===e?o.createChange(a,b,c,d):void 0},l.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,store:c,changeType:d.changeType,firstRecordName:e,firstRecordKind:"belongsTo"});return c.addRelationshipChangeFor(a,e,b,null,f),f},m.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:a,childRecord:b,secondRecord:a,store:c,changeType:d.changeType,secondRecordName:d.key,secondRecordKind:"hasMany"});return c.addRelationshipChangeFor(a,e,b,null,f),f},o.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"hasMany",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.createChange=function(a,b,c,d){var e;d.parentType?e=d.parentType.inverseFor(d.key).name:d.key&&(e=d.key);var f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"belongsTo",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&b.recordIsMaterialized(c)){var f=e(c,d);if(f){var g=n.createChange(c,f,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,null,g),g.sync()}}},k.createChange=function(a,b,c,d){var e;d.parentType?(e=d.parentType.inverseFor(d.key).name,k.maintainInvariant(d,c,a,e)):d.key&&(e=d.key);var f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,f.getSecondRecordName(),f),f},k.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&c){var f=e(c,d);if(f){var g=k.createChange(c,f,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,g.getSecondRecordName(),g),g.sync()}}},h.prototype={getSecondRecordName:function(){var a,b=this.secondRecordName;if(!b){if(a=this.secondRecord,!a)return;var c=this.firstRecord.constructor,d=c.inverseFor(this.firstRecordName);this.secondRecordName=d.name}return this.secondRecordName},getFirstRecordName:function(){var a=this.firstRecordName;return a},destroy:function(){var a=this.childRecord,b=this.getFirstRecordName(),c=this.getSecondRecordName(),d=this.store;d.removeRelationshipChangeFor(a,b,this.parentRecord,c,this.changeType)},getSecondRecord:function(){return this.secondRecord},getFirstRecord:function(){return this.firstRecord},coalesce:function(){var a=this.store.relationshipChangePairsFor(this.firstRecord);g(a,function(a){var b=a.add,c=a.remove;b&&c&&(b.destroy(),c.destroy())})}},i.prototype=Ember.create(h.create({})),j.prototype=Ember.create(h.create({})),i.prototype.changeType="add",i.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),g=this.getFirstRecord(),h=this.getSecondRecord();h instanceof d&&g instanceof d&&("belongsTo"===this.secondRecordKind?h.suspendRelationshipObservers(function(){f(h,a,g)}):"hasMany"===this.secondRecordKind&&h.suspendRelationshipObservers(function(){var b=e(h,a);c(b)&&b.addObject(g)})),g instanceof d&&h instanceof d&&e(g,b)!==h&&("belongsTo"===this.firstRecordKind?g.suspendRelationshipObservers(function(){f(g,b,h)}):"hasMany"===this.firstRecordKind&&g.suspendRelationshipObservers(function(){var a=e(g,b);c(a)&&a.addObject(h)})),this.coalesce()},j.prototype.changeType="remove",j.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),g=this.getFirstRecord(),h=this.getSecondRecord();h instanceof d&&g instanceof d&&("belongsTo"===this.secondRecordKind?h.suspendRelationshipObservers(function(){f(h,a,null)}):"hasMany"===this.secondRecordKind&&h.suspendRelationshipObservers(function(){var b=e(h,a);c(b)&&b.removeObject(g)})),g instanceof d&&e(g,b)&&("belongsTo"===this.firstRecordKind?g.suspendRelationshipObservers(function(){f(g,b,null)}):"hasMany"===this.firstRecordKind&&g.suspendRelationshipObservers(function(){var a=e(g,b);c(a)&&a.removeObject(h)})),this.coalesce()},b.RelationshipChange=h,b.RelationshipChangeAdd=i,b.RelationshipChangeRemove=j,b.OneToManyChange=k,b.ManyToNoneChange=m,b.OneToOneChange=n,b.ManyToManyChange=o}),b("ember-data/lib/system/container_proxy",["exports"],function(a){"use strict";var b=function(a){this.container=a};b.prototype.aliasedFactory=function(a,b){var c=this;return{create:function(){return b&&b(),c.container.lookup(a)}}},b.prototype.registerAlias=function(a,b,c){var d=this.aliasedFactory(b,c);return this.container.register(a,d)},b.prototype.registerDeprecation=function(a,b){var c=function(){};return this.registerAlias(a,b,c)},b.prototype.registerDeprecations=function(a){for(var b=a.length;b>0;b--){var c=a[b-1],d=c.deprecated,e=c.valid;this.registerDeprecation(d,e)}},a["default"]=b}),b("ember-data/lib/system/debug",["./debug/debug_info","./debug/debug_adapter","exports"],function(a,b,c){"use strict";var d=b["default"];c["default"]=d}),b("ember-data/lib/system/debug/debug_adapter",["../model","exports"],function(a,b){"use strict";var c=a.Model,d=Ember.get,e=Ember.String.capitalize,f=Ember.String.underscore,g=Ember.DataAdapter.extend({getFilters:function(){return[{name:"isNew",desc:"New"},{name:"isModified",desc:"Modified"},{name:"isClean",desc:"Clean"}]},detect:function(a){return a!==c&&c.detect(a)},columnsForType:function(a){var b=[{name:"id",desc:"Id"}],c=0,g=this;return d(a,"attributes").forEach(function(a){if(c++>g.attributeLimit)return!1;var d=e(f(a).replace("_"," "));b.push({name:a,desc:d})}),b},getRecords:function(a){return this.get("store").all(a)},getRecordColumnValues:function(a){var b=this,c=0,e={id:d(a,"id")};return a.eachAttribute(function(f){if(c++>b.attributeLimit)return!1;var g=d(a,f);e[f]=g}),e},getRecordKeywords:function(a){var b=[],c=Ember.A(["id"]);return a.eachAttribute(function(a){c.push(a)}),c.forEach(function(c){b.push(d(a,c))}),b},getRecordFilterValues:function(a){return{isNew:a.get("isNew"),isModified:a.get("isDirty")&&!a.get("isNew"),isClean:!a.get("isDirty")}},getRecordColor:function(a){var b="black";return a.get("isNew")?b="green":a.get("isDirty")&&(b="blue"),b},observeRecord:function(a,b){var c=Ember.A(),d=this,e=Ember.A(["id","isNew","isDirty"]);a.eachAttribute(function(a){e.push(a)}),e.forEach(function(e){var f=function(){b(d.wrapRecord(a))};Ember.addObserver(a,e,f),c.push(function(){Ember.removeObserver(a,e,f)})});var f=function(){c.forEach(function(a){a()})};return f}});b["default"]=g}),b("ember-data/lib/system/debug/debug_info",["../model","exports"],function(a,b){"use strict";var c=a.Model;c.reopen({_debugInfo:function(){var a=["id"],b={belongsTo:[],hasMany:[]},c=[];this.eachAttribute(function(b){a.push(b)},this),this.eachRelationship(function(a,d){b[d.kind].push(a),c.push(a)});var d=[{name:"Attributes",properties:a,expand:!0},{name:"Belongs To",properties:b.belongsTo,expand:!0},{name:"Has Many",properties:b.hasMany,expand:!0},{name:"Flags",properties:["isLoaded","isDirty","isSaving","isDeleted","isError","isNew","isValid"]}];return{propertyInfo:{includeOtherProperties:!0,groups:d,expensiveProperties:c}}}}),b["default"]=c}),b("ember-data/lib/system/model",["./model/model","./model/attributes","./model/states","./model/errors","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.Model=f,e.RootState=h,e.attr=g,e.Errors=i}),b("ember-data/lib/system/model/attributes",["./model","exports"],function(a,b){"use strict";function c(a,b){return"function"==typeof b.defaultValue?b.defaultValue.apply(null,arguments):b.defaultValue}function d(a,b){return a._attributes.hasOwnProperty(b)||a._inFlightAttributes.hasOwnProperty(b)||a._data.hasOwnProperty(b)}function e(a,b){return a._attributes.hasOwnProperty(b)?a._attributes[b]:a._inFlightAttributes.hasOwnProperty(b)?a._inFlightAttributes[b]:a._data[b]}function f(a,b){b=b||{};var f={type:a,isAttribute:!0,options:b};return Ember.computed("data",function(a,f){if(arguments.length>1){var g=e(this,a);return f!==g&&(this._attributes[a]=f,this.send("didSetProperty",{name:a,oldValue:g,originalValue:this._data[a],value:f})),f}return d(this,a)?e(this,a):c(this,b,a)}).meta(f)}var g=a["default"],h=Ember.get;g.reopenClass({attributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isAttribute&&(c.name=b,a.set(b,c))}),a}),transformedAttributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachAttribute(function(b,c){c.type&&a.set(b,c.type)}),a}),eachAttribute:function(a,b){h(this,"attributes").forEach(function(c,d){a.call(b,c,d)},b)},eachTransformedAttribute:function(a,b){h(this,"transformedAttributes").forEach(function(c,d){a.call(b,c,d)})}}),g.reopen({eachAttribute:function(a,b){this.constructor.eachAttribute(a,b)}}),b["default"]=f
|
9
|
-
}),b("ember-data/lib/system/model/errors",["exports"],function(a){"use strict";var b=Ember.get,c=Ember.isEmpty,d=Ember.Object.extend(Ember.Enumerable,Ember.Evented,{registerHandlers:function(a,b,c){this.on("becameInvalid",a,b),this.on("becameValid",a,c)},errorsByAttributeName:Ember.reduceComputed("content",{initialValue:function(){return Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}})},addedItem:function(a,b){return a.get(b.attribute).pushObject(b),a},removedItem:function(a,b){return a.get(b.attribute).removeObject(b),a}}),errorsFor:function(a){return b(this,"errorsByAttributeName").get(a)},messages:Ember.computed.mapBy("content","message"),content:Ember.computed(function(){return Ember.A()}),unknownProperty:function(a){var b=this.errorsFor(a);return c(b)?null:b},nextObject:function(a){return b(this,"content").objectAt(a)},length:Ember.computed.oneWay("content.length").readOnly(),isEmpty:Ember.computed.not("length").readOnly(),add:function(a,c){var d=b(this,"isEmpty");c=this._findOrCreateMessages(a,c),b(this,"content").addObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),d&&!b(this,"isEmpty")&&this.trigger("becameInvalid")},_findOrCreateMessages:function(a,b){var c=this.errorsFor(a);return Ember.makeArray(b).map(function(b){return c.findBy("message",b)||{attribute:a,message:b}})},remove:function(a){if(!b(this,"isEmpty")){var c=b(this,"content").rejectBy("attribute",a);b(this,"content").setObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),b(this,"isEmpty")&&this.trigger("becameValid")}},clear:function(){b(this,"isEmpty")||(b(this,"content").clear(),this.enumerableContentDidChange(),this.trigger("becameValid"))},has:function(a){return!c(this.errorsFor(a))}});a["default"]=d}),b("ember-data/lib/system/model/model",["./states","./errors","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"],f=Ember.get,g=Ember.set,h=Ember.merge,i=Ember.RSVP.Promise,j=Ember.computed("currentState",function(a){return f(f(this,"currentState"),a)}).readOnly(),k=Ember.Object.extend(Ember.Evented,{_recordArrays:void 0,_relationships:void 0,_loadingRecordArrays:void 0,isEmpty:j,isLoading:j,isLoaded:j,isDirty:j,isSaving:j,isDeleted:j,isNew:j,isValid:j,dirtyType:j,isError:!1,isReloading:!1,clientId:null,id:null,currentState:d.empty,errors:Ember.computed(function(){var a=e.create();return a.registerHandlers(this,function(){this.send("becameInvalid")},function(){this.send("becameValid")}),a}).readOnly(),serialize:function(a){var b=f(this,"store");return b.serialize(this,a)},toJSON:function(a){var b=DS.JSONSerializer.create({container:this.container});return b.serialize(this,a)},didLoad:Ember.K,didUpdate:Ember.K,didCreate:Ember.K,didDelete:Ember.K,becameInvalid:Ember.K,becameError:Ember.K,data:Ember.computed(function(){return this._data=this._data||{},this._data}).readOnly(),_data:null,init:function(){this._super(),this._setup()},_setup:function(){this._changesToSync={},this._deferredTriggers=[],this._data={},this._attributes={},this._inFlightAttributes={},this._relationships={}},send:function(a,b){var c=f(this,"currentState");return c[a]||this._unhandledEvent(c,a,b),c[a](this,b)},transitionTo:function(a){var b=a.split(".",1),c=f(this,"currentState"),d=c;do d.exit&&d.exit(this),d=d.parentState;while(!d.hasOwnProperty(b));var e,h,i=a.split("."),j=[],k=[];for(e=0,h=i.length;h>e;e++)d=d[i[e]],d.enter&&k.push(d),d.setup&&j.push(d);for(e=0,h=k.length;h>e;e++)k[e].enter(this);for(g(this,"currentState",d),e=0,h=j.length;h>e;e++)j[e].setup(this);this.updateRecordArraysLater()},_unhandledEvent:function(a,b,c){var d="Attempted to handle event `"+b+"` ";throw d+="on "+String(this)+" while in state ",d+=a.stateName+". ",void 0!==c&&(d+="Called with "+Ember.inspect(c)+"."),new Ember.Error(d)},withTransaction:function(a){var b=f(this,"transaction");b&&a(b)},loadingData:function(a){this.send("loadingData",a)},loadedData:function(){this.send("loadedData")},notFound:function(){this.send("notFound")},pushedData:function(){this.send("pushedData")},deleteRecord:function(){this.send("deleteRecord")},destroyRecord:function(){return this.deleteRecord(),this.save()},unloadRecord:function(){this.isDestroyed||this.send("unloadRecord")},clearRelationships:function(){this.eachRelationship(function(a,b){if("belongsTo"===b.kind)g(this,a,null);else if("hasMany"===b.kind){var c=this._relationships[a];c&&c.destroy()}},this)},updateRecordArrays:function(){this._updatingRecordArraysLater=!1,f(this,"store").dataWasUpdated(this.constructor,this)},changedAttributes:function(){var a,b=f(this,"_data"),c=f(this,"_attributes"),d={};for(a in c)d[a]=[b[a],c[a]];return d},adapterWillCommit:function(){this.send("willCommit")},adapterDidCommit:function(a){g(this,"isError",!1),a?this._data=a:Ember.mixin(this._data,this._inFlightAttributes),this._inFlightAttributes={},this.send("didCommit"),this.updateRecordArraysLater(),a&&this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},adapterDidDirty:function(){this.send("becomeDirty"),this.updateRecordArraysLater()},dataDidChange:Ember.observer(function(){this.reloadHasManys()},"data"),reloadHasManys:function(){var a=f(this.constructor,"relationshipsByName");this.updateRecordArraysLater(),a.forEach(function(a,b){this._data.links&&this._data.links[a]||"hasMany"===b.kind&&this.hasManyDidChange(b.key)},this)},hasManyDidChange:function(a){var b=this._relationships[a];if(b){var c=this._data[a]||[];g(b,"content",Ember.A(c)),g(b,"isLoaded",!0),b.trigger("didLoad")}},updateRecordArraysLater:function(){this._updatingRecordArraysLater||(this._updatingRecordArraysLater=!0,Ember.run.schedule("actions",this,this.updateRecordArrays))},setupData:function(a,b){b?Ember.merge(this._data,a):this._data=a;var c=this._relationships;this.eachRelationship(function(b,d){a.links&&a.links[b]||d.options.async&&(c[b]=null)}),a&&this.pushedData(),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},materializeId:function(a){g(this,"id",a)},materializeAttributes:function(a){h(this._data,a)},materializeAttribute:function(a,b){this._data[a]=b},updateHasMany:function(a,b){this._data[a]=b,this.hasManyDidChange(a)},updateBelongsTo:function(a,b){this._data[a]=b},rollback:function(){this._attributes={},f(this,"isError")&&(this._inFlightAttributes={},g(this,"isError",!1)),f(this,"isValid")||(this._inFlightAttributes={}),this.send("rolledBack"),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},toStringExtension:function(){return f(this,"id")},suspendRelationshipObservers:function(a,b){var c=f(this.constructor,"relationshipNames").belongsTo,d=this;try{this._suspendedRelationships=!0,Ember._suspendObservers(d,c,null,"belongsToDidChange",function(){Ember._suspendBeforeObservers(d,c,null,"belongsToWillChange",function(){a.call(b||d)})})}finally{this._suspendedRelationships=!1}},save:function(){var a="DS: Model#save "+this,b=Ember.RSVP.defer(a);return this.get("store").scheduleSave(this,b),this._inFlightAttributes=this._attributes,this._attributes={},DS.PromiseObject.create({promise:b.promise})},reload:function(){g(this,"isReloading",!0);var a=this,b="DS: Model#reload of "+this,c=new i(function(b){a.send("reloadRecord",b)},b).then(function(){return a.set("isReloading",!1),a.set("isError",!1),a},function(b){throw a.set("isError",!0),b},"DS: Model#reload complete, update flags");return DS.PromiseObject.create({promise:c})},adapterDidUpdateAttribute:function(a,b){void 0!==b?(this._data[a]=b,this.notifyPropertyChange(a)):this._data[a]=this._inFlightAttributes[a],this.updateRecordArraysLater()},adapterDidInvalidate:function(a){function b(b){a[b]&&c.add(b,a[b])}var c=f(this,"errors");this.eachAttribute(b),this.eachRelationship(b)},adapterDidError:function(){this.send("becameError"),g(this,"isError",!0)},trigger:function(a){Ember.tryInvoke(this,a,[].slice.call(arguments,1)),this._super.apply(this,arguments)},triggerLater:function(){1===this._deferredTriggers.push(arguments)&&Ember.run.schedule("actions",this,"_triggerDeferredTriggers")},_triggerDeferredTriggers:function(){for(var a=0,b=this._deferredTriggers.length;b>a;a++)this.trigger.apply(this,this._deferredTriggers[a]);this._deferredTriggers.length=0},willDestroy:function(){this._super(),this.clearRelationships()}});k.reopenClass({_create:k.create,create:function(){throw new Ember.Error("You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.")}}),c["default"]=k}),b("ember-data/lib/system/model/states",["exports"],function(a){"use strict";function b(a,b){b.value===b.originalValue?(delete a._attributes[b.name],a.send("propertyWasReset",b.name)):b.value!==b.oldValue&&a.send("becomeDirty"),a.updateRecordArraysLater()}function c(a){var b,d={};for(var e in a)b=a[e],d[e]=b&&"object"==typeof b?c(b):b;return d}function d(a,b){for(var c in b)a[c]=b[c];return a}function e(a){var b=c(j);return d(b,a)}function f(){}function g(a,b,c){a=d(b?Ember.create(b):{},a),a.parentState=b,a.stateName=c;for(var e in a)a.hasOwnProperty(e)&&"parentState"!==e&&"stateName"!==e&&"object"==typeof a[e]&&(a[e]=g(a[e],a,c+"."+e));return a}var h=Ember.get,i=Ember.set,j={initialState:"uncommitted",isDirty:!0,uncommitted:{didSetProperty:b,propertyWasReset:function(a){var b=!1;for(var c in a._attributes){b=!0;break}b||a.send("rolledBack")},pushedData:Ember.K,becomeDirty:Ember.K,willCommit:function(a){a.transitionTo("inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},rolledBack:function(a){a.transitionTo("loaded.saved")},becameInvalid:function(a){a.transitionTo("invalid")},rollback:function(a){a.rollback()}},inFlight:{isSaving:!0,didSetProperty:b,becomeDirty:Ember.K,pushedData:Ember.K,unloadRecord:function(){},willCommit:Ember.K,didCommit:function(a){var b=h(this,"dirtyType");a.transitionTo("saved"),a.send("invokeLifecycleCallbacks",b)},becameInvalid:function(a){a.transitionTo("invalid"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},invalid:{isValid:!1,deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},didSetProperty:function(a,c){h(a,"errors").remove(c.name),b(a,c)},becomeDirty:Ember.K,rolledBack:function(a){h(a,"errors").clear()},becameValid:function(a){a.transitionTo("uncommitted")},invokeLifecycleCallbacks:function(a){a.triggerLater("becameInvalid",a)}}},k=e({dirtyType:"created",isNew:!0});k.uncommitted.rolledBack=function(a){a.transitionTo("deleted.saved")};var l=e({dirtyType:"updated"});k.uncommitted.deleteRecord=function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},k.uncommitted.rollback=function(a){j.uncommitted.rollback.apply(this,arguments),a.transitionTo("deleted.saved")},k.uncommitted.propertyWasReset=Ember.K,l.inFlight.unloadRecord=f,l.uncommitted.deleteRecord=function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()};var m={isEmpty:!1,isLoading:!1,isLoaded:!1,isDirty:!1,isSaving:!1,isDeleted:!1,isNew:!1,isValid:!0,rolledBack:Ember.K,unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},propertyWasReset:Ember.K,empty:{isEmpty:!0,loadingData:function(a,b){a._loadingPromise=b,a.transitionTo("loading")},loadedData:function(a){a.transitionTo("loaded.created.uncommitted"),a.suspendRelationshipObservers(function(){a.notifyPropertyChange("data")})},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad")}},loading:{isLoading:!0,exit:function(a){a._loadingPromise=null},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad"),i(a,"isError",!1)},becameError:function(a){a.triggerLater("becameError",a)},notFound:function(a){a.transitionTo("empty")}},loaded:{initialState:"saved",isLoaded:!0,saved:{setup:function(a){var b=a._attributes,c=!1;for(var d in b)if(b.hasOwnProperty(d)){c=!0;break}c&&a.adapterDidDirty()},didSetProperty:b,pushedData:Ember.K,becomeDirty:function(a){a.transitionTo("updated.uncommitted")},willCommit:function(a){a.transitionTo("updated.inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},didCommit:function(a){a.send("invokeLifecycleCallbacks",h(a,"lastDirtyType"))},notFound:Ember.K},created:k,updated:l},deleted:{initialState:"uncommitted",dirtyType:"deleted",isDeleted:!0,isLoaded:!0,isDirty:!0,setup:function(a){a.updateRecordArrays()},uncommitted:{willCommit:function(a){a.transitionTo("inFlight")},rollback:function(a){a.rollback()},becomeDirty:Ember.K,deleteRecord:Ember.K,rolledBack:function(a){a.transitionTo("loaded.saved")}},inFlight:{isSaving:!0,unloadRecord:f,willCommit:Ember.K,didCommit:function(a){a.transitionTo("saved"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},saved:{isDirty:!1,setup:function(a){var b=h(a,"store");b.dematerializeRecord(a)},invokeLifecycleCallbacks:function(a){a.triggerLater("didDelete",a),a.triggerLater("didCommit",a)}}},invokeLifecycleCallbacks:function(a,b){"created"===b?a.triggerLater("didCreate",a):a.triggerLater("didUpdate",a),a.triggerLater("didCommit",a)}};m=g(m,null,"root"),a["default"]=m}),b("ember-data/lib/system/record_array_manager",["./record_arrays","exports"],function(a,b){"use strict";function c(a){for(var b=[],c=Ember.keys(a),d=0;d<c.length;d++)b.push(a[c[d]]);return b}function d(a){a.destroy()}function e(a){for(var b=a.length,c=Ember.A(),d=0;b>d;d++)c=c.concat(a[d]);return c}var f=a.ManyArray,g=Ember.get,h=(Ember.set,Ember.EnumerableUtils.forEach),i=Ember.Object.extend({init:function(){this.filteredRecordArrays=Ember.MapWithDefault.create({defaultValue:function(){return[]}}),this.changedRecords=[],this._adapterPopulatedRecordArrays=[]},recordDidChange:function(a){1===this.changedRecords.push(a)&&Ember.run.schedule("actions",this,this.updateRecordArrays)},recordArraysForRecord:function(a){return a._recordArrays=a._recordArrays||Ember.OrderedSet.create(),a._recordArrays},updateRecordArrays:function(){h(this.changedRecords,function(a){g(a,"isDeleted")?this._recordWasDeleted(a):this._recordWasChanged(a)},this),this.changedRecords.length=0},_recordWasDeleted:function(a){var b=a._recordArrays;b&&h(b,function(b){b.removeRecord(a)})},_recordWasChanged:function(a){var b,c=a.constructor,d=this.filteredRecordArrays.get(c);h(d,function(d){b=g(d,"filterFunction"),this.updateRecordArray(d,b,c,a)},this);var e=a._loadingRecordArrays;if(e){for(var f=0,i=e.length;i>f;f++)e[f].loadedRecord();a._loadingRecordArrays=[]}},updateRecordArray:function(a,b,c,d){var e;e=b?b(d):!0;var f=this.recordArraysForRecord(d);e?(f.add(a),a.addRecord(d)):e||(f.remove(a),a.removeRecord(d))},updateFilter:function(a,b,c){for(var d,e=this.store.typeMapFor(b),f=e.records,h=0,i=f.length;i>h;h++)d=f[h],g(d,"isDeleted")||g(d,"isEmpty")||this.updateRecordArray(a,c,b,d)},createManyArray:function(a,b){var c=f.create({type:a,content:b,store:this.store});return h(b,function(a){var b=this.recordArraysForRecord(a);b.add(c)},this),c},createRecordArray:function(a){var b=DS.RecordArray.create({type:a,content:Ember.A(),store:this.store,isLoaded:!0});return this.registerFilteredRecordArray(b,a),b},createFilteredRecordArray:function(a,b){var c=DS.FilteredRecordArray.create({type:a,content:Ember.A(),store:this.store,manager:this,filterFunction:b});return this.registerFilteredRecordArray(c,a,b),c},createAdapterPopulatedRecordArray:function(a,b){var c=DS.AdapterPopulatedRecordArray.create({type:a,query:b,content:Ember.A(),store:this.store});return this._adapterPopulatedRecordArrays.push(c),c},registerFilteredRecordArray:function(a,b,c){var d=this.filteredRecordArrays.get(b);d.push(a),this.updateFilter(a,b,c)},registerWaitingRecordArray:function(a,b){var c=a._loadingRecordArrays||[];c.push(b),a._loadingRecordArrays=c},willDestroy:function(){this._super(),e(c(this.filteredRecordArrays.values)).forEach(d),this._adapterPopulatedRecordArrays.forEach(d)}});b["default"]=i}),b("ember-data/lib/system/record_arrays",["./record_arrays/record_array","./record_arrays/filtered_record_array","./record_arrays/adapter_populated_record_array","./record_arrays/many_array","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.RecordArray=f,e.FilteredRecordArray=g,e.AdapterPopulatedRecordArray=h,e.ManyArray=i}),b("ember-data/lib/system/record_arrays/adapter_populated_record_array",["./record_array","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=(Ember.set,c.extend({query:null,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a server query (on "+a+") is immutable.")},load:function(a){var b=d(this,"store"),c=d(this,"type"),e=b.pushMany(c,a),f=b.metadataFor(c);this.setProperties({content:Ember.A(e),isLoaded:!0,meta:f}),Ember.run.once(this,"trigger","didLoad")}}));b["default"]=e}),b("ember-data/lib/system/record_arrays/filtered_record_array",["./record_array","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=c.extend({filterFunction:null,isLoaded:!0,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a client-side filter (on "+a+") is immutable.")},updateFilter:Ember.observer(function(){var a=d(this,"manager");a.updateFilter(this,d(this,"type"),d(this,"filterFunction"))},"filterFunction")});b["default"]=e}),b("ember-data/lib/system/record_arrays/many_array",["./record_array","../changes","exports"],function(a,b,c){"use strict";function d(a){a.sync()}var e=a["default"],f=b.RelationshipChange,g=Ember.get,h=Ember.set,i=Ember.EnumerableUtils.map,j=e.extend({init:function(){this._super.apply(this,arguments),this._changesToSync=Ember.OrderedSet.create()},name:null,owner:null,isPolymorphic:!1,isLoaded:!1,promise:null,loadingRecordsCount:function(a){this.loadingRecordsCount=a},loadedRecord:function(){this.loadingRecordsCount--,0===this.loadingRecordsCount&&(h(this,"isLoaded",!0),this.trigger("didLoad"))},fetch:function(){var a=g(this,"content"),b=g(this,"store"),c=g(this,"owner"),d=Ember.RSVP.defer("DS: ManyArray#fetch "+g(this,"type")),e=a.filterProperty("isEmpty",!0);b.fetchMany(e,c,d)},replaceContent:function(a,b,c){c=i(c,function(a){return a},this),this._super(a,b,c)},arrangedContentDidChange:function(){Ember.run.once(this,"fetch")},arrayContentWillChange:function(a,b){var c=g(this,"owner"),d=g(this,"name");if(!c._suspendedRelationships)for(var e=a;a+b>e;e++){var h=g(this,"content").objectAt(e),i=f.createChange(c,h,g(this,"store"),{parentType:c.constructor,changeType:"remove",kind:"hasMany",key:d});this._changesToSync.add(i)}return this._super.apply(this,arguments)},arrayContentDidChange:function(a,b,c){this._super.apply(this,arguments);var e=g(this,"owner"),h=g(this,"name"),i=g(this,"store");if(!e._suspendedRelationships){for(var j=a;a+c>j;j++){var k=g(this,"content").objectAt(j),l=f.createChange(e,k,i,{parentType:e.constructor,changeType:"add",kind:"hasMany",key:h});l.hasManyName=h,this._changesToSync.add(l)}this._changesToSync.forEach(d),this._changesToSync.clear()}},createRecord:function(a){var b,c=g(this,"owner"),d=g(c,"store"),e=g(this,"type");return b=d.createRecord.call(d,e,a),this.pushObject(b),b}});c["default"]=j}),b("ember-data/lib/system/record_arrays/record_array",["../store","exports"],function(a,b){"use strict";var c=a.PromiseArray,d=Ember.get,e=(Ember.set,Ember.ArrayProxy.extend(Ember.Evented,{type:null,content:null,isLoaded:!1,isUpdating:!1,store:null,objectAtContent:function(a){var b=d(this,"content");return b.objectAt(a)},update:function(){if(!d(this,"isUpdating")){var a=d(this,"store"),b=d(this,"type");return a.fetchAll(b,this)}},addRecord:function(a){d(this,"content").addObject(a)},removeRecord:function(a){d(this,"content").removeObject(a)},save:function(){var a="DS: RecordArray#save "+d(this,"type"),b=Ember.RSVP.all(this.invoke("save"),a).then(function(a){return Ember.A(a)},null,"DS: RecordArray#save apply Ember.NativeArray");return c.create({promise:b})},_dissociateFromOwnRecords:function(){var a=this;this.forEach(function(b){var c=b._recordArrays;c&&c.remove(a)})},willDestroy:function(){this._dissociateFromOwnRecords(),this._super()}}));b["default"]=e}),b("ember-data/lib/system/relationships",["./relationships/belongs_to","./relationships/has_many","../system/relationships/ext","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"];d.belongsTo=e,d.hasMany=f}),b("ember-data/lib/system/relationships/belongs_to",["../model","exports"],function(a,b){"use strict";function c(a,b,c){return Ember.computed("data",function(a,b){var d,h=e(this,"data"),i=e(this,"store"),j="DS: Async belongsTo "+this+" : "+a;if(2===arguments.length)return void 0===b?null:DS.PromiseObject.create({promise:g.cast(b,j)});var k=h.links&&h.links[a],l=h[a];return f(l)?k?(d=i.findBelongsTo(this,k,c),DS.PromiseObject.create({promise:d})):null:(d=i.fetchRecord(l)||g.cast(l,j),DS.PromiseObject.create({promise:d}))}).meta(c)}function d(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var d={type:a,isRelationship:!0,options:b,kind:"belongsTo"};return b.async?c(a,b,d):Ember.computed("data",function(b,c){var d,g,h=e(this,"data"),i=e(this,"store");return g="string"==typeof a?i.modelFor(a):a,2===arguments.length?void 0===c?null:c:(d=h[b],f(d)?null:(i.fetchRecord(d),d))}).meta(d)}var e=Ember.get,f=(Ember.set,Ember.isNone),g=Ember.RSVP.Promise,h=a.Model;h.reopen({belongsToWillChange:Ember.beforeObserver(function(a,b){if(e(a,"isLoaded")){var c=e(a,b);if(c){var d=e(a,"store"),f=DS.RelationshipChange.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"remove"});f.sync(),this._changesToSync[b]=f}}}),belongsToDidChange:Ember.immediateObserver(function(a,b){if(e(a,"isLoaded")){var c=e(a,b);if(c){var d=e(a,"store"),f=DS.RelationshipChange.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"add"});f.sync()}}delete this._changesToSync[b]})}),b["default"]=d}),b("ember-data/lib/system/relationships/ext",["../../../../ember-inflector/lib/system","../model"],function(a,b){"use strict";{var c=a.singularize,d=b.Model,e=Ember.get;Ember.set}d.reopen({didDefineProperty:function(a,b,c){if(c instanceof Ember.Descriptor){var d=c.meta();d.isRelationship&&"belongsTo"===d.kind&&(Ember.addObserver(a,b,null,"belongsToDidChange"),Ember.addBeforeObserver(a,b,null,"belongsToWillChange")),d.parentType=a.constructor}}}),d.reopenClass({typeForRelationship:function(a){var b=e(this,"relationshipsByName").get(a);return b&&b.type},inverseFor:function(a){function b(a,c,d){d=d||[];var f=e(c,"relationships");if(f){var g=f.get(a);return g&&d.push.apply(d,f.get(a)),a.superclass&&b(a.superclass,c,d),d}}var c=this.typeForRelationship(a);if(!c)return null;var d=this.metaForProperty(a).options;if(null===d.inverse)return null;var f,g;if(d.inverse)f=d.inverse,g=Ember.get(c,"relationshipsByName").get(f).kind;else{var h=b(this,c);if(0===h.length)return null;f=h[0].name,g=h[0].kind}return{type:c,name:f,kind:g}},relationships:Ember.computed(function(){var a=new Ember.MapWithDefault({defaultValue:function(){return[]}});return this.eachComputedProperty(function(b,c){if(c.isRelationship){"string"==typeof c.type&&(c.type=this.store.modelFor(c.type));var d=a.get(c.type);d.push({name:b,kind:c.kind})}}),a}),relationshipNames:Ember.computed(function(){var a={hasMany:[],belongsTo:[]};return this.eachComputedProperty(function(b,c){c.isRelationship&&a[c.kind].push(b)}),a}),relatedTypes:Ember.computed(function(){var a,b=Ember.A();return this.eachComputedProperty(function(c,d){d.isRelationship&&(a=d.type,"string"==typeof a&&(a=e(this,a,!1)||this.store.modelFor(a)),b.contains(a)||b.push(a))}),b}),relationshipsByName:Ember.computed(function(){var a,b=Ember.Map.create();return this.eachComputedProperty(function(d,e){e.isRelationship&&(e.key=d,a=e.type,a||"hasMany"!==e.kind?a||(a=d):a=c(d),"string"==typeof a&&(e.type=this.store.modelFor(a)),b.set(d,e))}),b}),fields:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isRelationship?a.set(b,c.kind):c.isAttribute&&a.set(b,"attribute")}),a}),eachRelationship:function(a,b){e(this,"relationshipsByName").forEach(function(c,d){a.call(b,c,d)})},eachRelatedType:function(a,b){e(this,"relatedTypes").forEach(function(c){a.call(b,c)})}}),d.reopen({eachRelationship:function(a,b){this.constructor.eachRelationship(a,b)}})}),b("ember-data/lib/system/relationships/has_many",["exports"],function(a){"use strict";function b(a,b,d){return Ember.computed("data",function(a){var e=this._relationships[a],f="DS: Async hasMany "+this+" : "+a;if(!e){var h=Ember.RSVP.defer(f);e=c(this,a,b,function(b,c){var e,f=c.links&&c.links[a];return e=f?b.findHasMany(this,f,d,h):b.findMany(this,c[a],d.type,h),g(e,"promise",h.promise),e})}var i=e.get("promise").then(function(){return e},null,"DS: Async hasMany records received");return DS.PromiseArray.create({promise:i})}).meta(d).readOnly()}function c(a,b,c,d){var e=a._relationships;if(e[b])return e[b];var g=f(a,"data"),i=f(a,"store"),j=e[b]=d.call(a,i,g);return h(j,{owner:a,name:b,isPolymorphic:c.polymorphic})}function d(a,d){d=d||{};var e={type:a,isRelationship:!0,options:d,kind:"hasMany"};return d.async?b(a,d,e):Ember.computed("data",function(a){return c(this,a,d,function(b,c){c[a];return b.findMany(this,c[a],e.type)})}).meta(e).readOnly()}function e(a,b){return"object"==typeof a&&(b=a,a=void 0),d(a,b)}var f=Ember.get,g=Ember.set,h=Ember.setProperties;a["default"]=e}),b("ember-data/lib/system/store",["exports"],function(a){"use strict";function b(a){return null==a?null:a+""}function c(a,b,c,e){return b.eachRelationship(function(b,h){if(c.links&&c.links[b])return void(e&&h.options.async&&(e._relationships[b]=null));var i=h.kind,j=c[b];null!=j&&("belongsTo"===i?d(a,c,b,h,j):"hasMany"===i&&(f(a,c,b,h,j),g(e,b,j)))}),c}function d(a,b,c,d,f){if(!(z(f)||f instanceof DS.Model)){var g;"number"==typeof f||"string"==typeof f?(g=e(d,c,b),b[c]=a.recordForId(g,f)):"object"==typeof f&&(b[c]=a.recordForId(f.type,f.id))}}function e(a,b,c){return a.options.polymorphic?c[b+"Type"]:a.type}function f(a,b,c,e,f){for(var g=0,h=f.length;h>g;g++)d(a,f,g,e,f[g])}function g(a,b,c){a&&c.pushObjects(a.get(b).filterBy("isNew"))}function h(a,b){return u.create({promise:D.cast(a,b)})}function i(a,b){return v.create({promise:D.cast(a,b)})}function j(a,b,c){return a.lookup("serializer:"+b)||a.lookup("serializer:application")||a.lookup("serializer:"+c)||a.lookup("serializer:-default")}function k(a){return a.lookup("serializer:application")||a.lookup("serializer:-default")}function l(a,b){var c=a.serializer,d=a.defaultSerializer,e=a.container;return e&&void 0===c&&(c=j(e,b.typeKey,d)),(null===c||void 0===c)&&(c={extract:function(a,b,c){return c}}),c}function m(a,b,c,d){var e=a.find(b,c,d),f=l(a,c),g="DS: Handle Adapter#find of "+c+" with id: "+d;return D.cast(e,g).then(function(a){var e=f.extract(b,c,a,d,"find");return b.push(c,e)},function(a){var e=b.getById(c,d);throw e.notFound(),a},"DS: Extract payload of '"+c+"'")}function n(a,b,c,d,e){var f=a.findMany(b,c,d,e),g=l(a,c),h="DS: Handle Adapter#findMany of "+c;return D.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findMany");b.pushMany(c,d)},null,"DS: Extract payload of "+c)}function o(a,b,c,d,e){var f=a.findHasMany(b,c,d,e),g=l(a,e.type),h="DS: Handle Adapter#findHasMany of "+c+" : "+e.type;return D.cast(f,h).then(function(a){var d=g.extract(b,e.type,a,null,"findHasMany"),f=b.pushMany(e.type,d);c.updateHasMany(e.key,f)},null,"DS: Extract payload of "+c+" : hasMany "+e.type)}function p(a,b,c,d,e){var f=a.findBelongsTo(b,c,d,e),g=l(a,e.type),h="DS: Handle Adapter#findBelongsTo of "+c+" : "+e.type;return D.cast(f,h).then(function(a){var c=g.extract(b,e.type,a,null,"findBelongsTo"),d=b.push(e.type,c);return d.updateBelongsTo(e.key,d),d},null,"DS: Extract payload of "+c+" : "+e.type)}function q(a,b,c,d){var e=a.findAll(b,c,d),f=l(a,c),g="DS: Handle Adapter#findAll of "+c;return D.cast(e,g).then(function(a){var d=f.extract(b,c,a,null,"findAll");return b.pushMany(c,d),b.didUpdateAll(c),b.all(c)},null,"DS: Extract payload of findAll "+c)}function r(a,b,c,d,e){var f=a.findQuery(b,c,d,e),g=l(a,c),h="DS: Handle Adapter#findQuery of "+c;return D.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findQuery");return e.load(d),e},null,"DS: Extract payload of findQuery "+c)}function s(a,b,c,d){var e=d.constructor,f=a[c](b,e,d),g=l(a,e),h="DS: Extract and notify about "+c+" completion of "+d;return f.then(function(a){var f;return f=a?g.extract(b,e,a,w(d,"id"),c):a,b.didSaveRecord(d,f),d},function(a){throw a instanceof DS.InvalidError?b.recordWasInvalid(d,a.errors):b.recordWasError(d,a),a},h)}var t,u,v,w=Ember.get,x=Ember.set,y=Ember.run.once,z=Ember.isNone,A=Ember.EnumerableUtils.forEach,B=Ember.EnumerableUtils.indexOf,C=Ember.EnumerableUtils.map,D=Ember.RSVP.Promise,E=Ember.copy;t=Ember.Object.extend({init:function(){this.typeMaps={},this.recordArrayManager=DS.RecordArrayManager.create({store:this}),this._relationshipChanges={},this._pendingSave=[]},adapter:"-rest",serialize:function(a,b){return this.serializerFor(a.constructor.typeKey).serialize(a,b)},defaultAdapter:Ember.computed("adapter",function(){var a=w(this,"adapter");return"string"==typeof a&&(a=this.container.lookup("adapter:"+a)||this.container.lookup("adapter:application")||this.container.lookup("adapter:-rest")),DS.Adapter.detect(a)&&(a=a.create({container:this.container})),a}),createRecord:function(a,c){a=this.modelFor(a),c=E(c)||{},z(c.id)&&(c.id=this._generateId(a)),c.id=b(c.id);var d=this.buildRecord(a,c.id);return d.loadedData(),d.setProperties(c),d},_generateId:function(a){var b=this.adapterFor(a);return b&&b.generateIdForRecord?b.generateIdForRecord(this):null},deleteRecord:function(a){a.deleteRecord()},unloadRecord:function(a){a.unloadRecord()},find:function(a,c){return 1===arguments.length?this.findAll(a):"object"===Ember.typeOf(c)?this.findQuery(a,c):this.findById(a,b(c))},findById:function(a,b){a=this.modelFor(a);var c=this.recordForId(a,b),d=this.fetchRecord(c);return h(d||c,"DS: Store#findById "+a+" with id: "+b)},findByIds:function(a,b){var c=this;return i(Ember.RSVP.all(C(b,function(b){return c.findById(a,b)})).then(Ember.A,null,"DS: Store#findByIds of "+a+" complete"))},fetchRecord:function(a){if(z(a))return null;if(a._loadingPromise)return a._loadingPromise;if(!w(a,"isEmpty"))return null;var b=a.constructor,c=w(a,"id"),d=this.adapterFor(b),e=m(d,this,b,c);return a.loadingData(e),e},getById:function(a,b){return this.hasRecordForId(a,b)?this.recordForId(a,b):null},reloadRecord:function(a){var b=a.constructor,c=this.adapterFor(b),d=w(a,"id");return m(c,this,b,d)},fetchMany:function(a,b){if(a.length){var c=Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}});A(a,function(a){c.get(a.constructor).push(a)});var d=[];return A(c,function(a,c){var e=c.mapProperty("id"),f=this.adapterFor(a);d.push(n(f,this,a,e,b))},this),Ember.RSVP.all(d)}},hasRecordForId:function(a,c){return c=b(c),a=this.modelFor(a),!!this.typeMapFor(a).idToRecord[c]},recordForId:function(a,c){a=this.modelFor(a),c=b(c);var d=this.typeMapFor(a).idToRecord[c];return d||(d=this.buildRecord(a,c)),d},findMany:function(a,b,c,d){c=this.modelFor(c),b=Ember.A(b);var e=b.filterProperty("isEmpty",!0),f=this.recordArrayManager.createManyArray(c,b);return A(e,function(a){a.loadingData()}),f.loadingRecordsCount=e.length,e.length?(A(e,function(a){this.recordArrayManager.registerWaitingRecordArray(a,f)},this),d.resolve(this.fetchMany(e,a))):(d&&d.resolve(),f.set("isLoaded",!0),y(f,"trigger","didLoad")),f},findHasMany:function(a,b,c,d){var e=this.adapterFor(a.constructor),f=this.recordArrayManager.createManyArray(c.type,Ember.A([]));return d.resolve(o(e,this,a,b,c)),f},findBelongsTo:function(a,b,c){var d=this.adapterFor(a.constructor);return p(d,this,a,b,c)},findQuery:function(a,b){a=this.modelFor(a);
|
10
|
-
var c=this.recordArrayManager.createAdapterPopulatedRecordArray(a,b),d=this.adapterFor(a);return i(r(d,this,a,b,c))},findAll:function(a){return a=this.modelFor(a),this.fetchAll(a,this.all(a))},fetchAll:function(a,b){var c=this.adapterFor(a),d=this.typeMapFor(a).metadata.since;return x(b,"isUpdating",!0),i(q(c,this,a,d))},didUpdateAll:function(a){var b=this.typeMapFor(a).findAllCache;x(b,"isUpdating",!1)},all:function(a){a=this.modelFor(a);var b=this.typeMapFor(a),c=b.findAllCache;if(c)return c;var d=this.recordArrayManager.createRecordArray(a);return b.findAllCache=d,d},unloadAll:function(a){for(var b,c=this.modelFor(a),d=this.typeMapFor(c),e=d.records.slice(),f=0;f<e.length;f++)b=e[f],b.unloadRecord(),b.destroy();d.findAllCache=null},filter:function(a,b,c){var d;3===arguments.length?d=this.findQuery(a,b):2===arguments.length&&(c=b),a=this.modelFor(a);var e=this.recordArrayManager.createFilteredRecordArray(a,c);return d=d||D.cast(e),i(d.then(function(){return e},null,"DS: Store#filter of "+a))},recordIsLoaded:function(a,b){return this.hasRecordForId(a,b)?!w(this.recordForId(a,b),"isEmpty"):!1},metadataFor:function(a){return a=this.modelFor(a),this.typeMapFor(a).metadata},dataWasUpdated:function(a,b){this.recordArrayManager.recordDidChange(b)},scheduleSave:function(a,b){a.adapterWillCommit(),this._pendingSave.push([a,b]),y(this,"flushPendingSave")},flushPendingSave:function(){var a=this._pendingSave.slice();this._pendingSave=[],A(a,function(a){var b,c=a[0],d=a[1],e=this.adapterFor(c.constructor);b=w(c,"isNew")?"createRecord":w(c,"isDeleted")?"deleteRecord":"updateRecord",d.resolve(s(e,this,b,c))},this)},didSaveRecord:function(a,b){b&&(b=c(this,a.constructor,b,a),this.updateId(a,b)),a.adapterDidCommit(b)},recordWasInvalid:function(a,b){a.adapterDidInvalidate(b)},recordWasError:function(a){a.adapterDidError()},updateId:function(a,c){var d=(w(a,"id"),b(c.id));this.typeMapFor(a.constructor).idToRecord[d]=a,x(a,"id",d)},typeMapFor:function(a){var b,c=w(this,"typeMaps"),d=Ember.guidFor(a);return(b=c[d])?b:(b={idToRecord:{},records:[],metadata:{},type:a},c[d]=b,b)},_load:function(a,c,d){var e=b(c.id),f=this.recordForId(a,e);return f.setupData(c,d),this.recordArrayManager.recordDidChange(f),f},modelFor:function(a){var b;if("string"==typeof a){var c=this.container.normalize("model:"+a);if(b=this.container.lookupFactory(c),!b)throw new Ember.Error("No model was found for '"+a+"'");b.typeKey=c.split(":",2)[1]}else b=a;return b.store=this,b},push:function(a,b,d){return a=this.modelFor(a),b=c(this,a,b),this._load(a,b,d),this.recordForId(a,b.id)},pushPayload:function(a,b){var c;b?c=this.serializerFor(a):(b=a,c=k(this.container)),c.pushPayload(this,b)},update:function(a,b){return this.push(a,b,!0)},pushMany:function(a,b){return C(b,function(b){return this.push(a,b)},this)},metaForType:function(a,b){a=this.modelFor(a),Ember.merge(this.typeMapFor(a).metadata,b)},buildRecord:function(a,b,c){var d=this.typeMapFor(a),e=d.idToRecord,f=a._create({id:b,store:this,container:this.container});return c&&f.setupData(c),b&&(e[b]=f),d.records.push(f),f},dematerializeRecord:function(a){var b=a.constructor,c=this.typeMapFor(b),d=w(a,"id");a.updateRecordArrays(),d&&delete c.idToRecord[d];var e=B(c.records,a);c.records.splice(e,1)},addRelationshipChangeFor:function(a,b,c,d,e){var f=a.clientId,g=c?c:c,h=b+d,i=this._relationshipChanges;f in i||(i[f]={}),g in i[f]||(i[f][g]={}),h in i[f][g]||(i[f][g][h]={}),i[f][g][h][e.changeType]=e},removeRelationshipChangeFor:function(a,b,c,d,e){var f=a.clientId,g=c?c.clientId:c,h=this._relationshipChanges,i=b+d;f in h&&g in h[f]&&i in h[f][g]&&delete h[f][g][i][e]},relationshipChangePairsFor:function(a){var b=[];if(!a)return b;var c=this._relationshipChanges[a.clientId];for(var d in c)if(c.hasOwnProperty(d))for(var e in c[d])c[d].hasOwnProperty(e)&&b.push(c[d][e]);return b},adapterFor:function(a){var b,c=this.container;return c&&(b=c.lookup("adapter:"+a.typeKey)||c.lookup("adapter:application")),b||w(this,"defaultAdapter")},serializerFor:function(a){a=this.modelFor(a);var b=this.adapterFor(a);return j(this.container,a.typeKey,b&&b.defaultSerializer)},willDestroy:function(){function a(a){return b[a].type}var b=this.typeMaps,c=Ember.keys(b),d=c.map(a);this.recordArrayManager.destroy(),d.forEach(this.unloadAll,this)}}),v=Ember.ArrayProxy.extend(Ember.PromiseProxyMixin),u=Ember.ObjectProxy.extend(Ember.PromiseProxyMixin),a.Store=t,a.PromiseArray=v,a.PromiseObject=u,a["default"]=t}),b("ember-data/lib/transforms",["./transforms/base","./transforms/number","./transforms/date","./transforms/string","./transforms/boolean","exports"],function(a,b,c,d,e,f){"use strict";var g=a["default"],h=b["default"],i=c["default"],j=d["default"],k=e["default"];f.Transform=g,f.NumberTransform=h,f.DateTransform=i,f.StringTransform=j,f.BooleanTransform=k}),b("ember-data/lib/transforms/base",["exports"],function(a){"use strict";var b=Ember.Object.extend({serialize:Ember.required(),deserialize:Ember.required()});a["default"]=b}),b("ember-data/lib/transforms/boolean",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=c.extend({deserialize:function(a){var b=typeof a;return"boolean"===b?a:"string"===b?null!==a.match(/^true$|^t$|^1$/i):"number"===b?1===a:!1},serialize:function(a){return Boolean(a)}});b["default"]=d}),b("ember-data/lib/transforms/date",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=c.extend({deserialize:function(a){var b=typeof a;return"string"===b?new Date(Ember.Date.parse(a)):"number"===b?new Date(a):null===a||void 0===a?a:null},serialize:function(a){if(a instanceof Date){var b=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],d=function(a){return 10>a?"0"+a:""+a},e=a.getUTCFullYear(),f=a.getUTCMonth(),g=a.getUTCDate(),h=a.getUTCDay(),i=a.getUTCHours(),j=a.getUTCMinutes(),k=a.getUTCSeconds(),l=b[h],m=d(g),n=c[f];return l+", "+m+" "+n+" "+e+" "+d(i)+":"+d(j)+":"+d(k)+" GMT"}return null}});b["default"]=d}),b("ember-data/lib/transforms/number",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isEmpty,e=c.extend({deserialize:function(a){return d(a)?null:Number(a)},serialize:function(a){return d(a)?null:Number(a)}});b["default"]=e}),b("ember-data/lib/transforms/string",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isNone,e=c.extend({deserialize:function(a){return d(a)?null:String(a)},serialize:function(a){return d(a)?null:String(a)}});b["default"]=e}),b("ember-inflector/lib/ext/string",["../system/string"],function(a){"use strict";var b=a.pluralize,c=a.singularize;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)&&(String.prototype.pluralize=function(){return b(this)},String.prototype.singularize=function(){return c(this)})}),b("ember-inflector/lib/main",["./system","./ext/string","exports"],function(a,b,c){"use strict";var d=a.Inflector,e=a.inflections,f=a.pluralize,g=a.singularize;d.defaultRules=e,Ember.Inflector=d,Ember.String.pluralize=f,Ember.String.singularize=g,c["default"]=d,c.pluralize=f,c.singularize=g}),b("ember-inflector/lib/system",["./system/inflector","./system/string","./system/inflections","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b.pluralize,g=b.singularize,h=c["default"];e.inflector=new e(h),d.Inflector=e,d.singularize=g,d.pluralize=f,d.defaultRules=h}),b("ember-inflector/lib/system/inflections",["exports"],function(a){"use strict";var b={plurals:[[/$/,"s"],[/s$/i,"s"],[/^(ax|test)is$/i,"$1es"],[/(octop|vir)us$/i,"$1i"],[/(octop|vir)i$/i,"$1i"],[/(alias|status)$/i,"$1es"],[/(bu)s$/i,"$1ses"],[/(buffal|tomat)o$/i,"$1oes"],[/([ti])um$/i,"$1a"],[/([ti])a$/i,"$1a"],[/sis$/i,"ses"],[/(?:([^f])fe|([lr])f)$/i,"$1$2ves"],[/(hive)$/i,"$1s"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/(x|ch|ss|sh)$/i,"$1es"],[/(matr|vert|ind)(?:ix|ex)$/i,"$1ices"],[/^(m|l)ouse$/i,"$1ice"],[/^(m|l)ice$/i,"$1ice"],[/^(ox)$/i,"$1en"],[/^(oxen)$/i,"$1"],[/(quiz)$/i,"$1zes"]],singular:[[/s$/i,""],[/(ss)$/i,"$1"],[/(n)ews$/i,"$1ews"],[/([ti])a$/i,"$1um"],[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i,"$1sis"],[/(^analy)(sis|ses)$/i,"$1sis"],[/([^f])ves$/i,"$1fe"],[/(hive)s$/i,"$1"],[/(tive)s$/i,"$1"],[/([lr])ves$/i,"$1f"],[/([^aeiouy]|qu)ies$/i,"$1y"],[/(s)eries$/i,"$1eries"],[/(m)ovies$/i,"$1ovie"],[/(x|ch|ss|sh)es$/i,"$1"],[/^(m|l)ice$/i,"$1ouse"],[/(bus)(es)?$/i,"$1"],[/(o)es$/i,"$1"],[/(shoe)s$/i,"$1"],[/(cris|test)(is|es)$/i,"$1is"],[/^(a)x[ie]s$/i,"$1xis"],[/(octop|vir)(us|i)$/i,"$1us"],[/(alias|status)(es)?$/i,"$1"],[/^(ox)en/i,"$1"],[/(vert|ind)ices$/i,"$1ex"],[/(matr)ices$/i,"$1ix"],[/(quiz)zes$/i,"$1"],[/(database)s$/i,"$1"]],irregularPairs:[["person","people"],["man","men"],["child","children"],["sex","sexes"],["move","moves"],["cow","kine"],["zombie","zombies"]],uncountable:["equipment","information","rice","money","species","series","fish","sheep","jeans","police"]};a["default"]=b}),b("ember-inflector/lib/system/inflector",["exports"],function(a){"use strict";function b(a,b){for(var c=0,d=b.length;d>c;c++)a.uncountable[b[c].toLowerCase()]=!0}function c(a,b){for(var c,d=0,e=b.length;e>d;d++)c=b[d],a.irregular[c[0].toLowerCase()]=c[1],a.irregularInverse[c[1].toLowerCase()]=c[0]}function d(a){a=a||{},a.uncountable=a.uncountable||{},a.irregularPairs=a.irregularPairs||{};var d=this.rules={plurals:a.plurals||[],singular:a.singular||[],irregular:{},irregularInverse:{},uncountable:{}};b(d,a.uncountable),c(d,a.irregularPairs)}var e=/^\s*$/;d.prototype={plural:function(a,b){this.rules.plurals.push([a,b.toLowerCase()])},singular:function(a,b){this.rules.singular.push([a,b.toLowerCase()])},uncountable:function(a){b(this.rules,[a.toLowerCase()])},irregular:function(a,b){c(this.rules,[[a,b]])},pluralize:function(a){return this.inflect(a,this.rules.plurals,this.rules.irregular)},singularize:function(a){return this.inflect(a,this.rules.singular,this.rules.irregularInverse)},inflect:function(a,b,c){var d,f,g,h,i,j,k,l;if(i=e.test(a))return a;if(h=a.toLowerCase(),j=this.rules.uncountable[h])return a;if(k=c&&c[h])return k;for(var m=b.length,n=0;m>n&&(d=b[m-1],l=d[0],!l.test(a));m--);return d=d||[],l=d[0],f=d[1],g=a.replace(l,f)}},a["default"]=d}),b("ember-inflector/lib/system/string",["./inflector","exports"],function(a,b){"use strict";var c=a["default"],d=function(a){return c.inflector.pluralize(a)},e=function(a){return c.inflector.singularize(a)};b.pluralize=d,b.singularize=e}),a.DS=c("ember-data/lib/main")["default"]}(window);
|
8
|
+
!function(a){var b,c,d,e;!function(){var a={},f={};b=function(b,c,d){a[b]={deps:c,callback:d}},e=d=c=function(b){function d(a){if("."!==a.charAt(0))return a;for(var c=a.split("/"),d=b.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(e._eak_seen=a,f[b])return f[b];if(f[b]={},!a[b])throw new Error("Could not find module "+b);for(var g,h=a[b],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)k.push("exports"===i[l]?g={}:c(d(i[l])));var n=j.apply(this,k);return f[b]=g||n}}(),b("activemodel-adapter/lib/main",["./system","exports"],function(a,b){"use strict";var c=a.ActiveModelAdapter,d=a.ActiveModelSerializer,e=a.EmbeddedRecordsMixin;b.ActiveModelAdapter=c,b.ActiveModelSerializer=d,b.EmbeddedRecordsMixin=e}),b("activemodel-adapter/lib/setup-container",["../../ember-data/lib/system/container_proxy","./system/active_model_serializer","./system/active_model_adapter","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"],g=c["default"];d["default"]=function(a){var b=new e(a);b.registerDeprecations([{deprecated:"serializer:_ams",valid:"serializer:-active-model"},{deprecated:"adapter:_ams",valid:"adapter:-active-model"}]),a.register("serializer:-active-model",f),a.register("adapter:-active-model",g)}}),b("activemodel-adapter/lib/system",["./system/embedded_records_mixin","./system/active_model_adapter","./system/active_model_serializer","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"],g=c["default"];d.EmbeddedRecordsMixin=e,d.ActiveModelAdapter=f,d.ActiveModelSerializer=g}),b("activemodel-adapter/lib/system/active_model_adapter",["../../../ember-data/lib/adapters","../../../ember-data/lib/system/adapter","../../../ember-inflector/lib/main","./active_model_serializer","./embedded_records_mixin","exports"],function(a,b,c,d,e,f){"use strict";var g=a.RESTAdapter,h=b.InvalidError,i=c.pluralize,j=(d["default"],e["default"],Ember.EnumerableUtils.forEach),k=Ember.String.decamelize,l=Ember.String.underscore,m=g.extend({defaultSerializer:"-active-model",pathForType:function(a){var b=k(a),c=l(b);return i(c)},ajaxError:function(a){var b=this._super(a);if(a&&422===a.status){var c=Ember.$.parseJSON(a.responseText),d={};if(void 0!==c.errors){var e=c.errors;j(Ember.keys(e),function(a){d[Ember.String.camelize(a)]=e[a]})}return new h(d)}return b}});f["default"]=m}),b("activemodel-adapter/lib/system/active_model_serializer",["../../../ember-inflector/lib/main","../../../ember-data/lib/serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a.singularize,e=b["default"],f=Ember.get,g=Ember.EnumerableUtils.forEach,h=Ember.String.camelize,i=Ember.String.capitalize,j=Ember.String.decamelize,k=Ember.String.underscore,l=e.extend({keyForAttribute:function(a){return j(a)},keyForRelationship:function(a,b){return a=j(a),"belongsTo"===b?a+"_id":"hasMany"===b?d(a)+"_ids":a},serializeHasMany:Ember.K,serializeIntoHash:function(a,b,c,d){var e=k(j(b.typeKey));a[e]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,e=f(a,d);e&&(d=this.keyForAttribute(d),b[d+"_type"]=i(e.constructor.typeKey))},normalize:function(a,b,c){return this.normalizeLinks(b),this._super(a,b,c)},normalizeLinks:function(a){if(a.links){var b=a.links;for(var c in b){var d=h(c);d!==c&&(b[d]=b[c],delete b[c])}}},normalizeRelationships:function(a,b){var c,d;this.keyForRelationship&&a.eachRelationship(function(a,e){if(e.options.polymorphic){if(c=this.keyForAttribute(a),d=b[c],d&&d.type)d.type=this.typeForRoot(d.type);else if(d&&"hasMany"===e.kind){var f=this;g(d,function(a){a.type=f.typeForRoot(a.type)})}}else c=this.keyForRelationship(a,e.kind),d=b[c];b[a]=d,a!==c&&delete b[c]},this)}});c["default"]=l}),b("activemodel-adapter/lib/system/embedded_records_mixin",["../../../ember-inflector/lib/main","exports"],function(a,b){"use strict";function c(a,b){var c=h(a,b);return c&&"always"===c.embedded}function d(a,b){var d=c(a,b),e=h(a,b);return d||e&&"records"===e.serialize}function e(a,b){var c=h(a,b);return c&&("ids"===c.serialize||"id"===c.serialize)}function f(a,b){{var c=h(a,b);d(a,b),e(a,b)}return!(c&&(c.serialize||c.embedded))}function g(a,b){var d=c(a,b),e=h(a,b),f=e&&(e.deserialize||e.serialize);return d||f}function h(a,b){return a&&(a[Ember.String.camelize(b)]||a[b])}function i(a,b,c,d,e){var f=l(a,"attrs");f&&c.eachRelationship(function(c,h){g(f,c)&&("hasMany"===h.kind&&j(a,b,c,h,d,e),"belongsTo"===h.kind&&k(a,b,c,h,d,e))})}function j(a,b,c,d,e,f){var g=b.serializerFor(d.type.typeKey),h=l(a,"primaryKey"),j=d.type.typeKey,k="_"+a.typeForRoot(d.type.typeKey),n=a.keyForRelationship(c,d.kind),o=a.keyForAttribute(c),p=[];f[o]&&(e[k]=e[k]||[],m(f[o],function(a){var c=b.modelFor(j);i(g,b,c,e,a),p.push(a[h]),e[k].push(a)}),f[n]=p,delete f[o])}function k(a,b,c,d,e,f){var h=a.get("attrs");if(h&&(g(h,Ember.String.camelize(c))||g(h,c))){var j=d.type.typeKey,k=b.serializerFor(d.type.typeKey),m=(l(k,"primaryKey"),Ember.String.pluralize(j)),n=k.keyForRelationship(c,d.kind),o=k.keyForAttribute(c);if(f[o]){e[m]=e[m]||[];var p=b.modelFor(d.type.typeKey);i(k,b,p,e,f[o]),f[n]=f[o].id,e[m].push(f[o]),f[o][d.parentType.typeKey+"_id"]=f.id,delete f[o]}}}var l=Ember.get,m=Ember.EnumerableUtils.forEach,n=(Ember.String.camelize,a.pluralize),o=Ember.Mixin.create({serializeBelongsTo:function(a,b,c){var g=c.key,h=this.get("attrs");if(f(h,g))return void this._super(a,b,c);var i=e(h,g),j=d(h,g),k=a.get(g);if(i)m=this.keyForRelationship(g,c.kind),b[m]=k?l(k,"id"):null;else if(j){var m=this.keyForRelationship(g);k?(b[m]=k.serialize({includeId:!0}),this.removeEmbeddedForeignKey(a,k,c,b[m])):b[m]=null}},serializeHasMany:function(a,b,c){var g=c.key,h=this.get("attrs");if(f(h,g))return void this._super(a,b,c);var i,j=e(h,g),k=d(h,g);j?(i=this.keyForRelationship(g,c.kind),b[i]=l(a,g).mapBy("id")):k&&(i=this.keyForAttribute(g),b[i]=l(a,g).map(function(b){var d=b.serialize({includeId:!0});return this.removeEmbeddedForeignKey(a,b,c,d),d},this))},removeEmbeddedForeignKey:function(a,b,c,d){if("hasMany"!==c.kind&&"belongsTo"===c.kind){var e=a.constructor.inverseFor(c.key);if(e){var f=e.name,g=this.store.serializerFor(b.constructor),h=g.keyForRelationship(f,e.kind);h&&delete d[h]}}},extractSingle:function(a,b,c,d){var e=this.keyForAttribute(b.typeKey),f=c[e];return i(this,a,b,c,f),this._super(a,b,c,d)},extractArray:function(a,b,c){var d=this.keyForAttribute(b.typeKey),e=c[n(d)];return m(e,function(d){i(this,a,b,c,d)},this),this._super(a,b,c)}});b["default"]=o}),b("ember-data/lib/adapters",["./adapters/fixture_adapter","./adapters/rest_adapter","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.RESTAdapter=e,c.FixtureAdapter=d}),b("ember-data/lib/adapters/fixture_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=Ember.get,d=Ember.String.fmt,e=Ember.EnumerableUtils.indexOf,f=0,g=a["default"],h=g.extend({serializer:null,simulateRemoteResponse:!0,latency:50,fixturesForType:function(a){if(a.FIXTURES){var b=Ember.A(a.FIXTURES);return b.map(function(a){var b=typeof a.id;if("number"!==b&&"string"!==b)throw new Error(d("the id property must be defined as a number or string for fixture %@",[a]));return a.id=a.id+"",a})}return null},queryFixtures:function(){},updateFixtures:function(a,b){a.FIXTURES||(a.FIXTURES=[]);var c=a.FIXTURES;this.deleteLoadedFixture(a,b),c.push(b)},mockJSON:function(a,b,c){return a.serializerFor(b).serialize(c,{includeId:!0})},generateIdForRecord:function(){return"fixture-"+f++},find:function(a,b,c){var d,e=this.fixturesForType(b);return e&&(d=Ember.A(e).findProperty("id",c)),d?this.simulateRemoteCall(function(){return d},this):void 0},findMany:function(a,b,c){var d=this.fixturesForType(b);return d&&(d=d.filter(function(a){return-1!==e(c,a.id)})),d?this.simulateRemoteCall(function(){return d},this):void 0},findAll:function(a,b){var c=this.fixturesForType(b);return this.simulateRemoteCall(function(){return c},this)},findQuery:function(a,b,c){var d=this.fixturesForType(b);return d=this.queryFixtures(d,c,b),d?this.simulateRemoteCall(function(){return d},this):void 0},createRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},updateRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},deleteRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.deleteLoadedFixture(b,d),this.simulateRemoteCall(function(){return null})},deleteLoadedFixture:function(a,b){var c=this.findExistingFixture(a,b);if(c){var d=e(a.FIXTURES,c);return a.FIXTURES.splice(d,1),!0}},findExistingFixture:function(a,b){var d=this.fixturesForType(a),e=c(b,"id");return this.findFixtureById(d,e)},findFixtureById:function(a,b){return Ember.A(a).find(function(a){return""+c(a,"id")==""+b?!0:!1})},simulateRemoteCall:function(a,b){var d=this;return new Ember.RSVP.Promise(function(e){c(d,"simulateRemoteResponse")?Ember.run.later(function(){e(a.call(b))},c(d,"latency")):Ember.run.schedule("actions",null,function(){e(a.call(b))})},"DS: FixtureAdapter#simulateRemoteCall")}});b["default"]=h}),b("ember-data/lib/adapters/rest_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=(Ember.set,Ember.ArrayPolyfills.forEach),f=c.extend({defaultSerializer:"-rest",find:function(a,b,c){return this.ajax(this.buildURL(b.typeKey,c),"GET")},findAll:function(a,b,c){var d;return c&&(d={since:c}),this.ajax(this.buildURL(b.typeKey),"GET",{data:d})},findQuery:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:c})},findMany:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:{ids:c}})},findHasMany:function(a,b,c){var e=d(this,"host"),f=d(b,"id"),g=b.constructor.typeKey;return e&&"/"===c.charAt(0)&&"/"!==c.charAt(1)&&(c=e+c),this.ajax(this.urlPrefix(c,this.buildURL(g,f)),"GET")},findBelongsTo:function(a,b,c){var e=d(b,"id"),f=b.constructor.typeKey;return this.ajax(this.urlPrefix(c,this.buildURL(f,e)),"GET")},createRecord:function(a,b,c){var d={},e=a.serializerFor(b.typeKey);return e.serializeIntoHash(d,b,c,{includeId:!0}),this.ajax(this.buildURL(b.typeKey),"POST",{data:d})},updateRecord:function(a,b,c){var e={},f=a.serializerFor(b.typeKey);f.serializeIntoHash(e,b,c);var g=d(c,"id");return this.ajax(this.buildURL(b.typeKey,g),"PUT",{data:e})},deleteRecord:function(a,b,c){var e=d(c,"id");return this.ajax(this.buildURL(b.typeKey,e),"DELETE")},buildURL:function(a,b){var c=[],e=d(this,"host"),f=this.urlPrefix();return a&&c.push(this.pathForType(a)),b&&c.push(b),f&&c.unshift(f),c=c.join("/"),!e&&c&&(c="/"+c),c},urlPrefix:function(a,b){var c=d(this,"host"),e=d(this,"namespace"),f=[];return a?"/"===a.charAt(0)?c&&(a=a.slice(1),f.push(c)):/^http(s)?:\/\//.test(a)||f.push(b):(c&&f.push(c),e&&f.push(e)),a&&f.push(a),f.join("/")},pathForType:function(a){var b=Ember.String.camelize(a);return Ember.String.pluralize(b)},ajaxError:function(a){return a&&"object"==typeof a&&(a.then=null),a},ajax:function(a,b,c){var d=this;return new Ember.RSVP.Promise(function(e,f){c=d.ajaxOptions(a,b,c),c.success=function(a){Ember.run(null,e,a)},c.error=function(a){Ember.run(null,f,d.ajaxError(a))},Ember.$.ajax(c)},"DS: RestAdapter#ajax "+b+" to "+a)},ajaxOptions:function(a,b,c){c=c||{},c.url=a,c.type=b,c.dataType="json",c.context=this,c.data&&"GET"!==b&&(c.contentType="application/json; charset=utf-8",c.data=JSON.stringify(c.data));var f=d(this,"headers");return void 0!==f&&(c.beforeSend=function(a){e.call(Ember.keys(f),function(b){a.setRequestHeader(b,f[b])})}),c}});b["default"]=f}),b("ember-data/lib/core",["exports"],function(a){"use strict";var b;"undefined"==typeof b&&(b=Ember.Namespace.create({VERSION:"1.0.0-beta.8.2a68c63a"}),Ember.libraries&&Ember.libraries.registerCoreLibrary("Ember Data",b.VERSION)),a["default"]=b}),b("ember-data/lib/ember-initializer",["./setup-container"],function(a){"use strict";var b=a["default"],c=Ember.K;Ember.onLoad("Ember.Application",function(a){a.initializer({name:"ember-data",initialize:b}),a.initializer({name:"store",after:"ember-data",initialize:c}),a.initializer({name:"activeModelAdapter",before:"store",initialize:c}),a.initializer({name:"transforms",before:"store",initialize:c}),a.initializer({name:"data-adapter",before:"store",initialize:c}),a.initializer({name:"injectStore",before:"store",initialize:c})})}),b("ember-data/lib/ext/date",[],function(){"use strict";Ember.Date=Ember.Date||{};var a=Date.parse,b=[1,4,5,6,7,10,11];Ember.Date.parse=function(c){var d,e,f=0;if(e=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(c)){for(var g,h=0;g=b[h];++h)e[g]=+e[g]||0;e[2]=(+e[2]||1)-1,e[3]=+e[3]||1,"Z"!==e[8]&&void 0!==e[9]&&(f=60*e[10]+e[11],"+"===e[9]&&(f=0-f)),d=Date.UTC(e[1],e[2],e[3],e[4],e[5]+f,e[6],e[7])}else d=a?a(c):0/0;return d},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Date)&&(Date.parse=Ember.Date.parse)}),b("ember-data/lib/initializers/data_adapter",["../system/debug/debug_adapter","exports"],function(a,b){"use strict";var c=a["default"];b["default"]=function(a){a.register("data-adapter:main",c)}}),b("ember-data/lib/initializers/store",["../serializers","../adapters","../system/container_proxy","../system/store","exports"],function(a,b,c,d,e){"use strict";var f=a.JSONSerializer,g=a.RESTSerializer,h=b.RESTAdapter,i=c["default"],j=d["default"];e["default"]=function(a,b){a.register("store:main",a.lookupFactory("store:application")||b&&b.Store||j);var c=new i(a);c.registerDeprecations([{deprecated:"serializer:_default",valid:"serializer:-default"},{deprecated:"serializer:_rest",valid:"serializer:-rest"},{deprecated:"adapter:_rest",valid:"adapter:-rest"}]),a.register("serializer:-default",f),a.register("serializer:-rest",g),a.register("adapter:-rest",h),a.lookup("store:main")}}),b("ember-data/lib/initializers/store_injections",["exports"],function(a){"use strict";a["default"]=function(a){a.injection("controller","store","store:main"),a.injection("route","store","store:main"),a.injection("serializer","store","store:main"),a.injection("data-adapter","store","store:main")}}),b("ember-data/lib/initializers/transforms",["../transforms","exports"],function(a,b){"use strict";var c=a.BooleanTransform,d=a.DateTransform,e=a.StringTransform,f=a.NumberTransform;b["default"]=function(a){a.register("transform:boolean",c),a.register("transform:date",d),a.register("transform:number",f),a.register("transform:string",e)}}),b("ember-data/lib/main",["./core","./ext/date","./system/store","./system/model","./system/changes","./system/adapter","./system/debug","./system/record_arrays","./system/record_array_manager","./adapters","./serializers/json_serializer","./serializers/rest_serializer","../../ember-inflector/lib/main","../../activemodel-adapter/lib/main","./transforms","./system/relationships","./ember-initializer","./setup-container","./system/container_proxy","exports"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){"use strict";Ember.RSVP.Promise.cast=Ember.RSVP.Promise.cast||Ember.RSVP.resolve;var u=a["default"],v=c.Store,w=c.PromiseArray,x=c.PromiseObject,y=d.Model,z=d.Errors,A=d.RootState,B=d.attr,C=e.AttributeChange,D=e.RelationshipChange,E=e.RelationshipChangeAdd,F=(e.RelationshipChangeRemove,e.OneToManyChange),G=(e.ManyToNoneChange,e.OneToOneChange),H=e.ManyToManyChange,I=f.InvalidError,J=f.Adapter,K=g["default"],L=h.RecordArray,M=h.FilteredRecordArray,N=h.AdapterPopulatedRecordArray,O=h.ManyArray,P=i["default"],Q=j.RESTAdapter,R=j.FixtureAdapter,S=k["default"],T=l["default"],U=n.ActiveModelAdapter,V=n.ActiveModelSerializer,W=n.EmbeddedRecordsMixin,X=o.Transform,Y=o.DateTransform,Z=o.NumberTransform,$=o.StringTransform,_=o.BooleanTransform,ab=p.hasMany,bb=p.belongsTo,cb=r["default"],db=s["default"];u.Store=v,u.PromiseArray=w,u.PromiseObject=x,u.Model=y,u.RootState=A,u.attr=B,u.Errors=z,u.AttributeChange=C,u.RelationshipChange=D,u.RelationshipChangeAdd=E,u.OneToManyChange=F,u.ManyToNoneChange=F,u.OneToOneChange=G,u.ManyToManyChange=H,u.Adapter=J,u.InvalidError=I,u.DebugAdapter=K,u.RecordArray=L,u.FilteredRecordArray=M,u.AdapterPopulatedRecordArray=N,u.ManyArray=O,u.RecordArrayManager=P,u.RESTAdapter=Q,u.FixtureAdapter=R,u.RESTSerializer=T,u.JSONSerializer=S,u.Transform=X,u.DateTransform=Y,u.StringTransform=$,u.NumberTransform=Z,u.BooleanTransform=_,u.ActiveModelAdapter=U,u.ActiveModelSerializer=V,u.EmbeddedRecordsMixin=W,u.belongsTo=bb,u.hasMany=ab,u.ContainerProxy=db,u._setupContainer=cb,Ember.lookup.DS=u,t["default"]=u}),b("ember-data/lib/serializers",["./serializers/json_serializer","./serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.JSONSerializer=d,c.RESTSerializer=e}),b("ember-data/lib/serializers/json_serializer",["../system/changes","exports"],function(a,b){"use strict";var c=a.RelationshipChange,d=Ember.get,e=(Ember.set,Ember.isNone),f=Ember.ArrayPolyfills.map,g=Ember.Object.extend({primaryKey:"id",applyTransforms:function(a,b){return a.eachTransformedAttribute(function(a,c){var d=this.transformFor(c);b[a]=d.deserialize(b[a])},this),b},normalize:function(a,b){return b?(this.normalizeId(b),this.normalizeUsingDeclaredMapping(a,b),this.applyTransforms(a,b),b):b},normalizeUsingDeclaredMapping:function(a,b){var c,e,f=d(this,"attrs");if(f)for(e in f)c=f[e],c&&c.key&&(c=c.key),"string"==typeof c&&(b[e]=b[c],delete b[c])},normalizeId:function(a){var b=d(this,"primaryKey");"id"!==b&&(a.id=a[b],delete a[b])},serialize:function(a,b){var c={};if(b&&b.includeId){var e=d(a,"id");e&&(c[d(this,"primaryKey")]=e)}return a.eachAttribute(function(b,d){this.serializeAttribute(a,c,b,d)},this),a.eachRelationship(function(b,d){"belongsTo"===d.kind?this.serializeBelongsTo(a,c,d):"hasMany"===d.kind&&this.serializeHasMany(a,c,d)},this),c},serializeAttribute:function(a,b,c,e){var f=d(this,"attrs"),g=d(a,c),h=e.type;if(h){var i=this.transformFor(h);g=i.serialize(g)}c=f&&f[c]||(this.keyForAttribute?this.keyForAttribute(c):c),b[c]=g},serializeBelongsTo:function(a,b,c){var f=c.key,g=d(a,f);f=this.keyForRelationship?this.keyForRelationship(f,"belongsTo"):f,b[f]=e(g)?g:d(g,"id"),c.options.polymorphic&&this.serializePolymorphicType(a,b,c)},serializeHasMany:function(a,b,e){var f=e.key,g=this.keyForRelationship?this.keyForRelationship(f,"hasMany"):f,h=c.determineRelationshipType(a.constructor,e);("manyToNone"===h||"manyToMany"===h)&&(b[g]=d(a,f).mapBy("id"))},serializePolymorphicType:Ember.K,extract:function(a,b,c,d,e){this.extractMeta(a,b,c);var f="extract"+e.charAt(0).toUpperCase()+e.substr(1);return this[f](a,b,c,d,e)},extractFindAll:function(a,b,c){return this.extractArray(a,b,c)},extractFindQuery:function(a,b,c){return this.extractArray(a,b,c)},extractFindMany:function(a,b,c){return this.extractArray(a,b,c)},extractFindHasMany:function(a,b,c){return this.extractArray(a,b,c)},extractCreateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractUpdateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractDeleteRecord:function(a,b,c){return this.extractSave(a,b,c)},extractFind:function(a,b,c){return this.extractSingle(a,b,c)},extractFindBelongsTo:function(a,b,c){return this.extractSingle(a,b,c)},extractSave:function(a,b,c){return this.extractSingle(a,b,c)},extractSingle:function(a,b,c){return this.normalize(b,c)},extractArray:function(a,b,c){var d=this;return f.call(c,function(a){return d.normalize(b,a)})},extractMeta:function(a,b,c){c&&c.meta&&(a.metaForType(b,c.meta),delete c.meta)},transformFor:function(a){var b=this.container.lookup("transform:"+a);return b}});b["default"]=g}),b("ember-data/lib/serializers/rest_serializer",["./json_serializer","ember-inflector/lib/system/string","exports"],function(a,b,c){"use strict";function d(a){return null==a?null:a+""}var e=a["default"],f=Ember.get,g=(Ember.set,Ember.ArrayPolyfills.forEach),h=Ember.ArrayPolyfills.map,i=b.singularize,j=Ember.String.camelize,k=e.extend({normalize:function(a,b,c){return this.normalizeId(b),this.normalizeAttributes(a,b),this.normalizeRelationships(a,b),this.normalizeUsingDeclaredMapping(a,b),this.normalizeHash&&this.normalizeHash[c]&&this.normalizeHash[c](b),this.applyTransforms(a,b),b},normalizePayload:function(a){return a},normalizeAttributes:function(a,b){var c;this.keyForAttribute&&a.eachAttribute(function(a){c=this.keyForAttribute(a),a!==c&&(b[a]=b[c],delete b[c])},this)},normalizeRelationships:function(a,b){var c;this.keyForRelationship&&a.eachRelationship(function(a,d){c=this.keyForRelationship(a,d.kind),a!==c&&(b[a]=b[c],delete b[c])},this)},extractSingle:function(a,b,c,e){c=this.normalizePayload(c);var f,h=b.typeKey;for(var i in c){var j=this.typeForRoot(i),k=a.modelFor(j),l=k.typeKey===h;l&&"array"!==Ember.typeOf(c[i])?f=this.normalize(b,c[i],i):g.call(c[i],function(b){var c=this.typeForRoot(i),g=a.modelFor(c),h=a.serializerFor(g);b=h.normalize(g,b,i);var j=l&&!e&&!f,k=l&&d(b.id)===e;j||k?f=b:a.push(c,b)},this)}return f},extractArray:function(a,b,c){c=this.normalizePayload(c);var d,e=b.typeKey;for(var f in c){var g=f,i=!1;"_"===f.charAt(0)&&(i=!0,g=f.substr(1));var j=this.typeForRoot(g),k=a.modelFor(j),l=a.serializerFor(k),m=!i&&k.typeKey===e,n=h.call(c[f],function(a){return l.normalize(k,a,f)},this);m?d=n:a.pushMany(j,n)}return d},pushPayload:function(a,b){b=this.normalizePayload(b);for(var c in b){var d=this.typeForRoot(c),e=a.modelFor(d),f=a.serializerFor(e),g=h.call(Ember.makeArray(b[c]),function(a){return f.normalize(e,a,c)},this);a.pushMany(d,g)}},typeForRoot:function(a){return j(i(a))},serialize:function(){return this._super.apply(this,arguments)},serializeIntoHash:function(a,b,c,d){a[b.typeKey]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,e=f(a,d);d=this.keyForAttribute?this.keyForAttribute(d):d,b[d+"Type"]=e.constructor.typeKey}});c["default"]=k}),b("ember-data/lib/setup-container",["./initializers/store","./initializers/transforms","./initializers/store_injections","./initializers/data_adapter","../../../activemodel-adapter/lib/setup-container","exports"],function(a,b,c,d,e,f){"use strict";var g=a["default"],h=b["default"],i=c["default"],j=d["default"],k=e["default"];f["default"]=function(a,b){j(a,b),h(a,b),i(a,b),g(a,b),k(a,b)}}),b("ember-data/lib/system/adapter",["exports"],function(a){"use strict";var b=Ember.get,c=(Ember.set,Ember.ArrayPolyfills.map),d=["description","fileName","lineNumber","message","name","number","stack"],e=function(a){var b=Error.prototype.constructor.call(this,"The backend rejected the commit because it was invalid: "+Ember.inspect(a));this.errors=a;for(var c=0,e=d.length;e>c;c++)this[d[c]]=b[d[c]]};e.prototype=Ember.create(Error.prototype);var f=Ember.Object.extend({find:Ember.required(Function),findAll:null,findQuery:null,generateIdForRecord:null,serialize:function(a,c){return b(a,"store").serializerFor(a.constructor.typeKey).serialize(a,c)},createRecord:Ember.required(Function),updateRecord:Ember.required(Function),deleteRecord:Ember.required(Function),findMany:function(a,b,d){var e=c.call(d,function(c){return this.find(a,b,c)},this);return Ember.RSVP.all(e)}});a.InvalidError=e,a.Adapter=f,a["default"]=f}),b("ember-data/lib/system/changes",["./changes/relationship_change","exports"],function(a,b){"use strict";var c=a.RelationshipChange,d=a.RelationshipChangeAdd,e=a.RelationshipChangeRemove,f=a.OneToManyChange,g=a.ManyToNoneChange,h=a.OneToOneChange,i=a.ManyToManyChange;b.RelationshipChange=c,b.RelationshipChangeAdd=d,b.RelationshipChangeRemove=e,b.OneToManyChange=f,b.ManyToNoneChange=g,b.OneToOneChange=h,b.ManyToManyChange=i}),b("ember-data/lib/system/changes/relationship_change",["../model","exports"],function(a,b){"use strict";function c(a){return"object"==typeof a&&(!a.then||"function"!=typeof a.then)}var d=a.Model,e=Ember.get,f=Ember.set,g=Ember.EnumerableUtils.forEach,h=function(a){this.parentRecord=a.parentRecord,this.childRecord=a.childRecord,this.firstRecord=a.firstRecord,this.firstRecordKind=a.firstRecordKind,this.firstRecordName=a.firstRecordName,this.secondRecord=a.secondRecord,this.secondRecordKind=a.secondRecordKind,this.secondRecordName=a.secondRecordName,this.changeType=a.changeType,this.store=a.store,this.committed={}},i=function(a){h.call(this,a)},j=function(a){h.call(this,a)};h.create=function(a){return new h(a)},i.create=function(a){return new i(a)},j.create=function(a){return new j(a)};var k={},l={},m={},n={},o={};h._createChange=function(a){return"add"===a.changeType?i.create(a):"remove"===a.changeType?j.create(a):void 0},h.determineRelationshipType=function(a,b){var c,d,e=b.key,f=b.kind,g=a.inverseFor(e);return g&&(c=g.name,d=g.kind),g?"belongsTo"===d?"belongsTo"===f?"oneToOne":"manyToOne":"belongsTo"===f?"oneToMany":"manyToMany":"belongsTo"===f?"oneToNone":"manyToNone"},h.createChange=function(a,b,c,d){var e,f=a.constructor;return e=h.determineRelationshipType(f,d),"oneToMany"===e?k.createChange(a,b,c,d):"manyToOne"===e?k.createChange(b,a,c,d):"oneToNone"===e?l.createChange(a,b,c,d):"manyToNone"===e?m.createChange(a,b,c,d):"oneToOne"===e?n.createChange(a,b,c,d):"manyToMany"===e?o.createChange(a,b,c,d):void 0},l.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,store:c,changeType:d.changeType,firstRecordName:e,firstRecordKind:"belongsTo"});return c.addRelationshipChangeFor(a,e,b,null,f),f},m.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:a,childRecord:b,secondRecord:a,store:c,changeType:d.changeType,secondRecordName:d.key,secondRecordKind:"hasMany"});return c.addRelationshipChangeFor(a,e,b,null,f),f},o.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"hasMany",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.createChange=function(a,b,c,d){var e;d.parentType?e=d.parentType.inverseFor(d.key).name:d.key&&(e=d.key);var f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"belongsTo",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&b.recordIsMaterialized(c)){var f=e(c,d);if(f){var g=n.createChange(c,f,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,null,g),g.sync()}}},k.createChange=function(a,b,c,d){var e;d.parentType?(e=d.parentType.inverseFor(d.key).name,k.maintainInvariant(d,c,a,e)):d.key&&(e=d.key);var f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,f.getSecondRecordName(),f),f},k.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&c){var f=e(c,d);if(f){var g=k.createChange(c,f,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,g.getSecondRecordName(),g),g.sync()}}},h.prototype={getSecondRecordName:function(){var a,b=this.secondRecordName;if(!b){if(a=this.secondRecord,!a)return;var c=this.firstRecord.constructor,d=c.inverseFor(this.firstRecordName);this.secondRecordName=d.name}return this.secondRecordName},getFirstRecordName:function(){var a=this.firstRecordName;return a},destroy:function(){var a=this.childRecord,b=this.getFirstRecordName(),c=this.getSecondRecordName(),d=this.store;d.removeRelationshipChangeFor(a,b,this.parentRecord,c,this.changeType)},getSecondRecord:function(){return this.secondRecord},getFirstRecord:function(){return this.firstRecord},coalesce:function(){var a=this.store.relationshipChangePairsFor(this.firstRecord);g(a,function(a){var b=a.add,c=a.remove;b&&c&&(b.destroy(),c.destroy())})}},i.prototype=Ember.create(h.create({})),j.prototype=Ember.create(h.create({})),i.prototype.changeType="add",i.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),g=this.getFirstRecord(),h=this.getSecondRecord();h instanceof d&&g instanceof d&&("belongsTo"===this.secondRecordKind?h.suspendRelationshipObservers(function(){f(h,a,g)}):"hasMany"===this.secondRecordKind&&h.suspendRelationshipObservers(function(){var b=e(h,a);c(b)&&b.addObject(g)})),g instanceof d&&h instanceof d&&e(g,b)!==h&&("belongsTo"===this.firstRecordKind?g.suspendRelationshipObservers(function(){f(g,b,h)}):"hasMany"===this.firstRecordKind&&g.suspendRelationshipObservers(function(){var a=e(g,b);c(a)&&a.addObject(h)})),this.coalesce()},j.prototype.changeType="remove",j.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),g=this.getFirstRecord(),h=this.getSecondRecord();h instanceof d&&g instanceof d&&("belongsTo"===this.secondRecordKind?h.suspendRelationshipObservers(function(){f(h,a,null)}):"hasMany"===this.secondRecordKind&&h.suspendRelationshipObservers(function(){var b=e(h,a);c(b)&&b.removeObject(g)})),g instanceof d&&e(g,b)&&("belongsTo"===this.firstRecordKind?g.suspendRelationshipObservers(function(){f(g,b,null)}):"hasMany"===this.firstRecordKind&&g.suspendRelationshipObservers(function(){var a=e(g,b);c(a)&&a.removeObject(h)})),this.coalesce()},b.RelationshipChange=h,b.RelationshipChangeAdd=i,b.RelationshipChangeRemove=j,b.OneToManyChange=k,b.ManyToNoneChange=m,b.OneToOneChange=n,b.ManyToManyChange=o}),b("ember-data/lib/system/container_proxy",["exports"],function(a){"use strict";var b=function(a){this.container=a};b.prototype.aliasedFactory=function(a,b){var c=this;return{create:function(){return b&&b(),c.container.lookup(a)}}},b.prototype.registerAlias=function(a,b,c){var d=this.aliasedFactory(b,c);return this.container.register(a,d)},b.prototype.registerDeprecation=function(a,b){var c=function(){};return this.registerAlias(a,b,c)},b.prototype.registerDeprecations=function(a){for(var b=a.length;b>0;b--){var c=a[b-1],d=c.deprecated,e=c.valid;this.registerDeprecation(d,e)}},a["default"]=b}),b("ember-data/lib/system/debug",["./debug/debug_info","./debug/debug_adapter","exports"],function(a,b,c){"use strict";var d=b["default"];c["default"]=d}),b("ember-data/lib/system/debug/debug_adapter",["../model","exports"],function(a,b){"use strict";var c=a.Model,d=Ember.get,e=Ember.String.capitalize,f=Ember.String.underscore,g=Ember.DataAdapter.extend({getFilters:function(){return[{name:"isNew",desc:"New"},{name:"isModified",desc:"Modified"},{name:"isClean",desc:"Clean"}]},detect:function(a){return a!==c&&c.detect(a)},columnsForType:function(a){var b=[{name:"id",desc:"Id"}],c=0,g=this;return d(a,"attributes").forEach(function(a){if(c++>g.attributeLimit)return!1;var d=e(f(a).replace("_"," "));b.push({name:a,desc:d})}),b},getRecords:function(a){return this.get("store").all(a)},getRecordColumnValues:function(a){var b=this,c=0,e={id:d(a,"id")};return a.eachAttribute(function(f){if(c++>b.attributeLimit)return!1;var g=d(a,f);e[f]=g}),e},getRecordKeywords:function(a){var b=[],c=Ember.A(["id"]);return a.eachAttribute(function(a){c.push(a)}),c.forEach(function(c){b.push(d(a,c))}),b},getRecordFilterValues:function(a){return{isNew:a.get("isNew"),isModified:a.get("isDirty")&&!a.get("isNew"),isClean:!a.get("isDirty")}},getRecordColor:function(a){var b="black";return a.get("isNew")?b="green":a.get("isDirty")&&(b="blue"),b},observeRecord:function(a,b){var c=Ember.A(),d=this,e=Ember.A(["id","isNew","isDirty"]);a.eachAttribute(function(a){e.push(a)}),e.forEach(function(e){var f=function(){b(d.wrapRecord(a))};Ember.addObserver(a,e,f),c.push(function(){Ember.removeObserver(a,e,f)})});var f=function(){c.forEach(function(a){a()})};return f}});b["default"]=g}),b("ember-data/lib/system/debug/debug_info",["../model","exports"],function(a,b){"use strict";var c=a.Model;c.reopen({_debugInfo:function(){var a=["id"],b={belongsTo:[],hasMany:[]},c=[];
|
9
|
+
this.eachAttribute(function(b){a.push(b)},this),this.eachRelationship(function(a,d){b[d.kind].push(a),c.push(a)});var d=[{name:"Attributes",properties:a,expand:!0},{name:"Belongs To",properties:b.belongsTo,expand:!0},{name:"Has Many",properties:b.hasMany,expand:!0},{name:"Flags",properties:["isLoaded","isDirty","isSaving","isDeleted","isError","isNew","isValid"]}];return{propertyInfo:{includeOtherProperties:!0,groups:d,expensiveProperties:c}}}}),b["default"]=c}),b("ember-data/lib/system/model",["./model/model","./model/attributes","./model/states","./model/errors","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.Model=f,e.RootState=h,e.attr=g,e.Errors=i}),b("ember-data/lib/system/model/attributes",["./model","exports"],function(a,b){"use strict";function c(a,b){return"function"==typeof b.defaultValue?b.defaultValue.apply(null,arguments):b.defaultValue}function d(a,b){return a._attributes.hasOwnProperty(b)||a._inFlightAttributes.hasOwnProperty(b)||a._data.hasOwnProperty(b)}function e(a,b){return a._attributes.hasOwnProperty(b)?a._attributes[b]:a._inFlightAttributes.hasOwnProperty(b)?a._inFlightAttributes[b]:a._data[b]}function f(a,b){b=b||{};var f={type:a,isAttribute:!0,options:b};return Ember.computed("data",function(a,f){if(arguments.length>1){var g=e(this,a);return f!==g&&(this._attributes[a]=f,this.send("didSetProperty",{name:a,oldValue:g,originalValue:this._data[a],value:f})),f}return d(this,a)?e(this,a):c(this,b,a)}).meta(f)}var g=a["default"],h=Ember.get;g.reopenClass({attributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isAttribute&&(c.name=b,a.set(b,c))}),a}),transformedAttributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachAttribute(function(b,c){c.type&&a.set(b,c.type)}),a}),eachAttribute:function(a,b){h(this,"attributes").forEach(function(c,d){a.call(b,c,d)},b)},eachTransformedAttribute:function(a,b){h(this,"transformedAttributes").forEach(function(c,d){a.call(b,c,d)})}}),g.reopen({eachAttribute:function(a,b){this.constructor.eachAttribute(a,b)}}),b["default"]=f}),b("ember-data/lib/system/model/errors",["exports"],function(a){"use strict";var b=Ember.get,c=Ember.isEmpty,d=Ember.EnumerableUtils.map,e=Ember.Object.extend(Ember.Enumerable,Ember.Evented,{registerHandlers:function(a,b,c){this.on("becameInvalid",a,b),this.on("becameValid",a,c)},errorsByAttributeName:Ember.reduceComputed("content",{initialValue:function(){return Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}})},addedItem:function(a,b){return a.get(b.attribute).pushObject(b),a},removedItem:function(a,b){return a.get(b.attribute).removeObject(b),a}}),errorsFor:function(a){return b(this,"errorsByAttributeName").get(a)},messages:Ember.computed.mapBy("content","message"),content:Ember.computed(function(){return Ember.A()}),unknownProperty:function(a){var b=this.errorsFor(a);return c(b)?null:b},nextObject:function(a){return b(this,"content").objectAt(a)},length:Ember.computed.oneWay("content.length").readOnly(),isEmpty:Ember.computed.not("length").readOnly(),add:function(a,c){var d=b(this,"isEmpty");c=this._findOrCreateMessages(a,c),b(this,"content").addObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),d&&!b(this,"isEmpty")&&this.trigger("becameInvalid")},_findOrCreateMessages:function(a,b){var c=this.errorsFor(a);return d(Ember.makeArray(b),function(b){return c.findBy("message",b)||{attribute:a,message:b}})},remove:function(a){if(!b(this,"isEmpty")){var c=b(this,"content").rejectBy("attribute",a);b(this,"content").setObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),b(this,"isEmpty")&&this.trigger("becameValid")}},clear:function(){b(this,"isEmpty")||(b(this,"content").clear(),this.enumerableContentDidChange(),this.trigger("becameValid"))},has:function(a){return!c(this.errorsFor(a))}});a["default"]=e}),b("ember-data/lib/system/model/model",["./states","./errors","../store","exports"],function(a,b,d,e){"use strict";var f,g=a["default"],h=b["default"],i=d.PromiseObject,j=Ember.get,k=Ember.set,l=Ember.merge,m=Ember.RSVP.Promise,n=Ember.computed("currentState",function(a){return j(j(this,"currentState"),a)}).readOnly(),o=Ember.Object.extend(Ember.Evented,{_recordArrays:void 0,_relationships:void 0,_loadingRecordArrays:void 0,isEmpty:n,isLoading:n,isLoaded:n,isDirty:n,isSaving:n,isDeleted:n,isNew:n,isValid:n,dirtyType:n,isError:!1,isReloading:!1,clientId:null,id:null,currentState:g.empty,errors:Ember.computed(function(){var a=h.create();return a.registerHandlers(this,function(){this.send("becameInvalid")},function(){this.send("becameValid")}),a}).readOnly(),serialize:function(a){var b=j(this,"store");return b.serialize(this,a)},toJSON:function(a){f||(f=c("ember-data/lib/serializers/json_serializer")["default"]);var b=f.create({container:this.container});return b.serialize(this,a)},didLoad:Ember.K,didUpdate:Ember.K,didCreate:Ember.K,didDelete:Ember.K,becameInvalid:Ember.K,becameError:Ember.K,data:Ember.computed(function(){return this._data=this._data||{},this._data}).readOnly(),_data:null,init:function(){this._super(),this._setup()},_setup:function(){this._changesToSync={},this._deferredTriggers=[],this._data={},this._attributes={},this._inFlightAttributes={},this._relationships={}},send:function(a,b){var c=j(this,"currentState");return c[a]||this._unhandledEvent(c,a,b),c[a](this,b)},transitionTo:function(a){var b=a.split(".",1),c=j(this,"currentState"),d=c;do d.exit&&d.exit(this),d=d.parentState;while(!d.hasOwnProperty(b));var e,f,g=a.split("."),h=[],i=[];for(e=0,f=g.length;f>e;e++)d=d[g[e]],d.enter&&i.push(d),d.setup&&h.push(d);for(e=0,f=i.length;f>e;e++)i[e].enter(this);for(k(this,"currentState",d),e=0,f=h.length;f>e;e++)h[e].setup(this);this.updateRecordArraysLater()},_unhandledEvent:function(a,b,c){var d="Attempted to handle event `"+b+"` ";throw d+="on "+String(this)+" while in state ",d+=a.stateName+". ",void 0!==c&&(d+="Called with "+Ember.inspect(c)+"."),new Ember.Error(d)},withTransaction:function(a){var b=j(this,"transaction");b&&a(b)},loadingData:function(a){this.send("loadingData",a)},loadedData:function(){this.send("loadedData")},notFound:function(){this.send("notFound")},pushedData:function(){this.send("pushedData")},deleteRecord:function(){this.send("deleteRecord")},destroyRecord:function(){return this.deleteRecord(),this.save()},unloadRecord:function(){this.isDestroyed||this.send("unloadRecord")},clearRelationships:function(){this.eachRelationship(function(a,b){if("belongsTo"===b.kind)k(this,a,null);else if("hasMany"===b.kind){var c=this._relationships[a];c&&c.destroy()}},this)},updateRecordArrays:function(){this._updatingRecordArraysLater=!1,j(this,"store").dataWasUpdated(this.constructor,this)},changedAttributes:function(){var a,b=j(this,"_data"),c=j(this,"_attributes"),d={};for(a in c)d[a]=[b[a],c[a]];return d},adapterWillCommit:function(){this.send("willCommit")},adapterDidCommit:function(a){k(this,"isError",!1),a?this._data=a:Ember.mixin(this._data,this._inFlightAttributes),this._inFlightAttributes={},this.send("didCommit"),this.updateRecordArraysLater(),a&&this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},adapterDidDirty:function(){this.send("becomeDirty"),this.updateRecordArraysLater()},dataDidChange:Ember.observer(function(){this.reloadHasManys()},"data"),reloadHasManys:function(){var a=j(this.constructor,"relationshipsByName");this.updateRecordArraysLater(),a.forEach(function(a,b){this._data.links&&this._data.links[a]||"hasMany"===b.kind&&this.hasManyDidChange(b.key)},this)},hasManyDidChange:function(a){var b=this._relationships[a];if(b){var c=this._data[a]||[];k(b,"content",Ember.A(c)),k(b,"isLoaded",!0),b.trigger("didLoad")}},updateRecordArraysLater:function(){this._updatingRecordArraysLater||(this._updatingRecordArraysLater=!0,Ember.run.schedule("actions",this,this.updateRecordArrays))},setupData:function(a,b){b?Ember.merge(this._data,a):this._data=a;var c=this._relationships;this.eachRelationship(function(b,d){a.links&&a.links[b]||d.options.async&&(c[b]=null)}),a&&this.pushedData(),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},materializeId:function(a){k(this,"id",a)},materializeAttributes:function(a){l(this._data,a)},materializeAttribute:function(a,b){this._data[a]=b},updateHasMany:function(a,b){this._data[a]=b,this.hasManyDidChange(a)},updateBelongsTo:function(a,b){this._data[a]=b},rollback:function(){this._attributes={},j(this,"isError")&&(this._inFlightAttributes={},k(this,"isError",!1)),j(this,"isValid")||(this._inFlightAttributes={}),this.send("rolledBack"),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},toStringExtension:function(){return j(this,"id")},suspendRelationshipObservers:function(a,b){var c=j(this.constructor,"relationshipNames").belongsTo,d=this;try{this._suspendedRelationships=!0,Ember._suspendObservers(d,c,null,"belongsToDidChange",function(){Ember._suspendBeforeObservers(d,c,null,"belongsToWillChange",function(){a.call(b||d)})})}finally{this._suspendedRelationships=!1}},save:function(){var a="DS: Model#save "+this,b=Ember.RSVP.defer(a);return this.get("store").scheduleSave(this,b),this._inFlightAttributes=this._attributes,this._attributes={},i.create({promise:b.promise})},reload:function(){k(this,"isReloading",!0);var a=this,b="DS: Model#reload of "+this,c=new m(function(b){a.send("reloadRecord",b)},b).then(function(){return a.set("isReloading",!1),a.set("isError",!1),a},function(b){throw a.set("isError",!0),b},"DS: Model#reload complete, update flags");return i.create({promise:c})},adapterDidUpdateAttribute:function(a,b){void 0!==b?(this._data[a]=b,this.notifyPropertyChange(a)):this._data[a]=this._inFlightAttributes[a],this.updateRecordArraysLater()},adapterDidInvalidate:function(a){function b(b){a[b]&&c.add(b,a[b])}var c=j(this,"errors");this.eachAttribute(b),this.eachRelationship(b)},adapterDidError:function(){this.send("becameError"),k(this,"isError",!0)},trigger:function(a){Ember.tryInvoke(this,a,[].slice.call(arguments,1)),this._super.apply(this,arguments)},triggerLater:function(){1===this._deferredTriggers.push(arguments)&&Ember.run.schedule("actions",this,"_triggerDeferredTriggers")},_triggerDeferredTriggers:function(){for(var a=0,b=this._deferredTriggers.length;b>a;a++)this.trigger.apply(this,this._deferredTriggers[a]);this._deferredTriggers.length=0},willDestroy:function(){this._super(),this.clearRelationships()}});o.reopenClass({_create:o.create,create:function(){throw new Ember.Error("You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.")}}),e["default"]=o}),b("ember-data/lib/system/model/states",["exports"],function(a){"use strict";function b(a,b){b.value===b.originalValue?(delete a._attributes[b.name],a.send("propertyWasReset",b.name)):b.value!==b.oldValue&&a.send("becomeDirty"),a.updateRecordArraysLater()}function c(a){var b,d={};for(var e in a)b=a[e],d[e]=b&&"object"==typeof b?c(b):b;return d}function d(a,b){for(var c in b)a[c]=b[c];return a}function e(a){var b=c(j);return d(b,a)}function f(){}function g(a,b,c){a=d(b?Ember.create(b):{},a),a.parentState=b,a.stateName=c;for(var e in a)a.hasOwnProperty(e)&&"parentState"!==e&&"stateName"!==e&&"object"==typeof a[e]&&(a[e]=g(a[e],a,c+"."+e));return a}var h=Ember.get,i=Ember.set,j={initialState:"uncommitted",isDirty:!0,uncommitted:{didSetProperty:b,propertyWasReset:function(a){var b=!1;for(var c in a._attributes){b=!0;break}b||a.send("rolledBack")},pushedData:Ember.K,becomeDirty:Ember.K,willCommit:function(a){a.transitionTo("inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},rolledBack:function(a){a.transitionTo("loaded.saved")},becameInvalid:function(a){a.transitionTo("invalid")},rollback:function(a){a.rollback()}},inFlight:{isSaving:!0,didSetProperty:b,becomeDirty:Ember.K,pushedData:Ember.K,unloadRecord:function(){},willCommit:Ember.K,didCommit:function(a){var b=h(this,"dirtyType");a.transitionTo("saved"),a.send("invokeLifecycleCallbacks",b)},becameInvalid:function(a){a.transitionTo("invalid"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},invalid:{isValid:!1,deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},didSetProperty:function(a,c){h(a,"errors").remove(c.name),b(a,c)},becomeDirty:Ember.K,willCommit:function(a){h(a,"errors").clear(),a.transitionTo("inFlight")},rolledBack:function(a){h(a,"errors").clear()},becameValid:function(a){a.transitionTo("uncommitted")},invokeLifecycleCallbacks:function(a){a.triggerLater("becameInvalid",a)},exit:function(a){a._inFlightAttributes={}}}},k=e({dirtyType:"created",isNew:!0});k.uncommitted.rolledBack=function(a){a.transitionTo("deleted.saved")};var l=e({dirtyType:"updated"});k.uncommitted.deleteRecord=function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},k.uncommitted.rollback=function(a){j.uncommitted.rollback.apply(this,arguments),a.transitionTo("deleted.saved")},k.uncommitted.propertyWasReset=Ember.K,l.inFlight.unloadRecord=f,l.uncommitted.deleteRecord=function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()};var m={isEmpty:!1,isLoading:!1,isLoaded:!1,isDirty:!1,isSaving:!1,isDeleted:!1,isNew:!1,isValid:!0,rolledBack:Ember.K,unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},propertyWasReset:Ember.K,empty:{isEmpty:!0,loadingData:function(a,b){a._loadingPromise=b,a.transitionTo("loading")},loadedData:function(a){a.transitionTo("loaded.created.uncommitted"),a.suspendRelationshipObservers(function(){a.notifyPropertyChange("data")})},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad")}},loading:{isLoading:!0,exit:function(a){a._loadingPromise=null},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad"),i(a,"isError",!1)},becameError:function(a){a.triggerLater("becameError",a)},notFound:function(a){a.transitionTo("empty")}},loaded:{initialState:"saved",isLoaded:!0,saved:{setup:function(a){var b=a._attributes,c=!1;for(var d in b)if(b.hasOwnProperty(d)){c=!0;break}c&&a.adapterDidDirty()},didSetProperty:b,pushedData:Ember.K,becomeDirty:function(a){a.transitionTo("updated.uncommitted")},willCommit:function(a){a.transitionTo("updated.inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},didCommit:function(a){a.send("invokeLifecycleCallbacks",h(a,"lastDirtyType"))},notFound:Ember.K},created:k,updated:l},deleted:{initialState:"uncommitted",dirtyType:"deleted",isDeleted:!0,isLoaded:!0,isDirty:!0,setup:function(a){a.updateRecordArrays()},uncommitted:{willCommit:function(a){a.transitionTo("inFlight")},rollback:function(a){a.rollback()},becomeDirty:Ember.K,deleteRecord:Ember.K,rolledBack:function(a){a.transitionTo("loaded.saved")}},inFlight:{isSaving:!0,unloadRecord:f,willCommit:Ember.K,didCommit:function(a){a.transitionTo("saved"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},saved:{isDirty:!1,setup:function(a){var b=h(a,"store");b.dematerializeRecord(a)},invokeLifecycleCallbacks:function(a){a.triggerLater("didDelete",a),a.triggerLater("didCommit",a)},willCommit:Ember.K,didCommit:Ember.K}},invokeLifecycleCallbacks:function(a,b){"created"===b?a.triggerLater("didCreate",a):a.triggerLater("didUpdate",a),a.triggerLater("didCommit",a)}};m=g(m,null,"root"),a["default"]=m}),b("ember-data/lib/system/record_array_manager",["./record_arrays","exports"],function(a,b){"use strict";function c(a){for(var b=[],c=Ember.keys(a),d=0;d<c.length;d++)b.push(a[c[d]]);return b}function d(a){a.destroy()}function e(a){for(var b=a.length,c=Ember.A(),d=0;b>d;d++)c=c.concat(a[d]);return c}var f=a.RecordArray,g=a.FilteredRecordArray,h=a.AdapterPopulatedRecordArray,i=a.ManyArray,j=Ember.get,k=(Ember.set,Ember.EnumerableUtils.forEach),l=Ember.Object.extend({init:function(){this.filteredRecordArrays=Ember.MapWithDefault.create({defaultValue:function(){return[]}}),this.changedRecords=[],this._adapterPopulatedRecordArrays=[]},recordDidChange:function(a){1===this.changedRecords.push(a)&&Ember.run.schedule("actions",this,this.updateRecordArrays)},recordArraysForRecord:function(a){return a._recordArrays=a._recordArrays||Ember.OrderedSet.create(),a._recordArrays},updateRecordArrays:function(){k(this.changedRecords,function(a){j(a,"isDeleted")?this._recordWasDeleted(a):this._recordWasChanged(a)},this),this.changedRecords.length=0},_recordWasDeleted:function(a){var b=a._recordArrays;b&&k(b,function(b){b.removeRecord(a)})},_recordWasChanged:function(a){var b,c=a.constructor,d=this.filteredRecordArrays.get(c);k(d,function(d){b=j(d,"filterFunction"),this.updateRecordArray(d,b,c,a)},this);var e=a._loadingRecordArrays;if(e){for(var f=0,g=e.length;g>f;f++)e[f].loadedRecord();a._loadingRecordArrays=[]}},updateRecordArray:function(a,b,c,d){var e;e=b?b(d):!0;var f=this.recordArraysForRecord(d);e?(f.add(a),a.addRecord(d)):e||(f.remove(a),a.removeRecord(d))},updateFilter:function(a,b,c){for(var d,e=this.store.typeMapFor(b),f=e.records,g=0,h=f.length;h>g;g++)d=f[g],j(d,"isDeleted")||j(d,"isEmpty")||this.updateRecordArray(a,c,b,d)},createManyArray:function(a,b){var c=i.create({type:a,content:b,store:this.store});return k(b,function(a){var b=this.recordArraysForRecord(a);b.add(c)},this),c},createRecordArray:function(a){var b=f.create({type:a,content:Ember.A(),store:this.store,isLoaded:!0});return this.registerFilteredRecordArray(b,a),b},createFilteredRecordArray:function(a,b,c){var d=g.create({query:c,type:a,content:Ember.A(),store:this.store,manager:this,filterFunction:b});return this.registerFilteredRecordArray(d,a,b),d},createAdapterPopulatedRecordArray:function(a,b){var c=h.create({type:a,query:b,content:Ember.A(),store:this.store,manager:this});return this._adapterPopulatedRecordArrays.push(c),c},registerFilteredRecordArray:function(a,b,c){var d=this.filteredRecordArrays.get(b);d.push(a),this.updateFilter(a,b,c)},registerWaitingRecordArray:function(a,b){var c=a._loadingRecordArrays||[];c.push(b),a._loadingRecordArrays=c},willDestroy:function(){this._super(),k(e(c(this.filteredRecordArrays.values)),d),k(this._adapterPopulatedRecordArrays,d)}});b["default"]=l}),b("ember-data/lib/system/record_arrays",["./record_arrays/record_array","./record_arrays/filtered_record_array","./record_arrays/adapter_populated_record_array","./record_arrays/many_array","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.RecordArray=f,e.FilteredRecordArray=g,e.AdapterPopulatedRecordArray=h,e.ManyArray=i}),b("ember-data/lib/system/record_arrays/adapter_populated_record_array",["./record_array","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=(Ember.set,c.extend({query:null,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a server query (on "+a+") is immutable.")},load:function(a){var b=d(this,"store"),c=d(this,"type"),e=b.pushMany(c,a),f=b.metadataFor(c);this.setProperties({content:Ember.A(e),isLoaded:!0,meta:Ember.copy(f)}),e.forEach(function(a){this.manager.recordArraysForRecord(a).add(this)},this),Ember.run.once(this,"trigger","didLoad")}}));b["default"]=e}),b("ember-data/lib/system/record_arrays/filtered_record_array",["./record_array","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=c.extend({filterFunction:null,isLoaded:!0,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a client-side filter (on "+a+") is immutable.")},_updateFilter:function(){var a=d(this,"manager");a.updateFilter(this,d(this,"type"),d(this,"filterFunction"))},updateFilter:Ember.observer(function(){Ember.run.once(this,this._updateFilter)},"filterFunction")});b["default"]=e}),b("ember-data/lib/system/record_arrays/many_array",["./record_array","../changes","exports"],function(a,b,c){"use strict";function d(a){a.sync()}var e=a["default"],f=b.RelationshipChange,g=Ember.get,h=Ember.set,i=Ember.EnumerableUtils.map,j=e.extend({init:function(){this._super.apply(this,arguments),this._changesToSync=Ember.OrderedSet.create()},name:null,owner:null,isPolymorphic:!1,isLoaded:!1,promise:null,loadingRecordsCount:function(a){this.loadingRecordsCount=a},loadedRecord:function(){this.loadingRecordsCount--,0===this.loadingRecordsCount&&(h(this,"isLoaded",!0),this.trigger("didLoad"))},fetch:function(){var a=g(this,"content"),b=g(this,"store"),c=g(this,"owner"),d=a.filterProperty("isEmpty",!0);b.fetchMany(d,c)},replaceContent:function(a,b,c){c=i(c,function(a){return a},this),this._super(a,b,c)},arrangedContentDidChange:function(){Ember.run.once(this,"fetch")},arrayContentWillChange:function(a,b){var c=g(this,"owner"),d=g(this,"name");if(!c._suspendedRelationships)for(var e=a;a+b>e;e++){var h=g(this,"content").objectAt(e),i=f.createChange(c,h,g(this,"store"),{parentType:c.constructor,changeType:"remove",kind:"hasMany",key:d});this._changesToSync.add(i)}return this._super.apply(this,arguments)},arrayContentDidChange:function(a,b,c){this._super.apply(this,arguments);var e=g(this,"owner"),h=g(this,"name"),i=g(this,"store");if(!e._suspendedRelationships){for(var j=a;a+c>j;j++){var k=g(this,"content").objectAt(j),l=f.createChange(e,k,i,{parentType:e.constructor,changeType:"add",kind:"hasMany",key:h});l.hasManyName=h,this._changesToSync.add(l)}this._changesToSync.forEach(d),this._changesToSync.clear()}},createRecord:function(a){var b,c=g(this,"owner"),d=g(c,"store"),e=g(this,"type");return b=d.createRecord.call(d,e,a),this.pushObject(b),b}});c["default"]=j}),b("ember-data/lib/system/record_arrays/record_array",["../store","exports"],function(a,b){"use strict";var c=a.PromiseArray,d=Ember.get,e=(Ember.set,Ember.ArrayProxy.extend(Ember.Evented,{type:null,content:null,isLoaded:!1,isUpdating:!1,store:null,objectAtContent:function(a){var b=d(this,"content");return b.objectAt(a)},update:function(){if(!d(this,"isUpdating")){var a=d(this,"store"),b=d(this,"type");return a.fetchAll(b,this)}},addRecord:function(a){d(this,"content").addObject(a)},removeRecord:function(a){d(this,"content").removeObject(a)},save:function(){var a="DS: RecordArray#save "+d(this,"type"),b=Ember.RSVP.all(this.invoke("save"),a).then(function(a){return Ember.A(a)},null,"DS: RecordArray#save apply Ember.NativeArray");return c.create({promise:b})},_dissociateFromOwnRecords:function(){var a=this;this.forEach(function(b){var c=b._recordArrays;c&&c.remove(a)})},willDestroy:function(){this._dissociateFromOwnRecords(),this._super()}}));b["default"]=e}),b("ember-data/lib/system/relationship-meta",["../../../ember-inflector/lib/system","exports"],function(a,b){"use strict";function c(a,b){var c,d;return c=b.type||b.key,"string"==typeof c?("hasMany"===b.kind&&(c=e(c)),d=a.modelFor(c)):d=b.type,d}function d(a,b){return{key:b.key,kind:b.kind,type:c(a,b),options:b.options,parentType:b.parentType,isRelationship:!0}}var e=a.singularize;b.typeForRelationshipMeta=c,b.relationshipFromMeta=d}),b("ember-data/lib/system/relationships",["./relationships/belongs_to","./relationships/has_many","../system/relationships/ext","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"];d.belongsTo=e,d.hasMany=f}),b("ember-data/lib/system/relationships/belongs_to",["../model","../store","../changes","../relationship-meta","exports"],function(a,b,c,d,e){"use strict";function f(a,b,c){return Ember.computed("data",function(a,b){var d,e=h(this,"data"),f=h(this,"store"),g="DS: Async belongsTo "+this+" : "+a;if(c.key=a,2===arguments.length)return void 0===b?null:l.create({promise:j.cast(b,g)});var k=e.links&&e.links[a],m=e[a];return i(m)?k?(d=f.findBelongsTo(this,k,n(f,c)),l.create({promise:d})):null:(d=f.fetchRecord(m)||j.cast(m,g),l.create({promise:d}))}).meta(c)}function g(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c={type:a,isRelationship:!0,options:b,kind:"belongsTo",key:null};return b.async?f(a,b,c):Ember.computed("data",function(b,c){var d,e,f=h(this,"data"),g=h(this,"store");return e="string"==typeof a?g.modelFor(a):a,2===arguments.length?void 0===c?null:c:(d=f[b],i(d)?null:(g.fetchRecord(d),d))}).meta(c)}{var h=Ember.get,i=(Ember.set,Ember.isNone),j=Ember.RSVP.Promise,k=a.Model,l=b.PromiseObject,m=c.RelationshipChange,n=d.relationshipFromMeta;d.typeForRelationshipMeta}k.reopen({belongsToWillChange:Ember.beforeObserver(function(a,b){if(h(a,"isLoaded")){var c=h(a,b);if(c){var d=h(a,"store"),e=m.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"remove"});e.sync(),this._changesToSync[b]=e}}}),belongsToDidChange:Ember.immediateObserver(function(a,b){if(h(a,"isLoaded")){var c=h(a,b);if(c){var d=h(a,"store"),e=m.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"add"});e.sync()}}delete this._changesToSync[b]})}),e["default"]=g}),b("ember-data/lib/system/relationships/ext",["../../../../ember-inflector/lib/system","../relationship-meta","../model"],function(a,b,c){"use strict";{var d=(a.singularize,b.typeForRelationshipMeta),e=b.relationshipFromMeta,f=c.Model,g=Ember.get;Ember.set}f.reopen({didDefineProperty:function(a,b,c){if(c instanceof Ember.Descriptor){var d=c.meta();d.isRelationship&&"belongsTo"===d.kind&&(Ember.addObserver(a,b,null,"belongsToDidChange"),Ember.addBeforeObserver(a,b,null,"belongsToWillChange")),d.parentType=a.constructor}}}),f.reopenClass({typeForRelationship:function(a){var b=g(this,"relationshipsByName").get(a);return b&&b.type},inverseFor:function(a){function b(a,c,d){d=d||[];var e=g(c,"relationships");if(e){var f=e.get(a);return f&&d.push.apply(d,e.get(a)),a.superclass&&b(a.superclass,c,d),d}}var c=this.typeForRelationship(a);if(!c)return null;var d=this.metaForProperty(a).options;if(null===d.inverse)return null;var e,f;if(d.inverse)e=d.inverse,f=Ember.get(c,"relationshipsByName").get(e).kind;else{var h=b(this,c);if(0===h.length)return null;e=h[0].name,f=h[0].kind}return{type:c,name:e,kind:f}},relationships:Ember.computed(function(){var a=new Ember.MapWithDefault({defaultValue:function(){return[]}});return this.eachComputedProperty(function(b,c){if(c.isRelationship){c.key=b;var e=a.get(d(this.store,c));e.push({name:b,kind:c.kind})}}),a}).cacheable(!1),relationshipNames:Ember.computed(function(){var a={hasMany:[],belongsTo:[]};return this.eachComputedProperty(function(b,c){c.isRelationship&&a[c.kind].push(b)}),a}),relatedTypes:Ember.computed(function(){var a,b=Ember.A();return this.eachComputedProperty(function(c,e){e.isRelationship&&(e.key=c,a=d(this.store,e),b.contains(a)||b.push(a))}),b}).cacheable(!1),relationshipsByName:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){if(c.isRelationship){c.key=b;var f=e(this.store,c);f.type=d(this.store,c),a.set(b,f)}}),a}).cacheable(!1),fields:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isRelationship?a.set(b,c.kind):c.isAttribute&&a.set(b,"attribute")}),a}),eachRelationship:function(a,b){g(this,"relationshipsByName").forEach(function(c,d){a.call(b,c,d)})},eachRelatedType:function(a,b){g(this,"relatedTypes").forEach(function(c){a.call(b,c)})}}),f.reopen({eachRelationship:function(a,b){this.constructor.eachRelationship(a,b)}})}),b("ember-data/lib/system/relationships/has_many",["../store","../relationship-meta","exports"],function(a,b,c){"use strict";function d(a,b,c){return Ember.computed("data",function(a){var d=this._relationships[a],f="DS: Async hasMany "+this+" : "+a;if(c.key=a,!d){var g=Ember.RSVP.defer(f);d=e(this,a,b,function(b,d){var e,f=d.links&&d.links[a];return e=f?b.findHasMany(this,f,l(b,c),g):b.findMany(this,d[a],m(b,c),g),j(e,"promise",g.promise),e})}var i=d.get("promise").then(function(){return d},null,"DS: Async hasMany records received");return h.create({promise:i})}).meta(c).readOnly()}function e(a,b,c,d){var e=a._relationships;if(e[b])return e[b];var f=i(a,"data"),g=i(a,"store"),h=e[b]=d.call(a,g,f);return k(h,{owner:a,name:b,isPolymorphic:c.polymorphic})}function f(a,b){b=b||{};var c={type:a,isRelationship:!0,options:b,kind:"hasMany",key:null};return b.async?d(a,b,c):Ember.computed("data",function(a){return e(this,a,b,function(b,d){d[a];return b.findMany(this,d[a],m(b,c))})}).meta(c).readOnly()}function g(a,b){return"object"==typeof a&&(b=a,a=void 0),f(a,b)}var h=a.PromiseArray,i=Ember.get,j=Ember.set,k=Ember.setProperties,l=b.relationshipFromMeta,m=b.typeForRelationshipMeta;c["default"]=g}),b("ember-data/lib/system/store",["./adapter","ember-inflector/lib/system/string","exports"],function(a,b,d){"use strict";function e(a){return null==a?null:a+""}function f(a,b,c,d){return b.eachRelationship(function(b,e){if(c.links&&c.links[b])return void(d&&e.options.async&&(d._relationships[b]=null));var f=e.kind,h=c[b];null!=h&&("belongsTo"===f?g(a,c,b,e,h):"hasMany"===f&&(i(a,c,b,e,h),j(d,b,h)))}),c}function g(a,b,d,e,f){if(A||(A=c("ember-data/lib/system/model").Model),!(G(f)||f instanceof A)){var g;"number"==typeof f||"string"==typeof f?(g=h(e,d,b),b[d]=a.recordForId(g,f)):"object"==typeof f&&(b[d]=a.recordForId(f.type,f.id))}}function h(a,b,c){return a.options.polymorphic?c[b+"Type"]:a.type}function i(a,b,c,d,e){for(var f=0,h=e.length;h>f;f++)g(a,e,f,d,e[f])}function j(a,b,c){a&&Ember.A(c).pushObjects(a.get(b).filterBy("isNew"))}function k(a,b){return x.create({promise:K.cast(a,b)})}function l(a,b){return y.create({promise:K.cast(a,b)})}function m(a,b,c){return a.lookup("serializer:"+b)||a.lookup("serializer:application")||a.lookup("serializer:"+c)||a.lookup("serializer:-default")}function n(a){return a.lookup("serializer:application")||a.lookup("serializer:-default")}function o(a,b){var c=a.serializer,d=a.defaultSerializer,e=a.container;return e&&void 0===c&&(c=m(e,b.typeKey,d)),(null===c||void 0===c)&&(c={extract:function(a,b,c){return c}}),c}function p(a,b,c,d){var e=a.find(b,c,d),f=o(a,c),g="DS: Handle Adapter#find of "+c+" with id: "+d;return K.cast(e,g).then(function(a){var e=f.extract(b,c,a,d,"find");return b.push(c,e)},function(a){var e=b.getById(c,d);throw e.notFound(),a},"DS: Extract payload of '"+c+"'")}function q(a,b,c,d,e){var f=a.findMany(b,c,d,e),g=o(a,c),h="DS: Handle Adapter#findMany of "+c;return K.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findMany");b.pushMany(c,d)},null,"DS: Extract payload of "+c)}function r(a,b,c,d,e){var f=a.findHasMany(b,c,d,e),g=o(a,e.type),h="DS: Handle Adapter#findHasMany of "+c+" : "+e.type;return K.cast(f,h).then(function(a){var d=g.extract(b,e.type,a,null,"findHasMany"),f=b.pushMany(e.type,d);c.updateHasMany(e.key,f)},null,"DS: Extract payload of "+c+" : hasMany "+e.type)}function s(a,b,c,d,e){var f=a.findBelongsTo(b,c,d,e),g=o(a,e.type),h="DS: Handle Adapter#findBelongsTo of "+c+" : "+e.type;return K.cast(f,h).then(function(a){var c=g.extract(b,e.type,a,null,"findBelongsTo"),d=b.push(e.type,c);return d.updateBelongsTo(e.key,d),d},null,"DS: Extract payload of "+c+" : "+e.type)}function t(a,b,c,d){var e=a.findAll(b,c,d),f=o(a,c),g="DS: Handle Adapter#findAll of "+c;return K.cast(e,g).then(function(a){var d=f.extract(b,c,a,null,"findAll");return b.pushMany(c,d),b.didUpdateAll(c),b.all(c)},null,"DS: Extract payload of findAll "+c)}function u(a,b,c,d,e){var f=a.findQuery(b,c,d,e),g=o(a,c),h="DS: Handle Adapter#findQuery of "+c;return K.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findQuery");return e.load(d),e},null,"DS: Extract payload of findQuery "+c)}function v(a,b,c,d){var e=d.constructor,f=a[c](b,e,d),g=o(a,e),h="DS: Extract and notify about "+c+" completion of "+d;return f.then(function(a){var f;return f=a?g.extract(b,e,a,D(d,"id"),c):a,b.didSaveRecord(d,f),d},function(a){throw a instanceof B?b.recordWasInvalid(d,a.errors):b.recordWasError(d,a),a},h)}var w,x,y,z,A,B=a.InvalidError,C=(a.Adapter,b.singularize),D=Ember.get,E=Ember.set,F=Ember.run.once,G=Ember.isNone,H=Ember.EnumerableUtils.forEach,I=Ember.EnumerableUtils.indexOf,J=Ember.EnumerableUtils.map,K=Ember.RSVP.Promise,L=Ember.copy,M=Ember.String.camelize;
|
10
|
+
w=Ember.Object.extend({init:function(){z||(z=c("ember-data/lib/system/record_array_manager")["default"]),this.typeMaps={},this.recordArrayManager=z.create({store:this}),this._relationshipChanges={},this._pendingSave=[]},adapter:"-rest",serialize:function(a,b){return this.serializerFor(a.constructor.typeKey).serialize(a,b)},defaultAdapter:Ember.computed("adapter",function(){var a=D(this,"adapter");return"string"==typeof a&&(a=this.container.lookup("adapter:"+a)||this.container.lookup("adapter:application")||this.container.lookup("adapter:-rest")),DS.Adapter.detect(a)&&(a=a.create({container:this.container})),a}),createRecord:function(a,b){a=this.modelFor(a),b=L(b)||{},G(b.id)&&(b.id=this._generateId(a)),b.id=e(b.id);var c=this.buildRecord(a,b.id);return c.loadedData(),c.setProperties(b),c},_generateId:function(a){var b=this.adapterFor(a);return b&&b.generateIdForRecord?b.generateIdForRecord(this):null},deleteRecord:function(a){a.deleteRecord()},unloadRecord:function(a){a.unloadRecord()},find:function(a,b){return 1===arguments.length?this.findAll(a):"object"===Ember.typeOf(b)?this.findQuery(a,b):this.findById(a,e(b))},findById:function(a,b){a=this.modelFor(a);var c=this.recordForId(a,b),d=this.fetchRecord(c);return k(d||c,"DS: Store#findById "+a+" with id: "+b)},findByIds:function(a,b){var c=this;return l(Ember.RSVP.all(J(b,function(b){return c.findById(a,b)})).then(Ember.A,null,"DS: Store#findByIds of "+a+" complete"))},fetchRecord:function(a){if(G(a))return null;if(a._loadingPromise)return a._loadingPromise;if(!D(a,"isEmpty"))return null;var b=a.constructor,c=D(a,"id"),d=this.adapterFor(b),e=p(d,this,b,c);return a.loadingData(e),e},getById:function(a,b){return this.hasRecordForId(a,b)?this.recordForId(a,b):null},reloadRecord:function(a){var b=a.constructor,c=this.adapterFor(b),d=D(a,"id");return p(c,this,b,d)},fetchMany:function(a,b){if(!a.length)return Ember.RSVP.resolve(a);var c=Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}});H(a,function(a){c.get(a.constructor).push(a)});var d=[];return H(c,function(a,c){var e=c.mapProperty("id"),f=this.adapterFor(a);d.push(q(f,this,a,e,b))},this),Ember.RSVP.all(d)},hasRecordForId:function(a,b){return b=e(b),a=this.modelFor(a),!!this.typeMapFor(a).idToRecord[b]},recordForId:function(a,b){a=this.modelFor(a),b=e(b);var c=this.typeMapFor(a).idToRecord[b];return c||(c=this.buildRecord(a,b)),c},findMany:function(a,b,c,d){c=this.modelFor(c),b=Ember.A(b);var e=b.filterProperty("isEmpty",!0),f=this.recordArrayManager.createManyArray(c,b);return H(e,function(a){a.loadingData()}),f.loadingRecordsCount=e.length,e.length?(H(e,function(a){this.recordArrayManager.registerWaitingRecordArray(a,f)},this),d.resolve(this.fetchMany(e,a))):(d&&d.resolve(),f.set("isLoaded",!0),F(f,"trigger","didLoad")),f},findHasMany:function(a,b,c,d){var e=this.adapterFor(a.constructor),f=this.recordArrayManager.createManyArray(c.type,Ember.A([]));return d.resolve(r(e,this,a,b,c)),f},findBelongsTo:function(a,b,c){var d=this.adapterFor(a.constructor);return s(d,this,a,b,c)},findQuery:function(a,b){a=this.modelFor(a);var c=this.recordArrayManager.createAdapterPopulatedRecordArray(a,b),d=this.adapterFor(a);return l(u(d,this,a,b,c))},findAll:function(a){return a=this.modelFor(a),this.fetchAll(a,this.all(a))},fetchAll:function(a,b){var c=this.adapterFor(a),d=this.typeMapFor(a).metadata.since;return E(b,"isUpdating",!0),l(t(c,this,a,d))},didUpdateAll:function(a){var b=this.typeMapFor(a).findAllCache;E(b,"isUpdating",!1)},all:function(a){a=this.modelFor(a);var b=this.typeMapFor(a),c=b.findAllCache;if(c)return c;var d=this.recordArrayManager.createRecordArray(a);return b.findAllCache=d,d},unloadAll:function(a){for(var b,c=this.modelFor(a),d=this.typeMapFor(c),e=d.records.slice(),f=0;f<e.length;f++)b=e[f],b.unloadRecord(),b.destroy();d.findAllCache=null},filter:function(a,b,c){var d,e,f=arguments.length,g=3===f;return g?d=this.findQuery(a,b):2===arguments.length&&(c=b),a=this.modelFor(a),e=g?this.recordArrayManager.createFilteredRecordArray(a,c,b):this.recordArrayManager.createFilteredRecordArray(a,c),d=d||K.cast(e),l(d.then(function(){return e},null,"DS: Store#filter of "+a))},recordIsLoaded:function(a,b){return this.hasRecordForId(a,b)?!D(this.recordForId(a,b),"isEmpty"):!1},metadataFor:function(a){return a=this.modelFor(a),this.typeMapFor(a).metadata},dataWasUpdated:function(a,b){this.recordArrayManager.recordDidChange(b)},scheduleSave:function(a,b){a.adapterWillCommit(),this._pendingSave.push([a,b]),F(this,"flushPendingSave")},flushPendingSave:function(){var a=this._pendingSave.slice();this._pendingSave=[],H(a,function(a){var b,c=a[0],d=a[1],e=this.adapterFor(c.constructor);return"root.deleted.saved"===D(c,"currentState.stateName")?d.resolve(c):(b=D(c,"isNew")?"createRecord":D(c,"isDeleted")?"deleteRecord":"updateRecord",void d.resolve(v(e,this,b,c)))},this)},didSaveRecord:function(a,b){b&&(b=f(this,a.constructor,b,a),this.updateId(a,b)),a.adapterDidCommit(b)},recordWasInvalid:function(a,b){a.adapterDidInvalidate(b)},recordWasError:function(a){a.adapterDidError()},updateId:function(a,b){var c=(D(a,"id"),e(b.id));this.typeMapFor(a.constructor).idToRecord[c]=a,E(a,"id",c)},typeMapFor:function(a){var b,c=D(this,"typeMaps"),d=Ember.guidFor(a);return(b=c[d])?b:(b={idToRecord:{},records:[],metadata:{},type:a},c[d]=b,b)},_load:function(a,b,c){var d=e(b.id),f=this.recordForId(a,d);return f.setupData(b,c),this.recordArrayManager.recordDidChange(f),f},modelFor:function(a){var b;if("string"==typeof a){var c=this.container.normalize("model:"+a);if(b=this.container.lookupFactory(c),!b)throw new Ember.Error("No model was found for '"+a+"'");b.typeKey=this._normalizeTypeKey(c.split(":",2)[1])}else b=a,b.typeKey&&(b.typeKey=this._normalizeTypeKey(b.typeKey));return b.store=this,b},push:function(a,b,c){return a=this.modelFor(a),b=f(this,a,b),this._load(a,b,c),this.recordForId(a,b.id)},pushPayload:function(a,b){var c;b?c=this.serializerFor(a):(b=a,c=n(this.container)),c.pushPayload(this,b)},update:function(a,b){return this.push(a,b,!0)},pushMany:function(a,b){return J(b,function(b){return this.push(a,b)},this)},metaForType:function(a,b){a=this.modelFor(a),Ember.merge(this.typeMapFor(a).metadata,b)},buildRecord:function(a,b,c){var d=this.typeMapFor(a),e=d.idToRecord,f=a._create({id:b,store:this,container:this.container});return c&&f.setupData(c),b&&(e[b]=f),d.records.push(f),f},dematerializeRecord:function(a){var b=a.constructor,c=this.typeMapFor(b),d=D(a,"id");a.updateRecordArrays(),d&&delete c.idToRecord[d];var e=I(c.records,a);c.records.splice(e,1)},addRelationshipChangeFor:function(a,b,c,d,e){var f=a.clientId,g=c?c:c,h=b+d,i=this._relationshipChanges;f in i||(i[f]={}),g in i[f]||(i[f][g]={}),h in i[f][g]||(i[f][g][h]={}),i[f][g][h][e.changeType]=e},removeRelationshipChangeFor:function(a,b,c,d,e){var f=a.clientId,g=c?c.clientId:c,h=this._relationshipChanges,i=b+d;f in h&&g in h[f]&&i in h[f][g]&&delete h[f][g][i][e]},relationshipChangePairsFor:function(a){var b=[];if(!a)return b;var c=this._relationshipChanges[a.clientId];for(var d in c)if(c.hasOwnProperty(d))for(var e in c[d])c[d].hasOwnProperty(e)&&b.push(c[d][e]);return b},adapterFor:function(a){var b,c=this.container;return c&&(b=c.lookup("adapter:"+a.typeKey)||c.lookup("adapter:application")),b||D(this,"defaultAdapter")},serializerFor:function(a){a=this.modelFor(a);var b=this.adapterFor(a);return m(this.container,a.typeKey,b&&b.defaultSerializer)},willDestroy:function(){function a(a){return b[a].type}var b=this.typeMaps,c=Ember.keys(b),d=J(c,a);this.recordArrayManager.destroy(),H(d,this.unloadAll,this)},_normalizeTypeKey:function(a){return M(C(a))}}),y=Ember.ArrayProxy.extend(Ember.PromiseProxyMixin),x=Ember.ObjectProxy.extend(Ember.PromiseProxyMixin),d.Store=w,d.PromiseArray=y,d.PromiseObject=x,d["default"]=w}),b("ember-data/lib/transforms",["./transforms/base","./transforms/number","./transforms/date","./transforms/string","./transforms/boolean","exports"],function(a,b,c,d,e,f){"use strict";var g=a["default"],h=b["default"],i=c["default"],j=d["default"],k=e["default"];f.Transform=g,f.NumberTransform=h,f.DateTransform=i,f.StringTransform=j,f.BooleanTransform=k}),b("ember-data/lib/transforms/base",["exports"],function(a){"use strict";var b=Ember.Object.extend({serialize:Ember.required(),deserialize:Ember.required()});a["default"]=b}),b("ember-data/lib/transforms/boolean",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=c.extend({deserialize:function(a){var b=typeof a;return"boolean"===b?a:"string"===b?null!==a.match(/^true$|^t$|^1$/i):"number"===b?1===a:!1},serialize:function(a){return Boolean(a)}});b["default"]=d}),b("ember-data/lib/transforms/date",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=c.extend({deserialize:function(a){var b=typeof a;return"string"===b?new Date(Ember.Date.parse(a)):"number"===b?new Date(a):null===a||void 0===a?a:null},serialize:function(a){if(a instanceof Date){var b=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],d=function(a){return 10>a?"0"+a:""+a},e=a.getUTCFullYear(),f=a.getUTCMonth(),g=a.getUTCDate(),h=a.getUTCDay(),i=a.getUTCHours(),j=a.getUTCMinutes(),k=a.getUTCSeconds(),l=b[h],m=d(g),n=c[f];return l+", "+m+" "+n+" "+e+" "+d(i)+":"+d(j)+":"+d(k)+" GMT"}return null}});b["default"]=d}),b("ember-data/lib/transforms/number",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isEmpty,e=c.extend({deserialize:function(a){return d(a)?null:Number(a)},serialize:function(a){return d(a)?null:Number(a)}});b["default"]=e}),b("ember-data/lib/transforms/string",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isNone,e=c.extend({deserialize:function(a){return d(a)?null:String(a)},serialize:function(a){return d(a)?null:String(a)}});b["default"]=e}),b("ember-inflector/lib/ext/string",["../system/string"],function(a){"use strict";var b=a.pluralize,c=a.singularize;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)&&(String.prototype.pluralize=function(){return b(this)},String.prototype.singularize=function(){return c(this)})}),b("ember-inflector/lib/main",["./system","./ext/string","exports"],function(a,b,c){"use strict";var d=a.Inflector,e=a.defaultRules,f=a.pluralize,g=a.singularize;d.defaultRules=e,Ember.Inflector=d,Ember.String.pluralize=f,Ember.String.singularize=g,c["default"]=d,c.pluralize=f,c.singularize=g}),b("ember-inflector/lib/system",["./system/inflector","./system/string","./system/inflections","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b.pluralize,g=b.singularize,h=c["default"];e.inflector=new e(h),d.Inflector=e,d.singularize=g,d.pluralize=f,d.defaultRules=h}),b("ember-inflector/lib/system/inflections",["exports"],function(a){"use strict";var b={plurals:[[/$/,"s"],[/s$/i,"s"],[/^(ax|test)is$/i,"$1es"],[/(octop|vir)us$/i,"$1i"],[/(octop|vir)i$/i,"$1i"],[/(alias|status)$/i,"$1es"],[/(bu)s$/i,"$1ses"],[/(buffal|tomat)o$/i,"$1oes"],[/([ti])um$/i,"$1a"],[/([ti])a$/i,"$1a"],[/sis$/i,"ses"],[/(?:([^f])fe|([lr])f)$/i,"$1$2ves"],[/(hive)$/i,"$1s"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/(x|ch|ss|sh)$/i,"$1es"],[/(matr|vert|ind)(?:ix|ex)$/i,"$1ices"],[/^(m|l)ouse$/i,"$1ice"],[/^(m|l)ice$/i,"$1ice"],[/^(ox)$/i,"$1en"],[/^(oxen)$/i,"$1"],[/(quiz)$/i,"$1zes"]],singular:[[/s$/i,""],[/(ss)$/i,"$1"],[/(n)ews$/i,"$1ews"],[/([ti])a$/i,"$1um"],[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i,"$1sis"],[/(^analy)(sis|ses)$/i,"$1sis"],[/([^f])ves$/i,"$1fe"],[/(hive)s$/i,"$1"],[/(tive)s$/i,"$1"],[/([lr])ves$/i,"$1f"],[/([^aeiouy]|qu)ies$/i,"$1y"],[/(s)eries$/i,"$1eries"],[/(m)ovies$/i,"$1ovie"],[/(x|ch|ss|sh)es$/i,"$1"],[/^(m|l)ice$/i,"$1ouse"],[/(bus)(es)?$/i,"$1"],[/(o)es$/i,"$1"],[/(shoe)s$/i,"$1"],[/(cris|test)(is|es)$/i,"$1is"],[/^(a)x[ie]s$/i,"$1xis"],[/(octop|vir)(us|i)$/i,"$1us"],[/(alias|status)(es)?$/i,"$1"],[/^(ox)en/i,"$1"],[/(vert|ind)ices$/i,"$1ex"],[/(matr)ices$/i,"$1ix"],[/(quiz)zes$/i,"$1"],[/(database)s$/i,"$1"]],irregularPairs:[["person","people"],["man","men"],["child","children"],["sex","sexes"],["move","moves"],["cow","kine"],["zombie","zombies"]],uncountable:["equipment","information","rice","money","species","series","fish","sheep","jeans","police"]};a["default"]=b}),b("ember-inflector/lib/system/inflector",["exports"],function(a){"use strict";function b(a,b){for(var c=0,d=b.length;d>c;c++)a.uncountable[b[c].toLowerCase()]=!0}function c(a,b){for(var c,d=0,e=b.length;e>d;d++)c=b[d],a.irregular[c[0].toLowerCase()]=c[1],a.irregularInverse[c[1].toLowerCase()]=c[0]}function d(a){a=a||{},a.uncountable=a.uncountable||{},a.irregularPairs=a.irregularPairs||{};var d=this.rules={plurals:a.plurals||[],singular:a.singular||[],irregular:{},irregularInverse:{},uncountable:{}};b(d,a.uncountable),c(d,a.irregularPairs)}var e=/^\s*$/;d.prototype={plural:function(a,b){this.rules.plurals.push([a,b.toLowerCase()])},singular:function(a,b){this.rules.singular.push([a,b.toLowerCase()])},uncountable:function(a){b(this.rules,[a.toLowerCase()])},irregular:function(a,b){c(this.rules,[[a,b]])},pluralize:function(a){return this.inflect(a,this.rules.plurals,this.rules.irregular)},singularize:function(a){return this.inflect(a,this.rules.singular,this.rules.irregularInverse)},inflect:function(a,b,c){var d,f,g,h,i,j,k,l;if(i=e.test(a))return a;if(h=a.toLowerCase(),j=this.rules.uncountable[h])return a;if(k=c&&c[h])return k;for(var m=b.length,n=0;m>n&&(d=b[m-1],l=d[0],!l.test(a));m--);return d=d||[],l=d[0],f=d[1],g=a.replace(l,f)}},a["default"]=d}),b("ember-inflector/lib/system/string",["./inflector","exports"],function(a,b){"use strict";var c=a["default"],d=function(a){return c.inflector.pluralize(a)},e=function(a){return c.inflector.singularize(a)};b.pluralize=d,b.singularize=e}),a.DS=c("ember-data/lib/main")["default"]}(Ember.lookup);
|
data/dist/ember-data.prod.js
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
* @copyright Copyright 2011-2014 Tilde Inc. and contributors.
|
4
4
|
* Portions Copyright 2011 LivingSocial Inc.
|
5
5
|
* @license Licensed under MIT license (see license.js)
|
6
|
-
* @version 1.0.0-beta.
|
6
|
+
* @version 1.0.0-beta.8.2a68c63a
|
7
7
|
*/
|
8
8
|
(function(global) {
|
9
9
|
var define, requireModule, require, requirejs;
|
@@ -60,44 +60,37 @@ var define, requireModule, require, requirejs;
|
|
60
60
|
};
|
61
61
|
})();
|
62
62
|
|
63
|
-
define("activemodel-adapter/lib/initializers",
|
64
|
-
["../../ember-data/lib/system/container_proxy","./system/active_model_serializer","./system/active_model_adapter"],
|
65
|
-
function(__dependency1__, __dependency2__, __dependency3__) {
|
66
|
-
"use strict";
|
67
|
-
var ContainerProxy = __dependency1__["default"];
|
68
|
-
var ActiveModelSerializer = __dependency2__["default"];
|
69
|
-
var ActiveModelAdapter = __dependency3__["default"];
|
70
|
-
|
71
|
-
Ember.onLoad('Ember.Application', function(Application) {
|
72
|
-
Application.initializer({
|
73
|
-
name: "activeModelAdapter",
|
74
|
-
|
75
|
-
initialize: function(container, application) {
|
76
|
-
var proxy = new ContainerProxy(container);
|
77
|
-
proxy.registerDeprecations([
|
78
|
-
{deprecated: 'serializer:_ams', valid: 'serializer:-active-model'},
|
79
|
-
{deprecated: 'adapter:_ams', valid: 'adapter:-active-model'}
|
80
|
-
]);
|
81
|
-
|
82
|
-
application.register('serializer:-active-model', ActiveModelSerializer);
|
83
|
-
application.register('adapter:-active-model', ActiveModelAdapter);
|
84
|
-
}
|
85
|
-
});
|
86
|
-
});
|
87
|
-
});
|
88
63
|
define("activemodel-adapter/lib/main",
|
89
|
-
["./system","
|
90
|
-
function(__dependency1__,
|
64
|
+
["./system","exports"],
|
65
|
+
function(__dependency1__, __exports__) {
|
91
66
|
"use strict";
|
92
67
|
var ActiveModelAdapter = __dependency1__.ActiveModelAdapter;
|
93
68
|
var ActiveModelSerializer = __dependency1__.ActiveModelSerializer;
|
94
69
|
var EmbeddedRecordsMixin = __dependency1__.EmbeddedRecordsMixin;
|
95
70
|
|
96
|
-
|
97
71
|
__exports__.ActiveModelAdapter = ActiveModelAdapter;
|
98
72
|
__exports__.ActiveModelSerializer = ActiveModelSerializer;
|
99
73
|
__exports__.EmbeddedRecordsMixin = EmbeddedRecordsMixin;
|
100
74
|
});
|
75
|
+
define("activemodel-adapter/lib/setup-container",
|
76
|
+
["../../ember-data/lib/system/container_proxy","./system/active_model_serializer","./system/active_model_adapter","exports"],
|
77
|
+
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
|
78
|
+
"use strict";
|
79
|
+
var ContainerProxy = __dependency1__["default"];
|
80
|
+
var ActiveModelSerializer = __dependency2__["default"];
|
81
|
+
var ActiveModelAdapter = __dependency3__["default"];
|
82
|
+
|
83
|
+
__exports__["default"] = function setupActiveModelAdapter(container, application){
|
84
|
+
var proxy = new ContainerProxy(container);
|
85
|
+
proxy.registerDeprecations([
|
86
|
+
{deprecated: 'serializer:_ams', valid: 'serializer:-active-model'},
|
87
|
+
{deprecated: 'adapter:_ams', valid: 'adapter:-active-model'}
|
88
|
+
]);
|
89
|
+
|
90
|
+
container.register('serializer:-active-model', ActiveModelSerializer);
|
91
|
+
container.register('adapter:-active-model', ActiveModelAdapter);
|
92
|
+
};
|
93
|
+
});
|
101
94
|
define("activemodel-adapter/lib/system",
|
102
95
|
["./system/embedded_records_mixin","./system/active_model_adapter","./system/active_model_serializer","exports"],
|
103
96
|
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
|
@@ -130,10 +123,11 @@ define("activemodel-adapter/lib/system/active_model_adapter",
|
|
130
123
|
|
131
124
|
/**
|
132
125
|
The ActiveModelAdapter is a subclass of the RESTAdapter designed to integrate
|
133
|
-
with a JSON API that uses an underscored naming convention instead of
|
126
|
+
with a JSON API that uses an underscored naming convention instead of camelCasing.
|
134
127
|
It has been designed to work out of the box with the
|
135
128
|
[active_model_serializers](http://github.com/rails-api/active_model_serializers)
|
136
|
-
Ruby gem.
|
129
|
+
Ruby gem. This Adapter expects specific settings using ActiveModel::Serializers,
|
130
|
+
`embed :ids, include: true` which sideloads the records.
|
137
131
|
|
138
132
|
This adapter extends the DS.RESTAdapter by making consistent use of the camelization,
|
139
133
|
decamelization and pluralization methods to normalize the serialized JSON into a
|
@@ -174,7 +168,7 @@ define("activemodel-adapter/lib/system/active_model_adapter",
|
|
174
168
|
@class ActiveModelAdapter
|
175
169
|
@constructor
|
176
170
|
@namespace DS
|
177
|
-
@extends DS.
|
171
|
+
@extends DS.RESTAdapter
|
178
172
|
**/
|
179
173
|
|
180
174
|
var ActiveModelAdapter = RESTAdapter.extend({
|
@@ -190,7 +184,7 @@ define("activemodel-adapter/lib/system/active_model_adapter",
|
|
190
184
|
|
191
185
|
@method pathForType
|
192
186
|
@param {String} type
|
193
|
-
@
|
187
|
+
@return String
|
194
188
|
*/
|
195
189
|
pathForType: function(type) {
|
196
190
|
var decamelized = decamelize(type);
|
@@ -212,7 +206,7 @@ define("activemodel-adapter/lib/system/active_model_adapter",
|
|
212
206
|
|
213
207
|
@method ajaxError
|
214
208
|
@param jqXHR
|
215
|
-
@
|
209
|
+
@return error
|
216
210
|
*/
|
217
211
|
ajaxError: function(jqXHR) {
|
218
212
|
var error = this._super(jqXHR);
|
@@ -254,16 +248,65 @@ define("activemodel-adapter/lib/system/active_model_serializer",
|
|
254
248
|
capitalize = Ember.String.capitalize,
|
255
249
|
decamelize = Ember.String.decamelize,
|
256
250
|
underscore = Ember.String.underscore;
|
251
|
+
/**
|
252
|
+
The ActiveModelSerializer is a subclass of the RESTSerializer designed to integrate
|
253
|
+
with a JSON API that uses an underscored naming convention instead of camelCasing.
|
254
|
+
It has been designed to work out of the box with the
|
255
|
+
[active_model_serializers](http://github.com/rails-api/active_model_serializers)
|
256
|
+
Ruby gem. This Serializer expects specific settings using ActiveModel::Serializers,
|
257
|
+
`embed :ids, include: true` which sideloads the records.
|
258
|
+
|
259
|
+
This serializer extends the DS.RESTSerializer by making consistent
|
260
|
+
use of the camelization, decamelization and pluralization methods to
|
261
|
+
normalize the serialized JSON into a format that is compatible with
|
262
|
+
a conventional Rails backend and Ember Data.
|
263
|
+
|
264
|
+
## JSON Structure
|
265
|
+
|
266
|
+
The ActiveModelSerializer expects the JSON returned from your server
|
267
|
+
to follow the REST adapter conventions substituting underscored keys
|
268
|
+
for camelcased ones.
|
269
|
+
|
270
|
+
### Conventional Names
|
271
|
+
|
272
|
+
Attribute names in your JSON payload should be the underscored versions of
|
273
|
+
the attributes in your Ember.js models.
|
257
274
|
|
275
|
+
For example, if you have a `Person` model:
|
276
|
+
|
277
|
+
```js
|
278
|
+
App.FamousPerson = DS.Model.extend({
|
279
|
+
firstName: DS.attr('string'),
|
280
|
+
lastName: DS.attr('string'),
|
281
|
+
occupation: DS.attr('string')
|
282
|
+
});
|
283
|
+
```
|
284
|
+
|
285
|
+
The JSON returned should look like this:
|
286
|
+
|
287
|
+
```js
|
288
|
+
{
|
289
|
+
"famous_person": {
|
290
|
+
"first_name": "Barack",
|
291
|
+
"last_name": "Obama",
|
292
|
+
"occupation": "President"
|
293
|
+
}
|
294
|
+
}
|
295
|
+
```
|
296
|
+
|
297
|
+
@class ActiveModelSerializer
|
298
|
+
@namespace DS
|
299
|
+
@extends DS.RESTSerializer
|
300
|
+
*/
|
258
301
|
var ActiveModelSerializer = RESTSerializer.extend({
|
259
302
|
// SERIALIZE
|
260
303
|
|
261
304
|
/**
|
262
|
-
Converts
|
305
|
+
Converts camelCased attributes to underscored when serializing.
|
263
306
|
|
264
307
|
@method keyForAttribute
|
265
308
|
@param {String} attribute
|
266
|
-
@
|
309
|
+
@return String
|
267
310
|
*/
|
268
311
|
keyForAttribute: function(attr) {
|
269
312
|
return decamelize(attr);
|
@@ -276,7 +319,7 @@ define("activemodel-adapter/lib/system/active_model_serializer",
|
|
276
319
|
@method keyForRelationship
|
277
320
|
@param {String} key
|
278
321
|
@param {String} kind
|
279
|
-
@
|
322
|
+
@return String
|
280
323
|
*/
|
281
324
|
keyForRelationship: function(key, kind) {
|
282
325
|
key = decamelize(key);
|
@@ -289,7 +332,7 @@ define("activemodel-adapter/lib/system/active_model_serializer",
|
|
289
332
|
}
|
290
333
|
},
|
291
334
|
|
292
|
-
|
335
|
+
/*
|
293
336
|
Does not serialize hasMany relationships by default.
|
294
337
|
*/
|
295
338
|
serializeHasMany: Ember.K,
|
@@ -319,29 +362,19 @@ define("activemodel-adapter/lib/system/active_model_serializer",
|
|
319
362
|
serializePolymorphicType: function(record, json, relationship) {
|
320
363
|
var key = relationship.key,
|
321
364
|
belongsTo = get(record, key);
|
322
|
-
|
323
|
-
|
365
|
+
|
366
|
+
if (belongsTo) {
|
367
|
+
key = this.keyForAttribute(key);
|
368
|
+
json[key + "_type"] = capitalize(belongsTo.constructor.typeKey);
|
369
|
+
}
|
324
370
|
},
|
325
371
|
|
326
372
|
// EXTRACT
|
327
373
|
|
328
374
|
/**
|
329
|
-
|
375
|
+
Add extra step to `DS.RESTSerializer.normalize` so links are normalized.
|
330
376
|
|
331
|
-
|
332
|
-
@param {String} root
|
333
|
-
@returns String the model's typeKey
|
334
|
-
*/
|
335
|
-
typeForRoot: function(root) {
|
336
|
-
var camelized = camelize(root);
|
337
|
-
return singularize(camelized);
|
338
|
-
},
|
339
|
-
|
340
|
-
/**
|
341
|
-
Add extra step to `DS.RESTSerializer.normalize` so links are
|
342
|
-
normalized.
|
343
|
-
|
344
|
-
If your payload looks like this
|
377
|
+
If your payload looks like:
|
345
378
|
|
346
379
|
```js
|
347
380
|
{
|
@@ -352,6 +385,7 @@ define("activemodel-adapter/lib/system/active_model_serializer",
|
|
352
385
|
}
|
353
386
|
}
|
354
387
|
```
|
388
|
+
|
355
389
|
The normalized version would look like this
|
356
390
|
|
357
391
|
```js
|
@@ -368,7 +402,7 @@ define("activemodel-adapter/lib/system/active_model_serializer",
|
|
368
402
|
@param {subclass of DS.Model} type
|
369
403
|
@param {Object} hash
|
370
404
|
@param {String} prop
|
371
|
-
@
|
405
|
+
@return Object
|
372
406
|
*/
|
373
407
|
|
374
408
|
normalize: function(type, hash, prop) {
|
@@ -381,7 +415,7 @@ define("activemodel-adapter/lib/system/active_model_serializer",
|
|
381
415
|
Convert `snake_cased` links to `camelCase`
|
382
416
|
|
383
417
|
@method normalizeLinks
|
384
|
-
@param {Object}
|
418
|
+
@param {Object} data
|
385
419
|
*/
|
386
420
|
|
387
421
|
normalizeLinks: function(data){
|
@@ -460,24 +494,83 @@ define("activemodel-adapter/lib/system/embedded_records_mixin",
|
|
460
494
|
"use strict";
|
461
495
|
var get = Ember.get;
|
462
496
|
var forEach = Ember.EnumerableUtils.forEach;
|
497
|
+
var camelize = Ember.String.camelize;
|
463
498
|
|
464
499
|
var pluralize = __dependency1__.pluralize;
|
465
500
|
|
466
501
|
/**
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
502
|
+
## Using Embedded Records
|
503
|
+
|
504
|
+
`DS.EmbeddedRecordsMixin` supports serializing embedded records.
|
505
|
+
|
506
|
+
To set up embedded records, include the mixin when extending a serializer
|
507
|
+
then define and configure embedded (model) relationships.
|
508
|
+
|
509
|
+
Below is an example of a per-type serializer ('post' type).
|
471
510
|
|
472
511
|
```js
|
473
512
|
App.PostSerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, {
|
474
513
|
attrs: {
|
475
|
-
|
514
|
+
author: {embedded: 'always'},
|
515
|
+
comments: {serialize: 'ids'}
|
476
516
|
}
|
477
517
|
})
|
478
518
|
```
|
479
519
|
|
480
|
-
|
520
|
+
The `attrs` option for a resource `{embedded: 'always'}` is shorthand for:
|
521
|
+
|
522
|
+
```js
|
523
|
+
{serialize: 'records', deserialize: 'records'}
|
524
|
+
```
|
525
|
+
|
526
|
+
### Configuring Attrs
|
527
|
+
|
528
|
+
A resource's `attrs` option may be set to use `ids`, `records` or `no` for the
|
529
|
+
`serialize` and `deserialize` settings.
|
530
|
+
|
531
|
+
The `attrs` property can be set on the ApplicationSerializer or a per-type
|
532
|
+
serializer.
|
533
|
+
|
534
|
+
In the case where embedded JSON is expected while extracting a payoad (reading)
|
535
|
+
the setting is `deserialize: 'records'`, there is no need to use `ids` when
|
536
|
+
extracting as that is the default behavior without this mixin if you are using
|
537
|
+
the vanilla ActiveModelAdapter. Likewise, to embed JSON in the payload while
|
538
|
+
serializing `serialize: 'records'` is the setting to use. There is an option of
|
539
|
+
not embedding JSON in the serialized payload by using `serialize: 'ids'`. If you
|
540
|
+
do not want the relationship sent at all, you can use `serialize: 'no'`.
|
541
|
+
|
542
|
+
|
543
|
+
### ActiveModelSerializer defaults
|
544
|
+
If you do not overwrite `attrs` for a specific relationship, the `ActiveModelSerializer`
|
545
|
+
will behave in the following way:
|
546
|
+
|
547
|
+
BelongsTo: `{serialize:'id', deserialize:'id'}`
|
548
|
+
HasMany: `{serialize:no, deserialize:'ids'}`
|
549
|
+
|
550
|
+
### Model Relationships
|
551
|
+
|
552
|
+
Embedded records must have a model defined to be extracted and serialized.
|
553
|
+
|
554
|
+
To successfully extract and serialize embedded records the model relationships
|
555
|
+
must be setup correcty See the
|
556
|
+
[defining relationships](/guides/models/defining-models/#toc_defining-relationships)
|
557
|
+
section of the **Defining Models** guide page.
|
558
|
+
|
559
|
+
Records without an `id` property are not considered embedded records, model
|
560
|
+
instances must have an `id` property to be used with Ember Data.
|
561
|
+
|
562
|
+
### Example JSON payloads, Models and Serializers
|
563
|
+
|
564
|
+
**When customizing a serializer it is imporant to grok what the cusomizations
|
565
|
+
are, please read the docs for the methods this mixin provides, in case you need
|
566
|
+
to modify to fit your specific needs.**
|
567
|
+
|
568
|
+
For example review the docs for each method of this mixin:
|
569
|
+
|
570
|
+
* [extractArray](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_extractArray)
|
571
|
+
* [extractSingle](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_extractSingle)
|
572
|
+
* [serializeBelongsTo](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeBelongsTo)
|
573
|
+
* [serializeHasMany](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeHasMany)
|
481
574
|
|
482
575
|
@class EmbeddedRecordsMixin
|
483
576
|
@namespace DS
|
@@ -485,102 +578,457 @@ define("activemodel-adapter/lib/system/embedded_records_mixin",
|
|
485
578
|
var EmbeddedRecordsMixin = Ember.Mixin.create({
|
486
579
|
|
487
580
|
/**
|
488
|
-
Serialize
|
581
|
+
Serialize `belongsTo` relationship when it is configured as an embedded object.
|
582
|
+
|
583
|
+
This example of an author model belongs to a post model:
|
584
|
+
|
585
|
+
```js
|
586
|
+
Post = DS.Model.extend({
|
587
|
+
title: DS.attr('string'),
|
588
|
+
body: DS.attr('string'),
|
589
|
+
author: DS.belongsTo('author')
|
590
|
+
});
|
591
|
+
|
592
|
+
Author = DS.Model.extend({
|
593
|
+
name: DS.attr('string'),
|
594
|
+
post: DS.belongsTo('post')
|
595
|
+
});
|
596
|
+
```
|
597
|
+
|
598
|
+
Use a custom (type) serializer for the post model to configure embedded author
|
599
|
+
|
600
|
+
```js
|
601
|
+
App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
|
602
|
+
attrs: {
|
603
|
+
author: {embedded: 'always'}
|
604
|
+
}
|
605
|
+
})
|
606
|
+
```
|
607
|
+
|
608
|
+
A payload with an attribute configured for embedded records can serialize
|
609
|
+
the records together under the root attribute's payload:
|
610
|
+
|
611
|
+
```js
|
612
|
+
{
|
613
|
+
"post": {
|
614
|
+
"id": "1"
|
615
|
+
"title": "Rails is omakase",
|
616
|
+
"author": {
|
617
|
+
"id": "2"
|
618
|
+
"name": "dhh"
|
619
|
+
}
|
620
|
+
}
|
621
|
+
}
|
622
|
+
```
|
623
|
+
|
624
|
+
@method serializeBelongsTo
|
625
|
+
@param {DS.Model} record
|
626
|
+
@param {Object} json
|
627
|
+
@param {Object} relationship
|
628
|
+
*/
|
629
|
+
serializeBelongsTo: function(record, json, relationship) {
|
630
|
+
var attr = relationship.key;
|
631
|
+
var attrs = this.get('attrs');
|
632
|
+
if (noSerializeOptionSpecified(attrs, attr)) {
|
633
|
+
this._super(record, json, relationship);
|
634
|
+
return;
|
635
|
+
}
|
636
|
+
var includeIds = hasSerializeIdsOption(attrs, attr);
|
637
|
+
var includeRecords = hasSerializeRecordsOption(attrs, attr);
|
638
|
+
var embeddedRecord = record.get(attr);
|
639
|
+
if (includeIds) {
|
640
|
+
key = this.keyForRelationship(attr, relationship.kind);
|
641
|
+
if (!embeddedRecord) {
|
642
|
+
json[key] = null;
|
643
|
+
} else {
|
644
|
+
json[key] = get(embeddedRecord, 'id');
|
645
|
+
}
|
646
|
+
} else if (includeRecords) {
|
647
|
+
var key = this.keyForRelationship(attr);
|
648
|
+
if (!embeddedRecord) {
|
649
|
+
json[key] = null;
|
650
|
+
} else {
|
651
|
+
json[key] = embeddedRecord.serialize({includeId: true});
|
652
|
+
this.removeEmbeddedForeignKey(record, embeddedRecord, relationship, json[key]);
|
653
|
+
}
|
654
|
+
}
|
655
|
+
},
|
656
|
+
|
657
|
+
/**
|
658
|
+
Serialize `hasMany` relationship when it is configured as embedded objects.
|
659
|
+
|
660
|
+
This example of a post model has many comments:
|
661
|
+
|
662
|
+
```js
|
663
|
+
Post = DS.Model.extend({
|
664
|
+
title: DS.attr('string'),
|
665
|
+
body: DS.attr('string'),
|
666
|
+
comments: DS.hasMany('comment')
|
667
|
+
});
|
668
|
+
|
669
|
+
Comment = DS.Model.extend({
|
670
|
+
body: DS.attr('string'),
|
671
|
+
post: DS.belongsTo('post')
|
672
|
+
});
|
673
|
+
```
|
674
|
+
|
675
|
+
Use a custom (type) serializer for the post model to configure embedded comments
|
676
|
+
|
677
|
+
```js
|
678
|
+
App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
|
679
|
+
attrs: {
|
680
|
+
comments: {embedded: 'always'}
|
681
|
+
}
|
682
|
+
})
|
683
|
+
```
|
684
|
+
|
685
|
+
A payload with an attribute configured for embedded records can serialize
|
686
|
+
the records together under the root attribute's payload:
|
687
|
+
|
688
|
+
```js
|
689
|
+
{
|
690
|
+
"post": {
|
691
|
+
"id": "1"
|
692
|
+
"title": "Rails is omakase",
|
693
|
+
"body": "I want this for my ORM, I want that for my template language..."
|
694
|
+
"comments": [{
|
695
|
+
"id": "1",
|
696
|
+
"body": "Rails is unagi"
|
697
|
+
}, {
|
698
|
+
"id": "2",
|
699
|
+
"body": "Omakase O_o"
|
700
|
+
}]
|
701
|
+
}
|
702
|
+
}
|
703
|
+
```
|
704
|
+
|
705
|
+
The attrs options object can use more specific instruction for extracting and
|
706
|
+
serializing. When serializing, an option to embed `ids` or `records` can be set.
|
707
|
+
When extracting the only option is `records`.
|
708
|
+
|
709
|
+
So `{embedded: 'always'}` is shorthand for:
|
710
|
+
`{serialize: 'records', deserialize: 'records'}`
|
711
|
+
|
712
|
+
To embed the `ids` for a related object (using a hasMany relationship):
|
713
|
+
|
714
|
+
```js
|
715
|
+
App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
|
716
|
+
attrs: {
|
717
|
+
comments: {serialize: 'ids', deserialize: 'records'}
|
718
|
+
}
|
719
|
+
})
|
720
|
+
```
|
721
|
+
|
722
|
+
```js
|
723
|
+
{
|
724
|
+
"post": {
|
725
|
+
"id": "1"
|
726
|
+
"title": "Rails is omakase",
|
727
|
+
"body": "I want this for my ORM, I want that for my template language..."
|
728
|
+
"comments": ["1", "2"]
|
729
|
+
}
|
730
|
+
}
|
731
|
+
```
|
489
732
|
|
490
733
|
@method serializeHasMany
|
734
|
+
@param {DS.Model} record
|
735
|
+
@param {Object} json
|
736
|
+
@param {Object} relationship
|
491
737
|
*/
|
492
738
|
serializeHasMany: function(record, json, relationship) {
|
493
|
-
var
|
494
|
-
|
495
|
-
|
739
|
+
var attr = relationship.key;
|
740
|
+
var attrs = this.get('attrs');
|
741
|
+
if (noSerializeOptionSpecified(attrs, attr)) {
|
742
|
+
this._super(record, json, relationship);
|
743
|
+
return;
|
744
|
+
}
|
745
|
+
var includeIds = hasSerializeIdsOption(attrs, attr);
|
746
|
+
var includeRecords = hasSerializeRecordsOption(attrs, attr);
|
747
|
+
var key;
|
748
|
+
if (includeIds) {
|
749
|
+
key = this.keyForRelationship(attr, relationship.kind);
|
750
|
+
json[key] = get(record, attr).mapBy('id');
|
751
|
+
} else if (includeRecords) {
|
752
|
+
key = this.keyForAttribute(attr);
|
753
|
+
json[key] = get(record, attr).map(function(embeddedRecord) {
|
754
|
+
var serializedEmbeddedRecord = embeddedRecord.serialize({includeId: true});
|
755
|
+
this.removeEmbeddedForeignKey(record, embeddedRecord, relationship, serializedEmbeddedRecord);
|
756
|
+
return serializedEmbeddedRecord;
|
757
|
+
}, this);
|
758
|
+
}
|
759
|
+
},
|
496
760
|
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
primaryKey = get(this, 'primaryKey');
|
761
|
+
/**
|
762
|
+
When serializing an embedded record, modify the property (in the json payload)
|
763
|
+
that refers to the parent record (foreign key for relationship).
|
501
764
|
|
502
|
-
|
765
|
+
Serializing a `belongsTo` relationship removes the property that refers to the
|
766
|
+
parent record
|
503
767
|
|
504
|
-
|
505
|
-
|
768
|
+
Serializing a `hasMany` relationship does not remove the property that refers to
|
769
|
+
the parent record.
|
770
|
+
|
771
|
+
@method removeEmbeddedForeignKey
|
772
|
+
@param {DS.Model} record
|
773
|
+
@param {DS.Model} embeddedRecord
|
774
|
+
@param {Object} relationship
|
775
|
+
@param {Object} json
|
776
|
+
*/
|
777
|
+
removeEmbeddedForeignKey: function (record, embeddedRecord, relationship, json) {
|
778
|
+
if (relationship.kind === 'hasMany') {
|
779
|
+
return;
|
780
|
+
} else if (relationship.kind === 'belongsTo') {
|
781
|
+
var parentRecord = record.constructor.inverseFor(relationship.key);
|
782
|
+
if (parentRecord) {
|
783
|
+
var name = parentRecord.name;
|
784
|
+
var embeddedSerializer = this.store.serializerFor(embeddedRecord.constructor);
|
785
|
+
var parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind);
|
786
|
+
if (parentKey) {
|
787
|
+
delete json[parentKey];
|
788
|
+
}
|
789
|
+
}
|
506
790
|
}
|
507
791
|
},
|
508
792
|
|
509
793
|
/**
|
510
|
-
Extract embedded
|
511
|
-
and add
|
794
|
+
Extract an embedded object from the payload for a single object
|
795
|
+
and add the object in the compound document (side-loaded) format instead.
|
796
|
+
|
797
|
+
A payload with an attribute configured for embedded records needs to be extracted:
|
798
|
+
|
799
|
+
```js
|
800
|
+
{
|
801
|
+
"post": {
|
802
|
+
"id": 1
|
803
|
+
"title": "Rails is omakase",
|
804
|
+
"author": {
|
805
|
+
"id": 2
|
806
|
+
"name": "dhh"
|
807
|
+
}
|
808
|
+
"comments": []
|
809
|
+
}
|
810
|
+
}
|
811
|
+
```
|
812
|
+
|
813
|
+
Ember Data is expecting a payload with a compound document (side-loaded) like:
|
814
|
+
|
815
|
+
```js
|
816
|
+
{
|
817
|
+
"post": {
|
818
|
+
"id": "1"
|
819
|
+
"title": "Rails is omakase",
|
820
|
+
"author": "2"
|
821
|
+
"comments": []
|
822
|
+
},
|
823
|
+
"authors": [{
|
824
|
+
"id": "2"
|
825
|
+
"post": "1"
|
826
|
+
"name": "dhh"
|
827
|
+
}]
|
828
|
+
"comments": []
|
829
|
+
}
|
830
|
+
```
|
831
|
+
|
832
|
+
The payload's `author` attribute represents an object with a `belongsTo` relationship.
|
833
|
+
The `post` attribute under `author` is the foreign key with the id for the post
|
512
834
|
|
513
835
|
@method extractSingle
|
836
|
+
@param {DS.Store} store
|
837
|
+
@param {subclass of DS.Model} primaryType
|
838
|
+
@param {Object} payload
|
839
|
+
@param {String} recordId
|
840
|
+
@return Object the primary response to the original request
|
514
841
|
*/
|
515
|
-
extractSingle: function(store, primaryType, payload, recordId
|
842
|
+
extractSingle: function(store, primaryType, payload, recordId) {
|
516
843
|
var root = this.keyForAttribute(primaryType.typeKey),
|
517
844
|
partial = payload[root];
|
518
845
|
|
519
|
-
updatePayloadWithEmbedded(
|
846
|
+
updatePayloadWithEmbedded(this, store, primaryType, payload, partial);
|
520
847
|
|
521
|
-
return this._super(store, primaryType, payload, recordId
|
848
|
+
return this._super(store, primaryType, payload, recordId);
|
522
849
|
},
|
523
850
|
|
524
851
|
/**
|
525
|
-
Extract embedded objects
|
526
|
-
and add them as
|
852
|
+
Extract embedded objects in an array when an attr is configured for embedded,
|
853
|
+
and add them as side-loaded objects instead.
|
854
|
+
|
855
|
+
A payload with an attr configured for embedded records needs to be extracted:
|
856
|
+
|
857
|
+
```js
|
858
|
+
{
|
859
|
+
"post": {
|
860
|
+
"id": "1"
|
861
|
+
"title": "Rails is omakase",
|
862
|
+
"comments": [{
|
863
|
+
"id": "1",
|
864
|
+
"body": "Rails is unagi"
|
865
|
+
}, {
|
866
|
+
"id": "2",
|
867
|
+
"body": "Omakase O_o"
|
868
|
+
}]
|
869
|
+
}
|
870
|
+
}
|
871
|
+
```
|
872
|
+
|
873
|
+
Ember Data is expecting a payload with compound document (side-loaded) like:
|
874
|
+
|
875
|
+
```js
|
876
|
+
{
|
877
|
+
"post": {
|
878
|
+
"id": "1"
|
879
|
+
"title": "Rails is omakase",
|
880
|
+
"comments": ["1", "2"]
|
881
|
+
},
|
882
|
+
"comments": [{
|
883
|
+
"id": "1",
|
884
|
+
"body": "Rails is unagi"
|
885
|
+
}, {
|
886
|
+
"id": "2",
|
887
|
+
"body": "Omakase O_o"
|
888
|
+
}]
|
889
|
+
}
|
890
|
+
```
|
891
|
+
|
892
|
+
The payload's `comments` attribute represents records in a `hasMany` relationship
|
527
893
|
|
528
894
|
@method extractArray
|
895
|
+
@param {DS.Store} store
|
896
|
+
@param {subclass of DS.Model} primaryType
|
897
|
+
@param {Object} payload
|
898
|
+
@return {Array<Object>} The primary array that was returned in response
|
899
|
+
to the original query.
|
529
900
|
*/
|
530
|
-
extractArray: function(store,
|
531
|
-
var root = this.keyForAttribute(
|
901
|
+
extractArray: function(store, primaryType, payload) {
|
902
|
+
var root = this.keyForAttribute(primaryType.typeKey),
|
532
903
|
partials = payload[pluralize(root)];
|
533
904
|
|
534
905
|
forEach(partials, function(partial) {
|
535
|
-
updatePayloadWithEmbedded(store,
|
906
|
+
updatePayloadWithEmbedded(this, store, primaryType, payload, partial);
|
536
907
|
}, this);
|
537
908
|
|
538
|
-
return this._super(store,
|
909
|
+
return this._super(store, primaryType, payload);
|
539
910
|
}
|
540
911
|
});
|
541
912
|
|
542
|
-
|
913
|
+
// checks config for attrs option to embedded (always) - serialize and deserialize
|
914
|
+
function hasEmbeddedAlwaysOption(attrs, attr) {
|
915
|
+
var option = attrsOption(attrs, attr);
|
916
|
+
return option && option.embedded === 'always';
|
917
|
+
}
|
918
|
+
|
919
|
+
// checks config for attrs option to serialize ids
|
920
|
+
function hasSerializeRecordsOption(attrs, attr) {
|
921
|
+
var alwaysEmbed = hasEmbeddedAlwaysOption(attrs, attr);
|
922
|
+
var option = attrsOption(attrs, attr);
|
923
|
+
return alwaysEmbed || (option && (option.serialize === 'records'));
|
924
|
+
}
|
925
|
+
|
926
|
+
// checks config for attrs option to serialize records
|
927
|
+
function hasSerializeIdsOption(attrs, attr) {
|
928
|
+
var option = attrsOption(attrs, attr);
|
929
|
+
return option && (option.serialize === 'ids' || option.serialize === 'id');
|
930
|
+
}
|
931
|
+
|
932
|
+
// checks config for attrs option to serialize records
|
933
|
+
function noSerializeOptionSpecified(attrs, attr) {
|
934
|
+
var option = attrsOption(attrs, attr);
|
935
|
+
var serializeRecords = hasSerializeRecordsOption(attrs, attr);
|
936
|
+
var serializeIds = hasSerializeIdsOption(attrs, attr);
|
937
|
+
return !(option && (option.serialize || option.embedded));
|
938
|
+
}
|
939
|
+
|
940
|
+
// checks config for attrs option to deserialize records
|
941
|
+
// a defined option object for a resource is treated the same as
|
942
|
+
// `deserialize: 'records'`
|
943
|
+
function hasDeserializeRecordsOption(attrs, attr) {
|
944
|
+
var alwaysEmbed = hasEmbeddedAlwaysOption(attrs, attr);
|
945
|
+
var option = attrsOption(attrs, attr);
|
946
|
+
var hasSerializingOption = option && (option.deserialize || option.serialize);
|
947
|
+
return alwaysEmbed || hasSerializingOption /* option.deserialize === 'records' */;
|
948
|
+
}
|
949
|
+
|
950
|
+
function attrsOption(attrs, attr) {
|
951
|
+
return attrs && (attrs[Ember.String.camelize(attr)] || attrs[attr]);
|
952
|
+
}
|
953
|
+
|
954
|
+
// chooses a relationship kind to branch which function is used to update payload
|
955
|
+
// does not change payload if attr is not embedded
|
956
|
+
function updatePayloadWithEmbedded(serializer, store, type, payload, partial) {
|
543
957
|
var attrs = get(serializer, 'attrs');
|
544
958
|
|
545
959
|
if (!attrs) {
|
546
960
|
return;
|
547
961
|
}
|
548
|
-
|
549
962
|
type.eachRelationship(function(key, relationship) {
|
550
|
-
|
551
|
-
|
552
|
-
serializer
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
963
|
+
if (hasDeserializeRecordsOption(attrs, key)) {
|
964
|
+
if (relationship.kind === "hasMany") {
|
965
|
+
updatePayloadWithEmbeddedHasMany(serializer, store, key, relationship, payload, partial);
|
966
|
+
}
|
967
|
+
if (relationship.kind === "belongsTo") {
|
968
|
+
updatePayloadWithEmbeddedBelongsTo(serializer, store, key, relationship, payload, partial);
|
969
|
+
}
|
557
970
|
}
|
971
|
+
});
|
972
|
+
}
|
558
973
|
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
974
|
+
// handles embedding for `hasMany` relationship
|
975
|
+
function updatePayloadWithEmbeddedHasMany(serializer, store, primaryType, relationship, payload, partial) {
|
976
|
+
var embeddedSerializer = store.serializerFor(relationship.type.typeKey);
|
977
|
+
var primaryKey = get(serializer, 'primaryKey');
|
978
|
+
var attr = relationship.type.typeKey;
|
979
|
+
// underscore forces the embedded records to be side loaded.
|
980
|
+
// it is needed when main type === relationship.type
|
981
|
+
var embeddedTypeKey = '_' + serializer.typeForRoot(relationship.type.typeKey);
|
982
|
+
var expandedKey = serializer.keyForRelationship(primaryType, relationship.kind);
|
983
|
+
var attribute = serializer.keyForAttribute(primaryType);
|
984
|
+
var ids = [];
|
985
|
+
|
986
|
+
if (!partial[attribute]) {
|
987
|
+
return;
|
988
|
+
}
|
566
989
|
|
567
|
-
|
568
|
-
return;
|
569
|
-
}
|
990
|
+
payload[embeddedTypeKey] = payload[embeddedTypeKey] || [];
|
570
991
|
|
571
|
-
|
992
|
+
forEach(partial[attribute], function(data) {
|
993
|
+
var embeddedType = store.modelFor(attr);
|
994
|
+
updatePayloadWithEmbedded(embeddedSerializer, store, embeddedType, payload, data);
|
995
|
+
ids.push(data[primaryKey]);
|
996
|
+
payload[embeddedTypeKey].push(data);
|
997
|
+
});
|
572
998
|
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
ids.push(data[primaryKey]);
|
577
|
-
payload[embeddedTypeKey].push(data);
|
578
|
-
});
|
999
|
+
partial[expandedKey] = ids;
|
1000
|
+
delete partial[attribute];
|
1001
|
+
}
|
579
1002
|
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
1003
|
+
// handles embedding for `belongsTo` relationship
|
1004
|
+
function updatePayloadWithEmbeddedBelongsTo(serializer, store, primaryType, relationship, payload, partial) {
|
1005
|
+
var attrs = serializer.get('attrs');
|
1006
|
+
|
1007
|
+
if (!attrs ||
|
1008
|
+
!(hasDeserializeRecordsOption(attrs, Ember.String.camelize(primaryType)) ||
|
1009
|
+
hasDeserializeRecordsOption(attrs, primaryType))) {
|
1010
|
+
return;
|
1011
|
+
}
|
1012
|
+
var attr = relationship.type.typeKey;
|
1013
|
+
var _serializer = store.serializerFor(relationship.type.typeKey);
|
1014
|
+
var primaryKey = get(_serializer, 'primaryKey');
|
1015
|
+
var embeddedTypeKey = Ember.String.pluralize(attr); // TODO don't use pluralize
|
1016
|
+
var expandedKey = _serializer.keyForRelationship(primaryType, relationship.kind);
|
1017
|
+
var attribute = _serializer.keyForAttribute(primaryType);
|
1018
|
+
|
1019
|
+
if (!partial[attribute]) {
|
1020
|
+
return;
|
1021
|
+
}
|
1022
|
+
payload[embeddedTypeKey] = payload[embeddedTypeKey] || [];
|
1023
|
+
var embeddedType = store.modelFor(relationship.type.typeKey);
|
1024
|
+
// Recursive call for nested record
|
1025
|
+
updatePayloadWithEmbedded(_serializer, store, embeddedType, payload, partial[attribute]);
|
1026
|
+
partial[expandedKey] = partial[attribute].id;
|
1027
|
+
// Need to move an embedded `belongsTo` object into a pluralized collection
|
1028
|
+
payload[embeddedTypeKey].push(partial[attribute]);
|
1029
|
+
// Need a reference to the parent so relationship works between both `belongsTo` records
|
1030
|
+
partial[attribute][relationship.parentType.typeKey + '_id'] = partial.id;
|
1031
|
+
delete partial[attribute];
|
584
1032
|
}
|
585
1033
|
|
586
1034
|
__exports__["default"] = EmbeddedRecordsMixin;
|
@@ -616,11 +1064,11 @@ define("ember-data/lib/adapters/fixture_adapter",
|
|
616
1064
|
|
617
1065
|
/**
|
618
1066
|
`DS.FixtureAdapter` is an adapter that loads records from memory.
|
619
|
-
|
1067
|
+
It's primarily used for development and testing. You can also use
|
620
1068
|
`DS.FixtureAdapter` while working on the API but are not ready to
|
621
1069
|
integrate yet. It is a fully functioning adapter. All CRUD methods
|
622
1070
|
are implemented. You can also implement query logic that a remote
|
623
|
-
system would do.
|
1071
|
+
system would do. It's possible to develop your entire application
|
624
1072
|
with `DS.FixtureAdapter`.
|
625
1073
|
|
626
1074
|
For information on how to use the `FixtureAdapter` in your
|
@@ -1034,11 +1482,13 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1034
1482
|
|
1035
1483
|
### Headers customization
|
1036
1484
|
|
1037
|
-
Some APIs require HTTP headers, e.g. to provide an API key.
|
1038
|
-
headers can be
|
1485
|
+
Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary
|
1486
|
+
headers can be set as key/value pairs on the `RESTAdapter`'s `headers`
|
1487
|
+
object and Ember Data will send them along with each ajax request.
|
1488
|
+
|
1039
1489
|
|
1040
1490
|
```js
|
1041
|
-
DS.RESTAdapter.
|
1491
|
+
App.ApplicationAdapter = DS.RESTAdapter.extend({
|
1042
1492
|
headers: {
|
1043
1493
|
"API_KEY": "secret key",
|
1044
1494
|
"ANOTHER_HEADER": "Some header value"
|
@@ -1046,6 +1496,39 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1046
1496
|
});
|
1047
1497
|
```
|
1048
1498
|
|
1499
|
+
`headers` can also be used as a computed property to support dynamic
|
1500
|
+
headers. In the example below, the `session` object has been
|
1501
|
+
injected into an adapter by Ember's container.
|
1502
|
+
|
1503
|
+
```js
|
1504
|
+
App.ApplicationAdapter = DS.RESTAdapter.extend({
|
1505
|
+
headers: function() {
|
1506
|
+
return {
|
1507
|
+
"API_KEY": this.get("session.authToken"),
|
1508
|
+
"ANOTHER_HEADER": "Some header value"
|
1509
|
+
};
|
1510
|
+
}.property("session.authToken")
|
1511
|
+
});
|
1512
|
+
```
|
1513
|
+
|
1514
|
+
In some cases, your dynamic headers may require data from some
|
1515
|
+
object outside of Ember's observer system (for example
|
1516
|
+
`document.cookie`). You can use the
|
1517
|
+
[volatile](/api/classes/Ember.ComputedProperty.html#method_volatile)
|
1518
|
+
function to set the property into a non-chached mode causing the headers to
|
1519
|
+
be recomputed with every request.
|
1520
|
+
|
1521
|
+
```js
|
1522
|
+
App.ApplicationAdapter = DS.RESTAdapter.extend({
|
1523
|
+
headers: function() {
|
1524
|
+
return {
|
1525
|
+
"API_KEY": Ember.get(document.cookie.match(/apiKey\=([^;]*)/), "1"),
|
1526
|
+
"ANOTHER_HEADER": "Some header value"
|
1527
|
+
};
|
1528
|
+
}.property().volatile();
|
1529
|
+
});
|
1530
|
+
```
|
1531
|
+
|
1049
1532
|
@class RESTAdapter
|
1050
1533
|
@constructor
|
1051
1534
|
@namespace DS
|
@@ -1085,11 +1568,14 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1085
1568
|
*/
|
1086
1569
|
|
1087
1570
|
/**
|
1088
|
-
Some APIs require HTTP headers, e.g. to provide an API
|
1089
|
-
headers can be
|
1571
|
+
Some APIs require HTTP headers, e.g. to provide an API
|
1572
|
+
key. Arbitrary headers can be set as key/value pairs on the
|
1573
|
+
`RESTAdapter`'s `headers` object and Ember Data will send them
|
1574
|
+
along with each ajax request. For dynamic headers see [headers
|
1575
|
+
customization](/api/data/classes/DS.RESTAdapter.html#toc_headers-customization).
|
1090
1576
|
|
1091
1577
|
```javascript
|
1092
|
-
DS.RESTAdapter.
|
1578
|
+
App.ApplicationAdapter = DS.RESTAdapter.extend({
|
1093
1579
|
headers: {
|
1094
1580
|
"API_KEY": "secret key",
|
1095
1581
|
"ANOTHER_HEADER": "Some header value"
|
@@ -1114,7 +1600,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1114
1600
|
@param {DS.Store} store
|
1115
1601
|
@param {subclass of DS.Model} type
|
1116
1602
|
@param {String} id
|
1117
|
-
@
|
1603
|
+
@return {Promise} promise
|
1118
1604
|
*/
|
1119
1605
|
find: function(store, type, id) {
|
1120
1606
|
return this.ajax(this.buildURL(type.typeKey, id), 'GET');
|
@@ -1132,7 +1618,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1132
1618
|
@param {DS.Store} store
|
1133
1619
|
@param {subclass of DS.Model} type
|
1134
1620
|
@param {String} sinceToken
|
1135
|
-
@
|
1621
|
+
@return {Promise} promise
|
1136
1622
|
*/
|
1137
1623
|
findAll: function(store, type, sinceToken) {
|
1138
1624
|
var query;
|
@@ -1159,7 +1645,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1159
1645
|
@param {DS.Store} store
|
1160
1646
|
@param {subclass of DS.Model} type
|
1161
1647
|
@param {Object} query
|
1162
|
-
@
|
1648
|
+
@return {Promise} promise
|
1163
1649
|
*/
|
1164
1650
|
findQuery: function(store, type, query) {
|
1165
1651
|
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
|
@@ -1197,7 +1683,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1197
1683
|
@param {DS.Store} store
|
1198
1684
|
@param {subclass of DS.Model} type
|
1199
1685
|
@param {Array} ids
|
1200
|
-
@
|
1686
|
+
@return {Promise} promise
|
1201
1687
|
*/
|
1202
1688
|
findMany: function(store, type, ids) {
|
1203
1689
|
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: { ids: ids } });
|
@@ -1230,7 +1716,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1230
1716
|
@param {DS.Store} store
|
1231
1717
|
@param {DS.Model} record
|
1232
1718
|
@param {String} url
|
1233
|
-
@
|
1719
|
+
@return {Promise} promise
|
1234
1720
|
*/
|
1235
1721
|
findHasMany: function(store, record, url) {
|
1236
1722
|
var host = get(this, 'host'),
|
@@ -1269,7 +1755,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1269
1755
|
@param {DS.Store} store
|
1270
1756
|
@param {DS.Model} record
|
1271
1757
|
@param {String} url
|
1272
|
-
@
|
1758
|
+
@return {Promise} promise
|
1273
1759
|
*/
|
1274
1760
|
findBelongsTo: function(store, record, url) {
|
1275
1761
|
var id = get(record, 'id'),
|
@@ -1292,7 +1778,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1292
1778
|
@param {DS.Store} store
|
1293
1779
|
@param {subclass of DS.Model} type
|
1294
1780
|
@param {DS.Model} record
|
1295
|
-
@
|
1781
|
+
@return {Promise} promise
|
1296
1782
|
*/
|
1297
1783
|
createRecord: function(store, type, record) {
|
1298
1784
|
var data = {};
|
@@ -1317,7 +1803,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1317
1803
|
@param {DS.Store} store
|
1318
1804
|
@param {subclass of DS.Model} type
|
1319
1805
|
@param {DS.Model} record
|
1320
|
-
@
|
1806
|
+
@return {Promise} promise
|
1321
1807
|
*/
|
1322
1808
|
updateRecord: function(store, type, record) {
|
1323
1809
|
var data = {};
|
@@ -1339,7 +1825,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1339
1825
|
@param {DS.Store} store
|
1340
1826
|
@param {subclass of DS.Model} type
|
1341
1827
|
@param {DS.Model} record
|
1342
|
-
@
|
1828
|
+
@return {Promise} promise
|
1343
1829
|
*/
|
1344
1830
|
deleteRecord: function(store, type, record) {
|
1345
1831
|
var id = get(record, 'id');
|
@@ -1360,7 +1846,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1360
1846
|
@method buildURL
|
1361
1847
|
@param {String} type
|
1362
1848
|
@param {String} id
|
1363
|
-
@
|
1849
|
+
@return {String} url
|
1364
1850
|
*/
|
1365
1851
|
buildURL: function(type, id) {
|
1366
1852
|
var url = [],
|
@@ -1425,17 +1911,17 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1425
1911
|
endpoint of "/line_items/".
|
1426
1912
|
|
1427
1913
|
```js
|
1428
|
-
DS.RESTAdapter.
|
1914
|
+
App.ApplicationAdapter = DS.RESTAdapter.extend({
|
1429
1915
|
pathForType: function(type) {
|
1430
1916
|
var decamelized = Ember.String.decamelize(type);
|
1431
1917
|
return Ember.String.pluralize(decamelized);
|
1432
|
-
}
|
1918
|
+
}
|
1433
1919
|
});
|
1434
1920
|
```
|
1435
1921
|
|
1436
1922
|
@method pathForType
|
1437
1923
|
@param {String} type
|
1438
|
-
@
|
1924
|
+
@return {String} path
|
1439
1925
|
**/
|
1440
1926
|
pathForType: function(type) {
|
1441
1927
|
var camelized = Ember.String.camelize(type);
|
@@ -1477,7 +1963,7 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1477
1963
|
@return {Object} jqXHR
|
1478
1964
|
*/
|
1479
1965
|
ajaxError: function(jqXHR) {
|
1480
|
-
if (jqXHR) {
|
1966
|
+
if (jqXHR && typeof jqXHR === 'object') {
|
1481
1967
|
jqXHR.then = null;
|
1482
1968
|
}
|
1483
1969
|
|
@@ -1546,8 +2032,8 @@ define("ember-data/lib/adapters/rest_adapter",
|
|
1546
2032
|
hash.data = JSON.stringify(hash.data);
|
1547
2033
|
}
|
1548
2034
|
|
1549
|
-
|
1550
|
-
|
2035
|
+
var headers = get(this, 'headers');
|
2036
|
+
if (headers !== undefined) {
|
1551
2037
|
hash.beforeSend = function (xhr) {
|
1552
2038
|
forEach.call(Ember.keys(headers), function(key) {
|
1553
2039
|
xhr.setRequestHeader(key, headers[key]);
|
@@ -1582,17 +2068,13 @@ define("ember-data/lib/core",
|
|
1582
2068
|
/**
|
1583
2069
|
@property VERSION
|
1584
2070
|
@type String
|
1585
|
-
@default '1.0.0-beta.
|
2071
|
+
@default '1.0.0-beta.8.2a68c63a'
|
1586
2072
|
@static
|
1587
2073
|
*/
|
1588
2074
|
DS = Ember.Namespace.create({
|
1589
|
-
VERSION: '1.0.0-beta.
|
2075
|
+
VERSION: '1.0.0-beta.8.2a68c63a'
|
1590
2076
|
});
|
1591
2077
|
|
1592
|
-
if ('undefined' !== typeof window) {
|
1593
|
-
window.DS = DS;
|
1594
|
-
}
|
1595
|
-
|
1596
2078
|
if (Ember.libraries) {
|
1597
2079
|
Ember.libraries.registerCoreLibrary('Ember Data', DS.VERSION);
|
1598
2080
|
}
|
@@ -1600,6 +2082,90 @@ define("ember-data/lib/core",
|
|
1600
2082
|
|
1601
2083
|
__exports__["default"] = DS;
|
1602
2084
|
});
|
2085
|
+
define("ember-data/lib/ember-initializer",
|
2086
|
+
["./setup-container"],
|
2087
|
+
function(__dependency1__) {
|
2088
|
+
"use strict";
|
2089
|
+
var setupContainer = __dependency1__["default"];
|
2090
|
+
|
2091
|
+
var K = Ember.K;
|
2092
|
+
|
2093
|
+
/**
|
2094
|
+
@module ember-data
|
2095
|
+
*/
|
2096
|
+
|
2097
|
+
/**
|
2098
|
+
|
2099
|
+
This code initializes Ember-Data onto an Ember application.
|
2100
|
+
|
2101
|
+
If an Ember.js developer defines a subclass of DS.Store on their application,
|
2102
|
+
as `App.ApplicationStore` (or via a module system that resolves to `store:application`)
|
2103
|
+
this code will automatically instantiate it and make it available on the
|
2104
|
+
router.
|
2105
|
+
|
2106
|
+
Additionally, after an application's controllers have been injected, they will
|
2107
|
+
each have the store made available to them.
|
2108
|
+
|
2109
|
+
For example, imagine an Ember.js application with the following classes:
|
2110
|
+
|
2111
|
+
App.ApplicationStore = DS.Store.extend({
|
2112
|
+
adapter: 'custom'
|
2113
|
+
});
|
2114
|
+
|
2115
|
+
App.PostsController = Ember.ArrayController.extend({
|
2116
|
+
// ...
|
2117
|
+
});
|
2118
|
+
|
2119
|
+
When the application is initialized, `App.ApplicationStore` will automatically be
|
2120
|
+
instantiated, and the instance of `App.PostsController` will have its `store`
|
2121
|
+
property set to that instance.
|
2122
|
+
|
2123
|
+
Note that this code will only be run if the `ember-application` package is
|
2124
|
+
loaded. If Ember Data is being used in an environment other than a
|
2125
|
+
typical application (e.g., node.js where only `ember-runtime` is available),
|
2126
|
+
this code will be ignored.
|
2127
|
+
*/
|
2128
|
+
|
2129
|
+
Ember.onLoad('Ember.Application', function(Application) {
|
2130
|
+
|
2131
|
+
Application.initializer({
|
2132
|
+
name: "ember-data",
|
2133
|
+
initialize: setupContainer
|
2134
|
+
});
|
2135
|
+
|
2136
|
+
// Deprecated initializers to satisfy old code that depended on them
|
2137
|
+
|
2138
|
+
Application.initializer({
|
2139
|
+
name: "store",
|
2140
|
+
after: "ember-data",
|
2141
|
+
initialize: K
|
2142
|
+
});
|
2143
|
+
|
2144
|
+
Application.initializer({
|
2145
|
+
name: "activeModelAdapter",
|
2146
|
+
before: "store",
|
2147
|
+
initialize: K
|
2148
|
+
});
|
2149
|
+
|
2150
|
+
Application.initializer({
|
2151
|
+
name: "transforms",
|
2152
|
+
before: "store",
|
2153
|
+
initialize: K
|
2154
|
+
});
|
2155
|
+
|
2156
|
+
Application.initializer({
|
2157
|
+
name: "data-adapter",
|
2158
|
+
before: "store",
|
2159
|
+
initialize: K
|
2160
|
+
});
|
2161
|
+
|
2162
|
+
Application.initializer({
|
2163
|
+
name: "injectStore",
|
2164
|
+
before: "store",
|
2165
|
+
initialize: K
|
2166
|
+
});
|
2167
|
+
});
|
2168
|
+
});
|
1603
2169
|
define("ember-data/lib/ext/date",
|
1604
2170
|
[],
|
1605
2171
|
function() {
|
@@ -1665,122 +2231,108 @@ define("ember-data/lib/ext/date",
|
|
1665
2231
|
Date.parse = Ember.Date.parse;
|
1666
2232
|
}
|
1667
2233
|
});
|
1668
|
-
define("ember-data/lib/initializers",
|
1669
|
-
["
|
1670
|
-
function(__dependency1__,
|
2234
|
+
define("ember-data/lib/initializers/data_adapter",
|
2235
|
+
["../system/debug/debug_adapter","exports"],
|
2236
|
+
function(__dependency1__, __exports__) {
|
1671
2237
|
"use strict";
|
1672
|
-
var
|
1673
|
-
var JSONSerializer = __dependency2__.JSONSerializer;
|
1674
|
-
var RESTSerializer = __dependency2__.RESTSerializer;
|
1675
|
-
var RESTAdapter = __dependency3__.RESTAdapter;
|
1676
|
-
var DebugAdapter = __dependency4__["default"];
|
1677
|
-
var ContainerProxy = __dependency5__["default"];
|
1678
|
-
var BooleanTransform = __dependency6__.BooleanTransform;
|
1679
|
-
var DateTransform = __dependency6__.DateTransform;
|
1680
|
-
var StringTransform = __dependency6__.StringTransform;
|
1681
|
-
var NumberTransform = __dependency6__.NumberTransform;
|
2238
|
+
var DebugAdapter = __dependency1__["default"];
|
1682
2239
|
|
1683
2240
|
/**
|
1684
|
-
|
1685
|
-
|
1686
|
-
|
1687
|
-
var set = Ember.set;
|
1688
|
-
|
1689
|
-
/*
|
1690
|
-
This code registers an injection for Ember.Application.
|
1691
|
-
|
1692
|
-
If an Ember.js developer defines a subclass of DS.Store on their application,
|
1693
|
-
this code will automatically instantiate it and make it available on the
|
1694
|
-
router.
|
1695
|
-
|
1696
|
-
Additionally, after an application's controllers have been injected, they will
|
1697
|
-
each have the store made available to them.
|
1698
|
-
|
1699
|
-
For example, imagine an Ember.js application with the following classes:
|
1700
|
-
|
1701
|
-
App.Store = DS.Store.extend({
|
1702
|
-
adapter: 'custom'
|
1703
|
-
});
|
2241
|
+
Configures a container with injections on Ember applications
|
2242
|
+
for the Ember-Data store. Accepts an optional namespace argument.
|
1704
2243
|
|
1705
|
-
|
1706
|
-
|
1707
|
-
});
|
1708
|
-
|
1709
|
-
When the application is initialized, `App.Store` will automatically be
|
1710
|
-
instantiated, and the instance of `App.PostsController` will have its `store`
|
1711
|
-
property set to that instance.
|
1712
|
-
|
1713
|
-
Note that this code will only be run if the `ember-application` package is
|
1714
|
-
loaded. If Ember Data is being used in an environment other than a
|
1715
|
-
typical application (e.g., node.js where only `ember-runtime` is available),
|
1716
|
-
this code will be ignored.
|
2244
|
+
@method initializeStoreInjections
|
2245
|
+
@param {Ember.Container} container
|
1717
2246
|
*/
|
2247
|
+
__exports__["default"] = function initializeDebugAdapter(container){
|
2248
|
+
container.register('data-adapter:main', DebugAdapter);
|
2249
|
+
};
|
2250
|
+
});
|
2251
|
+
define("ember-data/lib/initializers/store",
|
2252
|
+
["../serializers","../adapters","../system/container_proxy","../system/store","exports"],
|
2253
|
+
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
|
2254
|
+
"use strict";
|
2255
|
+
var JSONSerializer = __dependency1__.JSONSerializer;
|
2256
|
+
var RESTSerializer = __dependency1__.RESTSerializer;
|
2257
|
+
var RESTAdapter = __dependency2__.RESTAdapter;
|
2258
|
+
var ContainerProxy = __dependency3__["default"];
|
2259
|
+
var Store = __dependency4__["default"];
|
1718
2260
|
|
1719
|
-
|
1720
|
-
|
1721
|
-
|
1722
|
-
|
1723
|
-
initialize: function(container, application) {
|
1724
|
-
application.register('store:main', application.Store || Store);
|
1725
|
-
|
1726
|
-
// allow older names to be looked up
|
1727
|
-
|
1728
|
-
var proxy = new ContainerProxy(container);
|
1729
|
-
proxy.registerDeprecations([
|
1730
|
-
{deprecated: 'serializer:_default', valid: 'serializer:-default'},
|
1731
|
-
{deprecated: 'serializer:_rest', valid: 'serializer:-rest'},
|
1732
|
-
{deprecated: 'adapter:_rest', valid: 'adapter:-rest'}
|
1733
|
-
]);
|
1734
|
-
|
1735
|
-
// new go forward paths
|
1736
|
-
application.register('serializer:-default', JSONSerializer);
|
1737
|
-
application.register('serializer:-rest', RESTSerializer);
|
1738
|
-
application.register('adapter:-rest', RESTAdapter);
|
2261
|
+
/**
|
2262
|
+
Configures a container for use with an Ember-Data
|
2263
|
+
store. Accepts an optional namespace argument.
|
1739
2264
|
|
1740
|
-
|
1741
|
-
|
1742
|
-
|
1743
|
-
|
1744
|
-
|
2265
|
+
@method initializeStore
|
2266
|
+
@param {Ember.Container} container
|
2267
|
+
@param {Object} [application] an application namespace
|
2268
|
+
*/
|
2269
|
+
__exports__["default"] = function initializeStore(container, application){
|
2270
|
+
|
2271
|
+
container.register('store:main', container.lookupFactory('store:application') || (application && application.Store) || Store);
|
1745
2272
|
|
1746
|
-
|
1747
|
-
name: "transforms",
|
1748
|
-
before: "store",
|
2273
|
+
// allow older names to be looked up
|
1749
2274
|
|
1750
|
-
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1755
|
-
|
1756
|
-
});
|
2275
|
+
var proxy = new ContainerProxy(container);
|
2276
|
+
proxy.registerDeprecations([
|
2277
|
+
{deprecated: 'serializer:_default', valid: 'serializer:-default'},
|
2278
|
+
{deprecated: 'serializer:_rest', valid: 'serializer:-rest'},
|
2279
|
+
{deprecated: 'adapter:_rest', valid: 'adapter:-rest'}
|
2280
|
+
]);
|
1757
2281
|
|
1758
|
-
|
1759
|
-
|
1760
|
-
|
2282
|
+
// new go forward paths
|
2283
|
+
container.register('serializer:-default', JSONSerializer);
|
2284
|
+
container.register('serializer:-rest', RESTSerializer);
|
2285
|
+
container.register('adapter:-rest', RESTAdapter);
|
1761
2286
|
|
1762
|
-
|
1763
|
-
|
1764
|
-
|
1765
|
-
|
2287
|
+
// Eagerly generate the store so defaultStore is populated.
|
2288
|
+
// TODO: Do this in a finisher hook
|
2289
|
+
container.lookup('store:main');
|
2290
|
+
};
|
2291
|
+
});
|
2292
|
+
define("ember-data/lib/initializers/store_injections",
|
2293
|
+
["exports"],
|
2294
|
+
function(__exports__) {
|
2295
|
+
"use strict";
|
2296
|
+
/**
|
2297
|
+
Configures a container with injections on Ember applications
|
2298
|
+
for the Ember-Data store. Accepts an optional namespace argument.
|
1766
2299
|
|
1767
|
-
|
1768
|
-
|
1769
|
-
|
2300
|
+
@method initializeStoreInjections
|
2301
|
+
@param {Ember.Container} container
|
2302
|
+
*/
|
2303
|
+
__exports__["default"] = function initializeStoreInjections(container){
|
2304
|
+
container.injection('controller', 'store', 'store:main');
|
2305
|
+
container.injection('route', 'store', 'store:main');
|
2306
|
+
container.injection('serializer', 'store', 'store:main');
|
2307
|
+
container.injection('data-adapter', 'store', 'store:main');
|
2308
|
+
};
|
2309
|
+
});
|
2310
|
+
define("ember-data/lib/initializers/transforms",
|
2311
|
+
["../transforms","exports"],
|
2312
|
+
function(__dependency1__, __exports__) {
|
2313
|
+
"use strict";
|
2314
|
+
var BooleanTransform = __dependency1__.BooleanTransform;
|
2315
|
+
var DateTransform = __dependency1__.DateTransform;
|
2316
|
+
var StringTransform = __dependency1__.StringTransform;
|
2317
|
+
var NumberTransform = __dependency1__.NumberTransform;
|
1770
2318
|
|
1771
|
-
|
1772
|
-
|
1773
|
-
|
1774
|
-
application.inject('serializer', 'store', 'store:main');
|
1775
|
-
application.inject('data-adapter', 'store', 'store:main');
|
1776
|
-
}
|
1777
|
-
});
|
2319
|
+
/**
|
2320
|
+
Configures a container for use with Ember-Data
|
2321
|
+
transforms.
|
1778
2322
|
|
1779
|
-
|
2323
|
+
@method initializeTransforms
|
2324
|
+
@param {Ember.Container} container
|
2325
|
+
*/
|
2326
|
+
__exports__["default"] = function initializeTransforms(container){
|
2327
|
+
container.register('transform:boolean', BooleanTransform);
|
2328
|
+
container.register('transform:date', DateTransform);
|
2329
|
+
container.register('transform:number', NumberTransform);
|
2330
|
+
container.register('transform:string', StringTransform);
|
2331
|
+
};
|
1780
2332
|
});
|
1781
2333
|
define("ember-data/lib/main",
|
1782
|
-
["./core","./ext/date","./system/store","./system/model","./system/changes","./system/adapter","./system/debug","./system/record_arrays","./system/record_array_manager","./adapters","./serializers/json_serializer","./serializers/rest_serializer","../../ember-inflector/lib/main","../../activemodel-adapter/lib/main","./transforms","./system/relationships","./
|
1783
|
-
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __exports__) {
|
2334
|
+
["./core","./ext/date","./system/store","./system/model","./system/changes","./system/adapter","./system/debug","./system/record_arrays","./system/record_array_manager","./adapters","./serializers/json_serializer","./serializers/rest_serializer","../../ember-inflector/lib/main","../../activemodel-adapter/lib/main","./transforms","./system/relationships","./ember-initializer","./setup-container","./system/container_proxy","exports"],
|
2335
|
+
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __exports__) {
|
1784
2336
|
"use strict";
|
1785
2337
|
/**
|
1786
2338
|
Ember Data
|
@@ -1833,8 +2385,9 @@ define("ember-data/lib/main",
|
|
1833
2385
|
|
1834
2386
|
var hasMany = __dependency16__.hasMany;
|
1835
2387
|
var belongsTo = __dependency16__.belongsTo;
|
2388
|
+
var setupContainer = __dependency18__["default"];
|
1836
2389
|
|
1837
|
-
var ContainerProxy =
|
2390
|
+
var ContainerProxy = __dependency19__["default"];
|
1838
2391
|
|
1839
2392
|
DS.Store = Store;
|
1840
2393
|
DS.PromiseArray = PromiseArray;
|
@@ -1886,6 +2439,10 @@ define("ember-data/lib/main",
|
|
1886
2439
|
|
1887
2440
|
DS.ContainerProxy = ContainerProxy;
|
1888
2441
|
|
2442
|
+
DS._setupContainer = setupContainer;
|
2443
|
+
|
2444
|
+
Ember.lookup.DS = DS;
|
2445
|
+
|
1889
2446
|
__exports__["default"] = DS;
|
1890
2447
|
});
|
1891
2448
|
define("ember-data/lib/serializers",
|
@@ -1899,10 +2456,12 @@ define("ember-data/lib/serializers",
|
|
1899
2456
|
__exports__.RESTSerializer = RESTSerializer;
|
1900
2457
|
});
|
1901
2458
|
define("ember-data/lib/serializers/json_serializer",
|
1902
|
-
["exports"],
|
1903
|
-
function(__exports__) {
|
2459
|
+
["../system/changes","exports"],
|
2460
|
+
function(__dependency1__, __exports__) {
|
1904
2461
|
"use strict";
|
1905
|
-
var
|
2462
|
+
var RelationshipChange = __dependency1__.RelationshipChange;
|
2463
|
+
var get = Ember.get, set = Ember.set, isNone = Ember.isNone,
|
2464
|
+
map = Ember.ArrayPolyfills.map;
|
1906
2465
|
|
1907
2466
|
/**
|
1908
2467
|
In Ember Data a Serializer is used to serialize and deserialize
|
@@ -1942,6 +2501,35 @@ define("ember-data/lib/serializers/json_serializer",
|
|
1942
2501
|
*/
|
1943
2502
|
primaryKey: 'id',
|
1944
2503
|
|
2504
|
+
/**
|
2505
|
+
The `attrs` object can be used to declare a simple mapping between
|
2506
|
+
property names on `DS.Model` records and payload keys in the
|
2507
|
+
serialized JSON object representing the record. An object with the
|
2508
|
+
propery `key` can also be used to designate the attribute's key on
|
2509
|
+
the response payload.
|
2510
|
+
|
2511
|
+
Example
|
2512
|
+
|
2513
|
+
```javascript
|
2514
|
+
App.Person = DS.Model.extend({
|
2515
|
+
firstName: DS.attr('string'),
|
2516
|
+
lastName: DS.attr('string'),
|
2517
|
+
occupation: DS.attr('string'),
|
2518
|
+
admin: DS.attr('boolean')
|
2519
|
+
});
|
2520
|
+
|
2521
|
+
App.PersonSerializer = DS.JSONSerializer.extend({
|
2522
|
+
attrs: {
|
2523
|
+
admin: 'is_admin',
|
2524
|
+
occupation: {key: 'career'}
|
2525
|
+
}
|
2526
|
+
});
|
2527
|
+
```
|
2528
|
+
|
2529
|
+
@property attrs
|
2530
|
+
@type {Object}
|
2531
|
+
*/
|
2532
|
+
|
1945
2533
|
/**
|
1946
2534
|
Given a subclass of `DS.Model` and a JSON object this method will
|
1947
2535
|
iterate through each attribute of the `DS.Model` and invoke the
|
@@ -2002,10 +2590,45 @@ define("ember-data/lib/serializers/json_serializer",
|
|
2002
2590
|
normalize: function(type, hash) {
|
2003
2591
|
if (!hash) { return hash; }
|
2004
2592
|
|
2593
|
+
this.normalizeId(hash);
|
2594
|
+
this.normalizeUsingDeclaredMapping(type, hash);
|
2005
2595
|
this.applyTransforms(type, hash);
|
2006
2596
|
return hash;
|
2007
2597
|
},
|
2008
2598
|
|
2599
|
+
/**
|
2600
|
+
@method normalizeUsingDeclaredMapping
|
2601
|
+
@private
|
2602
|
+
*/
|
2603
|
+
normalizeUsingDeclaredMapping: function(type, hash) {
|
2604
|
+
var attrs = get(this, 'attrs'), payloadKey, key;
|
2605
|
+
|
2606
|
+
if (attrs) {
|
2607
|
+
for (key in attrs) {
|
2608
|
+
payloadKey = attrs[key];
|
2609
|
+
if (payloadKey && payloadKey.key) {
|
2610
|
+
payloadKey = payloadKey.key;
|
2611
|
+
}
|
2612
|
+
if (typeof payloadKey === 'string') {
|
2613
|
+
hash[key] = hash[payloadKey];
|
2614
|
+
delete hash[payloadKey];
|
2615
|
+
}
|
2616
|
+
}
|
2617
|
+
}
|
2618
|
+
},
|
2619
|
+
/**
|
2620
|
+
@method normalizeId
|
2621
|
+
@private
|
2622
|
+
*/
|
2623
|
+
normalizeId: function(hash) {
|
2624
|
+
var primaryKey = get(this, 'primaryKey');
|
2625
|
+
|
2626
|
+
if (primaryKey === 'id') { return; }
|
2627
|
+
|
2628
|
+
hash.id = hash[primaryKey];
|
2629
|
+
delete hash[primaryKey];
|
2630
|
+
},
|
2631
|
+
|
2009
2632
|
// SERIALIZE
|
2010
2633
|
/**
|
2011
2634
|
Called when a record is saved in order to convert the
|
@@ -2180,7 +2803,7 @@ define("ember-data/lib/serializers/json_serializer",
|
|
2180
2803
|
`serializeAttribute` can be used to customize how `DS.attr`
|
2181
2804
|
properties are serialized
|
2182
2805
|
|
2183
|
-
For example if you wanted to ensure all
|
2806
|
+
For example if you wanted to ensure all your attributes were always
|
2184
2807
|
serialized as properties on an `attributes` object you could
|
2185
2808
|
write:
|
2186
2809
|
|
@@ -2284,11 +2907,11 @@ define("ember-data/lib/serializers/json_serializer",
|
|
2284
2907
|
*/
|
2285
2908
|
serializeHasMany: function(record, json, relationship) {
|
2286
2909
|
var key = relationship.key;
|
2287
|
-
|
2288
|
-
var relationshipType =
|
2910
|
+
var payloadKey = this.keyForRelationship ? this.keyForRelationship(key, "hasMany") : key;
|
2911
|
+
var relationshipType = RelationshipChange.determineRelationshipType(record.constructor, relationship);
|
2289
2912
|
|
2290
2913
|
if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany') {
|
2291
|
-
json[
|
2914
|
+
json[payloadKey] = get(record, key).mapBy('id');
|
2292
2915
|
// TODO support for polymorphic manyToNone and manyToMany relationships
|
2293
2916
|
}
|
2294
2917
|
},
|
@@ -2552,8 +3175,11 @@ define("ember-data/lib/serializers/json_serializer",
|
|
2552
3175
|
@param {Object} payload
|
2553
3176
|
@return {Array} array An array of deserialized objects
|
2554
3177
|
*/
|
2555
|
-
extractArray: function(store, type,
|
2556
|
-
|
3178
|
+
extractArray: function(store, type, arrayPayload) {
|
3179
|
+
var serializer = this;
|
3180
|
+
return map.call(arrayPayload, function(singlePayload) {
|
3181
|
+
return serializer.normalize(type, singlePayload);
|
3182
|
+
});
|
2557
3183
|
},
|
2558
3184
|
|
2559
3185
|
/**
|
@@ -2645,8 +3271,8 @@ define("ember-data/lib/serializers/json_serializer",
|
|
2645
3271
|
__exports__["default"] = JSONSerializer;
|
2646
3272
|
});
|
2647
3273
|
define("ember-data/lib/serializers/rest_serializer",
|
2648
|
-
["./json_serializer","exports"],
|
2649
|
-
function(__dependency1__, __exports__) {
|
3274
|
+
["./json_serializer","ember-inflector/lib/system/string","exports"],
|
3275
|
+
function(__dependency1__, __dependency2__, __exports__) {
|
2650
3276
|
"use strict";
|
2651
3277
|
/**
|
2652
3278
|
@module ember-data
|
@@ -2657,6 +3283,9 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
2657
3283
|
var forEach = Ember.ArrayPolyfills.forEach;
|
2658
3284
|
var map = Ember.ArrayPolyfills.map;
|
2659
3285
|
|
3286
|
+
var singularize = __dependency2__.singularize;
|
3287
|
+
var camelize = Ember.String.camelize;
|
3288
|
+
|
2660
3289
|
function coerceId(id) {
|
2661
3290
|
return id == null ? null : id+'';
|
2662
3291
|
}
|
@@ -2813,7 +3442,7 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
2813
3442
|
@param {subclass of DS.Model} type
|
2814
3443
|
@param {Object} hash
|
2815
3444
|
@param {String} prop
|
2816
|
-
@
|
3445
|
+
@return {Object}
|
2817
3446
|
*/
|
2818
3447
|
normalize: function(type, hash, prop) {
|
2819
3448
|
this.normalizeId(hash);
|
@@ -2826,7 +3455,8 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
2826
3455
|
this.normalizeHash[prop](hash);
|
2827
3456
|
}
|
2828
3457
|
|
2829
|
-
|
3458
|
+
this.applyTransforms(type, hash);
|
3459
|
+
return hash;
|
2830
3460
|
},
|
2831
3461
|
|
2832
3462
|
/**
|
@@ -2837,7 +3467,7 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
2837
3467
|
|
2838
3468
|
```js
|
2839
3469
|
App.ApplicationSerializer = DS.RESTSerializer.extend({
|
2840
|
-
normalizePayload: function(
|
3470
|
+
normalizePayload: function(payload) {
|
2841
3471
|
delete payload.version;
|
2842
3472
|
delete payload.status;
|
2843
3473
|
return payload;
|
@@ -2846,48 +3476,13 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
2846
3476
|
```
|
2847
3477
|
|
2848
3478
|
@method normalizePayload
|
2849
|
-
@param {
|
2850
|
-
@
|
2851
|
-
@returns {Object} the normalized payload
|
3479
|
+
@param {Object} payload
|
3480
|
+
@return {Object} the normalized payload
|
2852
3481
|
*/
|
2853
|
-
normalizePayload: function(
|
3482
|
+
normalizePayload: function(payload) {
|
2854
3483
|
return payload;
|
2855
3484
|
},
|
2856
3485
|
|
2857
|
-
/**
|
2858
|
-
@method normalizeId
|
2859
|
-
@private
|
2860
|
-
*/
|
2861
|
-
normalizeId: function(hash) {
|
2862
|
-
var primaryKey = get(this, 'primaryKey');
|
2863
|
-
|
2864
|
-
if (primaryKey === 'id') { return; }
|
2865
|
-
|
2866
|
-
hash.id = hash[primaryKey];
|
2867
|
-
delete hash[primaryKey];
|
2868
|
-
},
|
2869
|
-
|
2870
|
-
/**
|
2871
|
-
@method normalizeUsingDeclaredMapping
|
2872
|
-
@private
|
2873
|
-
*/
|
2874
|
-
normalizeUsingDeclaredMapping: function(type, hash) {
|
2875
|
-
var attrs = get(this, 'attrs'), payloadKey, key;
|
2876
|
-
|
2877
|
-
if (attrs) {
|
2878
|
-
for (key in attrs) {
|
2879
|
-
payloadKey = attrs[key];
|
2880
|
-
if (payloadKey && payloadKey.key) {
|
2881
|
-
payloadKey = payloadKey.key;
|
2882
|
-
}
|
2883
|
-
if (typeof payloadKey === 'string') {
|
2884
|
-
hash[key] = hash[payloadKey];
|
2885
|
-
delete hash[payloadKey];
|
2886
|
-
}
|
2887
|
-
}
|
2888
|
-
}
|
2889
|
-
},
|
2890
|
-
|
2891
3486
|
/**
|
2892
3487
|
@method normalizeAttributes
|
2893
3488
|
@private
|
@@ -2960,12 +3555,12 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
2960
3555
|
```js
|
2961
3556
|
App.PostSerializer = DS.RESTSerializer.extend({
|
2962
3557
|
// First, restructure the top-level so it's organized by type
|
2963
|
-
extractSingle: function(store, type, payload, id
|
3558
|
+
extractSingle: function(store, type, payload, id) {
|
2964
3559
|
var comments = payload._embedded.comment;
|
2965
3560
|
delete payload._embedded;
|
2966
3561
|
|
2967
3562
|
payload = { comments: comments, post: payload };
|
2968
|
-
return this._super(store, type, payload, id
|
3563
|
+
return this._super(store, type, payload, id);
|
2969
3564
|
},
|
2970
3565
|
|
2971
3566
|
normalizeHash: {
|
@@ -2995,15 +3590,13 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
2995
3590
|
|
2996
3591
|
@method extractSingle
|
2997
3592
|
@param {DS.Store} store
|
2998
|
-
@param {subclass of DS.Model}
|
3593
|
+
@param {subclass of DS.Model} primaryType
|
2999
3594
|
@param {Object} payload
|
3000
|
-
@param {String}
|
3001
|
-
@
|
3002
|
-
@returns {Object} the primary response to the original request
|
3595
|
+
@param {String} recordId
|
3596
|
+
@return {Object} the primary response to the original request
|
3003
3597
|
*/
|
3004
|
-
extractSingle: function(store, primaryType, payload, recordId
|
3005
|
-
payload = this.normalizePayload(
|
3006
|
-
|
3598
|
+
extractSingle: function(store, primaryType, payload, recordId) {
|
3599
|
+
payload = this.normalizePayload(payload);
|
3007
3600
|
var primaryTypeName = primaryType.typeKey,
|
3008
3601
|
primaryRecord;
|
3009
3602
|
|
@@ -3089,7 +3682,7 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3089
3682
|
App.PostSerializer = DS.RESTSerializer.extend({
|
3090
3683
|
// First, restructure the top-level so it's organized by type
|
3091
3684
|
// and the comments are listed under a post's `comments` key.
|
3092
|
-
extractArray: function(store, type, payload
|
3685
|
+
extractArray: function(store, type, payload) {
|
3093
3686
|
var posts = payload._embedded.post;
|
3094
3687
|
var comments = [];
|
3095
3688
|
var postCache = {};
|
@@ -3107,7 +3700,7 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3107
3700
|
|
3108
3701
|
payload = { comments: comments, posts: payload };
|
3109
3702
|
|
3110
|
-
return this._super(store, type, payload
|
3703
|
+
return this._super(store, type, payload);
|
3111
3704
|
},
|
3112
3705
|
|
3113
3706
|
normalizeHash: {
|
@@ -3141,14 +3734,13 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3141
3734
|
|
3142
3735
|
@method extractArray
|
3143
3736
|
@param {DS.Store} store
|
3144
|
-
@param {subclass of DS.Model}
|
3737
|
+
@param {subclass of DS.Model} primaryType
|
3145
3738
|
@param {Object} payload
|
3146
|
-
@
|
3147
|
-
@returns {Array} The primary array that was returned in response
|
3739
|
+
@return {Array} The primary array that was returned in response
|
3148
3740
|
to the original query.
|
3149
3741
|
*/
|
3150
3742
|
extractArray: function(store, primaryType, payload) {
|
3151
|
-
payload = this.normalizePayload(
|
3743
|
+
payload = this.normalizePayload(payload);
|
3152
3744
|
|
3153
3745
|
var primaryTypeName = primaryType.typeKey,
|
3154
3746
|
primaryArray;
|
@@ -3214,15 +3806,16 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3214
3806
|
@param {Object} payload
|
3215
3807
|
*/
|
3216
3808
|
pushPayload: function(store, payload) {
|
3217
|
-
payload = this.normalizePayload(
|
3809
|
+
payload = this.normalizePayload(payload);
|
3218
3810
|
|
3219
3811
|
for (var prop in payload) {
|
3220
3812
|
var typeName = this.typeForRoot(prop),
|
3221
|
-
type = store.modelFor(typeName)
|
3813
|
+
type = store.modelFor(typeName),
|
3814
|
+
typeSerializer = store.serializerFor(type);
|
3222
3815
|
|
3223
3816
|
/*jshint loopfunc:true*/
|
3224
3817
|
var normalizedArray = map.call(Ember.makeArray(payload[prop]), function(hash) {
|
3225
|
-
return
|
3818
|
+
return typeSerializer.normalize(type, hash, prop);
|
3226
3819
|
}, this);
|
3227
3820
|
|
3228
3821
|
store.pushMany(typeName, normalizedArray);
|
@@ -3230,27 +3823,50 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3230
3823
|
},
|
3231
3824
|
|
3232
3825
|
/**
|
3233
|
-
|
3234
|
-
into
|
3826
|
+
This method is used to convert each JSON root key in the payload
|
3827
|
+
into a typeKey that it can use to look up the appropriate model for
|
3828
|
+
that part of the payload. By default the typeKey for a model is its
|
3829
|
+
name in camelCase, so if your JSON root key is 'fast-car' you would
|
3830
|
+
use typeForRoot to convert it to 'fastCar' so that Ember Data finds
|
3831
|
+
the `FastCar` model.
|
3832
|
+
|
3833
|
+
If you diverge from this norm you should also consider changes to
|
3834
|
+
store._normalizeTypeKey as well.
|
3835
|
+
|
3836
|
+
For example, your server may return prefixed root keys like so:
|
3837
|
+
|
3838
|
+
```js
|
3839
|
+
{
|
3840
|
+
"response-fast-car": {
|
3841
|
+
"id": "1",
|
3842
|
+
"name": "corvette"
|
3843
|
+
}
|
3844
|
+
}
|
3845
|
+
```
|
3235
3846
|
|
3236
|
-
|
3237
|
-
the
|
3847
|
+
In order for Ember Data to know that the model corresponding to
|
3848
|
+
the 'response-fast-car' hash is `FastCar` (typeKey: 'fastCar'),
|
3849
|
+
you can override typeForRoot to convert 'response-fast-car' to
|
3850
|
+
'fastCar' like so:
|
3238
3851
|
|
3239
3852
|
```js
|
3240
3853
|
App.ApplicationSerializer = DS.RESTSerializer.extend({
|
3241
3854
|
typeForRoot: function(root) {
|
3242
|
-
|
3243
|
-
|
3855
|
+
// 'response-fast-car' should become 'fast-car'
|
3856
|
+
var subRoot = root.substring(9);
|
3857
|
+
|
3858
|
+
// _super normalizes 'fast-car' to 'fastCar'
|
3859
|
+
return this._super(subRoot);
|
3244
3860
|
}
|
3245
3861
|
});
|
3246
3862
|
```
|
3247
3863
|
|
3248
3864
|
@method typeForRoot
|
3249
|
-
@param {String}
|
3250
|
-
@
|
3865
|
+
@param {String} key
|
3866
|
+
@return {String} the model's typeKey
|
3251
3867
|
*/
|
3252
|
-
typeForRoot: function(
|
3253
|
-
return
|
3868
|
+
typeForRoot: function(key) {
|
3869
|
+
return camelize(singularize(key));
|
3254
3870
|
},
|
3255
3871
|
|
3256
3872
|
// SERIALIZE
|
@@ -3403,7 +4019,9 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3403
4019
|
|
3404
4020
|
/**
|
3405
4021
|
You can use this method to customize the root keys serialized into the JSON.
|
3406
|
-
By default the REST Serializer sends
|
4022
|
+
By default the REST Serializer sends the typeKey of a model, whih is a camelized
|
4023
|
+
version of the name.
|
4024
|
+
|
3407
4025
|
For example, your server may expect underscored root objects.
|
3408
4026
|
|
3409
4027
|
```js
|
@@ -3422,8 +4040,7 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3422
4040
|
@param {Object} options
|
3423
4041
|
*/
|
3424
4042
|
serializeIntoHash: function(hash, type, record, options) {
|
3425
|
-
|
3426
|
-
hash[root] = this.serialize(record, options);
|
4043
|
+
hash[type.typeKey] = this.serialize(record, options);
|
3427
4044
|
},
|
3428
4045
|
|
3429
4046
|
/**
|
@@ -3440,12 +4057,34 @@ define("ember-data/lib/serializers/rest_serializer",
|
|
3440
4057
|
var key = relationship.key,
|
3441
4058
|
belongsTo = get(record, key);
|
3442
4059
|
key = this.keyForAttribute ? this.keyForAttribute(key) : key;
|
3443
|
-
json[key + "Type"] =
|
4060
|
+
json[key + "Type"] = belongsTo.constructor.typeKey;
|
3444
4061
|
}
|
3445
4062
|
});
|
3446
4063
|
|
3447
4064
|
__exports__["default"] = RESTSerializer;
|
3448
4065
|
});
|
4066
|
+
define("ember-data/lib/setup-container",
|
4067
|
+
["./initializers/store","./initializers/transforms","./initializers/store_injections","./initializers/data_adapter","../../../activemodel-adapter/lib/setup-container","exports"],
|
4068
|
+
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
|
4069
|
+
"use strict";
|
4070
|
+
var initializeStore = __dependency1__["default"];
|
4071
|
+
var initializeTransforms = __dependency2__["default"];
|
4072
|
+
var initializeStoreInjections = __dependency3__["default"];
|
4073
|
+
var initializeDataAdapter = __dependency4__["default"];
|
4074
|
+
var setupActiveModelContainer = __dependency5__["default"];
|
4075
|
+
|
4076
|
+
__exports__["default"] = function setupContainer(container, application){
|
4077
|
+
// application is not a required argument. This ensures
|
4078
|
+
// testing setups can setup a container without booting an
|
4079
|
+
// entire ember application.
|
4080
|
+
|
4081
|
+
initializeDataAdapter(container, application);
|
4082
|
+
initializeTransforms(container, application);
|
4083
|
+
initializeStoreInjections(container, application);
|
4084
|
+
initializeStore(container, application);
|
4085
|
+
setupActiveModelContainer(container, application);
|
4086
|
+
};
|
4087
|
+
});
|
3449
4088
|
define("ember-data/lib/system/adapter",
|
3450
4089
|
["exports"],
|
3451
4090
|
function(__exports__) {
|
@@ -3484,11 +4123,11 @@ define("ember-data/lib/system/adapter",
|
|
3484
4123
|
}
|
3485
4124
|
});
|
3486
4125
|
```
|
3487
|
-
|
4126
|
+
|
3488
4127
|
The `DS.InvalidError` must be constructed with a single object whose
|
3489
4128
|
keys are the invalid model properties, and whose values are the
|
3490
4129
|
corresponding error messages. For example:
|
3491
|
-
|
4130
|
+
|
3492
4131
|
```javascript
|
3493
4132
|
return new DS.InvalidError({
|
3494
4133
|
length: 'Must be less than 15',
|
@@ -3519,20 +4158,26 @@ define("ember-data/lib/system/adapter",
|
|
3519
4158
|
|
3520
4159
|
### Creating an Adapter
|
3521
4160
|
|
3522
|
-
|
4161
|
+
Create a new subclass of `DS.Adapter`, then assign
|
4162
|
+
it to the `ApplicationAdapter` property of the application.
|
3523
4163
|
|
3524
4164
|
```javascript
|
3525
|
-
|
4165
|
+
var MyAdapter = DS.Adapter.extend({
|
3526
4166
|
// ...your code here
|
3527
4167
|
});
|
4168
|
+
|
4169
|
+
App.ApplicationAdapter = MyAdapter;
|
3528
4170
|
```
|
3529
4171
|
|
3530
|
-
|
4172
|
+
Model-specific adapters can be created by assigning your adapter
|
4173
|
+
class to the `ModelName` + `Adapter` property of the application.
|
3531
4174
|
|
3532
4175
|
```javascript
|
3533
|
-
|
3534
|
-
adapter
|
4176
|
+
var MyPostAdapter = DS.Adapter.extend({
|
4177
|
+
// ...Post-specific adapter code goes here
|
3535
4178
|
});
|
4179
|
+
|
4180
|
+
App.PostAdapter = MyPostAdapter;
|
3536
4181
|
```
|
3537
4182
|
|
3538
4183
|
`DS.Adapter` is an abstract base class that you should override in your
|
@@ -3897,24 +4542,21 @@ define("ember-data/lib/system/adapter",
|
|
3897
4542
|
__exports__["default"] = Adapter;
|
3898
4543
|
});
|
3899
4544
|
define("ember-data/lib/system/changes",
|
3900
|
-
["./changes/
|
3901
|
-
function(__dependency1__,
|
4545
|
+
["./changes/relationship_change","exports"],
|
4546
|
+
function(__dependency1__, __exports__) {
|
3902
4547
|
"use strict";
|
3903
4548
|
/**
|
3904
4549
|
@module ember-data
|
3905
4550
|
*/
|
3906
4551
|
|
3907
|
-
var
|
4552
|
+
var RelationshipChange = __dependency1__.RelationshipChange;
|
4553
|
+
var RelationshipChangeAdd = __dependency1__.RelationshipChangeAdd;
|
4554
|
+
var RelationshipChangeRemove = __dependency1__.RelationshipChangeRemove;
|
4555
|
+
var OneToManyChange = __dependency1__.OneToManyChange;
|
4556
|
+
var ManyToNoneChange = __dependency1__.ManyToNoneChange;
|
4557
|
+
var OneToOneChange = __dependency1__.OneToOneChange;
|
4558
|
+
var ManyToManyChange = __dependency1__.ManyToManyChange;
|
3908
4559
|
|
3909
|
-
var RelationshipChange = __dependency2__.RelationshipChange;
|
3910
|
-
var RelationshipChangeAdd = __dependency2__.RelationshipChangeAdd;
|
3911
|
-
var RelationshipChangeRemove = __dependency2__.RelationshipChangeRemove;
|
3912
|
-
var OneToManyChange = __dependency2__.OneToManyChange;
|
3913
|
-
var ManyToNoneChange = __dependency2__.ManyToNoneChange;
|
3914
|
-
var OneToOneChange = __dependency2__.OneToOneChange;
|
3915
|
-
var ManyToManyChange = __dependency2__.ManyToManyChange;
|
3916
|
-
|
3917
|
-
__exports__.AttributeChange = AttributeChange;
|
3918
4560
|
__exports__.RelationshipChange = RelationshipChange;
|
3919
4561
|
__exports__.RelationshipChangeAdd = RelationshipChangeAdd;
|
3920
4562
|
__exports__.RelationshipChangeRemove = RelationshipChangeRemove;
|
@@ -3923,61 +4565,6 @@ define("ember-data/lib/system/changes",
|
|
3923
4565
|
__exports__.OneToOneChange = OneToOneChange;
|
3924
4566
|
__exports__.ManyToManyChange = ManyToManyChange;
|
3925
4567
|
});
|
3926
|
-
define("ember-data/lib/system/changes/attribute_change",
|
3927
|
-
["exports"],
|
3928
|
-
function(__exports__) {
|
3929
|
-
"use strict";
|
3930
|
-
/**
|
3931
|
-
@module ember-data
|
3932
|
-
*/
|
3933
|
-
|
3934
|
-
/**
|
3935
|
-
An AttributeChange object is created whenever a record's
|
3936
|
-
attribute changes value. It is used to track changes to a
|
3937
|
-
record between transaction commits.
|
3938
|
-
|
3939
|
-
@class AttributeChange
|
3940
|
-
@namespace DS
|
3941
|
-
@private
|
3942
|
-
@constructor
|
3943
|
-
*/
|
3944
|
-
function AttributeChange(options) {
|
3945
|
-
this.record = options.record;
|
3946
|
-
this.store = options.store;
|
3947
|
-
this.name = options.name;
|
3948
|
-
this.value = options.value;
|
3949
|
-
this.oldValue = options.oldValue;
|
3950
|
-
}
|
3951
|
-
|
3952
|
-
AttributeChange.createChange = function(options) {
|
3953
|
-
return new AttributeChange(options);
|
3954
|
-
};
|
3955
|
-
|
3956
|
-
AttributeChange.prototype = {
|
3957
|
-
sync: function() {
|
3958
|
-
if (this.value !== this.oldValue) {
|
3959
|
-
this.record.send('becomeDirty');
|
3960
|
-
this.record.updateRecordArraysLater();
|
3961
|
-
}
|
3962
|
-
|
3963
|
-
// TODO: Use this object in the commit process
|
3964
|
-
this.destroy();
|
3965
|
-
},
|
3966
|
-
|
3967
|
-
/**
|
3968
|
-
If the AttributeChange is destroyed (either by being rolled back
|
3969
|
-
or being committed), remove it from the list of pending changes
|
3970
|
-
on the record.
|
3971
|
-
|
3972
|
-
@method destroy
|
3973
|
-
*/
|
3974
|
-
destroy: function() {
|
3975
|
-
delete this.record._changesToSync[this.name];
|
3976
|
-
}
|
3977
|
-
};
|
3978
|
-
|
3979
|
-
__exports__["default"] = AttributeChange;
|
3980
|
-
});
|
3981
4568
|
define("ember-data/lib/system/changes/relationship_change",
|
3982
4569
|
["../model","exports"],
|
3983
4570
|
function(__dependency1__, __exports__) {
|
@@ -4948,6 +5535,8 @@ define("ember-data/lib/system/model/attributes",
|
|
4948
5535
|
`boolean` and `date`. You can define your own transforms by subclassing
|
4949
5536
|
[DS.Transform](/api/data/classes/DS.Transform.html).
|
4950
5537
|
|
5538
|
+
Note that you cannot use `attr` to define an attribute of `id`.
|
5539
|
+
|
4951
5540
|
`DS.attr` takes an optional hash as a second parameter, currently
|
4952
5541
|
supported options are:
|
4953
5542
|
|
@@ -5020,6 +5609,7 @@ define("ember-data/lib/system/model/errors",
|
|
5020
5609
|
function(__exports__) {
|
5021
5610
|
"use strict";
|
5022
5611
|
var get = Ember.get, isEmpty = Ember.isEmpty;
|
5612
|
+
var map = Ember.EnumerableUtils.map;
|
5023
5613
|
|
5024
5614
|
/**
|
5025
5615
|
@module ember-data
|
@@ -5028,6 +5618,65 @@ define("ember-data/lib/system/model/errors",
|
|
5028
5618
|
/**
|
5029
5619
|
Holds validation errors for a given record organized by attribute names.
|
5030
5620
|
|
5621
|
+
Every DS.Model has an `errors` property that is an instance of
|
5622
|
+
`DS.Errors`. This can be used to display validation error
|
5623
|
+
messages returned from the server when a `record.save()` rejects.
|
5624
|
+
|
5625
|
+
For Example, if you had an `User` model that looked like this:
|
5626
|
+
|
5627
|
+
```javascript
|
5628
|
+
App.User = DS.Model.extend({
|
5629
|
+
username: attr('string'),
|
5630
|
+
email: attr('string')
|
5631
|
+
});
|
5632
|
+
```
|
5633
|
+
And you attempted to save a record that did not validate on the backend.
|
5634
|
+
|
5635
|
+
```javascript
|
5636
|
+
var user = store.createRecord('user', {
|
5637
|
+
username: 'tomster',
|
5638
|
+
email: 'invalidEmail'
|
5639
|
+
});
|
5640
|
+
user.save();
|
5641
|
+
```
|
5642
|
+
|
5643
|
+
Your backend data store might return a response that looks like
|
5644
|
+
this. This response will be used to populate the error object.
|
5645
|
+
|
5646
|
+
```javascript
|
5647
|
+
{
|
5648
|
+
"errors": {
|
5649
|
+
"username": ["This username is already taken!"],
|
5650
|
+
"email": ["Doesn't look like a valid email."]
|
5651
|
+
}
|
5652
|
+
}
|
5653
|
+
```
|
5654
|
+
|
5655
|
+
Errors can be displayed to the user by accessing their property name
|
5656
|
+
or using the `messages` property to get an array of all errors.
|
5657
|
+
|
5658
|
+
```handlebars
|
5659
|
+
{{#each errors.messages}}
|
5660
|
+
<div class="error">
|
5661
|
+
{{message}}
|
5662
|
+
</div>
|
5663
|
+
{{/each}}
|
5664
|
+
|
5665
|
+
<label>Username: {{input value=username}} </label>
|
5666
|
+
{{#each errors.username}}
|
5667
|
+
<div class="error">
|
5668
|
+
{{message}}
|
5669
|
+
</div>
|
5670
|
+
{{/each}}
|
5671
|
+
|
5672
|
+
<label>Email: {{input value=email}} </label>
|
5673
|
+
{{#each errors.email}}
|
5674
|
+
<div class="error">
|
5675
|
+
{{message}}
|
5676
|
+
</div>
|
5677
|
+
{{/each}}
|
5678
|
+
```
|
5679
|
+
|
5031
5680
|
@class Errors
|
5032
5681
|
@namespace DS
|
5033
5682
|
@extends Ember.Object
|
@@ -5078,15 +5727,38 @@ define("ember-data/lib/system/model/errors",
|
|
5078
5727
|
/**
|
5079
5728
|
Returns errors for a given attribute
|
5080
5729
|
|
5730
|
+
```javascript
|
5731
|
+
var user = store.createRecord('user', {
|
5732
|
+
username: 'tomster',
|
5733
|
+
email: 'invalidEmail'
|
5734
|
+
});
|
5735
|
+
user.save().catch(function(){
|
5736
|
+
user.get('errors').errorsFor('email'); // ["Doesn't look like a valid email."]
|
5737
|
+
});
|
5738
|
+
```
|
5739
|
+
|
5081
5740
|
@method errorsFor
|
5082
5741
|
@param {String} attribute
|
5083
|
-
@
|
5742
|
+
@return {Array}
|
5084
5743
|
*/
|
5085
5744
|
errorsFor: function(attribute) {
|
5086
5745
|
return get(this, 'errorsByAttributeName').get(attribute);
|
5087
5746
|
},
|
5088
5747
|
|
5089
5748
|
/**
|
5749
|
+
An array containing all of the error messages for this
|
5750
|
+
record. This is useful for displaying all errors to the user.
|
5751
|
+
|
5752
|
+
```handlebars
|
5753
|
+
{{#each errors.messages}}
|
5754
|
+
<div class="error">
|
5755
|
+
{{message}}
|
5756
|
+
</div>
|
5757
|
+
{{/each}}
|
5758
|
+
```
|
5759
|
+
|
5760
|
+
@property messages
|
5761
|
+
@type {Array}
|
5090
5762
|
*/
|
5091
5763
|
messages: Ember.computed.mapBy('content', 'message'),
|
5092
5764
|
|
@@ -5137,6 +5809,14 @@ define("ember-data/lib/system/model/errors",
|
|
5137
5809
|
Adds error messages to a given attribute and sends
|
5138
5810
|
`becameInvalid` event to the record.
|
5139
5811
|
|
5812
|
+
Example:
|
5813
|
+
|
5814
|
+
```javascript
|
5815
|
+
if (!user.get('username') {
|
5816
|
+
user.get('errors').add('username', 'This field is required');
|
5817
|
+
}
|
5818
|
+
```
|
5819
|
+
|
5140
5820
|
@method add
|
5141
5821
|
@param {String} attribute
|
5142
5822
|
@param {Array|String} messages
|
@@ -5162,7 +5842,7 @@ define("ember-data/lib/system/model/errors",
|
|
5162
5842
|
_findOrCreateMessages: function(attribute, messages) {
|
5163
5843
|
var errors = this.errorsFor(attribute);
|
5164
5844
|
|
5165
|
-
return Ember.makeArray(messages)
|
5845
|
+
return map(Ember.makeArray(messages), function(message) {
|
5166
5846
|
return errors.findBy('message', message) || {
|
5167
5847
|
attribute: attribute,
|
5168
5848
|
message: message
|
@@ -5174,6 +5854,27 @@ define("ember-data/lib/system/model/errors",
|
|
5174
5854
|
Removes all error messages from the given attribute and sends
|
5175
5855
|
`becameValid` event to the record if there no more errors left.
|
5176
5856
|
|
5857
|
+
Example:
|
5858
|
+
|
5859
|
+
```javascript
|
5860
|
+
App.User = DS.Model.extend({
|
5861
|
+
email: DS.attr('string'),
|
5862
|
+
twoFactorAuth: DS.attr('boolean'),
|
5863
|
+
phone: DS.attr('string')
|
5864
|
+
});
|
5865
|
+
|
5866
|
+
App.UserEditRoute = Ember.Route.extend({
|
5867
|
+
actions: {
|
5868
|
+
save: function(user) {
|
5869
|
+
if (!user.get('twoFactorAuth')) {
|
5870
|
+
user.get('errors').remove('phone');
|
5871
|
+
}
|
5872
|
+
user.save();
|
5873
|
+
}
|
5874
|
+
}
|
5875
|
+
});
|
5876
|
+
```
|
5877
|
+
|
5177
5878
|
@method remove
|
5178
5879
|
@param {String} attribute
|
5179
5880
|
*/
|
@@ -5195,6 +5896,19 @@ define("ember-data/lib/system/model/errors",
|
|
5195
5896
|
Removes all error messages and sends `becameValid` event
|
5196
5897
|
to the record.
|
5197
5898
|
|
5899
|
+
Example:
|
5900
|
+
|
5901
|
+
```javascript
|
5902
|
+
App.UserEditRoute = Ember.Route.extend({
|
5903
|
+
actions: {
|
5904
|
+
retrySave: function(user) {
|
5905
|
+
user.get('errors').clear();
|
5906
|
+
user.save();
|
5907
|
+
}
|
5908
|
+
}
|
5909
|
+
});
|
5910
|
+
```
|
5911
|
+
|
5198
5912
|
@method clear
|
5199
5913
|
*/
|
5200
5914
|
clear: function() {
|
@@ -5209,9 +5923,22 @@ define("ember-data/lib/system/model/errors",
|
|
5209
5923
|
/**
|
5210
5924
|
Checks if there is error messages for the given attribute.
|
5211
5925
|
|
5926
|
+
```javascript
|
5927
|
+
App.UserEditRoute = Ember.Route.extend({
|
5928
|
+
actions: {
|
5929
|
+
save: function(user) {
|
5930
|
+
if (user.get('errors').has('email')) {
|
5931
|
+
return alert('Please update your email before attempting to save.');
|
5932
|
+
}
|
5933
|
+
user.save();
|
5934
|
+
}
|
5935
|
+
}
|
5936
|
+
});
|
5937
|
+
```
|
5938
|
+
|
5212
5939
|
@method has
|
5213
5940
|
@param {String} attribute
|
5214
|
-
@
|
5941
|
+
@return {Boolean} true if there some errors on given attribute
|
5215
5942
|
*/
|
5216
5943
|
has: function(attribute) {
|
5217
5944
|
return !isEmpty(this.errorsFor(attribute));
|
@@ -5221,11 +5948,12 @@ define("ember-data/lib/system/model/errors",
|
|
5221
5948
|
__exports__["default"] = Errors;
|
5222
5949
|
});
|
5223
5950
|
define("ember-data/lib/system/model/model",
|
5224
|
-
["./states","./errors","exports"],
|
5225
|
-
function(__dependency1__, __dependency2__, __exports__) {
|
5951
|
+
["./states","./errors","../store","exports"],
|
5952
|
+
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
|
5226
5953
|
"use strict";
|
5227
5954
|
var RootState = __dependency1__["default"];
|
5228
5955
|
var Errors = __dependency2__["default"];
|
5956
|
+
var PromiseObject = __dependency3__.PromiseObject;
|
5229
5957
|
/**
|
5230
5958
|
@module ember-data
|
5231
5959
|
*/
|
@@ -5234,6 +5962,7 @@ define("ember-data/lib/system/model/model",
|
|
5234
5962
|
merge = Ember.merge,
|
5235
5963
|
Promise = Ember.RSVP.Promise;
|
5236
5964
|
|
5965
|
+
var JSONSerializer;
|
5237
5966
|
var retrieveFromCurrentState = Ember.computed('currentState', function(key, value) {
|
5238
5967
|
return get(get(this, 'currentState'), key);
|
5239
5968
|
}).readOnly();
|
@@ -5285,7 +6014,7 @@ define("ember-data/lib/system/model/model",
|
|
5285
6014
|
Example
|
5286
6015
|
|
5287
6016
|
```javascript
|
5288
|
-
var record = store.createRecord(
|
6017
|
+
var record = store.createRecord('model');
|
5289
6018
|
record.get('isLoaded'); // true
|
5290
6019
|
|
5291
6020
|
store.find('model', 1).then(function(model) {
|
@@ -5307,13 +6036,13 @@ define("ember-data/lib/system/model/model",
|
|
5307
6036
|
Example
|
5308
6037
|
|
5309
6038
|
```javascript
|
5310
|
-
var record = store.createRecord(
|
6039
|
+
var record = store.createRecord('model');
|
5311
6040
|
record.get('isDirty'); // true
|
5312
6041
|
|
5313
6042
|
store.find('model', 1).then(function(model) {
|
5314
6043
|
model.get('isDirty'); // false
|
5315
6044
|
model.set('foo', 'some value');
|
5316
|
-
model.
|
6045
|
+
model.get('isDirty'); // true
|
5317
6046
|
});
|
5318
6047
|
```
|
5319
6048
|
|
@@ -5331,7 +6060,7 @@ define("ember-data/lib/system/model/model",
|
|
5331
6060
|
Example
|
5332
6061
|
|
5333
6062
|
```javascript
|
5334
|
-
var record = store.createRecord(
|
6063
|
+
var record = store.createRecord('model');
|
5335
6064
|
record.get('isSaving'); // false
|
5336
6065
|
var promise = record.save();
|
5337
6066
|
record.get('isSaving'); // true
|
@@ -5356,10 +6085,26 @@ define("ember-data/lib/system/model/model",
|
|
5356
6085
|
Example
|
5357
6086
|
|
5358
6087
|
```javascript
|
5359
|
-
var record = store.createRecord(
|
5360
|
-
record.get('isDeleted');
|
6088
|
+
var record = store.createRecord('model');
|
6089
|
+
record.get('isDeleted'); // false
|
5361
6090
|
record.deleteRecord();
|
5362
|
-
|
6091
|
+
|
6092
|
+
// Locally deleted
|
6093
|
+
record.get('isDeleted'); // true
|
6094
|
+
record.get('isDirty'); // true
|
6095
|
+
record.get('isSaving'); // false
|
6096
|
+
|
6097
|
+
// Persisting the deletion
|
6098
|
+
var promise = record.save();
|
6099
|
+
record.get('isDeleted'); // true
|
6100
|
+
record.get('isSaving'); // true
|
6101
|
+
|
6102
|
+
// Deletion Persisted
|
6103
|
+
promise.then(function() {
|
6104
|
+
record.get('isDeleted'); // true
|
6105
|
+
record.get('isSaving'); // false
|
6106
|
+
record.get('isDirty'); // false
|
6107
|
+
});
|
5363
6108
|
```
|
5364
6109
|
|
5365
6110
|
@property isDeleted
|
@@ -5376,7 +6121,7 @@ define("ember-data/lib/system/model/model",
|
|
5376
6121
|
Example
|
5377
6122
|
|
5378
6123
|
```javascript
|
5379
|
-
var record = store.createRecord(
|
6124
|
+
var record = store.createRecord('model');
|
5380
6125
|
record.get('isNew'); // true
|
5381
6126
|
|
5382
6127
|
record.save().then(function(model) {
|
@@ -5390,9 +6135,9 @@ define("ember-data/lib/system/model/model",
|
|
5390
6135
|
*/
|
5391
6136
|
isNew: retrieveFromCurrentState,
|
5392
6137
|
/**
|
5393
|
-
If this property is `true` the record is in the `valid` state.
|
5394
|
-
|
5395
|
-
|
6138
|
+
If this property is `true` the record is in the `valid` state.
|
6139
|
+
|
6140
|
+
A record will be in the `valid` state when the adapter did not report any
|
5396
6141
|
server-side validation failures.
|
5397
6142
|
|
5398
6143
|
@property isValid
|
@@ -5412,7 +6157,7 @@ define("ember-data/lib/system/model/model",
|
|
5412
6157
|
Example
|
5413
6158
|
|
5414
6159
|
```javascript
|
5415
|
-
var record = store.createRecord(
|
6160
|
+
var record = store.createRecord('model');
|
5416
6161
|
record.get('dirtyType'); // 'created'
|
5417
6162
|
```
|
5418
6163
|
|
@@ -5424,15 +6169,14 @@ define("ember-data/lib/system/model/model",
|
|
5424
6169
|
|
5425
6170
|
/**
|
5426
6171
|
If `true` the adapter reported that it was unable to save local
|
5427
|
-
changes to the backend
|
5428
|
-
|
5429
|
-
server-side validations failed.
|
6172
|
+
changes to the backend for any reason other than a server-side
|
6173
|
+
validation error.
|
5430
6174
|
|
5431
6175
|
Example
|
5432
6176
|
|
5433
6177
|
```javascript
|
5434
6178
|
record.get('isError'); // false
|
5435
|
-
record.set('foo', '
|
6179
|
+
record.set('foo', 'valid value');
|
5436
6180
|
record.save().then(null, function() {
|
5437
6181
|
record.get('isError'); // true
|
5438
6182
|
});
|
@@ -5479,7 +6223,7 @@ define("ember-data/lib/system/model/model",
|
|
5479
6223
|
attribute.
|
5480
6224
|
|
5481
6225
|
```javascript
|
5482
|
-
var record = store.createRecord(
|
6226
|
+
var record = store.createRecord('model');
|
5483
6227
|
record.get('id'); // null
|
5484
6228
|
|
5485
6229
|
store.find('model', 1).then(function(model) {
|
@@ -5514,7 +6258,7 @@ define("ember-data/lib/system/model/model",
|
|
5514
6258
|
```
|
5515
6259
|
|
5516
6260
|
@property errors
|
5517
|
-
@type {
|
6261
|
+
@type {DS.Errors}
|
5518
6262
|
*/
|
5519
6263
|
errors: Ember.computed(function() {
|
5520
6264
|
var errors = Errors.create();
|
@@ -5540,7 +6284,7 @@ define("ember-data/lib/system/model/model",
|
|
5540
6284
|
|
5541
6285
|
@method serialize
|
5542
6286
|
@param {Object} options
|
5543
|
-
@
|
6287
|
+
@return {Object} an object whose values are primitive JSON values only
|
5544
6288
|
*/
|
5545
6289
|
serialize: function(options) {
|
5546
6290
|
var store = get(this, 'store');
|
@@ -5559,11 +6303,12 @@ define("ember-data/lib/system/model/model",
|
|
5559
6303
|
|
5560
6304
|
@method toJSON
|
5561
6305
|
@param {Object} options
|
5562
|
-
@
|
6306
|
+
@return {Object} A JSON representation of the object.
|
5563
6307
|
*/
|
5564
6308
|
toJSON: function(options) {
|
6309
|
+
if (!JSONSerializer) { JSONSerializer = requireModule("ember-data/lib/serializers/json_serializer")["default"]; }
|
5565
6310
|
// container is for lazy transform lookups
|
5566
|
-
var serializer =
|
6311
|
+
var serializer = JSONSerializer.create({ container: this.container });
|
5567
6312
|
return serializer.serialize(this, options);
|
5568
6313
|
},
|
5569
6314
|
|
@@ -6113,7 +6858,7 @@ define("ember-data/lib/system/model/model",
|
|
6113
6858
|
this._inFlightAttributes = this._attributes;
|
6114
6859
|
this._attributes = {};
|
6115
6860
|
|
6116
|
-
return
|
6861
|
+
return PromiseObject.create({ promise: resolver.promise });
|
6117
6862
|
},
|
6118
6863
|
|
6119
6864
|
/**
|
@@ -6157,7 +6902,7 @@ define("ember-data/lib/system/model/model",
|
|
6157
6902
|
throw reason;
|
6158
6903
|
}, "DS: Model#reload complete, update flags");
|
6159
6904
|
|
6160
|
-
return
|
6905
|
+
return PromiseObject.create({ promise: promise });
|
6161
6906
|
},
|
6162
6907
|
|
6163
6908
|
// FOR USE DURING COMMIT PROCESS
|
@@ -6492,8 +7237,8 @@ define("ember-data/lib/system/model/states",
|
|
6492
7237
|
// adapter reported that server-side validations failed.
|
6493
7238
|
// * isNew: The record was created on the client and the adapter
|
6494
7239
|
// did not yet report that it was successfully saved.
|
6495
|
-
// * isValid:
|
6496
|
-
//
|
7240
|
+
// * isValid: The adapter did not report any server-side validation
|
7241
|
+
// failures.
|
6497
7242
|
|
6498
7243
|
// The dirty state is a abstract state whose functionality is
|
6499
7244
|
// shared between the `created` and `updated` states.
|
@@ -6597,8 +7342,7 @@ define("ember-data/lib/system/model/states",
|
|
6597
7342
|
}
|
6598
7343
|
},
|
6599
7344
|
|
6600
|
-
// A record is in the `invalid`
|
6601
|
-
// invalidations have failed, or if the adapter has indicated
|
7345
|
+
// A record is in the `invalid` if the adapter has indicated
|
6602
7346
|
// the the record failed server-side invalidations.
|
6603
7347
|
invalid: {
|
6604
7348
|
// FLAGS
|
@@ -6618,6 +7362,11 @@ define("ember-data/lib/system/model/states",
|
|
6618
7362
|
|
6619
7363
|
becomeDirty: Ember.K,
|
6620
7364
|
|
7365
|
+
willCommit: function(record) {
|
7366
|
+
get(record, 'errors').clear();
|
7367
|
+
record.transitionTo('inFlight');
|
7368
|
+
},
|
7369
|
+
|
6621
7370
|
rolledBack: function(record) {
|
6622
7371
|
get(record, 'errors').clear();
|
6623
7372
|
},
|
@@ -6628,6 +7377,10 @@ define("ember-data/lib/system/model/states",
|
|
6628
7377
|
|
6629
7378
|
invokeLifecycleCallbacks: function(record) {
|
6630
7379
|
record.triggerLater('becameInvalid', record);
|
7380
|
+
},
|
7381
|
+
|
7382
|
+
exit: function(record) {
|
7383
|
+
record._inFlightAttributes = {};
|
6631
7384
|
}
|
6632
7385
|
}
|
6633
7386
|
};
|
@@ -6949,7 +7702,11 @@ define("ember-data/lib/system/model/states",
|
|
6949
7702
|
invokeLifecycleCallbacks: function(record) {
|
6950
7703
|
record.triggerLater('didDelete', record);
|
6951
7704
|
record.triggerLater('didCommit', record);
|
6952
|
-
}
|
7705
|
+
},
|
7706
|
+
|
7707
|
+
willCommit: Ember.K,
|
7708
|
+
|
7709
|
+
didCommit: Ember.K
|
6953
7710
|
}
|
6954
7711
|
},
|
6955
7712
|
|
@@ -6993,6 +7750,9 @@ define("ember-data/lib/system/record_array_manager",
|
|
6993
7750
|
@module ember-data
|
6994
7751
|
*/
|
6995
7752
|
|
7753
|
+
var RecordArray = __dependency1__.RecordArray;
|
7754
|
+
var FilteredRecordArray = __dependency1__.FilteredRecordArray;
|
7755
|
+
var AdapterPopulatedRecordArray = __dependency1__.AdapterPopulatedRecordArray;
|
6996
7756
|
var ManyArray = __dependency1__.ManyArray;
|
6997
7757
|
var get = Ember.get, set = Ember.set;
|
6998
7758
|
var forEach = Ember.EnumerableUtils.forEach;
|
@@ -7168,7 +7928,7 @@ define("ember-data/lib/system/record_array_manager",
|
|
7168
7928
|
@return {DS.RecordArray}
|
7169
7929
|
*/
|
7170
7930
|
createRecordArray: function(type) {
|
7171
|
-
var array =
|
7931
|
+
var array = RecordArray.create({
|
7172
7932
|
type: type,
|
7173
7933
|
content: Ember.A(),
|
7174
7934
|
store: this.store,
|
@@ -7186,10 +7946,12 @@ define("ember-data/lib/system/record_array_manager",
|
|
7186
7946
|
@method createFilteredRecordArray
|
7187
7947
|
@param {Class} type
|
7188
7948
|
@param {Function} filter
|
7949
|
+
@param {Object} query (optional
|
7189
7950
|
@return {DS.FilteredRecordArray}
|
7190
7951
|
*/
|
7191
|
-
createFilteredRecordArray: function(type, filter) {
|
7192
|
-
var array =
|
7952
|
+
createFilteredRecordArray: function(type, filter, query) {
|
7953
|
+
var array = FilteredRecordArray.create({
|
7954
|
+
query: query,
|
7193
7955
|
type: type,
|
7194
7956
|
content: Ember.A(),
|
7195
7957
|
store: this.store,
|
@@ -7211,11 +7973,12 @@ define("ember-data/lib/system/record_array_manager",
|
|
7211
7973
|
@return {DS.AdapterPopulatedRecordArray}
|
7212
7974
|
*/
|
7213
7975
|
createAdapterPopulatedRecordArray: function(type, query) {
|
7214
|
-
var array =
|
7976
|
+
var array = AdapterPopulatedRecordArray.create({
|
7215
7977
|
type: type,
|
7216
7978
|
query: query,
|
7217
7979
|
content: Ember.A(),
|
7218
|
-
store: this.store
|
7980
|
+
store: this.store,
|
7981
|
+
manager: this
|
7219
7982
|
});
|
7220
7983
|
|
7221
7984
|
this._adapterPopulatedRecordArrays.push(array);
|
@@ -7255,8 +8018,8 @@ define("ember-data/lib/system/record_array_manager",
|
|
7255
8018
|
willDestroy: function(){
|
7256
8019
|
this._super();
|
7257
8020
|
|
7258
|
-
flatten(values(this.filteredRecordArrays.values))
|
7259
|
-
this._adapterPopulatedRecordArrays
|
8021
|
+
forEach(flatten(values(this.filteredRecordArrays.values)), destroy);
|
8022
|
+
forEach(this._adapterPopulatedRecordArrays, destroy);
|
7260
8023
|
}
|
7261
8024
|
});
|
7262
8025
|
|
@@ -7349,9 +8112,13 @@ define("ember-data/lib/system/record_arrays/adapter_populated_record_array",
|
|
7349
8112
|
this.setProperties({
|
7350
8113
|
content: Ember.A(records),
|
7351
8114
|
isLoaded: true,
|
7352
|
-
meta: meta
|
8115
|
+
meta: Ember.copy(meta)
|
7353
8116
|
});
|
7354
8117
|
|
8118
|
+
records.forEach(function(record) {
|
8119
|
+
this.manager.recordArraysForRecord(record).add(this);
|
8120
|
+
}, this);
|
8121
|
+
|
7355
8122
|
// TODO: should triggering didLoad event be the last action of the runLoop?
|
7356
8123
|
Ember.run.once(this, 'trigger', 'didLoad');
|
7357
8124
|
}
|
@@ -7420,9 +8187,13 @@ define("ember-data/lib/system/record_arrays/filtered_record_array",
|
|
7420
8187
|
@method updateFilter
|
7421
8188
|
@private
|
7422
8189
|
*/
|
7423
|
-
|
8190
|
+
_updateFilter: function() {
|
7424
8191
|
var manager = get(this, 'manager');
|
7425
8192
|
manager.updateFilter(this, get(this, 'type'), get(this, 'filterFunction'));
|
8193
|
+
},
|
8194
|
+
|
8195
|
+
updateFilter: Ember.observer(function() {
|
8196
|
+
Ember.run.once(this, this._updateFilter);
|
7426
8197
|
}, 'filterFunction')
|
7427
8198
|
});
|
7428
8199
|
|
@@ -7553,11 +8324,10 @@ define("ember-data/lib/system/record_arrays/many_array",
|
|
7553
8324
|
fetch: function() {
|
7554
8325
|
var records = get(this, 'content'),
|
7555
8326
|
store = get(this, 'store'),
|
7556
|
-
owner = get(this, 'owner')
|
7557
|
-
resolver = Ember.RSVP.defer("DS: ManyArray#fetch " + get(this, 'type'));
|
8327
|
+
owner = get(this, 'owner');
|
7558
8328
|
|
7559
8329
|
var unloadedRecords = records.filterProperty('isEmpty', true);
|
7560
|
-
store.fetchMany(unloadedRecords, owner
|
8330
|
+
store.fetchMany(unloadedRecords, owner);
|
7561
8331
|
},
|
7562
8332
|
|
7563
8333
|
// Overrides Ember.Array's replace method to implement
|
@@ -7717,7 +8487,7 @@ define("ember-data/lib/system/record_arrays/record_array",
|
|
7717
8487
|
Example
|
7718
8488
|
|
7719
8489
|
```javascript
|
7720
|
-
var people = store.all(
|
8490
|
+
var people = store.all('person');
|
7721
8491
|
people.get('isLoaded'); // true
|
7722
8492
|
```
|
7723
8493
|
|
@@ -7731,7 +8501,7 @@ define("ember-data/lib/system/record_arrays/record_array",
|
|
7731
8501
|
Example
|
7732
8502
|
|
7733
8503
|
```javascript
|
7734
|
-
var people = store.all(
|
8504
|
+
var people = store.all('person');
|
7735
8505
|
people.get('isUpdating'); // false
|
7736
8506
|
people.update();
|
7737
8507
|
people.get('isUpdating'); // true
|
@@ -7772,7 +8542,7 @@ define("ember-data/lib/system/record_arrays/record_array",
|
|
7772
8542
|
Example
|
7773
8543
|
|
7774
8544
|
```javascript
|
7775
|
-
var people = store.all(
|
8545
|
+
var people = store.all('person');
|
7776
8546
|
people.get('isUpdating'); // false
|
7777
8547
|
people.update();
|
7778
8548
|
people.get('isUpdating'); // true
|
@@ -7817,7 +8587,7 @@ define("ember-data/lib/system/record_arrays/record_array",
|
|
7817
8587
|
Example
|
7818
8588
|
|
7819
8589
|
```javascript
|
7820
|
-
var messages = store.all(
|
8590
|
+
var messages = store.all('message');
|
7821
8591
|
messages.forEach(function(message) {
|
7822
8592
|
message.set('hasBeenSeen', true);
|
7823
8593
|
});
|
@@ -7856,6 +8626,41 @@ define("ember-data/lib/system/record_arrays/record_array",
|
|
7856
8626
|
|
7857
8627
|
__exports__["default"] = RecordArray;
|
7858
8628
|
});
|
8629
|
+
define("ember-data/lib/system/relationship-meta",
|
8630
|
+
["../../../ember-inflector/lib/system","exports"],
|
8631
|
+
function(__dependency1__, __exports__) {
|
8632
|
+
"use strict";
|
8633
|
+
var singularize = __dependency1__.singularize;
|
8634
|
+
|
8635
|
+
function typeForRelationshipMeta(store, meta) {
|
8636
|
+
var typeKey, type;
|
8637
|
+
|
8638
|
+
typeKey = meta.type || meta.key;
|
8639
|
+
if (typeof typeKey === 'string') {
|
8640
|
+
if (meta.kind === 'hasMany') {
|
8641
|
+
typeKey = singularize(typeKey);
|
8642
|
+
}
|
8643
|
+
type = store.modelFor(typeKey);
|
8644
|
+
} else {
|
8645
|
+
type = meta.type;
|
8646
|
+
}
|
8647
|
+
|
8648
|
+
return type;
|
8649
|
+
}
|
8650
|
+
|
8651
|
+
__exports__.typeForRelationshipMeta = typeForRelationshipMeta;function relationshipFromMeta(store, meta) {
|
8652
|
+
return {
|
8653
|
+
key: meta.key,
|
8654
|
+
kind: meta.kind,
|
8655
|
+
type: typeForRelationshipMeta(store, meta),
|
8656
|
+
options: meta.options,
|
8657
|
+
parentType: meta.parentType,
|
8658
|
+
isRelationship: true
|
8659
|
+
};
|
8660
|
+
}
|
8661
|
+
|
8662
|
+
__exports__.relationshipFromMeta = relationshipFromMeta;
|
8663
|
+
});
|
7859
8664
|
define("ember-data/lib/system/relationships",
|
7860
8665
|
["./relationships/belongs_to","./relationships/has_many","../system/relationships/ext","exports"],
|
7861
8666
|
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
|
@@ -7872,8 +8677,8 @@ define("ember-data/lib/system/relationships",
|
|
7872
8677
|
__exports__.hasMany = hasMany;
|
7873
8678
|
});
|
7874
8679
|
define("ember-data/lib/system/relationships/belongs_to",
|
7875
|
-
["../model","exports"],
|
7876
|
-
function(__dependency1__, __exports__) {
|
8680
|
+
["../model","../store","../changes","../relationship-meta","exports"],
|
8681
|
+
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
|
7877
8682
|
"use strict";
|
7878
8683
|
var get = Ember.get, set = Ember.set,
|
7879
8684
|
isNone = Ember.isNone;
|
@@ -7881,6 +8686,10 @@ define("ember-data/lib/system/relationships/belongs_to",
|
|
7881
8686
|
var Promise = Ember.RSVP.Promise;
|
7882
8687
|
|
7883
8688
|
var Model = __dependency1__.Model;
|
8689
|
+
var PromiseObject = __dependency2__.PromiseObject;
|
8690
|
+
var RelationshipChange = __dependency3__.RelationshipChange;
|
8691
|
+
var relationshipFromMeta = __dependency4__.relationshipFromMeta;
|
8692
|
+
var typeForRelationshipMeta = __dependency4__.typeForRelationshipMeta;
|
7884
8693
|
|
7885
8694
|
/**
|
7886
8695
|
@module ember-data
|
@@ -7893,8 +8702,10 @@ define("ember-data/lib/system/relationships/belongs_to",
|
|
7893
8702
|
promiseLabel = "DS: Async belongsTo " + this + " : " + key,
|
7894
8703
|
promise;
|
7895
8704
|
|
8705
|
+
meta.key = key;
|
8706
|
+
|
7896
8707
|
if (arguments.length === 2) {
|
7897
|
-
return value === undefined ? null :
|
8708
|
+
return value === undefined ? null : PromiseObject.create({
|
7898
8709
|
promise: Promise.cast(value, promiseLabel)
|
7899
8710
|
});
|
7900
8711
|
}
|
@@ -7904,12 +8715,12 @@ define("ember-data/lib/system/relationships/belongs_to",
|
|
7904
8715
|
|
7905
8716
|
if(!isNone(belongsTo)) {
|
7906
8717
|
promise = store.fetchRecord(belongsTo) || Promise.cast(belongsTo, promiseLabel);
|
7907
|
-
return
|
8718
|
+
return PromiseObject.create({
|
7908
8719
|
promise: promise
|
7909
8720
|
});
|
7910
8721
|
} else if (link) {
|
7911
|
-
promise = store.findBelongsTo(this, link, meta);
|
7912
|
-
return
|
8722
|
+
promise = store.findBelongsTo(this, link, relationshipFromMeta(store, meta));
|
8723
|
+
return PromiseObject.create({
|
7913
8724
|
promise: promise
|
7914
8725
|
});
|
7915
8726
|
} else {
|
@@ -7978,7 +8789,8 @@ define("ember-data/lib/system/relationships/belongs_to",
|
|
7978
8789
|
type: type,
|
7979
8790
|
isRelationship: true,
|
7980
8791
|
options: options,
|
7981
|
-
kind: 'belongsTo'
|
8792
|
+
kind: 'belongsTo',
|
8793
|
+
key: null
|
7982
8794
|
};
|
7983
8795
|
|
7984
8796
|
if (options.async) {
|
@@ -8031,7 +8843,7 @@ define("ember-data/lib/system/relationships/belongs_to",
|
|
8031
8843
|
|
8032
8844
|
if (oldParent) {
|
8033
8845
|
var store = get(record, 'store'),
|
8034
|
-
change =
|
8846
|
+
change = RelationshipChange.createChange(record, oldParent, store, { key: key, kind: "belongsTo", changeType: "remove" });
|
8035
8847
|
|
8036
8848
|
change.sync();
|
8037
8849
|
this._changesToSync[key] = change;
|
@@ -8052,7 +8864,7 @@ define("ember-data/lib/system/relationships/belongs_to",
|
|
8052
8864
|
|
8053
8865
|
if (newParent) {
|
8054
8866
|
var store = get(record, 'store'),
|
8055
|
-
change =
|
8867
|
+
change = RelationshipChange.createChange(record, newParent, store, { key: key, kind: "belongsTo", changeType: "add" });
|
8056
8868
|
|
8057
8869
|
change.sync();
|
8058
8870
|
}
|
@@ -8065,11 +8877,13 @@ define("ember-data/lib/system/relationships/belongs_to",
|
|
8065
8877
|
__exports__["default"] = belongsTo;
|
8066
8878
|
});
|
8067
8879
|
define("ember-data/lib/system/relationships/ext",
|
8068
|
-
["../../../../ember-inflector/lib/system","../model"],
|
8069
|
-
function(__dependency1__, __dependency2__) {
|
8880
|
+
["../../../../ember-inflector/lib/system","../relationship-meta","../model"],
|
8881
|
+
function(__dependency1__, __dependency2__, __dependency3__) {
|
8070
8882
|
"use strict";
|
8071
8883
|
var singularize = __dependency1__.singularize;
|
8072
|
-
var
|
8884
|
+
var typeForRelationshipMeta = __dependency2__.typeForRelationshipMeta;
|
8885
|
+
var relationshipFromMeta = __dependency2__.relationshipFromMeta;
|
8886
|
+
var Model = __dependency3__.Model;
|
8073
8887
|
|
8074
8888
|
var get = Ember.get, set = Ember.set;
|
8075
8889
|
|
@@ -8267,18 +9081,15 @@ define("ember-data/lib/system/relationships/ext",
|
|
8267
9081
|
// If the computed property is a relationship, add
|
8268
9082
|
// it to the map.
|
8269
9083
|
if (meta.isRelationship) {
|
8270
|
-
|
8271
|
-
|
8272
|
-
}
|
8273
|
-
|
8274
|
-
var relationshipsForType = map.get(meta.type);
|
9084
|
+
meta.key = name;
|
9085
|
+
var relationshipsForType = map.get(typeForRelationshipMeta(this.store, meta));
|
8275
9086
|
|
8276
9087
|
relationshipsForType.push({ name: name, kind: meta.kind });
|
8277
9088
|
}
|
8278
9089
|
});
|
8279
9090
|
|
8280
9091
|
return map;
|
8281
|
-
}),
|
9092
|
+
}).cacheable(false),
|
8282
9093
|
|
8283
9094
|
/**
|
8284
9095
|
A hash containing lists of the model's relationships, grouped
|
@@ -8358,11 +9169,8 @@ define("ember-data/lib/system/relationships/ext",
|
|
8358
9169
|
// in relationships
|
8359
9170
|
this.eachComputedProperty(function(name, meta) {
|
8360
9171
|
if (meta.isRelationship) {
|
8361
|
-
|
8362
|
-
|
8363
|
-
if (typeof type === 'string') {
|
8364
|
-
type = get(this, type, false) || this.store.modelFor(type);
|
8365
|
-
}
|
9172
|
+
meta.key = name;
|
9173
|
+
type = typeForRelationshipMeta(this.store, meta);
|
8366
9174
|
|
8367
9175
|
|
8368
9176
|
if (!types.contains(type)) {
|
@@ -8372,7 +9180,7 @@ define("ember-data/lib/system/relationships/ext",
|
|
8372
9180
|
});
|
8373
9181
|
|
8374
9182
|
return types;
|
8375
|
-
}),
|
9183
|
+
}).cacheable(false),
|
8376
9184
|
|
8377
9185
|
/**
|
8378
9186
|
A map whose keys are the relationships of a model and whose values are
|
@@ -8406,29 +9214,19 @@ define("ember-data/lib/system/relationships/ext",
|
|
8406
9214
|
@readOnly
|
8407
9215
|
*/
|
8408
9216
|
relationshipsByName: Ember.computed(function() {
|
8409
|
-
var map = Ember.Map.create()
|
9217
|
+
var map = Ember.Map.create();
|
8410
9218
|
|
8411
9219
|
this.eachComputedProperty(function(name, meta) {
|
8412
9220
|
if (meta.isRelationship) {
|
8413
9221
|
meta.key = name;
|
8414
|
-
|
8415
|
-
|
8416
|
-
|
8417
|
-
type = singularize(name);
|
8418
|
-
} else if (!type) {
|
8419
|
-
type = name;
|
8420
|
-
}
|
8421
|
-
|
8422
|
-
if (typeof type === 'string') {
|
8423
|
-
meta.type = this.store.modelFor(type);
|
8424
|
-
}
|
8425
|
-
|
8426
|
-
map.set(name, meta);
|
9222
|
+
var relationship = relationshipFromMeta(this.store, meta);
|
9223
|
+
relationship.type = typeForRelationshipMeta(this.store, meta);
|
9224
|
+
map.set(name, relationship);
|
8427
9225
|
}
|
8428
9226
|
});
|
8429
9227
|
|
8430
9228
|
return map;
|
8431
|
-
}),
|
9229
|
+
}).cacheable(false),
|
8432
9230
|
|
8433
9231
|
/**
|
8434
9232
|
A map whose keys are the fields of the model and whose values are strings
|
@@ -8529,29 +9327,34 @@ define("ember-data/lib/system/relationships/ext",
|
|
8529
9327
|
});
|
8530
9328
|
});
|
8531
9329
|
define("ember-data/lib/system/relationships/has_many",
|
8532
|
-
["exports"],
|
8533
|
-
function(__exports__) {
|
9330
|
+
["../store","../relationship-meta","exports"],
|
9331
|
+
function(__dependency1__, __dependency2__, __exports__) {
|
8534
9332
|
"use strict";
|
8535
9333
|
/**
|
8536
9334
|
@module ember-data
|
8537
9335
|
*/
|
8538
9336
|
|
9337
|
+
var PromiseArray = __dependency1__.PromiseArray;
|
8539
9338
|
var get = Ember.get, set = Ember.set, setProperties = Ember.setProperties;
|
9339
|
+
var relationshipFromMeta = __dependency2__.relationshipFromMeta;
|
9340
|
+
var typeForRelationshipMeta = __dependency2__.typeForRelationshipMeta;
|
8540
9341
|
|
8541
9342
|
function asyncHasMany(type, options, meta) {
|
8542
9343
|
return Ember.computed('data', function(key) {
|
8543
9344
|
var relationship = this._relationships[key],
|
8544
9345
|
promiseLabel = "DS: Async hasMany " + this + " : " + key;
|
8545
9346
|
|
9347
|
+
meta.key = key;
|
9348
|
+
|
8546
9349
|
if (!relationship) {
|
8547
9350
|
var resolver = Ember.RSVP.defer(promiseLabel);
|
8548
9351
|
relationship = buildRelationship(this, key, options, function(store, data) {
|
8549
9352
|
var link = data.links && data.links[key];
|
8550
9353
|
var rel;
|
8551
9354
|
if (link) {
|
8552
|
-
rel = store.findHasMany(this, link, meta, resolver);
|
9355
|
+
rel = store.findHasMany(this, link, relationshipFromMeta(store, meta), resolver);
|
8553
9356
|
} else {
|
8554
|
-
rel = store.findMany(this, data[key], meta
|
9357
|
+
rel = store.findMany(this, data[key], typeForRelationshipMeta(store, meta), resolver);
|
8555
9358
|
}
|
8556
9359
|
// cache the promise so we can use it
|
8557
9360
|
// when we come back and don't need to rebuild
|
@@ -8565,7 +9368,7 @@ define("ember-data/lib/system/relationships/has_many",
|
|
8565
9368
|
return relationship;
|
8566
9369
|
}, null, "DS: Async hasMany records received");
|
8567
9370
|
|
8568
|
-
return
|
9371
|
+
return PromiseArray.create({
|
8569
9372
|
promise: promise
|
8570
9373
|
});
|
8571
9374
|
}).meta(meta).readOnly();
|
@@ -8595,7 +9398,8 @@ define("ember-data/lib/system/relationships/has_many",
|
|
8595
9398
|
type: type,
|
8596
9399
|
isRelationship: true,
|
8597
9400
|
options: options,
|
8598
|
-
kind: 'hasMany'
|
9401
|
+
kind: 'hasMany',
|
9402
|
+
key: null
|
8599
9403
|
};
|
8600
9404
|
|
8601
9405
|
if (options.async) {
|
@@ -8605,7 +9409,7 @@ define("ember-data/lib/system/relationships/has_many",
|
|
8605
9409
|
return Ember.computed('data', function(key) {
|
8606
9410
|
return buildRelationship(this, key, options, function(store, data) {
|
8607
9411
|
var records = data[key];
|
8608
|
-
return store.findMany(this, data[key], meta
|
9412
|
+
return store.findMany(this, data[key], typeForRelationshipMeta(store, meta));
|
8609
9413
|
});
|
8610
9414
|
}).meta(meta).readOnly();
|
8611
9415
|
}
|
@@ -8699,8 +9503,8 @@ define("ember-data/lib/system/relationships/has_many",
|
|
8699
9503
|
__exports__["default"] = hasMany;
|
8700
9504
|
});
|
8701
9505
|
define("ember-data/lib/system/store",
|
8702
|
-
["exports"],
|
8703
|
-
function(__exports__) {
|
9506
|
+
["./adapter","ember-inflector/lib/system/string","exports"],
|
9507
|
+
function(__dependency1__, __dependency2__, __exports__) {
|
8704
9508
|
"use strict";
|
8705
9509
|
/*globals Ember*/
|
8706
9510
|
/*jshint eqnull:true*/
|
@@ -8709,6 +9513,9 @@ define("ember-data/lib/system/store",
|
|
8709
9513
|
@module ember-data
|
8710
9514
|
*/
|
8711
9515
|
|
9516
|
+
var InvalidError = __dependency1__.InvalidError;
|
9517
|
+
var Adapter = __dependency1__.Adapter;
|
9518
|
+
var singularize = __dependency2__.singularize;
|
8712
9519
|
var get = Ember.get, set = Ember.set;
|
8713
9520
|
var once = Ember.run.once;
|
8714
9521
|
var isNone = Ember.isNone;
|
@@ -8717,7 +9524,9 @@ define("ember-data/lib/system/store",
|
|
8717
9524
|
var map = Ember.EnumerableUtils.map;
|
8718
9525
|
var Promise = Ember.RSVP.Promise;
|
8719
9526
|
var copy = Ember.copy;
|
8720
|
-
var Store, PromiseObject, PromiseArray;
|
9527
|
+
var Store, PromiseObject, PromiseArray, RecordArrayManager, Model;
|
9528
|
+
|
9529
|
+
var camelize = Ember.String.camelize;
|
8721
9530
|
|
8722
9531
|
// Implementors Note:
|
8723
9532
|
//
|
@@ -8770,7 +9579,7 @@ define("ember-data/lib/system/store",
|
|
8770
9579
|
specify which store should be used:
|
8771
9580
|
|
8772
9581
|
```javascript
|
8773
|
-
var person = store.find(
|
9582
|
+
var person = store.find('person', 123);
|
8774
9583
|
```
|
8775
9584
|
|
8776
9585
|
By default, the store will talk to your backend using a standard
|
@@ -8786,6 +9595,39 @@ define("ember-data/lib/system/store",
|
|
8786
9595
|
You can learn more about writing a custom adapter by reading the `DS.Adapter`
|
8787
9596
|
documentation.
|
8788
9597
|
|
9598
|
+
### Store createRecord() vs. push() vs. pushPayload() vs. update()
|
9599
|
+
|
9600
|
+
The store provides multiple ways to create new records object. They have
|
9601
|
+
some subtle differences in their use which are detailed below:
|
9602
|
+
|
9603
|
+
[createRecord](#method_createRecord) is used for creating new
|
9604
|
+
records on the client side. This will return a new record in the
|
9605
|
+
`created.uncommitted` state. In order to persist this record to the
|
9606
|
+
backend you will need to call `record.save()`.
|
9607
|
+
|
9608
|
+
[push](#method_push) is used to notify Ember Data's store of new or
|
9609
|
+
updated records that exist in the backend. This will return a record
|
9610
|
+
in the `loaded.saved` state. The primary use-case for `store#push` is
|
9611
|
+
to notify Ember Data about record updates that happen
|
9612
|
+
outside of the normal adapter methods (for example
|
9613
|
+
[SSE](http://dev.w3.org/html5/eventsource/) or [Web
|
9614
|
+
Sockets](http://www.w3.org/TR/2009/WD-websockets-20091222/)).
|
9615
|
+
|
9616
|
+
[pushPayload](#method_pushPayload) is a convenience wrapper for
|
9617
|
+
`store#push` that will deserialize payloads if the
|
9618
|
+
Serializer implements a `pushPayload` method.
|
9619
|
+
|
9620
|
+
[update](#method_update) works like `push`, except it can handle
|
9621
|
+
partial attributes without overwriting the existing record
|
9622
|
+
properties.
|
9623
|
+
|
9624
|
+
Note: When creating a new record using any of the above methods
|
9625
|
+
Ember Data will update `DS.RecordArray`s such as those returned by
|
9626
|
+
`store#all()`, `store#findAll()` or `store#filter()`. This means any
|
9627
|
+
data bindings or computed properties that depend on the RecordArray
|
9628
|
+
will automatically be synced to include the new or updated record
|
9629
|
+
values.
|
9630
|
+
|
8789
9631
|
@class Store
|
8790
9632
|
@namespace DS
|
8791
9633
|
@extends Ember.Object
|
@@ -8798,8 +9640,9 @@ define("ember-data/lib/system/store",
|
|
8798
9640
|
*/
|
8799
9641
|
init: function() {
|
8800
9642
|
// internal bookkeeping; not observable
|
9643
|
+
if (!RecordArrayManager) { RecordArrayManager = requireModule("ember-data/lib/system/record_array_manager")["default"]; }
|
8801
9644
|
this.typeMaps = {};
|
8802
|
-
this.recordArrayManager =
|
9645
|
+
this.recordArrayManager = RecordArrayManager.create({
|
8803
9646
|
store: this
|
8804
9647
|
});
|
8805
9648
|
this._relationshipChanges = {};
|
@@ -8854,7 +9697,7 @@ define("ember-data/lib/system/store",
|
|
8854
9697
|
|
8855
9698
|
@property defaultAdapter
|
8856
9699
|
@private
|
8857
|
-
@
|
9700
|
+
@return DS.Adapter
|
8858
9701
|
*/
|
8859
9702
|
defaultAdapter: Ember.computed('adapter', function() {
|
8860
9703
|
var adapter = get(this, 'adapter');
|
@@ -8893,7 +9736,7 @@ define("ember-data/lib/system/store",
|
|
8893
9736
|
@param {String} type
|
8894
9737
|
@param {Object} properties a hash of properties to set on the
|
8895
9738
|
newly created record.
|
8896
|
-
@
|
9739
|
+
@return {DS.Model} record
|
8897
9740
|
*/
|
8898
9741
|
createRecord: function(type, properties) {
|
8899
9742
|
type = this.modelFor(type);
|
@@ -8931,7 +9774,7 @@ define("ember-data/lib/system/store",
|
|
8931
9774
|
@method _generateId
|
8932
9775
|
@private
|
8933
9776
|
@param {String} type
|
8934
|
-
@
|
9777
|
+
@return {String} if the adapter can generate one, an ID
|
8935
9778
|
*/
|
8936
9779
|
_generateId: function(type) {
|
8937
9780
|
var adapter = this.adapterFor(type);
|
@@ -9028,7 +9871,7 @@ define("ember-data/lib/system/store",
|
|
9028
9871
|
parameter:
|
9029
9872
|
|
9030
9873
|
```javascript
|
9031
|
-
store.find(
|
9874
|
+
store.find('person', { page: 1 });
|
9032
9875
|
```
|
9033
9876
|
|
9034
9877
|
This will ask the adapter's `findQuery` method to find the records for
|
@@ -9080,7 +9923,7 @@ define("ember-data/lib/system/store",
|
|
9080
9923
|
@method findByIds
|
9081
9924
|
@param {String} type
|
9082
9925
|
@param {Array} ids
|
9083
|
-
@
|
9926
|
+
@return {Promise} promise
|
9084
9927
|
*/
|
9085
9928
|
findByIds: function(type, ids) {
|
9086
9929
|
var store = this;
|
@@ -9098,7 +9941,7 @@ define("ember-data/lib/system/store",
|
|
9098
9941
|
@method fetchRecord
|
9099
9942
|
@private
|
9100
9943
|
@param {DS.Model} record
|
9101
|
-
@
|
9944
|
+
@return {Promise} promise
|
9102
9945
|
*/
|
9103
9946
|
fetchRecord: function(record) {
|
9104
9947
|
if (isNone(record)) { return null; }
|
@@ -9179,7 +10022,9 @@ define("ember-data/lib/system/store",
|
|
9179
10022
|
@return {Promise} promise
|
9180
10023
|
*/
|
9181
10024
|
fetchMany: function(records, owner) {
|
9182
|
-
if (!records.length) {
|
10025
|
+
if (!records.length) {
|
10026
|
+
return Ember.RSVP.resolve(records);
|
10027
|
+
}
|
9183
10028
|
|
9184
10029
|
// Group By Type
|
9185
10030
|
var recordsByTypeMap = Ember.MapWithDefault.create({
|
@@ -9209,7 +10054,7 @@ define("ember-data/lib/system/store",
|
|
9209
10054
|
@method hasRecordForId
|
9210
10055
|
@param {String or subclass of DS.Model} type
|
9211
10056
|
@param {String|Integer} id
|
9212
|
-
@
|
10057
|
+
@return {Boolean}
|
9213
10058
|
*/
|
9214
10059
|
hasRecordForId: function(type, id) {
|
9215
10060
|
id = coerceId(id);
|
@@ -9225,7 +10070,7 @@ define("ember-data/lib/system/store",
|
|
9225
10070
|
@private
|
9226
10071
|
@param {String or subclass of DS.Model} type
|
9227
10072
|
@param {String|Integer} id
|
9228
|
-
@
|
10073
|
+
@return {DS.Model} record
|
9229
10074
|
*/
|
9230
10075
|
recordForId: function(type, id) {
|
9231
10076
|
type = this.modelFor(type);
|
@@ -9371,7 +10216,7 @@ define("ember-data/lib/system/store",
|
|
9371
10216
|
@private
|
9372
10217
|
@param {DS.Model} type
|
9373
10218
|
@param {DS.RecordArray} array
|
9374
|
-
@
|
10219
|
+
@return {Promise} promise
|
9375
10220
|
*/
|
9376
10221
|
fetchAll: function(type, array) {
|
9377
10222
|
var adapter = this.adapterFor(type),
|
@@ -9405,7 +10250,7 @@ define("ember-data/lib/system/store",
|
|
9405
10250
|
Example
|
9406
10251
|
|
9407
10252
|
```javascript
|
9408
|
-
var
|
10253
|
+
var localPosts = store.all('post');
|
9409
10254
|
```
|
9410
10255
|
|
9411
10256
|
@method all
|
@@ -9431,7 +10276,7 @@ define("ember-data/lib/system/store",
|
|
9431
10276
|
This method unloads all of the known records for a given type.
|
9432
10277
|
|
9433
10278
|
```javascript
|
9434
|
-
store.unloadAll(
|
10279
|
+
store.unloadAll('post');
|
9435
10280
|
```
|
9436
10281
|
|
9437
10282
|
@method unloadAll
|
@@ -9475,7 +10320,7 @@ define("ember-data/lib/system/store",
|
|
9475
10320
|
Example
|
9476
10321
|
|
9477
10322
|
```javascript
|
9478
|
-
store.filter(
|
10323
|
+
store.filter('post', {unread: true}, function(post) {
|
9479
10324
|
return post.get('unread');
|
9480
10325
|
}).then(function(unreadPosts) {
|
9481
10326
|
unreadPosts.get('length'); // 5
|
@@ -9493,9 +10338,12 @@ define("ember-data/lib/system/store",
|
|
9493
10338
|
*/
|
9494
10339
|
filter: function(type, query, filter) {
|
9495
10340
|
var promise;
|
10341
|
+
var length = arguments.length;
|
10342
|
+
var array;
|
10343
|
+
var hasQuery = length === 3;
|
9496
10344
|
|
9497
10345
|
// allow an optional server query
|
9498
|
-
if (
|
10346
|
+
if (hasQuery) {
|
9499
10347
|
promise = this.findQuery(type, query);
|
9500
10348
|
} else if (arguments.length === 2) {
|
9501
10349
|
filter = query;
|
@@ -9503,10 +10351,15 @@ define("ember-data/lib/system/store",
|
|
9503
10351
|
|
9504
10352
|
type = this.modelFor(type);
|
9505
10353
|
|
9506
|
-
|
9507
|
-
.createFilteredRecordArray(type, filter);
|
10354
|
+
if (hasQuery) {
|
10355
|
+
array = this.recordArrayManager.createFilteredRecordArray(type, filter, query);
|
10356
|
+
} else {
|
10357
|
+
array = this.recordArrayManager.createFilteredRecordArray(type, filter);
|
10358
|
+
}
|
10359
|
+
|
9508
10360
|
promise = promise || Promise.cast(array);
|
9509
10361
|
|
10362
|
+
|
9510
10363
|
return promiseArray(promise.then(function() {
|
9511
10364
|
return array;
|
9512
10365
|
}, null, "DS: Store#filter of " + type));
|
@@ -9520,9 +10373,9 @@ define("ember-data/lib/system/store",
|
|
9520
10373
|
Example
|
9521
10374
|
|
9522
10375
|
```javascript
|
9523
|
-
store.recordIsLoaded(
|
9524
|
-
store.find(
|
9525
|
-
store.recordIsLoaded(
|
10376
|
+
store.recordIsLoaded('post', 1); // false
|
10377
|
+
store.find('post', 1).then(function() {
|
10378
|
+
store.recordIsLoaded('post', 1); // true
|
9526
10379
|
});
|
9527
10380
|
```
|
9528
10381
|
|
@@ -9606,7 +10459,9 @@ define("ember-data/lib/system/store",
|
|
9606
10459
|
adapter = this.adapterFor(record.constructor),
|
9607
10460
|
operation;
|
9608
10461
|
|
9609
|
-
if (get(record, '
|
10462
|
+
if (get(record, 'currentState.stateName') === 'root.deleted.saved') {
|
10463
|
+
return resolver.resolve(record);
|
10464
|
+
} else if (get(record, 'isNew')) {
|
9610
10465
|
operation = 'createRecord';
|
9611
10466
|
} else if (get(record, 'isDeleted')) {
|
9612
10467
|
operation = 'deleteRecord';
|
@@ -9749,7 +10604,7 @@ define("ember-data/lib/system/store",
|
|
9749
10604
|
|
9750
10605
|
@method modelFor
|
9751
10606
|
@param {String or subclass of DS.Model} key
|
9752
|
-
@
|
10607
|
+
@return {subclass of DS.Model}
|
9753
10608
|
*/
|
9754
10609
|
modelFor: function(key) {
|
9755
10610
|
var factory;
|
@@ -9760,10 +10615,13 @@ define("ember-data/lib/system/store",
|
|
9760
10615
|
|
9761
10616
|
factory = this.container.lookupFactory(normalizedKey);
|
9762
10617
|
if (!factory) { throw new Ember.Error("No model was found for '" + key + "'"); }
|
9763
|
-
factory.typeKey = normalizedKey.split(':', 2)[1];
|
10618
|
+
factory.typeKey = this._normalizeTypeKey(normalizedKey.split(':', 2)[1]);
|
9764
10619
|
} else {
|
9765
|
-
// A factory already supplied.
|
10620
|
+
// A factory already supplied. Ensure it has a normalized key.
|
9766
10621
|
factory = key;
|
10622
|
+
if (factory.typeKey) {
|
10623
|
+
factory.typeKey = this._normalizeTypeKey(factory.typeKey);
|
10624
|
+
}
|
9767
10625
|
}
|
9768
10626
|
|
9769
10627
|
factory.store = this;
|
@@ -9828,7 +10686,7 @@ define("ember-data/lib/system/store",
|
|
9828
10686
|
@method push
|
9829
10687
|
@param {String or subclass of DS.Model} type
|
9830
10688
|
@param {Object} data
|
9831
|
-
@
|
10689
|
+
@return {DS.Model} the record that was created or
|
9832
10690
|
updated.
|
9833
10691
|
*/
|
9834
10692
|
push: function(type, data, _partial) {
|
@@ -9850,13 +10708,9 @@ define("ember-data/lib/system/store",
|
|
9850
10708
|
/**
|
9851
10709
|
Push some raw data into the store.
|
9852
10710
|
|
9853
|
-
The data will be automatically deserialized using the
|
9854
|
-
serializer for the `type` param.
|
9855
|
-
|
9856
10711
|
This method can be used both to push in brand new
|
9857
|
-
records, as well as to update existing records.
|
9858
|
-
|
9859
|
-
You can push in more than one type of object at once.
|
10712
|
+
records, as well as to update existing records. You
|
10713
|
+
can push in more than one type of object at once.
|
9860
10714
|
All objects should be in the format expected by the
|
9861
10715
|
serializer.
|
9862
10716
|
|
@@ -9872,11 +10726,27 @@ define("ember-data/lib/system/store",
|
|
9872
10726
|
]
|
9873
10727
|
}
|
9874
10728
|
|
9875
|
-
store.pushPayload(
|
10729
|
+
store.pushPayload(pushData);
|
10730
|
+
```
|
10731
|
+
|
10732
|
+
By default, the data will be deserialized using a default
|
10733
|
+
serializer (the application serializer if it exists).
|
10734
|
+
|
10735
|
+
Alternativly, `pushPayload` will accept a model type which
|
10736
|
+
will determine which serializer will process the payload.
|
10737
|
+
However, the serializer itself (processing this data via
|
10738
|
+
`normalizePayload`) will not know which model it is
|
10739
|
+
deserializing.
|
10740
|
+
|
10741
|
+
```js
|
10742
|
+
App.ApplicationSerializer = DS.ActiveModelSerializer;
|
10743
|
+
App.PostSerializer = DS.JSONSerializer;
|
10744
|
+
store.pushPayload('comment', pushData); // Will use the ApplicationSerializer
|
10745
|
+
store.pushPayload('post', pushData); // Will use the PostSerializer
|
9876
10746
|
```
|
9877
10747
|
|
9878
10748
|
@method pushPayload
|
9879
|
-
@param {String} type
|
10749
|
+
@param {String} type Optionally, a model used to determine which serializer will be used
|
9880
10750
|
@param {Object} payload
|
9881
10751
|
*/
|
9882
10752
|
pushPayload: function (type, payload) {
|
@@ -9890,6 +10760,38 @@ define("ember-data/lib/system/store",
|
|
9890
10760
|
serializer.pushPayload(this, payload);
|
9891
10761
|
},
|
9892
10762
|
|
10763
|
+
/**
|
10764
|
+
Update existing records in the store. Unlike [push](#method_push),
|
10765
|
+
update will merge the new data properties with the existing
|
10766
|
+
properties. This makes it safe to use with a subset of record
|
10767
|
+
attributes. This method expects normalized data.
|
10768
|
+
|
10769
|
+
`update` is useful if you app broadcasts partial updates to
|
10770
|
+
records.
|
10771
|
+
|
10772
|
+
```js
|
10773
|
+
App.Person = DS.Model.extend({
|
10774
|
+
firstName: DS.attr('string'),
|
10775
|
+
lastName: DS.attr('string')
|
10776
|
+
});
|
10777
|
+
|
10778
|
+
store.get('person', 1).then(function(tom) {
|
10779
|
+
tom.get('firstName'); // Tom
|
10780
|
+
tom.get('lastName'); // Dale
|
10781
|
+
|
10782
|
+
var updateEvent = {id: 1, firstName: "TomHuda"};
|
10783
|
+
store.update('person', updateEvent);
|
10784
|
+
|
10785
|
+
tom.get('firstName'); // TomHuda
|
10786
|
+
tom.get('lastName'); // Dale
|
10787
|
+
});
|
10788
|
+
```
|
10789
|
+
|
10790
|
+
@method update
|
10791
|
+
@param {String} type
|
10792
|
+
@param {Object} data
|
10793
|
+
@return {DS.Model} the record that was updated.
|
10794
|
+
*/
|
9893
10795
|
update: function(type, data) {
|
9894
10796
|
|
9895
10797
|
return this.push(type, data, true);
|
@@ -9934,7 +10836,7 @@ define("ember-data/lib/system/store",
|
|
9934
10836
|
@param {subclass of DS.Model} type
|
9935
10837
|
@param {String} id
|
9936
10838
|
@param {Object} data
|
9937
|
-
@
|
10839
|
+
@return {DS.Model} record
|
9938
10840
|
*/
|
9939
10841
|
buildRecord: function(type, id, data) {
|
9940
10842
|
var typeMap = this.typeMapFor(type),
|
@@ -10052,7 +10954,7 @@ define("ember-data/lib/system/store",
|
|
10052
10954
|
@method adapterFor
|
10053
10955
|
@private
|
10054
10956
|
@param {subclass of DS.Model} type
|
10055
|
-
@
|
10957
|
+
@return DS.Adapter
|
10056
10958
|
*/
|
10057
10959
|
adapterFor: function(type) {
|
10058
10960
|
var container = this.container, adapter;
|
@@ -10093,18 +10995,33 @@ define("ember-data/lib/system/store",
|
|
10093
10995
|
},
|
10094
10996
|
|
10095
10997
|
willDestroy: function() {
|
10096
|
-
var
|
10097
|
-
var keys = Ember.keys(
|
10998
|
+
var typeMaps = this.typeMaps;
|
10999
|
+
var keys = Ember.keys(typeMaps);
|
10098
11000
|
var store = this;
|
10099
|
-
|
11001
|
+
|
11002
|
+
var types = map(keys, byType);
|
10100
11003
|
|
10101
11004
|
this.recordArrayManager.destroy();
|
10102
11005
|
|
10103
|
-
|
11006
|
+
forEach(types, this.unloadAll, this);
|
10104
11007
|
|
10105
11008
|
function byType(entry) {
|
10106
|
-
return
|
11009
|
+
return typeMaps[entry]['type'];
|
10107
11010
|
}
|
11011
|
+
|
11012
|
+
},
|
11013
|
+
|
11014
|
+
/**
|
11015
|
+
All typeKeys are camelCase internally. Changing this function may
|
11016
|
+
require changes to other normalization hooks (such as typeForRoot).
|
11017
|
+
|
11018
|
+
@method _normalizeTypeKey
|
11019
|
+
@private
|
11020
|
+
@param {String} type
|
11021
|
+
@return {String} if the adapter can generate one, an ID
|
11022
|
+
*/
|
11023
|
+
_normalizeTypeKey: function(key) {
|
11024
|
+
return camelize(singularize(key));
|
10108
11025
|
}
|
10109
11026
|
});
|
10110
11027
|
|
@@ -10134,7 +11051,8 @@ define("ember-data/lib/system/store",
|
|
10134
11051
|
}
|
10135
11052
|
|
10136
11053
|
function deserializeRecordId(store, data, key, relationship, id) {
|
10137
|
-
if (
|
11054
|
+
if (!Model) { Model = requireModule("ember-data/lib/system/model")["Model"]; }
|
11055
|
+
if (isNone(id) || id instanceof Model) {
|
10138
11056
|
return;
|
10139
11057
|
}
|
10140
11058
|
|
@@ -10167,14 +11085,14 @@ define("ember-data/lib/system/store",
|
|
10167
11085
|
// in the payload, so add them back in manually.
|
10168
11086
|
function addUnsavedRecords(record, key, data) {
|
10169
11087
|
if(record) {
|
10170
|
-
data.pushObjects(record.get(key).filterBy('isNew'));
|
11088
|
+
Ember.A(data).pushObjects(record.get(key).filterBy('isNew'));
|
10171
11089
|
}
|
10172
11090
|
}
|
10173
11091
|
|
10174
11092
|
// Delegation to the adapter and promise management
|
10175
11093
|
/**
|
10176
11094
|
A `PromiseArray` is an object that acts like both an `Ember.Array`
|
10177
|
-
and a promise. When the promise is resolved the
|
11095
|
+
and a promise. When the promise is resolved the resulting value
|
10178
11096
|
will be set to the `PromiseArray`'s `content` property. This makes
|
10179
11097
|
it easy to create data bindings with the `PromiseArray` that will be
|
10180
11098
|
updated when the promise resolves.
|
@@ -10384,7 +11302,7 @@ define("ember-data/lib/system/store",
|
|
10384
11302
|
store.didSaveRecord(record, payload);
|
10385
11303
|
return record;
|
10386
11304
|
}, function(reason) {
|
10387
|
-
if (reason instanceof
|
11305
|
+
if (reason instanceof InvalidError) {
|
10388
11306
|
store.recordWasInvalid(record, reason.errors);
|
10389
11307
|
} else {
|
10390
11308
|
store.recordWasError(record, reason);
|
@@ -10429,12 +11347,13 @@ define("ember-data/lib/transforms/base",
|
|
10429
11347
|
Example
|
10430
11348
|
|
10431
11349
|
```javascript
|
10432
|
-
|
11350
|
+
// Converts centigrade in the JSON to fahrenheit in the app
|
11351
|
+
App.TemperatureTransform = DS.Transform.extend({
|
10433
11352
|
deserialize: function(serialized) {
|
10434
|
-
return serialized;
|
11353
|
+
return (serialized * 1.8) + 32;
|
10435
11354
|
},
|
10436
11355
|
serialize: function(deserialized) {
|
10437
|
-
return deserialized;
|
11356
|
+
return (deserialized - 32) / 1.8;
|
10438
11357
|
}
|
10439
11358
|
});
|
10440
11359
|
```
|
@@ -10734,11 +11653,11 @@ define("ember-inflector/lib/main",
|
|
10734
11653
|
function(__dependency1__, __dependency2__, __exports__) {
|
10735
11654
|
"use strict";
|
10736
11655
|
var Inflector = __dependency1__.Inflector;
|
10737
|
-
var
|
11656
|
+
var defaultRules = __dependency1__.defaultRules;
|
10738
11657
|
var pluralize = __dependency1__.pluralize;
|
10739
11658
|
var singularize = __dependency1__.singularize;
|
10740
11659
|
|
10741
|
-
Inflector.defaultRules =
|
11660
|
+
Inflector.defaultRules = defaultRules;
|
10742
11661
|
Ember.Inflector = Inflector;
|
10743
11662
|
|
10744
11663
|
Ember.String.pluralize = pluralize;
|
@@ -10895,8 +11814,8 @@ define("ember-inflector/lib/system/inflector",
|
|
10895
11814
|
```js
|
10896
11815
|
var inflector = new Ember.Inflector(Ember.Inflector.defaultRules);
|
10897
11816
|
|
10898
|
-
inflector.pluralize('cow') //=> 'kine'
|
10899
|
-
inflector.singularize('kine') //=> 'cow'
|
11817
|
+
inflector.pluralize('cow'); //=> 'kine'
|
11818
|
+
inflector.singularize('kine'); //=> 'cow'
|
10900
11819
|
```
|
10901
11820
|
|
10902
11821
|
Creating an inflector and adding rules later.
|
@@ -10904,13 +11823,13 @@ define("ember-inflector/lib/system/inflector",
|
|
10904
11823
|
```javascript
|
10905
11824
|
var inflector = Ember.Inflector.inflector;
|
10906
11825
|
|
10907
|
-
inflector.pluralize('advice') // => 'advices'
|
11826
|
+
inflector.pluralize('advice'); // => 'advices'
|
10908
11827
|
inflector.uncountable('advice');
|
10909
|
-
inflector.pluralize('advice') // => 'advice'
|
11828
|
+
inflector.pluralize('advice'); // => 'advice'
|
10910
11829
|
|
10911
|
-
inflector.pluralize('formula') // => 'formulas'
|
11830
|
+
inflector.pluralize('formula'); // => 'formulas'
|
10912
11831
|
inflector.irregular('formula', 'formulae');
|
10913
|
-
inflector.pluralize('formula') // => 'formulae'
|
11832
|
+
inflector.pluralize('formula'); // => 'formulae'
|
10914
11833
|
|
10915
11834
|
// you would not need to add these as they are the default rules
|
10916
11835
|
inflector.plural(/$/, 's');
|
@@ -11075,4 +11994,4 @@ define("ember-inflector/lib/system/string",
|
|
11075
11994
|
__exports__.singularize = singularize;
|
11076
11995
|
});
|
11077
11996
|
global.DS = requireModule('ember-data/lib/main')['default'];
|
11078
|
-
}(
|
11997
|
+
}(Ember.lookup));
|