diff --git a/.babelrc b/.babelrc new file mode 100644 index 00000000..3c078e9f --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "es2015" + ] +} diff --git a/.gitignore b/.gitignore index 2d9748d6..318fed20 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,7 @@ node_modules *~ # WebStorm/IntelliJ -.idea \ No newline at end of file +.idea + +# Babel.js +lib/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 39762126..6a1923cf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ We really want Parse to be yours, to see it grow and thrive in the open source c ##### Please Do's * Take testing seriously! Aim to increase the test coverage with every pull request. -* Run the tests for the file you are working on with `TESTING=1 (repo-root)/node_modules/jasmine/bin/jasmine.js spec/MyFile.spec.js` +* Run the tests for the file you are working on with `npm test spec/MyFile.spec.js` * Run the tests for the whole project and look at the coverage report to make sure your tests are exhaustive by running `npm test` and looking at (project-root)/lcov-report/parse-server/FileUnderTest.js.html ##### Code of Conduct diff --git a/bin/parse-server b/bin/parse-server index c2606f4b..902e43b2 100755 --- a/bin/parse-server +++ b/bin/parse-server @@ -1,6 +1,6 @@ #!/usr/bin/env node var express = require('express'); -var ParseServer = require("../index").ParseServer; +var ParseServer = require("../lib/index").ParseServer; var app = express(); diff --git a/package.json b/package.json index 3d145ee4..689110c0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "parse-server", "version": "2.0.7", "description": "An express module providing a Parse-compatible API server", - "main": "index.js", + "main": "lib/index.js", "repository": { "type": "git", "url": "https://github.com/ParsePlatform/parse-server" @@ -11,6 +11,7 @@ "dependencies": { "apn": "^1.7.5", "aws-sdk": "~2.2.33", + "babel-runtime": "^6.5.0", "bcrypt-nodejs": "0.0.3", "body-parser": "^1.14.2", "deepcopy": "^0.6.1", @@ -19,23 +20,29 @@ "mime": "^1.3.4", "mongodb": "~2.1.0", "multer": "^1.1.0", + "node-gcm": "^0.14.0", "parse": "^1.7.0", "randomstring": "^1.1.3", - "node-gcm": "^0.14.0", "request": "^2.65.0" }, "devDependencies": { + "babel-cli": "^6.5.1", + "babel-core": "^6.5.1", + "babel-istanbul": "^0.6.0", + "babel-preset-es2015": "^6.5.0", + "babel-register": "^6.5.1", "codecov": "^1.0.1", "deep-diff": "^0.3.3", - "istanbul": "^0.4.2", "jasmine": "^2.3.2", "mongodb-runner": "^3.1.15" }, "scripts": { + "build": "./node_modules/.bin/babel src/ -d lib/", "pretest": "MONGODB_VERSION=${MONGODB_VERSION:=3.0.8} mongodb-runner start", - "test": "NODE_ENV=test TESTING=1 ./node_modules/.bin/istanbul cover --include-all-sources -x **/spec/** ./node_modules/.bin/jasmine", + "test": "NODE_ENV=test TESTING=1 ./node_modules/.bin/babel-node ./node_modules/.bin/babel-istanbul cover -x **/spec/** ./node_modules/.bin/jasmine", "posttest": "mongodb-runner stop", - "start": "./bin/parse-server" + "start": "./bin/parse-server", + "prepublish": "npm run build" }, "engines": { "node": ">=4.1" diff --git a/spec/APNS.spec.js b/spec/APNS.spec.js index c50bb5c9..72490e97 100644 --- a/spec/APNS.spec.js +++ b/spec/APNS.spec.js @@ -1,4 +1,4 @@ -var APNS = require('../APNS'); +var APNS = require('../src/APNS'); describe('APNS', () => { it('can generate APNS notification', (done) => { diff --git a/spec/ExportAdapter.spec.js b/spec/ExportAdapter.spec.js index 95fbdd21..a4f3f9b6 100644 --- a/spec/ExportAdapter.spec.js +++ b/spec/ExportAdapter.spec.js @@ -1,4 +1,4 @@ -var ExportAdapter = require('../ExportAdapter'); +var ExportAdapter = require('../src/ExportAdapter'); describe('ExportAdapter', () => { it('can be constructed', (done) => { diff --git a/spec/GCM.spec.js b/spec/GCM.spec.js index d7484b0e..4bad883e 100644 --- a/spec/GCM.spec.js +++ b/spec/GCM.spec.js @@ -1,4 +1,4 @@ -var GCM = require('../GCM'); +var GCM = require('../src/GCM'); describe('GCM', () => { it('can generate GCM Payload without expiration time', (done) => { diff --git a/spec/ParseACL.spec.js b/spec/ParseACL.spec.js index fead537e..370550c0 100644 --- a/spec/ParseACL.spec.js +++ b/spec/ParseACL.spec.js @@ -251,6 +251,9 @@ describe('Parse.ACL', () => { equal(results.length, 1); var result = results[0]; ok(result); + if (!result) { + return fail(); + } equal(result.id, object.id); equal(result.getACL().getReadAccess(user), true); equal(result.getACL().getWriteAccess(user), true); diff --git a/spec/ParseAPI.spec.js b/spec/ParseAPI.spec.js index 24edf38f..8670bdd2 100644 --- a/spec/ParseAPI.spec.js +++ b/spec/ParseAPI.spec.js @@ -1,7 +1,7 @@ // A bunch of different tests are in here - it isn't very thematic. // It would probably be better to refactor them into different files. -var DatabaseAdapter = require('../DatabaseAdapter'); +var DatabaseAdapter = require('../src/DatabaseAdapter'); var request = require('request'); describe('miscellaneous', function() { diff --git a/spec/ParseInstallation.spec.js b/spec/ParseInstallation.spec.js index 6d8e6162..91bb9a23 100644 --- a/spec/ParseInstallation.spec.js +++ b/spec/ParseInstallation.spec.js @@ -1,12 +1,12 @@ // These tests check the Installations functionality of the REST API. // Ported from installation_collection_test.go -var auth = require('../Auth'); -var cache = require('../cache'); -var Config = require('../Config'); -var DatabaseAdapter = require('../DatabaseAdapter'); +var auth = require('../src/Auth'); +var cache = require('../src/cache'); +var Config = require('../src/Config'); +var DatabaseAdapter = require('../src/DatabaseAdapter'); var Parse = require('parse/node').Parse; -var rest = require('../rest'); +var rest = require('../src/rest'); var config = new Config('test'); var database = DatabaseAdapter.getDatabaseConnection('test'); diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js index b364adf1..c9f25bd8 100644 --- a/spec/ParseUser.spec.js +++ b/spec/ParseUser.spec.js @@ -6,7 +6,7 @@ // Tests that involve sending password reset emails. var request = require('request'); -var passwordCrypto = require('../password'); +var passwordCrypto = require('../src/password'); describe('Parse.User testing', () => { it("user sign up class method", (done) => { diff --git a/spec/RestCreate.spec.js b/spec/RestCreate.spec.js index 59de11ea..24455507 100644 --- a/spec/RestCreate.spec.js +++ b/spec/RestCreate.spec.js @@ -1,10 +1,10 @@ // These tests check the "create" functionality of the REST API. -var auth = require('../Auth'); -var cache = require('../cache'); -var Config = require('../Config'); -var DatabaseAdapter = require('../DatabaseAdapter'); +var auth = require('../src/Auth'); +var cache = require('../src/cache'); +var Config = require('../src/Config'); +var DatabaseAdapter = require('../src/DatabaseAdapter'); var Parse = require('parse/node').Parse; -var rest = require('../rest'); +var rest = require('../src/rest'); var request = require('request'); var config = new Config('test'); diff --git a/spec/RestQuery.spec.js b/spec/RestQuery.spec.js index 08d01766..b93a07d5 100644 --- a/spec/RestQuery.spec.js +++ b/spec/RestQuery.spec.js @@ -1,8 +1,8 @@ // These tests check the "find" functionality of the REST API. -var auth = require('../Auth'); -var cache = require('../cache'); -var Config = require('../Config'); -var rest = require('../rest'); +var auth = require('../src/Auth'); +var cache = require('../src/cache'); +var Config = require('../src/Config'); +var rest = require('../src/rest'); var config = new Config('test'); var nobody = auth.nobody(config); diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index ccc83525..636311a6 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -1,6 +1,6 @@ // These tests check that the Schema operates correctly. -var Config = require('../Config'); -var Schema = require('../Schema'); +var Config = require('../src/Config'); +var Schema = require('../src/Schema'); var dd = require('deep-diff'); var config = new Config('test'); @@ -252,7 +252,7 @@ describe('Schema', () => { it('refuses to add fields with invalid pointer types', done => { config.database.loadSchema() .then(schema => schema.addClassIfNotExists('NewClass', { - foo: {type: 'Pointer'}, + foo: {type: 'Pointer'} })) .catch(error => { expect(error.code).toEqual(135); @@ -398,7 +398,7 @@ describe('Schema', () => { config.database.loadSchema() .then(schema => schema.addClassIfNotExists('NewClass', { geo1: {type: 'GeoPoint'}, - geo2: {type: 'GeoPoint'}, + geo2: {type: 'GeoPoint'} })) .catch(error => { expect(error.code).toEqual(Parse.Error.INCORRECT_TYPE); diff --git a/spec/helper.js b/spec/helper.js index cca4d1a5..3e6c6d98 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -2,11 +2,11 @@ jasmine.DEFAULT_TIMEOUT_INTERVAL = 2000; -var cache = require('../cache'); -var DatabaseAdapter = require('../DatabaseAdapter'); +var cache = require('../src/cache'); +var DatabaseAdapter = require('../src/DatabaseAdapter'); var express = require('express'); -var facebook = require('../facebook'); -var ParseServer = require('../index').ParseServer; +var facebook = require('../src/facebook'); +var ParseServer = require('../src/index').ParseServer; var databaseURI = process.env.DATABASE_URI; var cloudMain = process.env.CLOUD_CODE_MAIN || './cloud/main.js'; diff --git a/spec/push.spec.js b/spec/push.spec.js index ba5b533b..a2ea41b5 100644 --- a/spec/push.spec.js +++ b/spec/push.spec.js @@ -1,4 +1,4 @@ -var push = require('../push'); +var push = require('../src/push'); describe('push', () => { it('can check valid master key of request', (done) => { diff --git a/spec/schemas.spec.js b/spec/schemas.spec.js index 2378caf5..68ac31c9 100644 --- a/spec/schemas.spec.js +++ b/spec/schemas.spec.js @@ -16,7 +16,7 @@ var hasAllPODobject = () => { objACL.setPublicWriteAccess(false); obj.setACL(objACL); return obj; -} +}; var plainOldDataSchema = { className: 'HasAllPOD', @@ -35,7 +35,7 @@ var plainOldDataSchema = { aArray: {type: 'Array'}, aGeoPoint: {type: 'GeoPoint'}, aFile: {type: 'File'} - }, + } }; var pointersAndRelationsSchema = { diff --git a/spec/support/jasmine.json b/spec/support/jasmine.json index b1aae666..e0347ebf 100644 --- a/spec/support/jasmine.json +++ b/spec/support/jasmine.json @@ -4,7 +4,7 @@ "*spec.js" ], "helpers": [ + "../node_modules/babel-core/register.js", "helper.js" ] } - diff --git a/spec/transform.spec.js b/spec/transform.spec.js index 528c46bf..c7780ffb 100644 --- a/spec/transform.spec.js +++ b/spec/transform.spec.js @@ -1,6 +1,6 @@ // These tests are unit tests designed to only test transform.js. -var transform = require('../transform'); +var transform = require('../src/transform'); var dummySchema = { data: {}, diff --git a/APNS.js b/src/APNS.js similarity index 99% rename from APNS.js rename to src/APNS.js index 5fc73ab0..85c97401 100644 --- a/APNS.js +++ b/src/APNS.js @@ -60,7 +60,7 @@ APNS.prototype.send = function(data, deviceTokens) { var generateNotification = function(coreData, expirationTime) { var notification = new apn.notification(); var payload = {}; - for (key in coreData) { + for (var key in coreData) { switch (key) { case 'alert': notification.setAlertText(coreData.alert); diff --git a/Auth.js b/src/Auth.js similarity index 100% rename from Auth.js rename to src/Auth.js diff --git a/Config.js b/src/Config.js similarity index 100% rename from Config.js rename to src/Config.js diff --git a/DatabaseAdapter.js b/src/DatabaseAdapter.js similarity index 100% rename from DatabaseAdapter.js rename to src/DatabaseAdapter.js diff --git a/ExportAdapter.js b/src/ExportAdapter.js similarity index 100% rename from ExportAdapter.js rename to src/ExportAdapter.js diff --git a/FilesAdapter.js b/src/FilesAdapter.js similarity index 100% rename from FilesAdapter.js rename to src/FilesAdapter.js diff --git a/GCM.js b/src/GCM.js similarity index 100% rename from GCM.js rename to src/GCM.js diff --git a/GridStoreAdapter.js b/src/GridStoreAdapter.js similarity index 100% rename from GridStoreAdapter.js rename to src/GridStoreAdapter.js diff --git a/PromiseRouter.js b/src/PromiseRouter.js similarity index 100% rename from PromiseRouter.js rename to src/PromiseRouter.js diff --git a/README.md b/src/README.md similarity index 100% rename from README.md rename to src/README.md diff --git a/RestQuery.js b/src/RestQuery.js similarity index 100% rename from RestQuery.js rename to src/RestQuery.js diff --git a/RestWrite.js b/src/RestWrite.js similarity index 100% rename from RestWrite.js rename to src/RestWrite.js diff --git a/S3Adapter.js b/src/S3Adapter.js similarity index 100% rename from S3Adapter.js rename to src/S3Adapter.js diff --git a/Schema.js b/src/Schema.js similarity index 97% rename from Schema.js rename to src/Schema.js index 25e301cd..3656507a 100644 --- a/Schema.js +++ b/src/Schema.js @@ -17,7 +17,7 @@ var Parse = require('parse/node').Parse; var transform = require('./transform'); -defaultColumns = { +var defaultColumns = { // Contain the default columns for every parse object type (except _Join collection) _Default: { "objectId": {type:'String'}, @@ -43,13 +43,13 @@ defaultColumns = { "GCMSenderId": {type:'String'}, "timeZone": {type:'String'}, "localeIdentifier": {type:'String'}, - "badge": {type:'Number'}, + "badge": {type:'Number'} }, // The additional default columns for the _User collection (in addition to DefaultCols) _Role: { "name": {type:'String'}, "users": {type:'Relation',className:'_User'}, - "roles": {type:'Relation',className:'_Role'}, + "roles": {type:'Relation',className:'_Role'} }, // The additional default columns for the _User collection (in addition to DefaultCols) _Session: { @@ -58,9 +58,9 @@ defaultColumns = { "installationId": {type:'String'}, "sessionToken": {type:'String'}, "expiresAt": {type:'Date'}, - "createdWith": {type:'Object'}, - }, -} + "createdWith": {type:'Object'} + } +}; // Valid classes must: // Be one of _User, _Installation, _Role, _Session OR @@ -221,7 +221,7 @@ Schema.prototype.addClassIfNotExists = function(className, fields) { error: invalidClassNameMessage(className), }); } - for (fieldName in fields) { + for (var fieldName in fields) { if (!fieldNameIsValid(fieldName)) { return Promise.reject({ code: Parse.Error.INVALID_KEY_NAME, @@ -240,18 +240,18 @@ Schema.prototype.addClassIfNotExists = function(className, fields) { _id: className, objectId: 'string', updatedAt: 'string', - createdAt: 'string', + createdAt: 'string' }; - for (fieldName in defaultColumns[className]) { - validatedField = schemaAPITypeToMongoFieldType(defaultColumns[className][fieldName]); + for (var fieldName in defaultColumns[className]) { + var validatedField = schemaAPITypeToMongoFieldType(defaultColumns[className][fieldName]); if (validatedField.code) { return Promise.reject(validatedField); } mongoObject[fieldName] = validatedField.result; } - for (fieldName in fields) { - validatedField = schemaAPITypeToMongoFieldType(fields[fieldName]); + for (var fieldName in fields) { + var validatedField = schemaAPITypeToMongoFieldType(fields[fieldName]); if (validatedField.code) { return Promise.reject(validatedField); } @@ -259,7 +259,6 @@ Schema.prototype.addClassIfNotExists = function(className, fields) { } var geoPoints = Object.keys(mongoObject).filter(key => mongoObject[key] === 'geopoint'); - if (geoPoints.length > 1) { return Promise.reject({ code: Parse.Error.INCORRECT_TYPE, @@ -278,7 +277,7 @@ Schema.prototype.addClassIfNotExists = function(className, fields) { } return Promise.reject(error); }); -} +}; // Returns a promise that resolves successfully to the new schema // object or fails with a reason. diff --git a/analytics.js b/src/analytics.js similarity index 100% rename from analytics.js rename to src/analytics.js diff --git a/batch.js b/src/batch.js similarity index 100% rename from batch.js rename to src/batch.js diff --git a/cache.js b/src/cache.js similarity index 100% rename from cache.js rename to src/cache.js diff --git a/classes.js b/src/classes.js similarity index 98% rename from classes.js rename to src/classes.js index 98e94871..f1400914 100644 --- a/classes.js +++ b/src/classes.js @@ -42,7 +42,7 @@ function handleFind(req) { req.params.className, body.where, options) .then((response) => { if (response && response.results) { - for (result of response.results) { + for (var result of response.results) { if (result.sessionToken) { result.sessionToken = req.info.sessionToken || result.sessionToken; } diff --git a/cloud/main.js b/src/cloud/main.js similarity index 100% rename from cloud/main.js rename to src/cloud/main.js diff --git a/facebook.js b/src/facebook.js similarity index 100% rename from facebook.js rename to src/facebook.js diff --git a/files.js b/src/files.js similarity index 100% rename from files.js rename to src/files.js diff --git a/functions.js b/src/functions.js similarity index 100% rename from functions.js rename to src/functions.js diff --git a/httpRequest.js b/src/httpRequest.js similarity index 100% rename from httpRequest.js rename to src/httpRequest.js diff --git a/index.js b/src/index.js similarity index 100% rename from index.js rename to src/index.js diff --git a/installations.js b/src/installations.js similarity index 100% rename from installations.js rename to src/installations.js diff --git a/middlewares.js b/src/middlewares.js similarity index 100% rename from middlewares.js rename to src/middlewares.js diff --git a/password.js b/src/password.js similarity index 100% rename from password.js rename to src/password.js diff --git a/push.js b/src/push.js similarity index 100% rename from push.js rename to src/push.js diff --git a/rest.js b/src/rest.js similarity index 100% rename from rest.js rename to src/rest.js diff --git a/roles.js b/src/roles.js similarity index 100% rename from roles.js rename to src/roles.js diff --git a/schemas.js b/src/schemas.js similarity index 95% rename from schemas.js rename to src/schemas.js index 6145b7e6..837224ab 100644 --- a/schemas.js +++ b/src/schemas.js @@ -34,8 +34,8 @@ function mongoFieldTypeToSchemaAPIType(type) { } function mongoSchemaAPIResponseFields(schema) { - fieldNames = Object.keys(schema).filter(key => key !== '_id' && key !== '_metadata'); - response = fieldNames.reduce((obj, fieldName) => { + var fieldNames = Object.keys(schema).filter(key => key !== '_id' && key !== '_metadata'); + var response = fieldNames.reduce((obj, fieldName) => { obj[fieldName] = mongoFieldTypeToSchemaAPIType(schema[fieldName]) return obj; }, {}); diff --git a/sessions.js b/src/sessions.js similarity index 100% rename from sessions.js rename to src/sessions.js diff --git a/testing-routes.js b/src/testing-routes.js similarity index 100% rename from testing-routes.js rename to src/testing-routes.js diff --git a/transform.js b/src/transform.js similarity index 99% rename from transform.js rename to src/transform.js index 48b02c75..802bf075 100644 --- a/transform.js +++ b/src/transform.js @@ -21,7 +21,7 @@ var Parse = require('parse/node').Parse; // validate: true indicates that key names are to be validated. // // Returns an object with {key: key, value: value}. -function transformKeyValue(schema, className, restKey, restValue, options) { +export function transformKeyValue(schema, className, restKey, restValue, options) { options = options || {}; // Check if the schema is known since it's a built-in field. diff --git a/triggers.js b/src/triggers.js similarity index 100% rename from triggers.js rename to src/triggers.js diff --git a/users.js b/src/users.js similarity index 100% rename from users.js rename to src/users.js