diff --git a/integration/test/ParseLiveQueryTest.js b/integration/test/ParseLiveQueryTest.js index ab779b186..de066757c 100644 --- a/integration/test/ParseLiveQueryTest.js +++ b/integration/test/ParseLiveQueryTest.js @@ -285,7 +285,7 @@ describe('Parse LiveQuery', () => { it('connectPromise does throw', async () => { await reconfigureServer({ cloud({ Cloud }) { - Cloud.beforeConnect((params) => { + Cloud.beforeConnect(params => { if (params.sessionToken === 'testToken') { throw 'not allowed to connect'; } diff --git a/integration/test/ParseObjectTest.js b/integration/test/ParseObjectTest.js index 8efda1c3e..c5849ed74 100644 --- a/integration/test/ParseObjectTest.js +++ b/integration/test/ParseObjectTest.js @@ -1644,49 +1644,36 @@ describe('Parse Object', () => { }); }); - it('merges user attributes on fetchAll', done => { + it('merges user attributes on fetchAll', async () => { Parse.User.enableUnsafeCurrentUser(); - let sameUser; + const acl = new Parse.ACL(); + acl.setPublicReadAccess(true); let user = new Parse.User(); user.set('username', 'asdf'); user.set('password', 'zxcv'); user.set('foo', 'bar'); - user - .signUp() - .then(() => { - Parse.User.logOut(); - const query = new Parse.Query(Parse.User); - return query.get(user.id); - }) - .then(userAgain => { - user = userAgain; - sameUser = new Parse.User(); - sameUser.set('username', 'asdf'); - sameUser.set('password', 'zxcv'); - return sameUser.logIn(); - }) - .then(() => { - assert(!user.getSessionToken()); - assert(sameUser.getSessionToken()); - sameUser.set('baz', 'qux'); - return sameUser.save(); - }) - .then(() => { - return Parse.Object.fetchAll([user]); - }) - .then(() => { - assert.equal(user.createdAt.getTime(), sameUser.createdAt.getTime()); - assert.equal(user.updatedAt.getTime(), sameUser.updatedAt.getTime()); - return Parse.User.logOut().then( - () => { - done(); - }, - () => { - done(); - } - ); - }) - .catch(done.fail); + user.setACL(acl); + await user.signUp(); + + Parse.User.logOut(); + const query = new Parse.Query(Parse.User); + user = await query.get(user.id); + + const sameUser = new Parse.User(); + sameUser.set('username', 'asdf'); + sameUser.set('password', 'zxcv'); + sameUser.setACL(acl); + await sameUser.logIn(); + + assert(!user.getSessionToken()); + assert(sameUser.getSessionToken()); + sameUser.set('baz', 'qux'); + await sameUser.save(); + + await Parse.Object.fetchAll([user]); + assert.equal(user.createdAt.getTime(), sameUser.createdAt.getTime()); + assert.equal(user.updatedAt.getTime(), sameUser.updatedAt.getTime()); + await Parse.User.logOut(); }); it('can fetchAllIfNeededWithInclude', async () => { diff --git a/integration/test/ParseQueryTest.js b/integration/test/ParseQueryTest.js index b159ab5a4..149c2e537 100644 --- a/integration/test/ParseQueryTest.js +++ b/integration/test/ParseQueryTest.js @@ -71,12 +71,15 @@ describe('Parse Query', () => { assert.strictEqual(result.className, 'TestObject'); assert.strictEqual(result.objectId, object.id); - await query.each((obj) => { - assert.strictEqual(obj instanceof Parse.Object, false); - assert.strictEqual(obj.foo, 'bar'); - assert.strictEqual(obj.className, 'TestObject'); - assert.strictEqual(obj.objectId, object.id); - }, { json: true }); + await query.each( + obj => { + assert.strictEqual(obj instanceof Parse.Object, false); + assert.strictEqual(obj.foo, 'bar'); + assert.strictEqual(obj.className, 'TestObject'); + assert.strictEqual(obj.objectId, object.id); + }, + { json: true } + ); }); it('can do query with count', async () => { @@ -1771,22 +1774,22 @@ describe('Parse Query', () => { } }); - it('can include User fields', done => { - Parse.User.signUp('bob', 'password', { age: 21 }) - .then(user => { - const obj = new TestObject(); - return obj.save({ owner: user }); - }) - .then(obj => { - const query = new Parse.Query(TestObject); - query.include('owner'); - return query.get(obj.id); - }) - .then(objAgain => { - assert(objAgain.get('owner') instanceof Parse.User); - assert.equal(objAgain.get('owner').get('age'), 21); - done(); - }); + it('can include User fields', async () => { + const user = new Parse.User(); + user.set('username', 'bob'); + user.set('password', 'password'); + user.set('age', 21); + const acl = new Parse.ACL(); + acl.setPublicReadAccess(true); + user.setACL(acl); + await user.signUp(); + const obj = new TestObject(); + await obj.save({ owner: user }); + const query = new Parse.Query(TestObject); + query.include('owner'); + const objAgain = await query.get(obj.id); + assert(objAgain.get('owner') instanceof Parse.User); + assert.equal(objAgain.get('owner').get('age'), 21); }); it('can build OR queries', done => { diff --git a/integration/test/ParseUserTest.js b/integration/test/ParseUserTest.js index 2c405c34d..f32c0cb5d 100644 --- a/integration/test/ParseUserTest.js +++ b/integration/test/ParseUserTest.js @@ -521,26 +521,24 @@ describe('Parse User', () => { }); }); - it('can count users', done => { + it('can count users', async () => { const james = new Parse.User(); james.set('username', 'james'); james.set('password', 'mypass'); - james - .signUp() - .then(() => { - const kevin = new Parse.User(); - kevin.set('username', 'kevin'); - kevin.set('password', 'mypass'); - return kevin.signUp(); - }) - .then(() => { - const query = new Parse.Query(Parse.User); - return query.count(); - }) - .then(c => { - assert.equal(c, 2); - done(); - }); + const acl = new Parse.ACL(); + acl.setPublicReadAccess(true); + james.setACL(acl); + await james.signUp(); + const kevin = new Parse.User(); + kevin.set('username', 'kevin'); + kevin.set('password', 'mypass'); + kevin.setACL(acl); + await kevin.signUp(); + + const query = new Parse.Query(Parse.User); + const c = await query.count(); + + assert.equal(c, 2); }); it('can sign up user with container class', done => { diff --git a/integration/test/helper.js b/integration/test/helper.js index 32292d8d9..f2af3020d 100644 --- a/integration/test/helper.js +++ b/integration/test/helper.js @@ -97,38 +97,26 @@ const destroyAliveConnections = function () { let parseServer; let server; -const reconfigureServer = (changedConfiguration = {}) => { - return new Promise((resolve, reject) => { - if (server) { - return parseServer.handleShutdown().then(() => { - server.close(() => { - parseServer = undefined; - server = undefined; - reconfigureServer(changedConfiguration).then(resolve, reject); - }); - }); - } - try { - didChangeConfiguration = Object.keys(changedConfiguration).length !== 0; - const newConfiguration = Object.assign({}, defaultConfiguration, changedConfiguration || {}, { - serverStartComplete: error => { - if (error) { - reject(error); - } else { - resolve(parseServer); - } - }, - mountPath, - port, - }); - parseServer = ParseServer.start(newConfiguration); - const app = parseServer.expressApp; - for (const fileName of ['parse.js', 'parse.min.js']) { - const file = fs - .readFileSync(path.resolve(__dirname, `./../../dist/${fileName}`)) - .toString(); - app.get(`/${fileName}`, (req, res) => { - res.send(` +const reconfigureServer = async (changedConfiguration = {}) => { + if (server) { + await parseServer.handleShutdown(); + await new Promise(resolve => server.close(resolve)); + parseServer = undefined; + server = undefined; + return reconfigureServer(changedConfiguration); + } + + didChangeConfiguration = Object.keys(changedConfiguration).length !== 0; + const newConfiguration = Object.assign({}, defaultConfiguration, changedConfiguration || {}, { + mountPath, + port, + }); + parseServer = await ParseServer.startApp(newConfiguration); + const app = parseServer.expressApp; + for (const fileName of ['parse.js', 'parse.min.js']) { + const file = fs.readFileSync(path.resolve(__dirname, `./../../dist/${fileName}`)).toString(); + app.get(`/${fileName}`, (req, res) => { + res.send(` Parse Functionality Test @@ -142,26 +130,23 @@ const reconfigureServer = (changedConfiguration = {}) => { `); - }); - } - app.get('/clear/:fast', (req, res) => { - const { fast } = req.params; - TestUtils.destroyAllDataPermanently(fast).then(() => { - res.send('{}'); - }); - }); - server = parseServer.server; - server.on('connection', connection => { - const key = `${connection.remoteAddress}:${connection.remotePort}`; - openConnections[key] = connection; - connection.on('close', () => { - delete openConnections[key]; - }); - }); - } catch (error) { - reject(error); - } + }); + } + app.get('/clear/:fast', (req, res) => { + const { fast } = req.params; + TestUtils.destroyAllDataPermanently(fast).then(() => { + res.send('{}'); + }); + }); + server = parseServer.server; + server.on('connection', connection => { + const key = `${connection.remoteAddress}:${connection.remotePort}`; + openConnections[key] = connection; + connection.on('close', () => { + delete openConnections[key]; + }); }); + return parseServer; }; global.DiffObject = Parse.Object.extend('DiffObject'); global.Item = Parse.Object.extend('Item'); diff --git a/package-lock.json b/package-lock.json index af4d92e9b..49850e485 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,31 @@ "source-map": "^0.5.0" } }, + "@babel/eslint-parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", + "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "dev": true, + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "@babel/generator": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", @@ -1949,6 +1974,57 @@ "dev": true, "optional": true }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "requires": { + "eslint-scope": "5.1.1" + } + }, + "@node-redis/bloom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@node-redis/bloom/-/bloom-1.0.1.tgz", + "integrity": "sha512-mXEBvEIgF4tUzdIN89LiYsbi6//EdpFA7L8M+DHCvePXg+bfHWi+ct5VI6nHUFQE5+ohm/9wmgihCH3HSkeKsw==", + "dev": true + }, + "@node-redis/client": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@node-redis/client/-/client-1.0.5.tgz", + "integrity": "sha512-ESZ3bd1f+od62h4MaBLKum+klVJfA4wAeLHcVQBkoXa1l0viFesOWnakLQqKg+UyrlJhZmXJWtu0Y9v7iTMrig==", + "dev": true, + "requires": { + "cluster-key-slot": "1.1.0", + "generic-pool": "3.8.2", + "redis-parser": "3.0.0", + "yallist": "4.0.0" + } + }, + "@node-redis/graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@node-redis/graph/-/graph-1.0.0.tgz", + "integrity": "sha512-mRSo8jEGC0cf+Rm7q8mWMKKKqkn6EAnA9IA2S3JvUv/gaWW/73vil7GLNwion2ihTptAm05I9LkepzfIXUKX5g==", + "dev": true + }, + "@node-redis/json": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-redis/json/-/json-1.0.2.tgz", + "integrity": "sha512-qVRgn8WfG46QQ08CghSbY4VhHFgaTY71WjpwRBGEuqGPfWwfRcIf3OqSpR7Q/45X+v3xd8mvYjywqh0wqJ8T+g==", + "dev": true + }, + "@node-redis/search": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@node-redis/search/-/search-1.0.5.tgz", + "integrity": "sha512-MCOL8iCKq4v+3HgEQv8zGlSkZyXSXtERgrAJ4TSryIG/eLFy84b57KmNNa/V7M1Q2Wd2hgn2nPCGNcQtk1R1OQ==", + "dev": true + }, + "@node-redis/time-series": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-redis/time-series/-/time-series-1.0.2.tgz", + "integrity": "sha512-HGQ8YooJ8Mx7l28tD7XjtB3ImLEjlUxG1wC1PAjxu6hPJqjPshUZxAICzDqDjtIbhDTf48WXXUcx8TQJB1XTKA==", + "dev": true + }, "@node-rs/bcrypt": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.1.0.tgz", @@ -5190,13 +5266,13 @@ } }, "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.31", "@types/qs": "*", "@types/serve-static": "*" } @@ -7226,6 +7302,12 @@ } } }, + "cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", + "dev": true + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -10153,6 +10235,12 @@ } } }, + "generic-pool": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", + "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11886,6 +11974,15 @@ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, + "ip-range-check": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ip-range-check/-/ip-range-check-0.2.0.tgz", + "integrity": "sha512-oaM3l/3gHbLlt/tCWLvt0mj1qUaI+STuRFnUvARGCujK9vvU61+2JsDpmkMzR4VsJhuFXWWgeKKVnwwoFfzCqw==", + "dev": true, + "requires": { + "ipaddr.js": "^1.0.1" + } + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -15245,9 +15342,9 @@ } }, "mongodb-connection-string-url": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", - "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", "dev": true, "requires": { "@types/whatwg-url": "^8.2.1", @@ -18000,10 +18097,11 @@ "dev": true }, "parse-server": { - "version": "git+https://github.com/parse-community/parse-server.git#7cb266b207f2619d466922c6c227cfd2f430a8cc", - "from": "git+https://github.com/parse-community/parse-server.git#7cb266b207f2619d466922c6c227cfd2f430a8cc", + "version": "git+https://github.com/parse-community/parse-server.git#d19acf1c1a594566409c152f513d670167aabdc8", + "from": "git+https://github.com/parse-community/parse-server.git#d19acf1c1a594566409c152f513d670167aabdc8", "dev": true, "requires": { + "@babel/eslint-parser": "7.19.1", "@graphql-tools/merge": "8.3.6", "@graphql-tools/schema": "9.0.4", "@graphql-tools/utils": "8.12.0", @@ -18023,6 +18121,7 @@ "graphql-relay": "0.10.0", "graphql-tag": "2.12.6", "intersect": "1.0.1", + "ip-range-check": "0.2.0", "jsonwebtoken": "8.5.1", "jwks-rsa": "2.1.5", "ldapjs": "2.3.3", @@ -18035,7 +18134,7 @@ "pg-monitor": "1.5.0", "pg-promise": "10.12.1", "pluralize": "8.0.0", - "redis": "3.1.2", + "redis": "4.0.6", "semver": "7.3.8", "subscriptions-transport-ws": "0.11.0", "tv4": "1.3.0", @@ -19358,31 +19457,19 @@ } }, "redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.0.6.tgz", + "integrity": "sha512-IaPAxgF5dV0jx+A9l6yd6R9/PAChZIoAskDVRzUODeLDNhsMlq7OLLTmu0AwAr0xjrJ1bibW5xdpRwqIQ8Q0Xg==", "dev": true, "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - }, - "dependencies": { - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "dev": true - } + "@node-redis/bloom": "1.0.1", + "@node-redis/client": "1.0.5", + "@node-redis/graph": "1.0.0", + "@node-redis/json": "1.0.2", + "@node-redis/search": "1.0.5", + "@node-redis/time-series": "1.0.2" } }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==", - "dev": true - }, "redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", diff --git a/src/StorageController.react-native.js b/src/StorageController.react-native.js index d3a99b85b..2c5ecd1fc 100644 --- a/src/StorageController.react-native.js +++ b/src/StorageController.react-native.js @@ -40,7 +40,7 @@ const StorageController = { removeItemAsync(path: string): Promise { return new Promise((resolve, reject) => { - CoreManager.getAsyncStorage().removeItem(path, (err) => { + CoreManager.getAsyncStorage().removeItem(path, err => { if (err) { reject(err); } else { @@ -76,7 +76,7 @@ const StorageController = { multiRemove(keys: Array): Promise { return new Promise((resolve, reject) => { - CoreManager.getAsyncStorage().multiRemove(keys, (err) => { + CoreManager.getAsyncStorage().multiRemove(keys, err => { if (err) { reject(err); } else { diff --git a/src/__tests__/LiveQueryClient-test.js b/src/__tests__/LiveQueryClient-test.js index 735659722..c838952c6 100644 --- a/src/__tests__/LiveQueryClient-test.js +++ b/src/__tests__/LiveQueryClient-test.js @@ -369,7 +369,12 @@ describe('LiveQueryClient', () => { try { liveQueryClient._handleWebSocketMessage(event); - await Promise.all([subscription.connectPromise, subscription.subscribePromise, liveQueryClient.connectPromise, liveQueryClient.subscribePromise]); + await Promise.all([ + subscription.connectPromise, + subscription.subscribePromise, + liveQueryClient.connectPromise, + liveQueryClient.subscribePromise, + ]); } catch (e) { expect(e.message).toEqual('error thrown'); } diff --git a/src/__tests__/ParseQuery-test.js b/src/__tests__/ParseQuery-test.js index c3d9cf031..37b41fcc0 100644 --- a/src/__tests__/ParseQuery-test.js +++ b/src/__tests__/ParseQuery-test.js @@ -1377,12 +1377,15 @@ describe('ParseQuery', () => { expect(result.name).toEqual('Product 3'); expect(result.className).toEqual('Item'); - await q.each((obj) => { - expect(obj.objectId).toBe('I1'); - expect(obj.size).toBe('small'); - expect(obj.name).toEqual('Product 3'); - expect(obj.className).toEqual('Item'); - }, { json: true }); + await q.each( + obj => { + expect(obj.objectId).toBe('I1'); + expect(obj.size).toBe('small'); + expect(obj.name).toEqual('Product 3'); + expect(obj.className).toEqual('Item'); + }, + { json: true } + ); }); it('will error when getting a nonexistent object', done => {