diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 0000000..5e9462c --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1,3 @@ +{ + "ignore_dirs": ["tmp"] +} diff --git a/Brocfile.js b/Brocfile.js deleted file mode 100644 index 042a64d..0000000 --- a/Brocfile.js +++ /dev/null @@ -1,21 +0,0 @@ -/* jshint node: true */ -/* global require, module */ - -var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); - -var app = new EmberAddon(); - -// Use `app.import` to add additional libraries to the generated -// output files. -// -// If you need to use different assets in different -// environments, specify an object as the first parameter. That -// object's keys should be the environment name and the values -// should be the asset to use in that environment. -// -// If the library that you are including contains AMD or ES6 -// modules that you would like to import into your application -// please specify an object with the list of modules as keys -// along with the exports of each module as its value. - -module.exports = app.toTree(); diff --git a/addon/adapters/application.js b/addon/adapters/application.js index d68f0f4..853f4b0 100644 --- a/addon/adapters/application.js +++ b/addon/adapters/application.js @@ -42,9 +42,8 @@ export default DS.RESTAdapter.extend({ * properties onto existing data so that the record maintains * latest data. */ - createRecord: function( store, type, record ) { + createRecord: function( store, type, snapshot ) { var serializer = store.serializerFor( type.typeKey ), - snapshot = record._createSnapshot(), data = {}, adapter = this; @@ -69,10 +68,9 @@ export default DS.RESTAdapter.extend({ * properties onto existing data so that the record maintains * latest data. */ - updateRecord: function(store, type, record) { + updateRecord: function(store, type, snapshot) { var serializer = store.serializerFor( type.typeKey ), - snapshot = record._createSnapshot(), - id = record.get( 'id' ), + id = snapshot.id, sendDeletes = false, deleteds = {}, data = {}, @@ -129,20 +127,22 @@ export default DS.RESTAdapter.extend({ * Implementation of a hasMany that provides a Relation query for Parse * objects. */ - findHasMany: function( store, record, relatedInfo ) { - var relatedInfo_ = JSON.parse( relatedInfo ), + findHasMany: function( store, snapshot, url/*, relationship */ ) { + var relatedInfo_ = JSON.parse( url ), query = { where: { '$relatedTo': { 'object': { '__type' : 'Pointer', - 'className' : this.parseClassName( record.typeKey ), - 'objectId' : record.get( 'id' ) + 'className' : this.parseClassName( snapshot.typeKey ), + 'objectId' : snapshot.id }, key: relatedInfo_.key } } }; + + // the request is to the related type and not the type for the record. // the query is where there is a pointer to this record. @@ -173,11 +173,12 @@ export default DS.RESTAdapter.extend({ return this._super( store, type, query ); }, - sessionToken: Ember.computed( 'headers.X-Parse-Session-Token', function( key, value ) { - if ( arguments.length < 2 ) { - return this.get( 'headers.X-Parse-Session-Token' ); - } else { - this.set( 'headers.X-Parse-Session-Token', value ); + sessionToken: Ember.computed('headers.X-Parse-Session-Token', { + get: function get() { + return this.get('headers.X-Parse-Session-Token'); + }, + set: function set(key, value) { + this.set('headers.X-Parse-Session-Token', value); return value; } }) diff --git a/addon/serializers/application.js b/addon/serializers/application.js index 86e07af..24fe926 100644 --- a/addon/serializers/application.js +++ b/addon/serializers/application.js @@ -86,7 +86,7 @@ export default DS.RESTSerializer.extend({ // the links property so the adapter can async call the // relationship. // The adapter findHasMany has been overridden to make use of this. - if(options.relation) { + //if(options.relation) { // hash[key] contains the response of Parse.com: eg {__type: Relation, className: MyParseClassName} // this is an object that make ember-data fail, as it expects nothing or an array ids that represent the records hash[key] = []; @@ -98,7 +98,7 @@ export default DS.RESTSerializer.extend({ } hash.links[key] = JSON.stringify({typeKey: relationship.type.typeKey, key: key}); - } + //} if ( options.array ) { // Parse will return [null] for empty relationships @@ -148,25 +148,24 @@ export default DS.RESTSerializer.extend({ } }, - serializeBelongsTo: function( snapshot, json, relationship ) { + serializeBelongsTo: function(snapshot, json, relationship) { var key = relationship.key, belongsToId = snapshot.belongsTo(key, { id: true }); - if ( belongsToId ) { + if (belongsToId) { json[key] = { '__type' : 'Pointer', - 'className' : this.parseClassName(key), + 'className' : this.parseClassName(relationship.type.typeKey), 'objectId' : belongsToId }; } }, - parseClassName: function( key ) { - if ( 'parseUser' === key) { + parseClassName: function(key) { + if ('parseUser' === key) { return '_User'; - } else { - return Ember.String.capitalize( Ember.String.camelize( key ) ); + return Ember.String.capitalize(Ember.String.camelize(key)); } }, @@ -179,19 +178,23 @@ export default DS.RESTSerializer.extend({ if ( hasMany && hasMany.get( 'length' ) > 0 ) { json[key] = { 'objects': [] }; - if ( options.relation ) { + // an array is not a relationship, right? + + /*if ( options.relation ) { json[key].__op = 'AddRelation'; } if ( options.array ) { json[key].__op = 'AddUnique'; - } + }*/ + + json[key].__op = 'AddRelation'; hasMany.forEach( function( child ) { json[key].objects.push({ '__type' : 'Pointer', 'className' : _this.parseClassName(child.type.typeKey), - 'objectId' : child.attr( 'id' ) + 'objectId' : child.id }); }); @@ -225,8 +228,8 @@ export default DS.RESTSerializer.extend({ } } else { - json[key] = []; + json[key] = null; } } -}); \ No newline at end of file +}); diff --git a/bower.json b/bower.json index 43ddc4c..04efc8a 100644 --- a/bower.json +++ b/bower.json @@ -2,15 +2,15 @@ "name": "ember-parse-adapter", "dependencies": { "jquery": "^1.11.1", - "ember": "1.10.0", - "ember-data": "1.0.0-beta.15", - "ember-resolver": "~0.1.12", - "loader.js": "ember-cli/loader.js#3.2.0", + "ember": "1.13.7", + "ember-data": "1.0.0-beta.16", + "ember-resolver": "~0.1.15", + "loader.js": "ember-cli/loader.js#3.3.0", "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3", - "ember-cli-test-loader": "ember-cli-test-loader#0.1.3", - "ember-load-initializers": "ember-cli/ember-load-initializers#0.0.2", - "ember-qunit": "0.2.8", + "ember-cli-test-loader": "ember-cli-test-loader#0.2.0", + "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.5", + "ember-qunit": "0.4.9", "ember-qunit-notifications": "0.0.7", - "qunit": "~1.17.1" + "qunit": "~1.18.0" } } \ No newline at end of file diff --git a/config/ember-try.js b/config/ember-try.js new file mode 100644 index 0000000..83dab0f --- /dev/null +++ b/config/ember-try.js @@ -0,0 +1,35 @@ +module.exports = { + scenarios: [ + { + name: 'default', + dependencies: { } + }, + { + name: 'ember-release', + dependencies: { + 'ember': 'components/ember#release' + }, + resolutions: { + 'ember': 'release' + } + }, + { + name: 'ember-beta', + dependencies: { + 'ember': 'components/ember#beta' + }, + resolutions: { + 'ember': 'beta' + } + }, + { + name: 'ember-canary', + dependencies: { + 'ember': 'components/ember#canary' + }, + resolutions: { + 'ember': 'canary' + } + } + ] +}; diff --git a/ember-cli-build.js b/ember-cli-build.js new file mode 100644 index 0000000..d37d64c --- /dev/null +++ b/ember-cli-build.js @@ -0,0 +1,17 @@ +/* global require, module */ +var EmberApp = require('ember-cli/lib/broccoli/ember-addon'); + +module.exports = function(defaults) { + var app = new EmberApp(defaults, { + // Add options here + }); + + /* + This build file specifes the options for the dummy test app of this + addon, located in `/tests/dummy` + This build file does *not* influence how the addon or the app using it + behave. You most likely want to be modifying `./index.js` or app's build file + */ + + return app.toTree(); +}; diff --git a/package.json b/package.json index b0436ef..48bdfd4 100644 --- a/package.json +++ b/package.json @@ -26,18 +26,18 @@ "license": "MIT", "devDependencies": { "broccoli-asset-rev": "^2.0.0", - "ember-cli": "0.2.7", + "ember-cli": "1.13.8", "ember-cli-app-version": "0.3.2", - "ember-cli-babel": "^4.0.0", - "ember-cli-content-security-policy": "0.3.0", - "ember-cli-dependency-checker": "0.0.8", - "ember-cli-htmlbars": "0.7.4", - "ember-cli-ic-ajax": "0.1.1", - "ember-cli-inject-live-reload": "^1.3.0", - "ember-cli-qunit": "0.3.9", + "ember-cli-babel": "5.1.3", + "ember-cli-content-security-policy": "0.4.0", + "ember-cli-dependency-checker": "1.0.1", + "ember-cli-htmlbars": "0.7.9", + "ember-cli-ic-ajax": "0.2.1", + "ember-cli-inject-live-reload": "1.3.1", + "ember-cli-qunit": "1.0.0", "ember-cli-uglify": "1.0.1", - "ember-data": "1.0.0-beta.15", - "ember-export-application-global": "^1.0.2" + "ember-data": "1.0.0-beta.16", + "ember-export-application-global": "1.0.3" }, "keywords": [ "ember-addon", diff --git a/tests/dummy/app/controllers/hasmany.js b/tests/dummy/app/controllers/hasmany.js index 14b2993..44fe322 100644 --- a/tests/dummy/app/controllers/hasmany.js +++ b/tests/dummy/app/controllers/hasmany.js @@ -21,9 +21,10 @@ export default Ember.Controller.extend({ var tiger = this.get( 'model' ), stripe = tiger.get( 'stripes' ).createRecord(); - stripe.save().then( function( tiger ) { + stripe.save().then( function( stripe ) { tiger.save(); }); } + } }); \ No newline at end of file diff --git a/tests/dummy/app/models/stripe.js b/tests/dummy/app/models/stripe.js index a8f780e..d777d50 100644 --- a/tests/dummy/app/models/stripe.js +++ b/tests/dummy/app/models/stripe.js @@ -2,5 +2,5 @@ import Ember from 'ember'; import DS from 'ember-data'; export default DS.Model.extend({ - tiger: DS.belongsTo( 'tiger' ) + tiger: DS.belongsTo( 'tiger', { async: true } ) }); \ No newline at end of file diff --git a/tests/dummy/app/models/tiger.js b/tests/dummy/app/models/tiger.js index ae11fe4..d1885af 100644 --- a/tests/dummy/app/models/tiger.js +++ b/tests/dummy/app/models/tiger.js @@ -3,5 +3,5 @@ import DS from 'ember-data'; export default DS.Model.extend({ name: DS.attr( 'string' ), - stripes: DS.hasMany( 'stripe' ) + stripes: DS.hasMany( 'stripe', { async: true } ) }); \ No newline at end of file diff --git a/tests/dummy/app/templates/hasmany.hbs b/tests/dummy/app/templates/hasmany.hbs index 3474da9..415f126 100644 --- a/tests/dummy/app/templates/hasmany.hbs +++ b/tests/dummy/app/templates/hasmany.hbs @@ -26,4 +26,4 @@ -{{/if}} +{{/if}} \ No newline at end of file diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 8c7195e..da6024d 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -20,6 +20,16 @@ module.exports = function(environment) { restApiId: 'BH0IoMxroXSVU3GTMQTVaM4BXjvdX7lKtFujgvzO' } }; + + ENV.contentSecurityPolicy = { + 'default-src': "'none'", + 'script-src': "'self' http://cdnjs.cloudflare.com", + 'font-src': "'self' http://cdnjs.cloudflare.com", + 'connect-src': "'self' https://api.parse.com", + 'img-src': "'self'", + 'style-src': "'self' 'unsafe-inline' http://cdnjs.cloudflare.com", + 'media-src': "'self'" + } if (environment === 'development') { // ENV.APP.LOG_RESOLVER = true; diff --git a/tests/unit/adapters/application-test.js b/tests/unit/adapters/application-test.js index 2f9ed85..5d96c9f 100644 --- a/tests/unit/adapters/application-test.js +++ b/tests/unit/adapters/application-test.js @@ -266,7 +266,7 @@ test( 'Create Record', function( assert ) { // Passing comments as an Ember array. This is due to a bug in Ember-Data // expecting an Ember array for data and not a raw array: // https://github.com/emberjs/data/pull/1939 - assert.deepEqual( ajaxHash.data, {comments: Ember.A(), title: 'Testing Create'}, 'raw data is posted' ); + assert.deepEqual( ajaxHash.data, {comments: null, title: 'Testing Create'}, 'raw data is posted' ); ajaxHash.success({ objectId : 'created321', diff --git a/tests/unit/initializers/initialize-test.js b/tests/unit/initializers/initialize-test.js index a645237..f8c9bcc 100644 --- a/tests/unit/initializers/initialize-test.js +++ b/tests/unit/initializers/initialize-test.js @@ -16,7 +16,7 @@ module( 'Unit - initializer:initialize', { test( 'Adapter is registered on container', function( assert ) { assert.equal( typeof App.__container__.lookup( 'adapter:-parse' ), 'object' ); - assert.equal( App.__container__._options['adapter:-parse'].instantiate, undefined ); + assert.equal( App.registry._options['adapter:-parse'].instantiate, undefined ); }); test( 'Adapter has header values set to expected values', function( assert ) { @@ -26,25 +26,25 @@ test( 'Adapter has header values set to expected values', function( assert ) { test( 'Serializer is registered on container', function( assert ) { assert.equal( typeof App.__container__.lookup( 'serializer:-parse' ), 'object' ); - assert.equal( App.__container__._options['serializer:-parse'].instantiate, undefined ); + assert.equal( App.registry._options['serializer:-parse'].instantiate, undefined ); }); test( 'Parse Date transform is registered on container', function( assert ) { assert.equal( typeof App.__container__.lookup( 'transform:parse-date' ), 'object' ); - assert.equal( App.__container__._options['transform:parse-date'].instantiate, undefined ); + assert.equal( App.registry._options['transform:parse-date'].instantiate, undefined ); }); test( 'Parse File transform is registered on container', function( assert ) { assert.equal( typeof App.__container__.lookup( 'transform:parse-file' ), 'object' ); - assert.equal( App.__container__._options['transform:parse-file'].instantiate, undefined ); + assert.equal( App.registry._options['transform:parse-file'].instantiate, undefined ); }); test( 'Parse GeoPoint transform is registered on container', function( assert ) { assert.equal( typeof App.__container__.lookup( 'transform:parse-geo-point' ), 'object' ); - assert.equal( App.__container__._options['transform:parse-geo-point'].instantiate, undefined ); + assert.equal( App.registry._options['transform:parse-geo-point'].instantiate, undefined ); }); test( 'Parse User model is registered on container', function( assert ) { - assert.equal( typeof App.__container__._options['model:parse-user'], 'object' ); - assert.equal( App.__container__._options['model:parse-user'].instantiate, undefined ); + assert.equal( typeof App.registry._options['model:parse-user'], 'object' ); + assert.equal( App.registry._options['model:parse-user'].instantiate, undefined ); }); \ No newline at end of file