You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by vs...@apache.org on 2017/06/23 07:02:16 UTC
[07/35] ambari git commit: AMBARI-21330.Remove slider view from
Ambari-3.0.0(Venkata Sairam)
http://git-wip-us.apache.org/repos/asf/ambari/blob/ec8deeba/contrib/views/slider/src/main/resources/ui/vendor/scripts/development/ember-data.js
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/resources/ui/vendor/scripts/development/ember-data.js b/contrib/views/slider/src/main/resources/ui/vendor/scripts/development/ember-data.js
deleted file mode 100644
index 0fb494a..0000000
--- a/contrib/views/slider/src/main/resources/ui/vendor/scripts/development/ember-data.js
+++ /dev/null
@@ -1,10620 +0,0 @@
-/*!
- * @overview Ember Data
- * @copyright Copyright 2011-2014 Tilde Inc. and contributors.
- * Portions Copyright 2011 LivingSocial Inc.
- * @license Licensed under MIT license (see license.js)
- * @version 1.0.0-beta.7+canary.238bb5ce
- */
-
-
-(function() {
-var define, requireModule;
-
-(function() {
- var registry = {}, seen = {};
-
- define = function(name, deps, callback) {
- registry[name] = { deps: deps, callback: callback };
- };
-
- requireModule = function(name) {
- if (seen[name]) { return seen[name]; }
- seen[name] = {};
-
- var mod, deps, callback, reified , exports;
-
- mod = registry[name];
-
- if (!mod) {
- throw new Error("Module '" + name + "' not found.");
- }
-
- deps = mod.deps;
- callback = mod.callback;
- reified = [];
- exports;
-
- for (var i=0, l=deps.length; i<l; i++) {
- if (deps[i] === 'exports') {
- reified.push(exports = {});
- } else {
- reified.push(requireModule(deps[i]));
- }
- }
-
- var value = callback.apply(this, reified);
- return seen[name] = exports || value;
- };
-})();
-(function() {
-/**
- @module ember-data
-*/
-
-/**
- All Ember Data methods and functions are defined inside of this namespace.
-
- @class DS
- @static
-*/
-var DS;
-if ('undefined' === typeof DS) {
- /**
- @property VERSION
- @type String
- @default '1.0.0-beta.7+canary.238bb5ce'
- @static
- */
- DS = Ember.Namespace.create({
- VERSION: '1.0.0-beta.7+canary.238bb5ce'
- });
-
- if ('undefined' !== typeof window) {
- window.DS = DS;
- }
-
- if (Ember.libraries) {
- Ember.libraries.registerCoreLibrary('Ember Data', DS.VERSION);
- }
-}
-
-})();
-
-
-
-(function() {
-/**
- This is used internally to enable deprecation of container paths and provide
- a decent message to the user indicating how to fix the issue.
-
- @class ContainerProxy
- @namespace DS
- @private
-*/
-var ContainerProxy = function (container){
- this.container = container;
-};
-
-ContainerProxy.prototype.aliasedFactory = function(path, preLookup) {
- var _this = this;
-
- return {create: function(){
- if (preLookup) { preLookup(); }
-
- return _this.container.lookup(path);
- }};
-};
-
-ContainerProxy.prototype.registerAlias = function(source, dest, preLookup) {
- var factory = this.aliasedFactory(dest, preLookup);
-
- return this.container.register(source, factory);
-};
-
-ContainerProxy.prototype.registerDeprecation = function(deprecated, valid) {
- var preLookupCallback = function(){
- Ember.deprecate("You tried to look up '" + deprecated + "', " +
- "but this has been deprecated in favor of '" + valid + "'.", false);
- };
-
- return this.registerAlias(deprecated, valid, preLookupCallback);
-};
-
-ContainerProxy.prototype.registerDeprecations = function(proxyPairs) {
- for (var i = proxyPairs.length; i > 0; i--) {
- var proxyPair = proxyPairs[i - 1],
- deprecated = proxyPair['deprecated'],
- valid = proxyPair['valid'];
-
- this.registerDeprecation(deprecated, valid);
- }
-};
-
-DS.ContainerProxy = ContainerProxy;
-
-})();
-
-
-
-(function() {
-var get = Ember.get, set = Ember.set, isNone = Ember.isNone;
-
-// Simple dispatcher to support overriding the aliased
-// method in subclasses.
-function aliasMethod(methodName) {
- return function() {
- return this[methodName].apply(this, arguments);
- };
-}
-
-/**
- In Ember Data a Serializer is used to serialize and deserialize
- records when they are transferred in and out of an external source.
- This process involves normalizing property names, transforming
- attribute values and serializing relationships.
-
- For maximum performance Ember Data recommends you use the
- [RESTSerializer](DS.RESTSerializer.html) or one of its subclasses.
-
- `JSONSerializer` is useful for simpler or legacy backends that may
- not support the http://jsonapi.org/ spec.
-
- @class JSONSerializer
- @namespace DS
-*/
-DS.JSONSerializer = Ember.Object.extend({
- /**
- The primaryKey is used when serializing and deserializing
- data. Ember Data always uses the `id` property to store the id of
- the record. The external source may not always follow this
- convention. In these cases it is useful to override the
- primaryKey property to match the primaryKey of your external
- store.
-
- Example
-
- ```javascript
- App.ApplicationSerializer = DS.JSONSerializer.extend({
- primaryKey: '_id'
- });
- ```
-
- @property primaryKey
- @type {String}
- @default 'id'
- */
- primaryKey: 'id',
-
- /**
- Given a subclass of `DS.Model` and a JSON object this method will
- iterate through each attribute of the `DS.Model` and invoke the
- `DS.Transform#deserialize` method on the matching property of the
- JSON object. This method is typically called after the
- serializer's `normalize` method.
-
- @method applyTransforms
- @private
- @param {subclass of DS.Model} type
- @param {Object} data The data to transform
- @return {Object} data The transformed data object
- */
- applyTransforms: function(type, data) {
- type.eachTransformedAttribute(function(key, type) {
- var transform = this.transformFor(type);
- data[key] = transform.deserialize(data[key]);
- }, this);
-
- return data;
- },
-
- /**
- Normalizes a part of the JSON payload returned by
- the server. You should override this method, munge the hash
- and call super if you have generic normalization to do.
-
- It takes the type of the record that is being normalized
- (as a DS.Model class), the property where the hash was
- originally found, and the hash to normalize.
-
- You can use this method, for example, to normalize underscored keys to camelized
- or other general-purpose normalizations.
-
- Example
-
- ```javascript
- App.ApplicationSerializer = DS.JSONSerializer.extend({
- normalize: function(type, hash) {
- var fields = Ember.get(type, 'fields');
- fields.forEach(function(field) {
- var payloadField = Ember.String.underscore(field);
- if (field === payloadField) { return; }
-
- hash[field] = hash[payloadField];
- delete hash[payloadField];
- });
- return this._super.apply(this, arguments);
- }
- });
- ```
-
- @method normalize
- @param {subclass of DS.Model} type
- @param {Object} hash
- @return {Object}
- */
- normalize: function(type, hash) {
- if (!hash) { return hash; }
-
- this.applyTransforms(type, hash);
- return hash;
- },
-
- // SERIALIZE
- /**
- Called when a record is saved in order to convert the
- record into JSON.
-
- By default, it creates a JSON object with a key for
- each attribute and belongsTo relationship.
-
- For example, consider this model:
-
- ```javascript
- App.Comment = DS.Model.extend({
- title: DS.attr(),
- body: DS.attr(),
-
- author: DS.belongsTo('user')
- });
- ```
-
- The default serialization would create a JSON object like:
-
- ```javascript
- {
- "title": "Rails is unagi",
- "body": "Rails? Omakase? O_O",
- "author": 12
- }
- ```
-
- By default, attributes are passed through as-is, unless
- you specified an attribute type (`DS.attr('date')`). If
- you specify a transform, the JavaScript value will be
- serialized when inserted into the JSON hash.
-
- By default, belongs-to relationships are converted into
- IDs when inserted into the JSON hash.
-
- ## IDs
-
- `serialize` takes an options hash with a single option:
- `includeId`. If this option is `true`, `serialize` will,
- by default include the ID in the JSON object it builds.
-
- The adapter passes in `includeId: true` when serializing
- a record for `createRecord`, but not for `updateRecord`.
-
- ## Customization
-
- Your server may expect a different JSON format than the
- built-in serialization format.
-
- In that case, you can implement `serialize` yourself and
- return a JSON hash of your choosing.
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- serialize: function(post, options) {
- var json = {
- POST_TTL: post.get('title'),
- POST_BDY: post.get('body'),
- POST_CMS: post.get('comments').mapProperty('id')
- }
-
- if (options.includeId) {
- json.POST_ID_ = post.get('id');
- }
-
- return json;
- }
- });
- ```
-
- ## Customizing an App-Wide Serializer
-
- If you want to define a serializer for your entire
- application, you'll probably want to use `eachAttribute`
- and `eachRelationship` on the record.
-
- ```javascript
- App.ApplicationSerializer = DS.JSONSerializer.extend({
- serialize: function(record, options) {
- var json = {};
-
- record.eachAttribute(function(name) {
- json[serverAttributeName(name)] = record.get(name);
- })
-
- record.eachRelationship(function(name, relationship) {
- if (relationship.kind === 'hasMany') {
- json[serverHasManyName(name)] = record.get(name).mapBy('id');
- }
- });
-
- if (options.includeId) {
- json.ID_ = record.get('id');
- }
-
- return json;
- }
- });
-
- function serverAttributeName(attribute) {
- return attribute.underscore().toUpperCase();
- }
-
- function serverHasManyName(name) {
- return serverAttributeName(name.singularize()) + "_IDS";
- }
- ```
-
- This serializer will generate JSON that looks like this:
-
- ```javascript
- {
- "TITLE": "Rails is omakase",
- "BODY": "Yep. Omakase.",
- "COMMENT_IDS": [ 1, 2, 3 ]
- }
- ```
-
- ## Tweaking the Default JSON
-
- If you just want to do some small tweaks on the default JSON,
- you can call super first and make the tweaks on the returned
- JSON.
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- serialize: function(record, options) {
- var json = this._super.apply(this, arguments);
-
- json.subject = json.title;
- delete json.title;
-
- return json;
- }
- });
- ```
-
- @method serialize
- @param {subclass of DS.Model} record
- @param {Object} options
- @return {Object} json
- */
- serialize: function(record, options) {
- var json = {};
-
- if (options && options.includeId) {
- var id = get(record, 'id');
-
- if (id) {
- json[get(this, 'primaryKey')] = id;
- }
- }
-
- record.eachAttribute(function(key, attribute) {
- this.serializeAttribute(record, json, key, attribute);
- }, this);
-
- record.eachRelationship(function(key, relationship) {
- if (relationship.kind === 'belongsTo') {
- this.serializeBelongsTo(record, json, relationship);
- } else if (relationship.kind === 'hasMany') {
- this.serializeHasMany(record, json, relationship);
- }
- }, this);
-
- return json;
- },
-
- /**
- `serializeAttribute` can be used to customize how `DS.attr`
- properties are serialized
-
- For example if you wanted to ensure all you attributes were always
- serialized as properties on an `attributes` object you could
- write:
-
- ```javascript
- App.ApplicationSerializer = DS.JSONSerializer.extend({
- serializeAttribute: function(record, json, key, attributes) {
- json.attributes = json.attributes || {};
- this._super(record, json.attributes, key, attributes);
- }
- });
- ```
-
- @method serializeAttribute
- @param {DS.Model} record
- @param {Object} json
- @param {String} key
- @param {Object} attribute
- */
- serializeAttribute: function(record, json, key, attribute) {
- var attrs = get(this, 'attrs');
- var value = get(record, key), type = attribute.type;
-
- if (type) {
- var transform = this.transformFor(type);
- value = transform.serialize(value);
- }
-
- // if provided, use the mapping provided by `attrs` in
- // the serializer
- key = attrs && attrs[key] || (this.keyForAttribute ? this.keyForAttribute(key) : key);
-
- json[key] = value;
- },
-
- /**
- `serializeBelongsTo` can be used to customize how `DS.belongsTo`
- properties are serialized.
-
- Example
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- serializeBelongsTo: function(record, json, relationship) {
- var key = relationship.key;
-
- var belongsTo = get(record, key);
-
- key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key;
-
- json[key] = Ember.isNone(belongsTo) ? belongsTo : belongsTo.toJSON();
- }
- });
- ```
-
- @method serializeBelongsTo
- @param {DS.Model} record
- @param {Object} json
- @param {Object} relationship
- */
- serializeBelongsTo: function(record, json, relationship) {
- var key = relationship.key;
-
- var belongsTo = get(record, key);
-
- key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key;
-
- if (isNone(belongsTo)) {
- json[key] = belongsTo;
- } else {
- json[key] = get(belongsTo, 'id');
- }
-
- if (relationship.options.polymorphic) {
- this.serializePolymorphicType(record, json, relationship);
- }
- },
-
- /**
- `serializeHasMany` can be used to customize how `DS.hasMany`
- properties are serialized.
-
- Example
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- serializeHasMany: function(record, json, relationship) {
- var key = relationship.key;
- if (key === 'comments') {
- return;
- } else {
- this._super.apply(this, arguments);
- }
- }
- });
- ```
-
- @method serializeHasMany
- @param {DS.Model} record
- @param {Object} json
- @param {Object} relationship
- */
- serializeHasMany: function(record, json, relationship) {
- var key = relationship.key;
-
- var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
-
- if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany') {
- json[key] = get(record, key).mapBy('id');
- // TODO support for polymorphic manyToNone and manyToMany relationships
- }
- },
-
- /**
- You can use this method to customize how polymorphic objects are
- serialized. Objects are considered to be polymorphic if
- `{polymorphic: true}` is pass as the second argument to the
- `DS.belongsTo` function.
-
- Example
-
- ```javascript
- App.CommentSerializer = DS.JSONSerializer.extend({
- serializePolymorphicType: function(record, json, relationship) {
- var key = relationship.key,
- belongsTo = get(record, key);
- key = this.keyForAttribute ? this.keyForAttribute(key) : key;
- json[key + "_type"] = belongsTo.constructor.typeKey;
- }
- });
- ```
-
- @method serializePolymorphicType
- @param {DS.Model} record
- @param {Object} json
- @param {Object} relationship
- */
- serializePolymorphicType: Ember.K,
-
- // EXTRACT
-
- /**
- The `extract` method is used to deserialize payload data from the
- server. By default the `JSONSerializer` does not push the records
- into the store. However records that subclass `JSONSerializer`
- such as the `RESTSerializer` may push records into the store as
- part of the extract call.
-
- This method delegates to a more specific extract method based on
- the `requestType`.
-
- Example
-
- ```javascript
- var get = Ember.get;
- socket.on('message', function(message) {
- var modelName = message.model;
- var data = message.data;
- var type = store.modelFor(modelName);
- var serializer = store.serializerFor(type.typeKey);
- var record = serializer.extract(store, type, data, get(data, 'id'), 'single');
- store.push(modelName, record);
- });
- ```
-
- @method extract
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @param {String or Number} id
- @param {String} requestType
- @return {Object} json The deserialized payload
- */
- extract: function(store, type, payload, id, requestType) {
- this.extractMeta(store, type, payload);
-
- var specificExtract = "extract" + requestType.charAt(0).toUpperCase() + requestType.substr(1);
- return this[specificExtract](store, type, payload, id, requestType);
- },
-
- /**
- `extractFindAll` is a hook into the extract method used when a
- call is made to `DS.Store#findAll`. By default this method is an
- alias for [extractArray](#method_extractArray).
-
- @method extractFindAll
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Array} array An array of deserialized objects
- */
- extractFindAll: aliasMethod('extractArray'),
- /**
- `extractFindQuery` is a hook into the extract method used when a
- call is made to `DS.Store#findQuery`. By default this method is an
- alias for [extractArray](#method_extractArray).
-
- @method extractFindQuery
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Array} array An array of deserialized objects
- */
- extractFindQuery: aliasMethod('extractArray'),
- /**
- `extractFindMany` is a hook into the extract method used when a
- call is made to `DS.Store#findMany`. By default this method is
- alias for [extractArray](#method_extractArray).
-
- @method extractFindMany
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Array} array An array of deserialized objects
- */
- extractFindMany: aliasMethod('extractArray'),
- /**
- `extractFindHasMany` is a hook into the extract method used when a
- call is made to `DS.Store#findHasMany`. By default this method is
- alias for [extractArray](#method_extractArray).
-
- @method extractFindHasMany
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Array} array An array of deserialized objects
- */
- extractFindHasMany: aliasMethod('extractArray'),
-
- /**
- `extractCreateRecord` is a hook into the extract method used when a
- call is made to `DS.Store#createRecord`. By default this method is
- alias for [extractSave](#method_extractSave).
-
- @method extractCreateRecord
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Object} json The deserialized payload
- */
- extractCreateRecord: aliasMethod('extractSave'),
- /**
- `extractUpdateRecord` is a hook into the extract method used when
- a call is made to `DS.Store#update`. By default this method is alias
- for [extractSave](#method_extractSave).
-
- @method extractUpdateRecord
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Object} json The deserialized payload
- */
- extractUpdateRecord: aliasMethod('extractSave'),
- /**
- `extractDeleteRecord` is a hook into the extract method used when
- a call is made to `DS.Store#deleteRecord`. By default this method is
- alias for [extractSave](#method_extractSave).
-
- @method extractDeleteRecord
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Object} json The deserialized payload
- */
- extractDeleteRecord: aliasMethod('extractSave'),
-
- /**
- `extractFind` is a hook into the extract method used when
- a call is made to `DS.Store#find`. By default this method is
- alias for [extractSingle](#method_extractSingle).
-
- @method extractFind
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Object} json The deserialized payload
- */
- extractFind: aliasMethod('extractSingle'),
- /**
- `extractFindBelongsTo` is a hook into the extract method used when
- a call is made to `DS.Store#findBelongsTo`. By default this method is
- alias for [extractSingle](#method_extractSingle).
-
- @method extractFindBelongsTo
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Object} json The deserialized payload
- */
- extractFindBelongsTo: aliasMethod('extractSingle'),
- /**
- `extractSave` is a hook into the extract method used when a call
- is made to `DS.Model#save`. By default this method is alias
- for [extractSingle](#method_extractSingle).
-
- @method extractSave
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Object} json The deserialized payload
- */
- extractSave: aliasMethod('extractSingle'),
-
- /**
- `extractSingle` is used to deserialize a single record returned
- from the adapter.
-
- Example
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- extractSingle: function(store, type, payload) {
- payload.comments = payload._embedded.comment;
- delete payload._embedded;
-
- return this._super(store, type, payload);
- },
- });
- ```
-
- @method extractSingle
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Object} json The deserialized payload
- */
- extractSingle: function(store, type, payload) {
- return this.normalize(type, payload);
- },
-
- /**
- `extractArray` is used to deserialize an array of records
- returned from the adapter.
-
- Example
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- extractArray: function(store, type, payload) {
- return payload.map(function(json) {
- return this.extractSingle(json);
- }, this);
- }
- });
- ```
-
- @method extractArray
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- @return {Array} array An array of deserialized objects
- */
- extractArray: function(store, type, payload) {
- return this.normalize(type, payload);
- },
-
- /**
- `extractMeta` is used to deserialize any meta information in the
- adapter payload. By default Ember Data expects meta information to
- be located on the `meta` property of the payload object.
-
- Example
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- extractMeta: function(store, type, payload) {
- if (payload && payload._pagination) {
- store.metaForType(type, payload._pagination);
- delete payload._pagination;
- }
- }
- });
- ```
-
- @method extractMeta
- @param {DS.Store} store
- @param {subclass of DS.Model} type
- @param {Object} payload
- */
- extractMeta: function(store, type, payload) {
- if (payload && payload.meta) {
- store.metaForType(type, payload.meta);
- delete payload.meta;
- }
- },
-
- /**
- `keyForAttribute` can be used to define rules for how to convert an
- attribute name in your model to a key in your JSON.
-
- Example
-
- ```javascript
- App.ApplicationSerializer = DS.RESTSerializer.extend({
- keyForAttribute: function(attr) {
- return Ember.String.underscore(attr).toUpperCase();
- }
- });
- ```
-
- @method keyForAttribute
- @param {String} key
- @return {String} normalized key
- */
-
-
- /**
- `keyForRelationship` can be used to define a custom key when
- serializing relationship properties. By default `JSONSerializer`
- does not provide an implementation of this method.
-
- Example
-
- ```javascript
- App.PostSerializer = DS.JSONSerializer.extend({
- keyForRelationship: function(key, relationship) {
- return 'rel_' + Ember.String.underscore(key);
- }
- });
- ```
-
- @method keyForRelationship
- @param {String} key
- @param {String} relationship type
- @return {String} normalized key
- */
-
- // HELPERS
-
- /**
- @method transformFor
- @private
- @param {String} attributeType
- @param {Boolean} skipAssertion
- @return {DS.Transform} transform
- */
- transformFor: function(attributeType, skipAssertion) {
- var transform = this.container.lookup('transform:' + attributeType);
- Ember.assert("Unable to find transform for '" + attributeType + "'", skipAssertion || !!transform);
- return transform;
- }
-});
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-var get = Ember.get, capitalize = Ember.String.capitalize, underscore = Ember.String.underscore, DS = window.DS ;
-
-/**
- Extend `Ember.DataAdapter` with ED specific code.
-
- @class DebugAdapter
- @namespace DS
- @extends Ember.DataAdapter
- @private
-*/
-DS.DebugAdapter = Ember.DataAdapter.extend({
- getFilters: function() {
- return [
- { name: 'isNew', desc: 'New' },
- { name: 'isModified', desc: 'Modified' },
- { name: 'isClean', desc: 'Clean' }
- ];
- },
-
- detect: function(klass) {
- return klass !== DS.Model && DS.Model.detect(klass);
- },
-
- columnsForType: function(type) {
- var columns = [{ name: 'id', desc: 'Id' }], count = 0, self = this;
- get(type, 'attributes').forEach(function(name, meta) {
- if (count++ > self.attributeLimit) { return false; }
- var desc = capitalize(underscore(name).replace('_', ' '));
- columns.push({ name: name, desc: desc });
- });
- return columns;
- },
-
- getRecords: function(type) {
- return this.get('store').all(type);
- },
-
- getRecordColumnValues: function(record) {
- var self = this, count = 0,
- columnValues = { id: get(record, 'id') };
-
- record.eachAttribute(function(key) {
- if (count++ > self.attributeLimit) {
- return false;
- }
- var value = get(record, key);
- columnValues[key] = value;
- });
- return columnValues;
- },
-
- getRecordKeywords: function(record) {
- var keywords = [], keys = Ember.A(['id']);
- record.eachAttribute(function(key) {
- keys.push(key);
- });
- keys.forEach(function(key) {
- keywords.push(get(record, key));
- });
- return keywords;
- },
-
- getRecordFilterValues: function(record) {
- return {
- isNew: record.get('isNew'),
- isModified: record.get('isDirty') && !record.get('isNew'),
- isClean: !record.get('isDirty')
- };
- },
-
- getRecordColor: function(record) {
- var color = 'black';
- if (record.get('isNew')) {
- color = 'green';
- } else if (record.get('isDirty')) {
- color = 'blue';
- }
- return color;
- },
-
- observeRecord: function(record, recordUpdated) {
- var releaseMethods = Ember.A(), self = this,
- keysToObserve = Ember.A(['id', 'isNew', 'isDirty']);
-
- record.eachAttribute(function(key) {
- keysToObserve.push(key);
- });
-
- keysToObserve.forEach(function(key) {
- var handler = function() {
- recordUpdated(self.wrapRecord(record));
- };
- Ember.addObserver(record, key, handler);
- releaseMethods.push(function() {
- Ember.removeObserver(record, key, handler);
- });
- });
-
- var release = function() {
- releaseMethods.forEach(function(fn) { fn(); } );
- };
-
- return release;
- }
-
-});
-
-})();
-
-
-
-(function() {
-/**
- The `DS.Transform` class is used to serialize and deserialize model
- attributes when they are saved or loaded from an
- adapter. Subclassing `DS.Transform` is useful for creating custom
- attributes. All subclasses of `DS.Transform` must implement a
- `serialize` and a `deserialize` method.
-
- Example
-
- ```javascript
- App.RawTransform = DS.Transform.extend({
- deserialize: function(serialized) {
- return serialized;
- },
- serialize: function(deserialized) {
- return deserialized;
- }
- });
- ```
-
- Usage
-
- ```javascript
- var attr = DS.attr;
- App.Requirement = DS.Model.extend({
- name: attr('string'),
- optionsArray: attr('raw')
- });
- ```
-
- @class Transform
- @namespace DS
- */
-DS.Transform = Ember.Object.extend({
- /**
- When given a deserialized value from a record attribute this
- method must return the serialized value.
-
- Example
-
- ```javascript
- serialize: function(deserialized) {
- return Ember.isEmpty(deserialized) ? null : Number(deserialized);
- }
- ```
-
- @method serialize
- @param deserialized The deserialized value
- @return The serialized value
- */
- serialize: Ember.required(),
-
- /**
- When given a serialize value from a JSON object this method must
- return the deserialized value for the record attribute.
-
- Example
-
- ```javascript
- deserialize: function(serialized) {
- return empty(serialized) ? null : Number(serialized);
- }
- ```
-
- @method deserialize
- @param serialized The serialized value
- @return The deserialized value
- */
- deserialize: Ember.required()
-
-});
-
-})();
-
-
-
-(function() {
-
-/**
- The `DS.BooleanTransform` class is used to serialize and deserialize
- boolean attributes on Ember Data record objects. This transform is
- used when `boolean` is passed as the type parameter to the
- [DS.attr](../../data#method_attr) function.
-
- Usage
-
- ```javascript
- var attr = DS.attr;
- App.User = DS.Model.extend({
- isAdmin: attr('boolean'),
- name: attr('string'),
- email: attr('string')
- });
- ```
-
- @class BooleanTransform
- @extends DS.Transform
- @namespace DS
- */
-DS.BooleanTransform = DS.Transform.extend({
- deserialize: function(serialized) {
- var type = typeof serialized;
-
- if (type === "boolean") {
- return serialized;
- } else if (type === "string") {
- return serialized.match(/^true$|^t$|^1$/i) !== null;
- } else if (type === "number") {
- return serialized === 1;
- } else {
- return false;
- }
- },
-
- serialize: function(deserialized) {
- return Boolean(deserialized);
- }
-});
-
-})();
-
-
-
-(function() {
-/**
- The `DS.DateTransform` class is used to serialize and deserialize
- date attributes on Ember Data record objects. This transform is used
- when `date` is passed as the type parameter to the
- [DS.attr](../../data#method_attr) function.
-
- ```javascript
- var attr = DS.attr;
- App.Score = DS.Model.extend({
- value: attr('number'),
- player: DS.belongsTo('player'),
- date: attr('date')
- });
- ```
-
- @class DateTransform
- @extends DS.Transform
- @namespace DS
- */
-DS.DateTransform = DS.Transform.extend({
-
- deserialize: function(serialized) {
- var type = typeof serialized;
-
- if (type === "string") {
- return new Date(Ember.Date.parse(serialized));
- } else if (type === "number") {
- return new Date(serialized);
- } else if (serialized === null || serialized === undefined) {
- // if the value is not present in the data,
- // return undefined, not null.
- return serialized;
- } else {
- return null;
- }
- },
-
- serialize: function(date) {
- if (date instanceof Date) {
- // Serialize it as a number to maintain millisecond precision
- return Number(date);
- } else {
- return null;
- }
- }
-
-});
-
-})();
-
-
-
-(function() {
-var empty = Ember.isEmpty;
-/**
- The `DS.NumberTransform` class is used to serialize and deserialize
- numeric attributes on Ember Data record objects. This transform is
- used when `number` is passed as the type parameter to the
- [DS.attr](../../data#method_attr) function.
-
- Usage
-
- ```javascript
- var attr = DS.attr;
- App.Score = DS.Model.extend({
- value: attr('number'),
- player: DS.belongsTo('player'),
- date: attr('date')
- });
- ```
-
- @class NumberTransform
- @extends DS.Transform
- @namespace DS
- */
-DS.NumberTransform = DS.Transform.extend({
-
- deserialize: function(serialized) {
- return empty(serialized) ? null : Number(serialized);
- },
-
- serialize: function(deserialized) {
- return empty(deserialized) ? null : Number(deserialized);
- }
-});
-
-})();
-
-
-
-(function() {
-var none = Ember.isNone;
-
-/**
- The `DS.StringTransform` class is used to serialize and deserialize
- string attributes on Ember Data record objects. This transform is
- used when `string` is passed as the type parameter to the
- [DS.attr](../../data#method_attr) function.
-
- Usage
-
- ```javascript
- var attr = DS.attr;
- App.User = DS.Model.extend({
- isAdmin: attr('boolean'),
- name: attr('string'),
- email: attr('string')
- });
- ```
-
- @class StringTransform
- @extends DS.Transform
- @namespace DS
- */
-DS.StringTransform = DS.Transform.extend({
-
- deserialize: function(serialized) {
- return none(serialized) ? null : String(serialized);
- },
-
- serialize: function(deserialized) {
- return none(deserialized) ? null : String(deserialized);
- }
-
-});
-
-})();
-
-
-
-(function() {
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-
-var set = Ember.set;
-
-/*
- This code registers an injection for Ember.Application.
-
- If an Ember.js developer defines a subclass of DS.Store on their application,
- this code will automatically instantiate it and make it available on the
- router.
-
- Additionally, after an application's controllers have been injected, they will
- each have the store made available to them.
-
- For example, imagine an Ember.js application with the following classes:
-
- App.Store = DS.Store.extend({
- adapter: 'custom'
- });
-
- App.PostsController = Ember.ArrayController.extend({
- // ...
- });
-
- When the application is initialized, `App.Store` will automatically be
- instantiated, and the instance of `App.PostsController` will have its `store`
- property set to that instance.
-
- Note that this code will only be run if the `ember-application` package is
- loaded. If Ember Data is being used in an environment other than a
- typical application (e.g., node.js where only `ember-runtime` is available),
- this code will be ignored.
-*/
-
-Ember.onLoad('Ember.Application', function(Application) {
- Application.initializer({
- name: "store",
-
- initialize: function(container, application) {
- application.register('store:main', application.Store || DS.Store);
-
- // allow older names to be looked up
-
- var proxy = new DS.ContainerProxy(container);
- proxy.registerDeprecations([
- {deprecated: 'serializer:_default', valid: 'serializer:-default'},
- {deprecated: 'serializer:_rest', valid: 'serializer:-rest'},
- {deprecated: 'adapter:_rest', valid: 'adapter:-rest'}
- ]);
-
- // new go forward paths
- application.register('serializer:-default', DS.JSONSerializer);
- application.register('serializer:-rest', DS.RESTSerializer);
- application.register('adapter:-rest', DS.RESTAdapter);
-
- // Eagerly generate the store so defaultStore is populated.
- // TODO: Do this in a finisher hook
- container.lookup('store:main');
- }
- });
-
- Application.initializer({
- name: "transforms",
- before: "store",
-
- initialize: function(container, application) {
- application.register('transform:boolean', DS.BooleanTransform);
- application.register('transform:date', DS.DateTransform);
- application.register('transform:number', DS.NumberTransform);
- application.register('transform:string', DS.StringTransform);
- }
- });
-
- Application.initializer({
- name: "data-adapter",
- before: "store",
-
- initialize: function(container, application) {
- application.register('data-adapter:main', DS.DebugAdapter);
- }
- });
-
- Application.initializer({
- name: "injectStore",
- before: "store",
-
- initialize: function(container, application) {
- application.inject('controller', 'store', 'store:main');
- application.inject('route', 'store', 'store:main');
- application.inject('serializer', 'store', 'store:main');
- application.inject('data-adapter', 'store', 'store:main');
- }
- });
-
-});
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-
-/**
- Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
-
- © 2011 Colin Snover <http://zetafleet.com>
-
- Released under MIT license.
-
- @class Date
- @namespace Ember
- @static
-*/
-Ember.Date = Ember.Date || {};
-
-var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
-
-/**
- @method parse
- @param date
-*/
-Ember.Date.parse = function (date) {
- var timestamp, struct, minutesOffset = 0;
-
- // ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
- // before falling back to any implementation-specific date parsing, so that’s what we do, even if native
- // implementations could be faster
- // 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
- if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
- // avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
- for (var i = 0, k; (k = numericKeys[i]); ++i) {
- struct[k] = +struct[k] || 0;
- }
-
- // allow undefined days and months
- struct[2] = (+struct[2] || 1) - 1;
- struct[3] = +struct[3] || 1;
-
- if (struct[8] !== 'Z' && struct[9] !== undefined) {
- minutesOffset = struct[10] * 60 + struct[11];
-
- if (struct[9] === '+') {
- minutesOffset = 0 - minutesOffset;
- }
- }
-
- timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
- }
- else {
- timestamp = origParse ? origParse(date) : NaN;
- }
-
- return timestamp;
-};
-
-if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Date) {
- Date.parse = Ember.Date.parse;
-}
-
-})();
-
-
-
-(function() {
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-
-/**
- A record array is an array that contains records of a certain type. The record
- array materializes records as needed when they are retrieved for the first
- time. You should not create record arrays yourself. Instead, an instance of
- `DS.RecordArray` or its subclasses will be returned by your application's store
- in response to queries.
-
- @class RecordArray
- @namespace DS
- @extends Ember.ArrayProxy
- @uses Ember.Evented
-*/
-
-DS.RecordArray = Ember.ArrayProxy.extend(Ember.Evented, {
- /**
- The model type contained by this record array.
-
- @property type
- @type DS.Model
- */
- type: null,
-
- /**
- The array of client ids backing the record array. When a
- record is requested from the record array, the record
- for the client id at the same index is materialized, if
- necessary, by the store.
-
- @property content
- @private
- @type Ember.Array
- */
- content: null,
-
- /**
- The flag to signal a `RecordArray` is currently loading data.
-
- Example
-
- ```javascript
- var people = store.all(App.Person);
- people.get('isLoaded'); // true
- ```
-
- @property isLoaded
- @type Boolean
- */
- isLoaded: false,
- /**
- The flag to signal a `RecordArray` is currently loading data.
-
- Example
-
- ```javascript
- var people = store.all(App.Person);
- people.get('isUpdating'); // false
- people.update();
- people.get('isUpdating'); // true
- ```
-
- @property isUpdating
- @type Boolean
- */
- isUpdating: false,
-
- /**
- The store that created this record array.
-
- @property store
- @private
- @type DS.Store
- */
- store: null,
-
- /**
- Retrieves an object from the content by index.
-
- @method objectAtContent
- @private
- @param {Number} index
- @return {DS.Model} record
- */
- objectAtContent: function(index) {
- var content = get(this, 'content');
-
- return content.objectAt(index);
- },
-
- /**
- Used to get the latest version of all of the records in this array
- from the adapter.
-
- Example
-
- ```javascript
- var people = store.all(App.Person);
- people.get('isUpdating'); // false
- people.update();
- people.get('isUpdating'); // true
- ```
-
- @method update
- */
- update: function() {
- if (get(this, 'isUpdating')) { return; }
-
- var store = get(this, 'store'),
- type = get(this, 'type');
-
- return store.fetchAll(type, this);
- },
-
- /**
- Adds a record to the `RecordArray`.
-
- @method addRecord
- @private
- @param {DS.Model} record
- */
- addRecord: function(record) {
- get(this, 'content').addObject(record);
- },
-
- /**
- Removes a record to the `RecordArray`.
-
- @method removeRecord
- @private
- @param {DS.Model} record
- */
- removeRecord: function(record) {
- get(this, 'content').removeObject(record);
- },
-
- /**
- Saves all of the records in the `RecordArray`.
-
- Example
-
- ```javascript
- var messages = store.all(App.Message);
- messages.forEach(function(message) {
- message.set('hasBeenSeen', true);
- });
- messages.save();
- ```
-
- @method save
- @return {DS.PromiseArray} promise
- */
- save: function() {
- var promiseLabel = "DS: RecordArray#save " + get(this, 'type');
- var promise = Ember.RSVP.all(this.invoke("save"), promiseLabel).then(function(array) {
- return Ember.A(array);
- }, null, "DS: RecordArray#save apply Ember.NativeArray");
-
- return DS.PromiseArray.create({ promise: promise });
- }
-});
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-
-var get = Ember.get;
-
-/**
- Represents a list of records whose membership is determined by the
- store. As records are created, loaded, or modified, the store
- evaluates them to determine if they should be part of the record
- array.
-
- @class FilteredRecordArray
- @namespace DS
- @extends DS.RecordArray
-*/
-DS.FilteredRecordArray = DS.RecordArray.extend({
- /**
- The filterFunction is a function used to test records from the store to
- determine if they should be part of the record array.
-
- Example
-
- ```javascript
- var allPeople = store.all('person');
- allPeople.mapBy('name'); // ["Tom Dale", "Yehuda Katz", "Trek Glowacki"]
-
- var people = store.filter('person', function(person) {
- if (person.get('name').match(/Katz$/)) { return true; }
- });
- people.mapBy('name'); // ["Yehuda Katz"]
-
- var notKatzFilter = function(person) {
- return !person.get('name').match(/Katz$/);
- };
- people.set('filterFunction', notKatzFilter);
- people.mapBy('name'); // ["Tom Dale", "Trek Glowacki"]
- ```
-
- @method filterFunction
- @param {DS.Model} record
- @return {Boolean} `true` if the record should be in the array
- */
- filterFunction: null,
- isLoaded: true,
-
- replace: function() {
- var type = get(this, 'type').toString();
- throw new Error("The result of a client-side filter (on " + type + ") is immutable.");
- },
-
- /**
- @method updateFilter
- @private
- */
- updateFilter: Ember.observer(function() {
- var manager = get(this, 'manager');
- manager.updateFilter(this, get(this, 'type'), get(this, 'filterFunction'));
- }, 'filterFunction')
-});
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-
-/**
- Represents an ordered list of records whose order and membership is
- determined by the adapter. For example, a query sent to the adapter
- may trigger a search on the server, whose results would be loaded
- into an instance of the `AdapterPopulatedRecordArray`.
-
- @class AdapterPopulatedRecordArray
- @namespace DS
- @extends DS.RecordArray
-*/
-DS.AdapterPopulatedRecordArray = DS.RecordArray.extend({
- query: null,
-
- replace: function() {
- var type = get(this, 'type').toString();
- throw new Error("The result of a server query (on " + type + ") is immutable.");
- },
-
- /**
- @method load
- @private
- @param {Array} data
- */
- load: function(data) {
- var store = get(this, 'store'),
- type = get(this, 'type'),
- records = store.pushMany(type, data),
- meta = store.metadataFor(type);
-
- this.setProperties({
- content: Ember.A(records),
- isLoaded: true,
- meta: meta
- });
-
- // TODO: does triggering didLoad event should be the last action of the runLoop?
- Ember.run.once(this, 'trigger', 'didLoad');
- }
-});
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var map = Ember.EnumerableUtils.map;
-
-/**
- A `ManyArray` is a `RecordArray` that represents the contents of a has-many
- relationship.
-
- The `ManyArray` is instantiated lazily the first time the relationship is
- requested.
-
- ### Inverses
-
- Often, the relationships in Ember Data applications will have
- an inverse. For example, imagine the following models are
- defined:
-
- ```javascript
- App.Post = DS.Model.extend({
- comments: DS.hasMany('comment')
- });
-
- App.Comment = DS.Model.extend({
- post: DS.belongsTo('post')
- });
- ```
-
- If you created a new instance of `App.Post` and added
- a `App.Comment` record to its `comments` has-many
- relationship, you would expect the comment's `post`
- property to be set to the post that contained
- the has-many.
-
- We call the record to which a relationship belongs the
- relationship's _owner_.
-
- @class ManyArray
- @namespace DS
- @extends DS.RecordArray
-*/
-DS.ManyArray = DS.RecordArray.extend({
- init: function() {
- this._super.apply(this, arguments);
- this._changesToSync = Ember.OrderedSet.create();
- },
-
- /**
- The property name of the relationship
-
- @property {String} name
- @private
- */
- name: null,
-
- /**
- The record to which this relationship belongs.
-
- @property {DS.Model} owner
- @private
- */
- owner: null,
-
- /**
- `true` if the relationship is polymorphic, `false` otherwise.
-
- @property {Boolean} isPolymorphic
- @private
- */
- isPolymorphic: false,
-
- // LOADING STATE
-
- isLoaded: false,
-
- /**
- Used for async `hasMany` arrays
- to keep track of when they will resolve.
-
- @property {Ember.RSVP.Promise} promise
- @private
- */
- promise: null,
-
- /**
- @method loadingRecordsCount
- @param {Number} count
- @private
- */
- loadingRecordsCount: function(count) {
- this.loadingRecordsCount = count;
- },
-
- /**
- @method loadedRecord
- @private
- */
- loadedRecord: function() {
- this.loadingRecordsCount--;
- if (this.loadingRecordsCount === 0) {
- set(this, 'isLoaded', true);
- this.trigger('didLoad');
- }
- },
-
- /**
- @method fetch
- @private
- */
- fetch: function() {
- var records = get(this, 'content'),
- store = get(this, 'store'),
- owner = get(this, 'owner'),
- resolver = Ember.RSVP.defer("DS: ManyArray#fetch " + get(this, 'type'));
-
- var unloadedRecords = records.filterProperty('isEmpty', true);
- store.fetchMany(unloadedRecords, owner, resolver);
- },
-
- // Overrides Ember.Array's replace method to implement
- replaceContent: function(index, removed, added) {
- // Map the array of record objects into an array of client ids.
- added = map(added, function(record) {
- Ember.assert("You cannot add '" + record.constructor.typeKey + "' records to this relationship (only '" + this.type.typeKey + "' allowed)", !this.type || record instanceof this.type);
- return record;
- }, this);
-
- this._super(index, removed, added);
- },
-
- arrangedContentDidChange: function() {
- Ember.run.once(this, 'fetch');
- },
-
- arrayContentWillChange: function(index, removed, added) {
- var owner = get(this, 'owner'),
- name = get(this, 'name');
-
- if (!owner._suspendedRelationships) {
- // This code is the first half of code that continues inside
- // of arrayContentDidChange. It gets or creates a change from
- // the child object, adds the current owner as the old
- // parent if this is the first time the object was removed
- // from a ManyArray, and sets `newParent` to null.
- //
- // Later, if the object is added to another ManyArray,
- // the `arrayContentDidChange` will set `newParent` on
- // the change.
- for (var i=index; i<index+removed; i++) {
- var record = get(this, 'content').objectAt(i);
-
- var change = DS.RelationshipChange.createChange(owner, record, get(this, 'store'), {
- parentType: owner.constructor,
- changeType: "remove",
- kind: "hasMany",
- key: name
- });
-
- this._changesToSync.add(change);
- }
- }
-
- return this._super.apply(this, arguments);
- },
-
- arrayContentDidChange: function(index, removed, added) {
- this._super.apply(this, arguments);
-
- var owner = get(this, 'owner'),
- name = get(this, 'name'),
- store = get(this, 'store');
-
- if (!owner._suspendedRelationships) {
- // This code is the second half of code that started in
- // `arrayContentWillChange`. It gets or creates a change
- // from the child object, and adds the current owner as
- // the new parent.
- for (var i=index; i<index+added; i++) {
- var record = get(this, 'content').objectAt(i);
-
- var change = DS.RelationshipChange.createChange(owner, record, store, {
- parentType: owner.constructor,
- changeType: "add",
- kind:"hasMany",
- key: name
- });
- change.hasManyName = name;
-
- this._changesToSync.add(change);
- }
-
- // We wait until the array has finished being
- // mutated before syncing the OneToManyChanges created
- // in arrayContentWillChange, so that the array
- // membership test in the sync() logic operates
- // on the final results.
- this._changesToSync.forEach(function(change) {
- change.sync();
- });
-
- this._changesToSync.clear();
- }
- },
-
- /**
- Create a child record within the owner
-
- @method createRecord
- @private
- @param {Object} hash
- @return {DS.Model} record
- */
- createRecord: function(hash) {
- var owner = get(this, 'owner'),
- store = get(owner, 'store'),
- type = get(this, 'type'),
- record;
-
- Ember.assert("You cannot add '" + type.typeKey + "' records to this polymorphic relationship.", !get(this, 'isPolymorphic'));
-
- record = store.createRecord.call(store, type, hash);
- this.pushObject(record);
-
- return record;
- }
-
-});
-
-})();
-
-
-
-(function() {
-/**
- @module ember-data
-*/
-
-})();
-
-
-
-(function() {
-/*globals Ember*/
-/*jshint eqnull:true*/
-/**
- @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var once = Ember.run.once;
-var isNone = Ember.isNone;
-var forEach = Ember.EnumerableUtils.forEach;
-var indexOf = Ember.EnumerableUtils.indexOf;
-var map = Ember.EnumerableUtils.map;
-var resolve = Ember.RSVP.resolve;
-var copy = Ember.copy;
-
-// Implementors Note:
-//
-// The variables in this file are consistently named according to the following
-// scheme:
-//
-// * +id+ means an identifier managed by an external source, provided inside
-// the data provided by that source. These are always coerced to be strings
-// before being used internally.
-// * +clientId+ means a transient numerical identifier generated at runtime by
-// the data store. It is important primarily because newly created objects may
-// not yet have an externally generated id.
-// * +reference+ means a record reference object, which holds metadata about a
-// record, even if it has not yet been fully materialized.
-// * +type+ means a subclass of DS.Model.
-
-// Used by the store to normalize IDs entering the store. Despite the fact
-// that developers may provide IDs as numbers (e.g., `store.find(Person, 1)`),
-// it is important that internally we use strings, since IDs may be serialized
-// and lose type information. For example, Ember's router may put a record's
-// ID into the URL, and if we later try to deserialize that URL and find the
-// corresponding record, we will not know if it is a string or a number.
-var coerceId = function(id) {
- return id == null ? null : id+'';
-};
-
-/**
- The store contains all of the data for records loaded from the server.
- It is also responsible for creating instances of `DS.Model` that wrap
- the individual data for a record, so that they can be bound to in your
- Handlebars templates.
-
- Define your application's store like this:
-
- ```javascript
- MyApp.Store = DS.Store.extend();
- ```
-
- Most Ember.js applications will only have a single `DS.Store` that is
- automatically created by their `Ember.Application`.
-
- You can retrieve models from the store in several ways. To retrieve a record
- for a specific id, use `DS.Store`'s `find()` method:
-
- ```javascript
- var person = store.find('person', 123);
- ```
-
- If your application has multiple `DS.Store` instances (an unusual case), you can
- specify which store should be used:
-
- ```javascript
- var person = store.find(App.Person, 123);
- ```
-
- By default, the store will talk to your backend using a standard
- REST mechanism. You can customize how the store talks to your
- backend by specifying a custom adapter:
-
- ```javascript
- MyApp.store = DS.Store.create({
- adapter: 'MyApp.CustomAdapter'
- });
- ```
-
- You can learn more about writing a custom adapter by reading the `DS.Adapter`
- documentation.
-
- @class Store
- @namespace DS
- @extends Ember.Object
-*/
-DS.Store = Ember.Object.extend({
-
- /**
- @method init
- @private
- */
- init: function() {
- // internal bookkeeping; not observable
- this.typeMaps = {};
- this.recordArrayManager = DS.RecordArrayManager.create({
- store: this
- });
- this._relationshipChanges = {};
- this._pendingSave = [];
- },
-
- /**
- The adapter to use to communicate to a backend server or other persistence layer.
-
- This can be specified as an instance, class, or string.
-
- If you want to specify `App.CustomAdapter` as a string, do:
-
- ```js
- adapter: 'custom'
- ```
-
- @property adapter
- @default DS.RESTAdapter
- @type {DS.Adapter|String}
- */
- adapter: '-rest',
-
- /**
- Returns a JSON representation of the record using a custom
- type-specific serializer, if one exists.
-
- The available options are:
-
- * `includeId`: `true` if the record's ID should be included in
- the JSON representation
-
- @method serialize
- @private
- @param {DS.Model} record the record to serialize
- @param {Object} options an options hash
- */
- serialize: function(record, options) {
- return this.serializerFor(record.constructor.typeKey).serialize(record, options);
- },
-
- /**
- This property returns the adapter, after resolving a possible
- string key.
-
- If the supplied `adapter` was a class, or a String property
- path resolved to a class, this property will instantiate the
- class.
-
- This property is cacheable, so the same instance of a specified
- adapter class should be used for the lifetime of the store.
-
- @property defaultAdapter
- @private
- @returns DS.Adapter
- */
- defaultAdapter: Ember.computed('adapter', function() {
- var adapter = get(this, 'adapter');
-
- Ember.assert('You tried to set `adapter` property to an instance of `DS.Adapter`, where it should be a name or a factory', !(adapter instanceof DS.Adapter));
-
- if (typeof adapter === 'string') {
- adapter = this.container.lookup('adapter:' + adapter) || this.container.lookup('adapter:application') || this.container.lookup('adapter:-rest');
- }
-
- if (DS.Adapter.detect(adapter)) {
- adapter = adapter.create({ container: this.container });
- }
-
- return adapter;
- }),
-
- // .....................
- // . CREATE NEW RECORD .
- // .....................
-
- /**
- Create a new record in the current store. The properties passed
- to this method are set on the newly created record.
-
- To create a new instance of `App.Post`:
-
- ```js
- store.createRecord('post', {
- title: "Rails is omakase"
- });
- ```
-
- @method createRecord
- @param {String} type
- @param {Object} properties a hash of properties to set on the
- newly created record.
- @returns {DS.Model} record
- */
- createRecord: function(type, properties) {
- type = this.modelFor(type);
-
- properties = copy(properties) || {};
-
- // If the passed properties do not include a primary key,
- // give the adapter an opportunity to generate one. Typically,
- // client-side ID generators will use something like uuid.js
- // to avoid conflicts.
-
- if (isNone(properties.id)) {
- properties.id = this._generateId(type);
- }
-
- // Coerce ID to a string
- properties.id = coerceId(properties.id);
-
- var record = this.buildRecord(type, properties.id);
-
- // Move the record out of its initial `empty` state into
- // the `loaded` state.
- record.loadedData();
-
- // Set the properties specified on the record.
- record.setProperties(properties);
-
- return record;
- },
-
- /**
- If possible, this method asks the adapter to generate an ID for
- a newly created record.
-
- @method _generateId
- @private
- @param {String} type
- @returns {String} if the adapter can generate one, an ID
- */
- _generateId: function(type) {
- var adapter = this.adapterFor(type);
-
- if (adapter && adapter.generateIdForRecord) {
- return adapter.generateIdForRecord(this);
- }
-
- return null;
- },
-
- // .................
- // . DELETE RECORD .
- // .................
-
- /**
- For symmetry, a record can be deleted via the store.
-
- Example
-
- ```javascript
- var post = store.createRecord('post', {
- title: "Rails is omakase"
- });
-
- store.deleteRecord(post);
- ```
-
- @method deleteRecord
- @param {DS.Model} record
- */
- deleteRecord: function(record) {
- record.deleteRecord();
- },
-
- /**
- For symmetry, a record can be unloaded via the store. Only
- non-dirty records can be unloaded.
-
- Example
-
- ```javascript
- store.find('post', 1).then(function(post) {
- store.unloadRecord(post);
- });
- ```
-
- @method unloadRecord
- @param {DS.Model} record
- */
- unloadRecord: function(record) {
- record.unloadRecord();
- },
-
- // ................
- // . FIND RECORDS .
- // ................
-
- /**
- This is the main entry point into finding records. The first parameter to
- this method is the model's name as a string.
-
- ---
-
- To find a record by ID, pass the `id` as the second parameter:
-
- ```javascript
- store.find('person', 1);
- ```
-
- The `find` method will always return a **promise** that will be resolved
- with the record. If the record was already in the store, the promise will
- be resolved immediately. Otherwise, the store will ask the adapter's `find`
- method to find the necessary data.
-
- The `find` method will always resolve its promise with the same object for
- a given type and `id`.
-
- ---
-
- To find all records for a type, call `find` with no additional parameters:
-
- ```javascript
- store.find('person');
- ```
-
- This will ask the adapter's `findAll` method to find the records for the
- given type, and return a promise that will be resolved once the server
- returns the values.
-
- ---
-
- To find a record by a query, call `find` with a hash as the second
- parameter:
-
- ```javascript
- store.find(App.Person, { page: 1 });
- ```
-
- This will ask the adapter's `findQuery` method to find the records for
- the query, and return a promise that will be resolved once the server
- responds.
-
- @method find
- @param {String or subclass of DS.Model} type
- @param {Object|String|Integer|null} id
- @return {Promise} promise
- */
- find: function(type, id) {
- if (id === undefined) {
- return this.findAll(type);
- }
-
- // We are passed a query instead of an id.
- if (Ember.typeOf(id) === 'object') {
- return this.findQuery(type, id);
- }
-
- return this.findById(type, coerceId(id));
- },
-
- /**
- This method returns a record for a given type and id combination.
-
- @method findById
- @private
- @param {String or subclass of DS.Model} type
- @param {String|Integer} id
- @return {Promise} promise
- */
- findById: function(type, id) {
- type = this.modelFor(type);
-
- var record = this.recordForId(type, id);
-
- var promise = this.fetchRecord(record) || resolve(record, "DS: Store#findById " + type + " with id: " + id);
- return promiseObject(promise);
- },
-
- /**
- This method makes a series of requests to the adapter's `find` method
- and returns a promise that resolves once they are all loaded.
-
- @private
- @method findByIds
- @param {String} type
- @param {Array} ids
- @returns {Promise} promise
- */
- findByIds: function(type, ids) {
- var store = this;
- var promiseLabel = "DS: Store#findByIds " + type;
- return promiseArray(Ember.RSVP.all(map(ids, function(id) {
- return store.findById(type, id);
- })).then(Ember.A, null, "DS: Store#findByIds of " + type + " complete"));
- },
-
- /**
- This method is called by `findById` if it discovers that a particular
- type/id pair hasn't been loaded yet to kick off a request to the
- adapter.
-
- @method fetchRecord
- @private
- @param {DS.Model} record
- @returns {Promise} promise
- */
- fetchRecord: function(record) {
- if (isNone(record)) { return null; }
- if (record._loadingPromise) { return record._loadingPromise; }
- if (!get(record, 'isEmpty')) { return null; }
-
- var type = record.constructor,
- id = get(record, 'id');
-
- var adapter = this.adapterFor(type);
-
- Ember.assert("You tried to find a record but you have no adapter (for " + type + ")", adapter);
- Ember.assert("You tried to find a record but your adapter (for " + type + ") does not implement 'find'", adapter.find);
-
- var promise = _find(adapter, this, type, id);
- record.loadingData(promise);
- return promise;
- },
-
- /**
- Get a record by a given type and ID without triggering a fetch.
-
- This method will synchronously return the record if it's available.
- Otherwise, it will return null.
-
- ```js
- var post = store.getById('post', 1);
- ```
-
- @method getById
- @param {String or subclass of DS.Model} type
- @param {String|Integer} id
- @param {DS.Model} record
- */
- getById: function(type, id) {
- if (this.hasRecordForId(type, id)) {
- return this.recordForId(type, id);
- } else {
- return null;
- }
- },
-
- /**
- This method is called by the record's `reload` method.
-
- This method calls the adapter's `find` method, which returns a promise. When
- **that** promise resolves, `reloadRecord` will resolve the promise returned
- by the record's `reload`.
-
- @method reloadRecord
- @private
- @param {DS.Model} record
- @return {Promise} promise
- */
- reloadRecord: function(record) {
- var type = record.constructor,
- adapter = this.adapterFor(type),
- id = get(record, 'id');
-
- Ember.assert("You cannot reload a record without an ID", id);
- Ember.assert("You tried to reload a record but you have no adapter (for " + type + ")", adapter);
- Ember.assert("You tried to reload a record but your adapter does not implement `find`", adapter.find);
-
- return _find(adapter, this, type, id);
- },
-
- /**
- This method takes a list of records, groups the records by type,
- converts the records into IDs, and then invokes the adapter's `findMany`
- method.
-
- The records are grouped by type to invoke `findMany` on adapters
- for each unique type in records.
-
- It is used both by a brand new relationship (via the `findMany`
- method) or when the data underlying an existing relationship
- changes.
-
- @method fetchMany
- @private
- @param {Array} records
- @param {DS.Model} owner
- @param {Resolver} resolver
- */
- fetchMany: function(records, owner, resolver) {
- if (!records.length) { return; }
-
- // Group By Type
- var recordsByTypeMap = Ember.MapWithDefault.create({
- defaultValue: function() { return Ember.A(); }
- });
-
- forEach(records, function(record) {
- recordsByTypeMap.get(record.constructor).push(record);
- });
-
- forEach(recordsByTypeMap, function(type, records) {
- var ids = records.mapProperty('id'),
- adapter = this.adapterFor(type);
-
- Ember.assert("You tried to load many records but you have no adapter (for " + type + ")", adapter);
- Ember.assert("You tried to load many records but your adapter does not implement `findMany`", adapter.findMany);
-
- resolver.resolve(_findMany(adapter, this, type, ids, owner));
- }, this);
- },
-
- /**
- Returns true if a record for a given type and ID is already loaded.
-
- @method hasRecordForId
- @param {String or subclass of DS.Model} type
- @param {String|Integer} id
- @returns {Boolean}
- */
- hasRecordForId: function(type, id) {
- id = coerceId(id);
- type = this.modelFor(type);
- return !!this.typeMapFor(type).idToRecord[id];
- },
-
- /**
- Returns id record for a given type and ID. If one isn't already loaded,
- it builds a new record and leaves it in the `empty` state.
-
- @method recordForId
- @private
- @param {String or subclass of DS.Model} type
- @param {String|Integer} id
- @returns {DS.Model} record
- */
- recordForId: function(type, id) {
- type = this.modelFor(type);
-
- id = coerceId(id);
-
- var record = this.typeMapFor(type).idToRecord[id];
-
- if (!record) {
- record = this.buildRecord(type, id);
- }
-
- return record;
- },
-
- /**
- @method findMany
- @private
- @param {DS.Model} owner
- @param {Array} records
- @param {String or subclass of DS.Model} type
- @param {Resolver} resolver
- @return {DS.ManyArray} records
- */
- findMany: function(owner, records, type, resolver) {
- type = this.modelFor(type);
-
- records = Ember.A(records);
-
- var unloadedRecords = records.filterProperty('isEmpty', true),
- manyArray = this.recordArrayManager.createManyArray(type, records);
-
- forEach(unloadedRecords, function(record) {
- record.loadingData();
- });
-
- manyArray.loadingRecordsCount = unloadedRecords.length;
-
- if (unloadedRecords.length) {
- forEach(unloadedRecords, function(record) {
- this.recordArrayManager.registerWaitingRecordArray(record, manyArray);
- }, this);
-
- this.fetchMany(unloadedRecords, owner, resolver);
- } else {
- if (resolver) { resolver.resolve(); }
- manyArray.set('isLoaded', true);
- Ember.run.once(manyArray, 'trigger', 'didLoad');
- }
-
- return manyArray;
- },
-
- /**
- If a relationship was originally populated by the adapter as a link
- (as opposed to a list of IDs), this method is called when the
- relationship is fetched.
-
- The link (which is usually a URL) is passed through unchanged, so the
- adapter can make whatever request it wants.
-
- The usual use-case is for the server to register a URL as a link, and
- then use that URL in the future to make a request for the relationship.
-
- @method findHasMany
- @private
- @param {DS.Model} owner
- @param {any} link
- @param {String or subclass of DS.Model} type
- @param {Resolver} resolver
- @return {DS.ManyArray}
- */
- findHasMany: function(owner, link, relationship, resolver) {
- var adapter = this.adapterFor(owner.constructor);
-
- Ember.assert("You tried to load a hasMany relationship but you have no adapter (for " + owner.constructor + ")", adapter);
- Ember.assert("You tried to load a hasMany relationship from a specified `link` in the original payload but your adapter does not implement `findHasMany`", adapter.findHasMany);
-
- var records = this.recordArrayManager.createManyArray(relationship.type, Ember.A([]));
- resolver.resolve(_findHasMany(adapter, this, owner, link, relationship));
- return records;
- },
-
- /**
- @method findBelongsTo
- @private
- @param {DS.Model} owner
- @param {any} link
- @param {Relationship} relationship
- @param {Resolver} resolver
- */
- findBelongsTo: function(owner, link, relationship, resolver) {
- var adapter = this.adapterFor(owner.constructor);
-
- Ember.assert("You tried to load a belongsTo relationship but you have no adapter (for " + owner.constructor + ")", adapter);
- Ember.assert("You tried to load a belongsTo relationship from a specified `link` in the original payload but your adapter does not implement `findBelongsTo`", adapter.findBelongsTo);
-
- resolver.resolve(_findBelongsTo(adapter, this, owner, link, relationship));
- },
-
- /**
- This method delegates a query to the adapter. This is the one place where
- adapter-level semantics are exposed to the application.
-
- Exposing queries this way seems preferable to creating an abstract query
- language for all server-side queries, and then require all adapters to
- implement them.
-
- This method returns a promise, which is resolved with a `RecordArray`
- once the server returns.
-
- @method findQuery
- @private
- @param {String or subclass of DS.Model} type
- @param {any} query an opaque query to be used by the adapter
- @return {Promise} promise
- */
- findQuery: function(type, query) {
- type = this.modelFor(type);
-
- var array = this.recordArrayManager
- .createAdapterPopulatedRecordArray(type, query);
-
- var adapter = this.adapterFor(type),
- promiseLabel = "DS: Store#findQuery " + type,
- resolver = Ember.RSVP.defer(promiseLabel);
-
- Ember.assert("You tried to load a query but you have no adapter (for " + type + ")", adapter);
- Ember.assert("You tried to load a query but your adapter does not implement `findQuery`", adapter.findQuery);
-
- resolver.resolve(_findQuery(adapter, this, type, query, array));
-
- return promiseArray(resolver.promise);
- },
-
- /**
- This method returns an array of all records adapter can find.
- It triggers the adapter's `findAll` method to give it an opportunity to populate
- the array with records of that type.
-
- @method findAll
- @private
- @param {String or subclass of DS.Model} type
- @return {DS.AdapterPopulatedRecordArray}
- */
- findAll: function(type) {
- type = this.modelFor(type);
-
- return this.fetchAll(type, this.all(type));
- },
-
- /**
- @method fetchAll
- @private
- @param {DS.Model} type
- @param {DS.RecordArray} array
- @returns {Promise} promise
- */
- fetchAll: function(type, array) {
- var adapter = this.adapterFor(type),
- sinceToken = this.typeMapFor(type).metadata.since;
-
- set(array, 'isUpdating', true);
-
- Ember.assert("You tried to load all records but you have no adapter (for " + type + ")", adapter);
- Ember.assert("You tried to load all records but your adapter does not implement `findAll`", adapter.findAll);
-
- return promiseArray(_findAll(adapter, this, type, sinceToken));
- },
-
- /**
- @method didUpdateAll
- @param {DS.Model} type
- */
- didUpdateAll: function(type) {
- var findAllCache = this.typeMapFor(type).findAllCache;
- set(findAllCache, 'isUpdating', false);
- },
-
- /**
- This method returns a filtered array that contains all of the known records
- for a given type.
-
- Note that because it's just a filter, it will have any locally
- created records of the type.
-
- Also note that multiple calls to `all` for a given type will always
- return the same RecordArray.
-
- Example
-
- ```javascript
- var local_posts = store.all(App.Post);
- ```
-
- @method all
- @param {String or subclass of DS.Model} type
- @return {DS.RecordArray}
- */
- all: function(type) {
- type = this.modelFor(type);
-
- var typeMap = this.typeMapFor(type),
- findAllCache = typeMap.findAllCache;
-
- if (findAllCache) { return findAllCache; }
-
- var array = this.recordArrayManager.createRecordArray(type);
-
- typeMap.findAllCache = array;
- return array;
- },
-
-
- /**
- This method unloads all of the known records for a given type.
-
- ```javascript
- store.unloadAll(App.Post);
- ```
-
- @method unloadAll
- @param {String or subclass of DS.Model} type
- */
- unloadAll: function(type) {
- type = this.modelFor(type);
-
- var typeMap = this.typeMapFor(type),
- records = typeMap.records.splice(0), record;
-
- while(record = records.pop()) {
- record.unloadRecord();
- }
-
- typeMap.findAllCache = null;
- },
-
- /**
- Takes a type and filter function, and returns a live RecordArray that
- remains up to date as new records are loaded into the store or created
- locally.
-
- The callback function takes a materialized record, and returns true
- if the record should be included in the filter and false if it should
- not.
-
- The filter function is called once on all records for the type when
- it is created, and then once on each newly loaded or created record.
-
- If any of a record's properties change, or if it changes state, the
- filter function will be invoked again to determine whether it should
- still be in the array.
-
- Optionally you can pass a query which will be triggered at first. The
- results returned by the server could then appear in the filter if they
- match the filter function.
-
- Example
-
- ```javascript
- store.filter(App.Post, {unread: true}, function(post) {
- return post.get('unread');
- }).then(function(unreadPosts) {
- unreadPosts.get('length'); // 5
- var unreadPost = unreadPosts.objectAt(0);
- unreadPost.set('unread', false);
- unreadPosts.get('length'); // 4
- });
- ```
-
- @method filter
- @param {String or subclass of DS.Model} type
- @param {Object} query optional query
- @param {Function} filter
- @return {DS.PromiseArray}
- */
- filter: function(type, query, filter) {
- var promise;
-
- // allow an optional server query
- if (arguments.length === 3) {
- promise = this.findQuery(type, query);
- } else if (arguments.length === 2) {
- filter = query;
- }
-
- type = this.modelFor(type);
-
- var array = this.recordArrayManager
- .createFilteredRecordArray(type, filter);
- promise = promise || resolve(array);
-
- return promiseArray(promise.then(function() {
- return array;
- }, null, "DS: Store#filter of " + type));
- },
-
- /**
- This method returns if a certain record is already loaded
- in the store. Use this function to know beforehand if a find()
- will result in a request or that it will be a cache hit.
-
- Example
-
- ```javascript
- store.recordIsLoaded(App.Post, 1); // false
- store.find(App.Post, 1).then(function() {
- store.recordIsLoaded(App.Post, 1); // true
- });
- ```
-
- @method recordIsLoaded
- @param {String or subclass of DS.Model} type
- @param {string} id
- @return {boolean}
- */
- recordIsLoaded: function(type, id) {
- if (!this.hasRecordForId(type, id)) { return false; }
- return !get(this.recordForId(type, id), 'isEmpty');
- },
-
- /**
- This method returns the metadata for a specific type.
-
- @method metadataFor
- @param {String or subclass of DS.Model} type
- @return {object}
- */
- metadataFor: function(type) {
- type = this.modelFor(type);
- return this.typeMapFor(type).metadata;
- },
-
- // ............
- // . UPDATING .
- // ............
-
- /**
- If the adapter updates attributes or acknowledges creation
- or deletion, the record will notify the store to update its
- membership in any filters.
- To avoid thrashing, this method is invoked only once per
-
- run loop per record.
-
- @method dataWasUpdated
- @private
- @param {Class} type
- @param {DS.Model} record
- */
- dataWasUpdated: function(type, record) {
- this.recordArrayManager.recordDidChange(record);
- },
-
- // ..............
- // . PERSISTING .
- // ..............
-
- /**
- This method is called by `record.save`, and gets passed a
- resolver for the promise that `record.save` returns.
-
- It schedules saving to happen at the end of the run loop.
-
- @method scheduleSave
- @private
- @param {DS.Model} record
- @param {Resolver} resolver
- */
- scheduleSave: function(record, resolver) {
- record.adapterWillCommit();
- this._pendingSave.push([record, resolver]);
- once(this, 'flushPendingSave');
- },
-
- /**
- This method is called at the end of the run loop, and
- flushes any records passed into `scheduleSave`
-
- @method flushPendingSave
- @private
- */
- flushPendingSave: function() {
- var pending = this._pendingSave.slice();
- this._pendingSave = [];
-
- forEach(pending, function(tuple) {
- var record = tuple[0], resolver = tuple[1],
- adapter = this.adapterFor(record.constructor),
- operation;
-
- if (get(record, 'isNew')) {
- operation = 'createRecord';
- } else if (get(record, 'isDeleted')) {
- operation = 'deleteRecord';
- } else {
- operation = 'updateRecord';
- }
-
- resolver.resolve(_commit(adapter, this, operation, record));
- }, this);
- },
-
- /**
- This method is called once the promise returned by an
- adapter's `createRecord`, `updateRecord` or `deleteRecord`
- is resolved.
-
- If the data provides a server-generated ID, it will
- update the record and the store's indexes.
-
- @method didSaveRecord
- @private
- @param {DS.Model} record the in-flight record
- @param {Object} data optional data (see above)
- */
- didSaveRecord: function(record, data) {
- if (data) {
- // normalize relationship IDs into records
- data = normalizeRelationships(this, record.constructor, data, record);
-
- this.updateId(record, data);
- }
-
- record.adapterDidCommit(data);
- },
-
- /**
- This method is called once the promise returned by an
- adapter's `createRecord`, `updateRecord` or `deleteRecord`
- is rejected with a `DS.InvalidError`.
-
- @method recordWasInvalid
- @private
- @param {DS.Model} record
- @param {Object} errors
- */
- recordWasInvalid: function(record, errors) {
- record.adapterDidInvalidate(errors);
- },
-
- /**
- This method is called once the promise returned by an
- adapter's `createRecord`, `updateRecord` or `deleteRecord`
- is rejected (with anything other than a `DS.InvalidError`).
-
- @method recordWasError
- @private
- @param {DS.Model} record
- */
- recordWasError: function(record) {
- record.adapterDidError();
- },
-
- /**
- When an adapter's `createRecord`, `updateRecord` or `deleteRecord`
- resolves with data, this method extracts the ID from the supplied
- data.
-
- @method updateId
- @private
- @param {DS.Model} record
- @param {Object} data
- */
- updateId: function(record, data) {
- var oldId = get(record, 'id'),
- id = coerceId(data.id);
-
- Ember.assert("An adapter cannot assign a new id to a record that already has an id. " + record + " had id: " + oldId + " and you tried to update it with " + id + ". This likely happened because your server returned data in response to a find or update that had a different id than the one you sent.", oldId === null || id === oldId);
-
- this.typeMapFor(record.constructor).idToRecord[id] = record;
-
- set(record, 'id', id);
- },
-
- /**
- Returns a map of IDs to client IDs for a given type.
-
- @method typeMapFor
- @private
- @param type
- @return {Object} typeMap
- */
- typeMapFor: function(type) {
- var typeMaps = get(this, 'typeMaps'),
- guid = Ember.guidFor(type),
- typeMap;
-
- typeMap = typeMaps[guid];
-
- if (typeMap) { return typeMap; }
-
- typeMap = {
- idToRecord: {},
- records: [],
- metadata: {}
- };
-
- typeMaps[guid] = typeMap;
-
- return typeMap;
- },
-
- // ................
- // . LOADING DATA .
- // ................
-
- /**
- This internal method is used by `push`.
-
- @method _load
- @private
- @param {String or subclass of DS.Model} type
- @param {Object} data
- @param {Boolean} partial the data should be merged into
- the existing data, not replace it.
- */
- _load: function(type, data, partial) {
- var id = coerceId(data.id),
- record = this.recordForId(type, id);
-
- record.setupData(data, partial);
- this.recordArrayManager.recordDidChange(record);
-
- return record;
- },
-
- /**
- Returns a model class for a particular key. Used by
- methods that take a type key (like `find`, `createRecord`,
- etc.)
-
- @method modelFor
- @param {String or subclass of DS.Model} key
- @returns {subclass of DS.Model}
- */
- modelFor: function(key) {
- var factory;
-
-
- if (typeof key === 'string') {
- var normalizedKey = this.container.normalize('model:' + key);
-
- factory = this.container.lookupFactory(normalizedKey);
- if (!factory) { throw new Ember.Error("No model was found for '" + key + "'"); }
- factory.typeKey = normalizedKey.split(':', 2)[1];
- } else {
- // A factory already supplied.
- factory = key;
- }
-
- factory.store = this;
- return factory;
- },
-
- /**
- Push some data for a given type into the store.
-
- This method expects normalized data:
-
- * The ID is a key named `id` (an ID is mandatory)
- * The names of attributes are the ones you used in
- your model's `DS.attr`s.
- * Your relationships must be:
- * represented as IDs or Arrays of IDs
- * represented as model instances
- * represented as URLs, under the `links` key
-
- For this model:
-
- ```js
- App.Person = DS.Model.extend({
- firstName: DS.attr(),
- lastName: DS.attr(),
-
- children: DS.hasMany('person')
- });
- ```
-
- To represent the children as IDs:
-
- ```js
- {
- id: 1,
- firstName: "Tom",
- lastName: "Dale",
- children: [1, 2, 3]
- }
- ```
-
- To represent the children relationship as a URL:
-
- ```js
- {
- id: 1,
- firstName: "Tom",
- lastName: "Dale",
- links: {
- children: "/people/1/children"
- }
- }
- ```
-
- If you're streaming data or implementing an adapter,
- make sure that you have converted the incoming data
- into this form.
-
- This method can be used both to push in brand new
- records, as well as to update existing records.
-
- @method push
- @param {String or subclass of DS.Model} type
- @param {Object} data
- @returns {DS.Model} the record that was created or
- updated.
- */
- push: function(type, data, _partial) {
- // _partial is an internal param used by `update`.
- // If passed, it means that the data should be
- // merged into the existing data, not replace it.
-
- Ember.assert("You must include an `id` in a hash passed to `push`", data.id != null);
-
- type = this.modelFor(type);
-
- // normalize relationship IDs into records
- data = normalizeRelationships(this, type, data);
-
- this._load(type, data, _partial);
-
- return this.recordForId(type, data.id);
- },
-
- /**
- Push some raw data into the store.
-
- The data will be automatically deserialized using the
- serializer for the `type` param.
-
- This method can be used both to push in brand new
- records, as well as to update existing records.
-
- You can push in more than one type of object at once.
- All objects should be in the format expected by the
- serializer.
-
- ```js
- App.ApplicationSerializer = DS.ActiveModelSerializer;
-
- var pushData = {
- posts: [
- {id: 1, post_title: "Great post", comment_ids: [2]}
- ],
- comments: [
- {id: 2, comment_body: "Insightful comment"}
- ]
- }
-
- store.pushPayload('post', pushData);
- ```
-
- @method pushPayload
- @param {String} type
- @param {Object} payload
- @return {DS.Model} the record that was created or updated.
- */
- pushPayload: function (type, payload) {
- var serializer;
- if (!payload) {
- payload = type;
- serializer = defaultSerializer(this.container);
- Ember.assert("You cannot use `store#pushPayload` without a type unless your default serializer defines `pushPayload`", serializer.pushPayload);
- } else {
- serializer = this.serializerFor(type);
- }
- serializer.pushPayload(this, payload);
- },
-
- update: function(type, data) {
- Ember.assert("You must include an `id` in a hash passed to `update`", data.id != null);
-
- return this.push(type, data, true);
- },
-
- /**
- If you have an Array of normalized data to push,
- you can call `pushMany` with the Array, and it will
- call `push` repeatedly for you.
-
- @method pushMany
- @param {String or subclass of DS.Model} type
- @param {Array} datas
- @return {Array}
- */
- pushMany: function(type, datas) {
- return map(datas, function(data) {
- return this.push(type, data);
- }, this);
- },
-
- /**
- If you have some metadata to set for a type
- you can call `metaForType`.
-
- @method metaForType
- @param {String or subclass of DS.Model} type
- @param {Object} metadata
- */
- metaForType: function(type, metadata) {
- type = this.modelFor(type);
-
- Ember.merge(this.typeMapFor(type).metadata, metadata);
- },
-
- /**
- Build a brand new record for a given type, ID, and
- initial data.
-
- @method buildRecord
- @private
- @param {subclass of DS.Model} type
- @param {String} id
- @param {Object} data
- @returns {DS.Model} record
- */
- buildRecord: function(type, id, data) {
- var typeMap = this.typeMapFor(type),
- idToRecord = typeMap.idToRecord;
-
- Ember.assert('The id ' + id + ' has already been used with another record of type ' + type.toString() + '.', !id || !idToRecord[id]);
-
- // lookupFactory should really return an object that creates
- // instances with the injections applied
- var record = type._create({
- id: id,
- store: this,
- container: this.container
- });
-
- if (data) {
- record.setupData(data);
- }
-
- // if we're creating an item, this process will be done
- // later, once the object has been persisted.
- if (id) {
- idToRecord[id] = record;
- }
-
- typeMap.records.push(record);
-
- return record;
- },
-
- // ...............
- // . DESTRUCTION .
- // ...............
-
- /**
- When a record is destroyed, this un-indexes it and
- removes it from any record arrays so it can be GCed.
-
- @method dematerializeRecord
- @private
- @param {DS.Model} record
- */
- dematerializeRecord: function(record) {
- var type = record.constructor,
- typeMap = this.typeMapFor(type),
- id = get(record, 'id');
-
- record.updateRecordArrays();
-
- if (id) {
- delete typeMap.idToRecord[id];
- }
-
- var loc = indexOf(typeMap.records, record);
- typeMap.records.splice(loc, 1);
- },
-
- // ........................
- // . RELATIONSHIP CHANGES .
- // ........................
-
- addRelationshipChangeFor: function(childRecord, childKey
<TRUNCATED>