From 24e9bdc639015dfe3e8f729dd1768e5db768ef2c Mon Sep 17 00:00:00 2001
From: Corey
Date: Tue, 7 Sep 2021 08:35:03 -0400
Subject: [PATCH 01/96] ci: Fix docker image pushing to Docker Hub (#7548)
* add actions file
* nit
* add multi-platform
* add buildx
* reduce platforms
* remove arm7
* add back arm7
* add missing archs
* remove failing image
* add back in linux/s390x
* switch image name to parse-server
* remove failing images
* nit spelling
* Nit
* add comment about nightly builds
---
.github/workflows/docker-publish.yml | 57 +++++++++++++++++++++++++++
CHANGELOG.md | 1 +
src/LiveQuery/ParseWebSocketServer.js | 2 +-
3 files changed, 59 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/docker-publish.yml
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
new file mode 100644
index 0000000000..84c641521f
--- /dev/null
+++ b/.github/workflows/docker-publish.yml
@@ -0,0 +1,57 @@
+name: docker
+
+on:
+ schedule:
+ - cron: '19 17 * * *' # Nightly builds capture upstream updates to dependency images such as node.
+ push:
+ branches: [ master ]
+ tags: [ '*.*.*' ]
+ pull_request:
+ branches: [ master ]
+
+env:
+ REGISTRY: docker.io
+ IMAGE_NAME: parseplatform/parse-server
+
+jobs:
+ build:
+
+ runs-on: ubuntu-18.04
+ permissions:
+ contents: read
+ packages: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ - name: Set up QEMU
+ id: qemu
+ uses: docker/setup-qemu-action@v1
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Log into Docker Hub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Extract Docker metadata
+ id: meta
+ uses: docker/metadata-action@v3
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+ flavor: |
+ latest=true
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ platforms: linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64/v8
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a2f85589f3..8e6723c7aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -150,6 +150,7 @@ ___
- Add CI check to add changelog entry (Manuel Trezza) [#7512](https://github.com/parse-community/parse-server/pull/7512)
- Refactor: uniform issue templates across repos (Manuel Trezza) [#7528](https://github.com/parse-community/parse-server/pull/7528)
- ci: bump ci environment (Manuel Trezza) [#7539](https://github.com/parse-community/parse-server/pull/7539)
+- CI now pushes docker images to Docker Hub (Corey Baker) [#7548](https://github.com/parse-community/parse-server/pull/7548)
## 4.10.3
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.2...4.10.3)
diff --git a/src/LiveQuery/ParseWebSocketServer.js b/src/LiveQuery/ParseWebSocketServer.js
index fa521080ed..a0d1e9891f 100644
--- a/src/LiveQuery/ParseWebSocketServer.js
+++ b/src/LiveQuery/ParseWebSocketServer.js
@@ -11,7 +11,7 @@ export class ParseWebSocketServer {
config.server = server;
const wss = loadAdapter(config.wssAdapter, WSAdapter, config);
wss.onListen = () => {
- logger.info('Parse LiveQuery Server starts running');
+ logger.info('Parse LiveQuery Server started running');
};
wss.onConnection = ws => {
ws.on('error', error => {
From 41f0a1de43de046bb013eeaf93c8f6bebd049d1c Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Tue, 7 Sep 2021 16:42:28 +0200
Subject: [PATCH 02/96] ci: update docker image building (#7555)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* Update docker-publish.yml
---
.github/workflows/docker-publish.yml | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index 84c641521f..05c7c416df 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -4,10 +4,8 @@ on:
schedule:
- cron: '19 17 * * *' # Nightly builds capture upstream updates to dependency images such as node.
push:
- branches: [ master ]
+ branches: [ master, 'release-*.*.*' ]
tags: [ '*.*.*' ]
- pull_request:
- branches: [ master ]
env:
REGISTRY: docker.io
@@ -22,6 +20,10 @@ jobs:
packages: write
steps:
+ - name: Determine branch name
+ id: branch
+ run: echo ::set-output name=branch_name::${GITHUB_REF#refs/*/}
+
- name: Checkout repository
uses: actions/checkout@v2
@@ -45,7 +47,7 @@ jobs:
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: |
- latest=true
+ latest=${{ steps.branch.branch_name == 'master' }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
From 7807d6343d822d595ed99956bfc6510d8cc5496f Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Tue, 7 Sep 2021 18:02:40 +0200
Subject: [PATCH 03/96] ci: Fix docker hub push (#7556)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* fix docker run
---
.github/workflows/docker-publish.yml | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index 05c7c416df..f62d542340 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -2,9 +2,10 @@ name: docker
on:
schedule:
- - cron: '19 17 * * *' # Nightly builds capture upstream updates to dependency images such as node.
+ # Nightly builds capture upstream updates to dependency images such as node.
+ - cron: '19 17 * * *'
push:
- branches: [ master, 'release-*.*.*' ]
+ branches: [ master ]
tags: [ '*.*.*' ]
env:
@@ -22,7 +23,7 @@ jobs:
steps:
- name: Determine branch name
id: branch
- run: echo ::set-output name=branch_name::${GITHUB_REF#refs/*/}
+ run: echo "::set-output name=branch_name::${GITHUB_REF#refs/*/}"
- name: Checkout repository
uses: actions/checkout@v2
@@ -47,7 +48,7 @@ jobs:
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: |
- latest=${{ steps.branch.branch_name == 'master' }}
+ latest=${{ steps.branch.outputs.branch_name == 'master' }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
From 429b959964c8e8415320575e26d668043d25cd83 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 9 Sep 2021 13:09:17 +0200
Subject: [PATCH 04/96] docs: Introduce deprecation ID for reference in
comments and online search (#7562)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* Update DEPRECATIONS.md
* Update CHANGELOG.md
---
CHANGELOG.md | 1 +
DEPRECATIONS.md | 8 ++++----
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8e6723c7aa..b329847255 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -151,6 +151,7 @@ ___
- Refactor: uniform issue templates across repos (Manuel Trezza) [#7528](https://github.com/parse-community/parse-server/pull/7528)
- ci: bump ci environment (Manuel Trezza) [#7539](https://github.com/parse-community/parse-server/pull/7539)
- CI now pushes docker images to Docker Hub (Corey Baker) [#7548](https://github.com/parse-community/parse-server/pull/7548)
+- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
## 4.10.3
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.2...4.10.3)
diff --git a/DEPRECATIONS.md b/DEPRECATIONS.md
index cf220a0054..87a4e3b927 100644
--- a/DEPRECATIONS.md
+++ b/DEPRECATIONS.md
@@ -2,10 +2,10 @@
The following is a list of deprecations, according to the [Deprecation Policy](https://github.com/parse-community/parse-server/blob/master/CONTRIBUTING.md#deprecation-policy). After a feature becomes deprecated, and giving developers time to adapt to the change, the deprecated feature will eventually be removed, leading to a breaking change. Developer feedback during the deprecation period may postpone or even revoke the introduction of the breaking change.
-| Change | Issue | Deprecation [ℹ️][i_deprecation] | Planned Removal [ℹ️][i_removal] | Status [ℹ️][i_status] | Notes |
-|-------------------------------------------------|----------------------------------------------------------------------|---------------------------------|---------------------------------|-----------------------|-------|
-| Native MongoDB syntax in aggregation pipeline | [#7338](https://github.com/parse-community/parse-server/issues/7338) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
-| Config option `directAccess` defaults to `true` | [#6636](https://github.com/parse-community/parse-server/pull/6636) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
+| ID | Change | Issue | Deprecation [ℹ️][i_deprecation] | Planned Removal [ℹ️][i_removal] | Status [ℹ️][i_status] | Notes |
+|--------|-------------------------------------------------|----------------------------------------------------------------------|---------------------------------|---------------------------------|-----------------------|-------|
+| DEPPS1 | Native MongoDB syntax in aggregation pipeline | [#7338](https://github.com/parse-community/parse-server/issues/7338) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
+| DEPPS2 | Config option `directAccess` defaults to `true` | [#6636](https://github.com/parse-community/parse-server/pull/6636) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
[i_deprecation]: ## "The version and date of the deprecation."
[i_removal]: ## "The version and date of the planned removal."
From b185fad6957de32893ae1402f4fae982415537cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Smilek?=
<41491201+lsmilek1@users.noreply.github.com>
Date: Fri, 10 Sep 2021 15:49:20 +0200
Subject: [PATCH 05/96] Additional explication for `expireInactiveSessions` in
ParseServerOptions (#7552)
* Update docs.js
Additional explication for `expireInactiveSessions`
* Update index.js
Additional explication for `expireInactiveSessions`
* Update docs.js
correcting spelling error
* Update index.js
correcting spelling error
* Update Definitions.js
Co-authored-by: Manuel <5673677+mtrezza@users.noreply.github.com>
---
src/Options/Definitions.js | 3 ++-
src/Options/docs.js | 2 +-
src/Options/index.js | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/Options/Definitions.js b/src/Options/Definitions.js
index 65799f8191..53067a4399 100644
--- a/src/Options/Definitions.js
+++ b/src/Options/Definitions.js
@@ -156,7 +156,8 @@ module.exports.ParseServerOptions = {
},
expireInactiveSessions: {
env: 'PARSE_SERVER_EXPIRE_INACTIVE_SESSIONS',
- help: 'Sets wether we should expire the inactive sessions, defaults to true',
+ help:
+ 'Sets whether we should expire the inactive sessions, defaults to true. If false, all new sessions are created with no expiration date.',
action: parsers.booleanParser,
default: true,
},
diff --git a/src/Options/docs.js b/src/Options/docs.js
index 30b3aba1a0..c3dc43afc4 100644
--- a/src/Options/docs.js
+++ b/src/Options/docs.js
@@ -28,7 +28,7 @@
* @property {Boolean} enableAnonymousUsers Enable (or disable) anonymous users, defaults to true
* @property {Boolean} enableExpressErrorHandler Enables the default express error handler for all errors
* @property {String} encryptionKey Key for encrypting your files
- * @property {Boolean} expireInactiveSessions Sets wether we should expire the inactive sessions, defaults to true
+ * @property {Boolean} expireInactiveSessions Sets whether we should expire the inactive sessions, defaults to true. If false, all new sessions are created with no expiration date.
* @property {String} fileKey Key for your files
* @property {Adapter} filesAdapter Adapter module for the files sub-system
* @property {FileUploadOptions} fileUpload Options for file uploads
diff --git a/src/Options/index.js b/src/Options/index.js
index 5f3d9afa47..552eb2e782 100644
--- a/src/Options/index.js
+++ b/src/Options/index.js
@@ -170,7 +170,7 @@ export interface ParseServerOptions {
sessionLength: ?number;
/* Max value for limit option on queries, defaults to unlimited */
maxLimit: ?number;
- /* Sets wether we should expire the inactive sessions, defaults to true
+ /* Sets whether we should expire the inactive sessions, defaults to true. If false, all new sessions are created with no expiration date.
:DEFAULT: true */
expireInactiveSessions: ?boolean;
/* When a user changes their password, either through the reset password email or while logged in, all sessions are revoked if this is true. Set to false if you don't want to revoke sessions.
From 1c626d50b5f2a2b128c22fd1f1e51da560ec7ec4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 10 Sep 2021 17:08:34 +0200
Subject: [PATCH 06/96] chore(deps): bump axios from 0.21.1 to 0.21.4 (#7566)
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4)
---
updated-dependencies:
- dependency-name: axios
dependency-type: indirect
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 53e4a6a35d..c87569b4d4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2882,11 +2882,11 @@
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
},
"axios": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
- "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"requires": {
- "follow-redirects": "^1.10.0"
+ "follow-redirects": "^1.14.0"
}
},
"babel-eslint": {
From 16e9a6f2012dfb65d2ad0f20294acdf9f092ddc4 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 10 Sep 2021 23:55:50 +0200
Subject: [PATCH 07/96] docs: add angular commit (#7567)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* Update CONTRIBUTING.md
---
CONTRIBUTING.md | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8bd0d11881..b1cb3b6d58 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -19,6 +19,8 @@
- [Wording Guideline](#wording-guideline)
- [Parse Error](#parse-error)
- [Parse Server Configuration](#parse-server-configuration)
+- [Commit Message](#commit-message)
+ - [Breaking Change](#breaking-change)
- [Code of Conduct](#code-of-conduct)
## Contributing
@@ -288,6 +290,47 @@ Introducing new [Parse Server configuration][config] parameters requires the fol
5. Add test cases to ensure the correct parameter value validation. Parse Server throws an error at launch if an invalid value is set for any configuration parameter.
6. Execute `npm run docs` to generate the documentation in the `/out` directory. Take a look at the documentation whether the description and formatting of the newly introduced parameters is satisfactory.
+## Commit Message
+
+For release automation, the title of pull requests needs to be written in a defined syntax. We loosely follow the [Conventional Commits](https://www.conventionalcommits.org) specification, which defines this syntax:
+
+```
+:
+```
+
+The _type_ is the category of change that is made, possible types are:
+- `feat` - add a new feature
+- `fix` - fix a bug
+- `refactor` - refactor code without impact on features or performance
+- `docs` - add or edit code comments, documentation, GitHub pages
+- `style` - edit code style
+- `build` - retry failing build and anything build process related
+- `perf` - performance optimization
+- `ci` - continuous integration
+- `test` - tests
+
+The _summary_ is a short change description in present tense, not capitalized, without period at the end.
+
+For example:
+
+```
+feat: add handle to door for easy opening
+```
+
+Currently, we are not making use of the commit _scope_, which would be written as `(): `, that attributes a change to a specific part of the product.
+
+### Breaking Change
+
+If a pull request contains a braking change, the text of the pull request must contain the word `BREAKING CHANGE` capitalized as the _last, most bottom_ part of the text. It must be followed by an empty line, then a short description of the character of the breaking change, and ideally how the developer should address it.
+
+For example:
+
+```
+BREAKING CHANGE
+
+The door handle has be pulled up to open the door, not down. Adjust your habits accordingly by walking on your hands.
+```
+
## Code of Conduct
This project adheres to the [Contributor Covenant Code of Conduct](https://github.com/parse-community/parse-server/blob/master/CODE_OF_CONDUCT.md). By participating, you are expected to honor this code.
From fdb7dfba9f3dff719ee8ba89897af614580a5f84 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Mon, 13 Sep 2021 11:55:26 +0200
Subject: [PATCH 08/96] docs: update commit message (#7570)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* Update CONTRIBUTING.md
---
CONTRIBUTING.md | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b1cb3b6d58..207560b544 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -309,7 +309,11 @@ The _type_ is the category of change that is made, possible types are:
- `ci` - continuous integration
- `test` - tests
-The _summary_ is a short change description in present tense, not capitalized, without period at the end.
+The _summary_ is a short change description in present tense, not capitalized, without period at the end. This summary will also be used as the changelog entry.
+- It must be short and self-explanatory for a reader who does not see the details of the full pull request description
+- It must not contain abbreviations, e.g. instead of `LQ` write `LiveQuery`
+- It must use the correct product and feature names as referenced in the documentation, e.g. instead of `Cloud Validator` use `Cloud Function validation`
+- In case of a breaking change, the summary must not contain duplicate information that is also in the [BREAKING CHANGE](#breaking-change) chapter of the pull request description. It must not contain a note that it is a breaking change, as this will be automatically flagged as such if the pull request description contains the BREAKING CHANGE chapter.
For example:
@@ -321,11 +325,15 @@ Currently, we are not making use of the commit _scope_, which would be written a
### Breaking Change
-If a pull request contains a braking change, the text of the pull request must contain the word `BREAKING CHANGE` capitalized as the _last, most bottom_ part of the text. It must be followed by an empty line, then a short description of the character of the breaking change, and ideally how the developer should address it.
+If a pull request contains a braking change, the description of the pull request must contain a special chapter at the bottom.
+
+The chapter consists of the phrase `BREAKING CHANGE`, capitalized, in a single line without any formatting. It must be followed by an empty line, then a short description of the breaking change, and ideally how the developer should address it. This chapter should contain more details focusing on the "breaking” aspect of the change, as it is intended to assist the developer in adapting their deployment. However, keep it concise, as it will also become part of the changelog entry.
For example:
```
+Detailed pull request description...
+
BREAKING CHANGE
The door handle has be pulled up to open the door, not down. Adjust your habits accordingly by walking on your hands.
From 0225340ccbba2781e49689640ded606a8379dd45 Mon Sep 17 00:00:00 2001
From: dblythy
Date: Tue, 14 Sep 2021 22:10:37 +1000
Subject: [PATCH 09/96] refactor: allow ES import for cloud string if package
type is module (#7560)
* allow module import for Parse Cloud
* Update .babelrc
* catch esm error
* Update ParseServer.js
* add tests
* Update CHANGELOG.md
* Update CloudCode.spec.js
Co-authored-by: Manuel <5673677+mtrezza@users.noreply.github.com>
---
.babelrc | 3 ++-
CHANGELOG.md | 9 +++++----
spec/CloudCode.spec.js | 8 ++++++++
spec/cloud/cloudCodeModuleFile.js | 3 +++
src/ParseServer.js | 6 +++++-
5 files changed, 23 insertions(+), 6 deletions(-)
create mode 100644 spec/cloud/cloudCodeModuleFile.js
diff --git a/.babelrc b/.babelrc
index 9151969bde..a199154b82 100644
--- a/.babelrc
+++ b/.babelrc
@@ -7,7 +7,8 @@
["@babel/preset-env", {
"targets": {
"node": "12"
- }
+ },
+ "exclude": ["proposal-dynamic-import"]
}]
],
"sourceMaps": "inline"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b329847255..70ff5620f9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -151,6 +151,7 @@ ___
- Refactor: uniform issue templates across repos (Manuel Trezza) [#7528](https://github.com/parse-community/parse-server/pull/7528)
- ci: bump ci environment (Manuel Trezza) [#7539](https://github.com/parse-community/parse-server/pull/7539)
- CI now pushes docker images to Docker Hub (Corey Baker) [#7548](https://github.com/parse-community/parse-server/pull/7548)
+- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
## 4.10.3
@@ -178,15 +179,15 @@ ___
*Versions >4.5.2 and <4.10.0 are skipped.*
-> ⚠️ A security incident caused a number of incorrect version tags to be pushed to the Parse Server repository. These version tags linked to a personal fork of a contributor who had write access to the repository. The code to which these tags linked has not been reviewed or approved by Parse Platform. Even though no releases were published with these incorrect versions, it was possible to define a Parse Server dependency that pointed to these version tags, for example if you defined this dependency:
+> ⚠️ A security incident caused a number of incorrect version tags to be pushed to the Parse Server repository. These version tags linked to a personal fork of a contributor who had write access to the repository. The code to which these tags linked has not been reviewed or approved by Parse Platform. Even though no releases were published with these incorrect versions, it was possible to define a Parse Server dependency that pointed to these version tags, for example if you defined this dependency:
> ```js
> "parse-server": "git@github.com:parse-community/parse-server.git#4.9.3"
> ```
->
+>
> We have since deleted the incorrect version tags, but they may still show up if your personal fork on GitHub or locally. We do not know when these tags have been pushed to the Parse Server repository, but we first became aware of this issue on July 21, 2021. We are not aware of any malicious code or concerns related to privacy, security or legality (e.g. proprietary code). However, it has been reported that some functionality does not work as expected and the introduction of security vulnerabilities cannot be ruled out.
>
-> You may be also affected if you used the Bitnami image for Parse Server. Bitnami picked up the incorrect version tag `4.9.3` and published a new Bitnami image for Parse Server.
->
+> You may be also affected if you used the Bitnami image for Parse Server. Bitnami picked up the incorrect version tag `4.9.3` and published a new Bitnami image for Parse Server.
+>
>**If you are using any of the affected versions, we urgently recommend to upgrade to version `4.10.0`.**
## 4.5.2
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index 86a7627427..07d94a366f 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -39,6 +39,14 @@ describe('Cloud Code', () => {
});
});
+ it('can load cloud code as a module', async () => {
+ process.env.npm_package_type = 'module';
+ await reconfigureServer({ cloud: './spec/cloud/cloudCodeModuleFile.js' });
+ const result = await Parse.Cloud.run('cloudCodeInFile');
+ expect(result).toEqual('It is possible to define cloud code in a file.');
+ delete process.env.npm_package_type;
+ });
+
it('can create functions', done => {
Parse.Cloud.define('hello', () => {
return 'Hello world!';
diff --git a/spec/cloud/cloudCodeModuleFile.js b/spec/cloud/cloudCodeModuleFile.js
new file mode 100644
index 0000000000..a62b4fcc24
--- /dev/null
+++ b/spec/cloud/cloudCodeModuleFile.js
@@ -0,0 +1,3 @@
+Parse.Cloud.define('cloudCodeInFile', () => {
+ return 'It is possible to define cloud code in a file.';
+});
diff --git a/src/ParseServer.js b/src/ParseServer.js
index 43996ac751..a8b0ad38cf 100644
--- a/src/ParseServer.js
+++ b/src/ParseServer.js
@@ -103,7 +103,11 @@ class ParseServer {
if (typeof cloud === 'function') {
cloud(Parse);
} else if (typeof cloud === 'string') {
- require(path.resolve(process.cwd(), cloud));
+ if (process.env.npm_package_type === 'module') {
+ import(path.resolve(process.cwd(), cloud));
+ } else {
+ require(path.resolve(process.cwd(), cloud));
+ }
} else {
throw "argument 'cloud' must either be a string or a function";
}
From 3e4d1ecbf3e8f6c1a7fe3af395482bfd37672567 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Tue, 14 Sep 2021 15:48:37 +0200
Subject: [PATCH 10/96] ci: bump mongodb (#7568)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* bump ci
---
.github/workflows/ci.yml | 6 +++---
README.md | 4 ++--
package.json | 4 ++--
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index fc23585d79..050739c404 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -111,17 +111,17 @@ jobs:
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 14.17.6
- name: MongoDB 4.2, ReplicaSet, WiredTiger
- MONGODB_VERSION: 4.2.15
+ MONGODB_VERSION: 4.2.16
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 14.17.6
- name: MongoDB 4.0, ReplicaSet, WiredTiger
- MONGODB_VERSION: 4.0.25
+ MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 14.17.6
- name: MongoDB 4.0, Standalone, MMAPv1
- MONGODB_VERSION: 4.0.25
+ MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: mmapv1
NODE_VERSION: 14.17.6
diff --git a/README.md b/README.md
index 7137ec153c..6e5ffaeda6 100644
--- a/README.md
+++ b/README.md
@@ -123,8 +123,8 @@ Parse Server is continuously tested with the most recent releases of MongoDB to
| Version | Latest Version | End-of-Life Date | Compatibility |
|-------------|----------------|------------------|--------------------|
-| MongoDB 4.0 | 4.0.25 | April 2022 | ✅ Fully compatible |
-| MongoDB 4.2 | 4.2.15 | TBD | ✅ Fully compatible |
+| MongoDB 4.0 | 4.0.27 | April 2022 | ✅ Fully compatible |
+| MongoDB 4.2 | 4.2.16 | TBD | ✅ Fully compatible |
| MongoDB 4.4 | 4.4.8 | TBD | ✅ Fully compatible |
| MongoDB 5.0 | 5.0.2 | January 2024 | ✅ Fully compatible |
diff --git a/package.json b/package.json
index d1c620e45d..38635d0bac 100644
--- a/package.json
+++ b/package.json
@@ -111,8 +111,8 @@
"test:mongodb:runnerstart": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=$npm_config_dbversion} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
"test:mongodb:testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=$npm_config_dbversion} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
"test:mongodb": "npm run test:mongodb:runnerstart --dbversion=$npm_config_dbversion && npm run test:mongodb:testonly --dbversion=$npm_config_dbversion",
- "test:mongodb:4.0.25": "npm run test:mongodb --dbversion=4.0.25",
- "test:mongodb:4.2.15": "npm run test:mongodb --dbversion=4.2.15",
+ "test:mongodb:4.0.27": "npm run test:mongodb --dbversion=4.0.27",
+ "test:mongodb:4.2.16": "npm run test:mongodb --dbversion=4.2.16",
"test:mongodb:4.4.8": "npm run test:mongodb --dbversion=4.4.8",
"posttest:mongodb": "mongodb-runner stop",
"pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.8} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
From e9e3be1df8f9c39c79289507049e9b5468fd9cac Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Tue, 14 Sep 2021 16:29:56 +0200
Subject: [PATCH 11/96] ci: add node engine check (#7574)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* replace node 15 with node 16
* Update CHANGELOG.md
* use node 16 as default node version
* ignore node 15 in ci self-check
* bumped madge for node deprecation DEP0148
* ci: add node engine check
* lint
* bump node engine
* Update ci.yml
* revert unnecessary changes
* Update CHANGELOG.md
* Update ci.yml
---
.github/workflows/ci.yml | 14 +-
CHANGELOG.md | 1 +
{resources/ci => ci}/CiVersionCheck.js | 0
{resources/ci => ci}/ciCheck.js | 0
ci/nodeEngineCheck.js | 190 +++++++++++++++++++++++++
package-lock.json | 148 ++++++++++---------
package.json | 7 +-
7 files changed, 281 insertions(+), 79 deletions(-)
rename {resources/ci => ci}/CiVersionCheck.js (100%)
rename {resources/ci => ci}/ciCheck.js (100%)
create mode 100644 ci/nodeEngineCheck.js
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 050739c404..f8e93f6475 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,7 +17,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.NODE_VERSION }}
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Cache Node.js modules
@@ -29,8 +29,10 @@ jobs:
${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-
- name: Install dependencies
run: npm ci
- - name: CI Self-Check
+ - name: CI Environments Check
run: npm run ci:check
+ - name: CI Node Engine Check
+ run: npm run ci:checkNodeEngine
check-changelog:
name: Changelog
timeout-minutes: 5
@@ -45,7 +47,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.NODE_VERSION }}
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Cache Node.js modules
@@ -65,7 +67,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.NODE_VERSION }}
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Cache Node.js modules
@@ -159,7 +161,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.NODE_VERSION }}
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
node-version: ${{ matrix.NODE_VERSION }}
- name: Cache Node.js modules
@@ -219,7 +221,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.NODE_VERSION }}
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
node-version: ${{ matrix.NODE_VERSION }}
- name: Cache Node.js modules
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 70ff5620f9..3e1d355b7b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -104,6 +104,7 @@ ___
- Remove support for Node 10 which has reached its End-of-Life date (Manuel Trezza) [#7314](https://github.com/parse-community/parse-server/pull/7314)
- Remove S3 Files Adapter from Parse Server, instead install separately as `@parse/s3-files-adapter` (Manuel Trezza) [#7324](https://github.com/parse-community/parse-server/pull/7324)
- Remove Session field `restricted`; the field was a code artifact from a feature that never existed in Open Source Parse Server; if you have been using this field for custom purposes, consider that for new Parse Server installations the field does not exist anymore in the schema, and for existing installations the field default value `false` will not be set anymore when creating a new session (Manuel Trezza) [#7543](https://github.com/parse-community/parse-server/pull/7543)
+- ci: add node engine version check (Manuel Trezza) [#7574](https://github.com/parse-community/parse-server/pull/7574)
### Notable Changes
- Added Parse Server Security Check to report weak security settings (Manuel Trezza, dblythy) [#7247](https://github.com/parse-community/parse-server/issues/7247)
diff --git a/resources/ci/CiVersionCheck.js b/ci/CiVersionCheck.js
similarity index 100%
rename from resources/ci/CiVersionCheck.js
rename to ci/CiVersionCheck.js
diff --git a/resources/ci/ciCheck.js b/ci/ciCheck.js
similarity index 100%
rename from resources/ci/ciCheck.js
rename to ci/ciCheck.js
diff --git a/ci/nodeEngineCheck.js b/ci/nodeEngineCheck.js
new file mode 100644
index 0000000000..da68f314b1
--- /dev/null
+++ b/ci/nodeEngineCheck.js
@@ -0,0 +1,190 @@
+const core = require('@actions/core');
+const semver = require('semver');
+const fs = require('fs').promises;
+const path = require('path');
+
+/**
+ * This checks whether any package dependency requires a minimum node engine
+ * version higher than the host package.
+ */
+class NodeEngineCheck {
+
+ /**
+ * The constructor.
+ * @param {Object} config The config.
+ * @param {String} config.nodeModulesPath The path to the node_modules directory.
+ * @param {String} config.packageJsonPath The path to the parent package.json file.
+ */
+ constructor(config) {
+ const {
+ nodeModulesPath,
+ packageJsonPath,
+ } = config;
+
+ // Ensure required params are set
+ if ([
+ nodeModulesPath,
+ packageJsonPath,
+ ].includes(undefined)) {
+ throw 'invalid configuration';
+ }
+
+ this.nodeModulesPath = nodeModulesPath;
+ this.packageJsonPath = packageJsonPath;
+ }
+
+ /**
+ * Returns an array of `package.json` files under the given path and subdirectories.
+ * @param {String} [basePath] The base path for recursive directory search.
+ */
+ async getPackageFiles(basePath = this.nodeModulesPath) {
+ try {
+ // Declare file list
+ const files = []
+
+ // Get files
+ const dirents = await fs.readdir(basePath, { withFileTypes: true });
+ const validFiles = dirents.filter(d => d.name.toLowerCase() == 'package.json').map(d => path.join(basePath, d.name));
+ files.push(...validFiles);
+
+ // For each directory entry
+ for (const dirent of dirents) {
+ if (dirent.isDirectory()) {
+ const subFiles = await this.getPackageFiles(path.join(basePath, dirent.name));
+ files.push(...subFiles);
+ }
+ }
+ return files;
+ } catch (e) {
+ throw `Failed to get package.json files in ${this.nodeModulesPath} with error: ${e}`;
+ }
+ }
+
+ /**
+ * Extracts and returns the node engine versions of the given package.json
+ * files.
+ * @param {String[]} files The package.json files.
+ * @param {Boolean} clean Is true if packages with undefined node versions
+ * should be removed from the results.
+ * @returns {Object[]} A list of results.
+ */
+ async getNodeVersion({ files, clean = false }) {
+
+ // Declare response
+ let response = [];
+
+ // For each file
+ for (const file of files) {
+
+ // Get node version
+ const contentString = await fs.readFile(file, 'utf-8');
+ const contentJson = JSON.parse(contentString);
+ const version = ((contentJson || {}).engines || {}).node;
+
+ // Add response
+ response.push({
+ file: file,
+ nodeVersion: version
+ });
+ }
+
+ // If results should be cleaned by removing undefined node versions
+ if (clean) {
+ response = response.filter(r => r.nodeVersion !== undefined);
+ }
+ return response;
+ }
+
+ /**
+ * Returns the highest semver definition that satisfies all versions
+ * in the given list.
+ * @param {String[]} versions The list of semver version ranges.
+ * @param {String} baseVersion The base version of which higher versions should be
+ * determined; as a version (1.2.3), not a range (>=1.2.3).
+ * @returns {String} The highest semver version.
+ */
+ getHigherVersions({ versions, baseVersion }) {
+ // Add min satisfying node versions
+ const minVersions = versions.map(v => {
+ v.nodeMinVersion = semver.minVersion(v.nodeVersion)
+ return v;
+ });
+
+ // Sort by min version
+ const sortedMinVersions = minVersions.sort((v1, v2) => semver.compare(v1.nodeMinVersion, v2.nodeMinVersion));
+
+ // Filter by higher versions
+ const higherVersions = sortedMinVersions.filter(v => semver.gt(v.nodeMinVersion, baseVersion));
+ // console.log(`getHigherVersions: ${JSON.stringify(higherVersions)}`);
+ return higherVersions;
+ }
+
+ /**
+ * Returns the node version of the parent package.
+ * @return {Object} The parent package info.
+ */
+ async getParentVersion() {
+ // Get parent package.json version
+ const version = await this.getNodeVersion({ files: [ this.packageJsonPath ], clean: true });
+ // console.log(`getParentVersion: ${JSON.stringify(version)}`);
+ return version[0];
+ }
+}
+
+async function check() {
+ // Define paths
+ const nodeModulesPath = path.join(__dirname, '../node_modules');
+ const packageJsonPath = path.join(__dirname, '../package.json');
+
+ // Create check
+ const check = new NodeEngineCheck({
+ nodeModulesPath,
+ packageJsonPath,
+ });
+
+ // Get package node version of parent package
+ const parentVersion = await check.getParentVersion();
+
+ // If parent node version could not be determined
+ if (parentVersion === undefined) {
+ core.setFailed(`Failed to determine node engine version of parent package at ${this.packageJsonPath}`);
+ return;
+ }
+
+ // Determine parent min version
+ const parentMinVersion = semver.minVersion(parentVersion.nodeVersion);
+
+ // Get package.json files
+ const files = await check.getPackageFiles();
+ core.info(`Checking the minimum node version requirement of ${files.length} dependencies`);
+
+ // Get node versions
+ const versions = await check.getNodeVersion({ files, clean: true });
+
+ // Get are dependencies that require a higher node version than the parent package
+ const higherVersions = check.getHigherVersions({ versions, baseVersion: parentMinVersion });
+
+ // Get highest version
+ const highestVersion = higherVersions.map(v => v.nodeMinVersion).pop();
+
+ // If there are higher versions
+ if (higherVersions.length > 0) {
+ console.log(`\nThere are ${higherVersions.length} dependencies that require a higher node engine version than the parent package (${parentVersion.nodeVersion}):`);
+
+ // For each dependency
+ for (const higherVersion of higherVersions) {
+
+ // Get package name
+ const _package = higherVersion.file.split('node_modules/').pop().replace('/package.json', '');
+ console.log(`- ${_package} requires at least node ${higherVersion.nodeMinVersion} (${higherVersion.nodeVersion})`);
+ }
+ console.log('');
+ core.setFailed(`❌ Upgrade the node engine version in package.json to at least '${highestVersion}' to satisfy the dependencies.`);
+ console.log('');
+ return;
+ }
+
+ console.log(`✅ All dependencies satisfy the node version requirement of the parent package (${parentVersion.nodeVersion}).`);
+}
+
+check();
diff --git a/package-lock.json b/package-lock.json
index c87569b4d4..d0567d9917 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1991,19 +1991,19 @@
"integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw=="
},
"@typescript-eslint/types": {
- "version": "4.29.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.2.tgz",
- "integrity": "sha512-K6ApnEXId+WTGxqnda8z4LhNMa/pZmbTFkDxEBLQAbhLZL50DjeY0VIDCml/0Y3FlcbqXZrABqrcKxq+n0LwzQ==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.0.tgz",
+ "integrity": "sha512-9XR5q9mk7DCXgXLS7REIVs+BaAswfdHhx91XqlJklmqWpTALGjygWVIb/UnLh4NWhfwhR5wNe1yTyCInxVhLqQ==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "version": "4.29.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.2.tgz",
- "integrity": "sha512-TJ0/hEnYxapYn9SGn3dCnETO0r+MjaxtlWZ2xU+EvytF0g4CqTpZL48SqSNn2hXsPolnewF30pdzR9a5Lj3DNg==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.0.tgz",
+ "integrity": "sha512-QHl2014t3ptg+xpmOSSPn5hm4mY8D4s97ftzyk9BZ8RxYQ3j73XcwuijnJ9cMa6DO4aLXeo8XS3z1omT9LA/Eg==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "4.29.2",
- "@typescript-eslint/visitor-keys": "4.29.2",
+ "@typescript-eslint/types": "4.31.0",
+ "@typescript-eslint/visitor-keys": "4.31.0",
"debug": "^4.3.1",
"globby": "^11.0.3",
"is-glob": "^4.0.1",
@@ -2047,12 +2047,12 @@
}
},
"@typescript-eslint/visitor-keys": {
- "version": "4.29.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.2.tgz",
- "integrity": "sha512-bDgJLQ86oWHJoZ1ai4TZdgXzJxsea3Ee9u9wsTAvjChdj2WLcVsgWYAPeY7RQMn16tKrlQaBnpKv7KBfs4EQag==",
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.0.tgz",
+ "integrity": "sha512-HUcRp2a9I+P21+O21yu3ezv3GEPGjyGiXoEUQwZXjR8UxRApGeLyWH4ZIIUSalE28aG4YsV6GjtaAVB3QKOu0w==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "4.29.2",
+ "@typescript-eslint/types": "4.31.0",
"eslint-visitor-keys": "^2.0.0"
},
"dependencies": {
@@ -4473,27 +4473,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
- },
- "precinct": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.1.0.tgz",
- "integrity": "sha512-oeZBR9IdER42Ef6Rz11z1oOUqicsI5J1Qffj6tYghKLhxN2UnHy7uE1axxNr0VZRevPK2HWkROk36uXrbJwHFA==",
- "dev": true,
- "requires": {
- "commander": "^2.20.3",
- "debug": "^4.3.1",
- "detective-amd": "^3.0.1",
- "detective-cjs": "^3.1.1",
- "detective-es6": "^2.2.0",
- "detective-less": "^1.0.2",
- "detective-postcss": "^4.0.0",
- "detective-sass": "^3.0.1",
- "detective-scss": "^2.0.1",
- "detective-stylus": "^1.0.0",
- "detective-typescript": "^7.0.0",
- "module-definition": "^3.3.1",
- "node-source-walk": "^4.2.0"
- }
}
}
},
@@ -4567,17 +4546,23 @@
}
},
"detective-postcss": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-4.0.0.tgz",
- "integrity": "sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-5.0.0.tgz",
+ "integrity": "sha512-IBmim4GTEmZJDBOAoNFBskzNryTmYpBq+CQGghKnSGkoGWascE8iEo98yA+ZM4N5slwGjCr/NxCm+Kzg+q3tZg==",
"dev": true,
"requires": {
- "debug": "^4.1.1",
+ "debug": "^4.3.1",
"is-url": "^1.2.4",
- "postcss": "^8.1.7",
- "postcss-values-parser": "^2.0.1"
+ "postcss": "^8.2.13",
+ "postcss-values-parser": "^5.0.0"
},
"dependencies": {
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
"debug": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
@@ -4592,6 +4577,17 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
+ },
+ "postcss-values-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-5.0.0.tgz",
+ "integrity": "sha512-2viDDjMMrt21W2izbeiJxl3kFuD/+asgB0CBwPEgSyhCmBnDIa/y+pLaoyX+q3I3DHH0oPPL3cgjVTQvlS1Maw==",
+ "dev": true,
+ "requires": {
+ "color-name": "^1.1.4",
+ "is-url-superb": "^4.0.0",
+ "quote-unquote": "^1.0.0"
+ }
}
}
},
@@ -5769,9 +5765,9 @@
"integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag=="
},
"fastq": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz",
- "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==",
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
+ "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
@@ -7425,6 +7421,12 @@
"integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
"dev": true
},
+ "is-url-superb": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz",
+ "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==",
+ "dev": true
+ },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
@@ -8686,30 +8688,30 @@
"dev": true
},
"madge": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/madge/-/madge-4.0.2.tgz",
- "integrity": "sha512-l5bnA2dvyk0azLKDbOTCI+wDZ6nB007PhvPdmiYlPmqwVi49JPbhQrH/t4u8E6Akp3gwji1GZuA+v/F5q6yoWQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/madge/-/madge-5.0.1.tgz",
+ "integrity": "sha512-krmSWL9Hkgub74bOjnjWRoFPAJvPwSG6Dbta06qhWOq6X/n/FPzO3ESZvbFYVIvG2g4UHXvCJN1b+RZLaSs9nA==",
"dev": true,
"requires": {
- "chalk": "^4.1.0",
- "commander": "^6.2.1",
+ "chalk": "^4.1.1",
+ "commander": "^7.2.0",
"commondir": "^1.0.1",
- "debug": "^4.0.1",
- "dependency-tree": "^8.0.0",
- "detective-amd": "^3.0.1",
+ "debug": "^4.3.1",
+ "dependency-tree": "^8.1.1",
+ "detective-amd": "^3.1.0",
"detective-cjs": "^3.1.1",
- "detective-es6": "^2.1.0",
+ "detective-es6": "^2.2.0",
"detective-less": "^1.0.2",
- "detective-postcss": "^4.0.0",
+ "detective-postcss": "^5.0.0",
"detective-sass": "^3.0.1",
"detective-scss": "^2.0.1",
"detective-stylus": "^1.0.0",
"detective-typescript": "^7.0.0",
"graphviz": "0.0.9",
- "ora": "^5.1.0",
+ "ora": "^5.4.1",
"pluralize": "^8.0.0",
- "precinct": "^7.0.0",
- "pretty-ms": "^7.0.0",
+ "precinct": "^8.1.0",
+ "pretty-ms": "^7.0.1",
"rc": "^1.2.7",
"typescript": "^3.9.5",
"walkdir": "^0.4.1"
@@ -8750,9 +8752,9 @@
"dev": true
},
"commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true
},
"debug": {
@@ -10321,9 +10323,9 @@
}
},
"precinct": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/precinct/-/precinct-7.1.0.tgz",
- "integrity": "sha512-I1RkW5PX51/q6Xl39//D7x9NgaKNGHpR5DCNaoxP/b2+KbzzXDNhauJUMV17KSYkJA41CSpwYUPRtRoNxbshWA==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.1.0.tgz",
+ "integrity": "sha512-oeZBR9IdER42Ef6Rz11z1oOUqicsI5J1Qffj6tYghKLhxN2UnHy7uE1axxNr0VZRevPK2HWkROk36uXrbJwHFA==",
"dev": true,
"requires": {
"commander": "^2.20.3",
@@ -10336,7 +10338,7 @@
"detective-sass": "^3.0.1",
"detective-scss": "^2.0.1",
"detective-stylus": "^1.0.0",
- "detective-typescript": "^6.0.0",
+ "detective-typescript": "^7.0.0",
"module-definition": "^3.3.1",
"node-source-walk": "^4.2.0"
},
@@ -10356,16 +10358,16 @@
"ms": "2.1.2"
}
},
- "detective-typescript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-6.0.0.tgz",
- "integrity": "sha512-vTidcSDK3QostdbrH2Rwf9FhvrgJ4oIaVw5jbolgruTejexk6nNa9DShGpuS8CFVDb1IP86jct5BaZt1wSxpkA==",
+ "detective-postcss": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-4.0.0.tgz",
+ "integrity": "sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==",
"dev": true,
"requires": {
- "@typescript-eslint/typescript-estree": "^4.8.2",
- "ast-module-types": "^2.7.1",
- "node-source-walk": "^4.2.0",
- "typescript": "^3.9.7"
+ "debug": "^4.1.1",
+ "is-url": "^1.2.4",
+ "postcss": "^8.1.7",
+ "postcss-values-parser": "^2.0.1"
}
},
"ms": {
@@ -10547,6 +10549,12 @@
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true
},
+ "quote-unquote": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz",
+ "integrity": "sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs=",
+ "dev": true
+ },
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
diff --git a/package.json b/package.json
index 38635d0bac..6ca0e7fa9e 100644
--- a/package.json
+++ b/package.json
@@ -90,7 +90,7 @@
"jsdoc": "3.6.3",
"jsdoc-babel": "0.5.0",
"lint-staged": "10.2.3",
- "madge": "4.0.2",
+ "madge": "5.0.1",
"mock-files-adapter": "file:spec/dependencies/mock-files-adapter",
"mock-mail-adapter": "file:spec/dependencies/mock-mail-adapter",
"mongodb-runner": "4.8.1",
@@ -101,7 +101,8 @@
"yaml": "1.10.0"
},
"scripts": {
- "ci:check": "node ./resources/ci/ciCheck.js",
+ "ci:check": "node ./ci/ciCheck.js",
+ "ci:checkNodeEngine": "node ./ci/nodeEngineCheck.js",
"definitions": "node ./resources/buildConfigDefinitions.js && prettier --write 'src/Options/*.js'",
"docs": "jsdoc -c ./jsdoc-conf.json",
"lint": "flow && eslint --cache ./",
@@ -127,7 +128,7 @@
"madge:circular": "node_modules/.bin/madge ./src --circular"
},
"engines": {
- "node": ">= 8"
+ "node": ">=12.20.0"
},
"bin": {
"parse-server": "bin/parse-server"
From 8ed94421e69b1d4fde4ec3625a1f4cfbd6d39c2b Mon Sep 17 00:00:00 2001
From: dblythy
Date: Thu, 16 Sep 2021 00:15:08 +1000
Subject: [PATCH 12/96] fix: add support for descending sorting of full text
search (#7496)
---
CHANGELOG.md | 1 +
spec/ParseQuery.FullTextSearch.spec.js | 513 +++++++------------------
src/RestQuery.js | 2 +-
3 files changed, 133 insertions(+), 383 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3e1d355b7b..1920116337 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -152,6 +152,7 @@ ___
- Refactor: uniform issue templates across repos (Manuel Trezza) [#7528](https://github.com/parse-community/parse-server/pull/7528)
- ci: bump ci environment (Manuel Trezza) [#7539](https://github.com/parse-community/parse-server/pull/7539)
- CI now pushes docker images to Docker Hub (Corey Baker) [#7548](https://github.com/parse-community/parse-server/pull/7548)
+- Allow setting descending sort to full text queries (dblythy) [#7496](https://github.com/parse-community/parse-server/pull/7496)
- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
diff --git a/spec/ParseQuery.FullTextSearch.spec.js b/spec/ParseQuery.FullTextSearch.spec.js
index 99118d106c..e6614e5d81 100644
--- a/spec/ParseQuery.FullTextSearch.spec.js
+++ b/spec/ParseQuery.FullTextSearch.spec.js
@@ -5,10 +5,9 @@ const Parse = require('parse/node');
const request = require('../lib/request');
let databaseAdapter;
-const fullTextHelper = () => {
+const fullTextHelper = async () => {
const config = Config.get('test');
databaseAdapter = config.database.adapter;
-
const subjects = [
'coffee',
'Coffee Shopping',
@@ -19,212 +18,84 @@ const fullTextHelper = () => {
'coffee and cream',
'Cafe con Leche',
];
- const requests = [];
- for (const i in subjects) {
- const request = {
- method: 'POST',
- body: {
- subject: subjects[i],
- comment: subjects[i],
- },
- path: '/1/classes/TestObject',
- };
- requests.push(request);
- }
- return reconfigureServer({
+ await reconfigureServer({
appId: 'test',
restAPIKey: 'test',
publicServerURL: 'http://localhost:8378/1',
databaseAdapter,
- }).then(() => {
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/batch',
- body: {
- requests,
- },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
});
+ await Parse.Object.saveAll(
+ subjects.map(subject => new Parse.Object('TestObject').set({ subject, comment: subject }))
+ );
};
describe('Parse.Query Full Text Search testing', () => {
- it('fullTextSearch: $search', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'coffee',
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(
- resp => {
- expect(resp.data.results.length).toBe(3);
- done();
- },
- e => done.fail(e)
- );
+ it('fullTextSearch: $search', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'coffee');
+ const results = await query.find();
+ expect(results.length).toBe(3);
});
- it('fullTextSearch: $search, sort', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'coffee',
- },
- },
- },
- };
- const order = '$score';
- const keys = '$score';
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, order, keys, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(response => {
- const resp = response.data;
- expect(resp.results.length).toBe(3);
- expect(resp.results[0].score);
- expect(resp.results[1].score);
- expect(resp.results[2].score);
- done();
- }, done.fail);
+ it('fullTextSearch: $search, sort', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'coffee');
+ query.select('$score');
+ query.ascending('$score');
+ const results = await query.find();
+ expect(results.length).toBe(3);
+ expect(results[0].get('score'));
+ expect(results[1].get('score'));
+ expect(results[2].get('score'));
});
- it('fullTextSearch: $language', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'leche',
- $language: 'spanish',
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- expect(resp.data.results.length).toBe(2);
- done();
- }, done.fail);
+ it('fulltext descending by $score', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'coffee');
+ query.descending('$score');
+ query.select('$score');
+ const [first, second, third] = await query.find();
+ expect(first).toBeDefined();
+ expect(second).toBeDefined();
+ expect(third).toBeDefined();
+ expect(first.get('score'));
+ expect(second.get('score'));
+ expect(third.get('score'));
+ expect(first.get('score') >= second.get('score')).toBeTrue();
+ expect(second.get('score') >= third.get('score')).toBeTrue();
});
- it('fullTextSearch: $diacriticSensitive', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'CAFÉ',
- $diacriticSensitive: true,
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- expect(resp.data.results.length).toBe(1);
- done();
- }, done.fail);
+ it('fullTextSearch: $language', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'leche', { language: 'spanish' });
+ const resp = await query.find();
+ expect(resp.length).toBe(2);
});
- it('fullTextSearch: $search, invalid input', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: true,
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- fail(`no request should succeed: ${JSON.stringify(resp)}`);
- done();
- })
- .catch(err => {
- expect(err.data.code).toEqual(Parse.Error.INVALID_JSON);
- done();
- });
+ it('fullTextSearch: $diacriticSensitive', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'CAFÉ', { diacriticSensitive: true });
+ const resp = await query.find();
+ expect(resp.length).toBe(1);
});
- it('fullTextSearch: $language, invalid input', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'leche',
- $language: true,
- },
- },
+ it('fullTextSearch: $search, invalid input', async () => {
+ await fullTextHelper();
+ const invalidQuery = async () => {
+ const where = {
+ subject: {
+ $text: {
+ $search: true,
},
- };
- return request({
+ },
+ };
+ try {
+ await request({
method: 'POST',
url: 'http://localhost:8378/1/classes/TestObject',
body: { where, _method: 'GET' },
@@ -234,151 +105,73 @@ describe('Parse.Query Full Text Search testing', () => {
'Content-Type': 'application/json',
},
});
- })
- .then(resp => {
- fail(`no request should succeed: ${JSON.stringify(resp)}`);
- done();
- })
- .catch(err => {
- expect(err.data.code).toEqual(Parse.Error.INVALID_JSON);
- done();
- });
+ } catch (e) {
+ throw new Parse.Error(e.data.code, e.data.error);
+ }
+ };
+ await expectAsync(invalidQuery()).toBeRejectedWith(
+ new Parse.Error(Parse.Error.INVALID_JSON, 'bad $text: $search, should be object')
+ );
});
- it('fullTextSearch: $caseSensitive, invalid input', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'Coffee',
- $caseSensitive: 'string',
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- fail(`no request should succeed: ${JSON.stringify(resp)}`);
- done();
- })
- .catch(err => {
- expect(err.data.code).toEqual(Parse.Error.INVALID_JSON);
- done();
- });
+ it('fullTextSearch: $language, invalid input', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'leche', { language: true });
+ await expectAsync(query.find()).toBeRejectedWith(
+ new Parse.Error(Parse.Error.INVALID_JSON, 'bad $text: $language, should be string')
+ );
});
- it('fullTextSearch: $diacriticSensitive, invalid input', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'CAFÉ',
- $diacriticSensitive: 'string',
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- fail(`no request should succeed: ${JSON.stringify(resp)}`);
- done();
- })
- .catch(err => {
- expect(err.data.code).toEqual(Parse.Error.INVALID_JSON);
- done();
- });
+ it('fullTextSearch: $caseSensitive, invalid input', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'leche', { caseSensitive: 'string' });
+ await expectAsync(query.find()).toBeRejectedWith(
+ new Parse.Error(Parse.Error.INVALID_JSON, 'bad $text: $caseSensitive, should be boolean')
+ );
+ });
+
+ it('fullTextSearch: $diacriticSensitive, invalid input', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'leche', { diacriticSensitive: 'string' });
+ await expectAsync(query.find()).toBeRejectedWith(
+ new Parse.Error(Parse.Error.INVALID_JSON, 'bad $text: $diacriticSensitive, should be boolean')
+ );
});
});
describe_only_db('mongo')('[mongodb] Parse.Query Full Text Search testing', () => {
- it('fullTextSearch: does not create text index if compound index exist', done => {
- fullTextHelper()
- .then(() => {
- return databaseAdapter.dropAllIndexes('TestObject');
- })
- .then(() => {
- return databaseAdapter.getIndexes('TestObject');
- })
- .then(indexes => {
- expect(indexes.length).toEqual(1);
- return databaseAdapter.createIndex('TestObject', {
- subject: 'text',
- comment: 'text',
- });
- })
- .then(() => {
- return databaseAdapter.getIndexes('TestObject');
- })
- .then(indexes => {
- expect(indexes.length).toEqual(2);
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'coffee',
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- expect(resp.data.results.length).toEqual(3);
- return databaseAdapter.getIndexes('TestObject');
- })
- .then(indexes => {
- expect(indexes.length).toEqual(2);
- request({
- url: 'http://localhost:8378/1/schemas/TestObject',
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-Master-Key': 'test',
- 'Content-Type': 'application/json',
- },
- }).then(response => {
- const body = response.data;
- expect(body.indexes._id_).toBeDefined();
- expect(body.indexes._id_._id).toEqual(1);
- expect(body.indexes.subject_text_comment_text).toBeDefined();
- expect(body.indexes.subject_text_comment_text.subject).toEqual('text');
- expect(body.indexes.subject_text_comment_text.comment).toEqual('text');
- done();
- });
- })
- .catch(done.fail);
+ it('fullTextSearch: does not create text index if compound index exist', async () => {
+ await fullTextHelper();
+ await databaseAdapter.dropAllIndexes('TestObject');
+ let indexes = await databaseAdapter.getIndexes('TestObject');
+ expect(indexes.length).toEqual(1);
+ await databaseAdapter.createIndex('TestObject', {
+ subject: 'text',
+ comment: 'text',
+ });
+ indexes = await databaseAdapter.getIndexes('TestObject');
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'coffee');
+ query.select('$score');
+ query.ascending('$score');
+ const results = await query.find();
+ expect(results.length).toBe(3);
+ expect(results[0].get('score'));
+ expect(results[1].get('score'));
+ expect(results[2].get('score'));
+
+ indexes = await databaseAdapter.getIndexes('TestObject');
+ expect(indexes.length).toEqual(2);
+
+ const schemas = await new Parse.Schema('TestObject').get();
+ expect(schemas.indexes._id_).toBeDefined();
+ expect(schemas.indexes._id_._id).toEqual(1);
+ expect(schemas.indexes.subject_text_comment_text).toBeDefined();
+ expect(schemas.indexes.subject_text_comment_text.subject).toEqual('text');
+ expect(schemas.indexes.subject_text_comment_text.comment).toEqual('text');
});
it('fullTextSearch: does not create text index if schema compound index exist', done => {
@@ -458,64 +251,20 @@ describe_only_db('mongo')('[mongodb] Parse.Query Full Text Search testing', () =
.catch(done.fail);
});
- it('fullTextSearch: $diacriticSensitive - false', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'CAFÉ',
- $diacriticSensitive: false,
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- expect(resp.data.results.length).toBe(2);
- done();
- }, done.fail);
+ it('fullTextSearch: $diacriticSensitive - false', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'CAFÉ', { diacriticSensitive: false });
+ const resp = await query.find();
+ expect(resp.length).toBe(2);
});
- it('fullTextSearch: $caseSensitive', done => {
- fullTextHelper()
- .then(() => {
- const where = {
- subject: {
- $text: {
- $search: {
- $term: 'Coffee',
- $caseSensitive: true,
- },
- },
- },
- };
- return request({
- method: 'POST',
- url: 'http://localhost:8378/1/classes/TestObject',
- body: { where, _method: 'GET' },
- headers: {
- 'X-Parse-Application-Id': 'test',
- 'X-Parse-REST-API-Key': 'test',
- 'Content-Type': 'application/json',
- },
- });
- })
- .then(resp => {
- expect(resp.data.results.length).toBe(1);
- done();
- }, done.fail);
+ it('fullTextSearch: $caseSensitive', async () => {
+ await fullTextHelper();
+ const query = new Parse.Query('TestObject');
+ query.fullText('subject', 'Coffee', { caseSensitive: true });
+ const results = await query.find();
+ expect(results.length).toBe(1);
});
});
diff --git a/src/RestQuery.js b/src/RestQuery.js
index a919d5091f..be96683451 100644
--- a/src/RestQuery.js
+++ b/src/RestQuery.js
@@ -143,7 +143,7 @@ function RestQuery(
var fields = restOptions.order.split(',');
this.findOptions.sort = fields.reduce((sortMap, field) => {
field = field.trim();
- if (field === '$score') {
+ if (field === '$score' || field === '-$score') {
sortMap.score = { $meta: 'textScore' };
} else if (field[0] == '-') {
sortMap[field.slice(1)] = -1;
From c3da2908fabfa4f7f49c0f6d5b3d32de692dd388 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sun, 19 Sep 2021 15:05:08 +0200
Subject: [PATCH 13/96] fix: upgrade ws from 7.5.3 to 8.2.1 (#7580)
Snyk has created this PR to upgrade ws from 7.5.3 to 8.2.1.
See this package in npm:
https://www.npmjs.com/package/ws
See this project in Snyk:
https://app.snyk.io/org/acinader/project/8c1a9edb-c8f5-4dc1-b221-4d6030a323eb?utm_source=github&utm_medium=upgrade-pr
---
package-lock.json | 25 ++++++++++++++++++++++---
package.json | 2 +-
2 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d0567d9917..f2806a65d5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2574,6 +2574,13 @@
"iterall": "^1.2.1",
"symbol-observable": "^1.0.4",
"ws": "^5.2.0 || ^6.0.0 || ^7.0.0"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
+ "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
+ }
}
},
"symbol-observable": {
@@ -2639,6 +2646,13 @@
"iterall": "^1.2.1",
"symbol-observable": "^1.0.4",
"ws": "^5.2.0 || ^6.0.0 || ^7.0.0"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
+ "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
+ }
}
},
"symbol-observable": {
@@ -11780,6 +11794,11 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+ },
+ "ws": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
+ "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
}
}
},
@@ -12665,9 +12684,9 @@
}
},
"ws": {
- "version": "7.5.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz",
- "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg=="
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.1.tgz",
+ "integrity": "sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ=="
},
"xmlcreate": {
"version": "2.0.3",
diff --git a/package.json b/package.json
index 6ca0e7fa9e..759065e5ed 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
"uuid": "8.3.2",
"winston": "3.3.3",
"winston-daily-rotate-file": "4.5.5",
- "ws": "7.5.3"
+ "ws": "8.2.1"
},
"devDependencies": {
"@actions/core": "1.2.6",
From dee4d9662749eb699891c8a3797fa0b0467c6355 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Wed, 22 Sep 2021 09:49:39 +0200
Subject: [PATCH 14/96] fix: upgrade graphql from 15.5.1 to 15.5.2 (#7587)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index f2806a65d5..c42cda2885 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6470,9 +6470,9 @@
"dev": true
},
"graphql": {
- "version": "15.5.1",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.1.tgz",
- "integrity": "sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw=="
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.2.tgz",
+ "integrity": "sha512-dZjLPWNQqYv0dqV2RNbiFed0LtSp6yd4jchsDGnuhDKa9OQHJYCfovaOEvY91w9gqbYO7Se9LKDTl3xxYva/3w=="
},
"graphql-extensions": {
"version": "0.15.0",
diff --git a/package.json b/package.json
index 759065e5ed..76993dca86 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"deepcopy": "2.1.0",
"express": "4.17.1",
"follow-redirects": "1.14.1",
- "graphql": "15.5.1",
+ "graphql": "15.5.2",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.8.0",
"graphql-tag": "2.12.5",
From 0fa8f5e27b8bc8480257f5d388ab7aa7fac1aa76 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 22 Sep 2021 15:18:44 +0200
Subject: [PATCH 15/96] chore(deps): bump object-path from 0.11.7 to 0.11.8
(#7585)
---
package-lock.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index c42cda2885..05bf9922b6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9678,9 +9678,9 @@
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
},
"object-path": {
- "version": "0.11.7",
- "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.7.tgz",
- "integrity": "sha512-T4evaK9VfGGQskXBDILcn6F90ZD+WO3OwRFFQ2rmZdUH4vQeDBpiolTpVlPY2yj5xSepyILTjDyM6UvbbdHMZw=="
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz",
+ "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA=="
},
"object-visit": {
"version": "1.0.1",
From c9633c1566a1d143bc6c8b8b310073fc1b8e14c5 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 29 Sep 2021 17:09:49 +0200
Subject: [PATCH 16/96] ci: bump environments (#7594)
* add issue bot for prs
* Update CHANGELOG.md
* Update issue-bot.yml
* bump MongoDB 5.0.2 to 5.0.3
* bump MongoDB 4.4.8 to 4.4.9
* bump MongoDB 4.2.16 to 4.2.17
* bump node 14.17.6 to 14.18.0
---
.github/workflows/ci.yml | 34 +++++++++++++++++-----------------
README.md | 8 ++++----
package.json | 12 ++++++------
3 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f8e93f6475..74bf1f6c52 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,7 +7,7 @@ on:
branches:
- '**'
env:
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
PARSE_SERVER_TEST_TIMEOUT: 20000
jobs:
check-ci:
@@ -103,43 +103,43 @@ jobs:
matrix:
include:
- name: MongoDB 5.0, ReplicaSet, WiredTiger
- MONGODB_VERSION: 5.0.2
+ MONGODB_VERSION: 5.0.3
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: MongoDB 4.4, ReplicaSet, WiredTiger
- MONGODB_VERSION: 4.4.8
+ MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: MongoDB 4.2, ReplicaSet, WiredTiger
- MONGODB_VERSION: 4.2.16
+ MONGODB_VERSION: 4.2.17
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: MongoDB 4.0, ReplicaSet, WiredTiger
MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: MongoDB 4.0, Standalone, MMAPv1
MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: mmapv1
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: Redis Cache
PARSE_SERVER_TEST_CACHE: redis
- MONGODB_VERSION: 4.4.8
+ MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: Node 12
- MONGODB_VERSION: 4.4.8
+ MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 12.22.6
- name: Node 15
- MONGODB_VERSION: 4.4.8
+ MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 15.14.0
@@ -184,16 +184,16 @@ jobs:
include:
- name: PostgreSQL 11, PostGIS 3.0
POSTGRES_IMAGE: postgis/postgis:11-3.0
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: PostgreSQL 11, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:11-3.1
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: PostgreSQL 12, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:12-3.1
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
- name: PostgreSQL 13, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:13-3.1
- NODE_VERSION: 14.17.6
+ NODE_VERSION: 14.18.0
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 15
diff --git a/README.md b/README.md
index 6e5ffaeda6..737993dbb7 100644
--- a/README.md
+++ b/README.md
@@ -115,7 +115,7 @@ Parse Server is continuously tested with the most recent releases of Node.js to
| Version | Latest Version | End-of-Life Date | Compatibility |
|------------|----------------|------------------|--------------------|
| Node.js 12 | 12.22.6 | April 2022 | ✅ Fully compatible |
-| Node.js 14 | 14.17.6 | April 2023 | ✅ Fully compatible |
+| Node.js 14 | 14.18.0 | April 2023 | ✅ Fully compatible |
| Node.js 15 | 15.14.0 | June 2021 | ✅ Fully compatible |
#### MongoDB
@@ -124,9 +124,9 @@ Parse Server is continuously tested with the most recent releases of MongoDB to
| Version | Latest Version | End-of-Life Date | Compatibility |
|-------------|----------------|------------------|--------------------|
| MongoDB 4.0 | 4.0.27 | April 2022 | ✅ Fully compatible |
-| MongoDB 4.2 | 4.2.16 | TBD | ✅ Fully compatible |
-| MongoDB 4.4 | 4.4.8 | TBD | ✅ Fully compatible |
-| MongoDB 5.0 | 5.0.2 | January 2024 | ✅ Fully compatible |
+| MongoDB 4.2 | 4.2.17 | TBD | ✅ Fully compatible |
+| MongoDB 4.4 | 4.4.9 | TBD | ✅ Fully compatible |
+| MongoDB 5.0 | 5.0.3 | January 2024 | ✅ Fully compatible |
#### PostgreSQL
Parse Server is continuously tested with the most recent releases of PostgreSQL and PostGIS to ensure compatibility, using [PostGIS docker images](https://registry.hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated). We follow the [PostgreSQL support schedule](https://www.postgresql.org/support/versioning) and [PostGIS support schedule](https://www.postgis.net/eol_policy/) and only test against versions that are officially supported and have not reached their end-of-life date. Due to the extensive PostgreSQL support duration of 5 years, Parse Server drops support if a version is older than 3.5 years and a newer version has been available for at least 2.5 years.
diff --git a/package.json b/package.json
index 76993dca86..4b74d692cf 100644
--- a/package.json
+++ b/package.json
@@ -113,14 +113,14 @@
"test:mongodb:testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=$npm_config_dbversion} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
"test:mongodb": "npm run test:mongodb:runnerstart --dbversion=$npm_config_dbversion && npm run test:mongodb:testonly --dbversion=$npm_config_dbversion",
"test:mongodb:4.0.27": "npm run test:mongodb --dbversion=4.0.27",
- "test:mongodb:4.2.16": "npm run test:mongodb --dbversion=4.2.16",
- "test:mongodb:4.4.8": "npm run test:mongodb --dbversion=4.4.8",
+ "test:mongodb:4.2.17": "npm run test:mongodb --dbversion=4.2.17",
+ "test:mongodb:4.4.9": "npm run test:mongodb --dbversion=4.4.9",
"posttest:mongodb": "mongodb-runner stop",
- "pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.8} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
- "testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.8} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
+ "pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
+ "testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
"test": "npm run testonly",
- "posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.8} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner stop",
- "coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.8} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 nyc jasmine",
+ "posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner stop",
+ "coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 nyc jasmine",
"start": "node ./bin/parse-server",
"prettier": "prettier --write {src,spec}/{**/*,*}.js",
"prepare": "npm run build",
From bcbc035627c552a7940bec4ae210ca1522215246 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Thu, 30 Sep 2021 04:49:13 +0200
Subject: [PATCH 17/96] fix: upgrade graphql from 15.5.2 to 15.5.3 (#7596)
Snyk has created this PR to upgrade graphql from 15.5.2 to 15.5.3.
See this package in npm:
https://www.npmjs.com/package/graphql
See this project in Snyk:
https://app.snyk.io/org/acinader/project/8c1a9edb-c8f5-4dc1-b221-4d6030a323eb?utm_source=github&utm_medium=referral&page=upgrade-pr
Co-authored-by: Manuel <5673677+mtrezza@users.noreply.github.com>
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 05bf9922b6..3edb41d94e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6470,9 +6470,9 @@
"dev": true
},
"graphql": {
- "version": "15.5.2",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.2.tgz",
- "integrity": "sha512-dZjLPWNQqYv0dqV2RNbiFed0LtSp6yd4jchsDGnuhDKa9OQHJYCfovaOEvY91w9gqbYO7Se9LKDTl3xxYva/3w=="
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.3.tgz",
+ "integrity": "sha512-sM+jXaO5KinTui6lbK/7b7H/Knj9BpjGxZ+Ki35v7YbUJxxdBCUqNM0h3CRVU1ZF9t5lNiBzvBCSYPvIwxPOQA=="
},
"graphql-extensions": {
"version": "0.15.0",
diff --git a/package.json b/package.json
index 4b74d692cf..85b98bb1e3 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"deepcopy": "2.1.0",
"express": "4.17.1",
"follow-redirects": "1.14.1",
- "graphql": "15.5.2",
+ "graphql": "15.5.3",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.8.0",
"graphql-tag": "2.12.5",
From 834ae366f98179c99332ea90692d943dd00851b1 Mon Sep 17 00:00:00 2001
From: dblythy
Date: Thu, 30 Sep 2021 12:52:12 +1000
Subject: [PATCH 18/96] Merge pull request from GHSA-7pr3-p5fm-8r9x
* fix: strip sessionToken on _User LiveQuery
* delete authData
* add changelog
* Update package.json
* Update CHANGELOG.md
* add changes
* Update ParseLiveQuery.spec.js
Co-authored-by: Manuel <5673677+mtrezza@users.noreply.github.com>
---
CHANGELOG.md | 11 +++++--
package-lock.json | 2 +-
package.json | 2 +-
spec/ParseLiveQuery.spec.js | 46 +++++++++++++++++++++++++++
spec/ParseUser.spec.js | 45 ++++++++++++++++++++++++++
src/LiveQuery/ParseLiveQueryServer.js | 18 +++++++++++
6 files changed, 120 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1920116337..635777d7f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,8 @@ Jump directly to a version:
| 4.x |
|--------------------------------------|
-| [**4.10.3 (latest release)**](#4103) |
+| [**4.10.4 (latest release)**](#4104) |
+| [4.10.3](#4103) |
| [4.10.2](#4102) |
| [4.10.1](#4101) |
| [4.10.0](#4100) |
@@ -94,7 +95,7 @@ Jump directly to a version:
___
## Unreleased (Master Branch)
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.3...master)
+[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.4...master)
### Breaking Changes
- Improved schema caching through database real-time hooks. Reduces DB queries, decreases Parse Query execution time and fixes a potential schema memory leak. If multiple Parse Server instances connect to the same DB (for example behind a load balancer), set the [Parse Server Option](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) `databaseOptions.enableSchemaHooks: true` to enable this feature and keep the schema in sync across all instances. Failing to do so will cause a schema change to not propagate to other instances and re-syncing will only happen when these instances restart. The options `enableSingleSchemaCache` and `schemaCacheTTL` have been removed. To use this feature with MongoDB, a replica set cluster with [change stream](https://docs.mongodb.com/manual/changeStreams/#availability) support is required. (Diamond Lewis, SebC) [#7214](https://github.com/parse-community/parse-server/issues/7214)
@@ -156,6 +157,12 @@ ___
- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
+## 4.10.4
+[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.3...4.10.4)
+
+### Security Fixes
+- Strip out sessionToken when LiveQuery is used on Parse.User (Daniel Blyth) [GHSA-7pr3-p5fm-8r9x](https://github.com/parse-community/parse-server/security/advisories/GHSA-7pr3-p5fm-8r9x)
+
## 4.10.3
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.2...4.10.3)
diff --git a/package-lock.json b/package-lock.json
index 3edb41d94e..cc4bab105e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "4.10.3",
+ "version": "4.10.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 85b98bb1e3..6835f838ed 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "4.10.3",
+ "version": "4.10.4",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js
index 65d1836c5f..ae1fb8d0ef 100644
--- a/spec/ParseLiveQuery.spec.js
+++ b/spec/ParseLiveQuery.spec.js
@@ -840,6 +840,52 @@ describe('ParseLiveQuery', function () {
done();
});
+ it('should strip out session token in LiveQuery', async () => {
+ await reconfigureServer({
+ liveQuery: { classNames: ['_User'] },
+ startLiveQueryServer: true,
+ verbose: false,
+ silent: true,
+ });
+
+ const user = new Parse.User();
+ user.setUsername('username');
+ user.setPassword('password');
+ user.set('foo', 'bar');
+
+ const query = new Parse.Query(Parse.User);
+ query.equalTo('foo', 'bar');
+ const subscription = await query.subscribe();
+
+ const events = ['create', 'update', 'enter', 'leave', 'delete'];
+ const response = (obj, prev) => {
+ expect(obj.get('sessionToken')).toBeUndefined();
+ expect(obj.sessionToken).toBeUndefined();
+ expect(prev?.sessionToken).toBeUndefined();
+ if (prev && prev.get) {
+ expect(prev.get('sessionToken')).toBeUndefined();
+ }
+ };
+ const calls = {};
+ for (const key of events) {
+ calls[key] = response;
+ spyOn(calls, key).and.callThrough();
+ subscription.on(key, calls[key]);
+ }
+ await user.signUp();
+ user.unset('foo');
+ await user.save();
+ user.set('foo', 'bar');
+ await user.save();
+ user.set('yolo', 'bar');
+ await user.save();
+ await user.destroy();
+ await new Promise(resolve => process.nextTick(resolve));
+ for (const key of events) {
+ expect(calls[key]).toHaveBeenCalled();
+ }
+ });
+
afterEach(async function (done) {
const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
client.close();
diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js
index 2751cd46b1..e54f1c2c7f 100644
--- a/spec/ParseUser.spec.js
+++ b/spec/ParseUser.spec.js
@@ -3966,6 +3966,51 @@ describe('Parse.User testing', () => {
ok(model._isLinked('facebook'), 'User should be linked to facebook');
});
});
+
+ it('should strip out authdata in LiveQuery', async () => {
+ const provider = getMockFacebookProvider();
+ Parse.User._registerAuthenticationProvider(provider);
+
+ await reconfigureServer({
+ liveQuery: { classNames: ['_User'] },
+ startLiveQueryServer: true,
+ verbose: false,
+ silent: true,
+ });
+
+ const query = new Parse.Query(Parse.User);
+ query.doesNotExist('foo');
+ const subscription = await query.subscribe();
+
+ const events = ['create', 'update', 'enter', 'leave', 'delete'];
+ const response = (obj, prev) => {
+ expect(obj.get('authData')).toBeUndefined();
+ expect(obj.authData).toBeUndefined();
+ expect(prev?.authData).toBeUndefined();
+ if (prev && prev.get) {
+ expect(prev.get('authData')).toBeUndefined();
+ }
+ };
+ const calls = {};
+ for (const key of events) {
+ calls[key] = response;
+ spyOn(calls, key).and.callThrough();
+ subscription.on(key, calls[key]);
+ }
+ const user = await Parse.User._logInWith('facebook');
+
+ user.set('foo', 'bar');
+ await user.save();
+ user.unset('foo');
+ await user.save();
+ user.set('yolo', 'bar');
+ await user.save();
+ await user.destroy();
+ await new Promise(resolve => process.nextTick(resolve));
+ for (const key of events) {
+ expect(calls[key]).toHaveBeenCalled();
+ }
+ });
});
describe('Security Advisory GHSA-8w3j-g983-8jh5', function () {
diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js
index 5a44ae5c8b..f7a065b7f6 100644
--- a/src/LiveQuery/ParseLiveQueryServer.js
+++ b/src/LiveQuery/ParseLiveQueryServer.js
@@ -186,6 +186,14 @@ class ParseLiveQueryServer {
deletedParseObject = res.object.toJSON();
deletedParseObject.className = className;
}
+ if (
+ (deletedParseObject.className === '_User' ||
+ deletedParseObject.className === '_Session') &&
+ !client.hasMasterKey
+ ) {
+ delete deletedParseObject.sessionToken;
+ delete deletedParseObject.authData;
+ }
client.pushDelete(requestId, deletedParseObject);
} catch (error) {
Client.pushError(
@@ -337,6 +345,16 @@ class ParseLiveQueryServer {
originalParseObject = res.original.toJSON();
originalParseObject.className = res.original.className || className;
}
+ if (
+ (currentParseObject.className === '_User' ||
+ currentParseObject.className === '_Session') &&
+ !client.hasMasterKey
+ ) {
+ delete currentParseObject.sessionToken;
+ delete originalParseObject?.sessionToken;
+ delete currentParseObject.authData;
+ delete originalParseObject?.authData;
+ }
const functionName = 'push' + res.event.charAt(0).toUpperCase() + res.event.slice(1);
if (client[functionName]) {
client[functionName](requestId, currentParseObject, originalParseObject);
From b86e3bfbb5684f8a3f63fc46c3908d3406daecaa Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 30 Sep 2021 05:06:43 +0200
Subject: [PATCH 19/96] ci: add manual docker image release (#7597)
---
.github/workflows/release-manual-docker.yml | 57 +++++++++++++++++++++
1 file changed, 57 insertions(+)
create mode 100644 .github/workflows/release-manual-docker.yml
diff --git a/.github/workflows/release-manual-docker.yml b/.github/workflows/release-manual-docker.yml
new file mode 100644
index 0000000000..a5daf4a5b9
--- /dev/null
+++ b/.github/workflows/release-manual-docker.yml
@@ -0,0 +1,57 @@
+# Trigger this workflow only to manually create a Docker release; this should only be used
+# in extraordinary circumstances, as Docker releases are normally created automatically as
+# part of the automated release workflow.
+
+name: release-manual-docker
+on:
+ workflow_dispatch:
+ inputs:
+ ref:
+ default: ''
+ description: 'Reference (tag / SHA):'
+env:
+ REGISTRY: docker.io
+ IMAGE_NAME: parseplatform/parse-server
+jobs:
+ build:
+ runs-on: ubuntu-18.04
+ permissions:
+ contents: read
+ packages: write
+ steps:
+ - name: Determine branch name
+ id: branch
+ run: echo "::set-output name=branch_name::${GITHUB_REF#refs/*/}"
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ with:
+ ref: ${{ github.event.inputs.ref }}
+ - name: Set up QEMU
+ id: qemu
+ uses: docker/setup-qemu-action@v1
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+ - name: Log into Docker Hub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Extract Docker metadata
+ id: meta
+ uses: docker/metadata-action@v3
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+ flavor: |
+ latest=${{ steps.branch.outputs.branch_name == 'master' && github.event.inputs.ref == '' }}
+ tags: |
+ type=semver,enable=true,pattern={{version}},value=${{ github.event.inputs.ref }}
+ type=raw,enable=${{ github.event.inputs.ref == '' }},value=latest
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ platforms: linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64/v8
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
From d90c1591ad45cc409fd7ab20531052a9a871a6b2 Mon Sep 17 00:00:00 2001
From: dblythy
Date: Thu, 30 Sep 2021 21:41:04 +1000
Subject: [PATCH 20/96] test: fix failing tests after removal of session token
(#7599)
---
spec/ParseLiveQuery.spec.js | 2 +-
spec/ParseUser.spec.js | 5 ++++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js
index ae1fb8d0ef..dda6d7740b 100644
--- a/spec/ParseLiveQuery.spec.js
+++ b/spec/ParseLiveQuery.spec.js
@@ -861,7 +861,7 @@ describe('ParseLiveQuery', function () {
const response = (obj, prev) => {
expect(obj.get('sessionToken')).toBeUndefined();
expect(obj.sessionToken).toBeUndefined();
- expect(prev?.sessionToken).toBeUndefined();
+ expect(prev && prev.sessionToken).toBeUndefined();
if (prev && prev.get) {
expect(prev.get('sessionToken')).toBeUndefined();
}
diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js
index e54f1c2c7f..ee02f88a50 100644
--- a/spec/ParseUser.spec.js
+++ b/spec/ParseUser.spec.js
@@ -3986,7 +3986,7 @@ describe('Parse.User testing', () => {
const response = (obj, prev) => {
expect(obj.get('authData')).toBeUndefined();
expect(obj.authData).toBeUndefined();
- expect(prev?.authData).toBeUndefined();
+ expect(prev && prev.authData).toBeUndefined();
if (prev && prev.get) {
expect(prev.get('authData')).toBeUndefined();
}
@@ -4010,6 +4010,9 @@ describe('Parse.User testing', () => {
for (const key of events) {
expect(calls[key]).toHaveBeenCalled();
}
+ const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
+ client.close();
+ await new Promise(resolve => process.nextTick(resolve));
});
});
From 20cb3333aba67fb89e4e2cda586c559bdb4a23ef Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Fri, 1 Oct 2021 01:18:41 +0200
Subject: [PATCH 21/96] fix: upgrade ws from 8.2.1 to 8.2.2 (#7598)
Snyk has created this PR to upgrade ws from 8.2.1 to 8.2.2.
See this package in npm:
https://www.npmjs.com/package/ws
See this project in Snyk:
https://app.snyk.io/org/acinader/project/8c1a9edb-c8f5-4dc1-b221-4d6030a323eb?utm_source=github&utm_medium=referral&page=upgrade-pr
Co-authored-by: Manuel <5673677+mtrezza@users.noreply.github.com>
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index cc4bab105e..79dab6cfe6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12684,9 +12684,9 @@
}
},
"ws": {
- "version": "8.2.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.1.tgz",
- "integrity": "sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ=="
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz",
+ "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw=="
},
"xmlcreate": {
"version": "2.0.3",
diff --git a/package.json b/package.json
index 6835f838ed..2f0fca4325 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
"uuid": "8.3.2",
"winston": "3.3.3",
"winston-daily-rotate-file": "4.5.5",
- "ws": "8.2.1"
+ "ws": "8.2.2"
},
"devDependencies": {
"@actions/core": "1.2.6",
From 2b5bf2261b3e6018d1c525081841fb08b94c771a Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Wed, 6 Oct 2021 01:44:45 +0200
Subject: [PATCH 22/96] refactor: upgrade graphql-relay from 0.8.0 to 0.9.0
(#7605)
Snyk has created this PR to upgrade graphql-relay from 0.8.0 to 0.9.0.
See this package in npm:
https://www.npmjs.com/package/graphql-relay
See this project in Snyk:
https://app.snyk.io/org/acinader/project/8c1a9edb-c8f5-4dc1-b221-4d6030a323eb?utm_source=github&utm_medium=referral&page=upgrade-pr
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 79dab6cfe6..00364e7746 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6490,9 +6490,9 @@
"integrity": "sha512-9TSAwcVA3KWw7JWYep5NCk2aw3wl1ayLtbMpmG7l26vh1FZ+gZexNPP+XJfUFyJa71UU0zcKSgtgpsrsA3Xv9Q=="
},
"graphql-relay": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.8.0.tgz",
- "integrity": "sha512-NU7CkwNxPzkqpBgv76Cgycrc3wmWVA2K5Sxm9DHSSLLuQTpaSRAUsX1sf2gITf+XQpkccsv56/z0LojXTyQbUw=="
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.9.0.tgz",
+ "integrity": "sha512-yNJLCqcjz0XpzpmmckRJCSK8a2ZLwTurwrQ09UyGftONh52PbrGpK1UO4yspvj0c7pC+jkN4ZUqVXG3LRrWkXQ=="
},
"graphql-subscriptions": {
"version": "1.2.1",
diff --git a/package.json b/package.json
index 2f0fca4325..ed690875e5 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
"follow-redirects": "1.14.1",
"graphql": "15.5.3",
"graphql-list-fields": "2.0.2",
- "graphql-relay": "0.8.0",
+ "graphql-relay": "0.9.0",
"graphql-tag": "2.12.5",
"graphql-upload": "11.0.0",
"intersect": "1.0.1",
From 484c2e81cace608eb28508a0926b17b3ba9e6233 Mon Sep 17 00:00:00 2001
From: dblythy
Date: Fri, 8 Oct 2021 14:24:20 +1100
Subject: [PATCH 23/96] fix: improve security by deprecating creating users
with public access by default (#7319)
---
CHANGELOG.md | 1 +
DEPRECATIONS.md | 1 +
spec/ParseUser.spec.js | 51 +++++++++++++------
src/Config.js | 8 +++
src/Deprecator/Deprecations.js | 9 ++--
src/Options/Definitions.js | 6 +++
src/Options/docs.js | 1 +
src/Options/index.js | 3 ++
src/RestWrite.js | 4 +-
.../CheckGroups/CheckGroupServerConfig.js | 30 ++++++++---
10 files changed, 86 insertions(+), 28 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 635777d7f1..0a5f6f8dfe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -114,6 +114,7 @@ ___
- Added Deprecation Policy to govern the introduction of breaking changes in a phased pattern that is more predictable for developers (Manuel Trezza) [#7199](https://github.com/parse-community/parse-server/pull/7199)
- Add REST API endpoint `/loginAs` to create session of any user with master key; allows to impersonate another user. (GormanFletcher) [#7406](https://github.com/parse-community/parse-server/pull/7406)
- Add official support for MongoDB 5.0 (Manuel Trezza) [#7469](https://github.com/parse-community/parse-server/pull/7469)
+- Added Parse Server Configuration `enforcePrivateUsers`, which will remove public access by default on new Parse.Users (dblythy) [#7319](https://github.com/parse-community/parse-server/pull/7319)
### Other Changes
- Support native mongodb syntax in aggregation pipelines (Raschid JF Rafeally) [#7339](https://github.com/parse-community/parse-server/pull/7339)
diff --git a/DEPRECATIONS.md b/DEPRECATIONS.md
index 87a4e3b927..05ef29bc75 100644
--- a/DEPRECATIONS.md
+++ b/DEPRECATIONS.md
@@ -6,6 +6,7 @@ The following is a list of deprecations, according to the [Deprecation Policy](h
|--------|-------------------------------------------------|----------------------------------------------------------------------|---------------------------------|---------------------------------|-----------------------|-------|
| DEPPS1 | Native MongoDB syntax in aggregation pipeline | [#7338](https://github.com/parse-community/parse-server/issues/7338) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
| DEPPS2 | Config option `directAccess` defaults to `true` | [#6636](https://github.com/parse-community/parse-server/pull/6636) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
+| DEPPS3 | Config option `enforcePrivateUsers` defaults to `true` | [#7319](https://github.com/parse-community/parse-server/pull/7319) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
[i_deprecation]: ## "The version and date of the deprecation."
[i_removal]: ## "The version and date of the planned removal."
diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js
index ee02f88a50..ebdee6a191 100644
--- a/spec/ParseUser.spec.js
+++ b/spec/ParseUser.spec.js
@@ -13,20 +13,6 @@ const passwordCrypto = require('../lib/password');
const Config = require('../lib/Config');
const cryptoUtils = require('../lib/cryptoUtils');
-function verifyACL(user) {
- const ACL = user.getACL();
- expect(ACL.getReadAccess(user)).toBe(true);
- expect(ACL.getWriteAccess(user)).toBe(true);
- expect(ACL.getPublicReadAccess()).toBe(true);
- expect(ACL.getPublicWriteAccess()).toBe(false);
- const perms = ACL.permissionsById;
- expect(Object.keys(perms).length).toBe(2);
- expect(perms[user.id].read).toBe(true);
- expect(perms[user.id].write).toBe(true);
- expect(perms['*'].read).toBe(true);
- expect(perms['*'].write).not.toBe(true);
-}
-
describe('Parse.User testing', () => {
it('user sign up class method', async done => {
const user = await Parse.User.signUp('asdf', 'zxcv');
@@ -146,7 +132,17 @@ describe('Parse.User testing', () => {
await Parse.User.signUp('asdf', 'zxcv');
const user = await Parse.User.logIn('asdf', 'zxcv');
equal(user.get('username'), 'asdf');
- verifyACL(user);
+ const ACL = user.getACL();
+ expect(ACL.getReadAccess(user)).toBe(true);
+ expect(ACL.getWriteAccess(user)).toBe(true);
+ expect(ACL.getPublicReadAccess()).toBe(true);
+ expect(ACL.getPublicWriteAccess()).toBe(false);
+ const perms = ACL.permissionsById;
+ expect(Object.keys(perms).length).toBe(2);
+ expect(perms[user.id].read).toBe(true);
+ expect(perms[user.id].write).toBe(true);
+ expect(perms['*'].read).toBe(true);
+ expect(perms['*'].write).not.toBe(true);
done();
});
@@ -3934,6 +3930,31 @@ describe('Parse.User testing', () => {
}
});
+ it('should throw when enforcePrivateUsers is invalid', async () => {
+ const options = [[], 'a', 0, {}];
+ for (const option of options) {
+ await expectAsync(reconfigureServer({ enforcePrivateUsers: option })).toBeRejected();
+ }
+ });
+
+ it('user login with enforcePrivateUsers', async done => {
+ await reconfigureServer({ enforcePrivateUsers: true });
+ await Parse.User.signUp('asdf', 'zxcv');
+ const user = await Parse.User.logIn('asdf', 'zxcv');
+ equal(user.get('username'), 'asdf');
+ const ACL = user.getACL();
+ expect(ACL.getReadAccess(user)).toBe(true);
+ expect(ACL.getWriteAccess(user)).toBe(true);
+ expect(ACL.getPublicReadAccess()).toBe(false);
+ expect(ACL.getPublicWriteAccess()).toBe(false);
+ const perms = ACL.permissionsById;
+ expect(Object.keys(perms).length).toBe(1);
+ expect(perms[user.id].read).toBe(true);
+ expect(perms[user.id].write).toBe(true);
+ expect(perms['*']).toBeUndefined();
+ done();
+ });
+
describe('issue #4897', () => {
it_only_db('mongo')('should be able to login with a legacy user (no ACL)', async () => {
// This issue is a side effect of the locked users and legacy users which don't have ACL's
diff --git a/src/Config.js b/src/Config.js
index 302347c5ed..250880efbc 100644
--- a/src/Config.js
+++ b/src/Config.js
@@ -75,6 +75,7 @@ export class Config {
fileUpload,
pages,
security,
+ enforcePrivateUsers,
}) {
if (masterKey === readOnlyMasterKey) {
throw new Error('masterKey and readOnlyMasterKey should be different');
@@ -111,6 +112,13 @@ export class Config {
this.validateIdempotencyOptions(idempotencyOptions);
this.validatePagesOptions(pages);
this.validateSecurityOptions(security);
+ this.validateEnforcePrivateUsers(enforcePrivateUsers);
+ }
+
+ static validateEnforcePrivateUsers(enforcePrivateUsers) {
+ if (typeof enforcePrivateUsers !== 'boolean') {
+ throw 'Parse Server option enforcePrivateUsers must be a boolean.';
+ }
}
static validateSecurityOptions(security) {
diff --git a/src/Deprecator/Deprecations.js b/src/Deprecator/Deprecations.js
index e32b305fb0..eb2212bf92 100644
--- a/src/Deprecator/Deprecations.js
+++ b/src/Deprecator/Deprecations.js
@@ -2,11 +2,11 @@
* The deprecations.
*
* Add deprecations to the array using the following keys:
- * - `optionKey`: The option key incl. its path, e.g. `security.enableCheck`.
- * - `envKey`: The environment key, e.g. `PARSE_SERVER_SECURITY`.
- * - `changeNewKey`: Set the new key name if the current key will be replaced,
+ * - `optionKey` {String}: The option key incl. its path, e.g. `security.enableCheck`.
+ * - `envKey` {String}: The environment key, e.g. `PARSE_SERVER_SECURITY`.
+ * - `changeNewKey` {String}: Set the new key name if the current key will be replaced,
* or set to an empty string if the current key will be removed without replacement.
- * - `changeNewDefault`: Set the new default value if the key's default value
+ * - `changeNewDefault` {String}: Set the new default value if the key's default value
* will change in a future version.
* - `solution`: The instruction to resolve this deprecation warning. Optional. This
* instruction must not include the deprecation warning which is auto-generated.
@@ -22,4 +22,5 @@ module.exports = [
solution:
"Additionally, the environment variable 'PARSE_SERVER_ENABLE_EXPERIMENTAL_DIRECT_ACCESS' will be deprecated and renamed to 'PARSE_SERVER_DIRECT_ACCESS' in a future version; it is currently possible to use either one.",
},
+ { optionKey: 'enforcePrivateUsers', changeNewDefault: 'true' },
];
diff --git a/src/Options/Definitions.js b/src/Options/Definitions.js
index 53067a4399..88779376c2 100644
--- a/src/Options/Definitions.js
+++ b/src/Options/Definitions.js
@@ -154,6 +154,12 @@ module.exports.ParseServerOptions = {
env: 'PARSE_SERVER_ENCRYPTION_KEY',
help: 'Key for encrypting your files',
},
+ enforcePrivateUsers: {
+ env: 'PARSE_SERVER_ENFORCE_PRIVATE_USERS',
+ help: 'Set to true if new users should be created without public read and write access.',
+ action: parsers.booleanParser,
+ default: false,
+ },
expireInactiveSessions: {
env: 'PARSE_SERVER_EXPIRE_INACTIVE_SESSIONS',
help:
diff --git a/src/Options/docs.js b/src/Options/docs.js
index c3dc43afc4..c6b2e1abf1 100644
--- a/src/Options/docs.js
+++ b/src/Options/docs.js
@@ -28,6 +28,7 @@
* @property {Boolean} enableAnonymousUsers Enable (or disable) anonymous users, defaults to true
* @property {Boolean} enableExpressErrorHandler Enables the default express error handler for all errors
* @property {String} encryptionKey Key for encrypting your files
+ * @property {Boolean} enforcePrivateUsers Set to true if new users should be created without public read and write access.
* @property {Boolean} expireInactiveSessions Sets whether we should expire the inactive sessions, defaults to true. If false, all new sessions are created with no expiration date.
* @property {String} fileKey Key for your files
* @property {Adapter} filesAdapter Adapter module for the files sub-system
diff --git a/src/Options/index.js b/src/Options/index.js
index 552eb2e782..34fa5198c2 100644
--- a/src/Options/index.js
+++ b/src/Options/index.js
@@ -246,6 +246,9 @@ export interface ParseServerOptions {
/* The security options to identify and report weak security settings.
:DEFAULT: {} */
security: ?SecurityOptions;
+ /* Set to true if new users should be created without public read and write access.
+ :DEFAULT: false */
+ enforcePrivateUsers: ?boolean;
}
export interface SecurityOptions {
diff --git a/src/RestWrite.js b/src/RestWrite.js
index 360c7e0dc0..c1f7ca2a26 100644
--- a/src/RestWrite.js
+++ b/src/RestWrite.js
@@ -1408,7 +1408,9 @@ RestWrite.prototype.runDatabaseOperation = function () {
// default public r/w ACL
if (!ACL) {
ACL = {};
- ACL['*'] = { read: true, write: false };
+ if (!this.config.enforcePrivateUsers) {
+ ACL['*'] = { read: true, write: false };
+ }
}
// make sure the user is not locked down
ACL[this.data.objectId] = { read: true, write: true };
diff --git a/src/Security/CheckGroups/CheckGroupServerConfig.js b/src/Security/CheckGroups/CheckGroupServerConfig.js
index a0dc41ec47..a9c6e671cc 100644
--- a/src/Security/CheckGroups/CheckGroupServerConfig.js
+++ b/src/Security/CheckGroups/CheckGroupServerConfig.js
@@ -8,9 +8,9 @@ import Config from '../../Config';
import Parse from 'parse/node';
/**
-* The security checks group for Parse Server configuration.
-* Checks common Parse Server parameters such as access keys.
-*/
+ * The security checks group for Parse Server configuration.
+ * Checks common Parse Server parameters such as access keys.
+ */
class CheckGroupServerConfig extends CheckGroup {
setName() {
return 'Parse Server Configuration';
@@ -21,7 +21,8 @@ class CheckGroupServerConfig extends CheckGroup {
new Check({
title: 'Secure master key',
warning: 'The Parse Server master key is insecure and vulnerable to brute force attacks.',
- solution: 'Choose a longer and/or more complex master key with a combination of upper- and lowercase characters, numbers and special characters.',
+ solution:
+ 'Choose a longer and/or more complex master key with a combination of upper- and lowercase characters, numbers and special characters.',
check: () => {
const masterKey = config.masterKey;
const hasUpperCase = /[A-Z]/.test(masterKey);
@@ -40,8 +41,9 @@ class CheckGroupServerConfig extends CheckGroup {
}),
new Check({
title: 'Security log disabled',
- warning: 'Security checks in logs may expose vulnerabilities to anyone access to logs.',
- solution: 'Change Parse Server configuration to \'security.enableCheckLog: false\'.',
+ warning:
+ 'Security checks in logs may expose vulnerabilities to anyone with access to logs.',
+ solution: "Change Parse Server configuration to 'security.enableCheckLog: false'.",
check: () => {
if (config.security && config.security.enableCheckLog) {
throw 1;
@@ -50,14 +52,26 @@ class CheckGroupServerConfig extends CheckGroup {
}),
new Check({
title: 'Client class creation disabled',
- warning: 'Attackers are allowed to create new classes without restriction and flood the database.',
- solution: 'Change Parse Server configuration to \'allowClientClassCreation: false\'.',
+ warning:
+ 'Attackers are allowed to create new classes without restriction and flood the database.',
+ solution: "Change Parse Server configuration to 'allowClientClassCreation: false'.",
check: () => {
if (config.allowClientClassCreation || config.allowClientClassCreation == null) {
throw 1;
}
},
}),
+ new Check({
+ title: 'Users are created without public access',
+ warning:
+ 'Users with public read access are exposed to anyone who knows their object IDs, or to anyone who can query the Parse.User class.',
+ solution: "Change Parse Server configuration to 'enforcePrivateUsers: true'.",
+ check: () => {
+ if (!config.enforcePrivateUsers) {
+ throw 1;
+ }
+ },
+ }),
];
}
}
From caee281bc58901fea7cead21d6a9a0bb2022d91b Mon Sep 17 00:00:00 2001
From: dblythy
Date: Sat, 9 Oct 2021 02:24:33 +1100
Subject: [PATCH 24/96] fix: allow LiveQuery on Parse.Session (#7554)
---
CHANGELOG.md | 1 +
spec/ParseLiveQuery.spec.js | 54 +++++++++++++++++++++++++-
src/Controllers/LiveQueryController.js | 6 ++-
src/LiveQuery/ParseLiveQueryServer.js | 26 +++++++++++++
src/RestWrite.js | 19 ++++++++-
src/cloud-code/Parse.Cloud.js | 29 ++++++--------
src/triggers.js | 7 ++++
7 files changed, 120 insertions(+), 22 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0a5f6f8dfe..42858f691a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -157,6 +157,7 @@ ___
- Allow setting descending sort to full text queries (dblythy) [#7496](https://github.com/parse-community/parse-server/pull/7496)
- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
+- Allow liveQuery on Session class (Daniel Blyth) [#7554](https://github.com/parse-community/parse-server/pull/7554)
## 4.10.4
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.3...4.10.4)
diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js
index dda6d7740b..2393467544 100644
--- a/spec/ParseLiveQuery.spec.js
+++ b/spec/ParseLiveQuery.spec.js
@@ -708,6 +708,58 @@ describe('ParseLiveQuery', function () {
}
});
+ it('liveQuery on Session class', async done => {
+ await reconfigureServer({
+ liveQuery: { classNames: [Parse.Session] },
+ startLiveQueryServer: true,
+ verbose: false,
+ silent: true,
+ });
+
+ const user = new Parse.User();
+ user.setUsername('username');
+ user.setPassword('password');
+ await user.signUp();
+
+ const query = new Parse.Query(Parse.Session);
+ const subscription = await query.subscribe();
+
+ subscription.on('create', async obj => {
+ await new Promise(resolve => setTimeout(resolve, 200));
+ expect(obj.get('user').id).toBe(user.id);
+ expect(obj.get('createdWith')).toEqual({ action: 'login', authProvider: 'password' });
+ expect(obj.get('expiresAt')).toBeInstanceOf(Date);
+ expect(obj.get('installationId')).toBeDefined();
+ expect(obj.get('createdAt')).toBeInstanceOf(Date);
+ expect(obj.get('updatedAt')).toBeInstanceOf(Date);
+ done();
+ });
+
+ await Parse.User.logIn('username', 'password');
+ });
+
+ it('prevent liveQuery on Session class when not logged in', async done => {
+ await reconfigureServer({
+ liveQuery: {
+ classNames: [Parse.Session],
+ },
+ startLiveQueryServer: true,
+ verbose: false,
+ silent: true,
+ });
+
+ Parse.LiveQuery.on('error', error => {
+ expect(error).toBe('Invalid session token');
+ });
+ const query = new Parse.Query(Parse.Session);
+ const subscription = await query.subscribe();
+ subscription.on('error', error => {
+ Parse.LiveQuery.removeAllListeners('error');
+ expect(error).toBe('Invalid session token');
+ done();
+ });
+ });
+
it('handle invalid websocket payload length', async done => {
await reconfigureServer({
liveQuery: {
@@ -754,7 +806,7 @@ describe('ParseLiveQuery', function () {
await reconfigureServer({
liveQuery: {
- classNames: ['_User'],
+ classNames: [Parse.User],
},
startLiveQueryServer: true,
verbose: false,
diff --git a/src/Controllers/LiveQueryController.js b/src/Controllers/LiveQueryController.js
index 34cf28893f..064084caa4 100644
--- a/src/Controllers/LiveQueryController.js
+++ b/src/Controllers/LiveQueryController.js
@@ -1,5 +1,6 @@
import { ParseCloudCodePublisher } from '../LiveQuery/ParseCloudCodePublisher';
import { LiveQueryOptions } from '../Options';
+import { getClassName } from './../triggers';
export class LiveQueryController {
classNames: any;
liveQueryPublisher: any;
@@ -9,7 +10,10 @@ export class LiveQueryController {
if (!config || !config.classNames) {
this.classNames = new Set();
} else if (config.classNames instanceof Array) {
- const classNames = config.classNames.map(name => new RegExp('^' + name + '$'));
+ const classNames = config.classNames.map(name => {
+ const _name = getClassName(name);
+ return new RegExp(`^${_name}$`);
+ });
this.classNames = new Set(classNames);
} else {
throw 'liveQuery.classes should be an array of string';
diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js
index f7a065b7f6..0091c459c0 100644
--- a/src/LiveQuery/ParseLiveQueryServer.js
+++ b/src/LiveQuery/ParseLiveQueryServer.js
@@ -729,10 +729,12 @@ class ParseLiveQueryServer {
}
const client = this.clients.get(parseWebsocket.clientId);
const className = request.query.className;
+ let authCalled = false;
try {
const trigger = getTrigger(className, 'beforeSubscribe', Parse.applicationId);
if (trigger) {
const auth = await this.getAuthFromClient(client, request.requestId, request.sessionToken);
+ authCalled = true;
if (auth && auth.user) {
request.user = auth.user;
}
@@ -749,6 +751,30 @@ class ParseLiveQueryServer {
request.query = query;
}
+ if (className === '_Session') {
+ if (!authCalled) {
+ const auth = await this.getAuthFromClient(
+ client,
+ request.requestId,
+ request.sessionToken
+ );
+ if (auth && auth.user) {
+ request.user = auth.user;
+ }
+ }
+ if (request.user) {
+ request.query.where.user = request.user.toPointer();
+ } else if (!request.master) {
+ Client.pushError(
+ parseWebsocket,
+ Parse.Error.INVALID_SESSION_TOKEN,
+ 'Invalid session token',
+ false,
+ request.requestId
+ );
+ return;
+ }
+ }
// Get subscription from subscriptions, create one if necessary
const subscriptionHash = queryHash(request.query);
// Add className to subscriptions if necessary
diff --git a/src/RestWrite.js b/src/RestWrite.js
index c1f7ca2a26..a651cf9c6c 100644
--- a/src/RestWrite.js
+++ b/src/RestWrite.js
@@ -1591,11 +1591,22 @@ RestWrite.prototype.sanitizedData = function () {
// Returns an updated copy of the object
RestWrite.prototype.buildUpdatedObject = function (extraData) {
+ const className = Parse.Object.fromJSON(extraData);
+ const readOnlyAttributes = className.constructor.readOnlyAttributes
+ ? className.constructor.readOnlyAttributes()
+ : [];
+ if (!this.originalData) {
+ for (const attribute of readOnlyAttributes) {
+ extraData[attribute] = this.data[attribute];
+ }
+ }
const updatedObject = triggers.inflate(extraData, this.originalData);
Object.keys(this.data).reduce(function (data, key) {
if (key.indexOf('.') > 0) {
if (typeof data[key].__op === 'string') {
- updatedObject.set(key, data[key]);
+ if (!readOnlyAttributes.includes(key)) {
+ updatedObject.set(key, data[key]);
+ }
} else {
// subdocument key with dot notation { 'x.y': v } => { 'x': { 'y' : v } })
const splittedKey = key.split('.');
@@ -1612,7 +1623,11 @@ RestWrite.prototype.buildUpdatedObject = function (extraData) {
return data;
}, deepcopy(this.data));
- updatedObject.set(this.sanitizedData());
+ const sanitized = this.sanitizedData();
+ for (const attribute of readOnlyAttributes) {
+ delete sanitized[attribute];
+ }
+ updatedObject.set(sanitized);
return updatedObject;
};
diff --git a/src/cloud-code/Parse.Cloud.js b/src/cloud-code/Parse.Cloud.js
index d16fe28ad4..5329a3eda2 100644
--- a/src/cloud-code/Parse.Cloud.js
+++ b/src/cloud-code/Parse.Cloud.js
@@ -6,13 +6,6 @@ function isParseObjectConstructor(object) {
return typeof object === 'function' && Object.prototype.hasOwnProperty.call(object, 'className');
}
-function getClassName(parseClass) {
- if (parseClass && parseClass.className) {
- return parseClass.className;
- }
- return parseClass;
-}
-
function validateValidator(validator) {
if (!validator || typeof validator === 'function') {
return;
@@ -161,7 +154,7 @@ ParseCloud.job = function (functionName, handler) {
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.TriggerRequest}, or a {@link Parse.Cloud.ValidatorObject}.
*/
ParseCloud.beforeSave = function (parseClass, handler, validationHandler) {
- var className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
validateValidator(validationHandler);
triggers.addTrigger(
triggers.Types.beforeSave,
@@ -197,7 +190,7 @@ ParseCloud.beforeSave = function (parseClass, handler, validationHandler) {
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.TriggerRequest}, or a {@link Parse.Cloud.ValidatorObject}.
*/
ParseCloud.beforeDelete = function (parseClass, handler, validationHandler) {
- var className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
validateValidator(validationHandler);
triggers.addTrigger(
triggers.Types.beforeDelete,
@@ -236,7 +229,7 @@ ParseCloud.beforeLogin = function (handler) {
if (typeof handler === 'string' || isParseObjectConstructor(handler)) {
// validation will occur downstream, this is to maintain internal
// code consistency with the other hook types.
- className = getClassName(handler);
+ className = triggers.getClassName(handler);
handler = arguments[1];
}
triggers.addTrigger(triggers.Types.beforeLogin, className, handler, Parse.applicationId);
@@ -266,7 +259,7 @@ ParseCloud.afterLogin = function (handler) {
if (typeof handler === 'string' || isParseObjectConstructor(handler)) {
// validation will occur downstream, this is to maintain internal
// code consistency with the other hook types.
- className = getClassName(handler);
+ className = triggers.getClassName(handler);
handler = arguments[1];
}
triggers.addTrigger(triggers.Types.afterLogin, className, handler, Parse.applicationId);
@@ -295,7 +288,7 @@ ParseCloud.afterLogout = function (handler) {
if (typeof handler === 'string' || isParseObjectConstructor(handler)) {
// validation will occur downstream, this is to maintain internal
// code consistency with the other hook types.
- className = getClassName(handler);
+ className = triggers.getClassName(handler);
handler = arguments[1];
}
triggers.addTrigger(triggers.Types.afterLogout, className, handler, Parse.applicationId);
@@ -327,7 +320,7 @@ ParseCloud.afterLogout = function (handler) {
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.TriggerRequest}, or a {@link Parse.Cloud.ValidatorObject}.
*/
ParseCloud.afterSave = function (parseClass, handler, validationHandler) {
- var className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
validateValidator(validationHandler);
triggers.addTrigger(
triggers.Types.afterSave,
@@ -363,7 +356,7 @@ ParseCloud.afterSave = function (parseClass, handler, validationHandler) {
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.TriggerRequest}, or a {@link Parse.Cloud.ValidatorObject}.
*/
ParseCloud.afterDelete = function (parseClass, handler, validationHandler) {
- var className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
validateValidator(validationHandler);
triggers.addTrigger(
triggers.Types.afterDelete,
@@ -399,7 +392,7 @@ ParseCloud.afterDelete = function (parseClass, handler, validationHandler) {
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.BeforeFindRequest}, or a {@link Parse.Cloud.ValidatorObject}.
*/
ParseCloud.beforeFind = function (parseClass, handler, validationHandler) {
- var className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
validateValidator(validationHandler);
triggers.addTrigger(
triggers.Types.beforeFind,
@@ -435,7 +428,7 @@ ParseCloud.beforeFind = function (parseClass, handler, validationHandler) {
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.AfterFindRequest}, or a {@link Parse.Cloud.ValidatorObject}.
*/
ParseCloud.afterFind = function (parseClass, handler, validationHandler) {
- const className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
validateValidator(validationHandler);
triggers.addTrigger(
triggers.Types.afterFind,
@@ -663,7 +656,7 @@ ParseCloud.sendEmail = function (data) {
*/
ParseCloud.beforeSubscribe = function (parseClass, handler, validationHandler) {
validateValidator(validationHandler);
- var className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
triggers.addTrigger(
triggers.Types.beforeSubscribe,
className,
@@ -701,7 +694,7 @@ ParseCloud.onLiveQueryEvent = function (handler) {
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.LiveQueryEventTrigger}, or a {@link Parse.Cloud.ValidatorObject}.
*/
ParseCloud.afterLiveQueryEvent = function (parseClass, handler, validationHandler) {
- const className = getClassName(parseClass);
+ const className = triggers.getClassName(parseClass);
validateValidator(validationHandler);
triggers.addTrigger(
triggers.Types.afterEvent,
diff --git a/src/triggers.js b/src/triggers.js
index cdd4353128..4d1cb5fba9 100644
--- a/src/triggers.js
+++ b/src/triggers.js
@@ -46,6 +46,13 @@ const baseStore = function () {
});
};
+export function getClassName(parseClass) {
+ if (parseClass && parseClass.className) {
+ return parseClass.className;
+ }
+ return parseClass;
+}
+
function validateClassNameForTriggers(className, type) {
if (type == Types.beforeSave && className === '_PushStatus') {
// _PushStatus uses undocumented nested key increment ops
From 197fcbda00affeef509ef95afde0fc54ec9be1d8 Mon Sep 17 00:00:00 2001
From: Brandon Scott
Date: Fri, 8 Oct 2021 16:44:40 -0400
Subject: [PATCH 25/96] refactor: modernize HTTPRequest tests (#7604)
---
CHANGELOG.md | 1 +
spec/HTTPRequest.spec.js | 196 +++++++++++++++++----------------------
2 files changed, 86 insertions(+), 111 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 42858f691a..9ba4f42830 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -157,6 +157,7 @@ ___
- Allow setting descending sort to full text queries (dblythy) [#7496](https://github.com/parse-community/parse-server/pull/7496)
- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
+- refactor: Modernize HTTPRequest tests (brandongregoryscott) [#7604](https://github.com/parse-community/parse-server/pull/7604)
- Allow liveQuery on Session class (Daniel Blyth) [#7554](https://github.com/parse-community/parse-server/pull/7554)
## 4.10.4
diff --git a/spec/HTTPRequest.spec.js b/spec/HTTPRequest.spec.js
index efd133a236..f218ff3c91 100644
--- a/spec/HTTPRequest.spec.js
+++ b/spec/HTTPRequest.spec.js
@@ -6,7 +6,7 @@ const httpRequest = require('../lib/cloud-code/httpRequest'),
express = require('express');
const port = 13371;
-const httpRequestServer = 'http://localhost:' + port;
+const httpRequestServer = `http://localhost:${port}`;
function startServer(done) {
const app = express();
@@ -51,167 +51,136 @@ describe('httpRequest', () => {
server.close(done);
});
- it('should do /hello', done => {
- httpRequest({
- url: httpRequestServer + '/hello',
- }).then(function (httpResponse) {
- expect(httpResponse.status).toBe(200);
- expect(httpResponse.buffer).toEqual(new Buffer('{"response":"OK"}'));
- expect(httpResponse.text).toEqual('{"response":"OK"}');
- expect(httpResponse.data.response).toEqual('OK');
- done();
- }, done.fail);
+ it('should do /hello', async () => {
+ const httpResponse = await httpRequest({
+ url: `${httpRequestServer}/hello`,
+ });
+
+ expect(httpResponse.status).toBe(200);
+ expect(httpResponse.buffer).toEqual(Buffer.from('{"response":"OK"}'));
+ expect(httpResponse.text).toEqual('{"response":"OK"}');
+ expect(httpResponse.data.response).toEqual('OK');
});
- it('should do not follow redirects by default', done => {
- httpRequest({
- url: httpRequestServer + '/301',
- }).then(function (httpResponse) {
- expect(httpResponse.status).toBe(301);
- done();
- }, done.fail);
+ it('should do not follow redirects by default', async () => {
+ const httpResponse = await httpRequest({
+ url: `${httpRequestServer}/301`,
+ });
+
+ expect(httpResponse.status).toBe(301);
});
- it('should follow redirects when set', done => {
- httpRequest({
- url: httpRequestServer + '/301',
+ it('should follow redirects when set', async () => {
+ const httpResponse = await httpRequest({
+ url: `${httpRequestServer}/301`,
followRedirects: true,
- }).then(function (httpResponse) {
- expect(httpResponse.status).toBe(200);
- expect(httpResponse.buffer).toEqual(new Buffer('{"response":"OK"}'));
- expect(httpResponse.text).toEqual('{"response":"OK"}');
- expect(httpResponse.data.response).toEqual('OK');
- done();
- }, done.fail);
+ });
+
+ expect(httpResponse.status).toBe(200);
+ expect(httpResponse.buffer).toEqual(Buffer.from('{"response":"OK"}'));
+ expect(httpResponse.text).toEqual('{"response":"OK"}');
+ expect(httpResponse.data.response).toEqual('OK');
});
- it('should fail on 404', done => {
- let calls = 0;
- httpRequest({
- url: httpRequestServer + '/404',
- }).then(
- function () {
- calls++;
- fail('should not succeed');
- done();
- },
- function (httpResponse) {
- calls++;
- expect(calls).toBe(1);
- expect(httpResponse.status).toBe(404);
- expect(httpResponse.buffer).toEqual(new Buffer('NO'));
- expect(httpResponse.text).toEqual('NO');
- expect(httpResponse.data).toBe(undefined);
- done();
- }
+ it('should fail on 404', async () => {
+ await expectAsync(
+ httpRequest({
+ url: `${httpRequestServer}/404`,
+ })
+ ).toBeRejectedWith(
+ jasmine.objectContaining({
+ status: 404,
+ buffer: Buffer.from('NO'),
+ text: 'NO',
+ data: undefined,
+ })
);
});
- it('should post on echo', done => {
- httpRequest({
+ it('should post on echo', async () => {
+ const httpResponse = await httpRequest({
method: 'POST',
- url: httpRequestServer + '/echo',
+ url: `${httpRequestServer}/echo`,
body: {
foo: 'bar',
},
headers: {
'Content-Type': 'application/json',
},
- }).then(
- function (httpResponse) {
- expect(httpResponse.status).toBe(200);
- expect(httpResponse.data).toEqual({ foo: 'bar' });
- done();
- },
- function () {
- fail('should not fail');
- done();
- }
- );
+ });
+
+ expect(httpResponse.status).toBe(200);
+ expect(httpResponse.data).toEqual({ foo: 'bar' });
});
- it('should encode a query string body by default', done => {
+ it('should encode a query string body by default', () => {
const options = {
body: { foo: 'bar' },
};
const result = httpRequest.encodeBody(options);
+
expect(result.body).toEqual('foo=bar');
expect(result.headers['Content-Type']).toEqual('application/x-www-form-urlencoded');
- done();
});
- it('should encode a JSON body', done => {
+ it('should encode a JSON body', () => {
const options = {
body: { foo: 'bar' },
headers: { 'Content-Type': 'application/json' },
};
const result = httpRequest.encodeBody(options);
+
expect(result.body).toEqual('{"foo":"bar"}');
- done();
});
- it('should encode a www-form body', done => {
+
+ it('should encode a www-form body', () => {
const options = {
body: { foo: 'bar', bar: 'baz' },
headers: { 'cOntent-tYpe': 'application/x-www-form-urlencoded' },
};
const result = httpRequest.encodeBody(options);
+
expect(result.body).toEqual('foo=bar&bar=baz');
- done();
});
- it('should not encode a wrong content type', done => {
+
+ it('should not encode a wrong content type', () => {
const options = {
body: { foo: 'bar', bar: 'baz' },
headers: { 'cOntent-tYpe': 'mime/jpeg' },
};
const result = httpRequest.encodeBody(options);
+
expect(result.body).toEqual({ foo: 'bar', bar: 'baz' });
- done();
});
- it('should fail gracefully', done => {
- httpRequest({
- url: 'http://not a good url',
- }).then(done.fail, function (error) {
- expect(error).not.toBeUndefined();
- expect(error).not.toBeNull();
- done();
- });
+ it('should fail gracefully', async () => {
+ await expectAsync(
+ httpRequest({
+ url: 'http://not a good url',
+ })
+ ).toBeRejected();
});
- it('should params object to query string', done => {
- httpRequest({
- url: httpRequestServer + '/qs',
+ it('should params object to query string', async () => {
+ const httpResponse = await httpRequest({
+ url: `${httpRequestServer}/qs`,
params: {
foo: 'bar',
},
- }).then(
- function (httpResponse) {
- expect(httpResponse.status).toBe(200);
- expect(httpResponse.data).toEqual({ foo: 'bar' });
- done();
- },
- function () {
- fail('should not fail');
- done();
- }
- );
+ });
+
+ expect(httpResponse.status).toBe(200);
+ expect(httpResponse.data).toEqual({ foo: 'bar' });
});
- it('should params string to query string', done => {
- httpRequest({
- url: httpRequestServer + '/qs',
+ it('should params string to query string', async () => {
+ const httpResponse = await httpRequest({
+ url: `${httpRequestServer}/qs`,
params: 'foo=bar&foo2=bar2',
- }).then(
- function (httpResponse) {
- expect(httpResponse.status).toBe(200);
- expect(httpResponse.data).toEqual({ foo: 'bar', foo2: 'bar2' });
- done();
- },
- function () {
- fail('should not fail');
- done();
- }
- );
+ });
+
+ expect(httpResponse.status).toBe(200);
+ expect(httpResponse.data).toEqual({ foo: 'bar', foo2: 'bar2' });
});
it('should not crash with undefined body', () => {
@@ -230,6 +199,7 @@ describe('httpRequest', () => {
const serialized = JSON.stringify(httpResponse);
const result = JSON.parse(serialized);
+
expect(result.text).toBe('hello');
expect(result.data).toBe(undefined);
expect(result.body).toBe(undefined);
@@ -251,43 +221,47 @@ describe('httpRequest', () => {
});
it('serialized httpResponse correctly with body buffer string', () => {
- const httpResponse = new HTTPResponse({}, new Buffer('hello'));
+ const httpResponse = new HTTPResponse({}, Buffer.from('hello'));
expect(httpResponse.text).toBe('hello');
expect(httpResponse.data).toBe(undefined);
const serialized = JSON.stringify(httpResponse);
const result = JSON.parse(serialized);
+
expect(result.text).toBe('hello');
expect(result.data).toBe(undefined);
});
it('serialized httpResponse correctly with body buffer JSON Object', () => {
const json = '{"foo":"bar"}';
- const httpResponse = new HTTPResponse({}, new Buffer(json));
+ const httpResponse = new HTTPResponse({}, Buffer.from(json));
const serialized = JSON.stringify(httpResponse);
const result = JSON.parse(serialized);
+
expect(result.text).toEqual('{"foo":"bar"}');
expect(result.data).toEqual({ foo: 'bar' });
});
it('serialized httpResponse with Parse._encode should be allright', () => {
const json = '{"foo":"bar"}';
- const httpResponse = new HTTPResponse({}, new Buffer(json));
+ const httpResponse = new HTTPResponse({}, Buffer.from(json));
const encoded = Parse._encode(httpResponse);
let foundData,
foundText,
foundBody = false;
+
for (const key in encoded) {
- if (key == 'data') {
+ if (key === 'data') {
foundData = true;
}
- if (key == 'text') {
+ if (key === 'text') {
foundText = true;
}
- if (key == 'body') {
+ if (key === 'body') {
foundBody = true;
}
}
+
expect(foundData).toBe(true);
expect(foundText).toBe(true);
expect(foundBody).toBe(false);
From 68a3a875017d545253f0438c5d4c1c2b6c6c3b22 Mon Sep 17 00:00:00 2001
From: dblythy
Date: Sat, 9 Oct 2021 11:34:09 +1100
Subject: [PATCH 26/96] fix: set objects in afterFind triggers (#7311)
---
CHANGELOG.md | 1 +
spec/CloudCode.spec.js | 47 +++++++++++++++++++++++++++
spec/ParseLiveQuery.spec.js | 38 ++++++++++++++++++++++
src/LiveQuery/ParseLiveQueryServer.js | 15 ++++-----
src/triggers.js | 29 +++++++++++++----
5 files changed, 115 insertions(+), 15 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9ba4f42830..19e4e61f1c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -154,6 +154,7 @@ ___
- Refactor: uniform issue templates across repos (Manuel Trezza) [#7528](https://github.com/parse-community/parse-server/pull/7528)
- ci: bump ci environment (Manuel Trezza) [#7539](https://github.com/parse-community/parse-server/pull/7539)
- CI now pushes docker images to Docker Hub (Corey Baker) [#7548](https://github.com/parse-community/parse-server/pull/7548)
+- Allow afterFind and afterLiveQueryEvent to set unsaved pointers and keys (dblythy) [#7310](https://github.com/parse-community/parse-server/pull/7310)
- Allow setting descending sort to full text queries (dblythy) [#7496](https://github.com/parse-community/parse-server/pull/7496)
- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index 07d94a366f..adace31078 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -2391,6 +2391,53 @@ describe('afterFind hooks', () => {
});
});
+ it('can set a pointer object in afterFind', async () => {
+ const obj = new Parse.Object('MyObject');
+ await obj.save();
+ Parse.Cloud.afterFind('MyObject', async ({ objects }) => {
+ const otherObject = new Parse.Object('Test');
+ otherObject.set('foo', 'bar');
+ await otherObject.save();
+ objects[0].set('Pointer', otherObject);
+ objects[0].set('xyz', 'yolo');
+ expect(objects[0].get('Pointer').get('foo')).toBe('bar');
+ });
+ const query = new Parse.Query('MyObject');
+ query.equalTo('objectId', obj.id);
+ const obj2 = await query.first();
+ expect(obj2.get('xyz')).toBe('yolo');
+ const pointer = obj2.get('Pointer');
+ expect(pointer.get('foo')).toBe('bar');
+ });
+
+ it('can set invalid object in afterFind', async () => {
+ const obj = new Parse.Object('MyObject');
+ await obj.save();
+ Parse.Cloud.afterFind('MyObject', () => [{}]);
+ const query = new Parse.Query('MyObject');
+ query.equalTo('objectId', obj.id);
+ const obj2 = await query.first();
+ expect(obj2).toBeDefined();
+ expect(obj2.toJSON()).toEqual({});
+ expect(obj2.id).toBeUndefined();
+ });
+
+ it('can return a unsaved object in afterFind', async () => {
+ const obj = new Parse.Object('MyObject');
+ await obj.save();
+ Parse.Cloud.afterFind('MyObject', async () => {
+ const otherObject = new Parse.Object('Test');
+ otherObject.set('foo', 'bar');
+ return [otherObject];
+ });
+ const query = new Parse.Query('MyObject');
+ const obj2 = await query.first();
+ expect(obj2.get('foo')).toEqual('bar');
+ expect(obj2.id).toBeUndefined();
+ await obj2.save();
+ expect(obj2.id).toBeDefined();
+ });
+
it('should have request headers', done => {
Parse.Cloud.afterFind('MyObject', req => {
expect(req.headers).toBeDefined();
diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js
index 2393467544..ab78a4cfa7 100644
--- a/spec/ParseLiveQuery.spec.js
+++ b/spec/ParseLiveQuery.spec.js
@@ -358,6 +358,44 @@ describe('ParseLiveQuery', function () {
await object.save();
});
+ it('can handle afterEvent set pointers', async done => {
+ await reconfigureServer({
+ liveQuery: {
+ classNames: ['TestObject'],
+ },
+ startLiveQueryServer: true,
+ verbose: false,
+ silent: true,
+ });
+
+ const object = new TestObject();
+ await object.save();
+
+ const secondObject = new Parse.Object('Test2');
+ secondObject.set('foo', 'bar');
+ await secondObject.save();
+
+ Parse.Cloud.afterLiveQueryEvent('TestObject', async ({ object }) => {
+ const query = new Parse.Query('Test2');
+ const obj = await query.first();
+ object.set('obj', obj);
+ });
+
+ const query = new Parse.Query(TestObject);
+ query.equalTo('objectId', object.id);
+ const subscription = await query.subscribe();
+ subscription.on('update', object => {
+ expect(object.get('obj')).toBeDefined();
+ expect(object.get('obj').get('foo')).toBe('bar');
+ done();
+ });
+ subscription.on('error', () => {
+ fail('error should not have been called.');
+ });
+ object.set({ foo: 'bar' });
+ await object.save();
+ });
+
it('can handle async afterEvent modification', async done => {
await reconfigureServer({
liveQuery: {
diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js
index 0091c459c0..1a7f830327 100644
--- a/src/LiveQuery/ParseLiveQueryServer.js
+++ b/src/LiveQuery/ParseLiveQueryServer.js
@@ -10,7 +10,7 @@ import { ParsePubSub } from './ParsePubSub';
import SchemaController from '../Controllers/SchemaController';
import _ from 'lodash';
import { v4 as uuidv4 } from 'uuid';
-import { runLiveQueryEventHandlers, getTrigger, runTrigger } from '../triggers';
+import { runLiveQueryEventHandlers, getTrigger, runTrigger, toJSONwithObjects } from '../triggers';
import { getAuthForSessionToken, Auth } from '../Auth';
import { getCacheController } from '../Controllers';
import LRU from 'lru-cache';
@@ -183,8 +183,7 @@ class ParseLiveQueryServer {
return;
}
if (res.object && typeof res.object.toJSON === 'function') {
- deletedParseObject = res.object.toJSON();
- deletedParseObject.className = className;
+ deletedParseObject = toJSONwithObjects(res.object, res.object.className || className);
}
if (
(deletedParseObject.className === '_User' ||
@@ -337,13 +336,13 @@ class ParseLiveQueryServer {
return;
}
if (res.object && typeof res.object.toJSON === 'function') {
- currentParseObject = res.object.toJSON();
- currentParseObject.className = res.object.className || className;
+ currentParseObject = toJSONwithObjects(res.object, res.object.className || className);
}
-
if (res.original && typeof res.original.toJSON === 'function') {
- originalParseObject = res.original.toJSON();
- originalParseObject.className = res.original.className || className;
+ originalParseObject = toJSONwithObjects(
+ res.original,
+ res.original.className || className
+ );
}
if (
(currentParseObject.className === '_User' ||
diff --git a/src/triggers.js b/src/triggers.js
index 4d1cb5fba9..8320b5fb74 100644
--- a/src/triggers.js
+++ b/src/triggers.js
@@ -168,6 +168,27 @@ export function _unregisterAll() {
Object.keys(_triggerStore).forEach(appId => delete _triggerStore[appId]);
}
+export function toJSONwithObjects(object, className) {
+ if (!object || !object.toJSON) {
+ return {};
+ }
+ const toJSON = object.toJSON();
+ const stateController = Parse.CoreManager.getObjectStateController();
+ const [pending] = stateController.getPendingOps(object._getStateIdentifier());
+ for (const key in pending) {
+ const val = object.get(key);
+ if (!val || !val._toFullJSON) {
+ toJSON[key] = val;
+ continue;
+ }
+ toJSON[key] = val._toFullJSON();
+ }
+ if (className) {
+ toJSON.className = className;
+ }
+ return toJSON;
+}
+
export function getTrigger(className, triggerType, applicationId) {
if (!applicationId) {
throw 'Missing ApplicationID';
@@ -323,7 +344,7 @@ export function getResponseObject(request, resolve, reject) {
response = request.objects;
}
response = response.map(object => {
- return object.toJSON();
+ return toJSONwithObjects(object);
});
return resolve(response);
}
@@ -451,12 +472,6 @@ export function maybeRunAfterFindTrigger(
const response = trigger(request);
if (response && typeof response.then === 'function') {
return response.then(results => {
- if (!results) {
- throw new Parse.Error(
- Parse.Error.SCRIPT_FAILED,
- 'AfterFind expect results to be returned in the promise'
- );
- }
return results;
});
}
From ab1dddd406589800e1a8ebe8381b9da702e9c641 Mon Sep 17 00:00:00 2001
From: dblythy
Date: Sat, 9 Oct 2021 14:04:12 +1100
Subject: [PATCH 27/96] fix: add deprecation warning for
`Parse.Cloud.httpRequest` (#7595)
---
CHANGELOG.md | 1 +
DEPRECATIONS.md | 1 +
spec/CloudCode.spec.js | 19 +++++++++++++++++++
src/cloud-code/Parse.Cloud.js | 10 +++++++++-
4 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19e4e61f1c..587ed9453b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -158,6 +158,7 @@ ___
- Allow setting descending sort to full text queries (dblythy) [#7496](https://github.com/parse-community/parse-server/pull/7496)
- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
+- refactor: deprecate `Parse.Cloud.httpRequest`; it is recommended to use a HTTP library instead. (Daniel Blyth) [#7595](https://github.com/parse-community/parse-server/pull/7595)
- refactor: Modernize HTTPRequest tests (brandongregoryscott) [#7604](https://github.com/parse-community/parse-server/pull/7604)
- Allow liveQuery on Session class (Daniel Blyth) [#7554](https://github.com/parse-community/parse-server/pull/7554)
diff --git a/DEPRECATIONS.md b/DEPRECATIONS.md
index 05ef29bc75..dc913dd0e7 100644
--- a/DEPRECATIONS.md
+++ b/DEPRECATIONS.md
@@ -7,6 +7,7 @@ The following is a list of deprecations, according to the [Deprecation Policy](h
| DEPPS1 | Native MongoDB syntax in aggregation pipeline | [#7338](https://github.com/parse-community/parse-server/issues/7338) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
| DEPPS2 | Config option `directAccess` defaults to `true` | [#6636](https://github.com/parse-community/parse-server/pull/6636) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
| DEPPS3 | Config option `enforcePrivateUsers` defaults to `true` | [#7319](https://github.com/parse-community/parse-server/pull/7319) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
+| DEPPS4 | Remove convenience method for http request `Parse.Cloud.httpRequest` | [#7589](https://github.com/parse-community/parse-server/pull/7589) | 5.0.0 (2022) | 6.0.0 (2023) | deprecated | - |
[i_deprecation]: ## "The version and date of the deprecation."
[i_removal]: ## "The version and date of the planned removal."
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index adace31078..fb9d3aedd7 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -1554,6 +1554,25 @@ describe('Cloud Code', () => {
obj.save().then(done, done.fail);
});
+ it('can deprecate Parse.Cloud.httpRequest', async () => {
+ const logger = require('../lib/logger').logger;
+ spyOn(logger, 'warn').and.callFake(() => {});
+ Parse.Cloud.define('hello', () => {
+ return 'Hello world!';
+ });
+ await Parse.Cloud.httpRequest({
+ method: 'POST',
+ url: 'http://localhost:8378/1/functions/hello',
+ headers: {
+ 'X-Parse-Application-Id': Parse.applicationId,
+ 'X-Parse-REST-API-Key': 'rest',
+ },
+ });
+ expect(logger.warn).toHaveBeenCalledWith(
+ 'DeprecationWarning: Parse.Cloud.httpRequest is deprecated and will be removed in a future version. Use a http request library instead.'
+ );
+ });
+
describe('cloud jobs', () => {
it('should define a job', done => {
expect(() => {
diff --git a/src/cloud-code/Parse.Cloud.js b/src/cloud-code/Parse.Cloud.js
index 5329a3eda2..9fb437cada 100644
--- a/src/cloud-code/Parse.Cloud.js
+++ b/src/cloud-code/Parse.Cloud.js
@@ -1,5 +1,6 @@
import { Parse } from 'parse/node';
import * as triggers from '../triggers';
+import Deprecator from '../Deprecator/Deprecator';
const Config = require('../Config');
function isParseObjectConstructor(object) {
@@ -716,7 +717,14 @@ ParseCloud.useMasterKey = () => {
);
};
-ParseCloud.httpRequest = require('./httpRequest');
+const request = require('./httpRequest');
+ParseCloud.httpRequest = opts => {
+ Deprecator.logRuntimeDeprecation({
+ usage: 'Parse.Cloud.httpRequest',
+ solution: 'Use a http request library instead.',
+ });
+ return request(opts);
+};
module.exports = ParseCloud;
From 90b18bcccfebb579a3265c21647050752b0b3cc3 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Sun, 10 Oct 2021 20:11:33 +0200
Subject: [PATCH 28/96] docs: update contribution merge guide (#7611)
---
CONTRIBUTING.md | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 207560b544..fb444414b4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -19,8 +19,9 @@
- [Wording Guideline](#wording-guideline)
- [Parse Error](#parse-error)
- [Parse Server Configuration](#parse-server-configuration)
-- [Commit Message](#commit-message)
+- [Pull Request](#pull-request)
- [Breaking Change](#breaking-change)
+- [Merging](#merging)
- [Code of Conduct](#code-of-conduct)
## Contributing
@@ -290,7 +291,7 @@ Introducing new [Parse Server configuration][config] parameters requires the fol
5. Add test cases to ensure the correct parameter value validation. Parse Server throws an error at launch if an invalid value is set for any configuration parameter.
6. Execute `npm run docs` to generate the documentation in the `/out` directory. Take a look at the documentation whether the description and formatting of the newly introduced parameters is satisfactory.
-## Commit Message
+## Pull Request
For release automation, the title of pull requests needs to be written in a defined syntax. We loosely follow the [Conventional Commits](https://www.conventionalcommits.org) specification, which defines this syntax:
@@ -325,19 +326,23 @@ Currently, we are not making use of the commit _scope_, which would be written a
### Breaking Change
-If a pull request contains a braking change, the description of the pull request must contain a special chapter at the bottom.
+If a pull request contains a braking change, the description of the pull request must contain a dedicated chapter at the bottom to indicate this. This is to assist the committer of the pull request to avoid merging a breaking change as non-breaking.
-The chapter consists of the phrase `BREAKING CHANGE`, capitalized, in a single line without any formatting. It must be followed by an empty line, then a short description of the breaking change, and ideally how the developer should address it. This chapter should contain more details focusing on the "breaking” aspect of the change, as it is intended to assist the developer in adapting their deployment. However, keep it concise, as it will also become part of the changelog entry.
+## Merging
-For example:
-
-```
-Detailed pull request description...
+The following guide is for anyone who merges a contributor pull request into the working branch, the working branch into a release branch, a release branch into another release branch, or any other direct commits such as hotfixes into release branches or the working branch.
-BREAKING CHANGE
+- For changelog generation, only the commit message set when merging the pull request is relevant. The title and description of the GitHub pull request as authored by the contributor have no influence on the changelog generation. However, the title of the GitHub pull request should be used as the commit message.
+- If the pull request contains a breaking change, the commit message must contain the phrase `BREAKING CHANGE`, capitalized and without any formatting, followed by a short description of the breaking change and ideally how the developer should address it, all in a single line. This line should contain more details focusing on the "breaking” aspect of the change and is intended to assist the developer in adapting. Keep it concise, as it will become part of the changelog entry, for example:
-The door handle has be pulled up to open the door, not down. Adjust your habits accordingly by walking on your hands.
-```
+ ```
+ fix: remove handle from door
+
+ BREAKING CHANGE: You cannot open the door anymore by using a handle. See the [#migration guide](http://example.com) for more details.
+ ```
+ Keep in mind that in a repository with release automation, merging such a commit message will trigger a release with a major version increment.
+- A contributor pull request must be merged into the working branch using `Squash and Merge`, to create a single commit message that describes the change.
+- A release branch or the default branch must be merged into another release branch using `Merge Commit`, to preserve each individual commit message that describes its respective change.
## Code of Conduct
From 85ef7217b04e36395e46316004293e9c8ca67df9 Mon Sep 17 00:00:00 2001
From: Antoine Cormouls
Date: Mon, 11 Oct 2021 14:51:28 +0200
Subject: [PATCH 29/96] feat: alphabetical graphql api, fix internal reassign,
enhanced Graphql schema cache system (#7344)
---
CHANGELOG.md | 1 +
spec/ParseGraphQLSchema.spec.js | 8 +-
spec/ParseGraphQLServer.spec.js | 94 ++++++++++++
src/GraphQL/ParseGraphQLSchema.js | 162 +++++++++++++--------
src/GraphQL/loaders/functionsMutations.js | 3 +-
src/GraphQL/loaders/parseClassMutations.js | 7 +-
src/GraphQL/loaders/parseClassQueries.js | 6 +-
src/GraphQL/loaders/schemaMutations.js | 7 +-
src/GraphQL/loaders/schemaQueries.js | 3 +-
src/GraphQL/loaders/usersMutations.js | 7 +-
10 files changed, 220 insertions(+), 78 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 587ed9453b..43feb28fe6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -108,6 +108,7 @@ ___
- ci: add node engine version check (Manuel Trezza) [#7574](https://github.com/parse-community/parse-server/pull/7574)
### Notable Changes
+- Alphabetical ordered GraphQL API, improved GraphQL Schema cache system and fix GraphQL input reassign issue (Moumouls) [#7344](https://github.com/parse-community/parse-server/issues/7344)
- Added Parse Server Security Check to report weak security settings (Manuel Trezza, dblythy) [#7247](https://github.com/parse-community/parse-server/issues/7247)
- EXPERIMENTAL: Added new page router with placeholder rendering and localization of custom and feature pages such as password reset and email verification (Manuel Trezza) [#7128](https://github.com/parse-community/parse-server/pull/7128)
- EXPERIMENTAL: Added custom routes to easily customize flows for password reset, email verification or build entirely new flows (Manuel Trezza) [#7231](https://github.com/parse-community/parse-server/pull/7231)
diff --git a/spec/ParseGraphQLSchema.spec.js b/spec/ParseGraphQLSchema.spec.js
index 67472d6e91..a06a230f6a 100644
--- a/spec/ParseGraphQLSchema.spec.js
+++ b/spec/ParseGraphQLSchema.spec.js
@@ -57,7 +57,7 @@ describe('ParseGraphQLSchema', () => {
it('should load a brand new GraphQL Schema if Parse Schema changes', async () => {
await parseGraphQLSchema.load();
const parseClasses = parseGraphQLSchema.parseClasses;
- const parseClassesString = parseGraphQLSchema.parseClassesString;
+ const parseCachedClasses = parseGraphQLSchema.parseCachedClasses;
const parseClassTypes = parseGraphQLSchema.parseClassTypes;
const graphQLSchema = parseGraphQLSchema.graphQLSchema;
const graphQLTypes = parseGraphQLSchema.graphQLTypes;
@@ -70,7 +70,7 @@ describe('ParseGraphQLSchema', () => {
await new Promise(resolve => setTimeout(resolve, 200));
await parseGraphQLSchema.load();
expect(parseClasses).not.toBe(parseGraphQLSchema.parseClasses);
- expect(parseClassesString).not.toBe(parseGraphQLSchema.parseClassesString);
+ expect(parseCachedClasses).not.toBe(parseGraphQLSchema.parseCachedClasses);
expect(parseClassTypes).not.toBe(parseGraphQLSchema.parseClassTypes);
expect(graphQLSchema).not.toBe(parseGraphQLSchema.graphQLSchema);
expect(graphQLTypes).not.toBe(parseGraphQLSchema.graphQLTypes);
@@ -94,7 +94,7 @@ describe('ParseGraphQLSchema', () => {
});
await parseGraphQLSchema.load();
const parseClasses = parseGraphQLSchema.parseClasses;
- const parseClassesString = parseGraphQLSchema.parseClassesString;
+ const parseCachedClasses = parseGraphQLSchema.parseCachedClasses;
const parseClassTypes = parseGraphQLSchema.parseClassTypes;
const graphQLSchema = parseGraphQLSchema.graphQLSchema;
const graphQLTypes = parseGraphQLSchema.graphQLTypes;
@@ -109,7 +109,7 @@ describe('ParseGraphQLSchema', () => {
await new Promise(resolve => setTimeout(resolve, 200));
await parseGraphQLSchema.load();
expect(parseClasses).not.toBe(parseGraphQLSchema.parseClasses);
- expect(parseClassesString).not.toBe(parseGraphQLSchema.parseClassesString);
+ expect(parseCachedClasses).not.toBe(parseGraphQLSchema.parseCachedClasses);
expect(parseClassTypes).not.toBe(parseGraphQLSchema.parseClassTypes);
expect(graphQLSchema).not.toBe(parseGraphQLSchema.graphQLSchema);
expect(graphQLTypes).not.toBe(parseGraphQLSchema.graphQLTypes);
diff --git a/spec/ParseGraphQLServer.spec.js b/spec/ParseGraphQLServer.spec.js
index b8673cbe22..6d401cb3c4 100644
--- a/spec/ParseGraphQLServer.spec.js
+++ b/spec/ParseGraphQLServer.spec.js
@@ -25,6 +25,7 @@ const {
GraphQLEnumType,
GraphQLInputObjectType,
GraphQLSchema,
+ GraphQLList,
} = require('graphql');
const { ParseServer } = require('../');
const { ParseGraphQLServer } = require('../lib/GraphQL/ParseGraphQLServer');
@@ -10341,6 +10342,18 @@ describe('ParseGraphQLServer', () => {
robot: { value: 'robot' },
},
});
+ const TypeEnumWhereInput = new GraphQLInputObjectType({
+ name: 'TypeEnumWhereInput',
+ fields: {
+ equalTo: { type: TypeEnum },
+ },
+ });
+ const SomeClass2WhereInput = new GraphQLInputObjectType({
+ name: 'SomeClass2WhereInput',
+ fields: {
+ type: { type: TypeEnumWhereInput },
+ },
+ });
const SomeClassType = new GraphQLObjectType({
name: 'SomeClass',
fields: {
@@ -10386,6 +10399,18 @@ describe('ParseGraphQLServer', () => {
return obj.toJSON();
},
},
+ customQueryWithAutoTypeReturnList: {
+ type: new GraphQLList(SomeClassType),
+ args: {
+ id: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (p, { id }) => {
+ const obj = new Parse.Object('SomeClass');
+ obj.id = id;
+ await obj.fetch();
+ return [obj.toJSON(), obj.toJSON(), obj.toJSON()];
+ },
+ },
},
}),
types: [
@@ -10401,7 +10426,17 @@ describe('ParseGraphQLServer', () => {
type: { type: TypeEnum },
},
}),
+ // Enhanced where input with a extended enum
+ new GraphQLInputObjectType({
+ name: 'SomeClassWhereInput',
+ fields: {
+ type: {
+ type: TypeEnumWhereInput,
+ },
+ },
+ }),
SomeClassType,
+ SomeClass2WhereInput,
],
}),
});
@@ -10463,6 +10498,65 @@ describe('ParseGraphQLServer', () => {
expect(result.data.customQueryWithAutoTypeReturn.type).toEqual('robot');
});
+ it('can resolve a custom query with auto type list return', async () => {
+ const obj = new Parse.Object('SomeClass');
+ await obj.save({ name: 'aname', type: 'robot' });
+ await parseGraphQLServer.parseGraphQLSchema.schemaCache.clear();
+ const result = await apolloClient.query({
+ variables: { id: obj.id },
+ query: gql`
+ query CustomQuery($id: String!) {
+ customQueryWithAutoTypeReturnList(id: $id) {
+ id
+ objectId
+ nameUpperCase
+ name
+ type
+ }
+ }
+ `,
+ });
+ result.data.customQueryWithAutoTypeReturnList.forEach(rObj => {
+ expect(rObj.objectId).toBeDefined();
+ expect(rObj.objectId).toEqual(obj.id);
+ expect(rObj.name).toEqual('aname');
+ expect(rObj.nameUpperCase).toEqual('ANAME');
+ expect(rObj.type).toEqual('robot');
+ });
+ });
+
+ it('can resolve a stacked query with same where variables on overloaded where input', async () => {
+ const objPointer = new Parse.Object('SomeClass2');
+ await objPointer.save({ name: 'aname', type: 'robot' });
+ const obj = new Parse.Object('SomeClass');
+ await obj.save({ name: 'aname', type: 'robot', pointer: objPointer });
+ await parseGraphQLServer.parseGraphQLSchema.schemaCache.clear();
+ const result = await apolloClient.query({
+ variables: { where: { OR: [{ pointer: { have: { objectId: { exists: true } } } }] } },
+ query: gql`
+ query someQuery($where: SomeClassWhereInput!) {
+ q1: someClasses(where: $where) {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+ q2: someClasses(where: $where) {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+ }
+ `,
+ });
+ expect(result.data.q1.edges.length).toEqual(1);
+ expect(result.data.q2.edges.length).toEqual(1);
+ expect(result.data.q1.edges[0].node.id).toEqual(result.data.q2.edges[0].node.id);
+ });
+
it('can resolve a custom extend type', async () => {
const obj = new Parse.Object('SomeClass');
await obj.save({ name: 'aname', type: 'robot' });
diff --git a/src/GraphQL/ParseGraphQLSchema.js b/src/GraphQL/ParseGraphQLSchema.js
index d194a40ce5..011905ca2d 100644
--- a/src/GraphQL/ParseGraphQLSchema.js
+++ b/src/GraphQL/ParseGraphQLSchema.js
@@ -1,6 +1,7 @@
import Parse from 'parse/node';
import { GraphQLSchema, GraphQLObjectType, DocumentNode, GraphQLNamedType } from 'graphql';
import { stitchSchemas } from '@graphql-tools/stitch';
+import { isDeepStrictEqual } from 'util';
import { SchemaDirectiveVisitor } from '@graphql-tools/utils';
import requiredParameter from '../requiredParameter';
import * as defaultGraphQLTypes from './loaders/defaultGraphQLTypes';
@@ -93,15 +94,12 @@ class ParseGraphQLSchema {
async load() {
const { parseGraphQLConfig } = await this._initializeSchemaAndConfig();
const parseClasses = await this._getClassesForSchema(parseGraphQLConfig);
- const parseClassesString = JSON.stringify(parseClasses);
const functionNames = await this._getFunctionNames();
const functionNamesString = JSON.stringify(functionNames);
if (
- this.graphQLSchema &&
!this._hasSchemaInputChanged({
parseClasses,
- parseClassesString,
parseGraphQLConfig,
functionNamesString,
})
@@ -110,7 +108,6 @@ class ParseGraphQLSchema {
}
this.parseClasses = parseClasses;
- this.parseClassesString = parseClassesString;
this.parseGraphQLConfig = parseGraphQLConfig;
this.functionNames = functionNames;
this.functionNamesString = functionNamesString;
@@ -132,6 +129,26 @@ class ParseGraphQLSchema {
this._getParseClassesWithConfig(parseClasses, parseGraphQLConfig).forEach(
([parseClass, parseClassConfig]) => {
+ // Some times schema return the _auth_data_ field
+ // it will lead to unstable graphql generation order
+ if (parseClass.className === '_User') {
+ Object.keys(parseClass.fields).forEach(fieldName => {
+ if (fieldName.startsWith('_auth_data_')) {
+ delete parseClass.fields[fieldName];
+ }
+ });
+ }
+
+ // Fields order inside the schema seems to not be consistent across
+ // restart so we need to ensure an alphabetical order
+ // also it's better for the playground documentation
+ const orderedFields = {};
+ Object.keys(parseClass.fields)
+ .sort()
+ .forEach(fieldName => {
+ orderedFields[fieldName] = parseClass.fields[fieldName];
+ });
+ parseClass.fields = orderedFields;
parseClassTypes.load(this, parseClass, parseClassConfig);
parseClassQueries.load(this, parseClass, parseClassConfig);
parseClassMutations.load(this, parseClass, parseClassConfig);
@@ -183,16 +200,17 @@ class ParseGraphQLSchema {
schemaDirectives.load(this);
if (typeof this.graphQLCustomTypeDefs.getTypeMap === 'function') {
- const customGraphQLSchemaTypeMap = this.graphQLCustomTypeDefs.getTypeMap();
+ // In following code we use underscore attr to avoid js var un ref
+ const customGraphQLSchemaTypeMap = this.graphQLCustomTypeDefs._typeMap;
const findAndReplaceLastType = (parent, key) => {
if (parent[key].name) {
if (
- this.graphQLAutoSchema.getType(parent[key].name) &&
- this.graphQLAutoSchema.getType(parent[key].name) !== parent[key]
+ this.graphQLAutoSchema._typeMap[parent[key].name] &&
+ this.graphQLAutoSchema._typeMap[parent[key].name] !== parent[key]
) {
// To avoid unresolved field on overloaded schema
// replace the final type with the auto schema one
- parent[key] = this.graphQLAutoSchema.getType(parent[key].name);
+ parent[key] = this.graphQLAutoSchema._typeMap[parent[key].name];
}
} else {
if (parent[key].ofType) {
@@ -200,47 +218,59 @@ class ParseGraphQLSchema {
}
}
};
- Object.values(customGraphQLSchemaTypeMap).forEach(customGraphQLSchemaType => {
- if (
- !customGraphQLSchemaType ||
- !customGraphQLSchemaType.name ||
- customGraphQLSchemaType.name.startsWith('__')
- ) {
- return;
- }
- const autoGraphQLSchemaType = this.graphQLAutoSchema.getType(
- customGraphQLSchemaType.name
- );
- if (!autoGraphQLSchemaType) {
- this.graphQLAutoSchema._typeMap[customGraphQLSchemaType.name] = customGraphQLSchemaType;
- }
- });
- Object.values(customGraphQLSchemaTypeMap).forEach(customGraphQLSchemaType => {
- if (
- !customGraphQLSchemaType ||
- !customGraphQLSchemaType.name ||
- customGraphQLSchemaType.name.startsWith('__')
- ) {
- return;
- }
- const autoGraphQLSchemaType = this.graphQLAutoSchema.getType(
- customGraphQLSchemaType.name
- );
-
- if (autoGraphQLSchemaType && typeof customGraphQLSchemaType.getFields === 'function') {
- Object.values(customGraphQLSchemaType.getFields()).forEach(field => {
- findAndReplaceLastType(field, 'type');
- });
- autoGraphQLSchemaType._fields = {
- ...autoGraphQLSchemaType.getFields(),
- ...customGraphQLSchemaType.getFields(),
- };
- }
- });
- this.graphQLSchema = stitchSchemas({
- schemas: [this.graphQLSchemaDirectivesDefinitions, this.graphQLAutoSchema],
- mergeDirectives: true,
- });
+ // Add non shared types from custom schema to auto schema
+ // note: some non shared types can use some shared types
+ // so this code need to be ran before the shared types addition
+ // we use sort to ensure schema consistency over restarts
+ Object.keys(customGraphQLSchemaTypeMap)
+ .sort()
+ .forEach(customGraphQLSchemaTypeKey => {
+ const customGraphQLSchemaType = customGraphQLSchemaTypeMap[customGraphQLSchemaTypeKey];
+ if (
+ !customGraphQLSchemaType ||
+ !customGraphQLSchemaType.name ||
+ customGraphQLSchemaType.name.startsWith('__')
+ ) {
+ return;
+ }
+ const autoGraphQLSchemaType = this.graphQLAutoSchema._typeMap[
+ customGraphQLSchemaType.name
+ ];
+ if (!autoGraphQLSchemaType) {
+ this.graphQLAutoSchema._typeMap[
+ customGraphQLSchemaType.name
+ ] = customGraphQLSchemaType;
+ }
+ });
+ // Handle shared types
+ // We pass through each type and ensure that all sub field types are replaced
+ // we use sort to ensure schema consistency over restarts
+ Object.keys(customGraphQLSchemaTypeMap)
+ .sort()
+ .forEach(customGraphQLSchemaTypeKey => {
+ const customGraphQLSchemaType = customGraphQLSchemaTypeMap[customGraphQLSchemaTypeKey];
+ if (
+ !customGraphQLSchemaType ||
+ !customGraphQLSchemaType.name ||
+ customGraphQLSchemaType.name.startsWith('__')
+ ) {
+ return;
+ }
+ const autoGraphQLSchemaType = this.graphQLAutoSchema._typeMap[
+ customGraphQLSchemaType.name
+ ];
+
+ if (autoGraphQLSchemaType && typeof customGraphQLSchemaType.getFields === 'function') {
+ Object.keys(customGraphQLSchemaType._fields)
+ .sort()
+ .forEach(fieldKey => {
+ const field = customGraphQLSchemaType._fields[fieldKey];
+ findAndReplaceLastType(field, 'type');
+ autoGraphQLSchemaType._fields[field.name] = field;
+ });
+ }
+ });
+ this.graphQLSchema = this.graphQLAutoSchema;
} else if (typeof this.graphQLCustomTypeDefs === 'function') {
this.graphQLSchema = await this.graphQLCustomTypeDefs({
directivesDefinitionsSchema: this.graphQLSchemaDirectivesDefinitions,
@@ -258,6 +288,7 @@ class ParseGraphQLSchema {
});
}
+ // Only merge directive when string schema provided
const graphQLSchemaTypeMap = this.graphQLSchema.getTypeMap();
Object.keys(graphQLSchemaTypeMap).forEach(graphQLSchemaTypeName => {
const graphQLSchemaType = graphQLSchemaTypeMap[graphQLSchemaTypeName];
@@ -463,26 +494,35 @@ class ParseGraphQLSchema {
*/
_hasSchemaInputChanged(params: {
parseClasses: any,
- parseClassesString: string,
parseGraphQLConfig: ?ParseGraphQLConfig,
functionNamesString: string,
}): boolean {
- const { parseClasses, parseClassesString, parseGraphQLConfig, functionNamesString } = params;
+ const { parseClasses, parseGraphQLConfig, functionNamesString } = params;
+
+ // First init
+ if (!this.parseCachedClasses || !this.graphQLSchema) {
+ const thisParseClassesObj = parseClasses.reduce((acc, clzz) => {
+ acc[clzz.className] = clzz;
+ return acc;
+ }, {});
+ this.parseCachedClasses = thisParseClassesObj;
+ return true;
+ }
+
+ const newParseCachedClasses = parseClasses.reduce((acc, clzz) => {
+ acc[clzz.className] = clzz;
+ return acc;
+ }, {});
if (
- JSON.stringify(this.parseGraphQLConfig) === JSON.stringify(parseGraphQLConfig) &&
- this.functionNamesString === functionNamesString
+ isDeepStrictEqual(this.parseGraphQLConfig, parseGraphQLConfig) &&
+ this.functionNamesString === functionNamesString &&
+ isDeepStrictEqual(this.parseCachedClasses, newParseCachedClasses)
) {
- if (this.parseClasses === parseClasses) {
- return false;
- }
-
- if (this.parseClassesString === parseClassesString) {
- this.parseClasses = parseClasses;
- return false;
- }
+ return false;
}
+ this.parseCachedClasses = newParseCachedClasses;
return true;
}
}
diff --git a/src/GraphQL/loaders/functionsMutations.js b/src/GraphQL/loaders/functionsMutations.js
index 0722ca9378..8eae5b2072 100644
--- a/src/GraphQL/loaders/functionsMutations.js
+++ b/src/GraphQL/loaders/functionsMutations.js
@@ -1,4 +1,5 @@
import { GraphQLNonNull, GraphQLEnumType } from 'graphql';
+import deepcopy from 'deepcopy';
import { mutationWithClientMutationId } from 'graphql-relay';
import { FunctionsRouter } from '../../Routers/FunctionsRouter';
import * as defaultGraphQLTypes from './defaultGraphQLTypes';
@@ -43,7 +44,7 @@ const load = parseGraphQLSchema => {
},
mutateAndGetPayload: async (args, context) => {
try {
- const { functionName, params } = args;
+ const { functionName, params } = deepcopy(args);
const { config, auth, info } = context;
return {
diff --git a/src/GraphQL/loaders/parseClassMutations.js b/src/GraphQL/loaders/parseClassMutations.js
index 2ef41eccbd..0ebca5b077 100644
--- a/src/GraphQL/loaders/parseClassMutations.js
+++ b/src/GraphQL/loaders/parseClassMutations.js
@@ -1,6 +1,7 @@
import { GraphQLNonNull } from 'graphql';
import { fromGlobalId, mutationWithClientMutationId } from 'graphql-relay';
import getFieldNames from 'graphql-list-fields';
+import deepcopy from 'deepcopy';
import * as defaultGraphQLTypes from './defaultGraphQLTypes';
import { extractKeysAndInclude, getParseClassMutationConfig } from '../parseGraphQLUtils';
import * as objectsMutations from '../helpers/objectsMutations';
@@ -66,7 +67,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
},
mutateAndGetPayload: async (args, context, mutationInfo) => {
try {
- let { fields } = args;
+ let { fields } = deepcopy(args);
if (!fields) fields = {};
const { config, auth, info } = context;
@@ -168,7 +169,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
},
mutateAndGetPayload: async (args, context, mutationInfo) => {
try {
- let { id, fields } = args;
+ let { id, fields } = deepcopy(args);
if (!fields) fields = {};
const { config, auth, info } = context;
@@ -273,7 +274,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
},
mutateAndGetPayload: async (args, context, mutationInfo) => {
try {
- let { id } = args;
+ let { id } = deepcopy(args);
const { config, auth, info } = context;
const globalIdObject = fromGlobalId(id);
diff --git a/src/GraphQL/loaders/parseClassQueries.js b/src/GraphQL/loaders/parseClassQueries.js
index f0a855103d..edf210ace3 100644
--- a/src/GraphQL/loaders/parseClassQueries.js
+++ b/src/GraphQL/loaders/parseClassQueries.js
@@ -1,6 +1,7 @@
import { GraphQLNonNull } from 'graphql';
import { fromGlobalId } from 'graphql-relay';
import getFieldNames from 'graphql-list-fields';
+import deepcopy from 'deepcopy';
import pluralize from 'pluralize';
import * as defaultGraphQLTypes from './defaultGraphQLTypes';
import * as objectsQueries from '../helpers/objectsQueries';
@@ -74,7 +75,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
return await getQuery(
parseClass,
_source,
- args,
+ deepcopy(args),
context,
queryInfo,
parseGraphQLSchema.parseClasses
@@ -97,7 +98,8 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
type: new GraphQLNonNull(classGraphQLFindResultType || defaultGraphQLTypes.OBJECT),
async resolve(_source, args, context, queryInfo) {
try {
- const { where, order, skip, first, after, last, before, options } = args;
+ // Deep copy args to avoid internal re assign issue
+ const { where, order, skip, first, after, last, before, options } = deepcopy(args);
const { readPreference, includeReadPreference, subqueryReadPreference } = options || {};
const { config, auth, info } = context;
const selectedFields = getFieldNames(queryInfo);
diff --git a/src/GraphQL/loaders/schemaMutations.js b/src/GraphQL/loaders/schemaMutations.js
index 89798f9784..ffb4d6523b 100644
--- a/src/GraphQL/loaders/schemaMutations.js
+++ b/src/GraphQL/loaders/schemaMutations.js
@@ -1,5 +1,6 @@
import Parse from 'parse/node';
import { GraphQLNonNull } from 'graphql';
+import deepcopy from 'deepcopy';
import { mutationWithClientMutationId } from 'graphql-relay';
import * as schemaTypes from './schemaTypes';
import { transformToParse, transformToGraphQL } from '../transformers/schemaFields';
@@ -26,7 +27,7 @@ const load = parseGraphQLSchema => {
},
mutateAndGetPayload: async (args, context) => {
try {
- const { name, schemaFields } = args;
+ const { name, schemaFields } = deepcopy(args);
const { config, auth } = context;
enforceMasterKeyAccess(auth);
@@ -75,7 +76,7 @@ const load = parseGraphQLSchema => {
},
mutateAndGetPayload: async (args, context) => {
try {
- const { name, schemaFields } = args;
+ const { name, schemaFields } = deepcopy(args);
const { config, auth } = context;
enforceMasterKeyAccess(auth);
@@ -126,7 +127,7 @@ const load = parseGraphQLSchema => {
},
mutateAndGetPayload: async (args, context) => {
try {
- const { name } = args;
+ const { name } = deepcopy(args);
const { config, auth } = context;
enforceMasterKeyAccess(auth);
diff --git a/src/GraphQL/loaders/schemaQueries.js b/src/GraphQL/loaders/schemaQueries.js
index cd049ce017..25bc071919 100644
--- a/src/GraphQL/loaders/schemaQueries.js
+++ b/src/GraphQL/loaders/schemaQueries.js
@@ -1,4 +1,5 @@
import Parse from 'parse/node';
+import deepcopy from 'deepcopy';
import { GraphQLNonNull, GraphQLList } from 'graphql';
import { transformToGraphQL } from '../transformers/schemaFields';
import * as schemaTypes from './schemaTypes';
@@ -27,7 +28,7 @@ const load = parseGraphQLSchema => {
type: new GraphQLNonNull(schemaTypes.CLASS),
resolve: async (_source, args, context) => {
try {
- const { name } = args;
+ const { name } = deepcopy(args);
const { config, auth } = context;
enforceMasterKeyAccess(auth);
diff --git a/src/GraphQL/loaders/usersMutations.js b/src/GraphQL/loaders/usersMutations.js
index 50cb241b68..c38905cd90 100644
--- a/src/GraphQL/loaders/usersMutations.js
+++ b/src/GraphQL/loaders/usersMutations.js
@@ -1,5 +1,6 @@
import { GraphQLNonNull, GraphQLString, GraphQLBoolean, GraphQLInputObjectType } from 'graphql';
import { mutationWithClientMutationId } from 'graphql-relay';
+import deepcopy from 'deepcopy';
import UsersRouter from '../../Routers/UsersRouter';
import * as objectsMutations from '../helpers/objectsMutations';
import { OBJECT } from './defaultGraphQLTypes';
@@ -31,7 +32,7 @@ const load = parseGraphQLSchema => {
},
mutateAndGetPayload: async (args, context, mutationInfo) => {
try {
- const { fields } = args;
+ const { fields } = deepcopy(args);
const { config, auth, info } = context;
const parseFields = await transformTypes('create', fields, {
@@ -101,7 +102,7 @@ const load = parseGraphQLSchema => {
},
mutateAndGetPayload: async (args, context, mutationInfo) => {
try {
- const { fields, authData } = args;
+ const { fields, authData } = deepcopy(args);
const { config, auth, info } = context;
const parseFields = await transformTypes('create', fields, {
@@ -154,7 +155,7 @@ const load = parseGraphQLSchema => {
},
mutateAndGetPayload: async (args, context, mutationInfo) => {
try {
- const { username, password } = args;
+ const { username, password } = deepcopy(args);
const { config, auth, info } = context;
const { sessionToken, objectId } = (
From 407ed6ee36ea42d7eb525f42b1f3da6f41230504 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Tue, 12 Oct 2021 09:42:38 +0200
Subject: [PATCH 30/96] fix: upgrade graphql from 15.5.3 to 15.6.0 (#7612)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 00364e7746..73da87dbfa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6470,9 +6470,9 @@
"dev": true
},
"graphql": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.3.tgz",
- "integrity": "sha512-sM+jXaO5KinTui6lbK/7b7H/Knj9BpjGxZ+Ki35v7YbUJxxdBCUqNM0h3CRVU1ZF9t5lNiBzvBCSYPvIwxPOQA=="
+ "version": "15.6.0",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.6.0.tgz",
+ "integrity": "sha512-WJR872Zlc9hckiEPhXgyUftXH48jp2EjO5tgBBOyNMRJZ9fviL2mJBD6CAysk6N5S0r9BTs09Qk39nnJBkvOXQ=="
},
"graphql-extensions": {
"version": "0.15.0",
diff --git a/package.json b/package.json
index ed690875e5..6ee2ffdce2 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"deepcopy": "2.1.0",
"express": "4.17.1",
"follow-redirects": "1.14.1",
- "graphql": "15.5.3",
+ "graphql": "15.6.0",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.9.0",
"graphql-tag": "2.12.5",
From 0d46d2b3eba983ceb36dc8f9ae63f47edac0043f Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Tue, 12 Oct 2021 23:29:10 +0200
Subject: [PATCH 31/96] ci: disable docker auto publish (#7615)
---
.github/workflows/docker-publish.yml | 60 ---------------------
.github/workflows/release-manual-docker.yml | 7 ++-
2 files changed, 5 insertions(+), 62 deletions(-)
delete mode 100644 .github/workflows/docker-publish.yml
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
deleted file mode 100644
index f62d542340..0000000000
--- a/.github/workflows/docker-publish.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-name: docker
-
-on:
- schedule:
- # Nightly builds capture upstream updates to dependency images such as node.
- - cron: '19 17 * * *'
- push:
- branches: [ master ]
- tags: [ '*.*.*' ]
-
-env:
- REGISTRY: docker.io
- IMAGE_NAME: parseplatform/parse-server
-
-jobs:
- build:
-
- runs-on: ubuntu-18.04
- permissions:
- contents: read
- packages: write
-
- steps:
- - name: Determine branch name
- id: branch
- run: echo "::set-output name=branch_name::${GITHUB_REF#refs/*/}"
-
- - name: Checkout repository
- uses: actions/checkout@v2
-
- - name: Set up QEMU
- id: qemu
- uses: docker/setup-qemu-action@v1
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
-
- - name: Log into Docker Hub
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v1
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- - name: Extract Docker metadata
- id: meta
- uses: docker/metadata-action@v3
- with:
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- flavor: |
- latest=${{ steps.branch.outputs.branch_name == 'master' }}
-
- - name: Build and push Docker image
- uses: docker/build-push-action@v2
- with:
- context: .
- platforms: linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64/v8
- push: ${{ github.event_name != 'pull_request' }}
- tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
diff --git a/.github/workflows/release-manual-docker.yml b/.github/workflows/release-manual-docker.yml
index a5daf4a5b9..59da41705c 100644
--- a/.github/workflows/release-manual-docker.yml
+++ b/.github/workflows/release-manual-docker.yml
@@ -42,11 +42,14 @@ jobs:
uses: docker/metadata-action@v3
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+ # The following parameter is modified to manually make pre-releases on the `master` branch;
+ # change this accordingly before adding release automation.
flavor: |
- latest=${{ steps.branch.outputs.branch_name == 'master' && github.event.inputs.ref == '' }}
+ latest=false
+ # The following parameter is modified to manually make pre-releases on the `master` branch;
+ # change this accordingly before adding release automation.
tags: |
type=semver,enable=true,pattern={{version}},value=${{ github.event.inputs.ref }}
- type=raw,enable=${{ github.event.inputs.ref == '' }},value=latest
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
From a00e9038f68bbefe622dc42e91cae30c090be09b Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Tue, 12 Oct 2021 23:49:55 +0200
Subject: [PATCH 32/96] ci: bump environment (#7616)
---
.github/workflows/ci.yml | 24 ++++++++++++------------
README.md | 4 ++--
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 74bf1f6c52..ad4145e6f4 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,7 +7,7 @@ on:
branches:
- '**'
env:
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
PARSE_SERVER_TEST_TIMEOUT: 20000
jobs:
check-ci:
@@ -106,38 +106,38 @@ jobs:
MONGODB_VERSION: 5.0.3
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: MongoDB 4.4, ReplicaSet, WiredTiger
MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: MongoDB 4.2, ReplicaSet, WiredTiger
MONGODB_VERSION: 4.2.17
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: MongoDB 4.0, ReplicaSet, WiredTiger
MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: MongoDB 4.0, Standalone, MMAPv1
MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: mmapv1
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: Redis Cache
PARSE_SERVER_TEST_CACHE: redis
MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: Node 12
MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 12.22.6
+ NODE_VERSION: 12.22.7
- name: Node 15
MONGODB_VERSION: 4.4.9
MONGODB_TOPOLOGY: standalone
@@ -184,16 +184,16 @@ jobs:
include:
- name: PostgreSQL 11, PostGIS 3.0
POSTGRES_IMAGE: postgis/postgis:11-3.0
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: PostgreSQL 11, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:11-3.1
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: PostgreSQL 12, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:12-3.1
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
- name: PostgreSQL 13, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:13-3.1
- NODE_VERSION: 14.18.0
+ NODE_VERSION: 14.18.1
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 15
diff --git a/README.md b/README.md
index 737993dbb7..02e1e84e38 100644
--- a/README.md
+++ b/README.md
@@ -114,8 +114,8 @@ Parse Server is continuously tested with the most recent releases of Node.js to
| Version | Latest Version | End-of-Life Date | Compatibility |
|------------|----------------|------------------|--------------------|
-| Node.js 12 | 12.22.6 | April 2022 | ✅ Fully compatible |
-| Node.js 14 | 14.18.0 | April 2023 | ✅ Fully compatible |
+| Node.js 12 | 12.22.7 | April 2022 | ✅ Fully compatible |
+| Node.js 14 | 14.18.1 | April 2023 | ✅ Fully compatible |
| Node.js 15 | 15.14.0 | June 2021 | ✅ Fully compatible |
#### MongoDB
From ce57bf8c9c49146cf8c4569f10e26576059049b2 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 13 Oct 2021 00:58:22 +0200
Subject: [PATCH 33/96] build: release 5.0.0-alpha.1 (#7617)
---
.github/workflows/release-manual-docker.yml | 7 +--
.github/workflows/release.yml | 2 +-
CHANGELOG.md | 66 ++++++++++++---------
package-lock.json | 2 +-
package.json | 2 +-
5 files changed, 44 insertions(+), 35 deletions(-)
diff --git a/.github/workflows/release-manual-docker.yml b/.github/workflows/release-manual-docker.yml
index 59da41705c..3300f2a498 100644
--- a/.github/workflows/release-manual-docker.yml
+++ b/.github/workflows/release-manual-docker.yml
@@ -42,14 +42,11 @@ jobs:
uses: docker/metadata-action@v3
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- # The following parameter is modified to manually make pre-releases on the `master` branch;
- # change this accordingly before adding release automation.
flavor: |
- latest=false
- # The following parameter is modified to manually make pre-releases on the `master` branch;
- # change this accordingly before adding release automation.
+ latest=${{ steps.branch.outputs.branch_name == 'release' && github.event.inputs.ref == '' }}
tags: |
type=semver,enable=true,pattern={{version}},value=${{ github.event.inputs.ref }}
+ type=raw,enable=${{ github.event.inputs.ref == '' }},value=latest
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 334f78eea2..45a0985344 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -19,7 +19,7 @@ jobs:
restore-keys: |
${{ runner.os }}-node-
- run: npm ci
- - run: npm publish
+ - run: npm publish --tag alpha
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
publish-docs:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 43feb28fe6..c876810e6b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,10 +2,14 @@
Jump directly to a version:
+| 5.x |
+|-------------------------------------------|
+| [5.0.0-alpha.1 (pre-release)](#500-alpha1-2021-10-12) |
+
| 4.x |
|--------------------------------------|
| [**4.10.4 (latest release)**](#4104) |
-| [4.10.3](#4103) |
+| [4.10.3](#4103) |
| [4.10.2](#4102) |
| [4.10.1](#4101) |
| [4.10.0](#4100) |
@@ -94,10 +98,18 @@ Jump directly to a version:
___
-## Unreleased (Master Branch)
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.4...master)
+# [Unreleased (master branch)](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.1...master)
-### Breaking Changes
+## Breaking Changes
+ - (none)
+## Features
+ - (none)
+## Bug Fixes
+ - (none)
+
+# [5.0.0-alpha.1](https://github.com/parse-community/parse-server/compare/4.10.4...5.0.0-alpha.1) (2021-10-12)
+
+## Breaking Changes
- Improved schema caching through database real-time hooks. Reduces DB queries, decreases Parse Query execution time and fixes a potential schema memory leak. If multiple Parse Server instances connect to the same DB (for example behind a load balancer), set the [Parse Server Option](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) `databaseOptions.enableSchemaHooks: true` to enable this feature and keep the schema in sync across all instances. Failing to do so will cause a schema change to not propagate to other instances and re-syncing will only happen when these instances restart. The options `enableSingleSchemaCache` and `schemaCacheTTL` have been removed. To use this feature with MongoDB, a replica set cluster with [change stream](https://docs.mongodb.com/manual/changeStreams/#availability) support is required. (Diamond Lewis, SebC) [#7214](https://github.com/parse-community/parse-server/issues/7214)
- Added file upload restriction. File upload is now only allowed for authenticated users by default for improved security. To allow file upload also for Anonymous Users or Public, set the `fileUpload` parameter in the [Parse Server Options](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) (dblythy, Manuel Trezza) [#7071](https://github.com/parse-community/parse-server/pull/7071)
- Removed [parse-server-simple-mailgun-adapter](https://github.com/parse-community/parse-server-simple-mailgun-adapter) dependency; to continue using the adapter it has to be explicitly installed (Manuel Trezza) [#7321](https://github.com/parse-community/parse-server/pull/7321)
@@ -107,7 +119,7 @@ ___
- Remove Session field `restricted`; the field was a code artifact from a feature that never existed in Open Source Parse Server; if you have been using this field for custom purposes, consider that for new Parse Server installations the field does not exist anymore in the schema, and for existing installations the field default value `false` will not be set anymore when creating a new session (Manuel Trezza) [#7543](https://github.com/parse-community/parse-server/pull/7543)
- ci: add node engine version check (Manuel Trezza) [#7574](https://github.com/parse-community/parse-server/pull/7574)
-### Notable Changes
+## Notable Changes
- Alphabetical ordered GraphQL API, improved GraphQL Schema cache system and fix GraphQL input reassign issue (Moumouls) [#7344](https://github.com/parse-community/parse-server/issues/7344)
- Added Parse Server Security Check to report weak security settings (Manuel Trezza, dblythy) [#7247](https://github.com/parse-community/parse-server/issues/7247)
- EXPERIMENTAL: Added new page router with placeholder rendering and localization of custom and feature pages such as password reset and email verification (Manuel Trezza) [#7128](https://github.com/parse-community/parse-server/pull/7128)
@@ -117,7 +129,7 @@ ___
- Add official support for MongoDB 5.0 (Manuel Trezza) [#7469](https://github.com/parse-community/parse-server/pull/7469)
- Added Parse Server Configuration `enforcePrivateUsers`, which will remove public access by default on new Parse.Users (dblythy) [#7319](https://github.com/parse-community/parse-server/pull/7319)
-### Other Changes
+## Other Changes
- Support native mongodb syntax in aggregation pipelines (Raschid JF Rafeally) [#7339](https://github.com/parse-community/parse-server/pull/7339)
- Fix error when a not yet inserted job is updated (Antonio Davi Macedo Coelho de Castro) [#7196](https://github.com/parse-community/parse-server/pull/7196)
- request.context for afterFind triggers (dblythy) [#7078](https://github.com/parse-community/parse-server/pull/7078)
@@ -163,33 +175,33 @@ ___
- refactor: Modernize HTTPRequest tests (brandongregoryscott) [#7604](https://github.com/parse-community/parse-server/pull/7604)
- Allow liveQuery on Session class (Daniel Blyth) [#7554](https://github.com/parse-community/parse-server/pull/7554)
-## 4.10.4
+# 4.10.4
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.3...4.10.4)
-### Security Fixes
+## Security Fixes
- Strip out sessionToken when LiveQuery is used on Parse.User (Daniel Blyth) [GHSA-7pr3-p5fm-8r9x](https://github.com/parse-community/parse-server/security/advisories/GHSA-7pr3-p5fm-8r9x)
-## 4.10.3
+# 4.10.3
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.2...4.10.3)
-### Security Fixes
+## Security Fixes
- Validate `explain` query parameter to avoid a server crash due to MongoDB bug [NODE-3463](https://jira.mongodb.org/browse/NODE-3463) (Kartal Kaan Bozdogan) [GHSA-xqp8-w826-hh6x](https://github.com/parse-community/parse-server/security/advisories/GHSA-xqp8-w826-hh6x)
-## 4.10.2
+# 4.10.2
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.1...4.10.2)
-### Other Changes
+## Other Changes
- Move graphql-tag from devDependencies to dependencies (Antonio Davi Macedo Coelho de Castro) [#7183](https://github.com/parse-community/parse-server/pull/7183)
-## 4.10.1
+# 4.10.1
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.0...4.10.1)
-### Security Fixes
+## Security Fixes
- Updated to Parse JS SDK 3.3.0 and other security fixes (Manuel Trezza) [#7508](https://github.com/parse-community/parse-server/pull/7508)
> ⚠️ This includes a security fix of the Parse JS SDK where `logIn` will default to `POST` instead of `GET` method. This may require changes in your deployment before you upgrade to this release, see the Parse JS SDK 3.0.0 [release notes](https://github.com/parse-community/Parse-SDK-JS/releases/tag/3.0.0).
-## 4.10.0
+# 4.10.0
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.5.2...4.10.0)
*Versions >4.5.2 and <4.10.0 are skipped.*
@@ -205,20 +217,20 @@ ___
>
>**If you are using any of the affected versions, we urgently recommend to upgrade to version `4.10.0`.**
-## 4.5.2
+# 4.5.2
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.5.0...4.5.2)
### Security Fixes
- SECURITY FIX: Fixes incorrect session property `authProvider: password` of anonymous users. When signing up an anonymous user, the session field `createdWith` indicates incorrectly that the session has been created using username and password with `authProvider: password`, instead of an anonymous sign-up with `authProvider: anonymous`. This fixes the issue by setting the correct `authProvider: anonymous` for future sign-ups of anonymous users. This fix does not fix incorrect `authProvider: password` for existing sessions of anonymous users. Consider this if your app logic depends on the `authProvider` field. (Corey Baker) [GHSA-23r4-5mxp-c7g5](https://github.com/parse-community/parse-server/security/advisories/GHSA-23r4-5mxp-c7g5)
-## 4.5.1
+# 4.5.1
*This version was published by mistake and was deprecated.*
-## 4.5.0
+# 4.5.0
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.4.0...4.5.0)
-### Breaking Changes
+## Breaking Changes
- FIX: Consistent casing for afterLiveQueryEvent. The afterLiveQueryEvent was introduced in 4.4.0 with inconsistent casing for the event names, which was fixed in 4.5.0. [#7023](https://github.com/parse-community/parse-server/pull/7023). Thanks to [dblythy](https://github.com/dblythy).
-### Other Changes
+## Other Changes
- FIX: Properly handle serverURL and publicServerUrl in Batch requests. [#7049](https://github.com/parse-community/parse-server/pull/7049). Thanks to [Zach Goldberg](https://github.com/ZachGoldberg).
- IMPROVE: Prevent invalid column names (className and length). [#7053](https://github.com/parse-community/parse-server/pull/7053). Thanks to [Diamond Lewis](https://github.com/dplewis).
- IMPROVE: GraphQL: Remove viewer from logout mutation. [#7029](https://github.com/parse-community/parse-server/pull/7029). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
@@ -235,7 +247,7 @@ ___
- FIX: Add encryptionKey to src/options/index.js. [#6999](https://github.com/parse-community/parse-server/pull/6999). Thanks to [dblythy](https://github.com/dblythy).
- IMPROVE: Update PostgresStorageAdapter.js. [#6989](https://github.com/parse-community/parse-server/pull/6989). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t).
-## 4.4.0
+# 4.4.0
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.3.0...4.4.0)
- IMPROVE: Update PostgresStorageAdapter.js. [#6981](https://github.com/parse-community/parse-server/pull/6981). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
- NEW: skipWithMasterKey on Built-In Validator. [#6972](https://github.com/parse-community/parse-server/issues/6972). Thanks to [dblythy](https://github.com/dblythy).
@@ -270,7 +282,7 @@ ___
- IMPROVE: Optimized deletion of class field from schema by using an index if available to do an index scan instead of a collection scan. [#6815](https://github.com/parse-community/parse-server/issues/6815). Thanks to [Manuel Trezza](https://github.com/mtrezza).
- IMPROVE: Enable MongoDB transaction test for MongoDB >= 4.0.4 [#6827](https://github.com/parse-community/parse-server/pull/6827). Thanks to [Manuel](https://github.com/mtrezza).
-## 4.3.0
+# 4.3.0
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.2.0...4.3.0)
- PERFORMANCE: Optimizing pointer CLP query decoration done by DatabaseController#addPointerPermissions [#6747](https://github.com/parse-community/parse-server/pull/6747). Thanks to [mess-lelouch](https://github.com/mess-lelouch).
- SECURITY: Fix security breach on GraphQL viewer [78239ac](https://github.com/parse-community/parse-server/commit/78239ac9071167fdf243c55ae4bc9a2c0b0d89aa), [security advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-236h-rqv8-8q73). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
@@ -309,7 +321,7 @@ ___
- FIX: Fix Postgres group aggregation [#6522](https://github.com/parse-community/parse-server/pull/6522). Thanks to [Siddharth Ramesh](https://github.com/srameshr).
- NEW: Allow set user mapped from JWT directly on request [#6411](https://github.com/parse-community/parse-server/pull/6411). Thanks to [Gordon Sun](https://github.com/sunshineo).
-## 4.2.0
+# 4.2.0
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.1.0...4.2.0)
__BREAKING CHANGES:__
@@ -339,13 +351,13 @@ ___
- NEW: Case insensitive username and email indexing and query planning for Postgres [#6506](https://github.com/parse-community/parse-server/issues/6441). Thanks to
[Corey Baker](https://github.com/cbaker6).
-## 4.1.0
+# 4.1.0
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.0.2...4.1.0)
_SECURITY RELEASE_: see [advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-h4mf-75hf-67w4) for details
- SECURITY FIX: Patch Regex vulnerabilities. See [3a3a5ee](https://github.com/parse-community/parse-server/commit/3a3a5eee5ffa48da1352423312cb767de14de269). Special thanks to [W0lfw00d](https://github.com/W0lfw00d) for identifying and [responsibly reporting](https://github.com/parse-community/parse-server/blob/master/SECURITY.md) the vulnerability. Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo) for the speedy fix.
-## 4.0.2
+# 4.0.2
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.0.1...4.0.2)
__BREAKING CHANGES:__
@@ -362,12 +374,12 @@ __BREAKING CHANGES:__
- FIX: attempt to get travis to deploy to npmjs again. See [#6475](https://github.com/parse-community/parse-server/pull/6457). Thanks to [Arthur Cinader](https://github.com/acinader).
-## 4.0.1
+# 4.0.1
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.0.0...4.0.1)
- FIX: correct 'new' travis config to properly deploy. See [#6452](https://github.com/parse-community/parse-server/pull/6452). Thanks to [Arthur Cinader](https://github.com/acinader).
- FIX: Better message on not allowed to protect default fields. See [#6439](https://github.com/parse-community/parse-server/pull/6439).Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
-## 4.0.0
+# 4.0.0
[Full Changelog](https://github.com/parse-community/parse-server/compare/3.10.0...4.0.0)
> __Special Note on Upgrading to Parse Server 4.0.0 and above__
diff --git a/package-lock.json b/package-lock.json
index 73da87dbfa..633260b688 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "4.10.4",
+ "version": "5.0.0-alpha.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 6ee2ffdce2..5a6db0d388 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "4.10.4",
+ "version": "5.0.0-alpha.1",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From 0525e4bdd2f5c2fa199ba2237b10f2c425958757 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 13 Oct 2021 01:03:03 +0200
Subject: [PATCH 34/96] ci: bump node version in release
---
.github/workflows/release.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 45a0985344..ea754a8a07 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -9,7 +9,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
- node-version: '10.14'
+ node-version: '12.2'
registry-url: https://registry.npmjs.org/
- name: Cache Node.js modules
uses: actions/cache@v2
@@ -30,7 +30,7 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v1
with:
- node-version: '10.14'
+ node-version: '12.2'
- name: Cache Node.js modules
uses: actions/cache@v2
with:
From 825b302e0b90779feb1609b56bbc78f36a2b92b2 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 13 Oct 2021 01:46:01 +0200
Subject: [PATCH 35/96] ci: fix docker build error
---
Dockerfile | 1 +
1 file changed, 1 insertion(+)
diff --git a/Dockerfile b/Dockerfile
index dd500484f6..1fd3c65c34 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -25,6 +25,7 @@ WORKDIR /parse-server
COPY package*.json ./
+RUN npm cache clean --force
RUN npm ci --production --ignore-scripts
COPY bin bin
From 049dd6b3dc55a488896d7fd77b96428c6cf6822b Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 13 Oct 2021 01:59:51 +0200
Subject: [PATCH 36/96] ci: fix docker build error
---
Dockerfile | 1 +
1 file changed, 1 insertion(+)
diff --git a/Dockerfile b/Dockerfile
index 1fd3c65c34..0749e8d841 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -9,6 +9,7 @@ COPY package*.json ./
# Copy local dependencies for CI tests
COPY spec/dependencies spec/dependencies
+RUN npm cache clean --force
RUN npm ci
COPY . .
RUN npm run build
From 2ac694d30927c575166076c143b17ff1145dbd43 Mon Sep 17 00:00:00 2001
From: Alysson Melo
Date: Tue, 12 Oct 2021 21:28:30 -0300
Subject: [PATCH 37/96] docs: update incorrect link to Back4App in README
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 02e1e84e38..060180691b 100644
--- a/README.md
+++ b/README.md
@@ -254,7 +254,7 @@ We have provided a basic [Node.js application](https://github.com/parse-communit
* [SashiDo](https://blog.sashido.io/tag/migration/)
* [Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-run-parse-server-on-ubuntu-14-04)
* [Pivotal Web Services](https://github.com/cf-platform-eng/pws-parse-server)
-* [Back4app](http://blog.back4app.com/2016/03/01/quick-wizard-migration/)
+* [Back4app](https://www.back4app.com/docs/get-started/welcome)
* [Glitch](https://glitch.com/edit/#!/parse-server)
* [Flynn](https://flynn.io/blog/parse-apps-on-flynn)
From 9a6bb6b1ef7dec0d42aff75b6709dc029364a84a Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 13 Oct 2021 03:03:09 +0200
Subject: [PATCH 38/96] ci: disable npm publishing on release
---
.github/workflows/release.yml | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index ea754a8a07..90d5b8ac36 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -19,9 +19,10 @@ jobs:
restore-keys: |
${{ runner.os }}-node-
- run: npm ci
- - run: npm publish --tag alpha
- env:
- NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
+# Disable publishing until release automation; enable ad-hoc with correct npm tag (alpha, beta)
+# - run: npm publish --tag alpha
+# env:
+# NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
publish-docs:
runs-on: ubuntu-18.04
timeout-minutes: 30
From 5791c11202cc4a3e9b686e13cb844087822ab543 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 14 Oct 2021 23:49:45 +0200
Subject: [PATCH 39/96] ci: add environment check scheduler (#7631)
---
.../ci-automated-check-environment.yml | 60 +++++++++++++++++++
1 file changed, 60 insertions(+)
create mode 100644 .github/workflows/ci-automated-check-environment.yml
diff --git a/.github/workflows/ci-automated-check-environment.yml b/.github/workflows/ci-automated-check-environment.yml
new file mode 100644
index 0000000000..f64c804c6e
--- /dev/null
+++ b/.github/workflows/ci-automated-check-environment.yml
@@ -0,0 +1,60 @@
+# This checks whether there are new CI environment versions available, e.g. MongoDB, Node.js;
+# a pull request is created if there are any available.
+
+name: ci-automated-check-environment
+on:
+ schedule:
+ - cron: 0 0 1/7 * *
+ workflow_dispatch:
+
+jobs:
+ check-ci-environment:
+ timeout-minutes: 5
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout default branch
+ uses: actions/checkout@v2
+ - name: Setup Node
+ uses: actions/setup-node@v2
+ with:
+ node-version: 16
+ - name: Cache Node.js modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-
+ - name: Install dependencies
+ run: npm ci
+ - name: CI Environments Check
+ run: npm run ci:check
+ create-pr:
+ needs: check-ci-environment
+ if: failure()
+ timeout-minutes: 5
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout default branch
+ uses: actions/checkout@v2
+ - name: Compose branch name for PR
+ id: branch
+ run: echo "::set-output name=name::ci-bump-environment-${{ github.run_id }}${{ github.run_number }}"
+ - name: Create branch
+ run: |
+ git config --global user.email ${{ github.actor }}@users.noreply.github.com
+ git config --global user.name ${{ github.actor }}
+ git checkout -b ${{ steps.branch.outputs.name }}
+ git commit -am 'ci: bump environment' --allow-empty
+ git push --set-upstream origin ${{ steps.branch.outputs.name }}
+ - name: Create PR
+ uses: k3rnels-actions/pr-update@v1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ pr_title: "ci: bump environment"
+ pr_source: ${{ steps.branch.outputs.name }}
+ pr_labels: type:ci
+ pr_body: |
+ # Outdated CI environment
+ This pull request was created, because the CI environment uses frameworks that are not up-to-date.
+ ### ⚠️ You must use `Squash and merge` to merge this pull request.
From fd12ca5fa33f4a13456aa2bf27562c6523794203 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 14 Oct 2021 23:52:41 +0200
Subject: [PATCH 40/96] ci: change workflow scheduler to node 14
---
.github/workflows/ci-automated-check-environment.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/ci-automated-check-environment.yml b/.github/workflows/ci-automated-check-environment.yml
index f64c804c6e..b390df18ef 100644
--- a/.github/workflows/ci-automated-check-environment.yml
+++ b/.github/workflows/ci-automated-check-environment.yml
@@ -17,7 +17,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v2
with:
- node-version: 16
+ node-version: 14
- name: Cache Node.js modules
uses: actions/cache@v2
with:
From a48ff2062f3cecd66e0a6c03f4053624f4a5e048 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 15 Oct 2021 00:10:21 +0200
Subject: [PATCH 41/96] ci: refactor ci update scheduler
---
.github/workflows/ci-automated-check-environment.yml | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/ci-automated-check-environment.yml b/.github/workflows/ci-automated-check-environment.yml
index b390df18ef..811923ad76 100644
--- a/.github/workflows/ci-automated-check-environment.yml
+++ b/.github/workflows/ci-automated-check-environment.yml
@@ -17,7 +17,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v2
with:
- node-version: 14
+ node-version: 16
- name: Cache Node.js modules
uses: actions/cache@v2
with:
@@ -39,7 +39,7 @@ jobs:
uses: actions/checkout@v2
- name: Compose branch name for PR
id: branch
- run: echo "::set-output name=name::ci-bump-environment-${{ github.run_id }}${{ github.run_number }}"
+ run: echo "::set-output name=name::ci-bump-environment"
- name: Create branch
run: |
git config --global user.email ${{ github.actor }}@users.noreply.github.com
@@ -55,6 +55,9 @@ jobs:
pr_source: ${{ steps.branch.outputs.name }}
pr_labels: type:ci
pr_body: |
- # Outdated CI environment
+ ## Outdated CI environment
+
This pull request was created, because the CI environment uses frameworks that are not up-to-date.
- ### ⚠️ You must use `Squash and merge` to merge this pull request.
+ You can see which frameworks need to be upgraded in the [logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}).
+
+ *⚠️ Use `Squash and merge` to merge this pull request.*
From 0e2cf989fd60f47789129d0e5b64afbbb335245e Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 15 Oct 2021 00:12:51 +0200
Subject: [PATCH 42/96] ci: refactor ci update scheduler
---
.github/workflows/ci-automated-check-environment.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/ci-automated-check-environment.yml b/.github/workflows/ci-automated-check-environment.yml
index 811923ad76..4008893c5c 100644
--- a/.github/workflows/ci-automated-check-environment.yml
+++ b/.github/workflows/ci-automated-check-environment.yml
@@ -17,7 +17,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v2
with:
- node-version: 16
+ node-version: 14
- name: Cache Node.js modules
uses: actions/cache@v2
with:
From 0ce6fb9a543b574ed51a1f4e9c051471e6c0426f Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 15 Oct 2021 00:27:16 +0200
Subject: [PATCH 43/96] ci: fix typo in workflow text
---
.github/workflows/ci-automated-check-environment.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/ci-automated-check-environment.yml b/.github/workflows/ci-automated-check-environment.yml
index 4008893c5c..9226b62c8b 100644
--- a/.github/workflows/ci-automated-check-environment.yml
+++ b/.github/workflows/ci-automated-check-environment.yml
@@ -57,7 +57,7 @@ jobs:
pr_body: |
## Outdated CI environment
- This pull request was created, because the CI environment uses frameworks that are not up-to-date.
+ This pull request was created because the CI environment uses frameworks that are not up-to-date.
You can see which frameworks need to be upgraded in the [logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}).
*⚠️ Use `Squash and merge` to merge this pull request.*
From 527881fe9db390ffb96da20e849b410d79b87f5a Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 15 Oct 2021 00:35:10 +0200
Subject: [PATCH 44/96] ci: remove ci env check from PR CI (#7635)
---
.github/workflows/ci-automated-check-environment.yml | 1 -
.github/workflows/ci.yml | 4 +---
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/.github/workflows/ci-automated-check-environment.yml b/.github/workflows/ci-automated-check-environment.yml
index 9226b62c8b..0f08d2e47a 100644
--- a/.github/workflows/ci-automated-check-environment.yml
+++ b/.github/workflows/ci-automated-check-environment.yml
@@ -53,7 +53,6 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
pr_title: "ci: bump environment"
pr_source: ${{ steps.branch.outputs.name }}
- pr_labels: type:ci
pr_body: |
## Outdated CI environment
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ad4145e6f4..18c5720d45 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -11,7 +11,7 @@ env:
PARSE_SERVER_TEST_TIMEOUT: 20000
jobs:
check-ci:
- name: CI Self-Check
+ name: Node Engine Check
timeout-minutes: 15
runs-on: ubuntu-18.04
steps:
@@ -29,8 +29,6 @@ jobs:
${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-
- name: Install dependencies
run: npm ci
- - name: CI Environments Check
- run: npm run ci:check
- name: CI Node Engine Check
run: npm run ci:checkNodeEngine
check-changelog:
From 1a3103a0258bd676133c639b587ed3b8ccf4407e Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sat, 16 Oct 2021 11:57:22 +0200
Subject: [PATCH 45/96] refactor: upgrade parse from 3.3.0 to 3.3.1 (#7638)
---
package-lock.json | 81 +++++++++++++++++++++++++++++++++++------------
package.json | 2 +-
2 files changed, 62 insertions(+), 21 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 633260b688..23a8e0f003 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1108,6 +1108,15 @@
"regenerator-runtime": "^0.13.4"
}
},
+ "@babel/runtime-corejs3": {
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
+ "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
+ "requires": {
+ "core-js-pure": "^3.14.0",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
"@babel/template": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
@@ -1646,6 +1655,47 @@
"@parse/node-gcm": "1.0.2",
"npmlog": "4.1.2",
"parse": "3.3.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz",
+ "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "crypto-js": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz",
+ "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==",
+ "optional": true
+ },
+ "parse": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.0.tgz",
+ "integrity": "sha512-SQkTDupU7JQBJpYFIpO8TlQjUtjboUdkXaak57pjoC1ZVbhaiNyLsdYbrlM0B+sNYhlvcMh7zwZW48u10+zm0A==",
+ "requires": {
+ "@babel/runtime": "7.14.6",
+ "@babel/runtime-corejs3": "7.14.6",
+ "crypto-js": "4.0.0",
+ "idb-keyval": "5.0.6",
+ "react-native-crypto-js": "1.0.0",
+ "uuid": "3.4.0",
+ "ws": "7.5.0",
+ "xmlhttprequest": "1.8.0"
+ }
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "ws": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
+ "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw=="
+ }
}
},
"@protobufjs/aspromise": {
@@ -4087,9 +4137,9 @@
}
},
"crypto-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz",
- "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
"optional": true
},
"css-select": {
@@ -10021,13 +10071,13 @@
}
},
"parse": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.0.tgz",
- "integrity": "sha512-SQkTDupU7JQBJpYFIpO8TlQjUtjboUdkXaak57pjoC1ZVbhaiNyLsdYbrlM0B+sNYhlvcMh7zwZW48u10+zm0A==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/parse/-/parse-3.3.1.tgz",
+ "integrity": "sha512-jrb8tpeanh49lIXuQYbaJoMzywX9YiBtM17aCvYGfaHYJipSTHABA774t8IZap+F8Pb4GgZ0fM4ObfiuO4395A==",
"requires": {
- "@babel/runtime": "7.14.6",
+ "@babel/runtime": "7.14.8",
"@babel/runtime-corejs3": "7.14.6",
- "crypto-js": "4.0.0",
+ "crypto-js": "4.1.1",
"idb-keyval": "5.0.6",
"react-native-crypto-js": "1.0.0",
"uuid": "3.4.0",
@@ -10036,19 +10086,10 @@
},
"dependencies": {
"@babel/runtime": {
- "version": "7.14.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz",
- "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/runtime-corejs3": {
- "version": "7.14.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz",
- "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==",
+ "version": "7.14.8",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
+ "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
"requires": {
- "core-js-pure": "^3.14.0",
"regenerator-runtime": "^0.13.4"
}
},
diff --git a/package.json b/package.json
index 5a6db0d388..9d171aa5d6 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
"mime": "2.5.2",
"mongodb": "3.6.11",
"mustache": "4.2.0",
- "parse": "3.3.0",
+ "parse": "3.3.1",
"pg-monitor": "1.4.1",
"pg-promise": "10.11.0",
"pluralize": "8.0.0",
From 936b5ec9a7af6a25ca7521fee2d49b4b73dc8842 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Sun, 17 Oct 2021 20:22:43 +0200
Subject: [PATCH 46/96] ci: bump environment (#7630)
---
.github/workflows/ci.yml | 8 ++++----
README.md | 2 +-
package.json | 10 +++++-----
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 18c5720d45..a26410a803 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -106,7 +106,7 @@ jobs:
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 14.18.1
- name: MongoDB 4.4, ReplicaSet, WiredTiger
- MONGODB_VERSION: 4.4.9
+ MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 14.18.1
@@ -127,17 +127,17 @@ jobs:
NODE_VERSION: 14.18.1
- name: Redis Cache
PARSE_SERVER_TEST_CACHE: redis
- MONGODB_VERSION: 4.4.9
+ MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 14.18.1
- name: Node 12
- MONGODB_VERSION: 4.4.9
+ MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 12.22.7
- name: Node 15
- MONGODB_VERSION: 4.4.9
+ MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 15.14.0
diff --git a/README.md b/README.md
index 060180691b..4de7400bdd 100644
--- a/README.md
+++ b/README.md
@@ -125,7 +125,7 @@ Parse Server is continuously tested with the most recent releases of MongoDB to
|-------------|----------------|------------------|--------------------|
| MongoDB 4.0 | 4.0.27 | April 2022 | ✅ Fully compatible |
| MongoDB 4.2 | 4.2.17 | TBD | ✅ Fully compatible |
-| MongoDB 4.4 | 4.4.9 | TBD | ✅ Fully compatible |
+| MongoDB 4.4 | 4.4.10 | TBD | ✅ Fully compatible |
| MongoDB 5.0 | 5.0.3 | January 2024 | ✅ Fully compatible |
#### PostgreSQL
diff --git a/package.json b/package.json
index 9d171aa5d6..ced86b647b 100644
--- a/package.json
+++ b/package.json
@@ -114,13 +114,13 @@
"test:mongodb": "npm run test:mongodb:runnerstart --dbversion=$npm_config_dbversion && npm run test:mongodb:testonly --dbversion=$npm_config_dbversion",
"test:mongodb:4.0.27": "npm run test:mongodb --dbversion=4.0.27",
"test:mongodb:4.2.17": "npm run test:mongodb --dbversion=4.2.17",
- "test:mongodb:4.4.9": "npm run test:mongodb --dbversion=4.4.9",
+ "test:mongodb:4.4.10": "npm run test:mongodb --dbversion=4.4.10",
"posttest:mongodb": "mongodb-runner stop",
- "pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
- "testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
+ "pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.10} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner start",
+ "testonly": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.10} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 jasmine",
"test": "npm run testonly",
- "posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner stop",
- "coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.9} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 nyc jasmine",
+ "posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.10} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} mongodb-runner stop",
+ "coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.4.10} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=wiredTiger} TESTING=1 nyc jasmine",
"start": "node ./bin/parse-server",
"prettier": "prettier --write {src,spec}/{**/*,*}.js",
"prepare": "npm run build",
From 68057c49f3ba06eaa68cf5ac1bed4f1d06a273c1 Mon Sep 17 00:00:00 2001
From: Antoine Cormouls
Date: Sun, 17 Oct 2021 21:16:24 +0200
Subject: [PATCH 47/96] refactor: minor changes to remove mongo deprecation
warnings (#7626)
---
src/Adapters/Storage/Mongo/MongoStorageAdapter.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js
index 39cbcb5db8..e134f0c06f 100644
--- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js
+++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js
@@ -180,10 +180,10 @@ export class MongoStorageAdapter implements StorageAdapter {
delete this.connectionPromise;
return;
}
- database.on('error', () => {
+ client.on('error', () => {
delete this.connectionPromise;
});
- database.on('close', () => {
+ client.on('close', () => {
delete this.connectionPromise;
});
this.client = client;
@@ -555,7 +555,7 @@ export class MongoStorageAdapter implements StorageAdapter {
return this._adaptiveCollection(className)
.then(collection =>
collection._mongoCollection.findOneAndUpdate(mongoWhere, mongoUpdate, {
- returnOriginal: false,
+ returnDocument: 'after',
session: transactionalSession || undefined,
})
)
From 4643bf82632d084665838740ad35b4ea93197e41 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Mon, 18 Oct 2021 10:51:02 +0200
Subject: [PATCH 48/96] ci: remove stale bot
---
.github/stale.yml | 19 -------------------
1 file changed, 19 deletions(-)
delete mode 100644 .github/stale.yml
diff --git a/.github/stale.yml b/.github/stale.yml
deleted file mode 100644
index 2d688c8a25..0000000000
--- a/.github/stale.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-# Number of days of inactivity before an issue becomes stale
-daysUntilStale: 30
-# Number of days of inactivity before a stale issue is closed
-daysUntilClose: 30
-# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
-onlyLabels:
- - ":rocket: feature"
- - ":dna: enhancement"
-# Label to use when marking an issue as stale
-staleLabel: up-for-grabs
-# Limit to only `issues` not `pulls`
-only: issues
-# Comment to post when marking an issue as stale. Set to `false` to disable
-markComment: >
- This issue has been automatically marked as up-for-grabs because it has not had
- recent activity. It will be closed if no further activity occurs. Thank you
- for your contributions.
-# Comment to post when closing a stale issue. Set to `false` to disable
-closeComment: false
\ No newline at end of file
From 6a2c21d282027e1e9fe631decb744ba8eb05e066 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Mon, 18 Oct 2021 12:20:36 +0200
Subject: [PATCH 49/96] refactor: upgrade follow-redirects from 1.14.1 to
1.14.2 (#7561)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 23a8e0f003..4708753a28 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6159,9 +6159,9 @@
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
"follow-redirects": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz",
- "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg=="
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz",
+ "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA=="
},
"for-each": {
"version": "0.3.3",
diff --git a/package.json b/package.json
index ced86b647b..36dbd893b7 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"cors": "2.8.5",
"deepcopy": "2.1.0",
"express": "4.17.1",
- "follow-redirects": "1.14.1",
+ "follow-redirects": "1.14.2",
"graphql": "15.6.0",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.9.0",
From 80bf578cbd1cb1bb13741303917d1397e9e70105 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Mon, 18 Oct 2021 14:05:03 +0200
Subject: [PATCH 50/96] refactor: upgrade semver from 7.3.4 to 7.3.5 (#7343)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 4708753a28..2040aac0ad 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11136,9 +11136,9 @@
}
},
"semver": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
- "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"requires": {
"lru-cache": "^6.0.0"
},
diff --git a/package.json b/package.json
index 36dbd893b7..ae4454996b 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,7 @@
"pg-promise": "10.11.0",
"pluralize": "8.0.0",
"redis": "3.1.2",
- "semver": "7.3.4",
+ "semver": "7.3.5",
"subscriptions-transport-ws": "0.10.0",
"tv4": "1.3.0",
"uuid": "8.3.2",
From b5fc0d59db59d186eb234a5338e014f16a6efb43 Mon Sep 17 00:00:00 2001
From: Corey
Date: Mon, 18 Oct 2021 10:51:56 -0400
Subject: [PATCH 51/96] ci: enable more tests on Postgres adapter (#7641)
---
spec/ParseAPI.spec.js | 2 +-
spec/ParseGraphQLServer.spec.js | 187 ++++++++++++++++----------------
spec/ParseObject.spec.js | 4 +-
spec/ParsePolygon.spec.js | 17 ++-
spec/ParseRelation.spec.js | 6 +-
spec/SchemaPerformance.spec.js | 8 +-
6 files changed, 113 insertions(+), 111 deletions(-)
diff --git a/spec/ParseAPI.spec.js b/spec/ParseAPI.spec.js
index 98f462c787..4367a653fe 100644
--- a/spec/ParseAPI.spec.js
+++ b/spec/ParseAPI.spec.js
@@ -23,7 +23,7 @@ const headers = {
'X-Parse-Installation-Id': 'yolo',
};
-describe_only_db('mongo')('miscellaneous', () => {
+describe('miscellaneous', () => {
it('db contains document after successful save', async () => {
const obj = new Parse.Object('TestObject');
obj.set('foo', 'bar');
diff --git a/spec/ParseGraphQLServer.spec.js b/spec/ParseGraphQLServer.spec.js
index 6d401cb3c4..9f75b94210 100644
--- a/spec/ParseGraphQLServer.spec.js
+++ b/spec/ParseGraphQLServer.spec.js
@@ -4013,64 +4013,61 @@ describe('ParseGraphQLServer', () => {
expect(someClassSubObject.someClassField).toEqual('imSomeClassTwo');
});
- it_only_db('mongo')(
- 'should return many child objects in allow cyclic query',
- async () => {
- const obj1 = new Parse.Object('Employee');
- const obj2 = new Parse.Object('Team');
- const obj3 = new Parse.Object('Company');
- const obj4 = new Parse.Object('Country');
+ it('should return many child objects in allow cyclic query', async () => {
+ const obj1 = new Parse.Object('Employee');
+ const obj2 = new Parse.Object('Team');
+ const obj3 = new Parse.Object('Company');
+ const obj4 = new Parse.Object('Country');
- obj1.set('name', 'imAnEmployee');
- await obj1.save();
+ obj1.set('name', 'imAnEmployee');
+ await obj1.save();
- obj2.set('name', 'imATeam');
- obj2.set('employees', [obj1]);
- await obj2.save();
+ obj2.set('name', 'imATeam');
+ obj2.set('employees', [obj1]);
+ await obj2.save();
- obj3.set('name', 'imACompany');
- obj3.set('teams', [obj2]);
- obj3.set('employees', [obj1]);
- await obj3.save();
+ obj3.set('name', 'imACompany');
+ obj3.set('teams', [obj2]);
+ obj3.set('employees', [obj1]);
+ await obj3.save();
- obj4.set('name', 'imACountry');
- obj4.set('companies', [obj3]);
- await obj4.save();
+ obj4.set('name', 'imACountry');
+ obj4.set('companies', [obj3]);
+ await obj4.save();
- obj1.set('country', obj4);
- await obj1.save();
+ obj1.set('country', obj4);
+ await obj1.save();
- await parseGraphQLServer.parseGraphQLSchema.schemaCache.clear();
+ await parseGraphQLServer.parseGraphQLSchema.schemaCache.clear();
- const result = (
- await apolloClient.query({
- query: gql`
- query DeepComplexGraphQLQuery($id: ID!) {
- country(id: $id) {
- objectId
- name
- companies {
- ... on Company {
- objectId
- name
- employees {
- ... on Employee {
- objectId
- name
- }
+ const result = (
+ await apolloClient.query({
+ query: gql`
+ query DeepComplexGraphQLQuery($id: ID!) {
+ country(id: $id) {
+ objectId
+ name
+ companies {
+ ... on Company {
+ objectId
+ name
+ employees {
+ ... on Employee {
+ objectId
+ name
}
- teams {
- ... on Team {
- objectId
- name
- employees {
- ... on Employee {
+ }
+ teams {
+ ... on Team {
+ objectId
+ name
+ employees {
+ ... on Employee {
+ objectId
+ name
+ country {
objectId
name
- country {
- objectId
- name
- }
}
}
}
@@ -4079,54 +4076,54 @@ describe('ParseGraphQLServer', () => {
}
}
}
- `,
- variables: {
- id: obj4.id,
- },
- })
- ).data.country;
+ }
+ `,
+ variables: {
+ id: obj4.id,
+ },
+ })
+ ).data.country;
- const expectedResult = {
- objectId: obj4.id,
- name: 'imACountry',
- __typename: 'Country',
- companies: [
- {
- objectId: obj3.id,
- name: 'imACompany',
- __typename: 'Company',
- employees: [
- {
- objectId: obj1.id,
- name: 'imAnEmployee',
- __typename: 'Employee',
- },
- ],
- teams: [
- {
- objectId: obj2.id,
- name: 'imATeam',
- __typename: 'Team',
- employees: [
- {
- objectId: obj1.id,
- name: 'imAnEmployee',
- __typename: 'Employee',
- country: {
- objectId: obj4.id,
- name: 'imACountry',
- __typename: 'Country',
- },
+ const expectedResult = {
+ objectId: obj4.id,
+ name: 'imACountry',
+ __typename: 'Country',
+ companies: [
+ {
+ objectId: obj3.id,
+ name: 'imACompany',
+ __typename: 'Company',
+ employees: [
+ {
+ objectId: obj1.id,
+ name: 'imAnEmployee',
+ __typename: 'Employee',
+ },
+ ],
+ teams: [
+ {
+ objectId: obj2.id,
+ name: 'imATeam',
+ __typename: 'Team',
+ employees: [
+ {
+ objectId: obj1.id,
+ name: 'imAnEmployee',
+ __typename: 'Employee',
+ country: {
+ objectId: obj4.id,
+ name: 'imACountry',
+ __typename: 'Country',
},
- ],
- },
- ],
- },
- ],
- };
- expect(result).toEqual(expectedResult);
- }
- );
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ };
+ expect(result).toEqual(expectedResult);
+ });
it('should respect level permissions', async () => {
await prepareData();
@@ -8689,7 +8686,7 @@ describe('ParseGraphQLServer', () => {
expect(result2.companies.edges[0].node.objectId).toEqual(company1.id);
});
- it_only_db('mongo')('should support relational where query', async () => {
+ it('should support relational where query', async () => {
const president = new Parse.Object('President');
president.set('name', 'James');
await president.save();
diff --git a/spec/ParseObject.spec.js b/spec/ParseObject.spec.js
index 31855f9533..b67b3ed670 100644
--- a/spec/ParseObject.spec.js
+++ b/spec/ParseObject.spec.js
@@ -223,7 +223,7 @@ describe('Parse.Object testing', () => {
});
});
- it_exclude_dbs(['postgres'])('can set null', function (done) {
+ it('can set null', function (done) {
const obj = new Parse.Object('TestObject');
obj.set('foo', null);
obj.save().then(
@@ -232,7 +232,7 @@ describe('Parse.Object testing', () => {
equal(obj.get('foo'), null);
});
on_db('postgres', () => {
- fail('should not succeed');
+ equal(obj.get('foo'), null);
});
done();
},
diff --git a/spec/ParsePolygon.spec.js b/spec/ParsePolygon.spec.js
index e2319e75da..fd16832391 100644
--- a/spec/ParsePolygon.spec.js
+++ b/spec/ParsePolygon.spec.js
@@ -1,7 +1,6 @@
const TestObject = Parse.Object.extend('TestObject');
-const MongoStorageAdapter = require('../lib/Adapters/Storage/Mongo/MongoStorageAdapter').default;
-const mongoURI = 'mongodb://localhost:27017/parseServerMongoAdapterTestDatabase';
const request = require('../lib/request');
+const TestUtils = require('../lib/TestUtils');
const defaultHeaders = {
'X-Parse-Application-Id': 'test',
'X-Parse-Rest-API-Key': 'rest',
@@ -210,7 +209,7 @@ describe('Parse.Polygon testing', () => {
describe('with location', () => {
if (process.env.PARSE_SERVER_TEST_DB !== 'postgres') {
- beforeEach(() => require('../lib/TestUtils').destroyAllDataPermanently());
+ beforeEach(async () => await TestUtils.destroyAllDataPermanently());
}
it('polygonContain query', done => {
@@ -425,7 +424,15 @@ describe('Parse.Polygon testing', () => {
});
describe_only_db('mongo')('Parse.Polygon testing', () => {
- beforeEach(() => require('../lib/TestUtils').destroyAllDataPermanently());
+ const Config = require('../lib/Config');
+ let config;
+ beforeEach(async () => {
+ if (process.env.PARSE_SERVER_TEST_DB !== 'postgres') {
+ await TestUtils.destroyAllDataPermanently();
+ }
+ config = Config.get('test');
+ config.schemaCache.clear();
+ });
it('support 2d and 2dsphere', done => {
const coords = [
[0, 0],
@@ -437,7 +444,7 @@ describe_only_db('mongo')('Parse.Polygon testing', () => {
// testings against REST API, use raw formats
const polygon = { __type: 'Polygon', coordinates: coords };
const location = { __type: 'GeoPoint', latitude: 10, longitude: 10 };
- const databaseAdapter = new MongoStorageAdapter({ uri: mongoURI });
+ const databaseAdapter = config.database.adapter;
return reconfigureServer({
appId: 'test',
restAPIKey: 'rest',
diff --git a/spec/ParseRelation.spec.js b/spec/ParseRelation.spec.js
index a51d4c90ff..b6e94e1a02 100644
--- a/spec/ParseRelation.spec.js
+++ b/spec/ParseRelation.spec.js
@@ -172,7 +172,7 @@ describe('Parse.Relation testing', () => {
.then(done, done.fail);
});
- it_exclude_dbs(['postgres'])('queries with relations', async () => {
+ it('queries with relations', async () => {
const ChildObject = Parse.Object.extend('ChildObject');
const childObjects = [];
for (let i = 0; i < 10; i++) {
@@ -283,7 +283,7 @@ describe('Parse.Relation testing', () => {
});
});
- it_exclude_dbs(['postgres'])('query on pointer and relation fields with equal', done => {
+ it('query on pointer and relation fields with equal', done => {
const ChildObject = Parse.Object.extend('ChildObject');
const childObjects = [];
for (let i = 0; i < 10; i++) {
@@ -366,7 +366,7 @@ describe('Parse.Relation testing', () => {
});
});
- it_exclude_dbs(['postgres'])('or queries on pointer and relation fields', done => {
+ it('or queries on pointer and relation fields', done => {
const ChildObject = Parse.Object.extend('ChildObject');
const childObjects = [];
for (let i = 0; i < 10; i++) {
diff --git a/spec/SchemaPerformance.spec.js b/spec/SchemaPerformance.spec.js
index 21e97b0d43..0471871c54 100644
--- a/spec/SchemaPerformance.spec.js
+++ b/spec/SchemaPerformance.spec.js
@@ -1,15 +1,13 @@
const Config = require('../lib/Config');
-const MongoStorageAdapter = require('../lib/Adapters/Storage/Mongo/MongoStorageAdapter').default;
-const mongoURI = 'mongodb://localhost:27017/parseServerMongoAdapterTestDatabase';
-describe_only_db('mongo')('Schema Performance', function () {
+describe('Schema Performance', function () {
let getAllSpy;
let config;
beforeEach(async () => {
config = Config.get('test');
config.schemaCache.clear();
- const databaseAdapter = new MongoStorageAdapter({ uri: mongoURI });
+ const databaseAdapter = config.database.adapter;
await reconfigureServer({ databaseAdapter });
getAllSpy = spyOn(databaseAdapter, 'getAllClasses').and.callThrough();
});
@@ -204,6 +202,6 @@ describe_only_db('mongo')('Schema Performance', function () {
{},
config.database
);
- expect(getAllSpy.calls.count()).toBe(0);
+ expect(getAllSpy.calls.count()).toBe(2);
});
});
From 12eb6c823b97fe7682e44292c6f6072ea44c87d7 Mon Sep 17 00:00:00 2001
From: dblythy
Date: Tue, 19 Oct 2021 05:19:47 +1100
Subject: [PATCH 52/96] refactor: replace hardcoded error codes with references
(#7546)
---
spec/AuthenticationAdapters.spec.js | 2 +-
spec/CloudCode.spec.js | 18 ++++++-------
spec/CloudCodeLogger.spec.js | 6 +++--
spec/ParseAPI.spec.js | 2 +-
spec/ParseHooks.spec.js | 4 +--
spec/ParseRole.spec.js | 2 +-
spec/ParseUser.spec.js | 8 ++++--
spec/PointerPermissions.spec.js | 38 +++++++++++++--------------
spec/PushWorker.spec.js | 2 +-
spec/RegexVulnerabilities.spec.js | 2 +-
spec/VerifyUserPassword.spec.js | 32 ++++++++++++++++------
src/AccountLockout.js | 2 +-
src/LiveQuery/ParseLiveQueryServer.js | 19 +++++++++++---
13 files changed, 85 insertions(+), 52 deletions(-)
diff --git a/spec/AuthenticationAdapters.spec.js b/spec/AuthenticationAdapters.spec.js
index 9c6cfc6351..d32eba0423 100644
--- a/spec/AuthenticationAdapters.spec.js
+++ b/spec/AuthenticationAdapters.spec.js
@@ -1750,7 +1750,7 @@ describe('microsoft graph auth adapter', () => {
access_token: 'very.long.bad.token',
};
microsoft.validateAuthData(authData).then(done.fail, err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
expect(err.message).toBe('Microsoft Graph auth is invalid for this user.');
done();
});
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index fb9d3aedd7..a695357ae6 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -75,7 +75,7 @@ describe('Cloud Code', () => {
it('is cleared cleared after the previous test', done => {
Parse.Cloud.run('hello', {}).catch(error => {
- expect(error.code).toEqual(141);
+ expect(error.code).toEqual(Parse.Error.SCRIPT_FAILED);
done();
});
});
@@ -109,7 +109,7 @@ describe('Cloud Code', () => {
Parse.Cloud.run('cloudCodeWithError').then(
() => done.fail('should not succeed'),
e => {
- expect(e).toEqual(new Parse.Error(141, 'foo is not defined'));
+ expect(e).toEqual(new Parse.Error(Parse.Error.SCRIPT_FAILED, 'foo is not defined'));
done();
}
);
@@ -123,7 +123,7 @@ describe('Cloud Code', () => {
Parse.Cloud.run('cloudCodeWithError').then(
() => done.fail('should not succeed'),
e => {
- expect(e.code).toEqual(141);
+ expect(e.code).toEqual(Parse.Error.SCRIPT_FAILED);
expect(e.message).toEqual('Script failed.');
done();
}
@@ -142,7 +142,7 @@ describe('Cloud Code', () => {
const query = new Parse.Query('beforeFind');
await query.first();
} catch (e) {
- expect(e.code).toBe(141);
+ expect(e.code).toBe(Parse.Error.SCRIPT_FAILED);
expect(e.message).toBe('throw beforeFind');
done();
}
@@ -467,7 +467,7 @@ describe('Cloud Code', () => {
});
} catch (e) {
catched = true;
- expect(e.code).toBe(101);
+ expect(e.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
expect(catched).toBe(true);
expect(called).toBe(7);
@@ -479,7 +479,7 @@ describe('Cloud Code', () => {
});
} catch (e) {
catched = true;
- expect(e.code).toBe(101);
+ expect(e.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
expect(catched).toBe(true);
expect(called).toBe(7);
@@ -491,7 +491,7 @@ describe('Cloud Code', () => {
});
} catch (e) {
catched = true;
- expect(e.code).toBe(101);
+ expect(e.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
expect(catched).toBe(true);
expect(called).toBe(7);
@@ -1761,7 +1761,7 @@ describe('Cloud Code', () => {
it('should set the failure message on the job error', async () => {
Parse.Cloud.job('myJobError', () => {
- throw new Parse.Error(101, 'Something went wrong');
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Something went wrong');
});
const job = await Parse.Cloud.startJob('myJobError');
let jobStatus, status;
@@ -2038,7 +2038,7 @@ describe('beforeFind hooks', () => {
done();
},
err => {
- expect(err.code).toBe(141);
+ expect(err.code).toBe(Parse.Error.SCRIPT_FAILED);
expect(err.message).toEqual('Do not run that query');
done();
}
diff --git a/spec/CloudCodeLogger.spec.js b/spec/CloudCodeLogger.spec.js
index 78626e4efb..162a3390b7 100644
--- a/spec/CloudCodeLogger.spec.js
+++ b/spec/CloudCodeLogger.spec.js
@@ -161,7 +161,7 @@ describe('Cloud Code Logger', () => {
expect(log[0]).toEqual('error');
const error = log[2].error;
expect(error instanceof Parse.Error).toBeTruthy();
- expect(error.code).toBe(141);
+ expect(error.code).toBe(Parse.Error.SCRIPT_FAILED);
expect(error.message).toBe('uh oh!');
done();
});
@@ -199,7 +199,9 @@ describe('Cloud Code Logger', () => {
expect(log[1]).toMatch(
/Failed running cloud function aFunction for user [^ ]* with:\n {2}Input: {"foo":"bar"}\n {2}Error:/
);
- const errorString = JSON.stringify(new Parse.Error(141, 'it failed!'));
+ const errorString = JSON.stringify(
+ new Parse.Error(Parse.Error.SCRIPT_FAILED, 'it failed!')
+ );
expect(log[1].indexOf(errorString)).toBeGreaterThan(0);
done();
})
diff --git a/spec/ParseAPI.spec.js b/spec/ParseAPI.spec.js
index 4367a653fe..7bb6c9889b 100644
--- a/spec/ParseAPI.spec.js
+++ b/spec/ParseAPI.spec.js
@@ -1015,7 +1015,7 @@ describe('miscellaneous', function () {
done();
},
e => {
- expect(e.code).toEqual(141);
+ expect(e.code).toEqual(Parse.Error.SCRIPT_FAILED);
expect(e.message).toEqual('noway');
done();
}
diff --git a/spec/ParseHooks.spec.js b/spec/ParseHooks.spec.js
index a0f354f8ca..d5d980d3d0 100644
--- a/spec/ParseHooks.spec.js
+++ b/spec/ParseHooks.spec.js
@@ -464,7 +464,7 @@ describe('Hooks', () => {
expect(err).not.toBe(undefined);
expect(err).not.toBe(null);
if (err) {
- expect(err.code).toBe(141);
+ expect(err.code).toBe(Parse.Error.SCRIPT_FAILED);
expect(err.message.code).toEqual(1337);
expect(err.message.error).toEqual('hacking that one!');
}
@@ -536,7 +536,7 @@ describe('Hooks', () => {
expect(err).not.toBe(undefined);
expect(err).not.toBe(null);
if (err) {
- expect(err.code).toBe(141);
+ expect(err.code).toBe(Parse.Error.SCRIPT_FAILED);
expect(err.message).toEqual('incorrect key provided');
}
done();
diff --git a/spec/ParseRole.spec.js b/spec/ParseRole.spec.js
index eee05d5717..47fed865fb 100644
--- a/spec/ParseRole.spec.js
+++ b/spec/ParseRole.spec.js
@@ -428,7 +428,7 @@ describe('Parse Role testing', () => {
},
e => {
if (e) {
- expect(e.code).toEqual(101);
+ expect(e.code).toEqual(Parse.Error.OBJECT_NOT_FOUND);
} else {
fail('should return an error');
}
diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js
index ebdee6a191..e14d4847ac 100644
--- a/spec/ParseUser.spec.js
+++ b/spec/ParseUser.spec.js
@@ -72,7 +72,9 @@ describe('Parse.User testing', () => {
})
.catch(err => {
expect(err.status).toBe(404);
- expect(err.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(err.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
});
});
@@ -99,7 +101,9 @@ describe('Parse.User testing', () => {
})
.catch(err => {
expect(err.status).toBe(404);
- expect(err.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(err.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
});
});
diff --git a/spec/PointerPermissions.spec.js b/spec/PointerPermissions.spec.js
index e01da055be..c1c44af23d 100644
--- a/spec/PointerPermissions.spec.js
+++ b/spec/PointerPermissions.spec.js
@@ -99,7 +99,7 @@ describe('Pointer Permissions', () => {
},
err => {
// User 1 should not be able to update obj2
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
return Promise.resolve();
}
)
@@ -203,7 +203,7 @@ describe('Pointer Permissions', () => {
fail('User 2 should not get the obj1 object');
},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
expect(err.message).toBe('Object not found.');
return Promise.resolve();
}
@@ -530,7 +530,7 @@ describe('Pointer Permissions', () => {
done();
},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
done();
}
);
@@ -583,7 +583,7 @@ describe('Pointer Permissions', () => {
done();
},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
done();
}
);
@@ -695,7 +695,7 @@ describe('Pointer Permissions', () => {
done();
},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
done();
}
);
@@ -819,7 +819,7 @@ describe('Pointer Permissions', () => {
done();
},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
done();
}
);
@@ -848,7 +848,7 @@ describe('Pointer Permissions', () => {
.then(
() => {},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
return Promise.resolve();
}
)
@@ -891,7 +891,7 @@ describe('Pointer Permissions', () => {
.then(
() => {},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
return Promise.resolve();
}
)
@@ -934,7 +934,7 @@ describe('Pointer Permissions', () => {
.then(
() => {},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
return Promise.resolve();
}
)
@@ -977,7 +977,7 @@ describe('Pointer Permissions', () => {
fail();
},
err => {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
return Promise.resolve();
}
)
@@ -1111,7 +1111,7 @@ describe('Pointer Permissions', () => {
done.fail('User should not be able to update obj2');
} catch (err) {
// User 1 should not be able to update obj2
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
obj.set('hello', 'world');
@@ -1186,7 +1186,7 @@ describe('Pointer Permissions', () => {
await q.get(obj.id);
done.fail('User 3 should not get the obj1 object');
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
expect(err.message).toBe('Object not found.');
}
@@ -1541,7 +1541,7 @@ describe('Pointer Permissions', () => {
await obj.save({ key: 'value' });
done.fail('Should not succeed saving');
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
done();
}
});
@@ -1590,7 +1590,7 @@ describe('Pointer Permissions', () => {
await obj.save({ key: 'value' });
done.fail('Should not succeed saving');
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
}
done();
@@ -1692,7 +1692,7 @@ describe('Pointer Permissions', () => {
await obj.fetch();
done.fail('Should not succeed fetching');
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
done();
}
done();
@@ -1811,7 +1811,7 @@ describe('Pointer Permissions', () => {
await obj.fetch();
done.fail('Should not succeed fetching');
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
}
done();
@@ -1863,7 +1863,7 @@ describe('Pointer Permissions', () => {
await q.get(object.id);
done.fail();
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
try {
@@ -1894,7 +1894,7 @@ describe('Pointer Permissions', () => {
await object.save({ hello: 'bar' });
done.fail();
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
try {
@@ -1925,7 +1925,7 @@ describe('Pointer Permissions', () => {
await object.destroy();
done.fail();
} catch (err) {
- expect(err.code).toBe(101);
+ expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
}
try {
await object.destroy({ useMasterKey: true });
diff --git a/spec/PushWorker.spec.js b/spec/PushWorker.spec.js
index 422cdf592a..63e0945110 100644
--- a/spec/PushWorker.spec.js
+++ b/spec/PushWorker.spec.js
@@ -249,7 +249,7 @@ describe('PushWorker', () => {
// should not be deleted
transmitted: false,
device: {
- deviceToken: 101,
+ deviceToken: Parse.Error.OBJECT_NOT_FOUND,
deviceType: 'ios',
},
response: { error: 'invalid error...' },
diff --git a/spec/RegexVulnerabilities.spec.js b/spec/RegexVulnerabilities.spec.js
index 1a96ebfdf5..62af4f04e2 100644
--- a/spec/RegexVulnerabilities.spec.js
+++ b/spec/RegexVulnerabilities.spec.js
@@ -147,7 +147,7 @@ describe('Regex Vulnerabilities', function () {
await Parse.User.logIn('someemail@somedomain.com', 'newpassword');
fail('should not work');
} catch (e) {
- expect(e.code).toEqual(101);
+ expect(e.code).toEqual(Parse.Error.OBJECT_NOT_FOUND);
expect(e.message).toEqual('Invalid username/password.');
}
});
diff --git a/spec/VerifyUserPassword.spec.js b/spec/VerifyUserPassword.spec.js
index ad4571226e..6734dcdb71 100644
--- a/spec/VerifyUserPassword.spec.js
+++ b/spec/VerifyUserPassword.spec.js
@@ -79,7 +79,9 @@ describe('Verify User Password', () => {
})
.catch(err => {
expect(err.status).toBe(404);
- expect(err.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(err.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
});
});
@@ -221,7 +223,9 @@ describe('Verify User Password', () => {
})
.then(res => {
expect(res.status).toBe(404);
- expect(res.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(res.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
})
.catch(err => {
@@ -242,7 +246,9 @@ describe('Verify User Password', () => {
})
.then(res => {
expect(res.status).toBe(404);
- expect(res.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(res.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
})
.catch(err => {
@@ -263,7 +269,9 @@ describe('Verify User Password', () => {
})
.then(res => {
expect(res.status).toBe(404);
- expect(res.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(res.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
})
.catch(err => {
@@ -284,7 +292,9 @@ describe('Verify User Password', () => {
})
.then(res => {
expect(res.status).toBe(404);
- expect(res.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(res.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
})
.catch(err => {
@@ -305,7 +315,9 @@ describe('Verify User Password', () => {
})
.then(res => {
expect(res.status).toBe(404);
- expect(res.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(res.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
})
.catch(err => {
@@ -317,7 +329,9 @@ describe('Verify User Password', () => {
verifyPassword('mytestuser', 'mypass')
.then(res => {
expect(res.status).toBe(404);
- expect(res.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(res.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
})
.catch(err => {
@@ -329,7 +343,9 @@ describe('Verify User Password', () => {
verifyPassword('my@user.com', 'mypass', true)
.then(res => {
expect(res.status).toBe(404);
- expect(res.text).toMatch('{"code":101,"error":"Invalid username/password."}');
+ expect(res.text).toMatch(
+ `{"code":${Parse.Error.OBJECT_NOT_FOUND},"error":"Invalid username/password."}`
+ );
done();
})
.catch(err => {
diff --git a/src/AccountLockout.js b/src/AccountLockout.js
index ea5a220772..13d655e6b7 100644
--- a/src/AccountLockout.js
+++ b/src/AccountLockout.js
@@ -91,7 +91,7 @@ export class AccountLockout {
err &&
err.code &&
err.message &&
- err.code === 101 &&
+ err.code === Parse.Error.OBJECT_NOT_FOUND &&
err.message === 'Object not found.'
) {
return; // nothing to update so we are good
diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js
index 1a7f830327..d15a2bd70a 100644
--- a/src/LiveQuery/ParseLiveQueryServer.js
+++ b/src/LiveQuery/ParseLiveQueryServer.js
@@ -197,7 +197,7 @@ class ParseLiveQueryServer {
} catch (error) {
Client.pushError(
client.parseWebSocket,
- error.code || 141,
+ error.code || Parse.Error.SCRIPT_FAILED,
error.message || error,
false,
requestId
@@ -361,7 +361,7 @@ class ParseLiveQueryServer {
} catch (error) {
Client.pushError(
client.parseWebSocket,
- error.code || 141,
+ error.code || Parse.Error.SCRIPT_FAILED,
error.message || error,
false,
requestId
@@ -682,7 +682,12 @@ class ParseLiveQueryServer {
client.pushConnect();
runLiveQueryEventHandlers(req);
} catch (error) {
- Client.pushError(parseWebsocket, error.code || 141, error.message || error, false);
+ Client.pushError(
+ parseWebsocket,
+ error.code || Parse.Error.SCRIPT_FAILED,
+ error.message || error,
+ false
+ );
logger.error(
`Failed running beforeConnect for session ${request.sessionToken} with:\n Error: ` +
JSON.stringify(error)
@@ -822,7 +827,13 @@ class ParseLiveQueryServer {
installationId: client.installationId,
});
} catch (e) {
- Client.pushError(parseWebsocket, e.code || 141, e.message || e, false, request.requestId);
+ Client.pushError(
+ parseWebsocket,
+ e.code || Parse.Error.SCRIPT_FAILED,
+ e.message || e,
+ false,
+ request.requestId
+ );
logger.error(
`Failed running beforeSubscribe on ${className} for session ${request.sessionToken} with:\n Error: ` +
JSON.stringify(e)
From b4b46e6ba05d987f1e3a131b02e7ed0a4a029d67 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 21 Oct 2021 15:02:52 +0200
Subject: [PATCH 53/96] docs: restyle README header
---
README.md | 79 +++++++++++++++++++++++++++----------------------------
1 file changed, 39 insertions(+), 40 deletions(-)
diff --git a/README.md b/README.md
index 4de7400bdd..d84ce4a8e8 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,41 @@
-
-
-
-
-
-
- Parse Server is an open source backend that can be deployed to any infrastructure that can run Node.js.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Our Sponsors
-
-
Our backers and sponsors help to ensure the quality and timely development of the Parse Platform.
-
- 🥉 Bronze Sponsors
-
-
-
-
-
-
-
-
-
-
-Parse Server works with the Express web application framework. It can be added to existing web applications, or run by itself.
+![parse-repository-header-server](https://user-images.githubusercontent.com/5673677/138278489-7d0cebc5-1e31-4d3c-8ffb-53efcda6f29d.png)
+
+---
+
+[![Build Status](https://github.com/parse-community/parse-server/workflows/ci/badge.svg?branch=master)](https://github.com/parse-community/parse-server/actions?query=workflow%3Aci+branch%3Amaster)
+[![Snyk Badge](https://snyk.io/test/github/parse-community/parse-server/badge.svg)](https://snyk.io/test/github/parse-community/parse-server)
+[![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server/master.svg)](https://codecov.io/github/parse-community/parse-server?branch=master)
+
+[![Node Version](https://img.shields.io/badge/nodejs-12,_14,_15-green.svg?logo=node.js&style=flat)](https://nodejs.org)
+[![MongoDB Version](https://img.shields.io/badge/mongodb-4.0,_4.2,_4.4,_5.0-green.svg?logo=mongodb&style=flat)](https://www.mongodb.com)
+[![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
+
+[![npm latest version](https://img.shields.io/npm/v/parse-server/latest.svg)](https://www.npmjs.com/package/parse-server)
+[![npm beta version](https://img.shields.io/npm/v/parse-server/beta.svg)](https://www.npmjs.com/package/parse-server)
+[![npm alpha version](https://img.shields.io/npm/v/parse-server/alpha.svg)](https://www.npmjs.com/package/parse-server)
+
+[![Backers on Open Collective](https://opencollective.com/parse-server/backers/badge.svg)][open-collective-link]
+[![Sponsors on Open Collective](https://opencollective.com/parse-server/sponsors/badge.svg)][open-collective-link]
+[![License][license-svg]][license-link]
+[![Forum](https://img.shields.io/discourse/https/community.parseplatform.org/topics.svg)](https://community.parseplatform.org/c/parse-server)
+[![Twitter](https://img.shields.io/twitter/follow/ParsePlatform.svg?label=Follow&style=social)](https://twitter.com/intent/follow?screen_name=ParsePlatform)
+
+---
+
+Parse Server is an open source backend that can be deployed to any infrastructure that can run Node.js. Parse Server works with the Express web application framework. It can be added to existing web applications, or run by itself.
The full documentation for Parse Server is available in the [wiki](https://github.com/parse-community/parse-server/wiki). The [Parse Server guide](http://docs.parseplatform.org/parse-server/guide/) is a good place to get started. An [API reference](http://parseplatform.org/parse-server/api/) and [Cloud Code guide](https://docs.parseplatform.org/cloudcode/guide/) are also available. If you're interested in developing for Parse Server, the [Development guide](http://docs.parseplatform.org/parse-server/guide/#development-guide) will help you get set up.
+---
+
+A big *thank you* to all our backers and sponsors who support the development of Parse Platform!
+
+### 🥉 Bronze Sponsors
+
+[![Sponsor](https://opencollective.com/parse-server/sponsor/0/avatar.svg)](https://opencollective.com/parse-server/sponsor/0/website)
+
+---
+
- [Getting Started](#getting-started)
- [Running Parse Server](#running-parse-server)
- [Compatibility](#compatibility)
@@ -1154,3 +1149,7 @@ Support us with a monthly donation and help us continue our activities. [Become
-----
As of April 5, 2017, Parse, LLC has transferred this code to the parse-community organization, and will no longer be contributing to or distributing this code.
+
+[license-svg]: https://img.shields.io/badge/license-BSD-lightgrey.svg
+[license-link]: LICENSE
+[open-collective-link]: https://opencollective.com/parse-server
From 5a57475d3c02a6fd5d003e5c26a97829a3e0ef69 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 21 Oct 2021 15:04:49 +0200
Subject: [PATCH 54/96] docs: fix incorrect sponsor type in README
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d84ce4a8e8..3cfbbc4e27 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@ The full documentation for Parse Server is available in the [wiki](https://githu
A big *thank you* to all our backers and sponsors who support the development of Parse Platform!
-### 🥉 Bronze Sponsors
+### 💎 Diamond Sponsors
[![Sponsor](https://opencollective.com/parse-server/sponsor/0/avatar.svg)](https://opencollective.com/parse-server/sponsor/0/website)
From 4c29d4d23b67e4abaf25803fe71cae47ce1b5957 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 21 Oct 2021 15:11:19 +0200
Subject: [PATCH 55/96] docs: remove npm beta tag from README
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 3cfbbc4e27..c5338b3435 100644
--- a/README.md
+++ b/README.md
@@ -11,8 +11,8 @@
[![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
[![npm latest version](https://img.shields.io/npm/v/parse-server/latest.svg)](https://www.npmjs.com/package/parse-server)
-[![npm beta version](https://img.shields.io/npm/v/parse-server/beta.svg)](https://www.npmjs.com/package/parse-server)
[![npm alpha version](https://img.shields.io/npm/v/parse-server/alpha.svg)](https://www.npmjs.com/package/parse-server)
+
[![Backers on Open Collective](https://opencollective.com/parse-server/backers/badge.svg)][open-collective-link]
[![Sponsors on Open Collective](https://opencollective.com/parse-server/sponsors/badge.svg)][open-collective-link]
From 626fad2e71017dcc62196c487de5f908fa43000b Mon Sep 17 00:00:00 2001
From: Antoine Cormouls
Date: Wed, 27 Oct 2021 01:33:48 +0200
Subject: [PATCH 56/96] fix: setting a field to null does not delete it via
GraphQL API (#7649)
BREAKING CHANGE: To delete a field via the GraphQL API, the field value has to be set to `null`. Previously, setting a field value to `null` would save a null value in the database, which was not according to the [GraphQL specs](https://spec.graphql.org/June2018/#sec-Null-Value). To delete a file field use `file: null`, the previous way of using `file: { file: null }` has become obsolete.
---
CHANGELOG.md | 2 +-
spec/ParseGraphQLServer.spec.js | 158 ++++++++++++++++++++-
src/GraphQL/loaders/defaultGraphQLTypes.js | 10 +-
src/GraphQL/loaders/parseClassMutations.js | 12 +-
src/GraphQL/transformers/mutation.js | 25 +++-
5 files changed, 193 insertions(+), 14 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c876810e6b..50dfa2ffa6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -101,7 +101,7 @@ ___
# [Unreleased (master branch)](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.1...master)
## Breaking Changes
- - (none)
+ - feat: `null` value on field during graphql mutation now unset the value from the database, file unset changed
## Features
- (none)
## Bug Fixes
diff --git a/spec/ParseGraphQLServer.spec.js b/spec/ParseGraphQLServer.spec.js
index 9f75b94210..52427efcc2 100644
--- a/spec/ParseGraphQLServer.spec.js
+++ b/spec/ParseGraphQLServer.spec.js
@@ -6606,6 +6606,162 @@ describe('ParseGraphQLServer', () => {
);
});
});
+
+ it('should unset fields when null used on update/create', async () => {
+ const customerSchema = new Parse.Schema('Customer');
+ customerSchema.addString('aString');
+ customerSchema.addBoolean('aBoolean');
+ customerSchema.addDate('aDate');
+ customerSchema.addArray('aArray');
+ customerSchema.addGeoPoint('aGeoPoint');
+ customerSchema.addPointer('aPointer', 'Customer');
+ customerSchema.addObject('aObject');
+ customerSchema.addPolygon('aPolygon');
+ await customerSchema.save();
+
+ await parseGraphQLServer.parseGraphQLSchema.schemaCache.clear();
+
+ const cus = new Parse.Object('Customer');
+ await cus.save({ aString: 'hello' });
+
+ const fields = {
+ aString: "i'm string",
+ aBoolean: true,
+ aDate: new Date().toISOString(),
+ aArray: ['hello', 1],
+ aGeoPoint: { latitude: 30, longitude: 30 },
+ aPointer: { link: cus.id },
+ aObject: { prop: { subprop: 1 }, prop2: 'test' },
+ aPolygon: [
+ { latitude: 30, longitude: 30 },
+ { latitude: 31, longitude: 31 },
+ { latitude: 32, longitude: 32 },
+ { latitude: 30, longitude: 30 },
+ ],
+ };
+ const nullFields = Object.keys(fields).reduce((acc, k) => ({ ...acc, [k]: null }), {});
+ const result = await apolloClient.mutate({
+ mutation: gql`
+ mutation CreateCustomer($input: CreateCustomerInput!) {
+ createCustomer(input: $input) {
+ customer {
+ id
+ aString
+ aBoolean
+ aDate
+ aArray {
+ ... on Element {
+ value
+ }
+ }
+ aGeoPoint {
+ longitude
+ latitude
+ }
+ aPointer {
+ objectId
+ }
+ aObject
+ aPolygon {
+ longitude
+ latitude
+ }
+ }
+ }
+ }
+ `,
+ variables: {
+ input: { fields },
+ },
+ });
+ const {
+ data: {
+ createCustomer: {
+ customer: { aPointer, aArray, id, ...otherFields },
+ },
+ },
+ } = result;
+ expect(id).toBeDefined();
+ delete otherFields.__typename;
+ delete otherFields.aGeoPoint.__typename;
+ otherFields.aPolygon.forEach(v => {
+ delete v.__typename;
+ });
+ expect({
+ ...otherFields,
+ aPointer: { link: aPointer.objectId },
+ aArray: aArray.map(({ value }) => value),
+ }).toEqual(fields);
+
+ const updated = await apolloClient.mutate({
+ mutation: gql`
+ mutation UpdateCustomer($input: UpdateCustomerInput!) {
+ updateCustomer(input: $input) {
+ customer {
+ aString
+ aBoolean
+ aDate
+ aArray {
+ ... on Element {
+ value
+ }
+ }
+ aGeoPoint {
+ longitude
+ latitude
+ }
+ aPointer {
+ objectId
+ }
+ aObject
+ aPolygon {
+ longitude
+ latitude
+ }
+ }
+ }
+ }
+ `,
+ variables: {
+ input: { fields: nullFields, id },
+ },
+ });
+ const {
+ data: {
+ updateCustomer: { customer },
+ },
+ } = updated;
+ delete customer.__typename;
+ expect(Object.keys(customer).length).toEqual(8);
+ Object.keys(customer).forEach(k => {
+ expect(customer[k]).toBeNull();
+ });
+ try {
+ const queryResult = await apolloClient.query({
+ query: gql`
+ query getEmptyCustomer($where: CustomerWhereInput!) {
+ customers(where: $where) {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+ }
+ `,
+ variables: {
+ where: Object.keys(fields).reduce(
+ (acc, k) => ({ ...acc, [k]: { exists: false } }),
+ {}
+ ),
+ },
+ });
+
+ expect(queryResult.data.customers.edges.length).toEqual(1);
+ } catch (e) {
+ console.log(JSON.stringify(e));
+ }
+ });
});
describe('Files Mutations', () => {
@@ -9141,7 +9297,7 @@ describe('ParseGraphQLServer', () => {
const mutationResult = await apolloClient.mutate({
mutation: gql`
mutation UnlinkFile($id: ID!) {
- updateSomeClass(input: { id: $id, fields: { someField: { file: null } } }) {
+ updateSomeClass(input: { id: $id, fields: { someField: null } }) {
someClass {
someField {
name
diff --git a/src/GraphQL/loaders/defaultGraphQLTypes.js b/src/GraphQL/loaders/defaultGraphQLTypes.js
index d1d092ef6f..f340cfb35f 100644
--- a/src/GraphQL/loaders/defaultGraphQLTypes.js
+++ b/src/GraphQL/loaders/defaultGraphQLTypes.js
@@ -357,21 +357,17 @@ const FILE_INFO = new GraphQLObjectType({
const FILE_INPUT = new GraphQLInputObjectType({
name: 'FileInput',
+ description:
+ 'If this field is set to null the file will be unlinked (the file will not be deleted on cloud storage).',
fields: {
file: {
- description:
- 'A File Scalar can be an url or a FileInfo object. If this field is set to null the file will be unlinked.',
+ description: 'A File Scalar can be an url or a FileInfo object.',
type: FILE,
},
upload: {
description: 'Use this field if you want to create a new file.',
type: GraphQLUpload,
},
- unlink: {
- description:
- 'Use this field if you want to unlink the file (the file will not be deleted on cloud storage)',
- type: GraphQLBoolean,
- },
},
});
diff --git a/src/GraphQL/loaders/parseClassMutations.js b/src/GraphQL/loaders/parseClassMutations.js
index 0ebca5b077..41d7c09dde 100644
--- a/src/GraphQL/loaders/parseClassMutations.js
+++ b/src/GraphQL/loaders/parseClassMutations.js
@@ -10,6 +10,14 @@ import { ParseGraphQLClassConfig } from '../../Controllers/ParseGraphQLControlle
import { transformClassNameToGraphQL } from '../transformers/className';
import { transformTypes } from '../transformers/mutation';
+const filterDeletedFields = fields =>
+ Object.keys(fields).reduce((acc, key) => {
+ if (typeof fields[key] === 'object' && fields[key]?.__op === 'Delete') {
+ acc[key] = null;
+ }
+ return acc;
+ }, fields);
+
const getOnlyRequiredFields = (
updatedFields,
selectedFieldsString,
@@ -131,7 +139,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
[getGraphQLQueryName]: {
...createdObject,
updatedAt: createdObject.createdAt,
- ...parseFields,
+ ...filterDeletedFields(parseFields),
...optimizedObject,
},
};
@@ -240,7 +248,7 @@ const load = function (parseGraphQLSchema, parseClass, parseClassConfig: ?ParseG
[getGraphQLQueryName]: {
objectId: id,
...updatedObject,
- ...parseFields,
+ ...filterDeletedFields(parseFields),
...optimizedObject,
},
};
diff --git a/src/GraphQL/transformers/mutation.js b/src/GraphQL/transformers/mutation.js
index 583d330620..2a21816fe9 100644
--- a/src/GraphQL/transformers/mutation.js
+++ b/src/GraphQL/transformers/mutation.js
@@ -30,9 +30,17 @@ const transformTypes = async (
if (inputTypeField) {
switch (true) {
case inputTypeField.type === defaultGraphQLTypes.GEO_POINT_INPUT:
+ if (fields[field] === null) {
+ fields[field] = { __op: 'Delete' };
+ break;
+ }
fields[field] = transformers.geoPoint(fields[field]);
break;
case inputTypeField.type === defaultGraphQLTypes.POLYGON_INPUT:
+ if (fields[field] === null) {
+ fields[field] = { __op: 'Delete' };
+ break;
+ }
fields[field] = transformers.polygon(fields[field]);
break;
case inputTypeField.type === defaultGraphQLTypes.FILE_INPUT:
@@ -48,6 +56,10 @@ const transformTypes = async (
);
break;
case parseClass.fields[field].type === 'Pointer':
+ if (fields[field] === null) {
+ fields[field] = { __op: 'Delete' };
+ break;
+ }
fields[field] = await transformers.pointer(
parseClass.fields[field].targetClass,
field,
@@ -56,6 +68,12 @@ const transformTypes = async (
req
);
break;
+ default:
+ if (fields[field] === null) {
+ fields[field] = { __op: 'Delete' };
+ return;
+ }
+ break;
}
}
});
@@ -66,10 +84,11 @@ const transformTypes = async (
};
const transformers = {
- file: async ({ file, upload }, { config }) => {
- if (file === null && !upload) {
- return null;
+ file: async (input, { config }) => {
+ if (input === null) {
+ return { __op: 'Delete' };
}
+ const { file, upload } = input;
if (upload) {
const { fileInfo } = await handleUpload(upload, config);
return { ...fileInfo, __type: 'File' };
From d3e914280ddca91e8dd6947a14d93fb9d4aea2e1 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 27 Oct 2021 02:53:46 +0200
Subject: [PATCH 57/96] ci: add release automation (#7656)
---
.github/workflows/ci.yml | 3 +-
.../workflows/release-automated-scheduler.yml | 74 +
.github/workflows/release-automated.yml | 115 +
.github/workflows/release.yml | 64 -
.releaserc/commit.hbs | 61 +
.releaserc/footer.hbs | 11 +
.releaserc/header.hbs | 25 +
.releaserc/template.hbs | 14 +
CHANGELOG.md | 1975 +----------------
README.md | 1 +
changelogs/CHANGELOG_alpha.md | 67 +
changelogs/CHANGELOG_release.md | 1709 ++++++++++++++
release.config.js | 114 +
13 files changed, 2227 insertions(+), 2006 deletions(-)
create mode 100644 .github/workflows/release-automated-scheduler.yml
create mode 100644 .github/workflows/release-automated.yml
delete mode 100644 .github/workflows/release.yml
create mode 100644 .releaserc/commit.hbs
create mode 100644 .releaserc/footer.hbs
create mode 100644 .releaserc/header.hbs
create mode 100644 .releaserc/template.hbs
create mode 100644 changelogs/CHANGELOG_alpha.md
create mode 100644 changelogs/CHANGELOG_release.md
create mode 100644 release.config.js
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a26410a803..20572cdefb 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,8 +1,7 @@
name: ci
on:
push:
- branches:
- - master
+ branches: [ release, alpha, beta, next-major ]
pull_request:
branches:
- '**'
diff --git a/.github/workflows/release-automated-scheduler.yml b/.github/workflows/release-automated-scheduler.yml
new file mode 100644
index 0000000000..d67b102e27
--- /dev/null
+++ b/.github/workflows/release-automated-scheduler.yml
@@ -0,0 +1,74 @@
+# This scheduler creates pull requests to prepare for releases in intervals according to the
+# release cycle of this repository.
+
+name: release-automated-scheduler
+on:
+# Scheduler temporarily disabled until stable release of Parse Server 5 with all branches (alpha, beta, release) created
+# schedule:
+# - cron: 0 0 1 * *
+ workflow_dispatch:
+
+jobs:
+ create-pr-release:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout beta branch
+ uses: actions/checkout@v2
+ with:
+ ref: beta
+ - name: Compose branch name for PR
+ id: branch
+ run: echo "::set-output name=name::build-release-${{ github.run_id }}${{ github.run_number }}"
+ - name: Create branch
+ run: |
+ git config --global user.email ${{ github.actor }}@users.noreply.github.com
+ git config --global user.name ${{ github.actor }}
+ git checkout -b ${{ steps.branch.outputs.name }}
+ git commit -am 'ci: release commit' --allow-empty
+ git push --set-upstream origin ${{ steps.branch.outputs.name }}
+ - name: Create PR
+ uses: k3rnels-actions/pr-update@v1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ pr_title: "build: release"
+ pr_source: ${{ steps.branch.outputs.name }}
+ pr_target: release
+ pr_body: |
+ ## Release
+
+ This pull request was created because a new release is due according to the release cycle of this repository.
+ Just resolve any conflicts and it's good to merge. Any version increment will be done by release automation.
+
+ *⚠️ Use `Merge commit` to merge this pull request. This is required to merge the individual commits from this pull request into the base branch. Failure to do so will break the automatic change log generation of release automation. Do not use "Squash and merge"!*
+ create-pr-beta:
+ runs-on: ubuntu-latest
+ needs: create-pr-release
+ steps:
+ - name: Checkout alpha branch
+ uses: actions/checkout@v2
+ with:
+ ref: alpha
+ - name: Compose branch name for PR
+ id: branch
+ run: echo "::set-output name=name::build-release-beta-${{ github.run_id }}${{ github.run_number }}"
+ - name: Create branch
+ run: |
+ git config --global user.email ${{ github.actor }}@users.noreply.github.com
+ git config --global user.name ${{ github.actor }}
+ git checkout -b ${{ steps.branch.outputs.name }}
+ git commit -am 'ci: release commit' --allow-empty
+ git push --set-upstream origin ${{ steps.branch.outputs.name }}
+ - name: Create PR
+ uses: k3rnels-actions/pr-update@v1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ pr_title: "build: release beta"
+ pr_source: ${{ steps.branch.outputs.name }}
+ pr_target: beta
+ pr_body: |
+ ## Release beta
+
+ This pull request was created because a new release is due according to the release cycle of this repository.
+ Just resolve any conflicts and it's good to merge. Any version increment will be done by release automation.
+
+ *⚠️ Use `Merge commit` to merge this pull request. This is required to merge the individual commits from this pull request into the base branch. Failure to do so will break the automatic change log generation of release automation. Do not use "Squash and merge"!*
diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml
new file mode 100644
index 0000000000..daba13319b
--- /dev/null
+++ b/.github/workflows/release-automated.yml
@@ -0,0 +1,115 @@
+name: release-automated
+on:
+ push:
+ branches: [ release, alpha, beta, next-major ]
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ outputs:
+ current_tag: ${{ steps.tag.outputs.current_tag }}
+ trigger_branch: ${{ steps.branch.outputs.trigger_branch }}
+ steps:
+ - name: Determine trigger branch name
+ id: branch
+ run: echo "::set-output name=trigger_branch::${GITHUB_REF#refs/*/}"
+ - uses: actions/checkout@v2
+ with:
+ persist-credentials: false
+ - uses: actions/setup-node@v2
+ with:
+ node-version: 14
+ registry-url: https://registry.npmjs.org/
+ - name: Cache Node.js modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-
+ - run: npm ci
+ - run: npx semantic-release
+ env:
+ GH_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+ - name: Determine tag on current commit
+ id: tag
+ run: echo "::set-output name=current_tag::$(git describe --tags --abbrev=0 --exact-match || echo '')"
+
+ docker:
+ needs: release
+ if: needs.release.outputs.current_tag != ''
+ env:
+ REGISTRY: docker.io
+ IMAGE_NAME: parseplatform/parse-server
+ runs-on: ubuntu-18.04
+ permissions:
+ contents: read
+ packages: write
+ steps:
+ - name: Determine branch name
+ id: branch
+ run: echo "::set-output name=branch_name::${GITHUB_REF#refs/*/}"
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ with:
+ ref: ${{ needs.release.outputs.current_tag }}
+ - name: Set up QEMU
+ id: qemu
+ uses: docker/setup-qemu-action@v1
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+ - name: Log into Docker Hub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Extract Docker metadata
+ id: meta
+ uses: docker/metadata-action@v3
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+ flavor: |
+ latest=${{ steps.branch.outputs.branch_name == 'release' }}
+ tags: |
+ type=semver,pattern={{version}},value=${{ needs.release.outputs.current_tag }}
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ platforms: linux/amd64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+
+ docs:
+ needs: release
+ if: needs.release.outputs.current_tag != '' && github.ref == 'refs/heads/release'
+ runs-on: ubuntu-18.04
+ timeout-minutes: 15
+ steps:
+ - uses: actions/checkout@v2
+ - name: Use Node.js
+ uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - name: Cache Node.js modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-
+ - name: Generate Docs
+ run: |
+ echo $SOURCE_TAG
+ npm ci
+ ./release_docs.sh
+ env:
+ SOURCE_TAG: ${{ needs.release.outputs.current_tag }}
+ - name: Deploy
+ uses: peaceiris/actions-gh-pages@v3.7.3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./docs
\ No newline at end of file
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 90d5b8ac36..0000000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,64 +0,0 @@
-name: release
-on:
- release:
- types: [published]
-jobs:
- publish-npm:
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v1
- with:
- node-version: '12.2'
- registry-url: https://registry.npmjs.org/
- - name: Cache Node.js modules
- uses: actions/cache@v2
- with:
- path: ~/.npm
- key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
- restore-keys: |
- ${{ runner.os }}-node-
- - run: npm ci
-# Disable publishing until release automation; enable ad-hoc with correct npm tag (alpha, beta)
-# - run: npm publish --tag alpha
-# env:
-# NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
- publish-docs:
- runs-on: ubuntu-18.04
- timeout-minutes: 30
- steps:
- - uses: actions/checkout@v2
- - name: Use Node.js
- uses: actions/setup-node@v1
- with:
- node-version: '12.2'
- - name: Cache Node.js modules
- uses: actions/cache@v2
- with:
- path: ~/.npm
- key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
- restore-keys: |
- ${{ runner.os }}-node-
- - name: Get Tag
- uses: actions/github-script@v3
- id: tag
- with:
- github-token: ${{secrets.GITHUB_TOKEN}}
- result-encoding: string
- script: |
- const ref = process.env.GITHUB_REF
- if(!ref.startsWith('refs/tags/'))
- return ''
- return ref.replace(/^refs\/tags\//, '')
- - name: Generate Docs
- run: |
- echo $SOURCE_TAG
- npm ci
- ./release_docs.sh
- env:
- SOURCE_TAG: ${{ steps.tag.outputs.result }}
- - name: Deploy
- uses: peaceiris/actions-gh-pages@v3.7.3
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
- publish_dir: ./docs
diff --git a/.releaserc/commit.hbs b/.releaserc/commit.hbs
new file mode 100644
index 0000000000..e10a0d9012
--- /dev/null
+++ b/.releaserc/commit.hbs
@@ -0,0 +1,61 @@
+*{{#if scope}} **{{scope}}:**
+{{~/if}} {{#if subject}}
+ {{~subject}}
+{{~else}}
+ {{~header}}
+{{~/if}}
+
+{{~!-- commit link --}} {{#if @root.linkReferences~}}
+ ([{{shortHash}}](
+ {{~#if @root.repository}}
+ {{~#if @root.host}}
+ {{~@root.host}}/
+ {{~/if}}
+ {{~#if @root.owner}}
+ {{~@root.owner}}/
+ {{~/if}}
+ {{~@root.repository}}
+ {{~else}}
+ {{~@root.repoUrl}}
+ {{~/if}}/
+ {{~@root.commit}}/{{hash}}))
+{{~else}}
+ {{~shortHash}}
+{{~/if}}
+
+{{~!-- commit references --}}
+{{~#if references~}}
+ , closes
+ {{~#each references}} {{#if @root.linkReferences~}}
+ [
+ {{~#if this.owner}}
+ {{~this.owner}}/
+ {{~/if}}
+ {{~this.repository}}#{{this.issue}}](
+ {{~#if @root.repository}}
+ {{~#if @root.host}}
+ {{~@root.host}}/
+ {{~/if}}
+ {{~#if this.repository}}
+ {{~#if this.owner}}
+ {{~this.owner}}/
+ {{~/if}}
+ {{~this.repository}}
+ {{~else}}
+ {{~#if @root.owner}}
+ {{~@root.owner}}/
+ {{~/if}}
+ {{~@root.repository}}
+ {{~/if}}
+ {{~else}}
+ {{~@root.repoUrl}}
+ {{~/if}}/
+ {{~@root.issue}}/{{this.issue}})
+ {{~else}}
+ {{~#if this.owner}}
+ {{~this.owner}}/
+ {{~/if}}
+ {{~this.repository}}#{{this.issue}}
+ {{~/if}}{{/each}}
+{{~/if}}
+
diff --git a/.releaserc/footer.hbs b/.releaserc/footer.hbs
new file mode 100644
index 0000000000..575df456e5
--- /dev/null
+++ b/.releaserc/footer.hbs
@@ -0,0 +1,11 @@
+{{#if noteGroups}}
+{{#each noteGroups}}
+
+### {{title}}
+
+{{#each notes}}
+* {{#if commit.scope}}**{{commit.scope}}:** {{/if}}{{text}} ([{{commit.shortHash}}]({{commit.shortHash}}))
+{{/each}}
+{{/each}}
+
+{{/if}}
diff --git a/.releaserc/header.hbs b/.releaserc/header.hbs
new file mode 100644
index 0000000000..fc781c4b51
--- /dev/null
+++ b/.releaserc/header.hbs
@@ -0,0 +1,25 @@
+{{#if isPatch~}}
+ ##
+{{~else~}}
+ #
+{{~/if}} {{#if @root.linkCompare~}}
+ [{{version}}](
+ {{~#if @root.repository~}}
+ {{~#if @root.host}}
+ {{~@root.host}}/
+ {{~/if}}
+ {{~#if @root.owner}}
+ {{~@root.owner}}/
+ {{~/if}}
+ {{~@root.repository}}
+ {{~else}}
+ {{~@root.repoUrl}}
+ {{~/if~}}
+ /compare/{{previousTag}}...{{currentTag}})
+{{~else}}
+ {{~version}}
+{{~/if}}
+{{~#if title}} "{{title}}"
+{{~/if}}
+{{~#if date}} ({{date}})
+{{/if}}
diff --git a/.releaserc/template.hbs b/.releaserc/template.hbs
new file mode 100644
index 0000000000..63610bdcb7
--- /dev/null
+++ b/.releaserc/template.hbs
@@ -0,0 +1,14 @@
+{{> header}}
+
+{{#each commitGroups}}
+
+{{#if title}}
+### {{title}}
+
+{{/if}}
+{{#each commits}}
+{{> commit root=@root}}
+{{/each}}
+{{/each}}
+
+{{> footer}}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 50dfa2ffa6..51ff85f1af 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,1955 +1,50 @@
-# Parse Server Changelog
+# Changelog
-Jump directly to a version:
+Changelogs are separated by release type for better overview.
-| 5.x |
-|-------------------------------------------|
-| [5.0.0-alpha.1 (pre-release)](#500-alpha1-2021-10-12) |
+## ✅ [Stable Releases][log_release]
-| 4.x |
-|--------------------------------------|
-| [**4.10.4 (latest release)**](#4104) |
-| [4.10.3](#4103) |
-| [4.10.2](#4102) |
-| [4.10.1](#4101) |
-| [4.10.0](#4100) |
-| [4.5.2](#452) |
-| [4.5.1](#451) |
-| [4.5.0](#450) |
-| [4.4.0](#440) |
-| [4.3.0](#430) |
-| [4.2.0](#420) |
-| [4.1.0](#410) |
-| [4.0.2](#402) |
-| [4.0.1](#401) |
-| [4.0.0](#400) |
+> ### “Stable for production!”
-
-Previous Versions
+These are the official, stable releases that you can use in your production environments.
-| 3.x | 2.x |
-|-----------------|-----------------|
-| [3.10.0](#3100) | [2.8.4](#284) |
-| [3.9.0](#390) | [2.8.3](#283) |
-| [3.8.0](#380) | [2.8.2](#282) |
-| [3.7.2](#372) | [2.8.1](#281) |
-| [3.7.1](#371) | [2.8.0](#280) |
-| [3.7.0](#370) | [2.7.4](#274) |
-| [3.6.0](#360) | [2.7.3](#273) |
-| [3.5.0](#350) | [2.7.2](#272) |
-| [3.4.4](#344) | [2.7.1](#271) |
-| [3.4.3](#343) | [2.7.0](#270) |
-| [3.4.2](#342) | [2.6.5](#265) |
-| [3.4.1](#341) | [2.6.4](#264) |
-| [3.4.0](#340) | [2.6.3](#263) |
-| [3.3.0](#330) | [2.6.2](#262) |
-| [3.2.3](#323) | [2.6.1](#261) |
-| [3.2.2](#322) | [2.6.0](#260) |
-| [3.2.1](#321) | [2.5.3](#253) |
-| [3.2.0](#320) | [2.5.2](#252) |
-| [3.1.3](#313) | [2.5.1](#251) |
-| [3.1.2](#312) | [2.5.0](#250) |
-| [3.1.1](#311) | [2.4.2](#242) |
-| [3.1.0](#310) | [2.4.1](#241) |
-| [3.0.0](#300) | [2.4.0](#240) |
-| | [2.3.8](#238) |
-| | [2.3.7](#237) |
-| | [2.3.6](#236) |
-| | [2.3.5](#235) |
-| | [2.3.3](#233) |
-| | [2.3.2](#232) |
-| | [2.3.1](#231) |
-| | [2.3.0](#230) |
-| | [2.2.25](#2225) |
-| | [2.2.24](#2224) |
-| | [2.2.23](#2223) |
-| | [2.2.22](#2222) |
-| | [2.2.21](#2221) |
-| | [2.2.20](#2220) |
-| | [2.2.19](#2219) |
-| | [2.2.18](#2218) |
-| | [2.2.17](#2217) |
-| | [2.2.16](#2216) |
-| | [2.2.15](#2215) |
-| | [2.2.14](#2214) |
-| | [2.2.13](#2213) |
-| | [2.2.12](#2212) |
-| | [2.2.11](#2211) |
-| | [2.2.10](#2210) |
-| | [2.2.9](#229) |
-| | [2.2.8](#228) |
-| | [2.2.7](#227) |
-| | [2.2.6](#226) |
-| | [2.2.5](#225) |
-| | [2.2.4](#224) |
-| | [2.2.3](#223) |
-| | [2.2.2](#222) |
-| | [2.2.1](#221) |
-| | [2.2.0](#220) |
-| | [2.1.6](#216) |
-| | [2.1.5](#215) |
-| | [2.1.4](#214) |
-| | [2.1.3](#213) |
-| | [2.1.2](#212) |
-| | [2.1.1](#211) |
-| | [2.1.0](#210) |
-| | [2.0.8](#208) |
-
+Details:
+- Stability: *stable*
+- NPM channel: `@latest`
+- Branch: [release][branch_release]
+- Purpose: official release
+- Suitable environment: production
-___
+## ⚠️ [Beta Releases][log_beta]
-# [Unreleased (master branch)](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.1...master)
+> ### “Please try out, we’d love your feedback!”
-## Breaking Changes
- - feat: `null` value on field during graphql mutation now unset the value from the database, file unset changed
-## Features
- - (none)
-## Bug Fixes
- - (none)
+These are releases that are pretty stable, but may have still some bugs to be fixed before official release.
-# [5.0.0-alpha.1](https://github.com/parse-community/parse-server/compare/4.10.4...5.0.0-alpha.1) (2021-10-12)
+Details:
+- Stability: *pretty stable*
+- NPM channel: `@beta`
+- Branch: [beta][branch_beta]
+- Purpose: feature maturation
+- Suitable environment: development
-## Breaking Changes
-- Improved schema caching through database real-time hooks. Reduces DB queries, decreases Parse Query execution time and fixes a potential schema memory leak. If multiple Parse Server instances connect to the same DB (for example behind a load balancer), set the [Parse Server Option](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) `databaseOptions.enableSchemaHooks: true` to enable this feature and keep the schema in sync across all instances. Failing to do so will cause a schema change to not propagate to other instances and re-syncing will only happen when these instances restart. The options `enableSingleSchemaCache` and `schemaCacheTTL` have been removed. To use this feature with MongoDB, a replica set cluster with [change stream](https://docs.mongodb.com/manual/changeStreams/#availability) support is required. (Diamond Lewis, SebC) [#7214](https://github.com/parse-community/parse-server/issues/7214)
-- Added file upload restriction. File upload is now only allowed for authenticated users by default for improved security. To allow file upload also for Anonymous Users or Public, set the `fileUpload` parameter in the [Parse Server Options](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) (dblythy, Manuel Trezza) [#7071](https://github.com/parse-community/parse-server/pull/7071)
-- Removed [parse-server-simple-mailgun-adapter](https://github.com/parse-community/parse-server-simple-mailgun-adapter) dependency; to continue using the adapter it has to be explicitly installed (Manuel Trezza) [#7321](https://github.com/parse-community/parse-server/pull/7321)
-- Remove support for MongoDB 3.6 which has reached its End-of-Life date and PostgreSQL 10 (Manuel Trezza) [#7315](https://github.com/parse-community/parse-server/pull/7315)
-- Remove support for Node 10 which has reached its End-of-Life date (Manuel Trezza) [#7314](https://github.com/parse-community/parse-server/pull/7314)
-- Remove S3 Files Adapter from Parse Server, instead install separately as `@parse/s3-files-adapter` (Manuel Trezza) [#7324](https://github.com/parse-community/parse-server/pull/7324)
-- Remove Session field `restricted`; the field was a code artifact from a feature that never existed in Open Source Parse Server; if you have been using this field for custom purposes, consider that for new Parse Server installations the field does not exist anymore in the schema, and for existing installations the field default value `false` will not be set anymore when creating a new session (Manuel Trezza) [#7543](https://github.com/parse-community/parse-server/pull/7543)
-- ci: add node engine version check (Manuel Trezza) [#7574](https://github.com/parse-community/parse-server/pull/7574)
+## 🔥 [Alpha Releases][log_alpha]
-## Notable Changes
-- Alphabetical ordered GraphQL API, improved GraphQL Schema cache system and fix GraphQL input reassign issue (Moumouls) [#7344](https://github.com/parse-community/parse-server/issues/7344)
-- Added Parse Server Security Check to report weak security settings (Manuel Trezza, dblythy) [#7247](https://github.com/parse-community/parse-server/issues/7247)
-- EXPERIMENTAL: Added new page router with placeholder rendering and localization of custom and feature pages such as password reset and email verification (Manuel Trezza) [#7128](https://github.com/parse-community/parse-server/pull/7128)
-- EXPERIMENTAL: Added custom routes to easily customize flows for password reset, email verification or build entirely new flows (Manuel Trezza) [#7231](https://github.com/parse-community/parse-server/pull/7231)
-- Added Deprecation Policy to govern the introduction of breaking changes in a phased pattern that is more predictable for developers (Manuel Trezza) [#7199](https://github.com/parse-community/parse-server/pull/7199)
-- Add REST API endpoint `/loginAs` to create session of any user with master key; allows to impersonate another user. (GormanFletcher) [#7406](https://github.com/parse-community/parse-server/pull/7406)
-- Add official support for MongoDB 5.0 (Manuel Trezza) [#7469](https://github.com/parse-community/parse-server/pull/7469)
-- Added Parse Server Configuration `enforcePrivateUsers`, which will remove public access by default on new Parse.Users (dblythy) [#7319](https://github.com/parse-community/parse-server/pull/7319)
+> ### “If you are curious to see what's next!”
-## Other Changes
-- Support native mongodb syntax in aggregation pipelines (Raschid JF Rafeally) [#7339](https://github.com/parse-community/parse-server/pull/7339)
-- Fix error when a not yet inserted job is updated (Antonio Davi Macedo Coelho de Castro) [#7196](https://github.com/parse-community/parse-server/pull/7196)
-- request.context for afterFind triggers (dblythy) [#7078](https://github.com/parse-community/parse-server/pull/7078)
-- Winston Logger interpolating stdout to console (dplewis) [#7114](https://github.com/parse-community/parse-server/pull/7114)
-- Added convenience method `Parse.Cloud.sendEmail(...)` to send email via email adapter in Cloud Code (dblythy) [#7089](https://github.com/parse-community/parse-server/pull/7089)
-- LiveQuery support for $and, $nor, $containedBy, $geoWithin, $geoIntersects queries (dplewis) [#7113](https://github.com/parse-community/parse-server/pull/7113)
-- Supporting patterns in LiveQuery server's config parameter `classNames` (Nes-si) [#7131](https://github.com/parse-community/parse-server/pull/7131)
-- Added `requireAnyUserRoles` and `requireAllUserRoles` for Parse Cloud validator (dblythy) [#7097](https://github.com/parse-community/parse-server/pull/7097)
-- Support Facebook Limited Login (miguel-s) [#7219](https://github.com/parse-community/parse-server/pull/7219)
-- Removed Stage name check on aggregate pipelines (BRETT71) [#7237](https://github.com/parse-community/parse-server/pull/7237)
-- Retry transactions on MongoDB when it fails due to transient error (Antonio Davi Macedo Coelho de Castro) [#7187](https://github.com/parse-community/parse-server/pull/7187)
-- Bump tests to use Mongo 4.4.4 (Antonio Davi Macedo Coelho de Castro) [#7184](https://github.com/parse-community/parse-server/pull/7184)
-- Added new account lockout policy option `accountLockout.unlockOnPasswordReset` to automatically unlock account on password reset (Manuel Trezza) [#7146](https://github.com/parse-community/parse-server/pull/7146)
-- Test Parse Server continuously against all recent MongoDB versions that have not reached their end-of-life support date, added MongoDB compatibility table to Parse Server docs (Manuel Trezza) [#7161](https://github.com/parse-community/parse-server/pull/7161)
-- Test Parse Server continuously against all recent Node.js versions that have not reached their end-of-life support date, added Node.js compatibility table to Parse Server docs (Manuel Trezza) [7161](https://github.com/parse-community/parse-server/pull/7177)
-- Throw error on invalid Cloud Function validation configuration (dblythy) [#7154](https://github.com/parse-community/parse-server/pull/7154)
-- Allow Cloud Validator `options` to be async (dblythy) [#7155](https://github.com/parse-community/parse-server/pull/7155)
-- Optimize queries on classes with pointer permissions (Pedro Diaz) [#7061](https://github.com/parse-community/parse-server/pull/7061)
-- Test Parse Server continuously against all relevant Postgres versions (minor versions), added Postgres compatibility table to Parse Server docs (Corey Baker) [#7176](https://github.com/parse-community/parse-server/pull/7176)
-- Randomize test suite (Diamond Lewis) [#7265](https://github.com/parse-community/parse-server/pull/7265)
-- LDAP: Properly unbind client on group search error (Diamond Lewis) [#7265](https://github.com/parse-community/parse-server/pull/7265)
-- Improve data consistency in Push and Job Status update (Diamond Lewis) [#7267](https://github.com/parse-community/parse-server/pull/7267)
-- Excluding keys that have trailing edges.node when performing GraphQL resolver (Chris Bland) [#7273](https://github.com/parse-community/parse-server/pull/7273)
-- Added centralized feature deprecation with standardized warning logs (Manuel Trezza) [#7303](https://github.com/parse-community/parse-server/pull/7303)
-- Use Node.js 15.13.0 in CI (Olle Jonsson) [#7312](https://github.com/parse-community/parse-server/pull/7312)
-- Fix file upload issue for S3 compatible storage (Linode, DigitalOcean) by avoiding empty tags property when creating a file (Ali Oguzhan Yildiz) [#7300](https://github.com/parse-community/parse-server/pull/7300)
-- Add building Docker image as CI check (Manuel Trezza) [#7332](https://github.com/parse-community/parse-server/pull/7332)
-- Add NPM package-lock version check to CI (Manuel Trezza) [#7333](https://github.com/parse-community/parse-server/pull/7333)
-- Fix incorrect LiveQuery events triggered for multiple subscriptions on the same class with different events [#7341](https://github.com/parse-community/parse-server/pull/7341)
-- Fix select and excludeKey queries to properly accept JSON string arrays. Also allow nested fields in exclude (Corey Baker) [#7242](https://github.com/parse-community/parse-server/pull/7242)
-- Fix LiveQuery server crash when using $all query operator on a missing object key (Jason Posthuma) [#7421](https://github.com/parse-community/parse-server/pull/7421)
-- Added runtime deprecation warnings (Manuel Trezza) [#7451](https://github.com/parse-community/parse-server/pull/7451)
-- Add ability to pass context of an object via a header, X-Parse-Cloud-Context, for Cloud Code triggers. The header addition allows client SDK's to add context without injecting _context in the body of JSON objects (Corey Baker) [#7437](https://github.com/parse-community/parse-server/pull/7437)
-- Add CI check to add changelog entry (Manuel Trezza) [#7512](https://github.com/parse-community/parse-server/pull/7512)
-- Refactor: uniform issue templates across repos (Manuel Trezza) [#7528](https://github.com/parse-community/parse-server/pull/7528)
-- ci: bump ci environment (Manuel Trezza) [#7539](https://github.com/parse-community/parse-server/pull/7539)
-- CI now pushes docker images to Docker Hub (Corey Baker) [#7548](https://github.com/parse-community/parse-server/pull/7548)
-- Allow afterFind and afterLiveQueryEvent to set unsaved pointers and keys (dblythy) [#7310](https://github.com/parse-community/parse-server/pull/7310)
-- Allow setting descending sort to full text queries (dblythy) [#7496](https://github.com/parse-community/parse-server/pull/7496)
-- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
-- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
-- refactor: deprecate `Parse.Cloud.httpRequest`; it is recommended to use a HTTP library instead. (Daniel Blyth) [#7595](https://github.com/parse-community/parse-server/pull/7595)
-- refactor: Modernize HTTPRequest tests (brandongregoryscott) [#7604](https://github.com/parse-community/parse-server/pull/7604)
-- Allow liveQuery on Session class (Daniel Blyth) [#7554](https://github.com/parse-community/parse-server/pull/7554)
+These releases contain the latest development changes, but you should be prepared for anything, including sudden breaking changes or code refactoring. Use this branch to contribute to the project and open pull requests.
-# 4.10.4
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.3...4.10.4)
+Details:
+- Stability: *unstable*
+- NPM channel: `@alpha`
+- Branch: [alpha][branch_alpha]
+- Purpose: product development
+- Suitable environment: experimental
-## Security Fixes
-- Strip out sessionToken when LiveQuery is used on Parse.User (Daniel Blyth) [GHSA-7pr3-p5fm-8r9x](https://github.com/parse-community/parse-server/security/advisories/GHSA-7pr3-p5fm-8r9x)
-# 4.10.3
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.2...4.10.3)
-
-## Security Fixes
-- Validate `explain` query parameter to avoid a server crash due to MongoDB bug [NODE-3463](https://jira.mongodb.org/browse/NODE-3463) (Kartal Kaan Bozdogan) [GHSA-xqp8-w826-hh6x](https://github.com/parse-community/parse-server/security/advisories/GHSA-xqp8-w826-hh6x)
-
-# 4.10.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.1...4.10.2)
-
-## Other Changes
-- Move graphql-tag from devDependencies to dependencies (Antonio Davi Macedo Coelho de Castro) [#7183](https://github.com/parse-community/parse-server/pull/7183)
-
-# 4.10.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.10.0...4.10.1)
-
-## Security Fixes
-- Updated to Parse JS SDK 3.3.0 and other security fixes (Manuel Trezza) [#7508](https://github.com/parse-community/parse-server/pull/7508)
-
-> ⚠️ This includes a security fix of the Parse JS SDK where `logIn` will default to `POST` instead of `GET` method. This may require changes in your deployment before you upgrade to this release, see the Parse JS SDK 3.0.0 [release notes](https://github.com/parse-community/Parse-SDK-JS/releases/tag/3.0.0).
-
-# 4.10.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.5.2...4.10.0)
-
-*Versions >4.5.2 and <4.10.0 are skipped.*
-
-> ⚠️ A security incident caused a number of incorrect version tags to be pushed to the Parse Server repository. These version tags linked to a personal fork of a contributor who had write access to the repository. The code to which these tags linked has not been reviewed or approved by Parse Platform. Even though no releases were published with these incorrect versions, it was possible to define a Parse Server dependency that pointed to these version tags, for example if you defined this dependency:
-> ```js
-> "parse-server": "git@github.com:parse-community/parse-server.git#4.9.3"
-> ```
->
-> We have since deleted the incorrect version tags, but they may still show up if your personal fork on GitHub or locally. We do not know when these tags have been pushed to the Parse Server repository, but we first became aware of this issue on July 21, 2021. We are not aware of any malicious code or concerns related to privacy, security or legality (e.g. proprietary code). However, it has been reported that some functionality does not work as expected and the introduction of security vulnerabilities cannot be ruled out.
->
-> You may be also affected if you used the Bitnami image for Parse Server. Bitnami picked up the incorrect version tag `4.9.3` and published a new Bitnami image for Parse Server.
->
->**If you are using any of the affected versions, we urgently recommend to upgrade to version `4.10.0`.**
-
-# 4.5.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.5.0...4.5.2)
-
-### Security Fixes
-- SECURITY FIX: Fixes incorrect session property `authProvider: password` of anonymous users. When signing up an anonymous user, the session field `createdWith` indicates incorrectly that the session has been created using username and password with `authProvider: password`, instead of an anonymous sign-up with `authProvider: anonymous`. This fixes the issue by setting the correct `authProvider: anonymous` for future sign-ups of anonymous users. This fix does not fix incorrect `authProvider: password` for existing sessions of anonymous users. Consider this if your app logic depends on the `authProvider` field. (Corey Baker) [GHSA-23r4-5mxp-c7g5](https://github.com/parse-community/parse-server/security/advisories/GHSA-23r4-5mxp-c7g5)
-
-# 4.5.1
-*This version was published by mistake and was deprecated.*
-
-# 4.5.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.4.0...4.5.0)
-## Breaking Changes
-- FIX: Consistent casing for afterLiveQueryEvent. The afterLiveQueryEvent was introduced in 4.4.0 with inconsistent casing for the event names, which was fixed in 4.5.0. [#7023](https://github.com/parse-community/parse-server/pull/7023). Thanks to [dblythy](https://github.com/dblythy).
-## Other Changes
-- FIX: Properly handle serverURL and publicServerUrl in Batch requests. [#7049](https://github.com/parse-community/parse-server/pull/7049). Thanks to [Zach Goldberg](https://github.com/ZachGoldberg).
-- IMPROVE: Prevent invalid column names (className and length). [#7053](https://github.com/parse-community/parse-server/pull/7053). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- IMPROVE: GraphQL: Remove viewer from logout mutation. [#7029](https://github.com/parse-community/parse-server/pull/7029). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- IMPROVE: GraphQL: Optimize on Relation. [#7044](https://github.com/parse-community/parse-server/pull/7044). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- NEW: Include sessionToken in onLiveQueryEvent. [#7043](https://github.com/parse-community/parse-server/pull/7043). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: Definitions for accountLockout and passwordPolicy. [#7040](https://github.com/parse-community/parse-server/pull/7040). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: Fix typo in server definitions for emailVerifyTokenReuseIfValid. [#7037](https://github.com/parse-community/parse-server/pull/7037). Thanks to [dblythy](https://github.com/dblythy).
-- SECURITY FIX: LDAP auth stores password in plain text. See [GHSA-4w46-w44m-3jq3](https://github.com/parse-community/parse-server/security/advisories/GHSA-4w46-w44m-3jq3) for more details about the vulnerability and [da905a3](https://github.com/parse-community/parse-server/commit/da905a357d062ab4fea727a21eac231acc2ed92a) for the fix. Thanks to [Fabian Strachanski](https://github.com/fastrde).
-- NEW: Reuse tokens if they haven't expired. [#7017](https://github.com/parse-community/parse-server/pull/7017). Thanks to [dblythy](https://github.com/dblythy).
-- NEW: Add LDAPS-support to LDAP-Authcontroller. [#7014](https://github.com/parse-community/parse-server/pull/7014). Thanks to [Fabian Strachanski](https://github.com/fastrde).
-- FIX: (beforeSave/afterSave): Return value instead of Parse.Op for nested fields. [#7005](https://github.com/parse-community/parse-server/pull/7005). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- FIX: (beforeSave): Skip Sanitizing Database results. [#7003](https://github.com/parse-community/parse-server/pull/7003). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- FIX: Fix includeAll for querying a Pointer and Pointer array. [#7002](https://github.com/parse-community/parse-server/pull/7002). Thanks to [Corey Baker](https://github.com/cbaker6).
-- FIX: Add encryptionKey to src/options/index.js. [#6999](https://github.com/parse-community/parse-server/pull/6999). Thanks to [dblythy](https://github.com/dblythy).
-- IMPROVE: Update PostgresStorageAdapter.js. [#6989](https://github.com/parse-community/parse-server/pull/6989). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t).
-
-# 4.4.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.3.0...4.4.0)
-- IMPROVE: Update PostgresStorageAdapter.js. [#6981](https://github.com/parse-community/parse-server/pull/6981). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
-- NEW: skipWithMasterKey on Built-In Validator. [#6972](https://github.com/parse-community/parse-server/issues/6972). Thanks to [dblythy](https://github.com/dblythy).
-- NEW: Add fileKey rotation to GridFSBucketAdapter. [#6768](https://github.com/parse-community/parse-server/pull/6768). Thanks to [Corey Baker](https://github.com/cbaker6).
-- IMPROVE: Remove unused parameter in Cloud Function. [#6969](https://github.com/parse-community/parse-server/issues/6969). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- IMPROVE: Validation Handler Update. [#6968](https://github.com/parse-community/parse-server/issues/6968). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: (directAccess): Properly handle response status. [#6966](https://github.com/parse-community/parse-server/issues/6966). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- FIX: Remove hostnameMaxLen for Mongo URL. [#6693](https://github.com/parse-community/parse-server/issues/6693). Thanks to [markhoward02](https://github.com/markhoward02).
-- IMPROVE: Show a message if cloud functions are duplicated. [#6963](https://github.com/parse-community/parse-server/issues/6963). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: Pass request.query to afterFind. [#6960](https://github.com/parse-community/parse-server/issues/6960). Thanks to [dblythy](https://github.com/dblythy).
-- SECURITY FIX: Patch session vulnerability over Live Query. See [GHSA-2xm2-xj2q-qgpj](https://github.com/parse-community/parse-server/security/advisories/GHSA-2xm2-xj2q-qgpj) for more details about the vulnerability and [78b59fb](https://github.com/parse-community/parse-server/commit/78b59fb26b1c36e3cdbd42ba9fec025003267f58) for the fix. Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo).
-- IMPROVE: LiveQueryEvent Error Logging Improvements. [#6951](https://github.com/parse-community/parse-server/issues/6951). Thanks to [dblythy](https://github.com/dblythy).
-- IMPROVE: Include stack in Cloud Code. [#6958](https://github.com/parse-community/parse-server/issues/6958). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: (jobs): Add Error Message to JobStatus Failure. [#6954](https://github.com/parse-community/parse-server/issues/6954). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- NEW: Create Cloud function afterLiveQueryEvent. [#6859](https://github.com/parse-community/parse-server/issues/6859). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: Update vkontakte API to the latest version. [#6944](https://github.com/parse-community/parse-server/issues/6944). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo).
-- FIX: Use an empty object as default value of options for Google Sign in. [#6844](https://github.com/parse-community/parse-server/issues/6844). Thanks to [Kevin Kuang](https://github.com/kvnkuang).
-- FIX: Postgres: prepend className to unique indexes. [#6741](https://github.com/parse-community/parse-server/pull/6741). Thanks to [Corey Baker](https://github.com/cbaker6).
-- FIX: GraphQL: Transform input types also on user mutations. [#6934](https://github.com/parse-community/parse-server/pull/6934). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Set objectId into query for Email Validation. [#6930](https://github.com/parse-community/parse-server/pull/6930). Thanks to [Danaru](https://github.com/Danaru87).
-- FIX: GraphQL: Optimize queries, fixes some null returns (on object), fix stitched GraphQLUpload. [#6709](https://github.com/parse-community/parse-server/pull/6709). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Do not throw error if user provide a pointer like index onMongo. [#6923](https://github.com/parse-community/parse-server/pull/6923). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Hotfix instagram api. [#6922](https://github.com/parse-community/parse-server/issues/6922). Thanks to [Tim](https://github.com/timination).
-- FIX: (directAccess/cloud-code): Pass installationId with LogIn. [#6903](https://github.com/parse-community/parse-server/issues/6903). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- FIX: Fix bcrypt binary incompatibility. [#6891](https://github.com/parse-community/parse-server/issues/6891). Thanks to [Manuel Trezza](https://github.com/mtrezza).
-- NEW: Keycloak auth adapter. [#6376](https://github.com/parse-community/parse-server/issues/6376). Thanks to [Rhuan](https://github.com/rhuanbarreto).
-- IMPROVE: Changed incorrect key name in apple auth adapter tests. [#6861](https://github.com/parse-community/parse-server/issues/6861). Thanks to [Manuel Trezza](https://github.com/mtrezza).
-- FIX: Fix mutating beforeSubscribe Query. [#6868](https://github.com/parse-community/parse-server/issues/6868). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: Fix beforeLogin for users logging in with AuthData. [#6872](https://github.com/parse-community/parse-server/issues/6872). Thanks to [Kevin Kuang](https://github.com/kvnkuang).
-- FIX: Remove Facebook AccountKit auth. [#6870](https://github.com/parse-community/parse-server/issues/6870). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- FIX: Updated TOKEN_ISSUER to 'accounts.google.com'. [#6836](https://github.com/parse-community/parse-server/issues/6836). Thanks to [Arjun Vedak](https://github.com/arjun3396).
-- IMPROVE: Optimized deletion of class field from schema by using an index if available to do an index scan instead of a collection scan. [#6815](https://github.com/parse-community/parse-server/issues/6815). Thanks to [Manuel Trezza](https://github.com/mtrezza).
-- IMPROVE: Enable MongoDB transaction test for MongoDB >= 4.0.4 [#6827](https://github.com/parse-community/parse-server/pull/6827). Thanks to [Manuel](https://github.com/mtrezza).
-
-# 4.3.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.2.0...4.3.0)
-- PERFORMANCE: Optimizing pointer CLP query decoration done by DatabaseController#addPointerPermissions [#6747](https://github.com/parse-community/parse-server/pull/6747). Thanks to [mess-lelouch](https://github.com/mess-lelouch).
-- SECURITY: Fix security breach on GraphQL viewer [78239ac](https://github.com/parse-community/parse-server/commit/78239ac9071167fdf243c55ae4bc9a2c0b0d89aa), [security advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-236h-rqv8-8q73). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Save context not present if direct access enabled [#6764](https://github.com/parse-community/parse-server/pull/6764). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani).
-- NEW: Before Connect + Before Subscribe [#6793](https://github.com/parse-community/parse-server/pull/6793). Thanks to [dblythy](https://github.com/dblythy).
-- FIX: Add version to playground to fix CDN [#6804](https://github.com/parse-community/parse-server/pull/6804). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- NEW (EXPERIMENTAL): Idempotency enforcement for client requests. This deduplicates requests where the client intends to send one request to Parse Server but due to network issues the server receives the request multiple times. **Caution, this is an experimental feature that may not be appropriate for production.** [#6748](https://github.com/parse-community/parse-server/issues/6748). Thanks to [Manuel Trezza](https://github.com/mtrezza).
-- FIX: Add production Google Auth Adapter instead of using the development url [#6734](https://github.com/parse-community/parse-server/pull/6734). Thanks to [SebC.](https://github.com/SebC99).
-- IMPROVE: Run Prettier JS Again Without requiring () on arrow functions [#6796](https://github.com/parse-community/parse-server/pull/6796). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- IMPROVE: Run Prettier JS [#6795](https://github.com/parse-community/parse-server/pull/6795). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- IMPROVE: Replace bcrypt with @node-rs/bcrypt [#6794](https://github.com/parse-community/parse-server/pull/6794). Thanks to [LongYinan](https://github.com/Brooooooklyn).
-- IMPROVE: Make clear description of anonymous user [#6655](https://github.com/parse-community/parse-server/pull/6655). Thanks to [Jerome De Leon](https://github.com/JeromeDeLeon).
-- IMPROVE: Simplify GraphQL merge system to avoid js ref bugs [#6791](https://github.com/parse-community/parse-server/pull/6791). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- NEW: Pass context in beforeDelete, afterDelete, beforeFind and Parse.Cloud.run [#6666](https://github.com/parse-community/parse-server/pull/6666). Thanks to [yog27ray](https://github.com/yog27ray).
-- NEW: Allow passing custom gql schema function to ParseServer#start options [#6762](https://github.com/parse-community/parse-server/pull/6762). Thanks to [Luca](https://github.com/lucatk).
-- NEW: Allow custom cors origin header [#6772](https://github.com/parse-community/parse-server/pull/6772). Thanks to [Kevin Yao](https://github.com/kzmeyao).
-- FIX: Fix context for cascade-saving and saving existing object [#6735](https://github.com/parse-community/parse-server/pull/6735). Thanks to [Manuel](https://github.com/mtrezza).
-- NEW: Add file bucket encryption using fileKey [#6765](https://github.com/parse-community/parse-server/pull/6765). Thanks to [Corey Baker](https://github.com/cbaker6).
-- FIX: Removed gaze from dev dependencies and removed not working dev script [#6745](https://github.com/parse-community/parse-server/pull/6745). Thanks to [Vincent Semrau](https://github.com/vince1995).
-- IMPROVE: Upgrade graphql-tools to v6 [#6701](https://github.com/parse-community/parse-server/pull/6701). Thanks to [Yaacov Rydzinski](https://github.com/yaacovCR).
-- NEW: Support Metadata in GridFSAdapter [#6660](https://github.com/parse-community/parse-server/pull/6660). Thanks to [Diamond Lewis](https://github.com/dplewis).
-- NEW: Allow to unset file from graphql [#6651](https://github.com/parse-community/parse-server/pull/6651). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- NEW: Handle shutdown for RedisCacheAdapter [#6658](https://github.com/parse-community/parse-server/pull/6658). Thanks to [promisenxu](https://github.com/promisenxu).
-- FIX: Fix explain on user class [#6650](https://github.com/parse-community/parse-server/pull/6650). Thanks to [Manuel](https://github.com/mtrezza).
-- FIX: Fix read preference for aggregate [#6585](https://github.com/parse-community/parse-server/pull/6585). Thanks to [Manuel](https://github.com/mtrezza).
-- NEW: Add context to Parse.Object.save [#6626](https://github.com/parse-community/parse-server/pull/6626). Thanks to [Manuel](https://github.com/mtrezza).
-- NEW: Adding ssl config params to Postgres URI [#6580](https://github.com/parse-community/parse-server/pull/6580). Thanks to [Corey Baker](https://github.com/cbaker6).
-- FIX: Travis postgres update: removing unnecessary start of mongo-runner [#6594](https://github.com/parse-community/parse-server/pull/6594). Thanks to [Corey Baker](https://github.com/cbaker6).
-- FIX: ObjectId size for Pointer in Postgres [#6619](https://github.com/parse-community/parse-server/pull/6619). Thanks to [Corey Baker](https://github.com/cbaker6).
-- IMPROVE: Improve a test case [#6629](https://github.com/parse-community/parse-server/pull/6629). Thanks to [Gordon Sun](https://github.com/sunshineo).
-- NEW: Allow to resolve automatically Parse Type fields from Custom Schema [#6562](https://github.com/parse-community/parse-server/pull/6562). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Remove wrong console log in test [#6627](https://github.com/parse-community/parse-server/pull/6627). Thanks to [Gordon Sun](https://github.com/sunshineo).
-- IMPROVE: Graphql tools v5 [#6611](https://github.com/parse-community/parse-server/pull/6611). Thanks to [Yaacov Rydzinski](https://github.com/yaacovCR).
-- FIX: Catch JSON.parse and return 403 properly [#6589](https://github.com/parse-community/parse-server/pull/6589). Thanks to [Gordon Sun](https://github.com/sunshineo).
-- PERFORMANCE: Allow covering relation queries with minimal index [#6581](https://github.com/parse-community/parse-server/pull/6581). Thanks to [Noah Silas](https://github.com/noahsilas).
-- FIX: Fix Postgres group aggregation [#6522](https://github.com/parse-community/parse-server/pull/6522). Thanks to [Siddharth Ramesh](https://github.com/srameshr).
-- NEW: Allow set user mapped from JWT directly on request [#6411](https://github.com/parse-community/parse-server/pull/6411). Thanks to [Gordon Sun](https://github.com/sunshineo).
-
-# 4.2.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.1.0...4.2.0)
-
-__BREAKING CHANGES:__
-- CHANGE: The Sign-In with Apple authentication adapter parameter `client_id` has been changed to `clientId`. If using the Apple authentication adapter, this change requires to update the Parse Server configuration accordingly. See [#6523](https://github.com/parse-community/parse-server/pull/6523) for details.
-___
-- UPGRADE: Parse JS SDK to 2.12.0 [#6548](https://github.com/parse-community/parse-server/pull/6548)
-- NEW: Support Group aggregation on multiple columns for Postgres [#6483](https://github.com/parse-community/parse-server/pull/6483). Thanks to [Siddharth Ramesh](https://github.com/srameshr).
-- FIX: Improve test reliability by instructing Travis to only install one version of Postgres [#6490](https://github.com/parse-community/parse-server/pull/6490). Thanks to
-[Corey Baker](https://github.com/cbaker6).
-- FIX: Unknown type bug on overloaded types [#6494](https://github.com/parse-community/parse-server/pull/6494). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Improve reliability of 'SignIn with AppleID' [#6416](https://github.com/parse-community/parse-server/pull/6416). Thanks to [Andy King](https://github.com/andrewking0207).
-- FIX: Improve Travis reliability by separating Postgres & Mongo scripts [#6505](https://github.com/parse-community/parse-server/pull/6505). Thanks to
-[Corey Baker](https://github.com/cbaker6).
-- NEW: Apple SignIn support for multiple IDs [#6523](https://github.com/parse-community/parse-server/pull/6523). Thanks to [UnderratedDev](https://github.com/UnderratedDev).
-- NEW: Add support for new Instagram API [#6398](https://github.com/parse-community/parse-server/pull/6398). Thanks to [Maravilho Singa](https://github.com/maravilhosinga).
-- FIX: Updating Postgres/Postgis Call and Postgis to 3.0 [#6528](https://github.com/parse-community/parse-server/pull/6528). Thanks to
-[Corey Baker](https://github.com/cbaker6).
-- FIX: enableExpressErrorHandler logic [#6423](https://github.com/parse-community/parse-server/pull/6423). Thanks to [Nikolay Andryukhin](https://github.com/hybeats).
-- FIX: Change Order Enum Strategy for GraphQL [#6515](https://github.com/parse-community/parse-server/pull/6515). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Switch ACL to Relay Global Id for GraphQL [#6495](https://github.com/parse-community/parse-server/pull/6495). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Handle keys for pointer fields properly for GraphQL [#6499](https://github.com/parse-community/parse-server/pull/6499). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: GraphQL file mutation [#6507](https://github.com/parse-community/parse-server/pull/6507). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
-- FIX: Aggregate geoNear with date query [#6540](https://github.com/parse-community/parse-server/pull/6540). Thanks to [Manuel](https://github.com/mtrezza).
-- NEW: Add file triggers and file meta data [#6344](https://github.com/parse-community/parse-server/pull/6344). Thanks to [stevestencil](https://github.com/stevestencil).
-- FIX: Improve local testing of postgres [#6531](https://github.com/parse-community/parse-server/pull/6531). Thanks to
-[Corey Baker](https://github.com/cbaker6).
-- NEW: Case insensitive username and email indexing and query planning for Postgres [#6506](https://github.com/parse-community/parse-server/issues/6441). Thanks to
-[Corey Baker](https://github.com/cbaker6).
-
-# 4.1.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.0.2...4.1.0)
-
-_SECURITY RELEASE_: see [advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-h4mf-75hf-67w4) for details
-- SECURITY FIX: Patch Regex vulnerabilities. See [3a3a5ee](https://github.com/parse-community/parse-server/commit/3a3a5eee5ffa48da1352423312cb767de14de269). Special thanks to [W0lfw00d](https://github.com/W0lfw00d) for identifying and [responsibly reporting](https://github.com/parse-community/parse-server/blob/master/SECURITY.md) the vulnerability. Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo) for the speedy fix.
-
-# 4.0.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.0.1...4.0.2)
-
-__BREAKING CHANGES:__
-1. Remove Support for Mongo 3.2 & 3.4. The new minimum supported version is Mongo 3.6.
-2. Change username and email validation to be case insensitive. This change should be transparent in most use cases. The validation behavior should now behave 'as expected'. See [#5634](https://github.com/parse-community/parse-server/pull/5634) for details.
-
-> __Special Note on Upgrading to Parse Server 4.0.0 and above__
->
-> In addition to the breaking changes noted above, [#5634](https://github.com/parse-community/parse-server/pull/5634) introduces a two new case insensitive indexes on the `User` collection. Special care should be taken when upgrading to this version to ensure that:
->
-> 1. The new indexes can be successfully created (see issue [#6465](https://github.com/parse-community/parse-server/issues/6465) for details on a potential issue for your installation).
->
-> 2. Care is taken ensure that there is adequate compute capacity to create the index in the background while still servicing requests.
-
-- FIX: attempt to get travis to deploy to npmjs again. See [#6475](https://github.com/parse-community/parse-server/pull/6457). Thanks to [Arthur Cinader](https://github.com/acinader).
-
-# 4.0.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/4.0.0...4.0.1)
-- FIX: correct 'new' travis config to properly deploy. See [#6452](https://github.com/parse-community/parse-server/pull/6452). Thanks to [Arthur Cinader](https://github.com/acinader).
-- FIX: Better message on not allowed to protect default fields. See [#6439](https://github.com/parse-community/parse-server/pull/6439).Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
-
-# 4.0.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.10.0...4.0.0)
-
-> __Special Note on Upgrading to Parse Server 4.0.0 and above__
->
-> In addition to the breaking changes noted below, [#5634](https://github.com/parse-community/parse-server/pull/5634) introduces a two new case insensitive indexes on the `User` collection. Special care should be taken when upgrading to this version to ensure that:
->
-> 1. The new indexes can be successfully created (see issue [#6465](https://github.com/parse-community/parse-server/issues/6465) for details on a potential issue for your installation).
->
-> 2. Care is taken ensure that there is adequate compute capacity to create the index in the background while still servicing requests.
-
-- NEW: add hint option to Parse.Query [#6322](https://github.com/parse-community/parse-server/pull/6322). Thanks to [Steve Stencil](https://github.com/stevestencil)
-- FIX: CLP objectId size validation fix [#6332](https://github.com/parse-community/parse-server/pull/6332). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
-- FIX: Add volumes to Docker command [#6356](https://github.com/parse-community/parse-server/pull/6356). Thanks to [Kasra Bigdeli](https://github.com/githubsaturn)
-- NEW: GraphQL 3rd Party LoginWith Support [#6371](https://github.com/parse-community/parse-server/pull/6371). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- FIX: GraphQL Geo Queries [#6363](https://github.com/parse-community/parse-server/pull/6363). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- NEW: GraphQL Nested File Upload [#6372](https://github.com/parse-community/parse-server/pull/6372). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- NEW: Granular CLP pointer permissions [#6352](https://github.com/parse-community/parse-server/pull/6352). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
-- FIX: Add missing colon for customPages [#6393](https://github.com/parse-community/parse-server/pull/6393). Thanks to [Jerome De Leon](https://github.com/JeromeDeLeon)
-- NEW: `afterLogin` cloud code hook [#6387](https://github.com/parse-community/parse-server/pull/6387). Thanks to [David Corona](https://github.com/davesters)
-- FIX: __BREAKING CHANGE__ Prevent new usernames or emails that clash with existing users' email or username if it only differs by case. For example, don't allow a new user with the name 'Jane' if we already have a user 'jane'. [#5634](https://github.com/parse-community/parse-server/pull/5634). Thanks to [Arthur Cinader](https://github.com/acinader)
-- FIX: Support Travis CI V2. [#6414](https://github.com/parse-community/parse-server/pull/6414). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: Prevent crashing on websocket error. [#6418](https://github.com/parse-community/parse-server/pull/6418). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: Allow protectedFields for Authenticated users and Public. [$6415](https://github.com/parse-community/parse-server/pull/6415). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
-- FIX: Correct bug in determining GraphQL pointer errors when mutating. [#6413](https://github.com/parse-community/parse-server/pull/6431). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- NEW: Allow true GraphQL Schema Customization. [#6360](https://github.com/parse-community/parse-server/pull/6360). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- __BREAKING CHANGE__: Remove Support for Mongo version < 3.6 [#6445](https://github.com/parse-community/parse-server/pull/6445). Thanks to [Arthur Cinader](https://github.com/acinader)
-
-## 3.10.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.9.0...3.10.0)
-- FIX: correct and cover ordering queries in GraphQL [#6316](https://github.com/parse-community/parse-server/pull/6316). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: GraphQL support for reset password email [#6301](https://github.com/parse-community/parse-server/pull/6301). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- FIX: Add default limit to GraphQL fetch [#6304](https://github.com/parse-community/parse-server/pull/6304). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- DOCS: use bash syntax highlighting [#6302](https://github.com/parse-community/parse-server/pull/6302). Thanks to [Jerome De Leon](https://github.com/JeromeDeLeon)
-- NEW: Add max log file option [#6296](https://github.com/parse-community/parse-server/pull/6296). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: support user supplied objectId [#6101](https://github.com/parse-community/parse-server/pull/6101). Thanks to [Ruhan](https://github.com/rhuanbarretos)
-- FIX: Add missing encodeURIComponent on username [#6278](https://github.com/parse-community/parse-server/pull/6278). Thanks to [Christopher Brookes](https://github.com/Klaitos)
-- NEW: update PostgresStorageAdapter.js to use async/await [#6275](https://github.com/parse-community/parse-server/pull/6275). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
-- NEW: Support required fields on output type for GraphQL [#6279](https://github.com/parse-community/parse-server/pull/6279). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- NEW: Support required fields for GraphQL [#6271](https://github.com/parse-community/parse-server/pull/6279). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- CHANGE: use mongodb 3.3.5 [#6263](https://github.com/parse-community/parse-server/pull/6263). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: GraphQL: DX Relational Where Query [#6255](https://github.com/parse-community/parse-server/pull/6255). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- CHANGE: test against Postgres 11 [#6260](https://github.com/parse-community/parse-server/pull/6260). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- CHANGE: test against Postgres 11 [#6260](https://github.com/parse-community/parse-server/pull/6260). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: GraphQL alias for mutations in classConfigs [#6258](https://github.com/parse-community/parse-server/pull/6258). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
-- NEW: GraphQL classConfig query alias [#6257](https://github.com/parse-community/parse-server/pull/6257). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
-- NEW: Allow validateFilename to return a string or Parse Error [#6246](https://github.com/parse-community/parse-server/pull/6246). Thanks to [Mike Patnode](https://github.com/mpatnode)
-- NEW: Relay Spec [#6089](https://github.com/parse-community/parse-server/pull/6089). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- CHANGE: Set default ACL for GraphQL [#6249](https://github.com/parse-community/parse-server/pull/6249). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- NEW: LDAP auth Adapter [#6226](https://github.com/parse-community/parse-server/pull/6226). Thanks to [Julian Dax](https://github.com/brodo)
-- FIX: improve beforeFind to include Query info [#6237](https://github.com/parse-community/parse-server/pull/6237). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: improve websocket error handling [#6230](https://github.com/parse-community/parse-server/pull/6230). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: addition of an afterLogout trigger [#6217](https://github.com/parse-community/parse-server/pull/6217). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: Initialize default logger [#6186](https://github.com/parse-community/parse-server/pull/6186). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: Add funding link [#6192](https://github.com/parse-community/parse-server/pull/6192 ). Thanks to [Tom Fox](https://github.com/TomWFox)
-- FIX: installationId on LiveQuery connect [#6180](https://github.com/parse-community/parse-server/pull/6180). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: Add exposing port in docker container [#6165](https://github.com/parse-community/parse-server/pull/6165). Thanks to [Priyash Patil](https://github.com/priyashpatil)
-- NEW: Support Google Play Games Service [#6147](https://github.com/parse-community/parse-server/pull/6147). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- DOC: Throw error when setting authData to null [#6154](https://github.com/parse-community/parse-server/pull/6154). Thanks to [Manuel](https://github.com/mtrezza)
-- CHANGE: Move filename validation out of the Router and into the FilesAdaptor [#6157](https://github.com/parse-community/parse-server/pull/6157). Thanks to [Mike Patnode](https://github.com/mpatnode)
-- NEW: Added warning for special URL sensitive characters for appId [#6159](https://github.com/parse-community/parse-server/pull/6159). Thanks to [Saimoom Safayet Akash](https://github.com/saimoomsafayet)
-- NEW: Support Apple Game Center Auth [#6143](https://github.com/parse-community/parse-server/pull/6143). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- CHANGE: test with Node 12 [#6133](https://github.com/parse-community/parse-server/pull/6133). Thanks to [Arthur Cinader](https://github.com/acinader)
-- FIX: prevent after find from firing when saving objects [#6127](https://github.com/parse-community/parse-server/pull/6127). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: GraphQL Mutations not returning updated information [6130](https://github.com/parse-community/parse-server/pull/6130). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
-- CHANGE: Cleanup Schema cache per request [#6216](https://github.com/parse-community/parse-server/pull/6216). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- DOC: Improve installation instructions [#6120](https://github.com/parse-community/parse-server/pull/6120). Thanks to [Andres Galante](https://github.com/andresgalante)
-- DOC: add code formatting to contributing guidelines [#6119](https://github.com/parse-community/parse-server/pull/6119). Thanks to [Andres Galante](https://github.com/andresgalante)
-- NEW: Add GraphQL ACL Type + Input [#5957](https://github.com/parse-community/parse-server/pull/5957). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- CHANGE: replace public key [#6099](https://github.com/parse-community/parse-server/pull/6099). Thanks to [Arthur Cinader](https://github.com/acinader)
-- NEW: Support microsoft authentication in GraphQL [#6051](https://github.com/parse-community/parse-server/pull/6051). Thanks to [Alann Maulana](https://github.com/alann-maulana)
-- NEW: Install parse-server 3.9.0 instead of 2.2 [#6069](https://github.com/parse-community/parse-server/pull/6069). Thanks to [Julian Dax](https://github.com/brodo)
-- NEW: Use #!/bin/bash instead of #!/bin/sh [#6062](https://github.com/parse-community/parse-server/pull/6062). Thanks to [Julian Dax](https://github.com/brodo)
-- DOC: Update GraphQL readme section [#6030](https://github.com/parse-community/parse-server/pull/6030). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-
-## 3.9.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.8.0...3.9.0)
-- NEW: Add allowHeaders to Options [#6044](https://github.com/parse-community/parse-server/pull/6044). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
-- CHANGE: Introduce ReadOptionsInput to GraphQL API [#6030](https://github.com/parse-community/parse-server/pull/6030). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: Stream video with GridFSBucketAdapter (implements byte-range requests) [#6028](https://github.com/parse-community/parse-server/pull/6028). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: Aggregate not matching null values [#6043](https://github.com/parse-community/parse-server/pull/6043). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- CHANGE: Improve callCloudCode mutation to receive a CloudCodeFunction enum instead of a String in the GraphQL API [#6029](https://github.com/parse-community/parse-server/pull/6029). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- TEST: Add more tests to transactions [#6022](https://github.com/parse-community/parse-server/pull/6022). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- CHANGE: Pointer constraint input type as ID in the GraphQL API [#6020](https://github.com/parse-community/parse-server/pull/6020). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
-- CHANGE: Remove underline from operators of the GraphQL API [#6024](https://github.com/parse-community/parse-server/pull/6024). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- FIX: Make method async as expected in usage [#6025](https://github.com/parse-community/parse-server/pull/6025). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
-- DOC: Added breaking change note to 3.8 release [#6023](https://github.com/parse-community/parse-server/pull/6023). Thanks to [Manuel](https://github.com/mtrezza)
-- NEW: Added support for line auth [#6007](https://github.com/parse-community/parse-server/pull/6007). Thanks to [Saimoom Safayet Akash](https://github.com/saimoomsafayet)
-- FIX: Fix aggregate group id [#5994](https://github.com/parse-community/parse-server/pull/5994). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- CHANGE: Schema operations instead of generic operations in the GraphQL API [#5993](https://github.com/parse-community/parse-server/pull/5993). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- DOC: Fix changelog formatting[#6009](https://github.com/parse-community/parse-server/pull/6009). Thanks to [Tom Fox](https://github.com/TomWFox)
-- CHANGE: Rename objectId to id in the GraphQL API [#5985](https://github.com/parse-community/parse-server/pull/5985). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
-- FIX: Fix beforeLogin trigger when user has a file [#6001](https://github.com/parse-community/parse-server/pull/6001). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- DOC: Update GraphQL Docs with the latest changes [#5980](https://github.com/parse-community/parse-server/pull/5980). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-
-## 3.8.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.7.2...3.8.0)
-- NEW: Protected fields pointer-permissions support [#5951](https://github.com/parse-community/parse-server/pull/5951). Thanks to [Dobbias Nan](https://github.com/Dobbias)
-- NEW: GraphQL DX: Relation/Pointer [#5946](https://github.com/parse-community/parse-server/pull/5946). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- NEW: Master Key Only Config Properties [#5953](https://github.com/parse-community/parse-server/pull/5954). Thanks to [Manuel](https://github.com/mtrezza)
-- FIX: Better validation when creating a Relation fields [#5922](https://github.com/parse-community/parse-server/pull/5922). Thanks to [Lucas Alencar](https://github.com/alencarlucas)
-- NEW: enable GraphQL file upload [#5944](https://github.com/parse-community/parse-server/pull/5944). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: Handle shutdown on grid adapters [#5943](https://github.com/parse-community/parse-server/pull/5943). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: Fix GraphQL max upload size [#5940](https://github.com/parse-community/parse-server/pull/5940). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- FIX: Remove Buffer() deprecation notice [#5942](https://github.com/parse-community/parse-server/pull/5942). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- FIX: Remove MongoDB unified topology deprecation notice from the grid adapter [#5941](https://github.com/parse-community/parse-server/pull/5941). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: add callback for serverCloseComplete [#5937](https://github.com/parse-community/parse-server/pull/5937). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- DOCS: Add Cloud Code guide to README [#5936](https://github.com/parse-community/parse-server/pull/5936). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: Remove nested operations from GraphQL API [#5931](https://github.com/parse-community/parse-server/pull/5931). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: Improve Live Query Monitoring [#5927](https://github.com/parse-community/parse-server/pull/5927). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: GraphQL: Fix undefined Array [#5296](https://github.com/parse-community/parse-server/pull/5926). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- NEW: Added array support for pointer-permissions [#5921](https://github.com/parse-community/parse-server/pull/5921). Thanks to [Dobbias Nan](https://github.com/Dobbias)
-- GraphQL: Renaming Types/Inputs [#5921](https://github.com/parse-community/parse-server/pull/5921). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- FIX: Lint no-prototype-builtins [#5920](https://github.com/parse-community/parse-server/pull/5920). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- GraphQL: Inline Fragment on Array Fields [#5908](https://github.com/parse-community/parse-server/pull/5908). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- DOCS: Add instructions to launch a compatible Docker Postgres [](). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- Fix: Undefined dot notation in matchKeyInQuery [#5917](https://github.com/parse-community/parse-server/pull/5917). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- Fix: Logger print JSON and Numbers [#5916](https://github.com/parse-community/parse-server/pull/5916). Thanks to [Diamond Lewis](https://github.com/dplewis)
-- GraphQL: Return specific Type on specific Mutation [#5893](https://github.com/parse-community/parse-server/pull/5893). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
-- FIX: Apple sign-in authAdapter [#5891](https://github.com/parse-community/parse-server/pull/5891). Thanks to [SebC](https://github.com/SebC99).
-- DOCS: Add GraphQL beta notice [#5886](https://github.com/parse-community/parse-server/pull/5886). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- GraphQL: Remove "password" output field from _User class [#5889](https://github.com/parse-community/parse-server/pull/5889). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
-- GraphQL: Object constraints [#5715](https://github.com/parse-community/parse-server/pull/5715). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
-- DOCS: README top section overhaul + add sponsors [#5876](https://github.com/parse-community/parse-server/pull/5876). Thanks to [Tom Fox](https://github.com/TomWFox)
-- FIX: Return a Promise from classUpdate method [#5877](https://github.com/parse-community/parse-server/pull/5877). Thanks to [Lucas Alencar](https://github.com/alencarlucas)
-- FIX: Use UTC Month in aggregate tests [#5879](https://github.com/parse-community/parse-server/pull/5879). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- FIX: Transaction was aborting before all promises have either resolved or rejected [#5878](https://github.com/parse-community/parse-server/pull/5878). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: Use transactions for batch operation [#5849](https://github.com/parse-community/parse-server/pull/5849). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-
-### Breaking Changes
-- If you are running Parse Server on top of a MongoDB deployment which does not fit the [Retryable Writes Requirements](https://docs.mongodb.com/manual/core/retryable-writes/#prerequisites), you will have to add `retryWrites=false` to your connection string in order to upgrade to Parse Server 3.8.
-
-## 3.7.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.7.1...3.7.2)
-
-- FIX: Live Query was failing on release 3.7.1
-
-## 3.7.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.7.0...3.7.1)
-
-- FIX: Missing APN module
-- FIX: Set falsy values as default to schema fields [#5868](https://github.com/parse-community/parse-server/pull/5868), thanks to [Lucas Alencar](https://github.com/alencarlucas)
-- NEW: Implement WebSocketServer Adapter [#5866](https://github.com/parse-community/parse-server/pull/5866), thanks to [Diamond Lewis](https://github.com/dplewis)
-
-## 3.7.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.6.0...3.7.0)
-
-- FIX: Prevent linkWith sessionToken from generating new session [#5801](https://github.com/parse-community/parse-server/pull/5801), thanks to [Diamond Lewis](https://github.com/dplewis)
-- GraphQL: Improve session token error messages [#5753](https://github.com/parse-community/parse-server/pull/5753), thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
-- NEW: GraphQL { functions { call } } generic mutation [#5818](https://github.com/parse-community/parse-server/pull/5818), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: GraphQL Custom Schema [#5821](https://github.com/parse-community/parse-server/pull/5821), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: GraphQL custom schema on CLI [#5828](https://github.com/parse-community/parse-server/pull/5828), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: GraphQL @mock directive [#5836](https://github.com/parse-community/parse-server/pull/5836), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- FIX: GraphQL _or operator not working [#5840](https://github.com/parse-community/parse-server/pull/5840), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: Add "count" to CLP initial value [#5841](https://github.com/parse-community/parse-server/pull/5841), thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
-- NEW: Add ability to alter the response from the after save trigger [#5814](https://github.com/parse-community/parse-server/pull/5814), thanks to [BrunoMaurice](https://github.com/brunoMaurice)
-- FIX: Cache apple public key for the case it fails to fetch again [#5848](https://github.com/parse-community/parse-server/pull/5848), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: GraphQL Configuration Options [#5782](https://github.com/parse-community/parse-server/pull/5782), thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
-- NEW: Required fields and default values [#5835](https://github.com/parse-community/parse-server/pull/5835), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- FIX: Postgres safely escape strings in nested objects [#5855](https://github.com/parse-community/parse-server/pull/5855), thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: Support PhantAuth authentication [#5850](https://github.com/parse-community/parse-server/pull/5850), thanks to [Ivan SZKIBA](https://github.com/szkiba)
-- FIX: Remove uws package [#5860](https://github.com/parse-community/parse-server/pull/5860), thanks to [Zeal Murapa](https://github.com/GoGross)
-
-## 3.6.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.5.0...3.6.0)
-
-- SECURITY FIX: Address [Security Advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-8w3j-g983-8jh5) of a potential [Enumeration Attack](https://www.owasp.org/index.php/Testing_for_User_Enumeration_and_Guessable_User_Account_(OWASP-AT-002)#Description_of_the_Issue) [73b0f9a](https://github.com/parse-community/parse-server/commit/73b0f9a339b81f5d757725dc557955a7b670a3ec), big thanks to [Fabian Strachanski](https://github.com/fastrde) for identifying the problem, creating a fix and following the [vulnerability disclosure guidelines](https://github.com/parse-community/parse-server/blob/master/SECURITY.md#parse-community-vulnerability-disclosure-program)
-- NEW: Added rest option: excludeKeys [#5737](https://github.com/parse-community/parse-server/pull/5737), thanks to [Raschid J.F. Rafeally](https://github.com/RaschidJFR)
-- FIX: LiveQuery create event with fields [#5790](https://github.com/parse-community/parse-server/pull/5790), thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: Generate sessionToken with linkWith [#5799](https://github.com/parse-community/parse-server/pull/5799), thanks to [Diamond Lewis](https://github.com/dplewis)
-
-## 3.5.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.4.4...3.5.0)
-
-- NEW: GraphQL Support [#5674](https://github.com/parse-community/parse-server/pull/5674), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-
-[GraphQL Guide](https://github.com/parse-community/parse-server#graphql)
-
-- NEW: Sign in with Apple [#5694](https://github.com/parse-community/parse-server/pull/5694), thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: AppSecret to Facebook Auth [#5695](https://github.com/parse-community/parse-server/pull/5695), thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: Postgres: Regex support foreign characters [#5598](https://github.com/parse-community/parse-server/pull/5598), thanks to [Jeff Gu Kang](https://github.com/JeffGuKang)
-- FIX: Winston Logger string interpolation [#5729](https://github.com/parse-community/parse-server/pull/5729), thanks to [Diamond Lewis](https://github.com/dplewis)
-
-## 3.4.4
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.4.3...3.4.4)
-
-Fix: Commit changes
-
-## 3.4.3
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.4.2...3.4.3)
-
-Fix: Use changes in master to travis configuration to enable pushing to npm and gh_pages. See diff for details.
-
-## 3.4.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.4.1...3.4.2)
-
-Fix: In my haste to get a [Security Fix](https://github.com/parse-community/parse-server/security/advisories/GHSA-2479-qvv7-47qq) out, I added [8709daf](https://github.com/parse-community/parse-server/commit/8709daf698ea69b59268cb66f0f7cee75b52daa5) to master instead of to 3.4.1. This commit fixes that. [Arthur Cinader](https://github.com/acinader)
-
-## 3.4.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.4.0...3.4.1)
-
-Security Fix: see Advisory: [GHSA-2479-qvv7-47q](https://github.com/parse-community/parse-server/security/advisories/GHSA-2479-qvv7-47qq) for details [8709daf](https://github.com/parse-community/parse-server/commit/8709daf698ea69b59268cb66f0f7cee75b52daa5). Big thanks to: [Benjamin Simonsson](https://github.com/BenniPlejd) for identifying the issue and promptly bringing it to the Parse Community's attention and also big thanks to the indefatigable [Diamond Lewis](https://github.com/dplewis) for crafting a failing test and then a solution within an hour of the report.
-
-## 3.4.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.3.0...3.4.0)
-- NEW: Aggregate supports group by date fields [#5538](https://github.com/parse-community/parse-server/pull/5538) thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: API for Read Preferences [#3963](https://github.com/parse-community/parse-server/pull/3963) thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- NEW: Add Redis options for LiveQuery [#5584](https://github.com/parse-community/parse-server/pull/5584) thanks to [Diamond Lewis](https://github.com/dplewis)
-- NEW: Add Direct Access option for Server Config [#5550](https://github.com/parse-community/parse-server/pull/5550) thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: updating mixed array in Postgres [#5552](https://github.com/parse-community/parse-server/pull/5552) thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: notEqualTo GeoPoint Query in Postgres [#5549](https://github.com/parse-community/parse-server/pull/5549), thanks to [Diamond Lewis](https://github.com/dplewis)
-- FIX: put the timestamp back in logs that was lost after Winston upgrade [#5571](https://github.com/parse-community/parse-server/pull/5571), thanks to [Steven Rowe](https://github.com/mrowe009) and [Arthur Cinader](https://github.com/acinader)
-- FIX: Validates permission before calling beforeSave [#5546](https://github.com/parse-community/parse-server/pull/5546), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
-- FIX: Remove userSensitiveFields default value. [#5588](https://github.com/parse-community/parse-server/pull/5588), thanks to [William George](https://github.com/awgeorge)
-- FIX: Decode Date JSON value in LiveQuery. [#5540](https://github.com/parse-community/parse-server/pull/5540), thanks to [ananfang](https://github.com/ananfang)
-
-
-## 3.3.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.2.3...3.3.0)
-- NEW: beforeLogin trigger with support for auth providers ([#5445](https://github.com/parse-community/parse-server/pull/5445)), thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
-- NEW: RFC 7662 compliant OAuth2 auth adapter ([#4910](https://github.com/parse-community/parse-server/pull/4910)), thanks to [Müller Zsolt](https://github.com/zsmuller)
-- FIX: cannot change password when maxPasswordHistory is 1 ([#5191](https://github.com/parse-community/parse-server/pull/5191)), thanks to [Tulsi Sapkota](https://github.com/Tolsee)
-- FIX (Postgres): count being very slow on large Parse Classes' collections ([#5330](https://github.com/parse-community/parse-server/pull/5330)), thanks to [CoderickLamar](https://github.com/CoderickLamar)
-- FIX: using per-key basis queue ([#5420](https://github.com/parse-community/parse-server/pull/5420)), thanks to [Georges Jamous](https://github.com/georgesjamous)
-- FIX: issue on count with Geo constraints and mongo ([#5286](https://github.com/parse-community/parse-server/pull/5286)), thanks to [Julien Quéré](https://github.com/jlnquere)
-
-## 3.2.3
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.2.2...3.2.3)
-- Correct previous release with patch that is fully merged
-
-## 3.2.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.2.1...3.2.2)
-- Security fix to properly process userSensitiveFields when parse-server is started with
- ../lib/cli/parse-server [#5463](https://github.com/parse-community/parse-server/pull/5463
- )
-
-## 3.2.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.2.0...3.2.1)
-- Increment package.json version to match the deployment tag
-
-## 3.2.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.1.3...3.2.0)
-- NEW: Support accessing sensitive fields with an explicit ACL. Not documented yet, see [tests](https://github.com/parse-community/parse-server/blob/f2c332ea6a984808ad5b2e3ce34864a20724f72b/spec/UserPII.spec.js#L526) for examples
-- Upgrade Parse SDK JS to 2.3.1 [#5457](https://github.com/parse-community/parse-server/pull/5457)
-- Hides token contents in logStartupOptions if they arrive as a buffer [#6a9380](https://github.com/parse-community/parse-server/commit/6a93806c62205a56a8f4e3b8765848c552510337)
-- Support custom message for password requirements [#5399](https://github.com/parse-community/parse-server/pull/5399)
-- Support for Ajax password reset [#5332](https://github.com/parse-community/parse-server/pull/5332)
-- Postgres: Refuse to build unsafe JSON lists for contains [#5337](https://github.com/parse-community/parse-server/pull/5337)
-- Properly handle return values in beforeSave [#5228](https://github.com/parse-community/parse-server/pull/5228)
-- Fixes issue when querying user roles [#5276](https://github.com/parse-community/parse-server/pull/5276)
-- Fixes issue affecting update with CLP [#5269](https://github.com/parse-community/parse-server/pull/5269)
-
-## 3.1.3
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.1.2...3.1.3)
-
-- Postgres: Fixes support for global configuration
-- Postgres: Fixes support for numeric arrays
-- Postgres: Fixes issue affecting queries on empty arrays
-- LiveQuery: Adds support for transmitting the original object
-- Queries: Use estimated count if query is empty
-- Docker: Reduces the size of the docker image to 154Mb
-
-
-## 3.1.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.1.1...3.1.2)
-
-- Removes dev script, use TDD instead of server.
-- Removes nodemon and problematic dependencies.
-- Addressed event-stream security debacle.
-
-## 3.1.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.1.0...3.1.1)
-
-### Improvements:
-* Fixes issue that would prevent users with large number of roles to resolve all of them [Antoine Cormouls](https://github.com/Moumouls) (#5131, #5132)
-* Fixes distinct query on special fields ([#5144](https://github.com/parse-community/parse-server/pull/5144))
-
-
-## 3.1.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/3.0.0...3.1.0)
-
-### Breaking Changes:
-* Return success on sendPasswordResetEmail even if email not found. (#7fe4030)
-### Security Fix:
-* Expire password reset tokens on email change (#5104)
-### Improvements:
-* Live Query CLPs (#4387)
-* Reduces number of calls to injectDefaultSchema (#5107)
-* Remove runtime dependency on request (#5076)
-### Bug fixes:
-* Fixes issue with vkontatke authentication (#4977)
-* Use the correct function when validating google auth tokens (#5018)
-* fix unexpected 'delete' trigger issue on LiveQuery (#5031)
-* Improves performance for roles and ACL's in live query server (#5126)
-
-
-## 3.0.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.8.4...3.0.0)
-
-`parse-server` 3.0.0 comes with brand new handlers for cloud code. It now fully supports promises and async / await.
-For more informations, visit the v3.0.0 [migration guide](https://github.com/parse-community/parse-server/blob/master/3.0.0.md).
-
-### Breaking changes:
-* Cloud Code handlers have a new interface based on promises.
-* response.success / response.error are removed in Cloud Code
-* Cloud Code runs with Parse-SDK 2.0
-* The aggregate now require aggregates to be passed in the form: `{"pipeline": [...]}` (REST Only)
-
-### Improvements:
-* Adds Pipeline Operator to Aggregate Router.
-* Adds documentations for parse-server's adapters, constructors and more.
-* Adds ability to pass a context object between `beforeSave` and `afterSave` affecting the same object.
-
-### Bug Fixes:
-* Fixes issue that would crash the server when mongo objects had undefined values [#4966](https://github.com/parse-community/parse-server/issues/4966)
-* Fixes issue that prevented ACL's from being used with `select` (see [#571](https://github.com/parse-community/Parse-SDK-JS/issues/571))
-
-### Dependency updates:
-* [@parse/simple-mailgun-adapter@1.1.0](https://www.npmjs.com/package/@parse/simple-mailgun-adapter)
-* [mongodb@3.1.3](https://www.npmjs.com/package/mongodb)
-* [request@2.88.0](https://www.npmjs.com/package/request)
-
-### Development Dependencies Updates:
-* [@parse/minami@1.0.0](https://www.npmjs.com/package/@parse/minami)
-* [deep-diff@1.0.2](https://www.npmjs.com/package/deep-diff)
-* [flow-bin@0.79.0](https://www.npmjs.com/package/flow-bin)
-* [jsdoc@3.5.5](https://www.npmjs.com/package/jsdoc)
-* [jsdoc-babel@0.4.0](https://www.npmjs.com/package/jsdoc-babel)
-
-### 2.8.4
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.8.3...2.8.4)
-
-#### Improvements:
-* Adds ability to forward errors to express handler (#4697)
-* Adds ability to increment the push badge with an arbitrary value (#4889)
-* Adds ability to preserve the file names when uploading (#4915)
-* `_User` now follow regular ACL policy. Letting administrator lock user out. (#4860) and (#4898)
-* Ensure dates are properly handled in aggregates (#4743)
-* Aggregates: Improved support for stages sharing the same name
-* Add includeAll option
-* Added verify password to users router and tests. (#4747)
-* Ensure read preference is never overriden, so DB config prevails (#4833)
-* add support for geoWithin.centerSphere queries via withJSON (#4825)
-* Allow sorting an object field (#4806)
-* Postgres: Don't merge JSON fields after save() to keep same behaviour as MongoDB (#4808) (#4815)
-
-#### Dependency updates
-* [commander@2.16.0](https://www.npmjs.com/package/commander)
-* [mongodb@3.1.1](https://www.npmjs.com/package/mongodb)
-* [pg-promise@8.4.5](https://www.npmjs.com/package/pg-promise)
-* [ws@6.0.0](https://www.npmjs.com/package/ws)
-* [bcrypt@3.0.0](https://www.npmjs.com/package/bcrypt)
-* [uws@10.148.1](https://www.npmjs.com/package/uws)
-
-##### Development Dependencies Updates:
-* [cross-env@5.2.0](https://www.npmjs.com/package/cross-env)
-* [eslint@5.0.0](https://www.npmjs.com/package/eslint)
-* [flow-bin@0.76.0](https://www.npmjs.com/package/flow-bin)
-* [mongodb-runner@4.0.0](https://www.npmjs.com/package/mongodb-runner)
-* [nodemon@1.18.1](https://www.npmjs.com/package/nodemon)
-* [nyc@12.0.2](https://www.npmjs.com/package/nyc)
-* [request-promise@4.2.2](https://www.npmjs.com/package/request-promise)
-* [supports-color@5.4.0](https://www.npmjs.com/package/supports-color)
-
-### 2.8.3
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.8.2...2.8.3)
-
-#### Improvements:
-
-* Adds support for JS SDK 2.0 job status header
-* Removes npm-git scripts as npm supports using git repositories that build, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-
-### 2.8.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.8.1...2.8.2)
-
-##### Bug Fixes:
-* Ensure legacy users without ACL's are not locked out, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Improvements:
-* Use common HTTP agent to increase webhooks performance, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Adds withinPolygon support for Polygon objects, thanks to [Mads Bjerre](https://github.com/madsb)
-
-#### Dependency Updates:
-* [ws@5.2.0](https://www.npmjs.com/package/ws)
-* [commander@2.15.1](https://www.npmjs.com/package/commander)
-* [nodemon@1.17.5](https://www.npmjs.com/package/nodemon)
-
-##### Development Dependencies Updates:
-* [flow-bin@0.73.0](https://www.npmjs.com/package/flow-bin)
-* [cross-env@5.1.6](https://www.npmjs.com/package/cross-env)
-* [gaze@1.1.3](https://www.npmjs.com/package/gaze)
-* [deepcopy@1.0.0](https://www.npmjs.com/package/deepcopy)
-* [deep-diff@1.0.1](https://www.npmjs.com/package/deep-diff)
-
-
-### 2.8.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.8.1...2.8.0)
-
-Ensure all the files are properly exported to the final package.
-
-### 2.8.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.8.0...2.7.4)
-
-#### New Features
-* Adding Mongodb element to add `arrayMatches` the #4762 (#4766), thanks to [Jérémy Piednoel](https://github.com/jeremypiednoel)
-* Adds ability to Lockout users (#4749), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Bug fixes:
-* Fixes issue when using afterFind with relations (#4752), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New query condition support to match all strings that starts with some other given strings (#3864), thanks to [Eduard Bosch Bertran](https://github.com/eduardbosch)
-* Allow creation of indices on default fields (#4738), thanks to [Claire Neveu](https://github.com/ClaireNeveu)
-* Purging empty class (#4676), thanks to [Diamond Lewis](https://github.com/dplewis)
-* Postgres: Fixes issues comparing to zero or false (#4667), thanks to [Diamond Lewis](https://github.com/dplewis)
-* Fix Aggregate Match Pointer (#4643), thanks to [Diamond Lewis](https://github.com/dplewis)
-
-#### Improvements:
-* Allow Parse.Error when returning from Cloud Code (#4695), thanks to [Saulo Tauil](https://github.com/saulogt)
-* Fix typo: "requrest" -> "request" (#4761), thanks to [Joseph Frazier](https://github.com/josephfrazier)
-* Send version for Vkontakte API (#4725), thanks to [oleg](https://github.com/alekoleg)
-* Ensure we respond with invalid password even if email is unverified (#4708), thanks to [dblythy](https://github.com/dblythy)
-* Add _password_history to default sensitive data (#4699), thanks to [Jong Eun Lee](https://github.com/yomybaby)
-* Check for node version in postinstall script (#4657), thanks to [Diamond Lewis](https://github.com/dplewis)
-* Remove FB Graph API version from URL to use the oldest non deprecated version, thanks to [SebC](https://github.com/SebC99)
-
-#### Dependency Updates:
-* [@parse/push-adapter@2.0.3](https://www.npmjs.com/package/@parse/push-adapter)
-* [@parse/simple-mailgun-adapter@1.0.2](https://www.npmjs.com/package/@parse/simple-mailgun-adapter)
-* [uws@10.148.0](https://www.npmjs.com/package/uws)
-* [body-parser@1.18.3](https://www.npmjs.com/package/body-parser)
-* [mime@2.3.1](https://www.npmjs.com/package/mime)
-* [request@2.85.0](https://www.npmjs.com/package/request)
-* [mongodb@3.0.7](https://www.npmjs.com/package/mongodb)
-* [bcrypt@2.0.1](https://www.npmjs.com/package/bcrypt)
-* [ws@5.1.1](https://www.npmjs.com/package/ws)
-
-##### Development Dependencies Updates:
-* [cross-env@5.1.5](https://www.npmjs.com/package/cross-env)
-* [flow-bin@0.71.0](https://www.npmjs.com/package/flow-bin)
-* [deep-diff@1.0.0](https://www.npmjs.com/package/deep-diff)
-* [nodemon@1.17.3](https://www.npmjs.com/package/nodemon)
-
-
-### 2.7.4
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.7.4...2.7.3)
-
-#### Bug Fixes:
-* Fixes an issue affecting polygon queries, thanks to [Diamond Lewis](https://github.com/dplewis)
-
-#### Dependency Updates:
-* [pg-promise@8.2.1](https://www.npmjs.com/package/pg-promise)
-
-##### Development Dependencies Updates:
-* [nodemon@1.17.1](https://www.npmjs.com/package/nodemon)
-
-### 2.7.3
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.7.3...2.7.2)
-
-#### Improvements:
-* Improve documentation for LiveQuery options, thanks to [Arthur Cinader](https://github.com/acinader)
-* Improve documentation for using cloud code with docker, thanks to [Stephen Tuso](https://github.com/stephentuso)
-* Adds support for Facebook's AccountKit, thanks to [6thfdwp](https://github.com/6thfdwp)
-* Disable afterFind routines when running aggregates, thanks to [Diamond Lewis](https://github.com/dplewis)
-* Improve support for distinct aggregations of nulls, thanks to [Diamond Lewis](https://github.com/dplewis)
-* Regenreate the email verification token when requesting a new email, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-
-#### Bug Fixes:
-* Fix issue affecting readOnly masterKey and purge command, thanks to [AreyouHappy](https://github.com/AreyouHappy)
-* Fixes Issue unsetting in beforeSave doesn't allow object creation, thanks to [Diamond Lewis](https://github.com/dplewis)
-* Fixes issue crashing server on invalid live query payload, thanks to [fridays](https://github.com/fridays)
-* Fixes issue affecting postgres storage adapter "undefined property '__op'", thanks to [Tyson Andre](https://github,com/TysonAndre)
-
-#### Dependency Updates:
-* [winston@2.4.1](https://www.npmjs.com/package/winston)
-* [pg-promise@8.2.0](https://www.npmjs.com/package/pg-promise)
-* [commander@2.15.0](https://www.npmjs.com/package/commander)
-* [lru-cache@4.1.2](https://www.npmjs.com/package/lru-cache)
-* [parse@1.11.1](https://www.npmjs.com/package/parse)
-* [ws@5.0.0](https://www.npmjs.com/package/ws)
-* [mongodb@3.0.4](https://www.npmjs.com/package/mongodb)
-* [lodash@4.17.5](https://www.npmjs.com/package/lodash)
-
-##### Development Dependencies Updates:
-* [cross-env@5.1.4](https://www.npmjs.com/package/cross-env)
-* [flow-bin@0.67.1](https://www.npmjs.com/package/flow-bin)
-* [jasmine@3.1.0](https://www.npmjs.com/package/jasmine)
-* [parse@1.11.1](https://www.npmjs.com/package/parse)
-* [babel-eslint@8.2.2](https://www.npmjs.com/package/babel-eslint)
-* [nodemon@1.15.0](https://www.npmjs.com/package/nodemon)
-
-### 2.7.2
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.7.2...2.7.1)
-
-#### Improvements:
-* Improved match aggregate
-* Do not mark the empty push as failed
-* Support pointer in aggregate query
-* Introduces flow types for storage
-* Postgres: Refactoring of Postgres Storage Adapter
-* Postgres: Support for multiple projection in aggregate
-* Postgres: performance optimizations
-* Adds infos about vulnerability disclosures
-* Adds ability to login with email when provided as username
-
-#### Bug Fixes
-* Scrub Passwords with URL Encoded Characters
-* Fixes issue affecting using sorting in beforeFind
-
-#### Dependency Updates:
-* [commander@2.13.0](https://www.npmjs.com/package/commander)
-* [semver@5.5.0](https://www.npmjs.com/package/semver)
-* [pg-promise@7.4.0](https://www.npmjs.com/package/pg-promise)
-* [ws@4.0.0](https://www.npmjs.com/package/ws)
-* [mime@2.2.0](https://www.npmjs.com/package/mime)
-* [parse@1.11.0](https://www.npmjs.com/package/parse)
-
-##### Development Dependencies Updates:
-* [nodemon@1.14.11](https://www.npmjs.com/package/nodemon)
-* [flow-bin@0.64.0](https://www.npmjs.com/package/flow-bin)
-* [jasmine@2.9.0](https://www.npmjs.com/package/jasmine)
-* [cross-env@5.1.3](https://www.npmjs.com/package/cross-env)
-
-### 2.7.1
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.7.1...2.7.0)
-
-:warning: Fixes a security issue affecting Class Level Permissions
-
-* Adds support for dot notation when using matchesKeyInQuery, thanks to [Henrik](https://github.com/bohemima) and [Arthur Cinader](https://github.com/acinader)
-
-### 2.7.0
-[Full Changelog](https://github.com/parse-community/parse-server/compare/2.7.0...2.6.5)
-
-:warning: This version contains an issue affecting Class Level Permissions on mongoDB. Please upgrade to 2.7.1.
-
-Starting parse-server 2.7.0, the minimun nodejs version is 6.11.4, please update your engines before updating parse-server
-
-#### New Features:
-* Aggregation endpoints, thanks to [Diamond Lewis](https://github.com/dplewis)
-* Adds indexation options onto Schema endpoints, thanks to [Diamond Lewis](https://github.com/dplewis)
-
-#### Bug fixes:
-* Fixes sessionTokens being overridden in 'find' (#4332), thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-* Proper `handleShutdown()` feature to close database connections (#4361), thanks to [CHANG, TZU-YEN](https://github.com/trylovetom)
-* Fixes issue affecting state of _PushStatus objects, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-* Fixes issue affecting calling password reset password pages with wrong appid, thanks to [Bryan de Leon](https://github.com/bryandel)
-* Fixes issue affecting duplicates _Sessions on successive logins, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Improvements:
-* Updates contributing guides, and improves windows support, thanks to [Addison Elliott](https://github.com/addisonelliott)
-* Uses new official scoped packaged, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Improves health checks responses, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-* Add password confirmation to choose_password, thanks to [Worathiti Manosroi](https://github.com/pungme)
-* Improve performance of relation queries, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Dependency Updates:
-* [commander@2.12.1](https://www.npmjs.com/package/commander)
-* [ws@3.3.2](https://www.npmjs.com/package/ws)
-* [uws@9.14.0](https://www.npmjs.com/package/uws)
-* [pg-promise@7.3.2](https://www.npmjs.com/package/pg-promise)
-* [parse@1.10.2](https://www.npmjs.com/package/parse)
-* [pg-promise@7.3.1](https://www.npmjs.com/package/pg-promise)
-
-##### Development Dependencies Updates:
-* [cross-env@5.1.1](https://www.npmjs.com/package/cross-env)
-
-
-
-### 2.6.5
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.6.5...2.6.4)
-
-#### New Features:
-* Adds support for read-only masterKey, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Adds support for relative time queries (mongodb only), thanks to [Marvel Mathew](https://github.com/marvelm)
-
-#### Improvements:
-* Handle possible afterSave exception, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-* Add support for expiration interval in Push, thanks to [Marvel Mathew](https://github.com/marvelm)
-
-#### Bug Fixes:
-* The REST API key was improperly inferred from environment when using the CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-### 2.6.4
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.6.4...2.6.3)
-
-#### Improvements:
-* Improves management of configurations and default values, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Adds ability to start ParseServer with `ParseServer.start(options)`, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Adds request original IP to cloud code hooks, thanks to [Gustav Ahlberg](https://github.com/Gyran)
-* Corrects some outdated links, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-* Adds serverURL validation on startup, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-* Adds ability to login with POST requests alongside GET, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-* Adds ability to login with email, instead of username, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Bug Fixes:
-* Fixes issue affecting beforeSaves and increments, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-
-#### Dependency Updates:
-* [parse-server-push-adapter@2.0.2](https://www.npmjs.com/package/parse-server-push-adapter)
-* [semver@5.4.1](https://www.npmjs.com/package/semver)
-* [pg-promise@7.0.3](https://www.npmjs.com/package/pg-promise)
-* [mongodb@2.2.33](https://www.npmjs.com/package/mongodb)
-* [parse@1.10.1](https://www.npmjs.com/package/parse)
-* [express@4.16.0](https://www.npmjs.com/package/express)
-* [mime@1.4.1](https://www.npmjs.com/package/mime)
-* [parse-server-simple-mailgun-adapter@1.0.1](https://www.npmjs.com/package/parse-server-simple-mailgun-adapter)
-
-##### Development Dependencies Updates:
-* [babel-preset-env@1.6.1](https://www.npmjs.com/package/babel-preset-env)
-* [cross-env@5.1.0](https://www.npmjs.com/package/cross-env)
-* [mongodb-runner@3.6.1](https://www.npmjs.com/package/mongodb-runner)
-* [eslint-plugin-flowtype@2.39.1](https://www.npmjs.com/package/eslint-plugin-flowtype)
-* [eslint@4.9.0](https://www.npmjs.com/package/eslint)
-
-### 2.6.3
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.6.2...2.6.3)
-
-#### Improvements:
-* Queries on Pointer fields with `$in` and `$nin` now supports list of objectId's, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* LiveQueries on `$in` and `$nin` for pointer fields work as expected thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Also remove device token when APNS error is BadDeviceToken, thanks to [Mauricio Tollin](https://github.com/)
-* LRU cache is not available on the ParseServer object, thanks to [Tyler Brock](https://github.com/tbrock)
-* Error messages are more expressive, thanks to [Tyler Brock](https://github.com/tbrock)
-* Postgres: Properly handle undefined field values, thanks to [Diamond Lewis](https://github.com/dlewis)
-* Updating with two GeoPoints fails correctly, thanks to [Anthony Mosca](https://github.com/aontas)
-
-#### New Features:
-* Adds ability to set a maxLimit on server configuration for queries, thanks to [Chris Norris](https://github.com/)
-
-#### Bug fixes:
-* Fixes issue affecting reporting `_PushStatus` with misconfigured serverURL, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fixes issue affecting deletion of class that doesn't exist, thanks to [Diamond Lewis](https://github.com/dlewis)
-
-#### Dependency Updates:
-* [winston@2.4.0](https://www.npmjs.com/package/winston)
-* [pg-promise@6.10.2](https://www.npmjs.com/package/pg-promise)
-* [winston-daily-rotate-file@1.6.0](https://www.npmjs.com/package/winston-daily-rotate-file)
-* [request@2.83.0](https://www.npmjs.com/package/request)
-* [body-parser@1.18.2](https://www.npmjs.com/package/body-parser)
-
-##### Development Dependencies Updates:
-* [request-promise@4.2.2](https://www.npmjs.com/package/request-promise)
-* [eslint@4.7.1](https://www.npmjs.com/package/eslint)
-
-### 2.6.2
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.6.1...2.6.2)
-
-#### Improvements:
-* PushWorker/PushQueue channels are properly prefixed with the Parse applicationId, thanks to [Marvel Mathew](https://github.com/marvelm)
-* You can use Parse.Cloud.afterSave hooks on _PushStatus
-* You can use Parse.Cloud.onLiveQueryEvent to track the number of clients and subscriptions
-* Adds support for more fields from the Audience class.
-
-#### New Features:
-* Push: Adds ability to track sentPerUTC offset if your push scheduler supports it.
-* Push: Adds support for cleaning up invalid deviceTokens from _Installation (PARSE_SERVER_CLEANUP_INVALID_INSTALLATIONS=1).
-
-#### Dependency Updates:
-* [ws@3.2.0](https://www.npmjs.com/package/ws)
-* [pg-promise@6.5.3](https://www.npmjs.com/package/pg-promise)
-* [winston-daily-rotate-file@1.5.0](https://www.npmjs.com/package/winston-daily-rotate-file)
-* [body-parser@1.18.1](https://www.npmjs.com/package/body-parser)
-
-##### Development Dependencies Updates:
-* [nodemon@1.12.1](https://www.npmjs.com/package/nodemon)
-* [mongodb-runner@3.6.0](https://www.npmjs.com/package/mongodb-runner)
-* [babel-eslint@8.0.0](https://www.npmjs.com/package/babel-eslint)
-
-### 2.6.1
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.6.0...2.6.1)
-
-#### Improvements:
-* Improves overall performance of the server, more particularly with large query results.
-* Improves performance of InMemoryCacheAdapter by removing serialization.
-* Improves logging performance by skipping necessary log calls.
-* Refactors object routers to simplify logic.
-* Adds automatic indexing on $text indexes, thanks to [Diamon Lewis](https://github.com/dplewis)
-
-#### New Features:
-* Push: Adds ability to send localized pushes according to the _Installation localeIdentifier
-* Push: proper support for scheduling push in user's locale time, thanks to [Marvel Mathew](https://github.com/marvelm)
-* LiveQuery: Adds ability to use LiveQuery with a masterKey, thanks to [Jeremy May](https://github.com/kenishi)
-
-#### Bug Fixes:
-* Fixes an issue that would duplicate Session objects per userId-installationId pair.
-* Fixes an issue affecting pointer permissions introduced in this release.
-* Fixes an issue that would prevent displaying audiences correctly in dashboard.
-* Fixes an issue affecting preventLoginWithUnverifiedEmail upon signups.
-
-#### Dependency Updates:
-* [pg-promise@6.3.2](https://www.npmjs.com/package/pg-promise)
-* [body-parser@1.18.0](https://www.npmjs.com/package/body-parser)
-* [nodemon@1.11.1](https://www.npmjs.com/package/nodemon)
-
-##### Development Dependencies Updates:
-* [babel-cli@6.26.0](https://www.npmjs.com/package/babel-cli)
-
-### 2.6.0
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.5.3...2.6.0)
-
-#### Breaking Changes:
-* [parse-server-s3-adapter@1.2.0](https://www.npmjs.com/package/parse-server-s3-adapter): A new deprecation notice is introduced with parse-server-s3-adapter's version 1.2.0. An upcoming release will remove passing key and password arguments. AWS credentials should be set using AWS best practices. See the [Deprecation Notice for AWS credentials]( https://github.com/parse-server-modules/parse-server-s3-adapter/blob/master/README.md#deprecation-notice----aws-credentials) section of the adapter's README.
-
-#### New Features
-* Polygon is fully supported as a type, thanks to [Diamond Lewis](https://github.com/dplewis)
-* Query supports PolygonContains, thanks to [Diamond Lewis](https://github.com/dplewis)
-
-#### Improvements
-* Postgres: Adds support nested contains and containedIn, thanks to [Diamond Lewis](https://github.com/dplewis)
-* Postgres: Adds support for `null` in containsAll queries, thanks to [Diamond Lewis](https://github.com/dplewis)
-* Cloud Code: Request headers are passed to the cloud functions, thanks to [miguel-s](https://github.com/miguel-s)
-* Push: All push queries now filter only where deviceToken exists
-
-#### Bug Fixes:
-* Fixes issue affecting updates of _User objects when authData was passed.
-* Push: Pushing to an empty audience should now properly report a failed _PushStatus
-* Linking Users: Fixes issue affecting linking users with sessionToken only
-
-#### Dependency Updates:
-* [ws@3.1.0](https://www.npmjs.com/package/ws)
-* [mime@1.4.0](https://www.npmjs.com/package/mime)
-* [semver@5.4.0](https://www.npmjs.com/package/semver)
-* [uws@8.14.1](https://www.npmjs.com/package/uws)
-* [bcrypt@1.0.3](https://www.npmjs.com/package/bcrypt)
-* [mongodb@2.2.31](https://www.npmjs.com/package/mongodb)
-* [redis@2.8.0](https://www.npmjs.com/package/redis)
-* [pg-promise@6.3.1](https://www.npmjs.com/package/pg-promise)
-* [commander@2.11.0](https://www.npmjs.com/package/commander)
-
-##### Development Dependencies Updates:
-* [jasmine@2.8.0](https://www.npmjs.com/package/jasmine)
-* [babel-register@6.26.0](https://www.npmjs.com/package/babel-register)
-* [babel-core@6.26.0](https://www.npmjs.com/package/babel-core)
-* [cross-env@5.0.2](https://www.npmjs.com/package/cross-env)
-
-### 2.5.3
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.5.2...2.5.3)
-
-#### New Features:
-* badge property on android installations will now be set as on iOS (#3970), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Bug Fixes:
-* Fixes incorrect number parser for cache options
-
-### 2.5.2
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.5.1...2.5.2)
-
-#### Improvements:
-* Restores ability to run on node >= 4.6
-* Adds ability to configure cache from CLI
-* Removes runtime check for node >= 4.6
-
-### 2.5.1
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.5.0...2.5.1)
-
-#### New Features:
-* Adds ability to set default objectId size (#3950), thanks to [Steven Shipton](https://github.com/steven-supersolid)
-
-#### Improvements:
-* Uses LRU cache instead of InMemoryCache by default (#3979), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* iOS pushes are now using HTTP/2.0 instead of binary API (#3983), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Dependency Updates:
-* [parse@1.10.0](https://www.npmjs.com/package/parse)
-* [pg-promise@6.3.0](https://www.npmjs.com/package/pg-promise)
-* [parse-server-s3-adapter@1.1.0](https://www.npmjs.com/package/parse-server-s3-adapter)
-* [parse-server-push-adapter@2.0.0](https://www.npmjs.com/package/parse-server-push-adapter)
-
-### 2.5.0
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.4.2...2.5.0)
-
-#### New Features:
-* Adds ability to run full text search (#3904), thanks to [Diamond Lewis](https://github.com/dplewis)
-* Adds ability to run `$withinPolygon` queries (#3889), thanks to [Diamond Lewis](https://github.com/dplewis)
-* Adds ability to pass read preference per query with mongodb (#3865), thanks to [davimacedo](https://github.com/davimacedo)
-* beforeFind trigger now includes `isGet` for get queries (#3862), thanks to [davimacedo](https://github.com/davimacedo)
-* Adds endpoints for dashboard's audience API (#3861), thanks to [davimacedo](https://github.com/davimacedo)
-* Restores the job scheduling endpoints (#3927), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Improvements:
-* Removes unnecessary warning when using maxTimeMs with mongodb, thanks to [Tyler Brock](https://github.com/tbrock)
-* Improves access control on system classes (#3916), thanks to [Worathiti Manosroi](https://github.com/pungme)
-* Adds bytes support in postgres (#3894), thanks to [Diamond Lewis](https://github.com/dplewis)
-
-#### Bug Fixes:
-* Fixes issue with vkontakte adapter that would hang the request, thanks to [Denis Trofimov](https://github.com/denistrofimov)
-* Fixes issue affecting null relational data (#3924), thanks to [davimacedo](https://github.com/davimacedo)
-* Fixes issue affecting session token deletion (#3937), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fixes issue affecting the serverInfo endpoint (#3933), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fixes issue affecting beforeSave with dot-noted sub-documents (#3912), thanks to [IlyaDiallo](https://github.com/IlyaDiallo)
-* Fixes issue affecting emails being sent when using a 3rd party auth (#3882), thanks to [davimacedo](https://github.com/davimacedo)
-
-#### Dependency Updates:
-* [commander@2.10.0](https://www.npmjs.com/package/commander)
-* [pg-promise@5.9.7](https://www.npmjs.com/package/pg-promise)
-* [lru-cache@4.1.0](https://www.npmjs.com/package/lru-cache)
-* [mongodb@2.2.28](https://www.npmjs.com/package/mongodb)
-
-##### Development dependencies
-* [babel-core@6.25.0](https://www.npmjs.com/package/babel-core)
-* [cross-env@5.0.1](https://www.npmjs.com/package/cross-env)
-* [nyc@11.0.2](https://www.npmjs.com/package/nyc)
-
-### 2.4.2
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.4.1...2.4.2)
-
-#### New Features:
-* ParseQuery: Support for withinPolygon [#3866](https://github.com/parse-community/parse-server/pull/3866), thanks to [Diamond Lewis](https://github.com/dplewis)
-
-#### Improvements:
-* Postgres: Use transactions when deleting a class, [#3869](https://github.com/parse-community/parse-server/pull/3836), thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
-* Postgres: Proper support for GeoPoint equality query, [#3874](https://github.com/parse-community/parse-server/pull/3836), thanks to [Diamond Lewis](https://github.com/dplewis)
-* beforeSave and liveQuery will be correctly triggered on email verification [#3851](https://github.com/parse-community/parse-server/pull/3851), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Bug fixes:
-* Skip authData validation if it hasn't changed, on PUT requests [#3872](https://github.com/parse-community/parse-server/pull/3872), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Dependency Updates:
-* [mongodb@2.2.27](https://www.npmjs.com/package/mongodb)
-* [pg-promise@5.7.2](https://www.npmjs.com/package/pg-promise)
-
-
-### 2.4.1
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.4.0...2.4.1)
-
-#### Bug fixes:
-* Fixes issue affecting relation updates ([#3835](https://github.com/parse-community/parse-server/pull/3835), [#3836](https://github.com/parse-community/parse-server/pull/3836)), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fixes issue affecting sending push notifications, thanks to [Felipe Andrade](https://github.com/felipemobile)
-* Session are always cleared when updating the passwords ([#3289](https://github.com/parse-community/parse-server/pull/3289), [#3821](https://github.com/parse-community/parse-server/pull/3821), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Dependency Updates:
-* [body-parser@1.17.2](https://www.npmjs.com/package/body-parser)
-* [pg-promise@5.7.1](https://www.npmjs.com/package/pg-promise)
-* [ws@3.0.0](https://www.npmjs.com/package/ws)
-
-
-### 2.4.0
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.8...2.4.0)
-
-Starting 2.4.0, parse-server is tested against node 6.10 and 7.10, mongodb 3.2 and 3.4.
-If you experience issues with older versions, please [open a issue](https://github.com/parse-community/parse-server/issues).
-
-#### New Features:
-* Adds `count` Class Level Permission ([#3814](https://github.com/parse-community/parse-server/pull/3814)), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Proper graceful shutdown support ([#3786](https://github.com/parse-community/parse-server/pull/3786)), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Let parse-server store as `scheduled` Push Notifications with push_time (#3717, #3722), thanks to [Felipe Andrade](https://github.com/felipemobile)
-
-#### Improvements
-* Parse-Server images are built through docker hub, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Skip authData validation if it hasn't changed, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* [postgres] Improve performance when adding many new fields to the Schema ([#3740](https://github.com/parse-community/parse-server/pull/3740)), thanks to [Paulo Vítor S Reis](https://github.com/paulovitin)
-* Test maintenance, wordsmithing and nits ([#3744](https://github.com/parse-community/parse-server/pull/3744)), thanks to [Arthur Cinader](https://github.com/acinader)
-
-#### Bug Fixes:
-* [postgres] Fixes issue affecting deleting multiple fields of a Schema ([#3734](https://github.com/parse-community/parse-server/pull/3734), [#3735](https://github.com/parse-community/parse-server/pull/3735)), thanks to [Paulo Vítor S Reis](https://github.com/paulovitin)
-* Fix issue affecting _PushStatus state ([#3808](https://github.com/parse-community/parse-server/pull/3808)), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* requiresAuthentication Class Level Permission behaves correctly, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Email Verification related fields are not exposed ([#3681](https://github.com/parse-community/parse-server/pull/3681), [#3393](https://github.com/parse-community/parse-server/pull/3393), [#3432](https://github.com/parse-community/parse-server/pull/3432)), thanks to [Anthony Mosca](https://github.com/aontas)
-* HTTP query parameters are properly obfuscated in logs ([#3793](https://github.com/parse-community/parse-server/pull/3793), [#3789](https://github.com/parse-community/parse-server/pull/3789)), thanks to [@youngerong](https://github.com/youngerong)
-* Improve handling of `$near` operators in `$or` queries ([#3767](https://github.com/parse-community/parse-server/pull/3767), [#3798](https://github.com/parse-community/parse-server/pull/3798)), thanks to [Jack Wearden](https://github.com/NotBobTheBuilder)
-* Fix issue affecting arrays of pointers ([#3169](https://github.com/parse-community/parse-server/pull/3169)), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix issue affecting overloaded query constraints ([#3723](https://github.com/parse-community/parse-server/pull/3723), [#3678](https://github.com/parse-community/parse-server/pull/3678)), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Properly catch unhandled rejections in _Installation updates ([#3795](https://github.com/parse-community/parse-server/pull/3795)), thanks to [kahoona77](https://github.com/kahoona77)
-
-#### Dependency Updates:
-
-* [uws@0.14.5](https://www.npmjs.com/package/uws)
-* [mime@1.3.6](https://www.npmjs.com/package/mime)
-* [mongodb@2.2.26](https://www.npmjs.com/package/mongodb)
-* [pg-promise@5.7.0](https://www.npmjs.com/package/pg-promise)
-* [semver@5.3.0](https://www.npmjs.com/package/semver)
-
-##### Development dependencies
-* [babel-cli@6.24.1](https://www.npmjs.com/package/babel-cli)
-* [babel-core@6.24.1](https://www.npmjs.com/package/babel-core)
-* [babel-preset-es2015@6.24.1](https://www.npmjs.com/package/babel-preset-es2015)
-* [babel-preset-stage-0@6.24.1](https://www.npmjs.com/package/babel-preset-stage-0)
-* [babel-register@6.24.1](https://www.npmjs.com/package/babel-register)
-* [cross-env@5.0.0](https://www.npmjs.com/package/cross-env)
-* [deep-diff@0.3.8](https://www.npmjs.com/package/deep-diff)
-* [gaze@1.1.2](https://www.npmjs.com/package/gaze)
-* [jasmine@2.6.0](https://www.npmjs.com/package/jasmine)
-* [jasmine-spec-reporter@4.1.0](https://www.npmjs.com/package/jasmine-spec-reporter)
-* [mongodb-runner@3.5.0](https://www.npmjs.com/package/mongodb-runner)
-* [nyc@10.3.2](https://www.npmjs.com/package/nyc)
-* [request-promise@4.2.1](https://www.npmjs.com/package/request-promise)
-
-
-### 2.3.8
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.7...2.3.8)
-
-#### New Features
-* Support for PG-Promise options, thanks to [ren dong](https://github.com/rendongsc)
-
-#### Improvements
-* Improves support for graceful shutdown, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Improves configuration validation for Twitter Authentication, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
-
-#### Bug Fixes
-* Fixes issue affecting GeoPoint __type with Postgres, thanks to [zhoul-HS](https://github.com/zhoul-HS)
-* Prevent user creation if username or password is empty, thanks to [Wissam Abirached](https://github.com/wabirached)
-
-#### Dependency Updates:
-* [cross-env@4.0.0 ](https://www.npmjs.com/package/cross-env)
-* [ws@2.2.3](https://www.npmjs.com/package/ws)
-* [babel-core@6.24.0](https://www.npmjs.com/package/babel-core)
-* [uws@0.14.0](https://www.npmjs.com/package/uws)
-* [babel-preset-es2015@6.24.0](https://www.npmjs.com/package/babel-preset-es2015)
-* [babel-plugin-syntax-flow@6.18.0](https://www.npmjs.com/package/babel-plugin-syntax-flow)
-* [babel-cli@6.24.0](https://www.npmjs.com/package/babel-cli)
-* [babel-register@6.24.0](https://www.npmjs.com/package/babel-register)
-* [winston-daily-rotate-file@1.4.6](https://www.npmjs.com/package/winston-daily-rotate-file)
-* [mongodb@2.2.25](https://www.npmjs.com/package/mongodb)
-* [redis@2.7.0](https://www.npmjs.com/package/redis)
-* [pg-promise@5.6.4](https://www.npmjs.com/package/pg-promise)
-* [parse-server-push-adapter@1.3.0](https://www.npmjs.com/package/parse-server-push-adapter)
-
-### 2.3.7
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.6...2.3.7)
-
-#### New Features
-* New endpoint to resend verification email, thanks to [Xy Ziemba](https://github.com/xyziemba)
-
-#### Improvements
-* Add TTL option for Redis Cache Adapter, thanks to [Ryan Foster](https://github.com/f0ster)
-* Update Postgres Storage Adapter, thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
-
-#### Bug Fixes
-* Add index on Role.name, fixes (#3579), thanks to [Natan Rolnik](https://github.com/natanrolnik)
-* Fix default value of userSensitiveFields, fixes (#3593), thanks to [Arthur Cinader](https://github.com/acinader)
-
-#### Dependency Updates:
-* [body-parser@1.17.1](https://www.npmjs.com/package/body-parser)
-* [express@4.15.2](https://www.npmjs.com/package/express)
-* [request@2.81.0](https://www.npmjs.com/package/request)
-* [winston-daily-rotate-file@1.4.5](https://www.npmjs.com/package/winston-daily-rotate-file)
-* [ws@2.2.0](https://www.npmjs.com/package/ws)
-
-
-### 2.3.6
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.5...2.3.6)
-
-#### Improvements
-* Adds support for injecting a middleware for instumentation in the CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Alleviate mongodb bug with $or queries [SERVER-13732](https://jira.mongodb.org/browse/SERVER-13732), thanks to [Jack Wearden](https://github.com/NotBobTheBuilder)
-
-#### Bug Fixes
-* Fix issue affecting password policy and empty passwords, thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
-* Fix issue when logging url in non string objects, thanks to [Paulo Vítor S Reis](https://github.com/paulovitin)
-
-#### Dependencies updates:
-* [ws@2.1.0](https://npmjs.com/package/ws)
-* [uws@0.13.0](https://npmjs.com/package/uws)
-* [pg-promise@5.6.2](https://npmjs.com/package/pg-promise)
-
-
-### 2.3.5
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.3...2.3.5)
-
-#### Bug Fixes
-* Allow empty client key
-(#3497), thanks to [Arthur Cinader](https://github.com/acinader)
-* Fix LiveQuery unsafe user
-(#3525), thanks to [David Starke](https://github.com/dstarke)
-* Use `flushdb` instead of `flushall` in RedisCacheAdapter
-(#3523), thanks to [Jeremy Louie](https://github.com/JeremyPlease)
-* Fix saving GeoPoints and Files in `_GlobalConfig` (Make sure we don't treat
-dot notation keys as topLevel atoms)
-(#3531), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-### 2.3.3
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.2...2.3.3)
-
-#### Breaking Changes
-* **Minimum Node engine bumped to 4.6** (#3480), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Bug Fixes
-* Add logging on failure to create file (#3424), thanks to [Arthur Cinader](https://github.com/acinader)
-* Log Parse Errors so they are intelligible (#3431), thanks to [Arthur Cinader](https://github.com/acinader)
-* MongoDB $or Queries avoid SERVER-13732 bug (#3476), thanks to [Jack Wearden](https://github.com/NotBobTheBuilder)
-* Mongo object to Parse object date serialization - avoid re-serialization of iso of type Date (#3389), thanks to [nodechefMatt](https://github.com/nodechefMatt)
-
-#### Improvements
-* Ground preparations for push scalability (#3080), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Use uWS as optional dependency for ws server (#3231), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-### 2.3.2
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.1...2.3.2)
-
-#### New features
-* Add parseFrameURL for masking user-facing pages (#3267), thanks to [Lenart Rudel](https://github.com/lenart)
-
-#### Bug fixes
-* Fix Parse-Server to work with winston-daily-rotate-1.4.2 (#3335), thanks to [Arthur Cinader](https://github.com/acinader)
-
-#### Improvements
-* Add support for regex string for password policy validatorPattern setting (#3331), thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
-* LiveQuery should match subobjects with dot notation (#3322), thanks to [David Starke](https://github.com/dstarke)
-* Reduce time to process high number of installations for push (#3264), thanks to [jeacott1](https://github.com/jeacott1)
-* Fix trivial typo in error message (#3238), thanks to [Arthur Cinader](https://github.com/acinader)
-
-### 2.3.1
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.3.0...2.3.1)
-
-A major issue was introduced when refactoring the authentication modules.
-This release addresses only that issue.
-
-### 2.3.0
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.2.25...2.3.0)
-
-#### Breaking changes
-* Parse.Cloud.useMasterKey() is a no-op, please refer to (Cloud Code migration guide)[https://github.com/ParsePlatform/parse-server/wiki/Compatibility-with-Hosted-Parse#cloud-code]
-* Authentication helpers are now proper adapters, deprecates oauth option in favor of auth.
-* DEPRECATES: facebookAppIds, use `auth: { facebook: { appIds: ["AAAAAAAAA" ] } }`
-* `email` field is not returned anymore for `Parse.User` queries. (Provided only on the user itself if provided).
-
-#### New Features
-* Adds ability to restrict access through Class Level Permissions to only authenticated users [see docs](http://parseplatform.github.io/docs/ios/guide/#requires-authentication-permission-requires-parse-server---230)
-* Adds ability to strip sensitive data from `_User` responses, strips emails by default, thanks to [Arthur Cinader](https://github.com/acinader)
-* Adds password history support for password policies, thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
-
-#### Improvements
-* Bump parse-server-s3-adapter to 1.0.6, thanks to [Arthur Cinader](https://github.com/acinader)
-* Using PARSE_SERVER_ENABLE_EXPERIMENTAL_DIRECT_ACCESS let you create user sessions when passing {installationId: "xxx-xxx"} on signup in cloud code, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Add CLI option to pass `host` parameter when creating parse-server from CLI, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
-
-#### Bug fixes
-* Ensure batch routes are only using posix paths, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-* Ensure falsy options from CLI are properly taken into account, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-* Fixes issues affecting calls to `matchesKeyInQuery` with pointers.
-* Ensure that `select` keys can be changed in triggers (beforeFind...), thanks to [Arthur Cinader](https://github.com/acinader)
-
-#### Housekeeping
-* Enables and enforces linting with eslint, thanks to [Arthur Cinader](https://github.com/acinader)
-
-### 2.2.25
-
-Postgres support requires v9.5
-
-#### New Features
-* Dockerizing Parse Server, thanks to [Kirill Kravinsky](https://github.com/woyorus)
-* Login with qq, wechat, weibo, thanks to [haifeizhang]()
-* Password policy, validation and expiration, thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
-* Health check on /health, thanks to [Kirill Kravinsky](https://github.com/woyorus)
-* Reuse SchemaCache across requests option, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-
-#### Improvements
-* Better support for CLI options, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-* Specity a database timeout with maxTimeMS, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Adds the username to reset password success pages, thanks to [Halim Qarroum](https://github.com/HQarroum)
-* Better support for Redis cache adapter, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Better coverage of Postgres, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
-
-#### Bug Fixes
-* Fixes issue when sending push to multiple installations, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fixes issues with twitter authentication, thanks to [jonas-db](https://github.com/jonas-db)
-* Ignore createdAt fields update, thanks to [Yuki Takeichi](https://github.com/yuki-takeichi)
-* Improve support for array equality with LiveQuery, thanks to [David Poetzsch-Heffter](https://github.com/dpoetzsch)
-* Improve support for batch endpoint when serverURL and publicServerURL have different paths, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Support saving relation objects, thanks to [Yuki Takeichi](https://github.com/yuki-takeichi)
-
-### 2.2.24
-
-#### New Features
-* LiveQuery: Bring your own adapter (#2902), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* LiveQuery: Adds "update" operator to update a query subscription (#2935), thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Improvements
-* Better Postgres support, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
-* Logs the function name when failing (#2963), thanks to [Michael Helvey](https://github.com/michaelhelvey)
-* CLI: forces closing the connections with SIGINT/SIGTERM (#2964), thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
-* Reduce the number of calls to the `_SCHEMA` table (#2912), thanks to [Steven Shipton](https://github.com/steven-supersolid)
-* LiveQuery: Support for Role ACL's, thanks to [Aaron Blondeau](https://github.com/aaron-blondeau-dose)
-
-#### Bug Fixes
-* Better support for checking application and client keys, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-* Google OAuth, better support for android and web logins, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-### 2.2.23
-
-* Run liveQuery server from CLI with a different port, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Support for Postgres databaseURI, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
-* Support for Postgres options, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
-* Improved support for google login (id_token and access_token), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Improvements with VKontakte login, thanks to [Eugene Antropov](https://github.com/antigp)
-* Improved support for `select` and `include`, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Bug fixes
-
-* Fix error when updating installation with useMasterKey (#2888), thanks to [Jeremy Louie](https://github.com/JeremyPlease)
-* Fix bug affecting usage of multiple `notEqualTo`, thanks to [Jeremy Louie](https://github.com/JeremyPlease)
-* Improved support for null values in arrays, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-### 2.2.22
-
-* Minimum nodejs engine is now 4.5
-
-#### New Features
-* New: CLI for parse-live-query-server, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New: Start parse-live-query-server for parse-server CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-#### Bug fixes
-* Fix: Include with pointers are not conflicting with get CLP anymore, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Removes dependency on babel-polyfill, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Support nested select calls, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Use native column selection instead of runtime, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: installationId header is properly used when updating `_Installation` objects, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: don't crash parse-server on improperly formatted live-query messages, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Passwords are properly stripped out of logs, thanks to [Arthur Cinader](https://github.com/acinader)
-* Fix: Lookup for email in username if email is not set, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-### 2.2.21
-
-* Fix: Reverts removal of babel-polyfill
-
-### 2.2.20
-
-* New: Adds CloudCode handler for `beforeFind`, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New: RedisCacheAdapter for syncing schema, role and user caches across servers, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New: Latest master build available at `ParsePlatform/parse-server#latest`, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Better support for upgradeToRevocableSession with missing session token, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Removes babel-polyfill runtime dependency, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Cluster option now support a boolean value for automatically choosing the right number of processes, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Filenames now appear correctly, thanks to [Lama Chandrasena](https://github.com/lama-buddy)
-* Fix: `_acl` is properly updated, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-
-Other fixes by [Mathias Rangel Wulff](https://github.com/mathiasrw)
-
-### 2.2.19
-
-* New: support for upgrading to revocable sessions, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New: NullCacheAdapter for disabling caching, thanks to [Yuki Takeichi](https://github.com/yuki-takeichi)
-* New: Account lockout policy [#2601](https://github.com/ParsePlatform/parse-server/pull/2601), thanks to [Diwakar Cherukumilli](https://github.com/cherukumilli)
-* New: Jobs endpoint for defining and run jobs (no scheduling), thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New: Add --cluster option to the CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New: Support for login with vk.com, thanks to [Nurdaulet Bolatov](https://github.com/nbolatov)
-* New: experimental support for postgres databases, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: parse-server doesn't call next() after successful responses, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Nested objects are properly includeed with Pointer Permissions on, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: null values in include calls are properly handled, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Schema validations now runs after beforeSave hooks, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: usersname and passwords are properly type checked, thanks to [Bam Wang](https://github.com/bamwang)
-* Fix: logging in info log would log also in error log, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: removes extaneous logging from ParseLiveQueryServer, thanks to [Flavio Torres](https://github.com/flavionegrao)
-* Fix: support for Range requests for files, thanks to [Brage G. Staven](https://github.com/Bragegs)
-
-### 2.2.18
-
-* Fix: Improve support for objects in push alert, thanks to [Antoine Lenoir](https://github.com/alenoir)
-* Fix; Prevent pointed from getting clobbered when they are changed in a beforeSave, thanks to [sud](https://github.com/sud80)
-* Fix: Improve support for "Bytes" type, thanks to [CongHoang](https://github.com/conghoang)
-* Fix: Better logging compatability with Parse.com, thanks to [Arthur Cinader](https://github.com/acinader)
-* New: Add Janrain Capture and Janrain Engage auth provider, thanks to [Andrew Lane](https://github.com/AndrewLane)
-* Improved: Include content length header in files response, thanks to [Steven Van Bael](https://github.com/vbsteven)
-* Improved: Support byte range header for files, thanks to [Brage G. Staven](https://github.com/Bragegs)
-* Improved: Validations for LinkedIn access_tokens, thanks to [Felix Dumit](https://github.com/felix-dumit)
-* Improved: Experimental postgres support, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Perf: Use native bcrypt implementation if available, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-
-### 2.2.17
-[Full Changelog](https://github.com/ParsePlatform/parse-server/compare/2.2.16...2.2.17)
-
-* Cloud code logs [\#2370](https://github.com/ParsePlatform/parse-server/pull/2370) ([flovilmart](https://github.com/flovilmart))
-* Make sure \_PushStatus operations are run in order [\#2367](https://github.com/ParsePlatform/parse-server/pull/2367) ([flovilmart](https://github.com/flovilmart))
-* Typo fix for error message when can't ensure uniqueness of user email addresses [\#2360](https://github.com/ParsePlatform/parse-server/pull/2360) ([AndrewLane](https://github.com/AndrewLane))
-* LiveQuery constrains matching fix [\#2357](https://github.com/ParsePlatform/parse-server/pull/2357) ([simonas-notcat](https://github.com/simonas-notcat))
-* Fix typo in logging for commander parseConfigFile [\#2352](https://github.com/ParsePlatform/parse-server/pull/2352) ([AndrewLane](https://github.com/AndrewLane))
-* Fix minor typos in test names [\#2351](https://github.com/ParsePlatform/parse-server/pull/2351) ([acinader](https://github.com/acinader))
-* Makes sure we don't strip authData or session token from users using masterKey [\#2348](https://github.com/ParsePlatform/parse-server/pull/2348) ([flovilmart](https://github.com/flovilmart))
-* Run coverage with istanbul [\#2340](https://github.com/ParsePlatform/parse-server/pull/2340) ([flovilmart](https://github.com/flovilmart))
-* Run next\(\) after successfully sending data to the client [\#2338](https://github.com/ParsePlatform/parse-server/pull/2338) ([blacha](https://github.com/blacha))
-* Cache all the mongodb/version folder [\#2336](https://github.com/ParsePlatform/parse-server/pull/2336) ([flovilmart](https://github.com/flovilmart))
-* updates usage of setting: emailVerifyTokenValidityDuration [\#2331](https://github.com/ParsePlatform/parse-server/pull/2331) ([cherukumilli](https://github.com/cherukumilli))
-* Update Mongodb client to 2.2.4 [\#2329](https://github.com/ParsePlatform/parse-server/pull/2329) ([flovilmart](https://github.com/flovilmart))
-* Allow usage of analytics adapter [\#2327](https://github.com/ParsePlatform/parse-server/pull/2327) ([deashay](https://github.com/deashay))
-* Fix flaky tests [\#2324](https://github.com/ParsePlatform/parse-server/pull/2324) ([flovilmart](https://github.com/flovilmart))
-* don't serve null authData values [\#2320](https://github.com/ParsePlatform/parse-server/pull/2320) ([yuzeh](https://github.com/yuzeh))
-* Fix null relation problem [\#2319](https://github.com/ParsePlatform/parse-server/pull/2319) ([flovilmart](https://github.com/flovilmart))
-* Clear the connectionPromise upon close or error [\#2314](https://github.com/ParsePlatform/parse-server/pull/2314) ([flovilmart](https://github.com/flovilmart))
-* Report validation errors with correct error code [\#2299](https://github.com/ParsePlatform/parse-server/pull/2299) ([flovilmart](https://github.com/flovilmart))
-* Parses correctly Parse.Files and Dates when sent to Cloud Code Functions [\#2297](https://github.com/ParsePlatform/parse-server/pull/2297) ([flovilmart](https://github.com/flovilmart))
-* Adding proper generic Not Implemented. [\#2292](https://github.com/ParsePlatform/parse-server/pull/2292) ([vitaly-t](https://github.com/vitaly-t))
-* Adds schema caching capabilities \(5s by default\) [\#2286](https://github.com/ParsePlatform/parse-server/pull/2286) ([flovilmart](https://github.com/flovilmart))
-* add digits oauth provider [\#2284](https://github.com/ParsePlatform/parse-server/pull/2284) ([ranhsd](https://github.com/ranhsd))
-* Improve installations query [\#2281](https://github.com/ParsePlatform/parse-server/pull/2281) ([flovilmart](https://github.com/flovilmart))
-* Adding request headers to cloud functions fixes \#1461 [\#2274](https://github.com/ParsePlatform/parse-server/pull/2274) ([blacha](https://github.com/blacha))
-* Creates a new sessionToken when updating password [\#2266](https://github.com/ParsePlatform/parse-server/pull/2266) ([flovilmart](https://github.com/flovilmart))
-* Add Gitter chat link to the README. [\#2264](https://github.com/ParsePlatform/parse-server/pull/2264) ([nlutsenko](https://github.com/nlutsenko))
-* Restores ability to include non pointer keys [\#2263](https://github.com/ParsePlatform/parse-server/pull/2263) ([flovilmart](https://github.com/flovilmart))
-* Allow next middleware handle error in handleParseErrors [\#2260](https://github.com/ParsePlatform/parse-server/pull/2260) ([mejcz](https://github.com/mejcz))
-* Exposes the ClientSDK infos if available [\#2259](https://github.com/ParsePlatform/parse-server/pull/2259) ([flovilmart](https://github.com/flovilmart))
-* Adds support for multiple twitter auths options [\#2256](https://github.com/ParsePlatform/parse-server/pull/2256) ([flovilmart](https://github.com/flovilmart))
-* validate\_purchase fix for SANDBOX requests [\#2253](https://github.com/ParsePlatform/parse-server/pull/2253) ([valeryvaskabovich](https://github.com/valeryvaskabovich))
-
-### 2.2.16
-
-* New: Expose InMemoryCacheAdapter publicly, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-* New: Add ability to prevent login with unverified email, thanks to [Diwakar Cherukumilli](https://github.com/cherukumilli)
-* Improved: Better error message for incorrect type, thanks to [Andrew Lane](https://github.com/AndrewLane)
-* Improved: Better error message for permission denied, thanks to [Blayne Chard](https://github.com/blacha)
-* Improved: Update authData on login, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Improved: Ability to not check for old files on Parse.com, thanks to [OzgeAkin](https://github.com/OzgeAkin)
-* Fix: Issues with email adapter validation, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Fix: Issues with nested $or queries, thanks to [Florent Vilmart](https://github.com/flovilmart)
-
-### 2.2.15
-
-* Fix: Type in description for Parse.Error.INVALID_QUERY, thanks to [Andrew Lane](https://github.com/AndrewLane)
-* Improvement: Stop requiring verifyUserEmails for password reset functionality, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Improvement: Kill without validation, thanks to [Drew Gross](https://github.com/drew-gross)
-* Fix: Deleting a file does not delete from fs.files, thanks to [David Keita](https://github.com/maninga)
-* Fix: Postgres stoage adapter fix, thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
-* Fix: Results invalid session when providing an invalid session token, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: issue creating an anonymous user, thanks to [Hussam Moqhim](https://github.com/hmoqhim)
-* Fix: make http response serializable, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* New: Add postmark email adapter alternative [Glenn Reyes](https://github.com/glennreyes)
-
-### 2.2.14
-
-* Hotfix: Fix Parse.Cloud.HTTPResponse serialization
-
-### 2.2.13
-
-* Hotfix: Pin version of deepcopy
-
-### 2.2.12
-
-* New: Custom error codes in cloud code response.error, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
-* Fix: Crash in beforeSave when response is not an object, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Fix: Allow "get" on installations
-* Fix: Fix overly restrictive Class Level Permissions, thanks to [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Fix nested date parsing in Cloud Code, thanks to [Marco Cheung](https://github.com/Marco129)
-* Fix: Support very old file formats from Parse.com
-
-### 2.2.11
-
-* Security: Censor user password in logs, thanks to [Marco Cheung](https://github.com/Marco129)
-* New: Add PARSE_SERVER_LOGS_FOLDER env var for setting log folder, thanks to [KartikeyaRokde](https://github.com/KartikeyaRokde)
-* New: Webhook key support, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Perf: Add cache adapter and default caching of certain objects, thanks to [Blayne Chard](https://github.com/blacha)
-* Improvement: Better error messages for schema type mismatches, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
-* Improvement: Better error messages for reset password emails
-* Improvement: Webhook key support in CLI, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Fix: Remove read only fields when using beforeSave, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Fix: Use content type provided by JS SDK, thanks to [Blayne Chard](https://github.com/blacha) and [Florent Vilmart](https://github.com/flovilmart)
-* Fix: Tell the dashboard the stored push data is available, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
-* Fix: Add support for HTTP Basic Auth, thanks to [Hussam Moqhim](https://github.com/hmoqhim)
-* Fix: Support for MongoDB version 3.2.6, (note: do not use MongoDB 3.2 with migrated apps that still have traffic on Parse.com), thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Fix: Prevent `pm2` from crashing when push notifications fail, thanks to [benishak](https://github.com/benishak)
-* Fix: Add full list of default _Installation fields, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
-* Fix: Strip objectId out of hooks responses, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Fix: Fix external webhook response format, thanks to [Tyler Brock](https://github.com/TylerBrock)
-* Fix: Fix beforeSave when object is passed to `success`, thanks to [Madhav Bhagat](https://github.com/codebreach)
-* Fix: Remove use of deprecated APIs, thanks to [Emad Ehsan](https://github.com/emadehsan)
-* Fix: Crash when multiple Parse Servers on the same machine try to write to the same logs folder, thanks to [Steven Shipton](https://github.com/steven-supersolid)
-* Fix: Various issues with key names in `Parse.Object`s
-* Fix: Treat Bytes type properly
-* Fix: Caching bugs that caused writes by masterKey or other session token to not show up to users reading with a different session token
-* Fix: Pin mongo driver version, preventing a regression in version 2.1.19
-* Fix: Various issues with pointer fields not being treated properly
-* Fix: Issues with pointed getting un-fetched due to changes in beforeSave
-* Fix: Fixed crash when deleting classes that have CLPs
-
-### 2.2.10
-
-* Fix: Write legacy ACLs to Mongo so that clients that still go through Parse.com can read them, thanks to [Tyler Brock](https://github.com/TylerBrock) and [carmenlau](https://github.com/carmenlau)
-* Fix: Querying installations with limit = 0 and count = 1 now works, thanks to [ssk7833](https://github.com/ssk7833)
-* Fix: Return correct error when violating unique index, thanks to [Marco Cheung](https://github.com/Marco129)
-* Fix: Allow unsetting user's email, thanks to [Marco Cheung](https://github.com/Marco129)
-* New: Support for Node 6.1
-
-### 2.2.9
-
-* Fix: Fix a regression that caused Parse Server to crash when a null parameter is passed to a Cloud function
-
-### 2.2.8
-
-* New: Support for Pointer Permissions
-* New: Expose logger in Cloud Code
-* New: Option to revoke sessions on password reset
-* New: Option to expire inactive sessions
-* Perf: Improvements in ACL checking query
-* Fix: Issues when sending pushes to list of devices that contains invalid values
-* Fix: Issues caused by using babel-polyfill outside of Parse Server, but in the same express app
-* Fix: Remove creation of extra session tokens
-* Fix: Return authData when querying with master key
-* Fix: Bugs when deleting webhooks
-* Fix: Ignore _RevocableSession header, which might be sent by the JS SDK
-* Fix: Issues with querying via URL params
-* Fix: Properly encode "Date" parameters to cloud code functions
-
-
-### 2.2.7
-
-* Adds support for --verbose and verbose option when running ParseServer [\#1414](https://github.com/ParsePlatform/parse-server/pull/1414) ([flovilmart](https://github.com/flovilmart))
-* Adds limit = 0 as a valid parameter for queries [\#1493](https://github.com/ParsePlatform/parse-server/pull/1493) ([seijiakiyama](https://github.com/seijiakiyama))
-* Makes sure we preserve Installations when updating a token \(\#1475\) [\#1486](https://github.com/ParsePlatform/parse-server/pull/1486) ([flovilmart](https://github.com/flovilmart))
-* Hotfix for tests [\#1503](https://github.com/ParsePlatform/parse-server/pull/1503) ([flovilmart](https://github.com/flovilmart))
-* Enable logs [\#1502](https://github.com/ParsePlatform/parse-server/pull/1502) ([drew-gross](https://github.com/drew-gross))
-* Do some triple equals for great justice [\#1499](https://github.com/ParsePlatform/parse-server/pull/1499) ([TylerBrock](https://github.com/TylerBrock))
-* Apply credential stripping to all untransforms for \_User [\#1498](https://github.com/ParsePlatform/parse-server/pull/1498) ([TylerBrock](https://github.com/TylerBrock))
-* Checking if object has defined key for Pointer constraints in liveQuery [\#1487](https://github.com/ParsePlatform/parse-server/pull/1487) ([simonas-notcat](https://github.com/simonas-notcat))
-* Remove collection prefix and default mongo URI [\#1479](https://github.com/ParsePlatform/parse-server/pull/1479) ([drew-gross](https://github.com/drew-gross))
-* Store collection prefix in mongo adapter, and clean up adapter interface [\#1472](https://github.com/ParsePlatform/parse-server/pull/1472) ([drew-gross](https://github.com/drew-gross))
-* Move field deletion logic into mongo adapter [\#1471](https://github.com/ParsePlatform/parse-server/pull/1471) ([drew-gross](https://github.com/drew-gross))
-* Adds support for Long and Double mongodb types \(fixes \#1316\) [\#1470](https://github.com/ParsePlatform/parse-server/pull/1470) ([flovilmart](https://github.com/flovilmart))
-* Schema.js database agnostic [\#1468](https://github.com/ParsePlatform/parse-server/pull/1468) ([flovilmart](https://github.com/flovilmart))
-* Remove console.log [\#1465](https://github.com/ParsePlatform/parse-server/pull/1465) ([drew-gross](https://github.com/drew-gross))
-* Push status nits [\#1462](https://github.com/ParsePlatform/parse-server/pull/1462) ([flovilmart](https://github.com/flovilmart))
-* Fixes \#1444 [\#1451](https://github.com/ParsePlatform/parse-server/pull/1451) ([flovilmart](https://github.com/flovilmart))
-* Removing sessionToken and authData from \_User objects included in a query [\#1450](https://github.com/ParsePlatform/parse-server/pull/1450) ([simonas-notcat](https://github.com/simonas-notcat))
-* Move mongo field type logic into mongoadapter [\#1432](https://github.com/ParsePlatform/parse-server/pull/1432) ([drew-gross](https://github.com/drew-gross))
-* Prevents \_User lock out when setting ACL on signup or afterwards [\#1429](https://github.com/ParsePlatform/parse-server/pull/1429) ([flovilmart](https://github.com/flovilmart))
-* Update .travis.yml [\#1428](https://github.com/ParsePlatform/parse-server/pull/1428) ([flovilmart](https://github.com/flovilmart))
-* Adds relation fields to objects [\#1424](https://github.com/ParsePlatform/parse-server/pull/1424) ([flovilmart](https://github.com/flovilmart))
-* Update .travis.yml [\#1423](https://github.com/ParsePlatform/parse-server/pull/1423) ([flovilmart](https://github.com/flovilmart))
-* Sets the defaultSchemas keys in the SchemaCollection [\#1421](https://github.com/ParsePlatform/parse-server/pull/1421) ([flovilmart](https://github.com/flovilmart))
-* Fixes \#1417 [\#1420](https://github.com/ParsePlatform/parse-server/pull/1420) ([drew-gross](https://github.com/drew-gross))
-* Untransform should treat Array's as nested objects [\#1416](https://github.com/ParsePlatform/parse-server/pull/1416) ([blacha](https://github.com/blacha))
-* Adds X-Parse-Push-Status-Id header [\#1412](https://github.com/ParsePlatform/parse-server/pull/1412) ([flovilmart](https://github.com/flovilmart))
-* Schema format cleanup [\#1407](https://github.com/ParsePlatform/parse-server/pull/1407) ([drew-gross](https://github.com/drew-gross))
-* Updates the publicServerURL option [\#1397](https://github.com/ParsePlatform/parse-server/pull/1397) ([flovilmart](https://github.com/flovilmart))
-* Fix exception with non-expiring session tokens. [\#1386](https://github.com/ParsePlatform/parse-server/pull/1386) ([0x18B2EE](https://github.com/0x18B2EE))
-* Move mongo schema format related logic into mongo adapter [\#1385](https://github.com/ParsePlatform/parse-server/pull/1385) ([drew-gross](https://github.com/drew-gross))
-* WIP: Huge performance improvement on roles queries [\#1383](https://github.com/ParsePlatform/parse-server/pull/1383) ([flovilmart](https://github.com/flovilmart))
-* Removes GCS Adapter from provided adapters [\#1339](https://github.com/ParsePlatform/parse-server/pull/1339) ([flovilmart](https://github.com/flovilmart))
-* DBController refactoring [\#1228](https://github.com/ParsePlatform/parse-server/pull/1228) ([flovilmart](https://github.com/flovilmart))
-* Spotify authentication [\#1226](https://github.com/ParsePlatform/parse-server/pull/1226) ([1nput0utput](https://github.com/1nput0utput))
-* Expose DatabaseAdapter to simplify application tests [\#1121](https://github.com/ParsePlatform/parse-server/pull/1121) ([steven-supersolid](https://github.com/steven-supersolid))
-
-### 2.2.6
-
-* Important Fix: Disables find on installation from clients [\#1374](https://github.com/ParsePlatform/parse-server/pull/1374) ([flovilmart](https://github.com/flovilmart))
-* Adds missing options to the CLI [\#1368](https://github.com/ParsePlatform/parse-server/pull/1368) ([flovilmart](https://github.com/flovilmart))
-* Removes only master on travis [\#1367](https://github.com/ParsePlatform/parse-server/pull/1367) ([flovilmart](https://github.com/flovilmart))
-* Auth.\_loadRoles should not query the same role twice. [\#1366](https://github.com/ParsePlatform/parse-server/pull/1366) ([blacha](https://github.com/blacha))
-
-### 2.2.5
-
-* Improves config loading and tests [\#1363](https://github.com/ParsePlatform/parse-server/pull/1363) ([flovilmart](https://github.com/flovilmart))
-* Adds travis configuration to deploy NPM on new version tags [\#1361](https://github.com/ParsePlatform/parse-server/pull/1361) ([gfosco](https://github.com/gfosco))
-* Inject the default schemas properties when loading it [\#1357](https://github.com/ParsePlatform/parse-server/pull/1357) ([flovilmart](https://github.com/flovilmart))
-* Adds console transport when testing with VERBOSE=1 [\#1351](https://github.com/ParsePlatform/parse-server/pull/1351) ([flovilmart](https://github.com/flovilmart))
-* Make notEqual work on relations [\#1350](https://github.com/ParsePlatform/parse-server/pull/1350) ([flovilmart](https://github.com/flovilmart))
-* Accept only bool for $exists in LiveQuery [\#1315](https://github.com/ParsePlatform/parse-server/pull/1315) ([drew-gross](https://github.com/drew-gross))
-* Adds more options when using CLI/config [\#1305](https://github.com/ParsePlatform/parse-server/pull/1305) ([flovilmart](https://github.com/flovilmart))
-* Update error message [\#1297](https://github.com/ParsePlatform/parse-server/pull/1297) ([drew-gross](https://github.com/drew-gross))
-* Properly let masterKey add fields [\#1291](https://github.com/ParsePlatform/parse-server/pull/1291) ([flovilmart](https://github.com/flovilmart))
-* Point to \#1271 as how to write a good issue report [\#1290](https://github.com/ParsePlatform/parse-server/pull/1290) ([drew-gross](https://github.com/drew-gross))
-* Adds ability to override mount with publicServerURL for production uses [\#1287](https://github.com/ParsePlatform/parse-server/pull/1287) ([flovilmart](https://github.com/flovilmart))
-* Single object queries to use include and keys [\#1280](https://github.com/ParsePlatform/parse-server/pull/1280) ([jeremyjackson89](https://github.com/jeremyjackson89))
-* Improves report for Push error in logs and \_PushStatus [\#1269](https://github.com/ParsePlatform/parse-server/pull/1269) ([flovilmart](https://github.com/flovilmart))
-* Removes all stdout/err logs while testing [\#1268](https://github.com/ParsePlatform/parse-server/pull/1268) ([flovilmart](https://github.com/flovilmart))
-* Matching queries with doesNotExist constraint [\#1250](https://github.com/ParsePlatform/parse-server/pull/1250) ([andrecardoso](https://github.com/andrecardoso))
-* Added session length option for session tokens to server configuration [\#997](https://github.com/ParsePlatform/parse-server/pull/997) ([Kenishi](https://github.com/Kenishi))
-* Regression test for \#1259 [\#1286](https://github.com/ParsePlatform/parse-server/pull/1286) ([drew-gross](https://github.com/drew-gross))
-* Regression test for \#871 [\#1283](https://github.com/ParsePlatform/parse-server/pull/1283) ([drew-gross](https://github.com/drew-gross))
-* Add a test to repro \#701 [\#1281](https://github.com/ParsePlatform/parse-server/pull/1281) ([drew-gross](https://github.com/drew-gross))
-* Fix for \#1334: using relative cloud code files broken [\#1353](https://github.com/ParsePlatform/parse-server/pull/1353) ([airdrummingfool](https://github.com/airdrummingfool))
-* Fix Issue/1288 [\#1346](https://github.com/ParsePlatform/parse-server/pull/1346) ([flovilmart](https://github.com/flovilmart))
-* Fixes \#1271 [\#1295](https://github.com/ParsePlatform/parse-server/pull/1295) ([drew-gross](https://github.com/drew-gross))
-* Fixes issue \#1302 [\#1314](https://github.com/ParsePlatform/parse-server/pull/1314) ([flovilmart](https://github.com/flovilmart))
-* Fixes bug related to include in queries [\#1312](https://github.com/ParsePlatform/parse-server/pull/1312) ([flovilmart](https://github.com/flovilmart))
-
-
-### 2.2.4
-
-* Hotfix: fixed imports issue for S3Adapter, GCSAdapter, FileSystemAdapter [\#1263](https://github.com/ParsePlatform/parse-server/pull/1263) ([drew-gross](https://github.com/drew-gross)
-* Fix: Clean null authData values on _User update [\#1199](https://github.com/ParsePlatform/parse-server/pull/1199) ([yuzeh](https://github.com/yuzeh))
-
-### 2.2.3
-
-* Fixed bug with invalid email verification link on email update. [\#1253](https://github.com/ParsePlatform/parse-server/pull/1253) ([kzielonka](https://github.com/kzielonka))
-* Badge update supports increment as well as Increment [\#1248](https://github.com/ParsePlatform/parse-server/pull/1248) ([flovilmart](https://github.com/flovilmart))
-* Config/Push Tested with the dashboard. [\#1235](https://github.com/ParsePlatform/parse-server/pull/1235) ([drew-gross](https://github.com/drew-gross))
-* Better logging with winston [\#1234](https://github.com/ParsePlatform/parse-server/pull/1234) ([flovilmart](https://github.com/flovilmart))
-* Make GlobalConfig work like parse.com [\#1210](https://github.com/ParsePlatform/parse-server/pull/1210) ([framp](https://github.com/framp))
-* Improve flattening of results from pushAdapter [\#1204](https://github.com/ParsePlatform/parse-server/pull/1204) ([flovilmart](https://github.com/flovilmart))
-* Push adapters are provided by external packages [\#1195](https://github.com/ParsePlatform/parse-server/pull/1195) ([flovilmart](https://github.com/flovilmart))
-* Fix flaky test [\#1188](https://github.com/ParsePlatform/parse-server/pull/1188) ([drew-gross](https://github.com/drew-gross))
-* Fixes problem affecting finding array pointers [\#1185](https://github.com/ParsePlatform/parse-server/pull/1185) ([flovilmart](https://github.com/flovilmart))
-* Moves Files adapters to external packages [\#1172](https://github.com/ParsePlatform/parse-server/pull/1172) ([flovilmart](https://github.com/flovilmart))
-* Mark push as enabled in serverInfo endpoint [\#1164](https://github.com/ParsePlatform/parse-server/pull/1164) ([drew-gross](https://github.com/drew-gross))
-* Document email adapter [\#1144](https://github.com/ParsePlatform/parse-server/pull/1144) ([drew-gross](https://github.com/drew-gross))
-* Reset password fix [\#1133](https://github.com/ParsePlatform/parse-server/pull/1133) ([carmenlau](https://github.com/carmenlau))
-
-### 2.2.2
-
-* Important Fix: Mounts createLiveQueryServer, fix babel induced problem [\#1153](https://github.com/ParsePlatform/parse-server/pull/1153) (flovilmart)
-* Move ParseServer to it's own file [\#1166](https://github.com/ParsePlatform/parse-server/pull/1166) (flovilmart)
-* Update README.md * remove deploy buttons * replace with community links [\#1139](https://github.com/ParsePlatform/parse-server/pull/1139) (drew-gross)
-* Adds bootstrap.sh [\#1138](https://github.com/ParsePlatform/parse-server/pull/1138) (flovilmart)
-* Fix: Do not override username [\#1142](https://github.com/ParsePlatform/parse-server/pull/1142) (flovilmart)
-* Fix: Add pushId back to GCM payload [\#1168](https://github.com/ParsePlatform/parse-server/pull/1168) (wangmengyan95)
-
-### 2.2.1
-
-* New: Add FileSystemAdapter file adapter [\#1098](https://github.com/ParsePlatform/parse-server/pull/1098) (dtsolis)
-* New: Enabled CLP editing [\#1128](https://github.com/ParsePlatform/parse-server/pull/1128) (drew-gross)
-* Improvement: Reduces the number of connections to mongo created [\#1111](https://github.com/ParsePlatform/parse-server/pull/1111) (flovilmart)
-* Improvement: Make ParseServer a class [\#980](https://github.com/ParsePlatform/parse-server/pull/980) (flovilmart)
-* Fix: Adds support for plain object in $add, $addUnique, $remove [\#1114](https://github.com/ParsePlatform/parse-server/pull/1114) (flovilmart)
-* Fix: Generates default CLP, freezes objects [\#1132](https://github.com/ParsePlatform/parse-server/pull/1132) (flovilmart)
-* Fix: Properly sets installationId on creating session with 3rd party auth [\#1110](https://github.com/ParsePlatform/parse-server/pull/1110) (flovilmart)
-
-### 2.2.0
-
-* New Feature: Real-time functionality with Live Queries! [\#1092](https://github.com/ParsePlatform/parse-server/pull/1092) (wangmengyan95)
-* Improvement: Push Status API [\#1004](https://github.com/ParsePlatform/parse-server/pull/1004) (flovilmart)
-* Improvement: Allow client operations on Roles [\#1068](https://github.com/ParsePlatform/parse-server/pull/1068) (flovilmart)
-* Improvement: Add URI encoding to mongo auth parameters [\#986](https://github.com/ParsePlatform/parse-server/pull/986) (bgw)
-* Improvement: Adds support for apps key in config file, but only support single app for now [\#979](https://github.com/ParsePlatform/parse-server/pull/979) (flovilmart)
-* Documentation: Getting Started and Configuring Parse Server [\#988](https://github.com/ParsePlatform/parse-server/pull/988) (hramos)
-* Fix: Various edge cases with REST API [\#1066](https://github.com/ParsePlatform/parse-server/pull/1066) (flovilmart)
-* Fix: Makes sure the location in results has the proper objectId [\#1065](https://github.com/ParsePlatform/parse-server/pull/1065) (flovilmart)
-* Fix: Third-party auth is properly removed when unlinked [\#1081](https://github.com/ParsePlatform/parse-server/pull/1081) (flovilmart)
-* Fix: Clear the session-user cache when changing \_User objects [\#1072](https://github.com/ParsePlatform/parse-server/pull/1072) (gfosco)
-* Fix: Bug related to subqueries on unfetched objects [\#1046](https://github.com/ParsePlatform/parse-server/pull/1046) (flovilmart)
-* Fix: Properly urlencode parameters for email validation and password reset [\#1001](https://github.com/ParsePlatform/parse-server/pull/1001) (flovilmart)
-* Fix: Better sanitization/decoding of object data for afterSave triggers [\#992](https://github.com/ParsePlatform/parse-server/pull/992) (flovilmart)
-* Fix: Changes default encoding for httpRequest [\#892](https://github.com/ParsePlatform/parse-server/pull/892) (flovilmart)
-
-### 2.1.6
-
-* Improvement: Full query support for badge Increment \(\#931\) [\#983](https://github.com/ParsePlatform/parse-server/pull/983) (flovilmart)
-* Improvement: Shutdown standalone parse server gracefully [\#958](https://github.com/ParsePlatform/parse-server/pull/958) (raulr)
-* Improvement: Add database options to ParseServer constructor and pass to MongoStorageAdapter [\#956](https://github.com/ParsePlatform/parse-server/pull/956) (steven-supersolid)
-* Improvement: AuthData logic refactor [\#952](https://github.com/ParsePlatform/parse-server/pull/952) (flovilmart)
-* Improvement: Changed FileLoggerAdapterSpec to fail gracefully on Windows [\#946](https://github.com/ParsePlatform/parse-server/pull/946) (aneeshd16)
-* Improvement: Add new schema collection type and replace all usages of direct mongo collection for schema operations. [\#943](https://github.com/ParsePlatform/parse-server/pull/943) (nlutsenko)
-* Improvement: Adds CLP API to Schema router [\#898](https://github.com/ParsePlatform/parse-server/pull/898) (flovilmart)
-* Fix: Cleans up authData null keys on login for android crash [\#978](https://github.com/ParsePlatform/parse-server/pull/978) (flovilmart)
-* Fix: Do master query for before/afterSaveHook [\#959](https://github.com/ParsePlatform/parse-server/pull/959) (wangmengyan95)
-* Fix: re-add shebang [\#944](https://github.com/ParsePlatform/parse-server/pull/944) (flovilmart)
-* Fix: Added test command for Windows support [\#886](https://github.com/ParsePlatform/parse-server/pull/886) (aneeshd16)
-
-### 2.1.5
-
-* New: FileAdapter for Google Cloud Storage [\#708](https://github.com/ParsePlatform/parse-server/pull/708) (mcdonamp)
-* Improvement: Minimize extra schema queries in some scenarios. [\#919](https://github.com/ParsePlatform/parse-server/pull/919) (Marco129)
-* Improvement: Move DatabaseController and Schema fully to adaptive mongo collection. [\#909](https://github.com/ParsePlatform/parse-server/pull/909) (nlutsenko)
-* Improvement: Cleanup PushController/PushRouter, remove raw mongo collection access. [\#903](https://github.com/ParsePlatform/parse-server/pull/903) (nlutsenko)
-* Improvement: Increment badge the right way [\#902](https://github.com/ParsePlatform/parse-server/pull/902) (flovilmart)
-* Improvement: Migrate ParseGlobalConfig to new database storage API. [\#901](https://github.com/ParsePlatform/parse-server/pull/901) (nlutsenko)
-* Improvement: Improve delete flow for non-existent \_Join collection [\#881](https://github.com/ParsePlatform/parse-server/pull/881) (Marco129)
-* Improvement: Adding a role scenario test for issue 827 [\#878](https://github.com/ParsePlatform/parse-server/pull/878) (gfosco)
-* Improvement: Test empty authData block on login for \#413 [\#863](https://github.com/ParsePlatform/parse-server/pull/863) (gfosco)
-* Improvement: Modified the npm dev script to support Windows [\#846](https://github.com/ParsePlatform/parse-server/pull/846) (aneeshd16)
-* Improvement: Move HooksController to use MongoCollection instead of direct Mongo access. [\#844](https://github.com/ParsePlatform/parse-server/pull/844) (nlutsenko)
-* Improvement: Adds public\_html and views for packaging [\#839](https://github.com/ParsePlatform/parse-server/pull/839) (flovilmart)
-* Improvement: Better support for windows builds [\#831](https://github.com/ParsePlatform/parse-server/pull/831) (flovilmart)
-* Improvement: Convert Schema.js to ES6 class. [\#826](https://github.com/ParsePlatform/parse-server/pull/826) (nlutsenko)
-* Improvement: Remove duplicated instructions [\#816](https://github.com/ParsePlatform/parse-server/pull/816) (hramos)
-* Improvement: Completely migrate SchemasRouter to new MongoCollection API. [\#794](https://github.com/ParsePlatform/parse-server/pull/794) (nlutsenko)
-* Fix: Do not require where clause in $dontSelect condition on queries. [\#925](https://github.com/ParsePlatform/parse-server/pull/925) (nlutsenko)
-* Fix: Make sure that ACLs propagate to before/after save hooks. [\#924](https://github.com/ParsePlatform/parse-server/pull/924) (nlutsenko)
-* Fix: Support params option in Parse.Cloud.httpRequest. [\#912](https://github.com/ParsePlatform/parse-server/pull/912) (carmenlau)
-* Fix: Fix flaky Parse.GeoPoint test. [\#908](https://github.com/ParsePlatform/parse-server/pull/908) (nlutsenko)
-* Fix: Handle legacy \_client\_permissions key in \_SCHEMA. [\#900](https://github.com/ParsePlatform/parse-server/pull/900) (drew-gross)
-* Fix: Fixes bug when querying equalTo on objectId and relation [\#887](https://github.com/ParsePlatform/parse-server/pull/887) (flovilmart)
-* Fix: Allow crossdomain on filesRouter [\#876](https://github.com/ParsePlatform/parse-server/pull/876) (flovilmart)
-* Fix: Remove limit when counting results. [\#867](https://github.com/ParsePlatform/parse-server/pull/867) (gfosco)
-* Fix: beforeSave changes should propagate to the response [\#865](https://github.com/ParsePlatform/parse-server/pull/865) (gfosco)
-* Fix: Delete relation field when \_Join collection not exist [\#864](https://github.com/ParsePlatform/parse-server/pull/864) (Marco129)
-* Fix: Related query on non-existing column [\#861](https://github.com/ParsePlatform/parse-server/pull/861) (gfosco)
-* Fix: Update markdown in .github/ISSUE\_TEMPLATE.md [\#859](https://github.com/ParsePlatform/parse-server/pull/859) (igorshubovych)
-* Fix: Issue with creating wrong \_Session for Facebook login [\#857](https://github.com/ParsePlatform/parse-server/pull/857) (tobernguyen)
-* Fix: Leak warnings in tests, use mongodb-runner from node\_modules [\#843](https://github.com/ParsePlatform/parse-server/pull/843) (drew-gross)
-* Fix: Reversed roles lookup [\#841](https://github.com/ParsePlatform/parse-server/pull/841) (flovilmart)
-* Fix: Improves loading of Push Adapter, fix loading of S3Adapter [\#833](https://github.com/ParsePlatform/parse-server/pull/833) (flovilmart)
-* Fix: Add field to system schema [\#828](https://github.com/ParsePlatform/parse-server/pull/828) (Marco129)
-
-### 2.1.4
-
-* New: serverInfo endpoint that returns server version and info about the server's features
-* Improvement: Add support for badges on iOS
-* Improvement: Improve failure handling in cloud code http requests
-* Improvement: Add support for queries on pointers and relations
-* Improvement: Add support for multiple $in clauses in a query
-* Improvement: Add allowClientClassCreation config option
-* Improvement: Allow atomically setting subdocument keys
-* Improvement: Allow arbitrarily deeply nested roles
-* Improvement: Set proper content-type in S3 File Adapter
-* Improvement: S3 adapter auto-creates buckets
-* Improvement: Better error messages for many errors
-* Performance: Improved algorithm for validating client keys
-* Experimental: Parse Hooks and Hooks API
-* Experimental: Email verification and password reset emails
-* Experimental: Improve compatability of logs feature with Parse.com
-* Fix: Fix for attempting to delete missing classes via schemas API
-* Fix: Allow creation of system classes via schemas API
-* Fix: Allow missing where cause in $select
-* Fix: Improve handling of invalid object ids
-* Fix: Replace query overwriting existing query
-* Fix: Propagate installationId in cloud code triggers
-* Fix: Session expiresAt is now a Date instead of a string
-* Fix: Fix count queries
-* Fix: Disallow _Role objects without names or without ACL
-* Fix: Better handling of invalid types submitted
-* Fix: beforeSave will not be triggered for attempts to save with invalid authData
-* Fix: Fix duplicate device token issues on Android
-* Fix: Allow empty authData on signup
-* Fix: Allow Master Key Headers (CORS)
-* Fix: Fix bugs if JavaScript key was not provided in server configuration
-* Fix: Parse Files on objects can now be stored without URLs
-* Fix: allow both objectId or installationId when modifying installation
-* Fix: Command line works better when not given options
-
-### 2.1.3
-
-* Feature: Add initial support for in-app purchases
-* Feature: Better error messages when attempting to run the server on a port that is already in use or without a server URL
-* Feature: Allow customization of max file size
-* Performance: Faster saves if not using beforeSave triggers
-* Fix: Send session token in response to current user endpoint
-* Fix: Remove triggers for _Session collection
-* Fix: Improve compatability of cloud code beforeSave hook for newly created object
-* Fix: ACL creation for master key only objects
-* Fix: Allow uploading files without Content-Type
-* Fix: Add features to http request to match Parse.com
-* Fix: Bugs in development script when running from locations other than project root
-* Fix: Can pass query constraints in URL
-* Fix: Objects with legacy "_tombstone" key now don't cause issues.
-* Fix: Allow nested keys in objects to begin with underscores
-* Fix: Allow correct headers for CORS
-
-### 2.1.2
-
-* Change: The S3 file adapter constructor requires a bucket name
-* Fix: Parse Query should throw if improperly encoded
-* Fix: Issue where roles were not used in some requests
-* Fix: serverURL will no longer default to api.parse.com/1
-
-### 2.1.1
-
-* Experimental: Schemas API support for DELETE operations
-* Fix: Session token issue fetching Users
-* Fix: Facebook auth validation
-* Fix: Invalid error when deleting missing session
-
-### 2.1.0
-
-* Feature: Support for additional OAuth providers
-* Feature: Ability to implement custom OAuth providers
-* Feature: Support for deleting Parse Files
-* Feature: Allow querying roles
-* Feature: Support for logs, extensible via Log Adapter
-* Feature: New Push Adapter for sending push notifications through OneSignal
-* Feature: Tighter default security for Users
-* Feature: Pass parameters to cloud code in query string
-* Feature: Disable anonymous users via configuration.
-* Experimental: Schemas API support for PUT operations
-* Fix: Prevent installation ID from being added to User
-* Fix: Becoming a user works properly with sessions
-* Fix: Including multiple object when some object are unavailable will get all the objects that are available
-* Fix: Invalid URL for Parse Files
-* Fix: Making a query without a limit now returns 100 results
-* Fix: Expose installation id in cloud code
-* Fix: Correct username for Anonymous users
-* Fix: Session token issue after fetching user
-* Fix: Issues during install process
-* Fix: Issue with Unity SDK sending _noBody
-
-### 2.0.8
-
-* Add: support for Android and iOS push notifications
-* Experimental: cloud code validation hooks (can mark as non-experimental after we have docs)
-* Experimental: support for schemas API (GET and POST only)
-* Experimental: support for Parse Config (GET and POST only)
-* Fix: Querying objects with equality constraint on array column
-* Fix: User logout will remove session token
-* Fix: Various files related bugs
-* Fix: Force minimum node version 4.3 due to security issues in earlier version
-* Performance Improvement: Improved caching
+[log_release]: https://github.com/parse-community/parse-server/blob/release/changelogs/CHANGELOG_release.md
+[log_beta]: https://github.com/parse-community/parse-server/blob/beta/changelogs/CHANGELOG_beta.md
+[log_alpha]: https://github.com/parse-community/parse-server/blob/alpha/changelogs/CHANGELOG_alpha.md
+[branch_release]: https://github.com/parse-community/parse-server/tree/release
+[branch_beta]: https://github.com/parse-community/parse-server/tree/beta
+[branch_alpha]: https://github.com/parse-community/parse-server/tree/alpha
diff --git a/README.md b/README.md
index c5338b3435..b46205486f 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,7 @@
[![Node Version](https://img.shields.io/badge/nodejs-12,_14,_15-green.svg?logo=node.js&style=flat)](https://nodejs.org)
[![MongoDB Version](https://img.shields.io/badge/mongodb-4.0,_4.2,_4.4,_5.0-green.svg?logo=mongodb&style=flat)](https://www.mongodb.com)
[![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
+[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)
[![npm latest version](https://img.shields.io/npm/v/parse-server/latest.svg)](https://www.npmjs.com/package/parse-server)
[![npm alpha version](https://img.shields.io/npm/v/parse-server/alpha.svg)](https://www.npmjs.com/package/parse-server)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
new file mode 100644
index 0000000000..61682908f2
--- /dev/null
+++ b/changelogs/CHANGELOG_alpha.md
@@ -0,0 +1,67 @@
+# [5.0.0-alpha.1](https://github.com/parse-community/parse-server/compare/4.10.4...5.0.0-alpha.1) (2021-10-12)
+
+## Breaking Changes
+- Improved schema caching through database real-time hooks. Reduces DB queries, decreases Parse Query execution time and fixes a potential schema memory leak. If multiple Parse Server instances connect to the same DB (for example behind a load balancer), set the [Parse Server Option](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) `databaseOptions.enableSchemaHooks: true` to enable this feature and keep the schema in sync across all instances. Failing to do so will cause a schema change to not propagate to other instances and re-syncing will only happen when these instances restart. The options `enableSingleSchemaCache` and `schemaCacheTTL` have been removed. To use this feature with MongoDB, a replica set cluster with [change stream](https://docs.mongodb.com/manual/changeStreams/#availability) support is required. (Diamond Lewis, SebC) [#7214](https://github.com/parse-community/parse-server/issues/7214)
+- Added file upload restriction. File upload is now only allowed for authenticated users by default for improved security. To allow file upload also for Anonymous Users or Public, set the `fileUpload` parameter in the [Parse Server Options](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) (dblythy, Manuel Trezza) [#7071](https://github.com/parse-community/parse-server/pull/7071)
+- Removed [parse-server-simple-mailgun-adapter](https://github.com/parse-community/parse-server-simple-mailgun-adapter) dependency; to continue using the adapter it has to be explicitly installed (Manuel Trezza) [#7321](https://github.com/parse-community/parse-server/pull/7321)
+- Remove support for MongoDB 3.6 which has reached its End-of-Life date and PostgreSQL 10 (Manuel Trezza) [#7315](https://github.com/parse-community/parse-server/pull/7315)
+- Remove support for Node 10 which has reached its End-of-Life date (Manuel Trezza) [#7314](https://github.com/parse-community/parse-server/pull/7314)
+- Remove S3 Files Adapter from Parse Server, instead install separately as `@parse/s3-files-adapter` (Manuel Trezza) [#7324](https://github.com/parse-community/parse-server/pull/7324)
+- Remove Session field `restricted`; the field was a code artifact from a feature that never existed in Open Source Parse Server; if you have been using this field for custom purposes, consider that for new Parse Server installations the field does not exist anymore in the schema, and for existing installations the field default value `false` will not be set anymore when creating a new session (Manuel Trezza) [#7543](https://github.com/parse-community/parse-server/pull/7543)
+- ci: add node engine version check (Manuel Trezza) [#7574](https://github.com/parse-community/parse-server/pull/7574)
+
+## Notable Changes
+- Alphabetical ordered GraphQL API, improved GraphQL Schema cache system and fix GraphQL input reassign issue (Moumouls) [#7344](https://github.com/parse-community/parse-server/issues/7344)
+- Added Parse Server Security Check to report weak security settings (Manuel Trezza, dblythy) [#7247](https://github.com/parse-community/parse-server/issues/7247)
+- EXPERIMENTAL: Added new page router with placeholder rendering and localization of custom and feature pages such as password reset and email verification (Manuel Trezza) [#7128](https://github.com/parse-community/parse-server/pull/7128)
+- EXPERIMENTAL: Added custom routes to easily customize flows for password reset, email verification or build entirely new flows (Manuel Trezza) [#7231](https://github.com/parse-community/parse-server/pull/7231)
+- Added Deprecation Policy to govern the introduction of breaking changes in a phased pattern that is more predictable for developers (Manuel Trezza) [#7199](https://github.com/parse-community/parse-server/pull/7199)
+- Add REST API endpoint `/loginAs` to create session of any user with master key; allows to impersonate another user. (GormanFletcher) [#7406](https://github.com/parse-community/parse-server/pull/7406)
+- Add official support for MongoDB 5.0 (Manuel Trezza) [#7469](https://github.com/parse-community/parse-server/pull/7469)
+- Added Parse Server Configuration `enforcePrivateUsers`, which will remove public access by default on new Parse.Users (dblythy) [#7319](https://github.com/parse-community/parse-server/pull/7319)
+
+## Other Changes
+- Support native mongodb syntax in aggregation pipelines (Raschid JF Rafeally) [#7339](https://github.com/parse-community/parse-server/pull/7339)
+- Fix error when a not yet inserted job is updated (Antonio Davi Macedo Coelho de Castro) [#7196](https://github.com/parse-community/parse-server/pull/7196)
+- request.context for afterFind triggers (dblythy) [#7078](https://github.com/parse-community/parse-server/pull/7078)
+- Winston Logger interpolating stdout to console (dplewis) [#7114](https://github.com/parse-community/parse-server/pull/7114)
+- Added convenience method `Parse.Cloud.sendEmail(...)` to send email via email adapter in Cloud Code (dblythy) [#7089](https://github.com/parse-community/parse-server/pull/7089)
+- LiveQuery support for $and, $nor, $containedBy, $geoWithin, $geoIntersects queries (dplewis) [#7113](https://github.com/parse-community/parse-server/pull/7113)
+- Supporting patterns in LiveQuery server's config parameter `classNames` (Nes-si) [#7131](https://github.com/parse-community/parse-server/pull/7131)
+- Added `requireAnyUserRoles` and `requireAllUserRoles` for Parse Cloud validator (dblythy) [#7097](https://github.com/parse-community/parse-server/pull/7097)
+- Support Facebook Limited Login (miguel-s) [#7219](https://github.com/parse-community/parse-server/pull/7219)
+- Removed Stage name check on aggregate pipelines (BRETT71) [#7237](https://github.com/parse-community/parse-server/pull/7237)
+- Retry transactions on MongoDB when it fails due to transient error (Antonio Davi Macedo Coelho de Castro) [#7187](https://github.com/parse-community/parse-server/pull/7187)
+- Bump tests to use Mongo 4.4.4 (Antonio Davi Macedo Coelho de Castro) [#7184](https://github.com/parse-community/parse-server/pull/7184)
+- Added new account lockout policy option `accountLockout.unlockOnPasswordReset` to automatically unlock account on password reset (Manuel Trezza) [#7146](https://github.com/parse-community/parse-server/pull/7146)
+- Test Parse Server continuously against all recent MongoDB versions that have not reached their end-of-life support date, added MongoDB compatibility table to Parse Server docs (Manuel Trezza) [#7161](https://github.com/parse-community/parse-server/pull/7161)
+- Test Parse Server continuously against all recent Node.js versions that have not reached their end-of-life support date, added Node.js compatibility table to Parse Server docs (Manuel Trezza) [7161](https://github.com/parse-community/parse-server/pull/7177)
+- Throw error on invalid Cloud Function validation configuration (dblythy) [#7154](https://github.com/parse-community/parse-server/pull/7154)
+- Allow Cloud Validator `options` to be async (dblythy) [#7155](https://github.com/parse-community/parse-server/pull/7155)
+- Optimize queries on classes with pointer permissions (Pedro Diaz) [#7061](https://github.com/parse-community/parse-server/pull/7061)
+- Test Parse Server continuously against all relevant Postgres versions (minor versions), added Postgres compatibility table to Parse Server docs (Corey Baker) [#7176](https://github.com/parse-community/parse-server/pull/7176)
+- Randomize test suite (Diamond Lewis) [#7265](https://github.com/parse-community/parse-server/pull/7265)
+- LDAP: Properly unbind client on group search error (Diamond Lewis) [#7265](https://github.com/parse-community/parse-server/pull/7265)
+- Improve data consistency in Push and Job Status update (Diamond Lewis) [#7267](https://github.com/parse-community/parse-server/pull/7267)
+- Excluding keys that have trailing edges.node when performing GraphQL resolver (Chris Bland) [#7273](https://github.com/parse-community/parse-server/pull/7273)
+- Added centralized feature deprecation with standardized warning logs (Manuel Trezza) [#7303](https://github.com/parse-community/parse-server/pull/7303)
+- Use Node.js 15.13.0 in CI (Olle Jonsson) [#7312](https://github.com/parse-community/parse-server/pull/7312)
+- Fix file upload issue for S3 compatible storage (Linode, DigitalOcean) by avoiding empty tags property when creating a file (Ali Oguzhan Yildiz) [#7300](https://github.com/parse-community/parse-server/pull/7300)
+- Add building Docker image as CI check (Manuel Trezza) [#7332](https://github.com/parse-community/parse-server/pull/7332)
+- Add NPM package-lock version check to CI (Manuel Trezza) [#7333](https://github.com/parse-community/parse-server/pull/7333)
+- Fix incorrect LiveQuery events triggered for multiple subscriptions on the same class with different events [#7341](https://github.com/parse-community/parse-server/pull/7341)
+- Fix select and excludeKey queries to properly accept JSON string arrays. Also allow nested fields in exclude (Corey Baker) [#7242](https://github.com/parse-community/parse-server/pull/7242)
+- Fix LiveQuery server crash when using $all query operator on a missing object key (Jason Posthuma) [#7421](https://github.com/parse-community/parse-server/pull/7421)
+- Added runtime deprecation warnings (Manuel Trezza) [#7451](https://github.com/parse-community/parse-server/pull/7451)
+- Add ability to pass context of an object via a header, X-Parse-Cloud-Context, for Cloud Code triggers. The header addition allows client SDK's to add context without injecting _context in the body of JSON objects (Corey Baker) [#7437](https://github.com/parse-community/parse-server/pull/7437)
+- Add CI check to add changelog entry (Manuel Trezza) [#7512](https://github.com/parse-community/parse-server/pull/7512)
+- Refactor: uniform issue templates across repos (Manuel Trezza) [#7528](https://github.com/parse-community/parse-server/pull/7528)
+- ci: bump ci environment (Manuel Trezza) [#7539](https://github.com/parse-community/parse-server/pull/7539)
+- CI now pushes docker images to Docker Hub (Corey Baker) [#7548](https://github.com/parse-community/parse-server/pull/7548)
+- Allow afterFind and afterLiveQueryEvent to set unsaved pointers and keys (dblythy) [#7310](https://github.com/parse-community/parse-server/pull/7310)
+- Allow setting descending sort to full text queries (dblythy) [#7496](https://github.com/parse-community/parse-server/pull/7496)
+- Allow cloud string for ES modules (Daniel Blyth) [#7560](https://github.com/parse-community/parse-server/pull/7560)
+- docs: Introduce deprecation ID for reference in comments and online search (Manuel Trezza) [#7562](https://github.com/parse-community/parse-server/pull/7562)
+- refactor: deprecate `Parse.Cloud.httpRequest`; it is recommended to use a HTTP library instead. (Daniel Blyth) [#7595](https://github.com/parse-community/parse-server/pull/7595)
+- refactor: Modernize HTTPRequest tests (brandongregoryscott) [#7604](https://github.com/parse-community/parse-server/pull/7604)
+- Allow liveQuery on Session class (Daniel Blyth) [#7554](https://github.com/parse-community/parse-server/pull/7554)
diff --git a/changelogs/CHANGELOG_release.md b/changelogs/CHANGELOG_release.md
new file mode 100644
index 0000000000..188967473e
--- /dev/null
+++ b/changelogs/CHANGELOG_release.md
@@ -0,0 +1,1709 @@
+# [4.10.4](https://github.com/parse-community/parse-server/compare/4.10.3...4.10.4)
+
+### Security Fixes
+- Strip out sessionToken when LiveQuery is used on Parse.User (Daniel Blyth) [GHSA-7pr3-p5fm-8r9x](https://github.com/parse-community/parse-server/security/advisories/GHSA-7pr3-p5fm-8r9x)
+
+# [4.10.3](https://github.com/parse-community/parse-server/compare/4.10.2...4.10.3)
+
+### Security Fixes
+- Validate `explain` query parameter to avoid a server crash due to MongoDB bug [NODE-3463](https://jira.mongodb.org/browse/NODE-3463) (Kartal Kaan Bozdogan) [GHSA-xqp8-w826-hh6x](https://github.com/parse-community/parse-server/security/advisories/GHSA-xqp8-w826-hh6x)
+
+# [4.10.2](https://github.com/parse-community/parse-server/compare/4.10.1...4.10.2)
+
+### Other Changes
+- Move graphql-tag from devDependencies to dependencies (Antonio Davi Macedo Coelho de Castro) [#7183](https://github.com/parse-community/parse-server/pull/7183)
+
+# [4.10.1](https://github.com/parse-community/parse-server/compare/4.10.0...4.10.1)
+
+### Security Fixes
+- Updated to Parse JS SDK 3.3.0 and other security fixes (Manuel Trezza) [#7508](https://github.com/parse-community/parse-server/pull/7508)
+
+> ⚠️ This includes a security fix of the Parse JS SDK where `logIn` will default to `POST` instead of `GET` method. This may require changes in your deployment before you upgrade to this release, see the Parse JS SDK 3.0.0 [release notes](https://github.com/parse-community/Parse-SDK-JS/releases/tag/3.0.0).
+
+# [4.10.0](https://github.com/parse-community/parse-server/compare/4.5.2...4.10.0)
+
+*Versions >4.5.2 and <4.10.0 are skipped.*
+
+> ⚠️ A security incident caused a number of incorrect version tags to be pushed to the Parse Server repository. These version tags linked to a personal fork of a contributor who had write access to the repository. The code to which these tags linked has not been reviewed or approved by Parse Platform. Even though no releases were published with these incorrect versions, it was possible to define a Parse Server dependency that pointed to these version tags, for example if you defined this dependency:
+> ```js
+> "parse-server": "git@github.com:parse-community/parse-server.git#4.9.3"
+> ```
+>
+> We have since deleted the incorrect version tags, but they may still show up if your personal fork on GitHub or locally. We do not know when these tags have been pushed to the Parse Server repository, but we first became aware of this issue on July 21, 2021. We are not aware of any malicious code or concerns related to privacy, security or legality (e.g. proprietary code). However, it has been reported that some functionality does not work as expected and the introduction of security vulnerabilities cannot be ruled out.
+>
+> You may be also affected if you used the Bitnami image for Parse Server. Bitnami picked up the incorrect version tag `4.9.3` and published a new Bitnami image for Parse Server.
+>
+>**If you are using any of the affected versions, we urgently recommend to upgrade to version `4.10.0`.**
+
+# [4.5.2](https://github.com/parse-community/parse-server/compare/4.5.0...4.5.2)
+
+#### Security Fixes
+- SECURITY FIX: Fixes incorrect session property `authProvider: password` of anonymous users. When signing up an anonymous user, the session field `createdWith` indicates incorrectly that the session has been created using username and password with `authProvider: password`, instead of an anonymous sign-up with `authProvider: anonymous`. This fixes the issue by setting the correct `authProvider: anonymous` for future sign-ups of anonymous users. This fix does not fix incorrect `authProvider: password` for existing sessions of anonymous users. Consider this if your app logic depends on the `authProvider` field. (Corey Baker) [GHSA-23r4-5mxp-c7g5](https://github.com/parse-community/parse-server/security/advisories/GHSA-23r4-5mxp-c7g5)
+
+# 4.5.1
+*This version was published by mistake and has been removed.*
+
+# [4.5.0](https://github.com/parse-community/parse-server/compare/4.4.0...4.5.0)
+### Breaking Changes
+- FIX: Consistent casing for afterLiveQueryEvent. The afterLiveQueryEvent was introduced in 4.4.0 with inconsistent casing for the event names, which was fixed in 4.5.0. [#7023](https://github.com/parse-community/parse-server/pull/7023). Thanks to [dblythy](https://github.com/dblythy).
+### Other Changes
+- FIX: Properly handle serverURL and publicServerUrl in Batch requests. [#7049](https://github.com/parse-community/parse-server/pull/7049). Thanks to [Zach Goldberg](https://github.com/ZachGoldberg).
+- IMPROVE: Prevent invalid column names (className and length). [#7053](https://github.com/parse-community/parse-server/pull/7053). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- IMPROVE: GraphQL: Remove viewer from logout mutation. [#7029](https://github.com/parse-community/parse-server/pull/7029). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- IMPROVE: GraphQL: Optimize on Relation. [#7044](https://github.com/parse-community/parse-server/pull/7044). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- NEW: Include sessionToken in onLiveQueryEvent. [#7043](https://github.com/parse-community/parse-server/pull/7043). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: Definitions for accountLockout and passwordPolicy. [#7040](https://github.com/parse-community/parse-server/pull/7040). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: Fix typo in server definitions for emailVerifyTokenReuseIfValid. [#7037](https://github.com/parse-community/parse-server/pull/7037). Thanks to [dblythy](https://github.com/dblythy).
+- SECURITY FIX: LDAP auth stores password in plain text. See [GHSA-4w46-w44m-3jq3](https://github.com/parse-community/parse-server/security/advisories/GHSA-4w46-w44m-3jq3) for more details about the vulnerability and [da905a3](https://github.com/parse-community/parse-server/commit/da905a357d062ab4fea727a21eac231acc2ed92a) for the fix. Thanks to [Fabian Strachanski](https://github.com/fastrde).
+- NEW: Reuse tokens if they haven't expired. [#7017](https://github.com/parse-community/parse-server/pull/7017). Thanks to [dblythy](https://github.com/dblythy).
+- NEW: Add LDAPS-support to LDAP-Authcontroller. [#7014](https://github.com/parse-community/parse-server/pull/7014). Thanks to [Fabian Strachanski](https://github.com/fastrde).
+- FIX: (beforeSave/afterSave): Return value instead of Parse.Op for nested fields. [#7005](https://github.com/parse-community/parse-server/pull/7005). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- FIX: (beforeSave): Skip Sanitizing Database results. [#7003](https://github.com/parse-community/parse-server/pull/7003). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- FIX: Fix includeAll for querying a Pointer and Pointer array. [#7002](https://github.com/parse-community/parse-server/pull/7002). Thanks to [Corey Baker](https://github.com/cbaker6).
+- FIX: Add encryptionKey to src/options/index.js. [#6999](https://github.com/parse-community/parse-server/pull/6999). Thanks to [dblythy](https://github.com/dblythy).
+- IMPROVE: Update PostgresStorageAdapter.js. [#6989](https://github.com/parse-community/parse-server/pull/6989). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t).
+
+# [4.4.0](https://github.com/parse-community/parse-server/compare/4.3.0...4.4.0)
+- IMPROVE: Update PostgresStorageAdapter.js. [#6981](https://github.com/parse-community/parse-server/pull/6981). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
+- NEW: skipWithMasterKey on Built-In Validator. [#6972](https://github.com/parse-community/parse-server/issues/6972). Thanks to [dblythy](https://github.com/dblythy).
+- NEW: Add fileKey rotation to GridFSBucketAdapter. [#6768](https://github.com/parse-community/parse-server/pull/6768). Thanks to [Corey Baker](https://github.com/cbaker6).
+- IMPROVE: Remove unused parameter in Cloud Function. [#6969](https://github.com/parse-community/parse-server/issues/6969). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- IMPROVE: Validation Handler Update. [#6968](https://github.com/parse-community/parse-server/issues/6968). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: (directAccess): Properly handle response status. [#6966](https://github.com/parse-community/parse-server/issues/6966). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- FIX: Remove hostnameMaxLen for Mongo URL. [#6693](https://github.com/parse-community/parse-server/issues/6693). Thanks to [markhoward02](https://github.com/markhoward02).
+- IMPROVE: Show a message if cloud functions are duplicated. [#6963](https://github.com/parse-community/parse-server/issues/6963). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: Pass request.query to afterFind. [#6960](https://github.com/parse-community/parse-server/issues/6960). Thanks to [dblythy](https://github.com/dblythy).
+- SECURITY FIX: Patch session vulnerability over Live Query. See [GHSA-2xm2-xj2q-qgpj](https://github.com/parse-community/parse-server/security/advisories/GHSA-2xm2-xj2q-qgpj) for more details about the vulnerability and [78b59fb](https://github.com/parse-community/parse-server/commit/78b59fb26b1c36e3cdbd42ba9fec025003267f58) for the fix. Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo).
+- IMPROVE: LiveQueryEvent Error Logging Improvements. [#6951](https://github.com/parse-community/parse-server/issues/6951). Thanks to [dblythy](https://github.com/dblythy).
+- IMPROVE: Include stack in Cloud Code. [#6958](https://github.com/parse-community/parse-server/issues/6958). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: (jobs): Add Error Message to JobStatus Failure. [#6954](https://github.com/parse-community/parse-server/issues/6954). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- NEW: Create Cloud function afterLiveQueryEvent. [#6859](https://github.com/parse-community/parse-server/issues/6859). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: Update vkontakte API to the latest version. [#6944](https://github.com/parse-community/parse-server/issues/6944). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo).
+- FIX: Use an empty object as default value of options for Google Sign in. [#6844](https://github.com/parse-community/parse-server/issues/6844). Thanks to [Kevin Kuang](https://github.com/kvnkuang).
+- FIX: Postgres: prepend className to unique indexes. [#6741](https://github.com/parse-community/parse-server/pull/6741). Thanks to [Corey Baker](https://github.com/cbaker6).
+- FIX: GraphQL: Transform input types also on user mutations. [#6934](https://github.com/parse-community/parse-server/pull/6934). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Set objectId into query for Email Validation. [#6930](https://github.com/parse-community/parse-server/pull/6930). Thanks to [Danaru](https://github.com/Danaru87).
+- FIX: GraphQL: Optimize queries, fixes some null returns (on object), fix stitched GraphQLUpload. [#6709](https://github.com/parse-community/parse-server/pull/6709). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Do not throw error if user provide a pointer like index onMongo. [#6923](https://github.com/parse-community/parse-server/pull/6923). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Hotfix instagram api. [#6922](https://github.com/parse-community/parse-server/issues/6922). Thanks to [Tim](https://github.com/timination).
+- FIX: (directAccess/cloud-code): Pass installationId with LogIn. [#6903](https://github.com/parse-community/parse-server/issues/6903). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- FIX: Fix bcrypt binary incompatibility. [#6891](https://github.com/parse-community/parse-server/issues/6891). Thanks to [Manuel Trezza](https://github.com/mtrezza).
+- NEW: Keycloak auth adapter. [#6376](https://github.com/parse-community/parse-server/issues/6376). Thanks to [Rhuan](https://github.com/rhuanbarreto).
+- IMPROVE: Changed incorrect key name in apple auth adapter tests. [#6861](https://github.com/parse-community/parse-server/issues/6861). Thanks to [Manuel Trezza](https://github.com/mtrezza).
+- FIX: Fix mutating beforeSubscribe Query. [#6868](https://github.com/parse-community/parse-server/issues/6868). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: Fix beforeLogin for users logging in with AuthData. [#6872](https://github.com/parse-community/parse-server/issues/6872). Thanks to [Kevin Kuang](https://github.com/kvnkuang).
+- FIX: Remove Facebook AccountKit auth. [#6870](https://github.com/parse-community/parse-server/issues/6870). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- FIX: Updated TOKEN_ISSUER to 'accounts.google.com'. [#6836](https://github.com/parse-community/parse-server/issues/6836). Thanks to [Arjun Vedak](https://github.com/arjun3396).
+- IMPROVE: Optimized deletion of class field from schema by using an index if available to do an index scan instead of a collection scan. [#6815](https://github.com/parse-community/parse-server/issues/6815). Thanks to [Manuel Trezza](https://github.com/mtrezza).
+- IMPROVE: Enable MongoDB transaction test for MongoDB >= 4.0.4 [#6827](https://github.com/parse-community/parse-server/pull/6827). Thanks to [Manuel](https://github.com/mtrezza).
+
+# [4.3.0](https://github.com/parse-community/parse-server/compare/4.2.0...4.3.0)
+- PERFORMANCE: Optimizing pointer CLP query decoration done by DatabaseController#addPointerPermissions [#6747](https://github.com/parse-community/parse-server/pull/6747). Thanks to [mess-lelouch](https://github.com/mess-lelouch).
+- SECURITY: Fix security breach on GraphQL viewer [78239ac](https://github.com/parse-community/parse-server/commit/78239ac9071167fdf243c55ae4bc9a2c0b0d89aa), [security advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-236h-rqv8-8q73). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Save context not present if direct access enabled [#6764](https://github.com/parse-community/parse-server/pull/6764). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani).
+- NEW: Before Connect + Before Subscribe [#6793](https://github.com/parse-community/parse-server/pull/6793). Thanks to [dblythy](https://github.com/dblythy).
+- FIX: Add version to playground to fix CDN [#6804](https://github.com/parse-community/parse-server/pull/6804). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- NEW (EXPERIMENTAL): Idempotency enforcement for client requests. This deduplicates requests where the client intends to send one request to Parse Server but due to network issues the server receives the request multiple times. **Caution, this is an experimental feature that may not be appropriate for production.** [#6748](https://github.com/parse-community/parse-server/issues/6748). Thanks to [Manuel Trezza](https://github.com/mtrezza).
+- FIX: Add production Google Auth Adapter instead of using the development url [#6734](https://github.com/parse-community/parse-server/pull/6734). Thanks to [SebC.](https://github.com/SebC99).
+- IMPROVE: Run Prettier JS Again Without requiring () on arrow functions [#6796](https://github.com/parse-community/parse-server/pull/6796). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- IMPROVE: Run Prettier JS [#6795](https://github.com/parse-community/parse-server/pull/6795). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- IMPROVE: Replace bcrypt with @node-rs/bcrypt [#6794](https://github.com/parse-community/parse-server/pull/6794). Thanks to [LongYinan](https://github.com/Brooooooklyn).
+- IMPROVE: Make clear description of anonymous user [#6655](https://github.com/parse-community/parse-server/pull/6655). Thanks to [Jerome De Leon](https://github.com/JeromeDeLeon).
+- IMPROVE: Simplify GraphQL merge system to avoid js ref bugs [#6791](https://github.com/parse-community/parse-server/pull/6791). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- NEW: Pass context in beforeDelete, afterDelete, beforeFind and Parse.Cloud.run [#6666](https://github.com/parse-community/parse-server/pull/6666). Thanks to [yog27ray](https://github.com/yog27ray).
+- NEW: Allow passing custom gql schema function to ParseServer#start options [#6762](https://github.com/parse-community/parse-server/pull/6762). Thanks to [Luca](https://github.com/lucatk).
+- NEW: Allow custom cors origin header [#6772](https://github.com/parse-community/parse-server/pull/6772). Thanks to [Kevin Yao](https://github.com/kzmeyao).
+- FIX: Fix context for cascade-saving and saving existing object [#6735](https://github.com/parse-community/parse-server/pull/6735). Thanks to [Manuel](https://github.com/mtrezza).
+- NEW: Add file bucket encryption using fileKey [#6765](https://github.com/parse-community/parse-server/pull/6765). Thanks to [Corey Baker](https://github.com/cbaker6).
+- FIX: Removed gaze from dev dependencies and removed not working dev script [#6745](https://github.com/parse-community/parse-server/pull/6745). Thanks to [Vincent Semrau](https://github.com/vince1995).
+- IMPROVE: Upgrade graphql-tools to v6 [#6701](https://github.com/parse-community/parse-server/pull/6701). Thanks to [Yaacov Rydzinski](https://github.com/yaacovCR).
+- NEW: Support Metadata in GridFSAdapter [#6660](https://github.com/parse-community/parse-server/pull/6660). Thanks to [Diamond Lewis](https://github.com/dplewis).
+- NEW: Allow to unset file from graphql [#6651](https://github.com/parse-community/parse-server/pull/6651). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- NEW: Handle shutdown for RedisCacheAdapter [#6658](https://github.com/parse-community/parse-server/pull/6658). Thanks to [promisenxu](https://github.com/promisenxu).
+- FIX: Fix explain on user class [#6650](https://github.com/parse-community/parse-server/pull/6650). Thanks to [Manuel](https://github.com/mtrezza).
+- FIX: Fix read preference for aggregate [#6585](https://github.com/parse-community/parse-server/pull/6585). Thanks to [Manuel](https://github.com/mtrezza).
+- NEW: Add context to Parse.Object.save [#6626](https://github.com/parse-community/parse-server/pull/6626). Thanks to [Manuel](https://github.com/mtrezza).
+- NEW: Adding ssl config params to Postgres URI [#6580](https://github.com/parse-community/parse-server/pull/6580). Thanks to [Corey Baker](https://github.com/cbaker6).
+- FIX: Travis postgres update: removing unnecessary start of mongo-runner [#6594](https://github.com/parse-community/parse-server/pull/6594). Thanks to [Corey Baker](https://github.com/cbaker6).
+- FIX: ObjectId size for Pointer in Postgres [#6619](https://github.com/parse-community/parse-server/pull/6619). Thanks to [Corey Baker](https://github.com/cbaker6).
+- IMPROVE: Improve a test case [#6629](https://github.com/parse-community/parse-server/pull/6629). Thanks to [Gordon Sun](https://github.com/sunshineo).
+- NEW: Allow to resolve automatically Parse Type fields from Custom Schema [#6562](https://github.com/parse-community/parse-server/pull/6562). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Remove wrong console log in test [#6627](https://github.com/parse-community/parse-server/pull/6627). Thanks to [Gordon Sun](https://github.com/sunshineo).
+- IMPROVE: Graphql tools v5 [#6611](https://github.com/parse-community/parse-server/pull/6611). Thanks to [Yaacov Rydzinski](https://github.com/yaacovCR).
+- FIX: Catch JSON.parse and return 403 properly [#6589](https://github.com/parse-community/parse-server/pull/6589). Thanks to [Gordon Sun](https://github.com/sunshineo).
+- PERFORMANCE: Allow covering relation queries with minimal index [#6581](https://github.com/parse-community/parse-server/pull/6581). Thanks to [Noah Silas](https://github.com/noahsilas).
+- FIX: Fix Postgres group aggregation [#6522](https://github.com/parse-community/parse-server/pull/6522). Thanks to [Siddharth Ramesh](https://github.com/srameshr).
+- NEW: Allow set user mapped from JWT directly on request [#6411](https://github.com/parse-community/parse-server/pull/6411). Thanks to [Gordon Sun](https://github.com/sunshineo).
+
+# [4.2.0](https://github.com/parse-community/parse-server/compare/4.1.0...4.2.0)
+
+### Breaking Changes
+- CHANGE: The Sign-In with Apple authentication adapter parameter `client_id` has been changed to `clientId`. If using the Apple authentication adapter, this change requires to update the Parse Server configuration accordingly. See [#6523](https://github.com/parse-community/parse-server/pull/6523) for details.
+___
+- UPGRADE: Parse JS SDK to 2.12.0 [#6548](https://github.com/parse-community/parse-server/pull/6548)
+- NEW: Support Group aggregation on multiple columns for Postgres [#6483](https://github.com/parse-community/parse-server/pull/6483). Thanks to [Siddharth Ramesh](https://github.com/srameshr).
+- FIX: Improve test reliability by instructing Travis to only install one version of Postgres [#6490](https://github.com/parse-community/parse-server/pull/6490). Thanks to
+[Corey Baker](https://github.com/cbaker6).
+- FIX: Unknown type bug on overloaded types [#6494](https://github.com/parse-community/parse-server/pull/6494). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Improve reliability of 'SignIn with AppleID' [#6416](https://github.com/parse-community/parse-server/pull/6416). Thanks to [Andy King](https://github.com/andrewking0207).
+- FIX: Improve Travis reliability by separating Postgres & Mongo scripts [#6505](https://github.com/parse-community/parse-server/pull/6505). Thanks to
+[Corey Baker](https://github.com/cbaker6).
+- NEW: Apple SignIn support for multiple IDs [#6523](https://github.com/parse-community/parse-server/pull/6523). Thanks to [UnderratedDev](https://github.com/UnderratedDev).
+- NEW: Add support for new Instagram API [#6398](https://github.com/parse-community/parse-server/pull/6398). Thanks to [Maravilho Singa](https://github.com/maravilhosinga).
+- FIX: Updating Postgres/Postgis Call and Postgis to 3.0 [#6528](https://github.com/parse-community/parse-server/pull/6528). Thanks to
+[Corey Baker](https://github.com/cbaker6).
+- FIX: enableExpressErrorHandler logic [#6423](https://github.com/parse-community/parse-server/pull/6423). Thanks to [Nikolay Andryukhin](https://github.com/hybeats).
+- FIX: Change Order Enum Strategy for GraphQL [#6515](https://github.com/parse-community/parse-server/pull/6515). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Switch ACL to Relay Global Id for GraphQL [#6495](https://github.com/parse-community/parse-server/pull/6495). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Handle keys for pointer fields properly for GraphQL [#6499](https://github.com/parse-community/parse-server/pull/6499). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: GraphQL file mutation [#6507](https://github.com/parse-community/parse-server/pull/6507). Thanks to [Antoine Cormouls](https://github.com/Moumouls).
+- FIX: Aggregate geoNear with date query [#6540](https://github.com/parse-community/parse-server/pull/6540). Thanks to [Manuel](https://github.com/mtrezza).
+- NEW: Add file triggers and file meta data [#6344](https://github.com/parse-community/parse-server/pull/6344). Thanks to [stevestencil](https://github.com/stevestencil).
+- FIX: Improve local testing of postgres [#6531](https://github.com/parse-community/parse-server/pull/6531). Thanks to
+[Corey Baker](https://github.com/cbaker6).
+- NEW: Case insensitive username and email indexing and query planning for Postgres [#6506](https://github.com/parse-community/parse-server/issues/6441). Thanks to
+[Corey Baker](https://github.com/cbaker6).
+
+# [4.1.0](https://github.com/parse-community/parse-server/compare/4.0.2...4.1.0)
+
+_SECURITY RELEASE_: see [advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-h4mf-75hf-67w4) for details
+- SECURITY FIX: Patch Regex vulnerabilities. See [3a3a5ee](https://github.com/parse-community/parse-server/commit/3a3a5eee5ffa48da1352423312cb767de14de269). Special thanks to [W0lfw00d](https://github.com/W0lfw00d) for identifying and [responsibly reporting](https://github.com/parse-community/parse-server/blob/master/SECURITY.md) the vulnerability. Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo) for the speedy fix.
+
+# [4.0.2](https://github.com/parse-community/parse-server/compare/4.0.1...4.0.2)
+
+### Breaking Changes
+1. Remove Support for Mongo 3.2 & 3.4. The new minimum supported version is Mongo 3.6.
+2. Change username and email validation to be case insensitive. This change should be transparent in most use cases. The validation behavior should now behave 'as expected'. See [#5634](https://github.com/parse-community/parse-server/pull/5634) for details.
+
+> __Special Note on Upgrading to Parse Server 4.0.0 and above__
+>
+> In addition to the breaking changes noted above, [#5634](https://github.com/parse-community/parse-server/pull/5634) introduces a two new case insensitive indexes on the `User` collection. Special care should be taken when upgrading to this version to ensure that:
+>
+> 1. The new indexes can be successfully created (see issue [#6465](https://github.com/parse-community/parse-server/issues/6465) for details on a potential issue for your installation).
+>
+> 2. Care is taken ensure that there is adequate compute capacity to create the index in the background while still servicing requests.
+
+- FIX: attempt to get travis to deploy to npmjs again. See [#6475](https://github.com/parse-community/parse-server/pull/6457). Thanks to [Arthur Cinader](https://github.com/acinader).
+
+# [4.0.1](https://github.com/parse-community/parse-server/compare/4.0.0...4.0.1)
+- FIX: correct 'new' travis config to properly deploy. See [#6452](https://github.com/parse-community/parse-server/pull/6452). Thanks to [Arthur Cinader](https://github.com/acinader).
+- FIX: Better message on not allowed to protect default fields. See [#6439](https://github.com/parse-community/parse-server/pull/6439).Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
+
+# [4.0.0](https://github.com/parse-community/parse-server/compare/3.10.0...4.0.0)
+
+> __Special Note on Upgrading to Parse Server 4.0.0 and above__
+>
+> In addition to the breaking changes noted below, [#5634](https://github.com/parse-community/parse-server/pull/5634) introduces a two new case insensitive indexes on the `User` collection. Special care should be taken when upgrading to this version to ensure that:
+>
+> 1. The new indexes can be successfully created (see issue [#6465](https://github.com/parse-community/parse-server/issues/6465) for details on a potential issue for your installation).
+>
+> 2. Care is taken ensure that there is adequate compute capacity to create the index in the background while still servicing requests.
+
+- NEW: add hint option to Parse.Query [#6322](https://github.com/parse-community/parse-server/pull/6322). Thanks to [Steve Stencil](https://github.com/stevestencil)
+- FIX: CLP objectId size validation fix [#6332](https://github.com/parse-community/parse-server/pull/6332). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
+- FIX: Add volumes to Docker command [#6356](https://github.com/parse-community/parse-server/pull/6356). Thanks to [Kasra Bigdeli](https://github.com/githubsaturn)
+- NEW: GraphQL 3rd Party LoginWith Support [#6371](https://github.com/parse-community/parse-server/pull/6371). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- FIX: GraphQL Geo Queries [#6363](https://github.com/parse-community/parse-server/pull/6363). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- NEW: GraphQL Nested File Upload [#6372](https://github.com/parse-community/parse-server/pull/6372). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- NEW: Granular CLP pointer permissions [#6352](https://github.com/parse-community/parse-server/pull/6352). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
+- FIX: Add missing colon for customPages [#6393](https://github.com/parse-community/parse-server/pull/6393). Thanks to [Jerome De Leon](https://github.com/JeromeDeLeon)
+- NEW: `afterLogin` cloud code hook [#6387](https://github.com/parse-community/parse-server/pull/6387). Thanks to [David Corona](https://github.com/davesters)
+- FIX: __BREAKING CHANGE__ Prevent new usernames or emails that clash with existing users' email or username if it only differs by case. For example, don't allow a new user with the name 'Jane' if we already have a user 'jane'. [#5634](https://github.com/parse-community/parse-server/pull/5634). Thanks to [Arthur Cinader](https://github.com/acinader)
+- FIX: Support Travis CI V2. [#6414](https://github.com/parse-community/parse-server/pull/6414). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: Prevent crashing on websocket error. [#6418](https://github.com/parse-community/parse-server/pull/6418). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: Allow protectedFields for Authenticated users and Public. [$6415](https://github.com/parse-community/parse-server/pull/6415). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
+- FIX: Correct bug in determining GraphQL pointer errors when mutating. [#6413](https://github.com/parse-community/parse-server/pull/6431). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- NEW: Allow true GraphQL Schema Customization. [#6360](https://github.com/parse-community/parse-server/pull/6360). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- __BREAKING CHANGE__: Remove Support for Mongo version < 3.6 [#6445](https://github.com/parse-community/parse-server/pull/6445). Thanks to [Arthur Cinader](https://github.com/acinader)
+
+# [3.10.0](https://github.com/parse-community/parse-server/compare/3.9.0...3.10.0)
+- FIX: correct and cover ordering queries in GraphQL [#6316](https://github.com/parse-community/parse-server/pull/6316). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: GraphQL support for reset password email [#6301](https://github.com/parse-community/parse-server/pull/6301). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- FIX: Add default limit to GraphQL fetch [#6304](https://github.com/parse-community/parse-server/pull/6304). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- DOCS: use bash syntax highlighting [#6302](https://github.com/parse-community/parse-server/pull/6302). Thanks to [Jerome De Leon](https://github.com/JeromeDeLeon)
+- NEW: Add max log file option [#6296](https://github.com/parse-community/parse-server/pull/6296). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: support user supplied objectId [#6101](https://github.com/parse-community/parse-server/pull/6101). Thanks to [Ruhan](https://github.com/rhuanbarretos)
+- FIX: Add missing encodeURIComponent on username [#6278](https://github.com/parse-community/parse-server/pull/6278). Thanks to [Christopher Brookes](https://github.com/Klaitos)
+- NEW: update PostgresStorageAdapter.js to use async/await [#6275](https://github.com/parse-community/parse-server/pull/6275). Thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
+- NEW: Support required fields on output type for GraphQL [#6279](https://github.com/parse-community/parse-server/pull/6279). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- NEW: Support required fields for GraphQL [#6271](https://github.com/parse-community/parse-server/pull/6279). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- CHANGE: use mongodb 3.3.5 [#6263](https://github.com/parse-community/parse-server/pull/6263). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: GraphQL: DX Relational Where Query [#6255](https://github.com/parse-community/parse-server/pull/6255). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- CHANGE: test against Postgres 11 [#6260](https://github.com/parse-community/parse-server/pull/6260). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- CHANGE: test against Postgres 11 [#6260](https://github.com/parse-community/parse-server/pull/6260). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: GraphQL alias for mutations in classConfigs [#6258](https://github.com/parse-community/parse-server/pull/6258). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
+- NEW: GraphQL classConfig query alias [#6257](https://github.com/parse-community/parse-server/pull/6257). Thanks to [Old Grandpa](https://github.com/BufferUnderflower)
+- NEW: Allow validateFilename to return a string or Parse Error [#6246](https://github.com/parse-community/parse-server/pull/6246). Thanks to [Mike Patnode](https://github.com/mpatnode)
+- NEW: Relay Spec [#6089](https://github.com/parse-community/parse-server/pull/6089). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- CHANGE: Set default ACL for GraphQL [#6249](https://github.com/parse-community/parse-server/pull/6249). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- NEW: LDAP auth Adapter [#6226](https://github.com/parse-community/parse-server/pull/6226). Thanks to [Julian Dax](https://github.com/brodo)
+- FIX: improve beforeFind to include Query info [#6237](https://github.com/parse-community/parse-server/pull/6237). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: improve websocket error handling [#6230](https://github.com/parse-community/parse-server/pull/6230). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: addition of an afterLogout trigger [#6217](https://github.com/parse-community/parse-server/pull/6217). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: Initialize default logger [#6186](https://github.com/parse-community/parse-server/pull/6186). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: Add funding link [#6192](https://github.com/parse-community/parse-server/pull/6192 ). Thanks to [Tom Fox](https://github.com/TomWFox)
+- FIX: installationId on LiveQuery connect [#6180](https://github.com/parse-community/parse-server/pull/6180). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: Add exposing port in docker container [#6165](https://github.com/parse-community/parse-server/pull/6165). Thanks to [Priyash Patil](https://github.com/priyashpatil)
+- NEW: Support Google Play Games Service [#6147](https://github.com/parse-community/parse-server/pull/6147). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- DOC: Throw error when setting authData to null [#6154](https://github.com/parse-community/parse-server/pull/6154). Thanks to [Manuel](https://github.com/mtrezza)
+- CHANGE: Move filename validation out of the Router and into the FilesAdaptor [#6157](https://github.com/parse-community/parse-server/pull/6157). Thanks to [Mike Patnode](https://github.com/mpatnode)
+- NEW: Added warning for special URL sensitive characters for appId [#6159](https://github.com/parse-community/parse-server/pull/6159). Thanks to [Saimoom Safayet Akash](https://github.com/saimoomsafayet)
+- NEW: Support Apple Game Center Auth [#6143](https://github.com/parse-community/parse-server/pull/6143). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- CHANGE: test with Node 12 [#6133](https://github.com/parse-community/parse-server/pull/6133). Thanks to [Arthur Cinader](https://github.com/acinader)
+- FIX: prevent after find from firing when saving objects [#6127](https://github.com/parse-community/parse-server/pull/6127). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: GraphQL Mutations not returning updated information [6130](https://github.com/parse-community/parse-server/pull/6130). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
+- CHANGE: Cleanup Schema cache per request [#6216](https://github.com/parse-community/parse-server/pull/6216). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- DOC: Improve installation instructions [#6120](https://github.com/parse-community/parse-server/pull/6120). Thanks to [Andres Galante](https://github.com/andresgalante)
+- DOC: add code formatting to contributing guidelines [#6119](https://github.com/parse-community/parse-server/pull/6119). Thanks to [Andres Galante](https://github.com/andresgalante)
+- NEW: Add GraphQL ACL Type + Input [#5957](https://github.com/parse-community/parse-server/pull/5957). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- CHANGE: replace public key [#6099](https://github.com/parse-community/parse-server/pull/6099). Thanks to [Arthur Cinader](https://github.com/acinader)
+- NEW: Support microsoft authentication in GraphQL [#6051](https://github.com/parse-community/parse-server/pull/6051). Thanks to [Alann Maulana](https://github.com/alann-maulana)
+- NEW: Install parse-server 3.9.0 instead of 2.2 [#6069](https://github.com/parse-community/parse-server/pull/6069). Thanks to [Julian Dax](https://github.com/brodo)
+- NEW: Use #!/bin/bash instead of #!/bin/sh [#6062](https://github.com/parse-community/parse-server/pull/6062). Thanks to [Julian Dax](https://github.com/brodo)
+- DOC: Update GraphQL readme section [#6030](https://github.com/parse-community/parse-server/pull/6030). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+
+# [3.9.0](https://github.com/parse-community/parse-server/compare/3.8.0...3.9.0)
+- NEW: Add allowHeaders to Options [#6044](https://github.com/parse-community/parse-server/pull/6044). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
+- CHANGE: Introduce ReadOptionsInput to GraphQL API [#6030](https://github.com/parse-community/parse-server/pull/6030). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: Stream video with GridFSBucketAdapter (implements byte-range requests) [#6028](https://github.com/parse-community/parse-server/pull/6028). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: Aggregate not matching null values [#6043](https://github.com/parse-community/parse-server/pull/6043). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- CHANGE: Improve callCloudCode mutation to receive a CloudCodeFunction enum instead of a String in the GraphQL API [#6029](https://github.com/parse-community/parse-server/pull/6029). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- TEST: Add more tests to transactions [#6022](https://github.com/parse-community/parse-server/pull/6022). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- CHANGE: Pointer constraint input type as ID in the GraphQL API [#6020](https://github.com/parse-community/parse-server/pull/6020). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
+- CHANGE: Remove underline from operators of the GraphQL API [#6024](https://github.com/parse-community/parse-server/pull/6024). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- FIX: Make method async as expected in usage [#6025](https://github.com/parse-community/parse-server/pull/6025). Thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
+- DOC: Added breaking change note to 3.8 release [#6023](https://github.com/parse-community/parse-server/pull/6023). Thanks to [Manuel](https://github.com/mtrezza)
+- NEW: Added support for line auth [#6007](https://github.com/parse-community/parse-server/pull/6007). Thanks to [Saimoom Safayet Akash](https://github.com/saimoomsafayet)
+- FIX: Fix aggregate group id [#5994](https://github.com/parse-community/parse-server/pull/5994). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- CHANGE: Schema operations instead of generic operations in the GraphQL API [#5993](https://github.com/parse-community/parse-server/pull/5993). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- DOC: Fix changelog formatting[#6009](https://github.com/parse-community/parse-server/pull/6009). Thanks to [Tom Fox](https://github.com/TomWFox)
+- CHANGE: Rename objectId to id in the GraphQL API [#5985](https://github.com/parse-community/parse-server/pull/5985). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
+- FIX: Fix beforeLogin trigger when user has a file [#6001](https://github.com/parse-community/parse-server/pull/6001). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- DOC: Update GraphQL Docs with the latest changes [#5980](https://github.com/parse-community/parse-server/pull/5980). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+
+# [3.8.0](https://github.com/parse-community/parse-server/compare/3.7.2...3.8.0)
+- NEW: Protected fields pointer-permissions support [#5951](https://github.com/parse-community/parse-server/pull/5951). Thanks to [Dobbias Nan](https://github.com/Dobbias)
+- NEW: GraphQL DX: Relation/Pointer [#5946](https://github.com/parse-community/parse-server/pull/5946). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- NEW: Master Key Only Config Properties [#5953](https://github.com/parse-community/parse-server/pull/5954). Thanks to [Manuel](https://github.com/mtrezza)
+- FIX: Better validation when creating a Relation fields [#5922](https://github.com/parse-community/parse-server/pull/5922). Thanks to [Lucas Alencar](https://github.com/alencarlucas)
+- NEW: enable GraphQL file upload [#5944](https://github.com/parse-community/parse-server/pull/5944). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: Handle shutdown on grid adapters [#5943](https://github.com/parse-community/parse-server/pull/5943). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: Fix GraphQL max upload size [#5940](https://github.com/parse-community/parse-server/pull/5940). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- FIX: Remove Buffer() deprecation notice [#5942](https://github.com/parse-community/parse-server/pull/5942). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- FIX: Remove MongoDB unified topology deprecation notice from the grid adapter [#5941](https://github.com/parse-community/parse-server/pull/5941). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: add callback for serverCloseComplete [#5937](https://github.com/parse-community/parse-server/pull/5937). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- DOCS: Add Cloud Code guide to README [#5936](https://github.com/parse-community/parse-server/pull/5936). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: Remove nested operations from GraphQL API [#5931](https://github.com/parse-community/parse-server/pull/5931). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: Improve Live Query Monitoring [#5927](https://github.com/parse-community/parse-server/pull/5927). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: GraphQL: Fix undefined Array [#5296](https://github.com/parse-community/parse-server/pull/5926). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- NEW: Added array support for pointer-permissions [#5921](https://github.com/parse-community/parse-server/pull/5921). Thanks to [Dobbias Nan](https://github.com/Dobbias)
+- GraphQL: Renaming Types/Inputs [#5921](https://github.com/parse-community/parse-server/pull/5921). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- FIX: Lint no-prototype-builtins [#5920](https://github.com/parse-community/parse-server/pull/5920). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- GraphQL: Inline Fragment on Array Fields [#5908](https://github.com/parse-community/parse-server/pull/5908). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- DOCS: Add instructions to launch a compatible Docker Postgres [](). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- Fix: Undefined dot notation in matchKeyInQuery [#5917](https://github.com/parse-community/parse-server/pull/5917). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- Fix: Logger print JSON and Numbers [#5916](https://github.com/parse-community/parse-server/pull/5916). Thanks to [Diamond Lewis](https://github.com/dplewis)
+- GraphQL: Return specific Type on specific Mutation [#5893](https://github.com/parse-community/parse-server/pull/5893). Thanks to [Antoine Cormouls](https://github.com/Moumouls)
+- FIX: Apple sign-in authAdapter [#5891](https://github.com/parse-community/parse-server/pull/5891). Thanks to [SebC](https://github.com/SebC99).
+- DOCS: Add GraphQL beta notice [#5886](https://github.com/parse-community/parse-server/pull/5886). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- GraphQL: Remove "password" output field from _User class [#5889](https://github.com/parse-community/parse-server/pull/5889). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
+- GraphQL: Object constraints [#5715](https://github.com/parse-community/parse-server/pull/5715). Thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
+- DOCS: README top section overhaul + add sponsors [#5876](https://github.com/parse-community/parse-server/pull/5876). Thanks to [Tom Fox](https://github.com/TomWFox)
+- FIX: Return a Promise from classUpdate method [#5877](https://github.com/parse-community/parse-server/pull/5877). Thanks to [Lucas Alencar](https://github.com/alencarlucas)
+- FIX: Use UTC Month in aggregate tests [#5879](https://github.com/parse-community/parse-server/pull/5879). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- FIX: Transaction was aborting before all promises have either resolved or rejected [#5878](https://github.com/parse-community/parse-server/pull/5878). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: Use transactions for batch operation [#5849](https://github.com/parse-community/parse-server/pull/5849). Thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+
+#### Breaking Changes
+- If you are running Parse Server on top of a MongoDB deployment which does not fit the [Retryable Writes Requirements](https://docs.mongodb.com/manual/core/retryable-writes/#prerequisites), you will have to add `retryWrites=false` to your connection string in order to upgrade to Parse Server 3.8.
+
+# [3.7.2](https://github.com/parse-community/parse-server/compare/3.7.1...3.7.2)
+
+- FIX: Live Query was failing on release 3.7.1
+
+# [3.7.1](https://github.com/parse-community/parse-server/compare/3.7.0...3.7.1)
+
+- FIX: Missing APN module
+- FIX: Set falsy values as default to schema fields [#5868](https://github.com/parse-community/parse-server/pull/5868), thanks to [Lucas Alencar](https://github.com/alencarlucas)
+- NEW: Implement WebSocketServer Adapter [#5866](https://github.com/parse-community/parse-server/pull/5866), thanks to [Diamond Lewis](https://github.com/dplewis)
+
+# [3.7.0](https://github.com/parse-community/parse-server/compare/3.6.0...3.7.0)
+
+- FIX: Prevent linkWith sessionToken from generating new session [#5801](https://github.com/parse-community/parse-server/pull/5801), thanks to [Diamond Lewis](https://github.com/dplewis)
+- GraphQL: Improve session token error messages [#5753](https://github.com/parse-community/parse-server/pull/5753), thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
+- NEW: GraphQL { functions { call } } generic mutation [#5818](https://github.com/parse-community/parse-server/pull/5818), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: GraphQL Custom Schema [#5821](https://github.com/parse-community/parse-server/pull/5821), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: GraphQL custom schema on CLI [#5828](https://github.com/parse-community/parse-server/pull/5828), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: GraphQL @mock directive [#5836](https://github.com/parse-community/parse-server/pull/5836), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- FIX: GraphQL _or operator not working [#5840](https://github.com/parse-community/parse-server/pull/5840), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: Add "count" to CLP initial value [#5841](https://github.com/parse-community/parse-server/pull/5841), thanks to [Douglas Muraoka](https://github.com/douglasmuraoka)
+- NEW: Add ability to alter the response from the after save trigger [#5814](https://github.com/parse-community/parse-server/pull/5814), thanks to [BrunoMaurice](https://github.com/brunoMaurice)
+- FIX: Cache apple public key for the case it fails to fetch again [#5848](https://github.com/parse-community/parse-server/pull/5848), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: GraphQL Configuration Options [#5782](https://github.com/parse-community/parse-server/pull/5782), thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
+- NEW: Required fields and default values [#5835](https://github.com/parse-community/parse-server/pull/5835), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- FIX: Postgres safely escape strings in nested objects [#5855](https://github.com/parse-community/parse-server/pull/5855), thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: Support PhantAuth authentication [#5850](https://github.com/parse-community/parse-server/pull/5850), thanks to [Ivan SZKIBA](https://github.com/szkiba)
+- FIX: Remove uws package [#5860](https://github.com/parse-community/parse-server/pull/5860), thanks to [Zeal Murapa](https://github.com/GoGross)
+
+# [3.6.0](https://github.com/parse-community/parse-server/compare/3.5.0...3.6.0)
+
+- SECURITY FIX: Address [Security Advisory](https://github.com/parse-community/parse-server/security/advisories/GHSA-8w3j-g983-8jh5) of a potential [Enumeration Attack](https://www.owasp.org/index.php/Testing_for_User_Enumeration_and_Guessable_User_Account_(OWASP-AT-002)#Description_of_the_Issue) [73b0f9a](https://github.com/parse-community/parse-server/commit/73b0f9a339b81f5d757725dc557955a7b670a3ec), big thanks to [Fabian Strachanski](https://github.com/fastrde) for identifying the problem, creating a fix and following the [vulnerability disclosure guidelines](https://github.com/parse-community/parse-server/blob/master/SECURITY.md#parse-community-vulnerability-disclosure-program)
+- NEW: Added rest option: excludeKeys [#5737](https://github.com/parse-community/parse-server/pull/5737), thanks to [Raschid J.F. Rafeally](https://github.com/RaschidJFR)
+- FIX: LiveQuery create event with fields [#5790](https://github.com/parse-community/parse-server/pull/5790), thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: Generate sessionToken with linkWith [#5799](https://github.com/parse-community/parse-server/pull/5799), thanks to [Diamond Lewis](https://github.com/dplewis)
+
+# [3.5.0](https://github.com/parse-community/parse-server/compare/3.4.4...3.5.0)
+
+- NEW: GraphQL Support [#5674](https://github.com/parse-community/parse-server/pull/5674), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+
+[GraphQL Guide](https://github.com/parse-community/parse-server#graphql)
+
+- NEW: Sign in with Apple [#5694](https://github.com/parse-community/parse-server/pull/5694), thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: AppSecret to Facebook Auth [#5695](https://github.com/parse-community/parse-server/pull/5695), thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: Postgres: Regex support foreign characters [#5598](https://github.com/parse-community/parse-server/pull/5598), thanks to [Jeff Gu Kang](https://github.com/JeffGuKang)
+- FIX: Winston Logger string interpolation [#5729](https://github.com/parse-community/parse-server/pull/5729), thanks to [Diamond Lewis](https://github.com/dplewis)
+
+# [3.4.4](https://github.com/parse-community/parse-server/compare/3.4.3...3.4.4)
+
+Fix: Commit changes
+
+# [3.4.3](https://github.com/parse-community/parse-server/compare/3.4.2...3.4.3)
+
+Fix: Use changes in master to travis configuration to enable pushing to npm and gh_pages. See diff for details.
+
+# [3.4.2](https://github.com/parse-community/parse-server/compare/3.4.1...3.4.2)
+
+Fix: In my haste to get a [Security Fix](https://github.com/parse-community/parse-server/security/advisories/GHSA-2479-qvv7-47qq) out, I added [8709daf](https://github.com/parse-community/parse-server/commit/8709daf698ea69b59268cb66f0f7cee75b52daa5) to master instead of to 3.4.1. This commit fixes that. [Arthur Cinader](https://github.com/acinader)
+
+# [3.4.1](https://github.com/parse-community/parse-server/compare/3.4.0...3.4.1)
+
+Security Fix: see Advisory: [GHSA-2479-qvv7-47q](https://github.com/parse-community/parse-server/security/advisories/GHSA-2479-qvv7-47qq) for details [8709daf](https://github.com/parse-community/parse-server/commit/8709daf698ea69b59268cb66f0f7cee75b52daa5). Big thanks to: [Benjamin Simonsson](https://github.com/BenniPlejd) for identifying the issue and promptly bringing it to the Parse Community's attention and also big thanks to the indefatigable [Diamond Lewis](https://github.com/dplewis) for crafting a failing test and then a solution within an hour of the report.
+
+# [3.4.0](https://github.com/parse-community/parse-server/compare/3.3.0...3.4.0)
+- NEW: Aggregate supports group by date fields [#5538](https://github.com/parse-community/parse-server/pull/5538) thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: API for Read Preferences [#3963](https://github.com/parse-community/parse-server/pull/3963) thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- NEW: Add Redis options for LiveQuery [#5584](https://github.com/parse-community/parse-server/pull/5584) thanks to [Diamond Lewis](https://github.com/dplewis)
+- NEW: Add Direct Access option for Server Config [#5550](https://github.com/parse-community/parse-server/pull/5550) thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: updating mixed array in Postgres [#5552](https://github.com/parse-community/parse-server/pull/5552) thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: notEqualTo GeoPoint Query in Postgres [#5549](https://github.com/parse-community/parse-server/pull/5549), thanks to [Diamond Lewis](https://github.com/dplewis)
+- FIX: put the timestamp back in logs that was lost after Winston upgrade [#5571](https://github.com/parse-community/parse-server/pull/5571), thanks to [Steven Rowe](https://github.com/mrowe009) and [Arthur Cinader](https://github.com/acinader)
+- FIX: Validates permission before calling beforeSave [#5546](https://github.com/parse-community/parse-server/pull/5546), thanks to [Antonio Davi Macedo Coelho de Castro](https://github.com/davimacedo)
+- FIX: Remove userSensitiveFields default value. [#5588](https://github.com/parse-community/parse-server/pull/5588), thanks to [William George](https://github.com/awgeorge)
+- FIX: Decode Date JSON value in LiveQuery. [#5540](https://github.com/parse-community/parse-server/pull/5540), thanks to [ananfang](https://github.com/ananfang)
+
+
+# [3.3.0](https://github.com/parse-community/parse-server/compare/3.2.3...3.3.0)
+- NEW: beforeLogin trigger with support for auth providers ([#5445](https://github.com/parse-community/parse-server/pull/5445)), thanks to [Omair Vaiyani](https://github.com/omairvaiyani)
+- NEW: RFC 7662 compliant OAuth2 auth adapter ([#4910](https://github.com/parse-community/parse-server/pull/4910)), thanks to [Müller Zsolt](https://github.com/zsmuller)
+- FIX: cannot change password when maxPasswordHistory is 1 ([#5191](https://github.com/parse-community/parse-server/pull/5191)), thanks to [Tulsi Sapkota](https://github.com/Tolsee)
+- FIX (Postgres): count being very slow on large Parse Classes' collections ([#5330](https://github.com/parse-community/parse-server/pull/5330)), thanks to [CoderickLamar](https://github.com/CoderickLamar)
+- FIX: using per-key basis queue ([#5420](https://github.com/parse-community/parse-server/pull/5420)), thanks to [Georges Jamous](https://github.com/georgesjamous)
+- FIX: issue on count with Geo constraints and mongo ([#5286](https://github.com/parse-community/parse-server/pull/5286)), thanks to [Julien Quéré](https://github.com/jlnquere)
+
+# [3.2.3](https://github.com/parse-community/parse-server/compare/3.2.2...3.2.3)
+- Correct previous release with patch that is fully merged
+
+# [3.2.2](https://github.com/parse-community/parse-server/compare/3.2.1...3.2.2)
+- Security fix to properly process userSensitiveFields when parse-server is started with
+ ../lib/cli/parse-server [#5463](https://github.com/parse-community/parse-server/pull/5463
+ )
+
+# [3.2.1](https://github.com/parse-community/parse-server/compare/3.2.0...3.2.1)
+- Increment package.json version to match the deployment tag
+
+# [3.2.0](https://github.com/parse-community/parse-server/compare/3.1.3...3.2.0)
+- NEW: Support accessing sensitive fields with an explicit ACL. Not documented yet, see [tests](https://github.com/parse-community/parse-server/blob/f2c332ea6a984808ad5b2e3ce34864a20724f72b/spec/UserPII.spec.js#L526) for examples
+- Upgrade Parse SDK JS to 2.3.1 [#5457](https://github.com/parse-community/parse-server/pull/5457)
+- Hides token contents in logStartupOptions if they arrive as a buffer [#6a9380](https://github.com/parse-community/parse-server/commit/6a93806c62205a56a8f4e3b8765848c552510337)
+- Support custom message for password requirements [#5399](https://github.com/parse-community/parse-server/pull/5399)
+- Support for Ajax password reset [#5332](https://github.com/parse-community/parse-server/pull/5332)
+- Postgres: Refuse to build unsafe JSON lists for contains [#5337](https://github.com/parse-community/parse-server/pull/5337)
+- Properly handle return values in beforeSave [#5228](https://github.com/parse-community/parse-server/pull/5228)
+- Fixes issue when querying user roles [#5276](https://github.com/parse-community/parse-server/pull/5276)
+- Fixes issue affecting update with CLP [#5269](https://github.com/parse-community/parse-server/pull/5269)
+
+# [3.1.3](https://github.com/parse-community/parse-server/compare/3.1.2...3.1.3)
+
+- Postgres: Fixes support for global configuration
+- Postgres: Fixes support for numeric arrays
+- Postgres: Fixes issue affecting queries on empty arrays
+- LiveQuery: Adds support for transmitting the original object
+- Queries: Use estimated count if query is empty
+- Docker: Reduces the size of the docker image to 154Mb
+
+
+# [3.1.2](https://github.com/parse-community/parse-server/compare/3.1.1...3.1.2)
+
+- Removes dev script, use TDD instead of server.
+- Removes nodemon and problematic dependencies.
+- Addressed event-stream security debacle.
+
+# [3.1.1](https://github.com/parse-community/parse-server/compare/3.1.0...3.1.1)
+
+### Improvements:
+* Fixes issue that would prevent users with large number of roles to resolve all of them [Antoine Cormouls](https://github.com/Moumouls) (#5131, #5132)
+* Fixes distinct query on special fields ([#5144](https://github.com/parse-community/parse-server/pull/5144))
+
+
+# [3.1.0](https://github.com/parse-community/parse-server/compare/3.0.0...3.1.0)
+
+#### Breaking Changes:
+* Return success on sendPasswordResetEmail even if email not found. (#7fe4030)
+### Security Fix:
+* Expire password reset tokens on email change (#5104)
+### Improvements:
+* Live Query CLPs (#4387)
+* Reduces number of calls to injectDefaultSchema (#5107)
+* Remove runtime dependency on request (#5076)
+### Bug fixes:
+* Fixes issue with vkontatke authentication (#4977)
+* Use the correct function when validating google auth tokens (#5018)
+* fix unexpected 'delete' trigger issue on LiveQuery (#5031)
+* Improves performance for roles and ACL's in live query server (#5126)
+
+
+# [3.0.0](https://github.com/parse-community/parse-server/compare/2.8.4...3.0.0)
+
+`parse-server` 3.0.0 comes with brand new handlers for cloud code. It now fully supports promises and async / await.
+For more informations, visit the v3.0.0 [migration guide](https://github.com/parse-community/parse-server/blob/master/3.0.0.md).
+
+#### Breaking Changes:
+* Cloud Code handlers have a new interface based on promises.
+* response.success / response.error are removed in Cloud Code
+* Cloud Code runs with Parse-SDK 2.0
+* The aggregate now require aggregates to be passed in the form: `{"pipeline": [...]}` (REST Only)
+
+### Improvements:
+* Adds Pipeline Operator to Aggregate Router.
+* Adds documentations for parse-server's adapters, constructors and more.
+* Adds ability to pass a context object between `beforeSave` and `afterSave` affecting the same object.
+
+### Bug Fixes:
+* Fixes issue that would crash the server when mongo objects had undefined values [#4966](https://github.com/parse-community/parse-server/issues/4966)
+* Fixes issue that prevented ACL's from being used with `select` (see [#571](https://github.com/parse-community/Parse-SDK-JS/issues/571))
+
+### Dependency updates:
+* [@parse/simple-mailgun-adapter@1.1.0](https://www.npmjs.com/package/@parse/simple-mailgun-adapter)
+* [mongodb@3.1.3](https://www.npmjs.com/package/mongodb)
+* [request@2.88.0](https://www.npmjs.com/package/request)
+
+### Development Dependencies Updates:
+* [@parse/minami@1.0.0](https://www.npmjs.com/package/@parse/minami)
+* [deep-diff@1.0.2](https://www.npmjs.com/package/deep-diff)
+* [flow-bin@0.79.0](https://www.npmjs.com/package/flow-bin)
+* [jsdoc@3.5.5](https://www.npmjs.com/package/jsdoc)
+* [jsdoc-babel@0.4.0](https://www.npmjs.com/package/jsdoc-babel)
+
+# [2.8.4](https://github.com/parse-community/parse-server/compare/2.8.3...2.8.4)
+
+#### Improvements:
+* Adds ability to forward errors to express handler (#4697)
+* Adds ability to increment the push badge with an arbitrary value (#4889)
+* Adds ability to preserve the file names when uploading (#4915)
+* `_User` now follow regular ACL policy. Letting administrator lock user out. (#4860) and (#4898)
+* Ensure dates are properly handled in aggregates (#4743)
+* Aggregates: Improved support for stages sharing the same name
+* Add includeAll option
+* Added verify password to users router and tests. (#4747)
+* Ensure read preference is never overriden, so DB config prevails (#4833)
+* add support for geoWithin.centerSphere queries via withJSON (#4825)
+* Allow sorting an object field (#4806)
+* Postgres: Don't merge JSON fields after save() to keep same behaviour as MongoDB (#4808) (#4815)
+
+#### Dependency updates
+* [commander@2.16.0](https://www.npmjs.com/package/commander)
+* [mongodb@3.1.1](https://www.npmjs.com/package/mongodb)
+* [pg-promise@8.4.5](https://www.npmjs.com/package/pg-promise)
+* [ws@6.0.0](https://www.npmjs.com/package/ws)
+* [bcrypt@3.0.0](https://www.npmjs.com/package/bcrypt)
+* [uws@10.148.1](https://www.npmjs.com/package/uws)
+
+##### Development Dependencies Updates:
+* [cross-env@5.2.0](https://www.npmjs.com/package/cross-env)
+* [eslint@5.0.0](https://www.npmjs.com/package/eslint)
+* [flow-bin@0.76.0](https://www.npmjs.com/package/flow-bin)
+* [mongodb-runner@4.0.0](https://www.npmjs.com/package/mongodb-runner)
+* [nodemon@1.18.1](https://www.npmjs.com/package/nodemon)
+* [nyc@12.0.2](https://www.npmjs.com/package/nyc)
+* [request-promise@4.2.2](https://www.npmjs.com/package/request-promise)
+* [supports-color@5.4.0](https://www.npmjs.com/package/supports-color)
+
+# [2.8.3](https://github.com/parse-community/parse-server/compare/2.8.2...2.8.3)
+
+#### Improvements:
+
+* Adds support for JS SDK 2.0 job status header
+* Removes npm-git scripts as npm supports using git repositories that build, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+
+# [2.8.2](https://github.com/parse-community/parse-server/compare/2.8.1...2.8.2)
+
+##### Bug Fixes:
+* Ensure legacy users without ACL's are not locked out, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Improvements:
+* Use common HTTP agent to increase webhooks performance, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Adds withinPolygon support for Polygon objects, thanks to [Mads Bjerre](https://github.com/madsb)
+
+#### Dependency Updates:
+* [ws@5.2.0](https://www.npmjs.com/package/ws)
+* [commander@2.15.1](https://www.npmjs.com/package/commander)
+* [nodemon@1.17.5](https://www.npmjs.com/package/nodemon)
+
+##### Development Dependencies Updates:
+* [flow-bin@0.73.0](https://www.npmjs.com/package/flow-bin)
+* [cross-env@5.1.6](https://www.npmjs.com/package/cross-env)
+* [gaze@1.1.3](https://www.npmjs.com/package/gaze)
+* [deepcopy@1.0.0](https://www.npmjs.com/package/deepcopy)
+* [deep-diff@1.0.1](https://www.npmjs.com/package/deep-diff)
+
+
+# [2.8.1](https://github.com/parse-community/parse-server/compare/2.8.1...2.8.0)
+
+Ensure all the files are properly exported to the final package.
+
+# [2.8.0](https://github.com/parse-community/parse-server/compare/2.8.0...2.7.4)
+
+#### New Features
+* Adding Mongodb element to add `arrayMatches` the #4762 (#4766), thanks to [Jérémy Piednoel](https://github.com/jeremypiednoel)
+* Adds ability to Lockout users (#4749), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Bug fixes:
+* Fixes issue when using afterFind with relations (#4752), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New query condition support to match all strings that starts with some other given strings (#3864), thanks to [Eduard Bosch Bertran](https://github.com/eduardbosch)
+* Allow creation of indices on default fields (#4738), thanks to [Claire Neveu](https://github.com/ClaireNeveu)
+* Purging empty class (#4676), thanks to [Diamond Lewis](https://github.com/dplewis)
+* Postgres: Fixes issues comparing to zero or false (#4667), thanks to [Diamond Lewis](https://github.com/dplewis)
+* Fix Aggregate Match Pointer (#4643), thanks to [Diamond Lewis](https://github.com/dplewis)
+
+#### Improvements:
+* Allow Parse.Error when returning from Cloud Code (#4695), thanks to [Saulo Tauil](https://github.com/saulogt)
+* Fix typo: "requrest" -> "request" (#4761), thanks to [Joseph Frazier](https://github.com/josephfrazier)
+* Send version for Vkontakte API (#4725), thanks to [oleg](https://github.com/alekoleg)
+* Ensure we respond with invalid password even if email is unverified (#4708), thanks to [dblythy](https://github.com/dblythy)
+* Add _password_history to default sensitive data (#4699), thanks to [Jong Eun Lee](https://github.com/yomybaby)
+* Check for node version in postinstall script (#4657), thanks to [Diamond Lewis](https://github.com/dplewis)
+* Remove FB Graph API version from URL to use the oldest non deprecated version, thanks to [SebC](https://github.com/SebC99)
+
+#### Dependency Updates:
+* [@parse/push-adapter@2.0.3](https://www.npmjs.com/package/@parse/push-adapter)
+* [@parse/simple-mailgun-adapter@1.0.2](https://www.npmjs.com/package/@parse/simple-mailgun-adapter)
+* [uws@10.148.0](https://www.npmjs.com/package/uws)
+* [body-parser@1.18.3](https://www.npmjs.com/package/body-parser)
+* [mime@2.3.1](https://www.npmjs.com/package/mime)
+* [request@2.85.0](https://www.npmjs.com/package/request)
+* [mongodb@3.0.7](https://www.npmjs.com/package/mongodb)
+* [bcrypt@2.0.1](https://www.npmjs.com/package/bcrypt)
+* [ws@5.1.1](https://www.npmjs.com/package/ws)
+
+##### Development Dependencies Updates:
+* [cross-env@5.1.5](https://www.npmjs.com/package/cross-env)
+* [flow-bin@0.71.0](https://www.npmjs.com/package/flow-bin)
+* [deep-diff@1.0.0](https://www.npmjs.com/package/deep-diff)
+* [nodemon@1.17.3](https://www.npmjs.com/package/nodemon)
+
+
+# [2.7.4](https://github.com/parse-community/parse-server/compare/2.7.4...2.7.3)
+
+#### Bug Fixes:
+* Fixes an issue affecting polygon queries, thanks to [Diamond Lewis](https://github.com/dplewis)
+
+#### Dependency Updates:
+* [pg-promise@8.2.1](https://www.npmjs.com/package/pg-promise)
+
+##### Development Dependencies Updates:
+* [nodemon@1.17.1](https://www.npmjs.com/package/nodemon)
+
+# [2.7.3](https://github.com/parse-community/parse-server/compare/2.7.3...2.7.2)
+
+#### Improvements:
+* Improve documentation for LiveQuery options, thanks to [Arthur Cinader](https://github.com/acinader)
+* Improve documentation for using cloud code with docker, thanks to [Stephen Tuso](https://github.com/stephentuso)
+* Adds support for Facebook's AccountKit, thanks to [6thfdwp](https://github.com/6thfdwp)
+* Disable afterFind routines when running aggregates, thanks to [Diamond Lewis](https://github.com/dplewis)
+* Improve support for distinct aggregations of nulls, thanks to [Diamond Lewis](https://github.com/dplewis)
+* Regenreate the email verification token when requesting a new email, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+
+#### Bug Fixes:
+* Fix issue affecting readOnly masterKey and purge command, thanks to [AreyouHappy](https://github.com/AreyouHappy)
+* Fixes Issue unsetting in beforeSave doesn't allow object creation, thanks to [Diamond Lewis](https://github.com/dplewis)
+* Fixes issue crashing server on invalid live query payload, thanks to [fridays](https://github.com/fridays)
+* Fixes issue affecting postgres storage adapter "undefined property '__op'", thanks to [Tyson Andre](https://github,com/TysonAndre)
+
+#### Dependency Updates:
+* [winston@2.4.1](https://www.npmjs.com/package/winston)
+* [pg-promise@8.2.0](https://www.npmjs.com/package/pg-promise)
+* [commander@2.15.0](https://www.npmjs.com/package/commander)
+* [lru-cache@4.1.2](https://www.npmjs.com/package/lru-cache)
+* [parse@1.11.1](https://www.npmjs.com/package/parse)
+* [ws@5.0.0](https://www.npmjs.com/package/ws)
+* [mongodb@3.0.4](https://www.npmjs.com/package/mongodb)
+* [lodash@4.17.5](https://www.npmjs.com/package/lodash)
+
+##### Development Dependencies Updates:
+* [cross-env@5.1.4](https://www.npmjs.com/package/cross-env)
+* [flow-bin@0.67.1](https://www.npmjs.com/package/flow-bin)
+* [jasmine@3.1.0](https://www.npmjs.com/package/jasmine)
+* [parse@1.11.1](https://www.npmjs.com/package/parse)
+* [babel-eslint@8.2.2](https://www.npmjs.com/package/babel-eslint)
+* [nodemon@1.15.0](https://www.npmjs.com/package/nodemon)
+
+# [2.7.2](https://github.com/parse-community/parse-server/compare/2.7.2...2.7.1)
+
+#### Improvements:
+* Improved match aggregate
+* Do not mark the empty push as failed
+* Support pointer in aggregate query
+* Introduces flow types for storage
+* Postgres: Refactoring of Postgres Storage Adapter
+* Postgres: Support for multiple projection in aggregate
+* Postgres: performance optimizations
+* Adds infos about vulnerability disclosures
+* Adds ability to login with email when provided as username
+
+#### Bug Fixes
+* Scrub Passwords with URL Encoded Characters
+* Fixes issue affecting using sorting in beforeFind
+
+#### Dependency Updates:
+* [commander@2.13.0](https://www.npmjs.com/package/commander)
+* [semver@5.5.0](https://www.npmjs.com/package/semver)
+* [pg-promise@7.4.0](https://www.npmjs.com/package/pg-promise)
+* [ws@4.0.0](https://www.npmjs.com/package/ws)
+* [mime@2.2.0](https://www.npmjs.com/package/mime)
+* [parse@1.11.0](https://www.npmjs.com/package/parse)
+
+##### Development Dependencies Updates:
+* [nodemon@1.14.11](https://www.npmjs.com/package/nodemon)
+* [flow-bin@0.64.0](https://www.npmjs.com/package/flow-bin)
+* [jasmine@2.9.0](https://www.npmjs.com/package/jasmine)
+* [cross-env@5.1.3](https://www.npmjs.com/package/cross-env)
+
+# [2.7.1](https://github.com/parse-community/parse-server/compare/2.7.1...2.7.0)
+
+:warning: Fixes a security issue affecting Class Level Permissions
+
+* Adds support for dot notation when using matchesKeyInQuery, thanks to [Henrik](https://github.com/bohemima) and [Arthur Cinader](https://github.com/acinader)
+
+# [2.7.0](https://github.com/parse-community/parse-server/compare/2.7.0...2.6.5)
+
+:warning: This version contains an issue affecting Class Level Permissions on mongoDB. Please upgrade to 2.7.1.
+
+Starting parse-server 2.7.0, the minimun nodejs version is 6.11.4, please update your engines before updating parse-server
+
+#### New Features:
+* Aggregation endpoints, thanks to [Diamond Lewis](https://github.com/dplewis)
+* Adds indexation options onto Schema endpoints, thanks to [Diamond Lewis](https://github.com/dplewis)
+
+#### Bug fixes:
+* Fixes sessionTokens being overridden in 'find' (#4332), thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+* Proper `handleShutdown()` feature to close database connections (#4361), thanks to [CHANG, TZU-YEN](https://github.com/trylovetom)
+* Fixes issue affecting state of _PushStatus objects, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+* Fixes issue affecting calling password reset password pages with wrong appid, thanks to [Bryan de Leon](https://github.com/bryandel)
+* Fixes issue affecting duplicates _Sessions on successive logins, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Improvements:
+* Updates contributing guides, and improves windows support, thanks to [Addison Elliott](https://github.com/addisonelliott)
+* Uses new official scoped packaged, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Improves health checks responses, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+* Add password confirmation to choose_password, thanks to [Worathiti Manosroi](https://github.com/pungme)
+* Improve performance of relation queries, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Dependency Updates:
+* [commander@2.12.1](https://www.npmjs.com/package/commander)
+* [ws@3.3.2](https://www.npmjs.com/package/ws)
+* [uws@9.14.0](https://www.npmjs.com/package/uws)
+* [pg-promise@7.3.2](https://www.npmjs.com/package/pg-promise)
+* [parse@1.10.2](https://www.npmjs.com/package/parse)
+* [pg-promise@7.3.1](https://www.npmjs.com/package/pg-promise)
+
+##### Development Dependencies Updates:
+* [cross-env@5.1.1](https://www.npmjs.com/package/cross-env)
+
+
+
+# [2.6.5](https://github.com/ParsePlatform/parse-server/compare/2.6.5...2.6.4)
+
+#### New Features:
+* Adds support for read-only masterKey, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Adds support for relative time queries (mongodb only), thanks to [Marvel Mathew](https://github.com/marvelm)
+
+#### Improvements:
+* Handle possible afterSave exception, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+* Add support for expiration interval in Push, thanks to [Marvel Mathew](https://github.com/marvelm)
+
+#### Bug Fixes:
+* The REST API key was improperly inferred from environment when using the CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+# [2.6.4](https://github.com/ParsePlatform/parse-server/compare/2.6.4...2.6.3)
+
+#### Improvements:
+* Improves management of configurations and default values, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Adds ability to start ParseServer with `ParseServer.start(options)`, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Adds request original IP to cloud code hooks, thanks to [Gustav Ahlberg](https://github.com/Gyran)
+* Corrects some outdated links, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+* Adds serverURL validation on startup, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+* Adds ability to login with POST requests alongside GET, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+* Adds ability to login with email, instead of username, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Bug Fixes:
+* Fixes issue affecting beforeSaves and increments, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+
+#### Dependency Updates:
+* [parse-server-push-adapter@2.0.2](https://www.npmjs.com/package/parse-server-push-adapter)
+* [semver@5.4.1](https://www.npmjs.com/package/semver)
+* [pg-promise@7.0.3](https://www.npmjs.com/package/pg-promise)
+* [mongodb@2.2.33](https://www.npmjs.com/package/mongodb)
+* [parse@1.10.1](https://www.npmjs.com/package/parse)
+* [express@4.16.0](https://www.npmjs.com/package/express)
+* [mime@1.4.1](https://www.npmjs.com/package/mime)
+* [parse-server-simple-mailgun-adapter@1.0.1](https://www.npmjs.com/package/parse-server-simple-mailgun-adapter)
+
+##### Development Dependencies Updates:
+* [babel-preset-env@1.6.1](https://www.npmjs.com/package/babel-preset-env)
+* [cross-env@5.1.0](https://www.npmjs.com/package/cross-env)
+* [mongodb-runner@3.6.1](https://www.npmjs.com/package/mongodb-runner)
+* [eslint-plugin-flowtype@2.39.1](https://www.npmjs.com/package/eslint-plugin-flowtype)
+* [eslint@4.9.0](https://www.npmjs.com/package/eslint)
+
+# [2.6.3](https://github.com/ParsePlatform/parse-server/compare/2.6.2...2.6.3)
+
+#### Improvements:
+* Queries on Pointer fields with `$in` and `$nin` now supports list of objectId's, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* LiveQueries on `$in` and `$nin` for pointer fields work as expected thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Also remove device token when APNS error is BadDeviceToken, thanks to [Mauricio Tollin](https://github.com/)
+* LRU cache is not available on the ParseServer object, thanks to [Tyler Brock](https://github.com/tbrock)
+* Error messages are more expressive, thanks to [Tyler Brock](https://github.com/tbrock)
+* Postgres: Properly handle undefined field values, thanks to [Diamond Lewis](https://github.com/dlewis)
+* Updating with two GeoPoints fails correctly, thanks to [Anthony Mosca](https://github.com/aontas)
+
+#### New Features:
+* Adds ability to set a maxLimit on server configuration for queries, thanks to [Chris Norris](https://github.com/)
+
+#### Bug fixes:
+* Fixes issue affecting reporting `_PushStatus` with misconfigured serverURL, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fixes issue affecting deletion of class that doesn't exist, thanks to [Diamond Lewis](https://github.com/dlewis)
+
+#### Dependency Updates:
+* [winston@2.4.0](https://www.npmjs.com/package/winston)
+* [pg-promise@6.10.2](https://www.npmjs.com/package/pg-promise)
+* [winston-daily-rotate-file@1.6.0](https://www.npmjs.com/package/winston-daily-rotate-file)
+* [request@2.83.0](https://www.npmjs.com/package/request)
+* [body-parser@1.18.2](https://www.npmjs.com/package/body-parser)
+
+##### Development Dependencies Updates:
+* [request-promise@4.2.2](https://www.npmjs.com/package/request-promise)
+* [eslint@4.7.1](https://www.npmjs.com/package/eslint)
+
+# [2.6.2](https://github.com/ParsePlatform/parse-server/compare/2.6.1...2.6.2)
+
+#### Improvements:
+* PushWorker/PushQueue channels are properly prefixed with the Parse applicationId, thanks to [Marvel Mathew](https://github.com/marvelm)
+* You can use Parse.Cloud.afterSave hooks on _PushStatus
+* You can use Parse.Cloud.onLiveQueryEvent to track the number of clients and subscriptions
+* Adds support for more fields from the Audience class.
+
+#### New Features:
+* Push: Adds ability to track sentPerUTC offset if your push scheduler supports it.
+* Push: Adds support for cleaning up invalid deviceTokens from _Installation (PARSE_SERVER_CLEANUP_INVALID_INSTALLATIONS=1).
+
+#### Dependency Updates:
+* [ws@3.2.0](https://www.npmjs.com/package/ws)
+* [pg-promise@6.5.3](https://www.npmjs.com/package/pg-promise)
+* [winston-daily-rotate-file@1.5.0](https://www.npmjs.com/package/winston-daily-rotate-file)
+* [body-parser@1.18.1](https://www.npmjs.com/package/body-parser)
+
+##### Development Dependencies Updates:
+* [nodemon@1.12.1](https://www.npmjs.com/package/nodemon)
+* [mongodb-runner@3.6.0](https://www.npmjs.com/package/mongodb-runner)
+* [babel-eslint@8.0.0](https://www.npmjs.com/package/babel-eslint)
+
+# [2.6.1](https://github.com/ParsePlatform/parse-server/compare/2.6.0...2.6.1)
+
+#### Improvements:
+* Improves overall performance of the server, more particularly with large query results.
+* Improves performance of InMemoryCacheAdapter by removing serialization.
+* Improves logging performance by skipping necessary log calls.
+* Refactors object routers to simplify logic.
+* Adds automatic indexing on $text indexes, thanks to [Diamon Lewis](https://github.com/dplewis)
+
+#### New Features:
+* Push: Adds ability to send localized pushes according to the _Installation localeIdentifier
+* Push: proper support for scheduling push in user's locale time, thanks to [Marvel Mathew](https://github.com/marvelm)
+* LiveQuery: Adds ability to use LiveQuery with a masterKey, thanks to [Jeremy May](https://github.com/kenishi)
+
+#### Bug Fixes:
+* Fixes an issue that would duplicate Session objects per userId-installationId pair.
+* Fixes an issue affecting pointer permissions introduced in this release.
+* Fixes an issue that would prevent displaying audiences correctly in dashboard.
+* Fixes an issue affecting preventLoginWithUnverifiedEmail upon signups.
+
+#### Dependency Updates:
+* [pg-promise@6.3.2](https://www.npmjs.com/package/pg-promise)
+* [body-parser@1.18.0](https://www.npmjs.com/package/body-parser)
+* [nodemon@1.11.1](https://www.npmjs.com/package/nodemon)
+
+##### Development Dependencies Updates:
+* [babel-cli@6.26.0](https://www.npmjs.com/package/babel-cli)
+
+# [2.6.0](https://github.com/ParsePlatform/parse-server/compare/2.5.3...2.6.0)
+
+##### Breaking Changes:
+* [parse-server-s3-adapter@1.2.0](https://www.npmjs.com/package/parse-server-s3-adapter): A new deprecation notice is introduced with parse-server-s3-adapter's version 1.2.0. An upcoming release will remove passing key and password arguments. AWS credentials should be set using AWS best practices. See the [Deprecation Notice for AWS credentials]( https://github.com/parse-server-modules/parse-server-s3-adapter/blob/master/README.md#deprecation-notice----aws-credentials) section of the adapter's README.
+
+#### New Features
+* Polygon is fully supported as a type, thanks to [Diamond Lewis](https://github.com/dplewis)
+* Query supports PolygonContains, thanks to [Diamond Lewis](https://github.com/dplewis)
+
+#### Improvements
+* Postgres: Adds support nested contains and containedIn, thanks to [Diamond Lewis](https://github.com/dplewis)
+* Postgres: Adds support for `null` in containsAll queries, thanks to [Diamond Lewis](https://github.com/dplewis)
+* Cloud Code: Request headers are passed to the cloud functions, thanks to [miguel-s](https://github.com/miguel-s)
+* Push: All push queries now filter only where deviceToken exists
+
+#### Bug Fixes:
+* Fixes issue affecting updates of _User objects when authData was passed.
+* Push: Pushing to an empty audience should now properly report a failed _PushStatus
+* Linking Users: Fixes issue affecting linking users with sessionToken only
+
+#### Dependency Updates:
+* [ws@3.1.0](https://www.npmjs.com/package/ws)
+* [mime@1.4.0](https://www.npmjs.com/package/mime)
+* [semver@5.4.0](https://www.npmjs.com/package/semver)
+* [uws@8.14.1](https://www.npmjs.com/package/uws)
+* [bcrypt@1.0.3](https://www.npmjs.com/package/bcrypt)
+* [mongodb@2.2.31](https://www.npmjs.com/package/mongodb)
+* [redis@2.8.0](https://www.npmjs.com/package/redis)
+* [pg-promise@6.3.1](https://www.npmjs.com/package/pg-promise)
+* [commander@2.11.0](https://www.npmjs.com/package/commander)
+
+##### Development Dependencies Updates:
+* [jasmine@2.8.0](https://www.npmjs.com/package/jasmine)
+* [babel-register@6.26.0](https://www.npmjs.com/package/babel-register)
+* [babel-core@6.26.0](https://www.npmjs.com/package/babel-core)
+* [cross-env@5.0.2](https://www.npmjs.com/package/cross-env)
+
+# [2.5.3](https://github.com/ParsePlatform/parse-server/compare/2.5.2...2.5.3)
+
+#### New Features:
+* badge property on android installations will now be set as on iOS (#3970), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Bug Fixes:
+* Fixes incorrect number parser for cache options
+
+# [2.5.2](https://github.com/ParsePlatform/parse-server/compare/2.5.1...2.5.2)
+
+#### Improvements:
+* Restores ability to run on node >= 4.6
+* Adds ability to configure cache from CLI
+* Removes runtime check for node >= 4.6
+
+# [2.5.1](https://github.com/ParsePlatform/parse-server/compare/2.5.0...2.5.1)
+
+#### New Features:
+* Adds ability to set default objectId size (#3950), thanks to [Steven Shipton](https://github.com/steven-supersolid)
+
+#### Improvements:
+* Uses LRU cache instead of InMemoryCache by default (#3979), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* iOS pushes are now using HTTP/2.0 instead of binary API (#3983), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Dependency Updates:
+* [parse@1.10.0](https://www.npmjs.com/package/parse)
+* [pg-promise@6.3.0](https://www.npmjs.com/package/pg-promise)
+* [parse-server-s3-adapter@1.1.0](https://www.npmjs.com/package/parse-server-s3-adapter)
+* [parse-server-push-adapter@2.0.0](https://www.npmjs.com/package/parse-server-push-adapter)
+
+# [2.5.0](https://github.com/ParsePlatform/parse-server/compare/2.4.2...2.5.0)
+
+#### New Features:
+* Adds ability to run full text search (#3904), thanks to [Diamond Lewis](https://github.com/dplewis)
+* Adds ability to run `$withinPolygon` queries (#3889), thanks to [Diamond Lewis](https://github.com/dplewis)
+* Adds ability to pass read preference per query with mongodb (#3865), thanks to [davimacedo](https://github.com/davimacedo)
+* beforeFind trigger now includes `isGet` for get queries (#3862), thanks to [davimacedo](https://github.com/davimacedo)
+* Adds endpoints for dashboard's audience API (#3861), thanks to [davimacedo](https://github.com/davimacedo)
+* Restores the job scheduling endpoints (#3927), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Improvements:
+* Removes unnecessary warning when using maxTimeMs with mongodb, thanks to [Tyler Brock](https://github.com/tbrock)
+* Improves access control on system classes (#3916), thanks to [Worathiti Manosroi](https://github.com/pungme)
+* Adds bytes support in postgres (#3894), thanks to [Diamond Lewis](https://github.com/dplewis)
+
+#### Bug Fixes:
+* Fixes issue with vkontakte adapter that would hang the request, thanks to [Denis Trofimov](https://github.com/denistrofimov)
+* Fixes issue affecting null relational data (#3924), thanks to [davimacedo](https://github.com/davimacedo)
+* Fixes issue affecting session token deletion (#3937), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fixes issue affecting the serverInfo endpoint (#3933), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fixes issue affecting beforeSave with dot-noted sub-documents (#3912), thanks to [IlyaDiallo](https://github.com/IlyaDiallo)
+* Fixes issue affecting emails being sent when using a 3rd party auth (#3882), thanks to [davimacedo](https://github.com/davimacedo)
+
+#### Dependency Updates:
+* [commander@2.10.0](https://www.npmjs.com/package/commander)
+* [pg-promise@5.9.7](https://www.npmjs.com/package/pg-promise)
+* [lru-cache@4.1.0](https://www.npmjs.com/package/lru-cache)
+* [mongodb@2.2.28](https://www.npmjs.com/package/mongodb)
+
+##### Development dependencies
+* [babel-core@6.25.0](https://www.npmjs.com/package/babel-core)
+* [cross-env@5.0.1](https://www.npmjs.com/package/cross-env)
+* [nyc@11.0.2](https://www.npmjs.com/package/nyc)
+
+# [2.4.2](https://github.com/ParsePlatform/parse-server/compare/2.4.1...2.4.2)
+
+#### New Features:
+* ParseQuery: Support for withinPolygon [#3866](https://github.com/parse-community/parse-server/pull/3866), thanks to [Diamond Lewis](https://github.com/dplewis)
+
+#### Improvements:
+* Postgres: Use transactions when deleting a class, [#3869](https://github.com/parse-community/parse-server/pull/3836), thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
+* Postgres: Proper support for GeoPoint equality query, [#3874](https://github.com/parse-community/parse-server/pull/3836), thanks to [Diamond Lewis](https://github.com/dplewis)
+* beforeSave and liveQuery will be correctly triggered on email verification [#3851](https://github.com/parse-community/parse-server/pull/3851), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Bug fixes:
+* Skip authData validation if it hasn't changed, on PUT requests [#3872](https://github.com/parse-community/parse-server/pull/3872), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Dependency Updates:
+* [mongodb@2.2.27](https://www.npmjs.com/package/mongodb)
+* [pg-promise@5.7.2](https://www.npmjs.com/package/pg-promise)
+
+
+# [2.4.1](https://github.com/ParsePlatform/parse-server/compare/2.4.0...2.4.1)
+
+#### Bug fixes:
+* Fixes issue affecting relation updates ([#3835](https://github.com/parse-community/parse-server/pull/3835), [#3836](https://github.com/parse-community/parse-server/pull/3836)), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fixes issue affecting sending push notifications, thanks to [Felipe Andrade](https://github.com/felipemobile)
+* Session are always cleared when updating the passwords ([#3289](https://github.com/parse-community/parse-server/pull/3289), [#3821](https://github.com/parse-community/parse-server/pull/3821), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Dependency Updates:
+* [body-parser@1.17.2](https://www.npmjs.com/package/body-parser)
+* [pg-promise@5.7.1](https://www.npmjs.com/package/pg-promise)
+* [ws@3.0.0](https://www.npmjs.com/package/ws)
+
+
+# [2.4.0](https://github.com/ParsePlatform/parse-server/compare/2.3.8...2.4.0)
+
+Starting 2.4.0, parse-server is tested against node 6.10 and 7.10, mongodb 3.2 and 3.4.
+If you experience issues with older versions, please [open a issue](https://github.com/parse-community/parse-server/issues).
+
+#### New Features:
+* Adds `count` Class Level Permission ([#3814](https://github.com/parse-community/parse-server/pull/3814)), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Proper graceful shutdown support ([#3786](https://github.com/parse-community/parse-server/pull/3786)), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Let parse-server store as `scheduled` Push Notifications with push_time (#3717, #3722), thanks to [Felipe Andrade](https://github.com/felipemobile)
+
+#### Improvements
+* Parse-Server images are built through docker hub, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Skip authData validation if it hasn't changed, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* [postgres] Improve performance when adding many new fields to the Schema ([#3740](https://github.com/parse-community/parse-server/pull/3740)), thanks to [Paulo Vítor S Reis](https://github.com/paulovitin)
+* Test maintenance, wordsmithing and nits ([#3744](https://github.com/parse-community/parse-server/pull/3744)), thanks to [Arthur Cinader](https://github.com/acinader)
+
+#### Bug Fixes:
+* [postgres] Fixes issue affecting deleting multiple fields of a Schema ([#3734](https://github.com/parse-community/parse-server/pull/3734), [#3735](https://github.com/parse-community/parse-server/pull/3735)), thanks to [Paulo Vítor S Reis](https://github.com/paulovitin)
+* Fix issue affecting _PushStatus state ([#3808](https://github.com/parse-community/parse-server/pull/3808)), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* requiresAuthentication Class Level Permission behaves correctly, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Email Verification related fields are not exposed ([#3681](https://github.com/parse-community/parse-server/pull/3681), [#3393](https://github.com/parse-community/parse-server/pull/3393), [#3432](https://github.com/parse-community/parse-server/pull/3432)), thanks to [Anthony Mosca](https://github.com/aontas)
+* HTTP query parameters are properly obfuscated in logs ([#3793](https://github.com/parse-community/parse-server/pull/3793), [#3789](https://github.com/parse-community/parse-server/pull/3789)), thanks to [@youngerong](https://github.com/youngerong)
+* Improve handling of `$near` operators in `$or` queries ([#3767](https://github.com/parse-community/parse-server/pull/3767), [#3798](https://github.com/parse-community/parse-server/pull/3798)), thanks to [Jack Wearden](https://github.com/NotBobTheBuilder)
+* Fix issue affecting arrays of pointers ([#3169](https://github.com/parse-community/parse-server/pull/3169)), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix issue affecting overloaded query constraints ([#3723](https://github.com/parse-community/parse-server/pull/3723), [#3678](https://github.com/parse-community/parse-server/pull/3678)), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Properly catch unhandled rejections in _Installation updates ([#3795](https://github.com/parse-community/parse-server/pull/3795)), thanks to [kahoona77](https://github.com/kahoona77)
+
+#### Dependency Updates:
+
+* [uws@0.14.5](https://www.npmjs.com/package/uws)
+* [mime@1.3.6](https://www.npmjs.com/package/mime)
+* [mongodb@2.2.26](https://www.npmjs.com/package/mongodb)
+* [pg-promise@5.7.0](https://www.npmjs.com/package/pg-promise)
+* [semver@5.3.0](https://www.npmjs.com/package/semver)
+
+##### Development dependencies
+* [babel-cli@6.24.1](https://www.npmjs.com/package/babel-cli)
+* [babel-core@6.24.1](https://www.npmjs.com/package/babel-core)
+* [babel-preset-es2015@6.24.1](https://www.npmjs.com/package/babel-preset-es2015)
+* [babel-preset-stage-0@6.24.1](https://www.npmjs.com/package/babel-preset-stage-0)
+* [babel-register@6.24.1](https://www.npmjs.com/package/babel-register)
+* [cross-env@5.0.0](https://www.npmjs.com/package/cross-env)
+* [deep-diff@0.3.8](https://www.npmjs.com/package/deep-diff)
+* [gaze@1.1.2](https://www.npmjs.com/package/gaze)
+* [jasmine@2.6.0](https://www.npmjs.com/package/jasmine)
+* [jasmine-spec-reporter@4.1.0](https://www.npmjs.com/package/jasmine-spec-reporter)
+* [mongodb-runner@3.5.0](https://www.npmjs.com/package/mongodb-runner)
+* [nyc@10.3.2](https://www.npmjs.com/package/nyc)
+* [request-promise@4.2.1](https://www.npmjs.com/package/request-promise)
+
+
+# [2.3.8](https://github.com/ParsePlatform/parse-server/compare/2.3.7...2.3.8)
+
+#### New Features
+* Support for PG-Promise options, thanks to [ren dong](https://github.com/rendongsc)
+
+#### Improvements
+* Improves support for graceful shutdown, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Improves configuration validation for Twitter Authentication, thanks to [Benjamin Wilson Friedman](https://github.com/montymxb)
+
+#### Bug Fixes
+* Fixes issue affecting GeoPoint __type with Postgres, thanks to [zhoul-HS](https://github.com/zhoul-HS)
+* Prevent user creation if username or password is empty, thanks to [Wissam Abirached](https://github.com/wabirached)
+
+#### Dependency Updates:
+* [cross-env@4.0.0 ](https://www.npmjs.com/package/cross-env)
+* [ws@2.2.3](https://www.npmjs.com/package/ws)
+* [babel-core@6.24.0](https://www.npmjs.com/package/babel-core)
+* [uws@0.14.0](https://www.npmjs.com/package/uws)
+* [babel-preset-es2015@6.24.0](https://www.npmjs.com/package/babel-preset-es2015)
+* [babel-plugin-syntax-flow@6.18.0](https://www.npmjs.com/package/babel-plugin-syntax-flow)
+* [babel-cli@6.24.0](https://www.npmjs.com/package/babel-cli)
+* [babel-register@6.24.0](https://www.npmjs.com/package/babel-register)
+* [winston-daily-rotate-file@1.4.6](https://www.npmjs.com/package/winston-daily-rotate-file)
+* [mongodb@2.2.25](https://www.npmjs.com/package/mongodb)
+* [redis@2.7.0](https://www.npmjs.com/package/redis)
+* [pg-promise@5.6.4](https://www.npmjs.com/package/pg-promise)
+* [parse-server-push-adapter@1.3.0](https://www.npmjs.com/package/parse-server-push-adapter)
+
+# [2.3.7](https://github.com/ParsePlatform/parse-server/compare/2.3.6...2.3.7)
+
+#### New Features
+* New endpoint to resend verification email, thanks to [Xy Ziemba](https://github.com/xyziemba)
+
+#### Improvements
+* Add TTL option for Redis Cache Adapter, thanks to [Ryan Foster](https://github.com/f0ster)
+* Update Postgres Storage Adapter, thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
+
+#### Bug Fixes
+* Add index on Role.name, fixes (#3579), thanks to [Natan Rolnik](https://github.com/natanrolnik)
+* Fix default value of userSensitiveFields, fixes (#3593), thanks to [Arthur Cinader](https://github.com/acinader)
+
+#### Dependency Updates:
+* [body-parser@1.17.1](https://www.npmjs.com/package/body-parser)
+* [express@4.15.2](https://www.npmjs.com/package/express)
+* [request@2.81.0](https://www.npmjs.com/package/request)
+* [winston-daily-rotate-file@1.4.5](https://www.npmjs.com/package/winston-daily-rotate-file)
+* [ws@2.2.0](https://www.npmjs.com/package/ws)
+
+
+# [2.3.6](https://github.com/ParsePlatform/parse-server/compare/2.3.5...2.3.6)
+
+#### Improvements
+* Adds support for injecting a middleware for instumentation in the CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Alleviate mongodb bug with $or queries [SERVER-13732](https://jira.mongodb.org/browse/SERVER-13732), thanks to [Jack Wearden](https://github.com/NotBobTheBuilder)
+
+#### Bug Fixes
+* Fix issue affecting password policy and empty passwords, thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
+* Fix issue when logging url in non string objects, thanks to [Paulo Vítor S Reis](https://github.com/paulovitin)
+
+#### Dependencies updates:
+* [ws@2.1.0](https://npmjs.com/package/ws)
+* [uws@0.13.0](https://npmjs.com/package/uws)
+* [pg-promise@5.6.2](https://npmjs.com/package/pg-promise)
+
+
+# [2.3.5](https://github.com/ParsePlatform/parse-server/compare/2.3.3...2.3.5)
+
+#### Bug Fixes
+* Allow empty client key
+(#3497), thanks to [Arthur Cinader](https://github.com/acinader)
+* Fix LiveQuery unsafe user
+(#3525), thanks to [David Starke](https://github.com/dstarke)
+* Use `flushdb` instead of `flushall` in RedisCacheAdapter
+(#3523), thanks to [Jeremy Louie](https://github.com/JeremyPlease)
+* Fix saving GeoPoints and Files in `_GlobalConfig` (Make sure we don't treat
+dot notation keys as topLevel atoms)
+(#3531), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+# [2.3.3](https://github.com/ParsePlatform/parse-server/compare/2.3.2...2.3.3)
+
+##### Breaking Changes
+* **Minimum Node engine bumped to 4.6** (#3480), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Bug Fixes
+* Add logging on failure to create file (#3424), thanks to [Arthur Cinader](https://github.com/acinader)
+* Log Parse Errors so they are intelligible (#3431), thanks to [Arthur Cinader](https://github.com/acinader)
+* MongoDB $or Queries avoid SERVER-13732 bug (#3476), thanks to [Jack Wearden](https://github.com/NotBobTheBuilder)
+* Mongo object to Parse object date serialization - avoid re-serialization of iso of type Date (#3389), thanks to [nodechefMatt](https://github.com/nodechefMatt)
+
+#### Improvements
+* Ground preparations for push scalability (#3080), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Use uWS as optional dependency for ws server (#3231), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+# [2.3.2](https://github.com/ParsePlatform/parse-server/compare/2.3.1...2.3.2)
+
+#### New features
+* Add parseFrameURL for masking user-facing pages (#3267), thanks to [Lenart Rudel](https://github.com/lenart)
+
+#### Bug fixes
+* Fix Parse-Server to work with winston-daily-rotate-1.4.2 (#3335), thanks to [Arthur Cinader](https://github.com/acinader)
+
+#### Improvements
+* Add support for regex string for password policy validatorPattern setting (#3331), thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
+* LiveQuery should match subobjects with dot notation (#3322), thanks to [David Starke](https://github.com/dstarke)
+* Reduce time to process high number of installations for push (#3264), thanks to [jeacott1](https://github.com/jeacott1)
+* Fix trivial typo in error message (#3238), thanks to [Arthur Cinader](https://github.com/acinader)
+
+# [2.3.1](https://github.com/ParsePlatform/parse-server/compare/2.3.0...2.3.1)
+
+A major issue was introduced when refactoring the authentication modules.
+This release addresses only that issue.
+
+# [2.3.0](https://github.com/ParsePlatform/parse-server/compare/2.2.25...2.3.0)
+
+##### Breaking Changes
+* Parse.Cloud.useMasterKey() is a no-op, please refer to (Cloud Code migration guide)[https://github.com/ParsePlatform/parse-server/wiki/Compatibility-with-Hosted-Parse#cloud-code]
+* Authentication helpers are now proper adapters, deprecates oauth option in favor of auth.
+* DEPRECATES: facebookAppIds, use `auth: { facebook: { appIds: ["AAAAAAAAA" ] } }`
+* `email` field is not returned anymore for `Parse.User` queries. (Provided only on the user itself if provided).
+
+#### New Features
+* Adds ability to restrict access through Class Level Permissions to only authenticated users [see docs](http://parseplatform.github.io/docs/ios/guide/#requires-authentication-permission-requires-parse-server---230)
+* Adds ability to strip sensitive data from `_User` responses, strips emails by default, thanks to [Arthur Cinader](https://github.com/acinader)
+* Adds password history support for password policies, thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
+
+#### Improvements
+* Bump parse-server-s3-adapter to 1.0.6, thanks to [Arthur Cinader](https://github.com/acinader)
+* Using PARSE_SERVER_ENABLE_EXPERIMENTAL_DIRECT_ACCESS let you create user sessions when passing {installationId: "xxx-xxx"} on signup in cloud code, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Add CLI option to pass `host` parameter when creating parse-server from CLI, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
+
+#### Bug fixes
+* Ensure batch routes are only using posix paths, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+* Ensure falsy options from CLI are properly taken into account, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+* Fixes issues affecting calls to `matchesKeyInQuery` with pointers.
+* Ensure that `select` keys can be changed in triggers (beforeFind...), thanks to [Arthur Cinader](https://github.com/acinader)
+
+#### Housekeeping
+* Enables and enforces linting with eslint, thanks to [Arthur Cinader](https://github.com/acinader)
+
+### 2.2.25
+
+Postgres support requires v9.5
+
+#### New Features
+* Dockerizing Parse Server, thanks to [Kirill Kravinsky](https://github.com/woyorus)
+* Login with qq, wechat, weibo, thanks to [haifeizhang]()
+* Password policy, validation and expiration, thanks to [Bhaskar Reddy Yasa](https://github.com/bhaskaryasa)
+* Health check on /health, thanks to [Kirill Kravinsky](https://github.com/woyorus)
+* Reuse SchemaCache across requests option, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+
+#### Improvements
+* Better support for CLI options, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+* Specity a database timeout with maxTimeMS, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Adds the username to reset password success pages, thanks to [Halim Qarroum](https://github.com/HQarroum)
+* Better support for Redis cache adapter, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Better coverage of Postgres, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
+
+#### Bug Fixes
+* Fixes issue when sending push to multiple installations, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fixes issues with twitter authentication, thanks to [jonas-db](https://github.com/jonas-db)
+* Ignore createdAt fields update, thanks to [Yuki Takeichi](https://github.com/yuki-takeichi)
+* Improve support for array equality with LiveQuery, thanks to [David Poetzsch-Heffter](https://github.com/dpoetzsch)
+* Improve support for batch endpoint when serverURL and publicServerURL have different paths, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Support saving relation objects, thanks to [Yuki Takeichi](https://github.com/yuki-takeichi)
+
+### 2.2.24
+
+#### New Features
+* LiveQuery: Bring your own adapter (#2902), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* LiveQuery: Adds "update" operator to update a query subscription (#2935), thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Improvements
+* Better Postgres support, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
+* Logs the function name when failing (#2963), thanks to [Michael Helvey](https://github.com/michaelhelvey)
+* CLI: forces closing the connections with SIGINT/SIGTERM (#2964), thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
+* Reduce the number of calls to the `_SCHEMA` table (#2912), thanks to [Steven Shipton](https://github.com/steven-supersolid)
+* LiveQuery: Support for Role ACL's, thanks to [Aaron Blondeau](https://github.com/aaron-blondeau-dose)
+
+#### Bug Fixes
+* Better support for checking application and client keys, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+* Google OAuth, better support for android and web logins, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+### 2.2.23
+
+* Run liveQuery server from CLI with a different port, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Support for Postgres databaseURI, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
+* Support for Postgres options, thanks to [Kulshekhar Kabra](https://github.com/kulshekhar)
+* Improved support for google login (id_token and access_token), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Improvements with VKontakte login, thanks to [Eugene Antropov](https://github.com/antigp)
+* Improved support for `select` and `include`, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Bug fixes
+
+* Fix error when updating installation with useMasterKey (#2888), thanks to [Jeremy Louie](https://github.com/JeremyPlease)
+* Fix bug affecting usage of multiple `notEqualTo`, thanks to [Jeremy Louie](https://github.com/JeremyPlease)
+* Improved support for null values in arrays, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+### 2.2.22
+
+* Minimum nodejs engine is now 4.5
+
+#### New Features
+* New: CLI for parse-live-query-server, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New: Start parse-live-query-server for parse-server CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+#### Bug fixes
+* Fix: Include with pointers are not conflicting with get CLP anymore, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Removes dependency on babel-polyfill, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Support nested select calls, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Use native column selection instead of runtime, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: installationId header is properly used when updating `_Installation` objects, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: don't crash parse-server on improperly formatted live-query messages, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Passwords are properly stripped out of logs, thanks to [Arthur Cinader](https://github.com/acinader)
+* Fix: Lookup for email in username if email is not set, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+### 2.2.21
+
+* Fix: Reverts removal of babel-polyfill
+
+### 2.2.20
+
+* New: Adds CloudCode handler for `beforeFind`, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New: RedisCacheAdapter for syncing schema, role and user caches across servers, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New: Latest master build available at `ParsePlatform/parse-server#latest`, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Better support for upgradeToRevocableSession with missing session token, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Removes babel-polyfill runtime dependency, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Cluster option now support a boolean value for automatically choosing the right number of processes, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Filenames now appear correctly, thanks to [Lama Chandrasena](https://github.com/lama-buddy)
+* Fix: `_acl` is properly updated, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+
+Other fixes by [Mathias Rangel Wulff](https://github.com/mathiasrw)
+
+### 2.2.19
+
+* New: support for upgrading to revocable sessions, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New: NullCacheAdapter for disabling caching, thanks to [Yuki Takeichi](https://github.com/yuki-takeichi)
+* New: Account lockout policy [#2601](https://github.com/ParsePlatform/parse-server/pull/2601), thanks to [Diwakar Cherukumilli](https://github.com/cherukumilli)
+* New: Jobs endpoint for defining and run jobs (no scheduling), thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New: Add --cluster option to the CLI, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New: Support for login with vk.com, thanks to [Nurdaulet Bolatov](https://github.com/nbolatov)
+* New: experimental support for postgres databases, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: parse-server doesn't call next() after successful responses, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Nested objects are properly includeed with Pointer Permissions on, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: null values in include calls are properly handled, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Schema validations now runs after beforeSave hooks, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: usersname and passwords are properly type checked, thanks to [Bam Wang](https://github.com/bamwang)
+* Fix: logging in info log would log also in error log, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: removes extaneous logging from ParseLiveQueryServer, thanks to [Flavio Torres](https://github.com/flavionegrao)
+* Fix: support for Range requests for files, thanks to [Brage G. Staven](https://github.com/Bragegs)
+
+### 2.2.18
+
+* Fix: Improve support for objects in push alert, thanks to [Antoine Lenoir](https://github.com/alenoir)
+* Fix; Prevent pointed from getting clobbered when they are changed in a beforeSave, thanks to [sud](https://github.com/sud80)
+* Fix: Improve support for "Bytes" type, thanks to [CongHoang](https://github.com/conghoang)
+* Fix: Better logging compatability with Parse.com, thanks to [Arthur Cinader](https://github.com/acinader)
+* New: Add Janrain Capture and Janrain Engage auth provider, thanks to [Andrew Lane](https://github.com/AndrewLane)
+* Improved: Include content length header in files response, thanks to [Steven Van Bael](https://github.com/vbsteven)
+* Improved: Support byte range header for files, thanks to [Brage G. Staven](https://github.com/Bragegs)
+* Improved: Validations for LinkedIn access_tokens, thanks to [Felix Dumit](https://github.com/felix-dumit)
+* Improved: Experimental postgres support, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Perf: Use native bcrypt implementation if available, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+
+# [2.2.17](https://github.com/ParsePlatform/parse-server/compare/2.2.16...2.2.17)
+
+* Cloud code logs [\#2370](https://github.com/ParsePlatform/parse-server/pull/2370) ([flovilmart](https://github.com/flovilmart))
+* Make sure \_PushStatus operations are run in order [\#2367](https://github.com/ParsePlatform/parse-server/pull/2367) ([flovilmart](https://github.com/flovilmart))
+* Typo fix for error message when can't ensure uniqueness of user email addresses [\#2360](https://github.com/ParsePlatform/parse-server/pull/2360) ([AndrewLane](https://github.com/AndrewLane))
+* LiveQuery constrains matching fix [\#2357](https://github.com/ParsePlatform/parse-server/pull/2357) ([simonas-notcat](https://github.com/simonas-notcat))
+* Fix typo in logging for commander parseConfigFile [\#2352](https://github.com/ParsePlatform/parse-server/pull/2352) ([AndrewLane](https://github.com/AndrewLane))
+* Fix minor typos in test names [\#2351](https://github.com/ParsePlatform/parse-server/pull/2351) ([acinader](https://github.com/acinader))
+* Makes sure we don't strip authData or session token from users using masterKey [\#2348](https://github.com/ParsePlatform/parse-server/pull/2348) ([flovilmart](https://github.com/flovilmart))
+* Run coverage with istanbul [\#2340](https://github.com/ParsePlatform/parse-server/pull/2340) ([flovilmart](https://github.com/flovilmart))
+* Run next\(\) after successfully sending data to the client [\#2338](https://github.com/ParsePlatform/parse-server/pull/2338) ([blacha](https://github.com/blacha))
+* Cache all the mongodb/version folder [\#2336](https://github.com/ParsePlatform/parse-server/pull/2336) ([flovilmart](https://github.com/flovilmart))
+* updates usage of setting: emailVerifyTokenValidityDuration [\#2331](https://github.com/ParsePlatform/parse-server/pull/2331) ([cherukumilli](https://github.com/cherukumilli))
+* Update Mongodb client to 2.2.4 [\#2329](https://github.com/ParsePlatform/parse-server/pull/2329) ([flovilmart](https://github.com/flovilmart))
+* Allow usage of analytics adapter [\#2327](https://github.com/ParsePlatform/parse-server/pull/2327) ([deashay](https://github.com/deashay))
+* Fix flaky tests [\#2324](https://github.com/ParsePlatform/parse-server/pull/2324) ([flovilmart](https://github.com/flovilmart))
+* don't serve null authData values [\#2320](https://github.com/ParsePlatform/parse-server/pull/2320) ([yuzeh](https://github.com/yuzeh))
+* Fix null relation problem [\#2319](https://github.com/ParsePlatform/parse-server/pull/2319) ([flovilmart](https://github.com/flovilmart))
+* Clear the connectionPromise upon close or error [\#2314](https://github.com/ParsePlatform/parse-server/pull/2314) ([flovilmart](https://github.com/flovilmart))
+* Report validation errors with correct error code [\#2299](https://github.com/ParsePlatform/parse-server/pull/2299) ([flovilmart](https://github.com/flovilmart))
+* Parses correctly Parse.Files and Dates when sent to Cloud Code Functions [\#2297](https://github.com/ParsePlatform/parse-server/pull/2297) ([flovilmart](https://github.com/flovilmart))
+* Adding proper generic Not Implemented. [\#2292](https://github.com/ParsePlatform/parse-server/pull/2292) ([vitaly-t](https://github.com/vitaly-t))
+* Adds schema caching capabilities \(5s by default\) [\#2286](https://github.com/ParsePlatform/parse-server/pull/2286) ([flovilmart](https://github.com/flovilmart))
+* add digits oauth provider [\#2284](https://github.com/ParsePlatform/parse-server/pull/2284) ([ranhsd](https://github.com/ranhsd))
+* Improve installations query [\#2281](https://github.com/ParsePlatform/parse-server/pull/2281) ([flovilmart](https://github.com/flovilmart))
+* Adding request headers to cloud functions fixes \#1461 [\#2274](https://github.com/ParsePlatform/parse-server/pull/2274) ([blacha](https://github.com/blacha))
+* Creates a new sessionToken when updating password [\#2266](https://github.com/ParsePlatform/parse-server/pull/2266) ([flovilmart](https://github.com/flovilmart))
+* Add Gitter chat link to the README. [\#2264](https://github.com/ParsePlatform/parse-server/pull/2264) ([nlutsenko](https://github.com/nlutsenko))
+* Restores ability to include non pointer keys [\#2263](https://github.com/ParsePlatform/parse-server/pull/2263) ([flovilmart](https://github.com/flovilmart))
+* Allow next middleware handle error in handleParseErrors [\#2260](https://github.com/ParsePlatform/parse-server/pull/2260) ([mejcz](https://github.com/mejcz))
+* Exposes the ClientSDK infos if available [\#2259](https://github.com/ParsePlatform/parse-server/pull/2259) ([flovilmart](https://github.com/flovilmart))
+* Adds support for multiple twitter auths options [\#2256](https://github.com/ParsePlatform/parse-server/pull/2256) ([flovilmart](https://github.com/flovilmart))
+* validate\_purchase fix for SANDBOX requests [\#2253](https://github.com/ParsePlatform/parse-server/pull/2253) ([valeryvaskabovich](https://github.com/valeryvaskabovich))
+
+### 2.2.16
+
+* New: Expose InMemoryCacheAdapter publicly, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+* New: Add ability to prevent login with unverified email, thanks to [Diwakar Cherukumilli](https://github.com/cherukumilli)
+* Improved: Better error message for incorrect type, thanks to [Andrew Lane](https://github.com/AndrewLane)
+* Improved: Better error message for permission denied, thanks to [Blayne Chard](https://github.com/blacha)
+* Improved: Update authData on login, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Improved: Ability to not check for old files on Parse.com, thanks to [OzgeAkin](https://github.com/OzgeAkin)
+* Fix: Issues with email adapter validation, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Fix: Issues with nested $or queries, thanks to [Florent Vilmart](https://github.com/flovilmart)
+
+### 2.2.15
+
+* Fix: Type in description for Parse.Error.INVALID_QUERY, thanks to [Andrew Lane](https://github.com/AndrewLane)
+* Improvement: Stop requiring verifyUserEmails for password reset functionality, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Improvement: Kill without validation, thanks to [Drew Gross](https://github.com/drew-gross)
+* Fix: Deleting a file does not delete from fs.files, thanks to [David Keita](https://github.com/maninga)
+* Fix: Postgres stoage adapter fix, thanks to [Vitaly Tomilov](https://github.com/vitaly-t)
+* Fix: Results invalid session when providing an invalid session token, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: issue creating an anonymous user, thanks to [Hussam Moqhim](https://github.com/hmoqhim)
+* Fix: make http response serializable, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* New: Add postmark email adapter alternative [Glenn Reyes](https://github.com/glennreyes)
+
+### 2.2.14
+
+* Hotfix: Fix Parse.Cloud.HTTPResponse serialization
+
+### 2.2.13
+
+* Hotfix: Pin version of deepcopy
+
+### 2.2.12
+
+* New: Custom error codes in cloud code response.error, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
+* Fix: Crash in beforeSave when response is not an object, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Fix: Allow "get" on installations
+* Fix: Fix overly restrictive Class Level Permissions, thanks to [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Fix nested date parsing in Cloud Code, thanks to [Marco Cheung](https://github.com/Marco129)
+* Fix: Support very old file formats from Parse.com
+
+### 2.2.11
+
+* Security: Censor user password in logs, thanks to [Marco Cheung](https://github.com/Marco129)
+* New: Add PARSE_SERVER_LOGS_FOLDER env var for setting log folder, thanks to [KartikeyaRokde](https://github.com/KartikeyaRokde)
+* New: Webhook key support, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Perf: Add cache adapter and default caching of certain objects, thanks to [Blayne Chard](https://github.com/blacha)
+* Improvement: Better error messages for schema type mismatches, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
+* Improvement: Better error messages for reset password emails
+* Improvement: Webhook key support in CLI, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Fix: Remove read only fields when using beforeSave, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Fix: Use content type provided by JS SDK, thanks to [Blayne Chard](https://github.com/blacha) and [Florent Vilmart](https://github.com/flovilmart)
+* Fix: Tell the dashboard the stored push data is available, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
+* Fix: Add support for HTTP Basic Auth, thanks to [Hussam Moqhim](https://github.com/hmoqhim)
+* Fix: Support for MongoDB version 3.2.6, (note: do not use MongoDB 3.2 with migrated apps that still have traffic on Parse.com), thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Fix: Prevent `pm2` from crashing when push notifications fail, thanks to [benishak](https://github.com/benishak)
+* Fix: Add full list of default _Installation fields, thanks to [Jeremy Pease](https://github.com/JeremyPlease)
+* Fix: Strip objectId out of hooks responses, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Fix: Fix external webhook response format, thanks to [Tyler Brock](https://github.com/TylerBrock)
+* Fix: Fix beforeSave when object is passed to `success`, thanks to [Madhav Bhagat](https://github.com/codebreach)
+* Fix: Remove use of deprecated APIs, thanks to [Emad Ehsan](https://github.com/emadehsan)
+* Fix: Crash when multiple Parse Servers on the same machine try to write to the same logs folder, thanks to [Steven Shipton](https://github.com/steven-supersolid)
+* Fix: Various issues with key names in `Parse.Object`s
+* Fix: Treat Bytes type properly
+* Fix: Caching bugs that caused writes by masterKey or other session token to not show up to users reading with a different session token
+* Fix: Pin mongo driver version, preventing a regression in version 2.1.19
+* Fix: Various issues with pointer fields not being treated properly
+* Fix: Issues with pointed getting un-fetched due to changes in beforeSave
+* Fix: Fixed crash when deleting classes that have CLPs
+
+### 2.2.10
+
+* Fix: Write legacy ACLs to Mongo so that clients that still go through Parse.com can read them, thanks to [Tyler Brock](https://github.com/TylerBrock) and [carmenlau](https://github.com/carmenlau)
+* Fix: Querying installations with limit = 0 and count = 1 now works, thanks to [ssk7833](https://github.com/ssk7833)
+* Fix: Return correct error when violating unique index, thanks to [Marco Cheung](https://github.com/Marco129)
+* Fix: Allow unsetting user's email, thanks to [Marco Cheung](https://github.com/Marco129)
+* New: Support for Node 6.1
+
+### 2.2.9
+
+* Fix: Fix a regression that caused Parse Server to crash when a null parameter is passed to a Cloud function
+
+### 2.2.8
+
+* New: Support for Pointer Permissions
+* New: Expose logger in Cloud Code
+* New: Option to revoke sessions on password reset
+* New: Option to expire inactive sessions
+* Perf: Improvements in ACL checking query
+* Fix: Issues when sending pushes to list of devices that contains invalid values
+* Fix: Issues caused by using babel-polyfill outside of Parse Server, but in the same express app
+* Fix: Remove creation of extra session tokens
+* Fix: Return authData when querying with master key
+* Fix: Bugs when deleting webhooks
+* Fix: Ignore _RevocableSession header, which might be sent by the JS SDK
+* Fix: Issues with querying via URL params
+* Fix: Properly encode "Date" parameters to cloud code functions
+
+
+### 2.2.7
+
+* Adds support for --verbose and verbose option when running ParseServer [\#1414](https://github.com/ParsePlatform/parse-server/pull/1414) ([flovilmart](https://github.com/flovilmart))
+* Adds limit = 0 as a valid parameter for queries [\#1493](https://github.com/ParsePlatform/parse-server/pull/1493) ([seijiakiyama](https://github.com/seijiakiyama))
+* Makes sure we preserve Installations when updating a token \(\#1475\) [\#1486](https://github.com/ParsePlatform/parse-server/pull/1486) ([flovilmart](https://github.com/flovilmart))
+* Hotfix for tests [\#1503](https://github.com/ParsePlatform/parse-server/pull/1503) ([flovilmart](https://github.com/flovilmart))
+* Enable logs [\#1502](https://github.com/ParsePlatform/parse-server/pull/1502) ([drew-gross](https://github.com/drew-gross))
+* Do some triple equals for great justice [\#1499](https://github.com/ParsePlatform/parse-server/pull/1499) ([TylerBrock](https://github.com/TylerBrock))
+* Apply credential stripping to all untransforms for \_User [\#1498](https://github.com/ParsePlatform/parse-server/pull/1498) ([TylerBrock](https://github.com/TylerBrock))
+* Checking if object has defined key for Pointer constraints in liveQuery [\#1487](https://github.com/ParsePlatform/parse-server/pull/1487) ([simonas-notcat](https://github.com/simonas-notcat))
+* Remove collection prefix and default mongo URI [\#1479](https://github.com/ParsePlatform/parse-server/pull/1479) ([drew-gross](https://github.com/drew-gross))
+* Store collection prefix in mongo adapter, and clean up adapter interface [\#1472](https://github.com/ParsePlatform/parse-server/pull/1472) ([drew-gross](https://github.com/drew-gross))
+* Move field deletion logic into mongo adapter [\#1471](https://github.com/ParsePlatform/parse-server/pull/1471) ([drew-gross](https://github.com/drew-gross))
+* Adds support for Long and Double mongodb types \(fixes \#1316\) [\#1470](https://github.com/ParsePlatform/parse-server/pull/1470) ([flovilmart](https://github.com/flovilmart))
+* Schema.js database agnostic [\#1468](https://github.com/ParsePlatform/parse-server/pull/1468) ([flovilmart](https://github.com/flovilmart))
+* Remove console.log [\#1465](https://github.com/ParsePlatform/parse-server/pull/1465) ([drew-gross](https://github.com/drew-gross))
+* Push status nits [\#1462](https://github.com/ParsePlatform/parse-server/pull/1462) ([flovilmart](https://github.com/flovilmart))
+* Fixes \#1444 [\#1451](https://github.com/ParsePlatform/parse-server/pull/1451) ([flovilmart](https://github.com/flovilmart))
+* Removing sessionToken and authData from \_User objects included in a query [\#1450](https://github.com/ParsePlatform/parse-server/pull/1450) ([simonas-notcat](https://github.com/simonas-notcat))
+* Move mongo field type logic into mongoadapter [\#1432](https://github.com/ParsePlatform/parse-server/pull/1432) ([drew-gross](https://github.com/drew-gross))
+* Prevents \_User lock out when setting ACL on signup or afterwards [\#1429](https://github.com/ParsePlatform/parse-server/pull/1429) ([flovilmart](https://github.com/flovilmart))
+* Update .travis.yml [\#1428](https://github.com/ParsePlatform/parse-server/pull/1428) ([flovilmart](https://github.com/flovilmart))
+* Adds relation fields to objects [\#1424](https://github.com/ParsePlatform/parse-server/pull/1424) ([flovilmart](https://github.com/flovilmart))
+* Update .travis.yml [\#1423](https://github.com/ParsePlatform/parse-server/pull/1423) ([flovilmart](https://github.com/flovilmart))
+* Sets the defaultSchemas keys in the SchemaCollection [\#1421](https://github.com/ParsePlatform/parse-server/pull/1421) ([flovilmart](https://github.com/flovilmart))
+* Fixes \#1417 [\#1420](https://github.com/ParsePlatform/parse-server/pull/1420) ([drew-gross](https://github.com/drew-gross))
+* Untransform should treat Array's as nested objects [\#1416](https://github.com/ParsePlatform/parse-server/pull/1416) ([blacha](https://github.com/blacha))
+* Adds X-Parse-Push-Status-Id header [\#1412](https://github.com/ParsePlatform/parse-server/pull/1412) ([flovilmart](https://github.com/flovilmart))
+* Schema format cleanup [\#1407](https://github.com/ParsePlatform/parse-server/pull/1407) ([drew-gross](https://github.com/drew-gross))
+* Updates the publicServerURL option [\#1397](https://github.com/ParsePlatform/parse-server/pull/1397) ([flovilmart](https://github.com/flovilmart))
+* Fix exception with non-expiring session tokens. [\#1386](https://github.com/ParsePlatform/parse-server/pull/1386) ([0x18B2EE](https://github.com/0x18B2EE))
+* Move mongo schema format related logic into mongo adapter [\#1385](https://github.com/ParsePlatform/parse-server/pull/1385) ([drew-gross](https://github.com/drew-gross))
+* WIP: Huge performance improvement on roles queries [\#1383](https://github.com/ParsePlatform/parse-server/pull/1383) ([flovilmart](https://github.com/flovilmart))
+* Removes GCS Adapter from provided adapters [\#1339](https://github.com/ParsePlatform/parse-server/pull/1339) ([flovilmart](https://github.com/flovilmart))
+* DBController refactoring [\#1228](https://github.com/ParsePlatform/parse-server/pull/1228) ([flovilmart](https://github.com/flovilmart))
+* Spotify authentication [\#1226](https://github.com/ParsePlatform/parse-server/pull/1226) ([1nput0utput](https://github.com/1nput0utput))
+* Expose DatabaseAdapter to simplify application tests [\#1121](https://github.com/ParsePlatform/parse-server/pull/1121) ([steven-supersolid](https://github.com/steven-supersolid))
+
+### 2.2.6
+
+* Important Fix: Disables find on installation from clients [\#1374](https://github.com/ParsePlatform/parse-server/pull/1374) ([flovilmart](https://github.com/flovilmart))
+* Adds missing options to the CLI [\#1368](https://github.com/ParsePlatform/parse-server/pull/1368) ([flovilmart](https://github.com/flovilmart))
+* Removes only master on travis [\#1367](https://github.com/ParsePlatform/parse-server/pull/1367) ([flovilmart](https://github.com/flovilmart))
+* Auth.\_loadRoles should not query the same role twice. [\#1366](https://github.com/ParsePlatform/parse-server/pull/1366) ([blacha](https://github.com/blacha))
+
+### 2.2.5
+
+* Improves config loading and tests [\#1363](https://github.com/ParsePlatform/parse-server/pull/1363) ([flovilmart](https://github.com/flovilmart))
+* Adds travis configuration to deploy NPM on new version tags [\#1361](https://github.com/ParsePlatform/parse-server/pull/1361) ([gfosco](https://github.com/gfosco))
+* Inject the default schemas properties when loading it [\#1357](https://github.com/ParsePlatform/parse-server/pull/1357) ([flovilmart](https://github.com/flovilmart))
+* Adds console transport when testing with VERBOSE=1 [\#1351](https://github.com/ParsePlatform/parse-server/pull/1351) ([flovilmart](https://github.com/flovilmart))
+* Make notEqual work on relations [\#1350](https://github.com/ParsePlatform/parse-server/pull/1350) ([flovilmart](https://github.com/flovilmart))
+* Accept only bool for $exists in LiveQuery [\#1315](https://github.com/ParsePlatform/parse-server/pull/1315) ([drew-gross](https://github.com/drew-gross))
+* Adds more options when using CLI/config [\#1305](https://github.com/ParsePlatform/parse-server/pull/1305) ([flovilmart](https://github.com/flovilmart))
+* Update error message [\#1297](https://github.com/ParsePlatform/parse-server/pull/1297) ([drew-gross](https://github.com/drew-gross))
+* Properly let masterKey add fields [\#1291](https://github.com/ParsePlatform/parse-server/pull/1291) ([flovilmart](https://github.com/flovilmart))
+* Point to \#1271 as how to write a good issue report [\#1290](https://github.com/ParsePlatform/parse-server/pull/1290) ([drew-gross](https://github.com/drew-gross))
+* Adds ability to override mount with publicServerURL for production uses [\#1287](https://github.com/ParsePlatform/parse-server/pull/1287) ([flovilmart](https://github.com/flovilmart))
+* Single object queries to use include and keys [\#1280](https://github.com/ParsePlatform/parse-server/pull/1280) ([jeremyjackson89](https://github.com/jeremyjackson89))
+* Improves report for Push error in logs and \_PushStatus [\#1269](https://github.com/ParsePlatform/parse-server/pull/1269) ([flovilmart](https://github.com/flovilmart))
+* Removes all stdout/err logs while testing [\#1268](https://github.com/ParsePlatform/parse-server/pull/1268) ([flovilmart](https://github.com/flovilmart))
+* Matching queries with doesNotExist constraint [\#1250](https://github.com/ParsePlatform/parse-server/pull/1250) ([andrecardoso](https://github.com/andrecardoso))
+* Added session length option for session tokens to server configuration [\#997](https://github.com/ParsePlatform/parse-server/pull/997) ([Kenishi](https://github.com/Kenishi))
+* Regression test for \#1259 [\#1286](https://github.com/ParsePlatform/parse-server/pull/1286) ([drew-gross](https://github.com/drew-gross))
+* Regression test for \#871 [\#1283](https://github.com/ParsePlatform/parse-server/pull/1283) ([drew-gross](https://github.com/drew-gross))
+* Add a test to repro \#701 [\#1281](https://github.com/ParsePlatform/parse-server/pull/1281) ([drew-gross](https://github.com/drew-gross))
+* Fix for \#1334: using relative cloud code files broken [\#1353](https://github.com/ParsePlatform/parse-server/pull/1353) ([airdrummingfool](https://github.com/airdrummingfool))
+* Fix Issue/1288 [\#1346](https://github.com/ParsePlatform/parse-server/pull/1346) ([flovilmart](https://github.com/flovilmart))
+* Fixes \#1271 [\#1295](https://github.com/ParsePlatform/parse-server/pull/1295) ([drew-gross](https://github.com/drew-gross))
+* Fixes issue \#1302 [\#1314](https://github.com/ParsePlatform/parse-server/pull/1314) ([flovilmart](https://github.com/flovilmart))
+* Fixes bug related to include in queries [\#1312](https://github.com/ParsePlatform/parse-server/pull/1312) ([flovilmart](https://github.com/flovilmart))
+
+
+### 2.2.4
+
+* Hotfix: fixed imports issue for S3Adapter, GCSAdapter, FileSystemAdapter [\#1263](https://github.com/ParsePlatform/parse-server/pull/1263) ([drew-gross](https://github.com/drew-gross)
+* Fix: Clean null authData values on _User update [\#1199](https://github.com/ParsePlatform/parse-server/pull/1199) ([yuzeh](https://github.com/yuzeh))
+
+### 2.2.3
+
+* Fixed bug with invalid email verification link on email update. [\#1253](https://github.com/ParsePlatform/parse-server/pull/1253) ([kzielonka](https://github.com/kzielonka))
+* Badge update supports increment as well as Increment [\#1248](https://github.com/ParsePlatform/parse-server/pull/1248) ([flovilmart](https://github.com/flovilmart))
+* Config/Push Tested with the dashboard. [\#1235](https://github.com/ParsePlatform/parse-server/pull/1235) ([drew-gross](https://github.com/drew-gross))
+* Better logging with winston [\#1234](https://github.com/ParsePlatform/parse-server/pull/1234) ([flovilmart](https://github.com/flovilmart))
+* Make GlobalConfig work like parse.com [\#1210](https://github.com/ParsePlatform/parse-server/pull/1210) ([framp](https://github.com/framp))
+* Improve flattening of results from pushAdapter [\#1204](https://github.com/ParsePlatform/parse-server/pull/1204) ([flovilmart](https://github.com/flovilmart))
+* Push adapters are provided by external packages [\#1195](https://github.com/ParsePlatform/parse-server/pull/1195) ([flovilmart](https://github.com/flovilmart))
+* Fix flaky test [\#1188](https://github.com/ParsePlatform/parse-server/pull/1188) ([drew-gross](https://github.com/drew-gross))
+* Fixes problem affecting finding array pointers [\#1185](https://github.com/ParsePlatform/parse-server/pull/1185) ([flovilmart](https://github.com/flovilmart))
+* Moves Files adapters to external packages [\#1172](https://github.com/ParsePlatform/parse-server/pull/1172) ([flovilmart](https://github.com/flovilmart))
+* Mark push as enabled in serverInfo endpoint [\#1164](https://github.com/ParsePlatform/parse-server/pull/1164) ([drew-gross](https://github.com/drew-gross))
+* Document email adapter [\#1144](https://github.com/ParsePlatform/parse-server/pull/1144) ([drew-gross](https://github.com/drew-gross))
+* Reset password fix [\#1133](https://github.com/ParsePlatform/parse-server/pull/1133) ([carmenlau](https://github.com/carmenlau))
+
+### 2.2.2
+
+* Important Fix: Mounts createLiveQueryServer, fix babel induced problem [\#1153](https://github.com/ParsePlatform/parse-server/pull/1153) (flovilmart)
+* Move ParseServer to it's own file [\#1166](https://github.com/ParsePlatform/parse-server/pull/1166) (flovilmart)
+* Update README.md * remove deploy buttons * replace with community links [\#1139](https://github.com/ParsePlatform/parse-server/pull/1139) (drew-gross)
+* Adds bootstrap.sh [\#1138](https://github.com/ParsePlatform/parse-server/pull/1138) (flovilmart)
+* Fix: Do not override username [\#1142](https://github.com/ParsePlatform/parse-server/pull/1142) (flovilmart)
+* Fix: Add pushId back to GCM payload [\#1168](https://github.com/ParsePlatform/parse-server/pull/1168) (wangmengyan95)
+
+### 2.2.1
+
+* New: Add FileSystemAdapter file adapter [\#1098](https://github.com/ParsePlatform/parse-server/pull/1098) (dtsolis)
+* New: Enabled CLP editing [\#1128](https://github.com/ParsePlatform/parse-server/pull/1128) (drew-gross)
+* Improvement: Reduces the number of connections to mongo created [\#1111](https://github.com/ParsePlatform/parse-server/pull/1111) (flovilmart)
+* Improvement: Make ParseServer a class [\#980](https://github.com/ParsePlatform/parse-server/pull/980) (flovilmart)
+* Fix: Adds support for plain object in $add, $addUnique, $remove [\#1114](https://github.com/ParsePlatform/parse-server/pull/1114) (flovilmart)
+* Fix: Generates default CLP, freezes objects [\#1132](https://github.com/ParsePlatform/parse-server/pull/1132) (flovilmart)
+* Fix: Properly sets installationId on creating session with 3rd party auth [\#1110](https://github.com/ParsePlatform/parse-server/pull/1110) (flovilmart)
+
+### 2.2.0
+
+* New Feature: Real-time functionality with Live Queries! [\#1092](https://github.com/ParsePlatform/parse-server/pull/1092) (wangmengyan95)
+* Improvement: Push Status API [\#1004](https://github.com/ParsePlatform/parse-server/pull/1004) (flovilmart)
+* Improvement: Allow client operations on Roles [\#1068](https://github.com/ParsePlatform/parse-server/pull/1068) (flovilmart)
+* Improvement: Add URI encoding to mongo auth parameters [\#986](https://github.com/ParsePlatform/parse-server/pull/986) (bgw)
+* Improvement: Adds support for apps key in config file, but only support single app for now [\#979](https://github.com/ParsePlatform/parse-server/pull/979) (flovilmart)
+* Documentation: Getting Started and Configuring Parse Server [\#988](https://github.com/ParsePlatform/parse-server/pull/988) (hramos)
+* Fix: Various edge cases with REST API [\#1066](https://github.com/ParsePlatform/parse-server/pull/1066) (flovilmart)
+* Fix: Makes sure the location in results has the proper objectId [\#1065](https://github.com/ParsePlatform/parse-server/pull/1065) (flovilmart)
+* Fix: Third-party auth is properly removed when unlinked [\#1081](https://github.com/ParsePlatform/parse-server/pull/1081) (flovilmart)
+* Fix: Clear the session-user cache when changing \_User objects [\#1072](https://github.com/ParsePlatform/parse-server/pull/1072) (gfosco)
+* Fix: Bug related to subqueries on unfetched objects [\#1046](https://github.com/ParsePlatform/parse-server/pull/1046) (flovilmart)
+* Fix: Properly urlencode parameters for email validation and password reset [\#1001](https://github.com/ParsePlatform/parse-server/pull/1001) (flovilmart)
+* Fix: Better sanitization/decoding of object data for afterSave triggers [\#992](https://github.com/ParsePlatform/parse-server/pull/992) (flovilmart)
+* Fix: Changes default encoding for httpRequest [\#892](https://github.com/ParsePlatform/parse-server/pull/892) (flovilmart)
+
+### 2.1.6
+
+* Improvement: Full query support for badge Increment \(\#931\) [\#983](https://github.com/ParsePlatform/parse-server/pull/983) (flovilmart)
+* Improvement: Shutdown standalone parse server gracefully [\#958](https://github.com/ParsePlatform/parse-server/pull/958) (raulr)
+* Improvement: Add database options to ParseServer constructor and pass to MongoStorageAdapter [\#956](https://github.com/ParsePlatform/parse-server/pull/956) (steven-supersolid)
+* Improvement: AuthData logic refactor [\#952](https://github.com/ParsePlatform/parse-server/pull/952) (flovilmart)
+* Improvement: Changed FileLoggerAdapterSpec to fail gracefully on Windows [\#946](https://github.com/ParsePlatform/parse-server/pull/946) (aneeshd16)
+* Improvement: Add new schema collection type and replace all usages of direct mongo collection for schema operations. [\#943](https://github.com/ParsePlatform/parse-server/pull/943) (nlutsenko)
+* Improvement: Adds CLP API to Schema router [\#898](https://github.com/ParsePlatform/parse-server/pull/898) (flovilmart)
+* Fix: Cleans up authData null keys on login for android crash [\#978](https://github.com/ParsePlatform/parse-server/pull/978) (flovilmart)
+* Fix: Do master query for before/afterSaveHook [\#959](https://github.com/ParsePlatform/parse-server/pull/959) (wangmengyan95)
+* Fix: re-add shebang [\#944](https://github.com/ParsePlatform/parse-server/pull/944) (flovilmart)
+* Fix: Added test command for Windows support [\#886](https://github.com/ParsePlatform/parse-server/pull/886) (aneeshd16)
+
+### 2.1.5
+
+* New: FileAdapter for Google Cloud Storage [\#708](https://github.com/ParsePlatform/parse-server/pull/708) (mcdonamp)
+* Improvement: Minimize extra schema queries in some scenarios. [\#919](https://github.com/ParsePlatform/parse-server/pull/919) (Marco129)
+* Improvement: Move DatabaseController and Schema fully to adaptive mongo collection. [\#909](https://github.com/ParsePlatform/parse-server/pull/909) (nlutsenko)
+* Improvement: Cleanup PushController/PushRouter, remove raw mongo collection access. [\#903](https://github.com/ParsePlatform/parse-server/pull/903) (nlutsenko)
+* Improvement: Increment badge the right way [\#902](https://github.com/ParsePlatform/parse-server/pull/902) (flovilmart)
+* Improvement: Migrate ParseGlobalConfig to new database storage API. [\#901](https://github.com/ParsePlatform/parse-server/pull/901) (nlutsenko)
+* Improvement: Improve delete flow for non-existent \_Join collection [\#881](https://github.com/ParsePlatform/parse-server/pull/881) (Marco129)
+* Improvement: Adding a role scenario test for issue 827 [\#878](https://github.com/ParsePlatform/parse-server/pull/878) (gfosco)
+* Improvement: Test empty authData block on login for \#413 [\#863](https://github.com/ParsePlatform/parse-server/pull/863) (gfosco)
+* Improvement: Modified the npm dev script to support Windows [\#846](https://github.com/ParsePlatform/parse-server/pull/846) (aneeshd16)
+* Improvement: Move HooksController to use MongoCollection instead of direct Mongo access. [\#844](https://github.com/ParsePlatform/parse-server/pull/844) (nlutsenko)
+* Improvement: Adds public\_html and views for packaging [\#839](https://github.com/ParsePlatform/parse-server/pull/839) (flovilmart)
+* Improvement: Better support for windows builds [\#831](https://github.com/ParsePlatform/parse-server/pull/831) (flovilmart)
+* Improvement: Convert Schema.js to ES6 class. [\#826](https://github.com/ParsePlatform/parse-server/pull/826) (nlutsenko)
+* Improvement: Remove duplicated instructions [\#816](https://github.com/ParsePlatform/parse-server/pull/816) (hramos)
+* Improvement: Completely migrate SchemasRouter to new MongoCollection API. [\#794](https://github.com/ParsePlatform/parse-server/pull/794) (nlutsenko)
+* Fix: Do not require where clause in $dontSelect condition on queries. [\#925](https://github.com/ParsePlatform/parse-server/pull/925) (nlutsenko)
+* Fix: Make sure that ACLs propagate to before/after save hooks. [\#924](https://github.com/ParsePlatform/parse-server/pull/924) (nlutsenko)
+* Fix: Support params option in Parse.Cloud.httpRequest. [\#912](https://github.com/ParsePlatform/parse-server/pull/912) (carmenlau)
+* Fix: Fix flaky Parse.GeoPoint test. [\#908](https://github.com/ParsePlatform/parse-server/pull/908) (nlutsenko)
+* Fix: Handle legacy \_client\_permissions key in \_SCHEMA. [\#900](https://github.com/ParsePlatform/parse-server/pull/900) (drew-gross)
+* Fix: Fixes bug when querying equalTo on objectId and relation [\#887](https://github.com/ParsePlatform/parse-server/pull/887) (flovilmart)
+* Fix: Allow crossdomain on filesRouter [\#876](https://github.com/ParsePlatform/parse-server/pull/876) (flovilmart)
+* Fix: Remove limit when counting results. [\#867](https://github.com/ParsePlatform/parse-server/pull/867) (gfosco)
+* Fix: beforeSave changes should propagate to the response [\#865](https://github.com/ParsePlatform/parse-server/pull/865) (gfosco)
+* Fix: Delete relation field when \_Join collection not exist [\#864](https://github.com/ParsePlatform/parse-server/pull/864) (Marco129)
+* Fix: Related query on non-existing column [\#861](https://github.com/ParsePlatform/parse-server/pull/861) (gfosco)
+* Fix: Update markdown in .github/ISSUE\_TEMPLATE.md [\#859](https://github.com/ParsePlatform/parse-server/pull/859) (igorshubovych)
+* Fix: Issue with creating wrong \_Session for Facebook login [\#857](https://github.com/ParsePlatform/parse-server/pull/857) (tobernguyen)
+* Fix: Leak warnings in tests, use mongodb-runner from node\_modules [\#843](https://github.com/ParsePlatform/parse-server/pull/843) (drew-gross)
+* Fix: Reversed roles lookup [\#841](https://github.com/ParsePlatform/parse-server/pull/841) (flovilmart)
+* Fix: Improves loading of Push Adapter, fix loading of S3Adapter [\#833](https://github.com/ParsePlatform/parse-server/pull/833) (flovilmart)
+* Fix: Add field to system schema [\#828](https://github.com/ParsePlatform/parse-server/pull/828) (Marco129)
+
+### 2.1.4
+
+* New: serverInfo endpoint that returns server version and info about the server's features
+* Improvement: Add support for badges on iOS
+* Improvement: Improve failure handling in cloud code http requests
+* Improvement: Add support for queries on pointers and relations
+* Improvement: Add support for multiple $in clauses in a query
+* Improvement: Add allowClientClassCreation config option
+* Improvement: Allow atomically setting subdocument keys
+* Improvement: Allow arbitrarily deeply nested roles
+* Improvement: Set proper content-type in S3 File Adapter
+* Improvement: S3 adapter auto-creates buckets
+* Improvement: Better error messages for many errors
+* Performance: Improved algorithm for validating client keys
+* Experimental: Parse Hooks and Hooks API
+* Experimental: Email verification and password reset emails
+* Experimental: Improve compatability of logs feature with Parse.com
+* Fix: Fix for attempting to delete missing classes via schemas API
+* Fix: Allow creation of system classes via schemas API
+* Fix: Allow missing where cause in $select
+* Fix: Improve handling of invalid object ids
+* Fix: Replace query overwriting existing query
+* Fix: Propagate installationId in cloud code triggers
+* Fix: Session expiresAt is now a Date instead of a string
+* Fix: Fix count queries
+* Fix: Disallow _Role objects without names or without ACL
+* Fix: Better handling of invalid types submitted
+* Fix: beforeSave will not be triggered for attempts to save with invalid authData
+* Fix: Fix duplicate device token issues on Android
+* Fix: Allow empty authData on signup
+* Fix: Allow Master Key Headers (CORS)
+* Fix: Fix bugs if JavaScript key was not provided in server configuration
+* Fix: Parse Files on objects can now be stored without URLs
+* Fix: allow both objectId or installationId when modifying installation
+* Fix: Command line works better when not given options
+
+### 2.1.3
+
+* Feature: Add initial support for in-app purchases
+* Feature: Better error messages when attempting to run the server on a port that is already in use or without a server URL
+* Feature: Allow customization of max file size
+* Performance: Faster saves if not using beforeSave triggers
+* Fix: Send session token in response to current user endpoint
+* Fix: Remove triggers for _Session collection
+* Fix: Improve compatability of cloud code beforeSave hook for newly created object
+* Fix: ACL creation for master key only objects
+* Fix: Allow uploading files without Content-Type
+* Fix: Add features to http request to match Parse.com
+* Fix: Bugs in development script when running from locations other than project root
+* Fix: Can pass query constraints in URL
+* Fix: Objects with legacy "_tombstone" key now don't cause issues.
+* Fix: Allow nested keys in objects to begin with underscores
+* Fix: Allow correct headers for CORS
+
+### 2.1.2
+
+* Change: The S3 file adapter constructor requires a bucket name
+* Fix: Parse Query should throw if improperly encoded
+* Fix: Issue where roles were not used in some requests
+* Fix: serverURL will no longer default to api.parse.com/1
+
+### 2.1.1
+
+* Experimental: Schemas API support for DELETE operations
+* Fix: Session token issue fetching Users
+* Fix: Facebook auth validation
+* Fix: Invalid error when deleting missing session
+
+### 2.1.0
+
+* Feature: Support for additional OAuth providers
+* Feature: Ability to implement custom OAuth providers
+* Feature: Support for deleting Parse Files
+* Feature: Allow querying roles
+* Feature: Support for logs, extensible via Log Adapter
+* Feature: New Push Adapter for sending push notifications through OneSignal
+* Feature: Tighter default security for Users
+* Feature: Pass parameters to cloud code in query string
+* Feature: Disable anonymous users via configuration.
+* Experimental: Schemas API support for PUT operations
+* Fix: Prevent installation ID from being added to User
+* Fix: Becoming a user works properly with sessions
+* Fix: Including multiple object when some object are unavailable will get all the objects that are available
+* Fix: Invalid URL for Parse Files
+* Fix: Making a query without a limit now returns 100 results
+* Fix: Expose installation id in cloud code
+* Fix: Correct username for Anonymous users
+* Fix: Session token issue after fetching user
+* Fix: Issues during install process
+* Fix: Issue with Unity SDK sending _noBody
+
+### 2.0.8
+
+* Add: support for Android and iOS push notifications
+* Experimental: cloud code validation hooks (can mark as non-experimental after we have docs)
+* Experimental: support for schemas API (GET and POST only)
+* Experimental: support for Parse Config (GET and POST only)
+* Fix: Querying objects with equality constraint on array column
+* Fix: User logout will remove session token
+* Fix: Various files related bugs
+* Fix: Force minimum node version 4.3 due to security issues in earlier version
+* Performance Improvement: Improved caching
diff --git a/release.config.js b/release.config.js
new file mode 100644
index 0000000000..754fbd92c5
--- /dev/null
+++ b/release.config.js
@@ -0,0 +1,114 @@
+/**
+ * Semantic Release Config
+ */
+
+const fs = require('fs').promises;
+const path = require('path');
+
+// Get env vars
+const ref = process.env.GITHUB_REF;
+const serverUrl = process.env.GITHUB_SERVER_URL;
+const repository = process.env.GITHUB_REPOSITORY;
+const repositoryUrl = serverUrl + '/' + repository;
+
+// Declare params
+const resourcePath = './.releaserc/';
+const templates = {
+ main: { file: 'template.hbs', text: undefined },
+ header: { file: 'header.hbs', text: undefined },
+ commit: { file: 'commit.hbs', text: undefined },
+ footer: { file: 'footer.hbs', text: undefined },
+};
+
+// Declare semantic config
+async function config() {
+
+ // Get branch
+ const branch = ref.split('/').pop();
+ console.log(`Running on branch: ${branch}`);
+
+ // Set changelog file
+ const changelogFile = `./changelogs/CHANGELOG_${branch}.md`;
+ console.log(`Changelog file output to: ${changelogFile}`);
+
+ // Load template file contents
+ await loadTemplates();
+
+ const config = {
+ branches: [
+ 'release',
+ { name: 'alpha', prerelease: true },
+ { name: 'beta', prerelease: true },
+ 'next-major',
+ // Long-Term-Support branches
+ // { name: 'release-1', range: '1.x.x', channel: '1.x' },
+ // { name: 'release-2', range: '2.x.x', channel: '2.x' },
+ // { name: 'release-3', range: '3.x.x', channel: '3.x' },
+ // { name: 'release-4', range: '4.x.x', channel: '4.x' },
+ ],
+ dryRun: false,
+ debug: true,
+ ci: true,
+ tagFormat: '${version}',
+ plugins: [
+ ['@semantic-release/commit-analyzer', {
+ preset: 'angular',
+ releaseRules: [
+ { type: 'docs', scope: 'README', release: 'patch' },
+ { scope: 'no-release', release: false },
+ ],
+ parserOpts: {
+ noteKeywords: [ 'BREAKING CHANGE', 'BREAKING CHANGES', 'BREAKING' ],
+ },
+ }],
+ ['@semantic-release/release-notes-generator', {
+ preset: 'angular',
+ parserOpts: {
+ noteKeywords: ['BREAKING CHANGE', 'BREAKING CHANGES', 'BREAKING']
+ },
+ writerOpts: {
+ commitsSort: ['subject', 'scope'],
+ mainTemplate: templates.main.text,
+ headerPartial: templates.header.text,
+ commitPartial: templates.commit.text,
+ footerPartial: templates.footer.text,
+ },
+ }],
+ ['@semantic-release/changelog', {
+ 'changelogFile': changelogFile,
+ }],
+ ['@semantic-release/npm', {
+ 'npmPublish': true,
+ }],
+ ['@semantic-release/git', {
+ assets: [changelogFile, 'package.json', 'package-lock.json', 'npm-shrinkwrap.json'],
+ }],
+ ['@semantic-release/github', {
+ successComment: getReleaseComment(),
+ labels: ['type:ci'],
+ releasedLabels: ['state:released<%= nextRelease.channel ? `-\${nextRelease.channel}` : "" %>']
+ }],
+ ],
+ };
+
+ return config;
+}
+
+async function loadTemplates() {
+ for (const template of Object.keys(templates)) {
+ const text = await readFile(path.resolve(__dirname, resourcePath, templates[template].file));
+ templates[template].text = text;
+ }
+}
+
+async function readFile(filePath) {
+ return await fs.readFile(filePath, 'utf-8');
+}
+
+function getReleaseComment() {
+ const url = repositoryUrl + '/releases/tag/${nextRelease.gitTag}';
+ const comment = '🎉 This change has been released in version [${nextRelease.version}](' + url + ')';
+ return comment;
+}
+
+module.exports = config();
From 18a7838505525041cd7fa893be6f7aa75fbd2dc3 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 27 Oct 2021 03:07:10 +0200
Subject: [PATCH 58/96] ci: fix auto release (#7657)
---
package-lock.json | 4799 +++++++++++++++++++++++++++++++++++++++++----
package.json | 7 +
2 files changed, 4454 insertions(+), 352 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2040aac0ad..7f3b8e8bdc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1599,6 +1599,145 @@
"fastq": "^1.6.0"
}
},
+ "@octokit/auth-token": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+ "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+ "dev": true,
+ "requires": {
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "@octokit/core": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz",
+ "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==",
+ "dev": true,
+ "requires": {
+ "@octokit/auth-token": "^2.4.4",
+ "@octokit/graphql": "^4.5.8",
+ "@octokit/request": "^5.6.0",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.0.3",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/endpoint": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+ "dev": true,
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "dependencies": {
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true
+ }
+ }
+ },
+ "@octokit/graphql": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+ "dev": true,
+ "requires": {
+ "@octokit/request": "^5.6.0",
+ "@octokit/types": "^6.0.3",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/openapi-types": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
+ "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==",
+ "dev": true
+ },
+ "@octokit/plugin-paginate-rest": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
+ "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
+ "dev": true,
+ "requires": {
+ "@octokit/types": "^6.34.0"
+ }
+ },
+ "@octokit/plugin-request-log": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
+ "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
+ "dev": true
+ },
+ "@octokit/plugin-rest-endpoint-methods": {
+ "version": "5.13.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
+ "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
+ "dev": true,
+ "requires": {
+ "@octokit/types": "^6.34.0",
+ "deprecation": "^2.3.1"
+ }
+ },
+ "@octokit/request": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.2.tgz",
+ "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==",
+ "dev": true,
+ "requires": {
+ "@octokit/endpoint": "^6.0.1",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.16.1",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.1",
+ "universal-user-agent": "^6.0.0"
+ },
+ "dependencies": {
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true
+ }
+ }
+ },
+ "@octokit/request-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+ "dev": true,
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ }
+ },
+ "@octokit/rest": {
+ "version": "18.12.0",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz",
+ "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==",
+ "dev": true,
+ "requires": {
+ "@octokit/core": "^3.5.1",
+ "@octokit/plugin-paginate-rest": "^2.16.8",
+ "@octokit/plugin-request-log": "^1.0.4",
+ "@octokit/plugin-rest-endpoint-methods": "^5.12.0"
+ }
+ },
+ "@octokit/types": {
+ "version": "6.34.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
+ "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
+ "dev": true,
+ "requires": {
+ "@octokit/openapi-types": "^11.2.0"
+ }
+ },
"@parse/fs-files-adapter": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-1.2.0.tgz",
@@ -1761,72 +1900,459 @@
"any-observable": "^0.3.0"
}
},
- "@sindresorhus/is": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz",
- "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==",
- "dev": true
- },
- "@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "@semantic-release/changelog": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-5.0.1.tgz",
+ "integrity": "sha512-unvqHo5jk4dvAf2nZ3aw4imrlwQ2I50eVVvq9D47Qc3R+keNqepx1vDYwkjF8guFXnOYaYcR28yrZWno1hFbiw==",
"dev": true,
"requires": {
- "defer-to-connect": "^2.0.0"
+ "@semantic-release/error": "^2.1.0",
+ "aggregate-error": "^3.0.0",
+ "fs-extra": "^9.0.0",
+ "lodash": "^4.17.4"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ }
}
},
- "@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
- },
- "@types/accepts": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
- "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
+ "@semantic-release/commit-analyzer": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz",
+ "integrity": "sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A==",
+ "dev": true,
"requires": {
- "@types/node": "*"
+ "conventional-changelog-angular": "^5.0.0",
+ "conventional-commits-filter": "^2.0.0",
+ "conventional-commits-parser": "^3.0.7",
+ "debug": "^4.0.0",
+ "import-from": "^3.0.0",
+ "lodash": "^4.17.4",
+ "micromatch": "^4.0.2"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
}
},
- "@types/body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
- "requires": {
- "@types/connect": "*",
- "@types/node": "*"
- }
+ "@semantic-release/error": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz",
+ "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==",
+ "dev": true
},
- "@types/cacheable-request": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
- "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
+ "@semantic-release/git": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-9.0.0.tgz",
+ "integrity": "sha512-AZ4Zha5NAPAciIJH3ipzw/WU9qLAn8ENaoVAhD6srRPxTpTzuV3NhNh14rcAo8Paj9dO+5u4rTKcpetOBluYVw==",
"dev": true,
"requires": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "*",
- "@types/node": "*",
- "@types/responselike": "*"
- }
- },
- "@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "requires": {
- "@types/node": "*"
+ "@semantic-release/error": "^2.1.0",
+ "aggregate-error": "^3.0.0",
+ "debug": "^4.0.0",
+ "dir-glob": "^3.0.0",
+ "execa": "^4.0.0",
+ "lodash": "^4.17.4",
+ "micromatch": "^4.0.0",
+ "p-reduce": "^2.0.0"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
}
},
- "@types/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
- },
- "@types/cookies": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
- "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
+ "@semantic-release/github": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.2.3.tgz",
+ "integrity": "sha512-lWjIVDLal+EQBzy697ayUNN8MoBpp+jYIyW2luOdqn5XBH4d9bQGfTnjuLyzARZBHejqh932HVjiH/j4+R7VHw==",
+ "dev": true,
+ "requires": {
+ "@octokit/rest": "^18.0.0",
+ "@semantic-release/error": "^2.2.0",
+ "aggregate-error": "^3.0.0",
+ "bottleneck": "^2.18.1",
+ "debug": "^4.0.0",
+ "dir-glob": "^3.0.0",
+ "fs-extra": "^10.0.0",
+ "globby": "^11.0.0",
+ "http-proxy-agent": "^4.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "issue-parser": "^6.0.0",
+ "lodash": "^4.17.4",
+ "mime": "^2.4.3",
+ "p-filter": "^2.0.0",
+ "p-retry": "^4.0.0",
+ "url-join": "^4.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "fs-extra": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+ "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ }
+ }
+ },
+ "@semantic-release/npm": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.1.3.tgz",
+ "integrity": "sha512-x52kQ/jR09WjuWdaTEHgQCvZYMOTx68WnS+TZ4fya5ZAJw4oRtJETtrvUw10FdfM28d/keInQdc66R1Gw5+OEQ==",
+ "dev": true,
+ "requires": {
+ "@semantic-release/error": "^2.2.0",
+ "aggregate-error": "^3.0.0",
+ "execa": "^5.0.0",
+ "fs-extra": "^10.0.0",
+ "lodash": "^4.17.15",
+ "nerf-dart": "^1.0.0",
+ "normalize-url": "^6.0.0",
+ "npm": "^7.0.0",
+ "rc": "^1.2.8",
+ "read-pkg": "^5.0.0",
+ "registry-auth-token": "^4.0.0",
+ "semver": "^7.1.2",
+ "tempy": "^1.0.0"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+ "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ }
+ }
+ },
+ "@semantic-release/release-notes-generator": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.3.tgz",
+ "integrity": "sha512-hMZyddr0u99OvM2SxVOIelHzly+PP3sYtJ8XOLHdMp8mrluN5/lpeTnIO27oeCYdupY/ndoGfvrqDjHqkSyhVg==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-angular": "^5.0.0",
+ "conventional-changelog-writer": "^4.0.0",
+ "conventional-commits-filter": "^2.0.0",
+ "conventional-commits-parser": "^3.0.0",
+ "debug": "^4.0.0",
+ "get-stream": "^6.0.0",
+ "import-from": "^3.0.0",
+ "into-stream": "^6.0.0",
+ "lodash": "^4.17.4",
+ "read-pkg-up": "^7.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "@sindresorhus/is": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz",
+ "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==",
+ "dev": true
+ },
+ "@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+ "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "dev": true,
+ "requires": {
+ "defer-to-connect": "^2.0.0"
+ }
+ },
+ "@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
+ },
+ "@types/accepts": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
+ "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
+ "requires": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/cacheable-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
+ "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
+ "dev": true,
+ "requires": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "*",
+ "@types/node": "*",
+ "@types/responselike": "*"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
+ },
+ "@types/cookies": {
+ "version": "0.7.7",
+ "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
+ "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
"requires": {
"@types/connect": "*",
"@types/express": "*",
@@ -1973,11 +2499,23 @@
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
},
+ "@types/minimist": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+ "dev": true
+ },
"@types/node": {
"version": "16.6.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz",
"integrity": "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw=="
},
+ "@types/normalize-package-data": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+ "dev": true
+ },
"@types/parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
@@ -2003,6 +2541,12 @@
"@types/node": "*"
}
},
+ "@types/retry": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
+ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
+ "dev": true
+ },
"@types/serve-static": {
"version": "1.13.10",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
@@ -2159,6 +2703,16 @@
}
}
},
+ "JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "requires": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ }
+ },
"abstract-logging": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz",
@@ -2321,6 +2875,12 @@
"color-convert": "^1.9.0"
}
},
+ "ansicolors": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
+ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=",
+ "dev": true
+ },
"any-observable": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz",
@@ -2821,6 +3381,12 @@
"sprintf-js": "~1.0.2"
}
},
+ "argv-formatter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz",
+ "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=",
+ "dev": true
+ },
"arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
@@ -2847,6 +3413,12 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
+ "array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
+ "dev": true
+ },
"array-next": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/array-next/-/array-next-0.0.1.tgz",
@@ -2866,6 +3438,12 @@
"dev": true,
"optional": true
},
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -2928,6 +3506,12 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true
+ },
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
@@ -3087,6 +3671,12 @@
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
"integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
},
+ "before-after-hook": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
+ "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==",
+ "dev": true
+ },
"binary-extensions": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
@@ -3179,6 +3769,12 @@
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
"dev": true
},
+ "bottleneck": {
+ "version": "2.19.5",
+ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
+ "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==",
+ "dev": true
+ },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -3423,12 +4019,33 @@
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
+ "camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ }
+ },
"caniuse-lite": {
"version": "1.0.30001251",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz",
"integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==",
"dev": true
},
+ "cardinal": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
+ "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=",
+ "dev": true,
+ "requires": {
+ "ansicolors": "~0.3.2",
+ "redeyed": "~2.1.0"
+ }
+ },
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -3633,6 +4250,51 @@
"integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==",
"dev": true
},
+ "cli-table3": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz",
+ "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==",
+ "dev": true,
+ "requires": {
+ "colors": "^1.1.2",
+ "object-assign": "^4.1.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ }
+ }
+ },
"cli-truncate": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
@@ -3964,6 +4626,16 @@
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
"dev": true
},
+ "compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
+ "dev": true,
+ "requires": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
+ }
+ },
"compare-versions": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
@@ -4024,30 +4696,132 @@
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
- "convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "conventional-changelog-angular": {
+ "version": "5.0.13",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz",
+ "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==",
"dev": true,
"requires": {
- "safe-buffer": "~5.1.1"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- }
+ "compare-func": "^2.0.0",
+ "q": "^1.5.1"
}
},
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "cookie-signature": {
- "version": "1.0.6",
+ "conventional-changelog-writer": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz",
+ "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^2.0.0",
+ "conventional-commits-filter": "^2.0.7",
+ "dateformat": "^3.0.0",
+ "handlebars": "^4.7.6",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.15",
+ "meow": "^8.0.0",
+ "semver": "^6.0.0",
+ "split": "^1.0.0",
+ "through2": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3"
+ }
+ }
+ }
+ },
+ "conventional-commits-filter": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz",
+ "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==",
+ "dev": true,
+ "requires": {
+ "lodash.ismatch": "^4.4.0",
+ "modify-values": "^1.0.0"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz",
+ "integrity": "sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.4",
+ "is-text-path": "^1.0.1",
+ "lodash": "^4.17.15",
+ "meow": "^8.0.0",
+ "split2": "^3.0.0",
+ "through2": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3"
+ }
+ }
+ }
+ },
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ }
+ }
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
@@ -4142,6 +4916,12 @@
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
"optional": true
},
+ "crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "dev": true
+ },
"css-select": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
@@ -4187,6 +4967,12 @@
"resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz",
"integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ=="
},
+ "dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "dev": true
+ },
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
@@ -4201,6 +4987,24 @@
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
+ "decamelize-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+ "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+ "dev": true,
+ "requires": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ }
+ }
+ },
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -4484,6 +5288,39 @@
}
}
},
+ "del": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
+ "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
+ "dev": true,
+ "requires": {
+ "globby": "^11.0.1",
+ "graceful-fs": "^4.2.4",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.2",
+ "p-map": "^4.0.0",
+ "rimraf": "^3.0.2",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ }
+ }
+ },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -4545,6 +5382,12 @@
"resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz",
"integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc="
},
+ "deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
+ "dev": true
+ },
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
@@ -4796,6 +5639,23 @@
"domelementtype": "1"
}
},
+ "dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "requires": {
+ "is-obj": "^2.0.0"
+ },
+ "dependencies": {
+ "is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true
+ }
+ }
+ },
"downcache": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/downcache/-/downcache-0.0.9.tgz",
@@ -4952,6 +5812,15 @@
}
}
},
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.2"
+ }
+ },
"duplexer3": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
@@ -5042,6 +5911,48 @@
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
"dev": true
},
+ "env-ci": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.4.0.tgz",
+ "integrity": "sha512-6Bq7gq+2QCZjCwe2vUXTcecIsjfh71kyNds5nBrpyuyPjgYgGEHlgjkrKSH6LFwJ5PSEwH3r7KXioGreJKcuHA==",
+ "dev": true,
+ "requires": {
+ "execa": "^5.0.0",
+ "fromentries": "^1.3.2",
+ "java-properties": "^1.0.0"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ }
+ }
+ },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -6223,6 +7134,16 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
"fromentries": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
@@ -6400,6 +7321,41 @@
"assert-plus": "^1.0.0"
}
},
+ "git-log-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz",
+ "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=",
+ "dev": true,
+ "requires": {
+ "argv-formatter": "~1.0.0",
+ "spawn-error-forwarder": "~1.0.0",
+ "split2": "~1.0.0",
+ "stream-combiner2": "~1.1.1",
+ "through2": "~2.0.0",
+ "traverse": "~0.6.6"
+ },
+ "dependencies": {
+ "split2": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz",
+ "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=",
+ "dev": true,
+ "requires": {
+ "through2": "~2.0.0"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
"glob": {
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
@@ -6614,6 +7570,27 @@
"temp": "~0.4.0"
}
},
+ "handlebars": {
+ "version": "4.7.7",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+ "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.0",
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4",
+ "wordwrap": "^1.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -6628,6 +7605,12 @@
"har-schema": "^2.0.0"
}
},
+ "hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true
+ },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -6750,6 +7733,32 @@
"react-is": "^16.7.0"
}
},
+ "hook-std": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz",
+ "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+ "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ }
+ }
+ },
"html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -6976,6 +7985,23 @@
"resolve-from": "^4.0.0"
}
},
+ "import-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+ "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ }
+ }
+ },
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -7134,6 +8160,16 @@
"resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz",
"integrity": "sha1-MyZQ4QhU2MCsWMGSvcJ6i/fnoww="
},
+ "into-stream": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
+ "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==",
+ "dev": true,
+ "requires": {
+ "from2": "^2.3.0",
+ "p-is-promise": "^3.0.0"
+ }
+ },
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -7390,6 +8426,18 @@
"integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
"dev": true
},
+ "is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true
+ },
+ "is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true
+ },
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@@ -7468,6 +8516,15 @@
"has-symbols": "^1.0.2"
}
},
+ "is-text-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
+ "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+ "dev": true,
+ "requires": {
+ "text-extensions": "^1.0.0"
+ }
+ },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -7524,6 +8581,19 @@
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
+ "issue-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz",
+ "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==",
+ "dev": true,
+ "requires": {
+ "lodash.capitalize": "^4.2.1",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.uniqby": "^4.7.0"
+ }
+ },
"istanbul-lib-coverage": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
@@ -7742,6 +8812,12 @@
"colors": "1.4.0"
}
},
+ "java-properties": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz",
+ "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==",
+ "dev": true
+ },
"jest-get-type": {
"version": "25.2.6",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
@@ -7900,6 +8976,12 @@
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true
},
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
"json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -7945,6 +9027,12 @@
"graceful-fs": "^4.1.6"
}
},
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "dev": true
+ },
"jsonwebtoken": {
"version": "8.5.1",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
@@ -8069,8 +9157,7 @@
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "optional": true
+ "dev": true
},
"klaw": {
"version": "3.0.0",
@@ -8357,6 +9444,42 @@
}
}
},
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -8383,6 +9506,12 @@
"integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=",
"dev": true
},
+ "lodash.capitalize": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
+ "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=",
+ "dev": true
+ },
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
@@ -8400,6 +9529,12 @@
"integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
"dev": true
},
+ "lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=",
+ "dev": true
+ },
"lodash.filter": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz",
@@ -8439,6 +9574,12 @@
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
"integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
},
+ "lodash.ismatch": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
+ "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
+ "dev": true
+ },
"lodash.isnumber": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
@@ -8524,6 +9665,12 @@
"integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=",
"dev": true
},
+ "lodash.uniqby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
+ "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=",
+ "dev": true
+ },
"log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -8878,6 +10025,12 @@
"dev": true,
"optional": true
},
+ "map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "dev": true
+ },
"map-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
@@ -8913,6 +10066,71 @@
"integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==",
"dev": true
},
+ "marked-terminal": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.2.0.tgz",
+ "integrity": "sha512-DQfNRV9svZf0Dm9Cf5x5xaVJ1+XjxQW6XjFJ5HFkVyK52SDpj5PCBzS5X5r2w9nHr3mlB0T5201UMLue9fmhUw==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.3.1",
+ "cardinal": "^2.1.1",
+ "chalk": "^4.1.0",
+ "cli-table3": "^0.6.0",
+ "node-emoji": "^1.10.0",
+ "supports-hyperlinks": "^2.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
@@ -8957,6 +10175,39 @@
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
"optional": true
},
+ "meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ }
+ }
+ },
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -9031,6 +10282,12 @@
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
"dev": true
},
+ "min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true
+ },
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -9046,6 +10303,17 @@
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
+ "minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ }
+ },
"mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -9086,6 +10354,12 @@
"version": "file:spec/dependencies/mock-mail-adapter",
"dev": true
},
+ "modify-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
+ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
+ "dev": true
+ },
"module-definition": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.3.1.tgz",
@@ -9302,244 +10576,2365 @@
"integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
"dev": true,
"requires": {
- "minimist": "0.0.8"
+ "minimist": "0.0.8"
+ }
+ },
+ "rimraf": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz",
+ "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=",
+ "dev": true
+ }
+ }
+ },
+ "mongodb-version-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mongodb-version-list/-/mongodb-version-list-1.0.0.tgz",
+ "integrity": "sha1-8lAxz83W8UWx3o/OKk6+wCiLtKQ=",
+ "dev": true,
+ "requires": {
+ "cheerio": "^0.22.0",
+ "debug": "^2.2.0",
+ "downcache": "^0.0.9",
+ "fs-extra": "^1.0.0",
+ "minimist": "^1.1.1",
+ "semver": "^5.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
+ "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0"
+ }
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "mongodb-version-manager": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.4.6.tgz",
+ "integrity": "sha512-UxXZy7iqHUa039Bp8e1Y2tSLh/X/JtHRqnlcVkqNEWpX/5ETPaKwrT7QIVZc1Tk5tEkQXjRHd6nQtUjcemOHmA==",
+ "dev": true,
+ "requires": {
+ "ampersand-state": "^5.0.3",
+ "async": "^3.1.0",
+ "chalk": "^2.1.0",
+ "debug": ">= 2.6.9 < 3.0.0 || >= ^3.1.0",
+ "docopt": "^0.6.2",
+ "download": "^6.2.5",
+ "figures": "^3.2.0",
+ "fs-extra": "^8.1.0",
+ "get-mongodb-version": "^2.0.1",
+ "lodash.defaults": "^4.2.0",
+ "lodash.difference": "^4.1.1",
+ "mongodb-download-url": "^1.0.0",
+ "mongodb-version-list": "^1.0.0",
+ "semver": "^5.3.0",
+ "tildify": "^2.0.0",
+ "untildify": "^4.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
+ },
+ "mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "nan": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
+ "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
+ "dev": true,
+ "optional": true
+ },
+ "nanoid": {
+ "version": "3.1.25",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
+ "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "nerf-dart": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz",
+ "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node-emoji": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
+ "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "node-forge": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
+ },
+ "node-netstat": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/node-netstat/-/node-netstat-1.8.0.tgz",
+ "integrity": "sha512-P1a5Sh9FfjTXxI6hC9q/Nqre8kT63FQxBCr1qz5ffk76EkQBH62+XEhIhlzfz6Bz+FRwOFqidW2FDGXnOXvyJQ==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "^1.1.0"
+ }
+ },
+ "node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "requires": {
+ "process-on-spawn": "^1.0.0"
+ }
+ },
+ "node-releases": {
+ "version": "1.1.75",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
+ "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==",
+ "dev": true
+ },
+ "node-source-walk": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.2.0.tgz",
+ "integrity": "sha512-hPs/QMe6zS94f5+jG3kk9E7TNm4P2SulrKiLWMzKszBfNZvL/V6wseHlTd7IvfW0NZWqPtK3+9yYNr+3USGteA==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.0.0"
+ }
+ },
+ "normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true
+ },
+ "npm": {
+ "version": "7.24.2",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz",
+ "integrity": "sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==",
+ "dev": true,
+ "requires": {
+ "@isaacs/string-locale-compare": "*",
+ "@npmcli/arborist": "*",
+ "@npmcli/ci-detect": "*",
+ "@npmcli/config": "*",
+ "@npmcli/map-workspaces": "*",
+ "@npmcli/package-json": "*",
+ "@npmcli/run-script": "*",
+ "abbrev": "*",
+ "ansicolors": "*",
+ "ansistyles": "*",
+ "archy": "*",
+ "cacache": "*",
+ "chalk": "*",
+ "chownr": "*",
+ "cli-columns": "*",
+ "cli-table3": "*",
+ "columnify": "*",
+ "fastest-levenshtein": "*",
+ "glob": "*",
+ "graceful-fs": "*",
+ "hosted-git-info": "*",
+ "ini": "*",
+ "init-package-json": "*",
+ "is-cidr": "*",
+ "json-parse-even-better-errors": "*",
+ "libnpmaccess": "*",
+ "libnpmdiff": "*",
+ "libnpmexec": "*",
+ "libnpmfund": "*",
+ "libnpmhook": "*",
+ "libnpmorg": "*",
+ "libnpmpack": "*",
+ "libnpmpublish": "*",
+ "libnpmsearch": "*",
+ "libnpmteam": "*",
+ "libnpmversion": "*",
+ "make-fetch-happen": "*",
+ "minipass": "*",
+ "minipass-pipeline": "*",
+ "mkdirp": "*",
+ "mkdirp-infer-owner": "*",
+ "ms": "*",
+ "node-gyp": "*",
+ "nopt": "*",
+ "npm-audit-report": "*",
+ "npm-install-checks": "*",
+ "npm-package-arg": "*",
+ "npm-pick-manifest": "*",
+ "npm-profile": "*",
+ "npm-registry-fetch": "*",
+ "npm-user-validate": "*",
+ "npmlog": "*",
+ "opener": "*",
+ "pacote": "*",
+ "parse-conflict-json": "*",
+ "qrcode-terminal": "*",
+ "read": "*",
+ "read-package-json": "*",
+ "read-package-json-fast": "*",
+ "readdir-scoped-modules": "*",
+ "rimraf": "*",
+ "semver": "*",
+ "ssri": "*",
+ "tar": "*",
+ "text-table": "*",
+ "tiny-relative-date": "*",
+ "treeverse": "*",
+ "validate-npm-package-name": "*",
+ "which": "*",
+ "write-file-atomic": "*"
+ },
+ "dependencies": {
+ "@gar/promisify": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true
+ },
+ "@isaacs/string-locale-compare": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "@npmcli/arborist": {
+ "version": "2.9.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@isaacs/string-locale-compare": "^1.0.1",
+ "@npmcli/installed-package-contents": "^1.0.7",
+ "@npmcli/map-workspaces": "^1.0.2",
+ "@npmcli/metavuln-calculator": "^1.1.0",
+ "@npmcli/move-file": "^1.1.0",
+ "@npmcli/name-from-folder": "^1.0.1",
+ "@npmcli/node-gyp": "^1.0.1",
+ "@npmcli/package-json": "^1.0.1",
+ "@npmcli/run-script": "^1.8.2",
+ "bin-links": "^2.2.1",
+ "cacache": "^15.0.3",
+ "common-ancestor-path": "^1.0.1",
+ "json-parse-even-better-errors": "^2.3.1",
+ "json-stringify-nice": "^1.1.4",
+ "mkdirp": "^1.0.4",
+ "mkdirp-infer-owner": "^2.0.0",
+ "npm-install-checks": "^4.0.0",
+ "npm-package-arg": "^8.1.5",
+ "npm-pick-manifest": "^6.1.0",
+ "npm-registry-fetch": "^11.0.0",
+ "pacote": "^11.3.5",
+ "parse-conflict-json": "^1.1.1",
+ "proc-log": "^1.0.0",
+ "promise-all-reject-late": "^1.0.0",
+ "promise-call-limit": "^1.0.1",
+ "read-package-json-fast": "^2.0.2",
+ "readdir-scoped-modules": "^1.1.0",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "ssri": "^8.0.1",
+ "treeverse": "^1.0.4",
+ "walk-up-path": "^1.0.0"
+ }
+ },
+ "@npmcli/ci-detect": {
+ "version": "1.3.0",
+ "bundled": true,
+ "dev": true
+ },
+ "@npmcli/config": {
+ "version": "2.3.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ini": "^2.0.0",
+ "mkdirp-infer-owner": "^2.0.0",
+ "nopt": "^5.0.0",
+ "semver": "^7.3.4",
+ "walk-up-path": "^1.0.0"
+ }
+ },
+ "@npmcli/disparity-colors": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.3.0"
+ }
+ },
+ "@npmcli/fs": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@gar/promisify": "^1.0.1",
+ "semver": "^7.3.5"
+ }
+ },
+ "@npmcli/git": {
+ "version": "2.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/promise-spawn": "^1.3.2",
+ "lru-cache": "^6.0.0",
+ "mkdirp": "^1.0.4",
+ "npm-pick-manifest": "^6.1.1",
+ "promise-inflight": "^1.0.1",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^2.0.2"
+ }
+ },
+ "@npmcli/installed-package-contents": {
+ "version": "1.0.7",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "npm-bundled": "^1.1.1",
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "@npmcli/map-workspaces": {
+ "version": "1.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/name-from-folder": "^1.0.1",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4",
+ "read-package-json-fast": "^2.0.1"
+ }
+ },
+ "@npmcli/metavuln-calculator": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "cacache": "^15.0.5",
+ "pacote": "^11.1.11",
+ "semver": "^7.3.2"
+ }
+ },
+ "@npmcli/move-file": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "mkdirp": "^1.0.4",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "@npmcli/name-from-folder": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "@npmcli/node-gyp": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "@npmcli/package-json": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "json-parse-even-better-errors": "^2.3.1"
+ }
+ },
+ "@npmcli/promise-spawn": {
+ "version": "1.3.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "infer-owner": "^1.0.4"
+ }
+ },
+ "@npmcli/run-script": {
+ "version": "1.8.6",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/node-gyp": "^1.0.2",
+ "@npmcli/promise-spawn": "^1.3.2",
+ "node-gyp": "^7.1.0",
+ "read-package-json-fast": "^2.0.1"
+ }
+ },
+ "@tootallnate/once": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "agentkeepalive": {
+ "version": "4.1.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "depd": "^1.1.2",
+ "humanize-ms": "^1.2.1"
+ }
+ },
+ "aggregate-error": {
+ "version": "3.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "ansicolors": {
+ "version": "0.3.2",
+ "bundled": true,
+ "dev": true
+ },
+ "ansistyles": {
+ "version": "0.1.3",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "archy": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.6",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
+ "asap": {
+ "version": "2.0.6",
+ "bundled": true,
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "bundled": true,
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "bundled": true,
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.11.0",
+ "bundled": true,
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "bin-links": {
+ "version": "2.2.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "cmd-shim": "^4.0.1",
+ "mkdirp": "^1.0.3",
+ "npm-normalize-package-bin": "^1.0.0",
+ "read-cmd-shim": "^2.0.0",
+ "rimraf": "^3.0.0",
+ "write-file-atomic": "^3.0.3"
+ }
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtins": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "cacache": {
+ "version": "15.3.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/fs": "^1.0.0",
+ "@npmcli/move-file": "^1.0.1",
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "glob": "^7.1.4",
+ "infer-owner": "^1.0.4",
+ "lru-cache": "^6.0.0",
+ "minipass": "^3.1.1",
+ "minipass-collect": "^1.0.2",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.2",
+ "mkdirp": "^1.0.3",
+ "p-map": "^4.0.0",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^3.0.2",
+ "ssri": "^8.0.1",
+ "tar": "^6.0.2",
+ "unique-filename": "^1.1.1"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "bundled": true,
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chownr": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "cidr-regex": {
+ "version": "3.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ip-regex": "^4.1.0"
+ }
+ },
+ "clean-stack": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true
+ },
+ "cli-columns": {
+ "version": "3.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "string-width": "^2.0.0",
+ "strip-ansi": "^3.0.1"
+ }
+ },
+ "cli-table3": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "colors": "^1.1.2",
+ "object-assign": "^4.1.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "bundled": true,
+ "dev": true
+ },
+ "cmd-shim": {
+ "version": "4.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "mkdirp-infer-owner": "^2.0.0"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "bundled": true,
+ "dev": true
+ },
+ "colors": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "columnify": {
+ "version": "1.5.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "strip-ansi": "^3.0.0",
+ "wcwidth": "^1.0.0"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "common-ancestor-path": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.3.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "debuglog": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true
+ },
+ "dezalgo": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
+ "diff": {
+ "version": "5.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "encoding": {
+ "version": "0.1.13",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "env-paths": {
+ "version": "2.2.1",
+ "bundled": true,
+ "dev": true
+ },
+ "err-code": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "bundled": true,
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "bundled": true,
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "bundled": true,
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "bundled": true,
+ "dev": true
+ },
+ "fs-minipass": {
+ "version": "2.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "gauge": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1 || ^2.0.0",
+ "strip-ansi": "^3.0.1 || ^4.0.0",
+ "wide-align": "^1.1.2"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.2.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.8",
+ "bundled": true,
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "4.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "http-proxy-agent": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "humanize-ms": {
+ "version": "1.2.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ms": "^2.0.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.6.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimatch": "^3.0.4"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "bundled": true,
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "infer-owner": {
+ "version": "1.0.4",
+ "bundled": true,
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "init-package-json": {
+ "version": "2.0.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "npm-package-arg": "^8.1.5",
+ "promzard": "^0.3.0",
+ "read": "~1.0.1",
+ "read-package-json": "^4.1.1",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4",
+ "validate-npm-package-name": "^3.0.0"
+ }
+ },
+ "ip": {
+ "version": "1.1.5",
+ "bundled": true,
+ "dev": true
+ },
+ "ip-regex": {
+ "version": "4.3.0",
+ "bundled": true,
+ "dev": true
+ },
+ "is-cidr": {
+ "version": "4.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "cidr-regex": "^3.1.1"
+ }
+ },
+ "is-core-module": {
+ "version": "2.7.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "is-lambda": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "bundled": true,
+ "dev": true
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "bundled": true,
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "bundled": true,
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "bundled": true,
+ "dev": true
+ },
+ "json-stringify-nice": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "bundled": true,
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "just-diff": {
+ "version": "3.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "just-diff-apply": {
+ "version": "3.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "libnpmaccess": {
+ "version": "4.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aproba": "^2.0.0",
+ "minipass": "^3.1.1",
+ "npm-package-arg": "^8.1.2",
+ "npm-registry-fetch": "^11.0.0"
+ }
+ },
+ "libnpmdiff": {
+ "version": "2.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/disparity-colors": "^1.0.1",
+ "@npmcli/installed-package-contents": "^1.0.7",
+ "binary-extensions": "^2.2.0",
+ "diff": "^5.0.0",
+ "minimatch": "^3.0.4",
+ "npm-package-arg": "^8.1.4",
+ "pacote": "^11.3.4",
+ "tar": "^6.1.0"
+ }
+ },
+ "libnpmexec": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/arborist": "^2.3.0",
+ "@npmcli/ci-detect": "^1.3.0",
+ "@npmcli/run-script": "^1.8.4",
+ "chalk": "^4.1.0",
+ "mkdirp-infer-owner": "^2.0.0",
+ "npm-package-arg": "^8.1.2",
+ "pacote": "^11.3.1",
+ "proc-log": "^1.0.0",
+ "read": "^1.0.7",
+ "read-package-json-fast": "^2.0.2",
+ "walk-up-path": "^1.0.0"
+ }
+ },
+ "libnpmfund": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/arborist": "^2.5.0"
+ }
+ },
+ "libnpmhook": {
+ "version": "6.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^11.0.0"
+ }
+ },
+ "libnpmorg": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^11.0.0"
+ }
+ },
+ "libnpmpack": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/run-script": "^1.8.3",
+ "npm-package-arg": "^8.1.0",
+ "pacote": "^11.2.6"
+ }
+ },
+ "libnpmpublish": {
+ "version": "4.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "normalize-package-data": "^3.0.2",
+ "npm-package-arg": "^8.1.2",
+ "npm-registry-fetch": "^11.0.0",
+ "semver": "^7.1.3",
+ "ssri": "^8.0.1"
+ }
+ },
+ "libnpmsearch": {
+ "version": "3.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "npm-registry-fetch": "^11.0.0"
+ }
+ },
+ "libnpmteam": {
+ "version": "2.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^11.0.0"
+ }
+ },
+ "libnpmversion": {
+ "version": "1.2.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/git": "^2.0.7",
+ "@npmcli/run-script": "^1.8.4",
+ "json-parse-even-better-errors": "^2.3.1",
+ "semver": "^7.3.5",
+ "stringify-package": "^1.0.1"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "make-fetch-happen": {
+ "version": "9.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "agentkeepalive": "^4.1.3",
+ "cacache": "^15.2.0",
+ "http-cache-semantics": "^4.1.0",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-lambda": "^1.0.1",
+ "lru-cache": "^6.0.0",
+ "minipass": "^3.1.3",
+ "minipass-collect": "^1.0.2",
+ "minipass-fetch": "^1.3.2",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.2",
+ "promise-retry": "^2.0.1",
+ "socks-proxy-agent": "^6.0.0",
+ "ssri": "^8.0.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.49.0",
+ "bundled": true,
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.32",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "mime-db": "1.49.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minipass": {
+ "version": "3.1.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "minipass-collect": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "minipass-fetch": {
+ "version": "1.4.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "encoding": "^0.1.12",
+ "minipass": "^3.1.0",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.0.0"
+ }
+ },
+ "minipass-flush": {
+ "version": "1.0.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "minipass-json-stream": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "jsonparse": "^1.3.1",
+ "minipass": "^3.0.0"
+ }
+ },
+ "minipass-pipeline": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "minipass-sized": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ }
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "bundled": true,
+ "dev": true
+ },
+ "mkdirp-infer-owner": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "chownr": "^2.0.0",
+ "infer-owner": "^1.0.4",
+ "mkdirp": "^1.0.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "bundled": true,
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "bundled": true,
+ "dev": true
+ },
+ "node-gyp": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "env-paths": "^2.2.0",
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.2.3",
+ "nopt": "^5.0.0",
+ "npmlog": "^4.1.2",
+ "request": "^2.88.2",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.2",
+ "tar": "^6.0.2",
+ "which": "^2.0.2"
+ },
+ "dependencies": {
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
+ }
+ },
+ "nopt": {
+ "version": "5.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "3.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "npm-audit-report": {
+ "version": "2.1.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "npm-install-checks": {
+ "version": "4.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "semver": "^7.1.1"
+ }
+ },
+ "npm-normalize-package-bin": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "npm-package-arg": {
+ "version": "8.1.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^4.0.1",
+ "semver": "^7.3.4",
+ "validate-npm-package-name": "^3.0.0"
+ }
+ },
+ "npm-packlist": {
+ "version": "2.2.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.6",
+ "ignore-walk": "^3.0.3",
+ "npm-bundled": "^1.1.1",
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "npm-pick-manifest": {
+ "version": "6.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "npm-install-checks": "^4.0.0",
+ "npm-normalize-package-bin": "^1.0.1",
+ "npm-package-arg": "^8.1.2",
+ "semver": "^7.3.4"
+ }
+ },
+ "npm-profile": {
+ "version": "5.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "npm-registry-fetch": "^11.0.0"
+ }
+ },
+ "npm-registry-fetch": {
+ "version": "11.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "make-fetch-happen": "^9.0.1",
+ "minipass": "^3.1.3",
+ "minipass-fetch": "^1.3.0",
+ "minipass-json-stream": "^1.0.1",
+ "minizlib": "^2.0.0",
+ "npm-package-arg": "^8.0.0"
+ }
+ },
+ "npm-user-validate": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "npmlog": {
+ "version": "5.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "are-we-there-yet": "^2.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^3.0.0",
+ "set-blocking": "^2.0.0"
+ },
+ "dependencies": {
+ "are-we-there-yet": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ }
+ }
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "opener": {
+ "version": "1.5.2",
+ "bundled": true,
+ "dev": true
+ },
+ "p-map": {
+ "version": "4.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "pacote": {
+ "version": "11.3.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/git": "^2.1.0",
+ "@npmcli/installed-package-contents": "^1.0.6",
+ "@npmcli/promise-spawn": "^1.2.0",
+ "@npmcli/run-script": "^1.8.2",
+ "cacache": "^15.0.5",
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.1.0",
+ "infer-owner": "^1.0.4",
+ "minipass": "^3.1.3",
+ "mkdirp": "^1.0.3",
+ "npm-package-arg": "^8.0.1",
+ "npm-packlist": "^2.1.4",
+ "npm-pick-manifest": "^6.0.0",
+ "npm-registry-fetch": "^11.0.0",
+ "promise-retry": "^2.0.1",
+ "read-package-json-fast": "^2.0.1",
+ "rimraf": "^3.0.2",
+ "ssri": "^8.0.1",
+ "tar": "^6.1.0"
+ }
+ },
+ "parse-conflict-json": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "json-parse-even-better-errors": "^2.3.0",
+ "just-diff": "^3.0.1",
+ "just-diff-apply": "^3.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "proc-log": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "promise-all-reject-late": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "promise-call-limit": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "promise-inflight": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "promise-retry": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ }
+ },
+ "promzard": {
+ "version": "0.3.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "read": "1"
+ }
+ },
+ "psl": {
+ "version": "1.8.0",
+ "bundled": true,
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "qrcode-terminal": {
+ "version": "0.12.0",
+ "bundled": true,
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "bundled": true,
+ "dev": true
+ },
+ "read": {
+ "version": "1.0.7",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "mute-stream": "~0.0.4"
+ }
+ },
+ "read-cmd-shim": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "read-package-json": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "normalize-package-data": "^3.0.0",
+ "npm-normalize-package-bin": "^1.0.0"
+ }
+ },
+ "read-package-json-fast": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "json-parse-even-better-errors": "^2.3.0",
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdir-scoped-modules": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "debuglog": "^1.0.1",
+ "dezalgo": "^1.0.0",
+ "graceful-fs": "^4.1.2",
+ "once": "^1.3.0"
+ }
+ },
+ "request": {
+ "version": "2.88.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "2.3.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ }
+ }
+ },
+ "retry": {
+ "version": "0.12.0",
+ "bundled": true,
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "smart-buffer": {
+ "version": "4.2.0",
+ "bundled": true,
+ "dev": true
+ },
+ "socks": {
+ "version": "2.6.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ip": "^1.1.5",
+ "smart-buffer": "^4.1.0"
+ }
+ },
+ "socks-proxy-agent": {
+ "version": "6.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "agent-base": "^6.0.2",
+ "debug": "^4.3.1",
+ "socks": "^2.6.1"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "bundled": true,
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.10",
+ "bundled": true,
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "ssri": {
+ "version": "8.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minipass": "^3.1.1"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "stringify-package": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "tar": {
+ "version": "6.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^3.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "bundled": true,
+ "dev": true
+ },
+ "tiny-relative-date": {
+ "version": "1.3.0",
+ "bundled": true,
+ "dev": true
+ },
+ "treeverse": {
+ "version": "1.0.4",
+ "bundled": true,
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "bundled": true,
+ "dev": true
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "unique-filename": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "unique-slug": {
+ "version": "2.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "bundled": true,
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "validate-npm-package-name": {
+ "version": "3.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "builtins": "^1.0.3"
}
},
- "rimraf": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz",
- "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=",
- "dev": true
- }
- }
- },
- "mongodb-version-list": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/mongodb-version-list/-/mongodb-version-list-1.0.0.tgz",
- "integrity": "sha1-8lAxz83W8UWx3o/OKk6+wCiLtKQ=",
- "dev": true,
- "requires": {
- "cheerio": "^0.22.0",
- "debug": "^2.2.0",
- "downcache": "^0.0.9",
- "fs-extra": "^1.0.0",
- "minimist": "^1.1.1",
- "semver": "^5.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "verror": {
+ "version": "1.10.0",
+ "bundled": true,
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
}
},
- "fs-extra": {
+ "walk-up-path": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
- "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
+ "bundled": true,
+ "dev": true
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "bundled": true,
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0"
+ "defaults": "^1.0.3"
}
},
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "which": {
+ "version": "2.0.2",
+ "bundled": true,
"dev": true,
"requires": {
- "graceful-fs": "^4.1.6"
+ "isexe": "^2.0.0"
}
},
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "wide-align": {
+ "version": "1.1.3",
+ "bundled": true,
"dev": true,
"requires": {
- "graceful-fs": "^4.1.9"
+ "string-width": "^1.0.2 || 2"
}
},
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
"dev": true
- }
- }
- },
- "mongodb-version-manager": {
- "version": "1.4.6",
- "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.4.6.tgz",
- "integrity": "sha512-UxXZy7iqHUa039Bp8e1Y2tSLh/X/JtHRqnlcVkqNEWpX/5ETPaKwrT7QIVZc1Tk5tEkQXjRHd6nQtUjcemOHmA==",
- "dev": true,
- "requires": {
- "ampersand-state": "^5.0.3",
- "async": "^3.1.0",
- "chalk": "^2.1.0",
- "debug": ">= 2.6.9 < 3.0.0 || >= ^3.1.0",
- "docopt": "^0.6.2",
- "download": "^6.2.5",
- "figures": "^3.2.0",
- "fs-extra": "^8.1.0",
- "get-mongodb-version": "^2.0.1",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.1.1",
- "mongodb-download-url": "^1.0.0",
- "mongodb-version-list": "^1.0.0",
- "semver": "^5.3.0",
- "tildify": "^2.0.0",
- "untildify": "^4.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "bundled": true,
"dev": true
}
}
},
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mustache": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
- "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
- },
- "mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "dev": true
- },
- "nan": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
- "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
- "dev": true,
- "optional": true
- },
- "nanoid": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
- "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
- "dev": true
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dev": true,
- "optional": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
- },
- "next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
- },
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
- "no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "requires": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node-fetch": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
- "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
- },
- "node-forge": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
- "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
- },
- "node-netstat": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/node-netstat/-/node-netstat-1.8.0.tgz",
- "integrity": "sha512-P1a5Sh9FfjTXxI6hC9q/Nqre8kT63FQxBCr1qz5ffk76EkQBH62+XEhIhlzfz6Bz+FRwOFqidW2FDGXnOXvyJQ==",
- "dev": true,
- "requires": {
- "is-wsl": "^1.1.0"
- }
- },
- "node-preload": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
- "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
- "dev": true,
- "requires": {
- "process-on-spawn": "^1.0.0"
- }
- },
- "node-releases": {
- "version": "1.1.75",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
- "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==",
- "dev": true
- },
- "node-source-walk": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.2.0.tgz",
- "integrity": "sha512-hPs/QMe6zS94f5+jG3kk9E7TNm4P2SulrKiLWMzKszBfNZvL/V6wseHlTd7IvfW0NZWqPtK3+9yYNr+3USGteA==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.0.0"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "dev": true
- },
"npm-conf": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
@@ -9978,6 +13373,12 @@
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true
},
+ "p-each-series": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
+ "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
+ "dev": true
+ },
"p-event": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz",
@@ -9987,12 +13388,35 @@
"p-timeout": "^3.1.0"
}
},
+ "p-filter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz",
+ "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==",
+ "dev": true,
+ "requires": {
+ "p-map": "^2.0.0"
+ },
+ "dependencies": {
+ "p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true
+ }
+ }
+ },
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
"dev": true
},
+ "p-is-promise": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
+ "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==",
+ "dev": true
+ },
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -10017,7 +13441,23 @@
"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
"dev": true,
"requires": {
- "aggregate-error": "^3.0.0"
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "p-reduce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz",
+ "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==",
+ "dev": true
+ },
+ "p-retry": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
+ "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
+ "dev": true,
+ "requires": {
+ "@types/retry": "^0.12.0",
+ "retry": "^0.13.1"
}
},
"p-timeout": {
@@ -10302,6 +13742,67 @@
"pinkie": "^2.0.0"
}
},
+ "pkg-conf": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz",
+ "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "load-json-file": "^4.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
"pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -10593,6 +14094,12 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true
+ },
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
@@ -10604,6 +14111,12 @@
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true
},
+ "quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true
+ },
"quote-unquote": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz",
@@ -10680,6 +14193,69 @@
"resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
"integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA=="
},
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ }
+ }
+ },
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -10713,6 +14289,25 @@
"readable-stream": "^2.0.2"
}
},
+ "redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "requires": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ }
+ },
+ "redeyed": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+ "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
+ "dev": true,
+ "requires": {
+ "esprima": "~4.0.0"
+ }
+ },
"redis": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz",
@@ -10802,6 +14397,15 @@
"unicode-match-property-value-ecmascript": "^1.2.0"
}
},
+ "registry-auth-token": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+ "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+ "dev": true,
+ "requires": {
+ "rc": "^1.2.8"
+ }
+ },
"regjsgen": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
@@ -11069,68 +14673,338 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
- }
- }
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
- "optional": true,
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "saslprep": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
- "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
- "optional": true,
- "requires": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "sass-lookup": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz",
- "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==",
- "dev": true,
- "requires": {
- "commander": "^2.16.0"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ }
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "saslprep": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+ "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "optional": true,
+ "requires": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
+ "sass-lookup": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz",
+ "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.16.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ }
+ }
+ },
+ "seek-bzip": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
+ "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.8.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ }
+ }
+ },
+ "semantic-release": {
+ "version": "17.4.6",
+ "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.6.tgz",
+ "integrity": "sha512-0B1OGkW8gzQjLbj3H5G4fJyy73HAWsoDnzWYyfNJHyyyLi1acQd+id4O7U+12wXTk9G83pXCgSFj9oYTvocFMA==",
+ "dev": true,
+ "requires": {
+ "@semantic-release/commit-analyzer": "^8.0.0",
+ "@semantic-release/error": "^2.2.0",
+ "@semantic-release/github": "^7.0.0",
+ "@semantic-release/npm": "^7.0.0",
+ "@semantic-release/release-notes-generator": "^9.0.0",
+ "aggregate-error": "^3.0.0",
+ "cosmiconfig": "^7.0.0",
+ "debug": "^4.0.0",
+ "env-ci": "^5.0.0",
+ "execa": "^5.0.0",
+ "figures": "^3.0.0",
+ "find-versions": "^4.0.0",
+ "get-stream": "^6.0.0",
+ "git-log-parser": "^1.2.0",
+ "hook-std": "^2.0.0",
+ "hosted-git-info": "^4.0.0",
+ "lodash": "^4.17.21",
+ "marked": "^2.0.0",
+ "marked-terminal": "^4.1.1",
+ "micromatch": "^4.0.2",
+ "p-each-series": "^2.1.0",
+ "p-reduce": "^2.0.0",
+ "read-pkg-up": "^7.0.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.3.2",
+ "semver-diff": "^3.1.1",
+ "signale": "^1.2.1",
+ "yargs": "^16.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+ "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "dev": true,
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ }
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-versions": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz",
+ "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==",
+ "dev": true,
+ "requires": {
+ "semver-regex": "^3.1.2"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "marked": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
+ "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
"dev": true
- }
- }
- },
- "seek-bzip": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
- "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
- "dev": true,
- "requires": {
- "commander": "^2.8.1"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ },
+ "micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "semver-regex": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.3.tgz",
+ "integrity": "sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true
}
}
@@ -11159,6 +15033,23 @@
"integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
"dev": true
},
+ "semver-diff": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+ "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
"semver-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
@@ -11314,6 +15205,28 @@
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
},
+ "signale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz",
+ "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.3.2",
+ "figures": "^2.0.0",
+ "pkg-conf": "^2.1.0"
+ },
+ "dependencies": {
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ }
+ }
+ },
"simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -11541,6 +15454,12 @@
"memory-pager": "^1.0.2"
}
},
+ "spawn-error-forwarder": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz",
+ "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=",
+ "dev": true
+ },
"spawn-wrap": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
@@ -11581,11 +15500,52 @@
}
}
},
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz",
+ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==",
+ "dev": true
+ },
"spex": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/spex/-/spex-3.2.0.tgz",
"integrity": "sha512-9srjJM7NaymrpwMHvSmpDeIK5GoRMX/Tq0E8aOlDPS54dDnDUIp30DrP9SphMPEETDLzEM9+4qo+KipmbtPecg=="
},
+ "split": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "dev": true,
+ "requires": {
+ "through": "2"
+ }
+ },
"split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -11671,6 +15631,16 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "~0.1.0",
+ "readable-stream": "^2.0.2"
+ }
+ },
"streamsearch": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
@@ -11771,6 +15741,15 @@
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true
},
+ "strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "requires": {
+ "min-indent": "^1.0.0"
+ }
+ },
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -11852,6 +15831,33 @@
"has-flag": "^3.0.0"
}
},
+ "supports-hyperlinks": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
+ "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
"symbol-observable": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
@@ -11963,6 +15969,33 @@
"integrity": "sha1-ZxrWPVe+D+nXKUZks/xABjZnimA=",
"dev": true
},
+ "temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "dev": true
+ },
+ "tempy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz",
+ "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==",
+ "dev": true,
+ "requires": {
+ "del": "^6.0.0",
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "dev": true
+ }
+ }
+ },
"test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -11974,6 +16007,12 @@
"minimatch": "^3.0.4"
}
},
+ "text-extensions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
+ "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
+ "dev": true
+ },
"text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
@@ -12142,6 +16181,18 @@
}
}
},
+ "traverse": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
+ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=",
+ "dev": true
+ },
+ "trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "dev": true
+ },
"trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
@@ -12266,6 +16317,13 @@
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
"dev": true
},
+ "uglify-js": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz",
+ "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==",
+ "dev": true,
+ "optional": true
+ },
"unbox-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
@@ -12340,6 +16398,21 @@
"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
"dev": true
},
+ "unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "^2.0.0"
+ }
+ },
+ "universal-user-agent": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
+ "dev": true
+ },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -12430,6 +16503,12 @@
"dev": true,
"optional": true
},
+ "url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
+ "dev": true
+ },
"url-parse-lax": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
@@ -12491,6 +16570,16 @@
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
"value-or-promise": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.10.tgz",
@@ -12629,6 +16718,12 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
diff --git a/package.json b/package.json
index ae4454996b..295329aaed 100644
--- a/package.json
+++ b/package.json
@@ -68,6 +68,12 @@
"@babel/plugin-transform-flow-strip-types": "7.9.0",
"@babel/preset-env": "7.10.0",
"@parse/minami": "1.0.0",
+ "@semantic-release/changelog": "5.0.1",
+ "@semantic-release/commit-analyzer": "8.0.1",
+ "@semantic-release/git": "9.0.0",
+ "@semantic-release/github": "7.2.3",
+ "@semantic-release/npm": "7.1.3",
+ "@semantic-release/release-notes-generator": "9.0.3",
"all-node-versions": "8.0.0",
"apollo-cache-inmemory": "1.6.6",
"apollo-client": "2.6.10",
@@ -98,6 +104,7 @@
"node-fetch": "2.6.1",
"nyc": "15.1.0",
"prettier": "2.0.5",
+ "semantic-release": "17.4.6",
"yaml": "1.10.0"
},
"scripts": {
From 93321658c9e685414547a1eab67a7d3cb4056364 Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Wed, 27 Oct 2021 01:15:40 +0000
Subject: [PATCH 59/96] chore(release): 5.0.0-alpha.2 [skip ci]
# [5.0.0-alpha.2](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.1...5.0.0-alpha.2) (2021-10-27)
### Bug Fixes
* setting a field to null does not delete it via GraphQL API ([#7649](https://github.com/parse-community/parse-server/issues/7649)) ([626fad2](https://github.com/parse-community/parse-server/commit/626fad2e71017dcc62196c487de5f908fa43000b))
### BREAKING CHANGES
* To delete a field via the GraphQL API, the field value has to be set to `null`. Previously, setting a field value to `null` would save a null value in the database, which was not according to the [GraphQL specs](https://spec.graphql.org/June2018/#sec-Null-Value). To delete a file field use `file: null`, the previous way of using `file: { file: null }` has become obsolete. ([626fad2](626fad2))
---
changelogs/CHANGELOG_alpha.md | 12 ++++++++++++
package-lock.json | 2 +-
package.json | 2 +-
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
index 61682908f2..12f2fb5e6d 100644
--- a/changelogs/CHANGELOG_alpha.md
+++ b/changelogs/CHANGELOG_alpha.md
@@ -1,3 +1,15 @@
+# [5.0.0-alpha.2](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.1...5.0.0-alpha.2) (2021-10-27)
+
+
+### Bug Fixes
+
+* setting a field to null does not delete it via GraphQL API ([#7649](https://github.com/parse-community/parse-server/issues/7649)) ([626fad2](https://github.com/parse-community/parse-server/commit/626fad2e71017dcc62196c487de5f908fa43000b))
+
+
+### BREAKING CHANGES
+
+* To delete a field via the GraphQL API, the field value has to be set to `null`. Previously, setting a field value to `null` would save a null value in the database, which was not according to the [GraphQL specs](https://spec.graphql.org/June2018/#sec-Null-Value). To delete a file field use `file: null`, the previous way of using `file: { file: null }` has become obsolete. ([626fad2](626fad2))
+
# [5.0.0-alpha.1](https://github.com/parse-community/parse-server/compare/4.10.4...5.0.0-alpha.1) (2021-10-12)
## Breaking Changes
diff --git a/package-lock.json b/package-lock.json
index 7f3b8e8bdc..400cb13508 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.1",
+ "version": "5.0.0-alpha.2",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 295329aaed..0b18620abb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.1",
+ "version": "5.0.0-alpha.2",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From 758e4b75e72b867209f8caaac1af05fb1dc2ee4d Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 27 Oct 2021 03:23:08 +0200
Subject: [PATCH 60/96] docs: updated changelog entry to PR template
---
.github/pull_request_template.md | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index f7b9b13f1a..72dba372a9 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -22,9 +22,8 @@ Related issue: FILL_THIS_OUT
Delete suggested TODOs that do not apply to this PR.
-->
-- [ ] Add test cases
-- [ ] Add entry to changelog
+- [ ] Add tests
- [ ] Add changes to documentation (guides, repository pages, in-code descriptions)
- [ ] Add [security check](https://github.com/parse-community/parse-server/blob/master/CONTRIBUTING.md#security-checks)
- [ ] Add new Parse Error codes to Parse JS SDK
-- [ ] ...
\ No newline at end of file
+- [x] A changelog entry is created automatically using the pull request title (do not manually add a changelog entry)
From 5dfc3b31ef3b0bea3578367237dab4c276251486 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 27 Oct 2021 03:29:21 +0200
Subject: [PATCH 61/96] ci: remove changelog check
---
.github/workflows/ci.yml | 7 -------
1 file changed, 7 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 20572cdefb..40c4694bfc 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,13 +30,6 @@ jobs:
run: npm ci
- name: CI Node Engine Check
run: npm run ci:checkNodeEngine
- check-changelog:
- name: Changelog
- timeout-minutes: 5
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@v2
- - uses: dangoslen/changelog-enforcer@v2
check-lint:
name: Lint
timeout-minutes: 15
From f1238eaf5797128223f219dc3d5ab573b5489734 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 27 Oct 2021 03:36:18 +0200
Subject: [PATCH 62/96] docs: adapt changelog links temporarily until stable
release
---
CHANGELOG.md | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 51ff85f1af..a977705686 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,7 +15,7 @@ Details:
- Purpose: official release
- Suitable environment: production
-## ⚠️ [Beta Releases][log_beta]
+
## 🔥 [Alpha Releases][log_alpha]
@@ -42,7 +42,8 @@ Details:
- Suitable environment: experimental
-[log_release]: https://github.com/parse-community/parse-server/blob/release/changelogs/CHANGELOG_release.md
+[log_release]: https://github.com/parse-community/parse-server/blob/release/CHANGELOG.md
+
[log_beta]: https://github.com/parse-community/parse-server/blob/beta/changelogs/CHANGELOG_beta.md
[log_alpha]: https://github.com/parse-community/parse-server/blob/alpha/changelogs/CHANGELOG_alpha.md
[branch_release]: https://github.com/parse-community/parse-server/tree/release
From e1f8de80a72fdf88d936a98908f1fd362d6529d3 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 29 Oct 2021 17:57:37 +0200
Subject: [PATCH 63/96] ci: fix docker build with node:lts-alpine (#7663)
---
Dockerfile | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 0749e8d841..a351d090d1 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,20 +1,30 @@
+############################################################
# Build stage
+############################################################
FROM node:lts-alpine as build
RUN apk update; \
apk add git;
WORKDIR /tmp
+
+# Copy package.json first to benefit from layer caching
COPY package*.json ./
-# Copy local dependencies for CI tests
-COPY spec/dependencies spec/dependencies
+# Copy src to have config files for install
+COPY . .
+# Clean npm cache; added to fix an issue with the install process
RUN npm cache clean --force
+
+# Install all dependencies
RUN npm ci
-COPY . .
+
+# Run build steps
RUN npm run build
+############################################################
# Release stage
+############################################################
FROM node:lts-alpine as release
RUN apk update; \
@@ -26,6 +36,7 @@ WORKDIR /parse-server
COPY package*.json ./
+# Clean npm cache; added to fix an issue with the install process
RUN npm cache clean --force
RUN npm ci --production --ignore-scripts
From edb03f214da08cb6e5f09c3a0f11cb4d1d6fa917 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 29 Oct 2021 18:21:38 +0200
Subject: [PATCH 64/96] ci: increase docker ci timeout (#7664)
---
.github/workflows/ci.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 40c4694bfc..d09adab476 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -72,7 +72,7 @@ jobs:
- run: npm run madge:circular
check-docker:
name: Docker Build
- timeout-minutes: 5
+ timeout-minutes: 15
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
From 174886e385e091c6bbd4a84891ef95f80b50d05c Mon Sep 17 00:00:00 2001
From: Kingtous
Date: Sat, 30 Oct 2021 01:03:50 +0800
Subject: [PATCH 65/96] fix: combined `and` query with relational query
condition returns incorrect results (#7593)
---
spec/CloudCode.spec.js | 19 +++++++++++++++++++
src/Controllers/DatabaseController.js | 20 +++++++++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index a695357ae6..17968c33d7 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -3524,4 +3524,23 @@ describe('sendEmail', () => {
'Failed to send email because no mail adapter is configured for Parse Server.'
);
});
+
+ it('should have object found with nested relational data query', async () => {
+ const obj1 = Parse.Object.extend('TestObject');
+ const obj2 = Parse.Object.extend('TestObject2');
+ let item2 = new obj2();
+ item2 = await item2.save();
+ let item1 = new obj1();
+ const relation = item1.relation('rel');
+ relation.add(item2);
+ item1 = await item1.save();
+ Parse.Cloud.beforeFind('TestObject', req => {
+ const additionalQ = new Parse.Query('TestObject');
+ additionalQ.equalTo('rel', item2);
+ return Parse.Query.and(req.query, additionalQ);
+ });
+ const q = new Parse.Query('TestObject');
+ const res = await q.first();
+ expect(res.id).toEqual(item1.id);
+ });
});
diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js
index be2e61ab42..20d5c4ba66 100644
--- a/src/Controllers/DatabaseController.js
+++ b/src/Controllers/DatabaseController.js
@@ -971,6 +971,18 @@ class DatabaseController {
return Promise.resolve(query);
});
}
+ if (query['$and']) {
+ const ors = query['$and'];
+ return Promise.all(
+ ors.map((aQuery, index) => {
+ return this.reduceInRelation(className, aQuery, schema).then(aQuery => {
+ query['$and'][index] = aQuery;
+ });
+ })
+ ).then(() => {
+ return Promise.resolve(query);
+ });
+ }
const promises = Object.keys(query).map(key => {
const t = schema.getExpectedType(className, key);
@@ -1049,7 +1061,13 @@ class DatabaseController {
})
);
}
-
+ if (query['$and']) {
+ return Promise.all(
+ query['$and'].map(aQuery => {
+ return this.reduceRelationKeys(className, aQuery, queryOptions);
+ })
+ );
+ }
var relatedTo = query['$relatedTo'];
if (relatedTo) {
return this.relatedIds(
From 62cc9cae7d9d323f9729aed5a56e9694c6fffb7c Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Fri, 29 Oct 2021 17:04:51 +0000
Subject: [PATCH 66/96] chore(release): 5.0.0-alpha.3 [skip ci]
# [5.0.0-alpha.3](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.2...5.0.0-alpha.3) (2021-10-29)
### Bug Fixes
* combined `and` query with relational query condition returns incorrect results ([#7593](https://github.com/parse-community/parse-server/issues/7593)) ([174886e](https://github.com/parse-community/parse-server/commit/174886e385e091c6bbd4a84891ef95f80b50d05c))
---
changelogs/CHANGELOG_alpha.md | 7 +++++++
package-lock.json | 2 +-
package.json | 2 +-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
index 12f2fb5e6d..66468e4dc2 100644
--- a/changelogs/CHANGELOG_alpha.md
+++ b/changelogs/CHANGELOG_alpha.md
@@ -1,3 +1,10 @@
+# [5.0.0-alpha.3](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.2...5.0.0-alpha.3) (2021-10-29)
+
+
+### Bug Fixes
+
+* combined `and` query with relational query condition returns incorrect results ([#7593](https://github.com/parse-community/parse-server/issues/7593)) ([174886e](https://github.com/parse-community/parse-server/commit/174886e385e091c6bbd4a84891ef95f80b50d05c))
+
# [5.0.0-alpha.2](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.1...5.0.0-alpha.2) (2021-10-27)
diff --git a/package-lock.json b/package-lock.json
index 400cb13508..3b8f72660f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.2",
+ "version": "5.0.0-alpha.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 0b18620abb..d867d40524 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.2",
+ "version": "5.0.0-alpha.3",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From a359c0248b83a1c7d65b472590b1f2866485f936 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 29 Oct 2021 20:05:49 +0200
Subject: [PATCH 67/96] ci: add missing docker archs (#7666)
---
.github/workflows/ci.yml | 11 ++++++++++-
.github/workflows/release-automated.yml | 2 +-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d09adab476..8813a1fe94 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -75,9 +75,18 @@ jobs:
timeout-minutes: 15
runs-on: ubuntu-18.04
steps:
- - uses: actions/checkout@v2
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ - name: Set up QEMU
+ id: qemu
+ uses: docker/setup-qemu-action@v1
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
- name: Build docker image
uses: docker/build-push-action@v2
+ with:
+ context: .
+ platforms: linux/amd64
check-lock-file-version:
name: NPM Lock File Version
timeout-minutes: 5
diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml
index daba13319b..9fdf061fb4 100644
--- a/.github/workflows/release-automated.yml
+++ b/.github/workflows/release-automated.yml
@@ -78,7 +78,7 @@ jobs:
uses: docker/build-push-action@v2
with:
context: .
- platforms: linux/amd64
+ platforms: linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64/v8
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
From 28fa7167e86d36bef71bca99247fd3da92e11e68 Mon Sep 17 00:00:00 2001
From: Frans Bouwmeester
Date: Sat, 30 Oct 2021 19:21:24 +0200
Subject: [PATCH 68/96] test: port test changes from 4.x LTS branch; upgrade
spec reporter from 6.0.0 to 7.0.0 (#7667)
---
package-lock.json | 146 ++++++++++++++++++------------------
package.json | 2 +-
spec/ParseLiveQuery.spec.js | 2 +-
spec/ParseUser.spec.js | 6 +-
4 files changed, 78 insertions(+), 78 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 3b8f72660f..b50599ad68 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8804,9 +8804,9 @@
"dev": true
},
"jasmine-spec-reporter": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-6.0.0.tgz",
- "integrity": "sha512-MvTOVoMxDZAftQYBApIlSfKnGMzi9cj351nXeqtnZTuXffPlbONN31+Es7F+Ke4okUeQ2xISukt4U1npfzLVrQ==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz",
+ "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==",
"dev": true,
"requires": {
"colors": "1.4.0"
@@ -10853,76 +10853,76 @@
"integrity": "sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==",
"dev": true,
"requires": {
- "@isaacs/string-locale-compare": "*",
- "@npmcli/arborist": "*",
- "@npmcli/ci-detect": "*",
- "@npmcli/config": "*",
- "@npmcli/map-workspaces": "*",
- "@npmcli/package-json": "*",
- "@npmcli/run-script": "*",
- "abbrev": "*",
- "ansicolors": "*",
- "ansistyles": "*",
- "archy": "*",
- "cacache": "*",
- "chalk": "*",
- "chownr": "*",
- "cli-columns": "*",
- "cli-table3": "*",
- "columnify": "*",
- "fastest-levenshtein": "*",
- "glob": "*",
- "graceful-fs": "*",
- "hosted-git-info": "*",
- "ini": "*",
- "init-package-json": "*",
- "is-cidr": "*",
- "json-parse-even-better-errors": "*",
- "libnpmaccess": "*",
- "libnpmdiff": "*",
- "libnpmexec": "*",
- "libnpmfund": "*",
- "libnpmhook": "*",
- "libnpmorg": "*",
- "libnpmpack": "*",
- "libnpmpublish": "*",
- "libnpmsearch": "*",
- "libnpmteam": "*",
- "libnpmversion": "*",
- "make-fetch-happen": "*",
- "minipass": "*",
- "minipass-pipeline": "*",
- "mkdirp": "*",
- "mkdirp-infer-owner": "*",
- "ms": "*",
- "node-gyp": "*",
- "nopt": "*",
- "npm-audit-report": "*",
- "npm-install-checks": "*",
- "npm-package-arg": "*",
- "npm-pick-manifest": "*",
- "npm-profile": "*",
- "npm-registry-fetch": "*",
- "npm-user-validate": "*",
- "npmlog": "*",
- "opener": "*",
- "pacote": "*",
- "parse-conflict-json": "*",
- "qrcode-terminal": "*",
- "read": "*",
- "read-package-json": "*",
- "read-package-json-fast": "*",
- "readdir-scoped-modules": "*",
- "rimraf": "*",
- "semver": "*",
- "ssri": "*",
- "tar": "*",
- "text-table": "*",
- "tiny-relative-date": "*",
- "treeverse": "*",
- "validate-npm-package-name": "*",
- "which": "*",
- "write-file-atomic": "*"
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/arborist": "^2.9.0",
+ "@npmcli/ci-detect": "^1.2.0",
+ "@npmcli/config": "^2.3.0",
+ "@npmcli/map-workspaces": "^1.0.4",
+ "@npmcli/package-json": "^1.0.1",
+ "@npmcli/run-script": "^1.8.6",
+ "abbrev": "~1.1.1",
+ "ansicolors": "~0.3.2",
+ "ansistyles": "~0.1.3",
+ "archy": "~1.0.0",
+ "cacache": "^15.3.0",
+ "chalk": "^4.1.2",
+ "chownr": "^2.0.0",
+ "cli-columns": "^3.1.2",
+ "cli-table3": "^0.6.0",
+ "columnify": "~1.5.4",
+ "fastest-levenshtein": "^1.0.12",
+ "glob": "^7.2.0",
+ "graceful-fs": "^4.2.8",
+ "hosted-git-info": "^4.0.2",
+ "ini": "^2.0.0",
+ "init-package-json": "^2.0.5",
+ "is-cidr": "^4.0.2",
+ "json-parse-even-better-errors": "^2.3.1",
+ "libnpmaccess": "^4.0.2",
+ "libnpmdiff": "^2.0.4",
+ "libnpmexec": "^2.0.1",
+ "libnpmfund": "^1.1.0",
+ "libnpmhook": "^6.0.2",
+ "libnpmorg": "^2.0.2",
+ "libnpmpack": "^2.0.1",
+ "libnpmpublish": "^4.0.1",
+ "libnpmsearch": "^3.1.1",
+ "libnpmteam": "^2.0.3",
+ "libnpmversion": "^1.2.1",
+ "make-fetch-happen": "^9.1.0",
+ "minipass": "^3.1.3",
+ "minipass-pipeline": "^1.2.4",
+ "mkdirp": "^1.0.4",
+ "mkdirp-infer-owner": "^2.0.0",
+ "ms": "^2.1.2",
+ "node-gyp": "^7.1.2",
+ "nopt": "^5.0.0",
+ "npm-audit-report": "^2.1.5",
+ "npm-install-checks": "^4.0.0",
+ "npm-package-arg": "^8.1.5",
+ "npm-pick-manifest": "^6.1.1",
+ "npm-profile": "^5.0.3",
+ "npm-registry-fetch": "^11.0.0",
+ "npm-user-validate": "^1.0.1",
+ "npmlog": "^5.0.1",
+ "opener": "^1.5.2",
+ "pacote": "^11.3.5",
+ "parse-conflict-json": "^1.1.1",
+ "qrcode-terminal": "^0.12.0",
+ "read": "~1.0.7",
+ "read-package-json": "^4.1.1",
+ "read-package-json-fast": "^2.0.3",
+ "readdir-scoped-modules": "^1.1.0",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "ssri": "^8.0.1",
+ "tar": "^6.1.11",
+ "text-table": "~0.2.0",
+ "tiny-relative-date": "^1.3.0",
+ "treeverse": "^1.0.4",
+ "validate-npm-package-name": "~3.0.0",
+ "which": "^2.0.2",
+ "write-file-atomic": "^3.0.3"
},
"dependencies": {
"@gar/promisify": {
diff --git a/package.json b/package.json
index d867d40524..6482d027f6 100644
--- a/package.json
+++ b/package.json
@@ -92,7 +92,7 @@
"form-data": "3.0.0",
"husky": "4.2.5",
"jasmine": "3.5.0",
- "jasmine-spec-reporter": "6.0.0",
+ "jasmine-spec-reporter": "7.0.0",
"jsdoc": "3.6.3",
"jsdoc-babel": "0.5.0",
"lint-staged": "10.2.3",
diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js
index ab78a4cfa7..b8b43f7a3d 100644
--- a/spec/ParseLiveQuery.spec.js
+++ b/spec/ParseLiveQuery.spec.js
@@ -970,7 +970,7 @@ describe('ParseLiveQuery', function () {
user.set('yolo', 'bar');
await user.save();
await user.destroy();
- await new Promise(resolve => process.nextTick(resolve));
+ await new Promise(resolve => setTimeout(resolve, 10));
for (const key of events) {
expect(calls[key]).toHaveBeenCalled();
}
diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js
index e14d4847ac..80f6254be8 100644
--- a/spec/ParseUser.spec.js
+++ b/spec/ParseUser.spec.js
@@ -4023,7 +4023,6 @@ describe('Parse.User testing', () => {
subscription.on(key, calls[key]);
}
const user = await Parse.User._logInWith('facebook');
-
user.set('foo', 'bar');
await user.save();
user.unset('foo');
@@ -4031,13 +4030,14 @@ describe('Parse.User testing', () => {
user.set('yolo', 'bar');
await user.save();
await user.destroy();
- await new Promise(resolve => process.nextTick(resolve));
+ await new Promise(resolve => setTimeout(resolve, 10));
for (const key of events) {
expect(calls[key]).toHaveBeenCalled();
}
+ subscription.unsubscribe();
const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
client.close();
- await new Promise(resolve => process.nextTick(resolve));
+ await new Promise(resolve => setTimeout(resolve, 10));
});
});
From 090350a7a0fac945394ca1cb24b290316ef06aa7 Mon Sep 17 00:00:00 2001
From: Corey
Date: Sun, 31 Oct 2021 15:49:03 -0400
Subject: [PATCH 69/96] feat: add support for Postgres 14 (#7644)
---
.github/workflows/ci.yml | 7 ++++-
CONTRIBUTING.md | 6 ++--
README.md | 9 +++---
scripts/before_script_postgres_conf.sh | 30 +++++++++++++++++++
spec/.eslintrc.json | 2 ++
spec/ParseQuery.Aggregate.spec.js | 10 +++----
spec/helper.js | 18 +++++++++++
.../Postgres/PostgresStorageAdapter.js | 8 ++---
8 files changed, 73 insertions(+), 17 deletions(-)
create mode 100755 scripts/before_script_postgres_conf.sh
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8813a1fe94..628903944d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -193,6 +193,9 @@ jobs:
- name: PostgreSQL 13, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:13-3.1
NODE_VERSION: 14.18.1
+ - name: PostgreSQL 14, PostGIS 3.1
+ POSTGRES_IMAGE: postgis/postgis:14-3.1
+ NODE_VERSION: 14.18.1
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 15
@@ -232,7 +235,9 @@ jobs:
${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-
- name: Install dependencies
run: npm ci
- - run: bash scripts/before_script_postgres.sh
+ - run: |
+ bash scripts/before_script_postgres_conf.sh
+ bash scripts/before_script_postgres.sh
- run: npm run coverage
env:
CI: true
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index fb444414b4..eaf4b648d0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -145,13 +145,15 @@ If your pull request introduces a change that may affect the storage or retrieva
- `it_only_mongodb_version('>=4.4')` // will test with any version of Postgres but only with version >=4.4 of MongoDB; accepts semver notation to specify a version range
- `it_exclude_mongodb_version('<4.4')` // will test with any version of Postgres and MongoDB, excluding version <4.4 of MongoDB; accepts semver notation to specify a version range
+ - `it_only_postgres_version('>=13')` // will test with any version of Mongo but only with version >=13 of Postgres; accepts semver notation to specify a version range
+ - `it_exclude_postgres_version('<13')` // will test with any version of Postgres and MongoDB, excluding version <13 of Postgres; accepts semver notation to specify a version range
#### Postgres with Docker
[PostGIS images (select one with v2.2 or higher) on docker dashboard](https://hub.docker.com/r/postgis/postgis) is based off of the official [postgres](https://registry.hub.docker.com/_/postgres/) image and will work out-of-the-box (as long as you create a user with the necessary extensions for each of your Parse databases; see below). To launch the compatible Postgres instance, copy and paste the following line into your shell:
```
-docker run -d --name parse-postgres -p 5432:5432 -e POSTGRES_PASSWORD=password --rm postgis/postgis:11-3.0-alpine && sleep 20 && docker exec -it parse-postgres psql -U postgres -c 'CREATE DATABASE parse_server_postgres_adapter_test_database;' && docker exec -it parse-postgres psql -U postgres -c 'CREATE EXTENSION pgcrypto; CREATE EXTENSION postgis;' -d parse_server_postgres_adapter_test_database && docker exec -it parse-postgres psql -U postgres -c 'CREATE EXTENSION postgis_topology;' -d parse_server_postgres_adapter_test_database
+docker run -d --name parse-postgres -p 5432:5432 -e POSTGRES_PASSWORD=password --rm postgis/postgis:13-3.1-alpine && sleep 20 && docker exec -it parse-postgres psql -U postgres -c 'CREATE DATABASE parse_server_postgres_adapter_test_database;' && docker exec -it parse-postgres psql -U postgres -c 'CREATE EXTENSION pgcrypto; CREATE EXTENSION postgis;' -d parse_server_postgres_adapter_test_database && docker exec -it parse-postgres psql -U postgres -c 'CREATE EXTENSION postgis_topology;' -d parse_server_postgres_adapter_test_database
```
To stop the Postgres instance:
@@ -159,7 +161,7 @@ To stop the Postgres instance:
docker stop parse-postgres
```
-You can also use the [postgis/postgis:11-2.5-alpine](https://hub.docker.com/r/postgis/postgis) image in a Dockerfile and copy this [script](https://github.com/parse-community/parse-server/blob/master/scripts/before_script_postgres.sh) to the image by adding the following lines:
+You can also use the [postgis/postgis:13-3.1-alpine](https://hub.docker.com/r/postgis/postgis) image in a Dockerfile and copy this [script](https://github.com/parse-community/parse-server/blob/master/scripts/before_script_postgres.sh) to the image by adding the following lines:
```
#Install additional scripts. These are run in abc order during initial start
diff --git a/README.md b/README.md
index b46205486f..7e4e0dce8b 100644
--- a/README.md
+++ b/README.md
@@ -2,13 +2,13 @@
---
-[![Build Status](https://github.com/parse-community/parse-server/workflows/ci/badge.svg?branch=master)](https://github.com/parse-community/parse-server/actions?query=workflow%3Aci+branch%3Amaster)
+[![Build Status](https://github.com/parse-community/parse-server/workflows/ci/badge.svg?branch=alpha)](https://github.com/parse-community/parse-server/actions?query=workflow%3Aci+branch%3Aalpha)
[![Snyk Badge](https://snyk.io/test/github/parse-community/parse-server/badge.svg)](https://snyk.io/test/github/parse-community/parse-server)
-[![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server/master.svg)](https://codecov.io/github/parse-community/parse-server?branch=master)
+[![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server/alpha.svg)](https://codecov.io/github/parse-community/parse-server?branch=alpha)
[![Node Version](https://img.shields.io/badge/nodejs-12,_14,_15-green.svg?logo=node.js&style=flat)](https://nodejs.org)
[![MongoDB Version](https://img.shields.io/badge/mongodb-4.0,_4.2,_4.4,_5.0-green.svg?logo=mongodb&style=flat)](https://www.mongodb.com)
-[![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
+[![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13,_14-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)
[![npm latest version](https://img.shields.io/npm/v/parse-server/latest.svg)](https://www.npmjs.com/package/parse-server)
@@ -121,7 +121,7 @@ Parse Server is continuously tested with the most recent releases of MongoDB to
|-------------|----------------|------------------|--------------------|
| MongoDB 4.0 | 4.0.27 | April 2022 | ✅ Fully compatible |
| MongoDB 4.2 | 4.2.17 | TBD | ✅ Fully compatible |
-| MongoDB 4.4 | 4.4.10 | TBD | ✅ Fully compatible |
+| MongoDB 4.4 | 4.4.10 | TBD | ✅ Fully compatible |
| MongoDB 5.0 | 5.0.3 | January 2024 | ✅ Fully compatible |
#### PostgreSQL
@@ -132,6 +132,7 @@ Parse Server is continuously tested with the most recent releases of PostgreSQL
| Postgres 11 | 3.0, 3.1 | November 2023 | April 2022 | ✅ Fully compatible |
| Postgres 12 | 3.1 | November 2024 | April 2023 | ✅ Fully compatible |
| Postgres 13 | 3.1 | November 2025 | April 2024 | ✅ Fully compatible |
+| Postgres 14 | 3.1 | November 2026 | April 2025 | ✅ Fully compatible |
### Locally
```bash
diff --git a/scripts/before_script_postgres_conf.sh b/scripts/before_script_postgres_conf.sh
new file mode 100755
index 0000000000..ec471d9c3f
--- /dev/null
+++ b/scripts/before_script_postgres_conf.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+set -e
+
+echo "[SCRIPT] Before Script :: Setup Parse Postgres configuration file"
+
+# DB Version: 13
+# OS Type: linux
+# DB Type: web
+# Total Memory (RAM): 6 GB
+# CPUs num: 1
+# Data Storage: ssd
+
+PGPASSWORD=postgres psql -v ON_ERROR_STOP=1 -h localhost -U postgres <<-EOSQL
+ ALTER SYSTEM SET max_connections TO '200';
+ ALTER SYSTEM SET shared_buffers TO '1536MB';
+ ALTER SYSTEM SET effective_cache_size TO '4608MB';
+ ALTER SYSTEM SET maintenance_work_mem TO '384MB';
+ ALTER SYSTEM SET checkpoint_completion_target TO '0.9';
+ ALTER SYSTEM SET wal_buffers TO '16MB';
+ ALTER SYSTEM SET default_statistics_target TO '100';
+ ALTER SYSTEM SET random_page_cost TO '1.1';
+ ALTER SYSTEM SET effective_io_concurrency TO '200';
+ ALTER SYSTEM SET work_mem TO '3932kB';
+ ALTER SYSTEM SET min_wal_size TO '1GB';
+ ALTER SYSTEM SET max_wal_size TO '4GB';
+ SELECT pg_reload_conf();
+EOSQL
+
+exec "$@"
diff --git a/spec/.eslintrc.json b/spec/.eslintrc.json
index e76afb3a66..519da96484 100644
--- a/spec/.eslintrc.json
+++ b/spec/.eslintrc.json
@@ -17,8 +17,10 @@
"notEqual": true,
"it_only_db": true,
"it_only_mongodb_version": true,
+ "it_only_postgres_version": true,
"fit_only_mongodb_version": true,
"it_exclude_mongodb_version": true,
+ "it_exclude_postgres_version": true,
"fit_exclude_mongodb_version": true,
"it_exclude_dbs": true,
"describe_only_db": true,
diff --git a/spec/ParseQuery.Aggregate.spec.js b/spec/ParseQuery.Aggregate.spec.js
index 4d6ab59c40..04fa6068ed 100644
--- a/spec/ParseQuery.Aggregate.spec.js
+++ b/spec/ParseQuery.Aggregate.spec.js
@@ -223,9 +223,8 @@ describe('Parse.Query Aggregate testing', () => {
const obj3 = new TestObject();
const pipeline = [
{
- // TODO: update to new syntax. See [#7339](https://bit.ly/3incnWx)
- group: {
- objectId: {
+ $group: {
+ _id: {
day: { $dayOfMonth: '$_updated_at' },
month: { $month: '$_created_at' },
year: { $year: '$_created_at' },
@@ -254,9 +253,8 @@ describe('Parse.Query Aggregate testing', () => {
const obj3 = new TestObject();
const pipeline = [
{
- // TODO: update to new syntax. See [#7339](https://bit.ly/3incnWx)
- group: {
- objectId: {
+ $group: {
+ _id: {
day: { $dayOfMonth: '$updatedAt' },
month: { $month: '$createdAt' },
year: { $year: '$createdAt' },
diff --git a/spec/helper.js b/spec/helper.js
index 49de5c453f..612c716202 100644
--- a/spec/helper.js
+++ b/spec/helper.js
@@ -446,6 +446,15 @@ global.it_only_mongodb_version = version => {
}
};
+global.it_only_postgres_version = version => {
+ const envVersion = process.env.POSTGRES_VERSION;
+ if (!envVersion || semver.satisfies(envVersion, version)) {
+ return it;
+ } else {
+ return xit;
+ }
+};
+
global.fit_only_mongodb_version = version => {
const envVersion = process.env.MONGODB_VERSION;
if (!envVersion || semver.satisfies(envVersion, version)) {
@@ -464,6 +473,15 @@ global.it_exclude_mongodb_version = version => {
}
};
+global.it_exclude_postgres_version = version => {
+ const envVersion = process.env.POSTGRES_VERSION;
+ if (!envVersion || !semver.satisfies(envVersion, version)) {
+ return it;
+ } else {
+ return xit;
+ }
+};
+
global.fit_exclude_mongodb_version = version => {
const envVersion = process.env.MONGODB_VERSION;
if (!envVersion || !semver.satisfies(envVersion, version)) {
diff --git a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
index 5d0e211ab4..065d5c93a3 100644
--- a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
+++ b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
@@ -1983,10 +1983,10 @@ export class PostgresStorageAdapter implements StorageAdapter {
return this._client
.one(qs, values, a => {
- if (a.approximate_row_count != null) {
- return +a.approximate_row_count;
+ if (a.approximate_row_count == null || a.approximate_row_count == -1) {
+ return !isNaN(+a.count) ? +a.count : 0;
} else {
- return +a.count;
+ return +a.approximate_row_count;
}
})
.catch(error => {
@@ -2111,7 +2111,7 @@ export class PostgresStorageAdapter implements StorageAdapter {
columns.push(
`EXTRACT(${
mongoAggregateToPostgres[operation]
- } FROM $${index}:name AT TIME ZONE 'UTC') AS $${index + 1}:name`
+ } FROM $${index}:name AT TIME ZONE 'UTC')::integer AS $${index + 1}:name`
);
values.push(source, alias);
index += 2;
From 87e65d8207e823864d66efece4f160d17077a613 Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Sun, 31 Oct 2021 19:49:58 +0000
Subject: [PATCH 70/96] chore(release): 5.0.0-alpha.4 [skip ci]
# [5.0.0-alpha.4](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.3...5.0.0-alpha.4) (2021-10-31)
### Features
* add support for Postgres 14 ([#7644](https://github.com/parse-community/parse-server/issues/7644)) ([090350a](https://github.com/parse-community/parse-server/commit/090350a7a0fac945394ca1cb24b290316ef06aa7))
---
changelogs/CHANGELOG_alpha.md | 7 +++++++
package-lock.json | 2 +-
package.json | 2 +-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
index 66468e4dc2..7fc9f29fd6 100644
--- a/changelogs/CHANGELOG_alpha.md
+++ b/changelogs/CHANGELOG_alpha.md
@@ -1,3 +1,10 @@
+# [5.0.0-alpha.4](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.3...5.0.0-alpha.4) (2021-10-31)
+
+
+### Features
+
+* add support for Postgres 14 ([#7644](https://github.com/parse-community/parse-server/issues/7644)) ([090350a](https://github.com/parse-community/parse-server/commit/090350a7a0fac945394ca1cb24b290316ef06aa7))
+
# [5.0.0-alpha.3](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.2...5.0.0-alpha.3) (2021-10-29)
diff --git a/package-lock.json b/package-lock.json
index b50599ad68..376d030e26 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.3",
+ "version": "5.0.0-alpha.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 6482d027f6..a5f8ec2b78 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.3",
+ "version": "5.0.0-alpha.4",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From 42ecf6c613e1978d63a270cb30af2a5c426d1f6b Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Sun, 31 Oct 2021 21:40:21 +0100
Subject: [PATCH 71/96] docs: add versioning system to contribution guide
(#7294)
---
CONTRIBUTING.md | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index eaf4b648d0..7e620fbc78 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -22,6 +22,7 @@
- [Pull Request](#pull-request)
- [Breaking Change](#breaking-change)
- [Merging](#merging)
+- [Versioning](#versioning)
- [Code of Conduct](#code-of-conduct)
## Contributing
@@ -346,6 +347,27 @@ The following guide is for anyone who merges a contributor pull request into the
- A contributor pull request must be merged into the working branch using `Squash and Merge`, to create a single commit message that describes the change.
- A release branch or the default branch must be merged into another release branch using `Merge Commit`, to preserve each individual commit message that describes its respective change.
+## Versioning
+
+> The following versioning system is applied since Parse Server 5.0.0 and does not necessarily apply to previous releases.
+
+Parse Server follows [semantic versioning](https://semver.org) with a flavor of [calendric versioning](https://calver.org). Semantic versioning makes Parse Server easy to upgrade because breaking changes only occur in major releases. Calendric versioning gives an additional sense of how old a Parse Server release is and allows for Long-Term Support of previous major releases.
+
+Example version: `5.0.0-alpha.1`
+
+Syntax: `[major]`**.**`[minor]`**.**`[patch]`**-**`[pre-release-label]`**.**`[pre-release-increment]`
+
+- The `major` version increments with the first release of every year and may include changes that are *not backwards compatible*.
+- The `minor` version increments during the year and may include new features or improvements of existing features that are backwards compatible.
+- The `patch` version increments during the year and may include bug fixes that are backwards compatible.
+- The `pre-release-label` is optional for pre-release versions such as:
+ - `-alpha` (likely to contain bugs, likely to change in features until release)
+ - `-beta` (likely to contain bugs, no change in features until release)
+- The `[pre-release-increment]` is a number that increments with every new version of a pre-release
+
+Exceptions:
+- The `major` version may increment during the year in the unlikely event that a breaking change is so urgent that it cannot wait for the next yearly release. An example would be a vulnerability fix that leads to an unavoidable breaking change. However, security requirements depend on the application and not every vulnerability may affect every deployment, depending on the features used. Therefore we usually prefer to deprecate insecure functionality and introduce the breaking change following our [deprecation policy](#deprecation-policy).
+
## Code of Conduct
This project adheres to the [Contributor Covenant Code of Conduct](https://github.com/parse-community/parse-server/blob/master/CODE_OF_CONDUCT.md). By participating, you are expected to honor this code.
From 762162253df9e207352d86c9be95cf14ab30d90e Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Mon, 1 Nov 2021 01:12:16 +0100
Subject: [PATCH 72/96] docs: slim compatibility tables in README
---
README.md | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/README.md b/README.md
index 7e4e0dce8b..54524fd16d 100644
--- a/README.md
+++ b/README.md
@@ -108,31 +108,31 @@ Before you start make sure you have installed:
#### Node.js
Parse Server is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
-| Version | Latest Version | End-of-Life Date | Compatibility |
-|------------|----------------|------------------|--------------------|
-| Node.js 12 | 12.22.7 | April 2022 | ✅ Fully compatible |
-| Node.js 14 | 14.18.1 | April 2023 | ✅ Fully compatible |
-| Node.js 15 | 15.14.0 | June 2021 | ✅ Fully compatible |
+| Version | Latest Version | End-of-Life | Compatible |
+|------------|----------------|-------------|------------|
+| Node.js 12 | 12.22.7 | April 2022 | ✅ Yes |
+| Node.js 14 | 14.18.1 | April 2023 | ✅ Yes |
+| Node.js 15 | 15.14.0 | June 2021 | ✅ Yes |
#### MongoDB
Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and only test against versions that are officially supported and have not reached their end-of-life date.
-| Version | Latest Version | End-of-Life Date | Compatibility |
-|-------------|----------------|------------------|--------------------|
-| MongoDB 4.0 | 4.0.27 | April 2022 | ✅ Fully compatible |
-| MongoDB 4.2 | 4.2.17 | TBD | ✅ Fully compatible |
-| MongoDB 4.4 | 4.4.10 | TBD | ✅ Fully compatible |
-| MongoDB 5.0 | 5.0.3 | January 2024 | ✅ Fully compatible |
+| Version | Latest Version | End-of-Life | Compatible |
+|-------------|----------------|--------------|------------|
+| MongoDB 4.0 | 4.0.27 | April 2022 | ✅ Yes |
+| MongoDB 4.2 | 4.2.17 | TBD | ✅ Yes |
+| MongoDB 4.4 | 4.4.10 | TBD | ✅ Yes |
+| MongoDB 5.0 | 5.0.3 | January 2024 | ✅ Yes |
#### PostgreSQL
Parse Server is continuously tested with the most recent releases of PostgreSQL and PostGIS to ensure compatibility, using [PostGIS docker images](https://registry.hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated). We follow the [PostgreSQL support schedule](https://www.postgresql.org/support/versioning) and [PostGIS support schedule](https://www.postgis.net/eol_policy/) and only test against versions that are officially supported and have not reached their end-of-life date. Due to the extensive PostgreSQL support duration of 5 years, Parse Server drops support if a version is older than 3.5 years and a newer version has been available for at least 2.5 years.
-| Version | PostGIS Version | End-of-Life Date | Parse Server Support End | Compatibility |
-|-------------|-----------------|------------------|--------------------------|--------------------|
-| Postgres 11 | 3.0, 3.1 | November 2023 | April 2022 | ✅ Fully compatible |
-| Postgres 12 | 3.1 | November 2024 | April 2023 | ✅ Fully compatible |
-| Postgres 13 | 3.1 | November 2025 | April 2024 | ✅ Fully compatible |
-| Postgres 14 | 3.1 | November 2026 | April 2025 | ✅ Fully compatible |
+| Version | PostGIS Version | End-of-Life | Parse Server Support End | Compatible |
+|-------------|-----------------|---------------|--------------------------|------------|
+| Postgres 11 | 3.0, 3.1 | November 2023 | April 2022 | ✅ Yes |
+| Postgres 12 | 3.1 | November 2024 | April 2023 | ✅ Yes |
+| Postgres 13 | 3.1 | November 2025 | April 2024 | ✅ Yes |
+| Postgres 14 | 3.1 | November 2026 | April 2025 | ✅ Yes |
### Locally
```bash
From 653d25731fa61c3abff674c22e8ee531435729e1 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Mon, 1 Nov 2021 01:15:44 +0100
Subject: [PATCH 73/96] docs: add Node 16 compatibility to README
---
README.md | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 54524fd16d..a25752cc6e 100644
--- a/README.md
+++ b/README.md
@@ -108,11 +108,12 @@ Before you start make sure you have installed:
#### Node.js
Parse Server is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
-| Version | Latest Version | End-of-Life | Compatible |
-|------------|----------------|-------------|------------|
-| Node.js 12 | 12.22.7 | April 2022 | ✅ Yes |
-| Node.js 14 | 14.18.1 | April 2023 | ✅ Yes |
-| Node.js 15 | 15.14.0 | June 2021 | ✅ Yes |
+| Version | Latest Version | End-of-Life | Compatible |
+|------------|----------------|-------------|---------------|
+| Node.js 12 | 12.22.7 | April 2022 | ✅ Yes |
+| Node.js 14 | 14.18.1 | April 2023 | ✅ Yes |
+| Node.js 15 | 15.14.0 | June 2021 | ✅ Yes |
+| Node.js 16 | 16.x.x | April 2024 | ❌ Not tested |
#### MongoDB
Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and only test against versions that are officially supported and have not reached their end-of-life date.
From 25d5c30be2111be332eb779eb0697774a17da7af Mon Sep 17 00:00:00 2001
From: Samuel Denis-D'Ortun
Date: Mon, 1 Nov 2021 09:28:49 -0400
Subject: [PATCH 74/96] feat: add user-defined schema and migrations (#7418)
---
spec/DefinedSchemas.spec.js | 644 ++++++++++++++++++
spec/schemas.spec.js | 4 +-
.../Storage/Mongo/MongoSchemaCollection.js | 18 +-
.../Storage/Mongo/MongoStorageAdapter.js | 5 +
.../Storage/Postgres/PostgresClient.js | 2 +-
.../Postgres/PostgresStorageAdapter.js | 10 +
src/Adapters/Storage/StorageAdapter.js | 1 +
src/Config.js | 45 ++
src/Controllers/SchemaController.js | 24 +-
src/Options/Definitions.js | 39 ++
src/Options/index.js | 5 +-
src/ParseServer.js | 7 +-
src/Routers/SchemasRouter.js | 65 +-
src/SchemaMigrations/DefinedSchemas.js | 434 ++++++++++++
src/SchemaMigrations/Migrations.js | 95 +++
src/index.js | 3 +
16 files changed, 1365 insertions(+), 36 deletions(-)
create mode 100644 spec/DefinedSchemas.spec.js
create mode 100644 src/SchemaMigrations/DefinedSchemas.js
create mode 100644 src/SchemaMigrations/Migrations.js
diff --git a/spec/DefinedSchemas.spec.js b/spec/DefinedSchemas.spec.js
new file mode 100644
index 0000000000..9cc164640c
--- /dev/null
+++ b/spec/DefinedSchemas.spec.js
@@ -0,0 +1,644 @@
+const { DefinedSchemas } = require('../lib/SchemaMigrations/DefinedSchemas');
+const Config = require('../lib/Config');
+
+const cleanUpIndexes = schema => {
+ if (schema.indexes) {
+ delete schema.indexes._id_;
+ if (!Object.keys(schema.indexes).length) {
+ delete schema.indexes;
+ }
+ }
+};
+
+describe('DefinedSchemas', () => {
+ let config;
+ afterEach(async () => {
+ config = Config.get('test');
+ if (config) {
+ await config.database.adapter.deleteAllClasses();
+ }
+ });
+
+ describe('Fields', () => {
+ it('should keep default fields if not provided', async () => {
+ const server = await reconfigureServer();
+ // Will perform create
+ await new DefinedSchemas({ definitions: [{ className: 'Test' }] }, server.config).execute();
+ let schema = await new Parse.Schema('Test').get();
+ const expectedFields = {
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ ACL: { type: 'ACL' },
+ };
+ expect(schema.fields).toEqual(expectedFields);
+
+ await server.config.schemaCache.clear();
+ // Will perform update
+ await new DefinedSchemas({ definitions: [{ className: 'Test' }] }, server.config).execute();
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields).toEqual(expectedFields);
+ });
+ it('should protect default fields', async () => {
+ const server = await reconfigureServer();
+
+ const schemas = {
+ definitions: [
+ {
+ className: '_User',
+ fields: {
+ email: 'Object',
+ },
+ },
+ {
+ className: '_Role',
+ fields: {
+ users: 'Object',
+ },
+ },
+ {
+ className: '_Installation',
+ fields: {
+ installationId: 'Object',
+ },
+ },
+ {
+ className: 'Test',
+ fields: {
+ createdAt: { type: 'Object' },
+ objectId: { type: 'Number' },
+ updatedAt: { type: 'String' },
+ ACL: { type: 'String' },
+ },
+ },
+ ],
+ };
+
+ const expectedFields = {
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ ACL: { type: 'ACL' },
+ };
+
+ const expectedUserFields = {
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ ACL: { type: 'ACL' },
+ username: { type: 'String' },
+ password: { type: 'String' },
+ email: { type: 'String' },
+ emailVerified: { type: 'Boolean' },
+ authData: { type: 'Object' },
+ };
+
+ const expectedRoleFields = {
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ ACL: { type: 'ACL' },
+ name: { type: 'String' },
+ users: { type: 'Relation', targetClass: '_User' },
+ roles: { type: 'Relation', targetClass: '_Role' },
+ };
+
+ const expectedInstallationFields = {
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ ACL: { type: 'ACL' },
+ installationId: { type: 'String' },
+ deviceToken: { type: 'String' },
+ channels: { type: 'Array' },
+ deviceType: { type: 'String' },
+ pushType: { type: 'String' },
+ GCMSenderId: { type: 'String' },
+ timeZone: { type: 'String' },
+ localeIdentifier: { type: 'String' },
+ badge: { type: 'Number' },
+ appVersion: { type: 'String' },
+ appName: { type: 'String' },
+ appIdentifier: { type: 'String' },
+ parseVersion: { type: 'String' },
+ };
+
+ // Perform create
+ await new DefinedSchemas(schemas, server.config).execute();
+ let schema = await new Parse.Schema('Test').get();
+ expect(schema.fields).toEqual(expectedFields);
+
+ let userSchema = await new Parse.Schema('_User').get();
+ expect(userSchema.fields).toEqual(expectedUserFields);
+
+ let roleSchema = await new Parse.Schema('_Role').get();
+ expect(roleSchema.fields).toEqual(expectedRoleFields);
+
+ let installationSchema = await new Parse.Schema('_Installation').get();
+ expect(installationSchema.fields).toEqual(expectedInstallationFields);
+
+ await server.config.schemaCache.clear();
+ // Perform update
+ await new DefinedSchemas(schemas, server.config).execute();
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields).toEqual(expectedFields);
+
+ userSchema = await new Parse.Schema('_User').get();
+ expect(userSchema.fields).toEqual(expectedUserFields);
+
+ roleSchema = await new Parse.Schema('_Role').get();
+ expect(roleSchema.fields).toEqual(expectedRoleFields);
+
+ installationSchema = await new Parse.Schema('_Installation').get();
+ expect(installationSchema.fields).toEqual(expectedInstallationFields);
+ });
+ it('should create new fields', async () => {
+ const server = await reconfigureServer();
+ const fields = {
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ ACL: { type: 'ACL' },
+ aString: { type: 'String' },
+ aStringWithDefault: { type: 'String', defaultValue: 'Test' },
+ aStringWithRequired: { type: 'String', required: true },
+ aStringWithRequiredAndDefault: { type: 'String', required: true, defaultValue: 'Test' },
+ aBoolean: { type: 'Boolean' },
+ aFile: { type: 'File' },
+ aNumber: { type: 'Number' },
+ aRelation: { type: 'Relation', targetClass: '_User' },
+ aPointer: { type: 'Pointer', targetClass: '_Role' },
+ aDate: { type: 'Date' },
+ aGeoPoint: { type: 'GeoPoint' },
+ aPolygon: { type: 'Polygon' },
+ aArray: { type: 'Array' },
+ aObject: { type: 'Object' },
+ };
+ const schemas = {
+ definitions: [
+ {
+ className: 'Test',
+ fields,
+ },
+ ],
+ };
+
+ // Create
+ await new DefinedSchemas(schemas, server.config).execute();
+ let schema = await new Parse.Schema('Test').get();
+ expect(schema.fields).toEqual(fields);
+
+ fields.anotherObject = { type: 'Object' };
+ // Update
+ await new DefinedSchemas(schemas, server.config).execute();
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields).toEqual(fields);
+ });
+ it('should not delete removed fields when "deleteExtraFields" is false', async () => {
+ const server = await reconfigureServer();
+
+ await new DefinedSchemas(
+ { definitions: [{ className: 'Test', fields: { aField: { type: 'String' } } }] },
+ server.config
+ ).execute();
+
+ let schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toBeDefined();
+
+ await new DefinedSchemas({ definitions: [{ className: 'Test' }] }, server.config).execute();
+
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields).toEqual({
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ aField: { type: 'String' },
+ ACL: { type: 'ACL' },
+ });
+ });
+ it('should delete removed fields when "deleteExtraFields" is true', async () => {
+ const server = await reconfigureServer();
+
+ await new DefinedSchemas(
+ {
+ definitions: [{ className: 'Test', fields: { aField: { type: 'String' } } }],
+ },
+ server.config
+ ).execute();
+
+ let schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toBeDefined();
+
+ await new DefinedSchemas(
+ { deleteExtraFields: true, definitions: [{ className: 'Test' }] },
+ server.config
+ ).execute();
+
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields).toEqual({
+ objectId: { type: 'String' },
+ createdAt: { type: 'Date' },
+ updatedAt: { type: 'Date' },
+ ACL: { type: 'ACL' },
+ });
+ });
+ it('should re create fields with changed type when "recreateModifiedFields" is true', async () => {
+ const server = await reconfigureServer();
+
+ await new DefinedSchemas(
+ { definitions: [{ className: 'Test', fields: { aField: { type: 'String' } } }] },
+ server.config
+ ).execute();
+
+ let schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toEqual({ type: 'String' });
+
+ const object = new Parse.Object('Test');
+ await object.save({ aField: 'Hello' }, { useMasterKey: true });
+
+ await new DefinedSchemas(
+ {
+ recreateModifiedFields: true,
+ definitions: [{ className: 'Test', fields: { aField: { type: 'Number' } } }],
+ },
+ server.config
+ ).execute();
+
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toEqual({ type: 'Number' });
+
+ await object.fetch({ useMasterKey: true });
+ expect(object.get('aField')).toBeUndefined();
+ });
+ it('should not re create fields with changed type when "recreateModifiedFields" is not true', async () => {
+ const server = await reconfigureServer();
+
+ await new DefinedSchemas(
+ { definitions: [{ className: 'Test', fields: { aField: { type: 'String' } } }] },
+ server.config
+ ).execute();
+
+ let schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toEqual({ type: 'String' });
+
+ const object = new Parse.Object('Test');
+ await object.save({ aField: 'Hello' }, { useMasterKey: true });
+
+ await new DefinedSchemas(
+ { definitions: [{ className: 'Test', fields: { aField: { type: 'Number' } } }] },
+ server.config
+ ).execute();
+
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toEqual({ type: 'String' });
+
+ await object.fetch({ useMasterKey: true });
+ expect(object.get('aField')).toBeDefined();
+ });
+ it('should just update classic fields with changed params', async () => {
+ const server = await reconfigureServer();
+
+ await new DefinedSchemas(
+ { definitions: [{ className: 'Test', fields: { aField: { type: 'String' } } }] },
+ server.config
+ ).execute();
+
+ let schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toEqual({ type: 'String' });
+
+ const object = new Parse.Object('Test');
+ await object.save({ aField: 'Hello' }, { useMasterKey: true });
+
+ await new DefinedSchemas(
+ {
+ definitions: [
+ { className: 'Test', fields: { aField: { type: 'String', required: true } } },
+ ],
+ },
+ server.config
+ ).execute();
+
+ schema = await new Parse.Schema('Test').get();
+ expect(schema.fields.aField).toEqual({ type: 'String', required: true });
+
+ await object.fetch({ useMasterKey: true });
+ expect(object.get('aField')).toEqual('Hello');
+ });
+ });
+
+ describe('Indexes', () => {
+ it('should create new indexes', async () => {
+ const server = await reconfigureServer();
+
+ const indexes = { complex: { createdAt: 1, updatedAt: 1 } };
+
+ const schemas = {
+ definitions: [{ className: 'Test', fields: { aField: { type: 'String' } }, indexes }],
+ };
+ await new DefinedSchemas(schemas, server.config).execute();
+
+ let schema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(schema);
+ expect(schema.indexes).toEqual(indexes);
+
+ indexes.complex2 = { createdAt: 1, aField: 1 };
+ await new DefinedSchemas(schemas, server.config).execute();
+ schema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(schema);
+ expect(schema.indexes).toEqual(indexes);
+ });
+ it('should re create changed indexes', async () => {
+ const server = await reconfigureServer();
+
+ let indexes = { complex: { createdAt: 1, updatedAt: 1 } };
+
+ let schemas = { definitions: [{ className: 'Test', indexes }] };
+ await new DefinedSchemas(schemas, server.config).execute();
+
+ indexes = { complex: { createdAt: 1 } };
+ schemas = { definitions: [{ className: 'Test', indexes }] };
+
+ // Change indexes
+ await new DefinedSchemas(schemas, server.config).execute();
+ let schema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(schema);
+ expect(schema.indexes).toEqual(indexes);
+
+ // Update
+ await new DefinedSchemas(schemas, server.config).execute();
+ schema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(schema);
+ expect(schema.indexes).toEqual(indexes);
+ });
+
+ it('should delete removed indexes', async () => {
+ const server = await reconfigureServer();
+
+ let indexes = { complex: { createdAt: 1, updatedAt: 1 } };
+
+ let schemas = { definitions: [{ className: 'Test', indexes }] };
+ await new DefinedSchemas(schemas, server.config).execute();
+
+ indexes = {};
+ schemas = { definitions: [{ className: 'Test', indexes }] };
+ // Change indexes
+ await new DefinedSchemas(schemas, server.config).execute();
+ let schema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(schema);
+ expect(schema.indexes).toBeUndefined();
+
+ // Update
+ await new DefinedSchemas(schemas, server.config).execute();
+ schema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(schema);
+ expect(schema.indexes).toBeUndefined();
+ });
+ xit('should keep protected indexes', async () => {
+ const server = await reconfigureServer();
+
+ const expectedIndexes = {
+ username_1: { username: 1 },
+ case_insensitive_username: { username: 1 },
+ email_1: { email: 1 },
+ case_insensitive_email: { email: 1 },
+ };
+ const schemas = {
+ definitions: [
+ {
+ className: '_User',
+ indexes: {
+ case_insensitive_username: { password: true },
+ case_insensitive_email: { password: true },
+ },
+ },
+ { className: 'Test' },
+ ],
+ };
+ // Create
+ await new DefinedSchemas(schemas, server.config).execute();
+ let userSchema = await new Parse.Schema('_User').get();
+ let testSchema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(userSchema);
+ cleanUpIndexes(testSchema);
+ expect(testSchema.indexes).toBeUndefined();
+ expect(userSchema.indexes).toEqual(expectedIndexes);
+
+ // Update
+ await new DefinedSchemas(schemas, server.config).execute();
+ userSchema = await new Parse.Schema('_User').get();
+ testSchema = await new Parse.Schema('Test').get();
+ cleanUpIndexes(userSchema);
+ cleanUpIndexes(testSchema);
+ expect(testSchema.indexes).toBeUndefined();
+ expect(userSchema.indexes).toEqual(expectedIndexes);
+ });
+ });
+
+ describe('ClassLevelPermissions', () => {
+ it('should use default CLP', async () => {
+ const server = await reconfigureServer();
+ const schemas = { definitions: [{ className: 'Test' }] };
+ await new DefinedSchemas(schemas, server.config).execute();
+
+ const expectedTestCLP = {
+ find: {},
+ count: {},
+ get: {},
+ create: {},
+ update: {},
+ delete: {},
+ addField: {},
+ protectedFields: {},
+ };
+ let testSchema = await new Parse.Schema('Test').get();
+ expect(testSchema.classLevelPermissions).toEqual(expectedTestCLP);
+
+ await new DefinedSchemas(schemas, server.config).execute();
+ testSchema = await new Parse.Schema('Test').get();
+ expect(testSchema.classLevelPermissions).toEqual(expectedTestCLP);
+ });
+ it('should save CLP', async () => {
+ const server = await reconfigureServer();
+
+ const expectedTestCLP = {
+ find: {},
+ count: { requiresAuthentication: true },
+ get: { 'role:Admin': true },
+ create: { 'role:ARole': true, requiresAuthentication: true },
+ update: { requiresAuthentication: true },
+ delete: { requiresAuthentication: true },
+ addField: {},
+ protectedFields: { '*': ['aField'], 'role:Admin': ['anotherField'] },
+ };
+ const schemas = {
+ definitions: [
+ {
+ className: 'Test',
+ fields: { aField: { type: 'String' }, anotherField: { type: 'Object' } },
+ classLevelPermissions: expectedTestCLP,
+ },
+ ],
+ };
+ await new DefinedSchemas(schemas, server.config).execute();
+
+ let testSchema = await new Parse.Schema('Test').get();
+ expect(testSchema.classLevelPermissions).toEqual(expectedTestCLP);
+
+ expectedTestCLP.update = {};
+ expectedTestCLP.create = { requiresAuthentication: true };
+
+ await new DefinedSchemas(schemas, server.config).execute();
+ testSchema = await new Parse.Schema('Test').get();
+ expect(testSchema.classLevelPermissions).toEqual(expectedTestCLP);
+ });
+ it('should force addField to empty', async () => {
+ const server = await reconfigureServer();
+ const schemas = {
+ definitions: [{ className: 'Test', classLevelPermissions: { addField: { '*': true } } }],
+ };
+ await new DefinedSchemas(schemas, server.config).execute();
+
+ const expectedTestCLP = {
+ find: {},
+ count: {},
+ get: {},
+ create: {},
+ update: {},
+ delete: {},
+ addField: {},
+ protectedFields: {},
+ };
+
+ let testSchema = await new Parse.Schema('Test').get();
+ expect(testSchema.classLevelPermissions).toEqual(expectedTestCLP);
+
+ await new DefinedSchemas(schemas, server.config).execute();
+ testSchema = await new Parse.Schema('Test').get();
+ expect(testSchema.classLevelPermissions).toEqual(expectedTestCLP);
+ });
+ });
+
+ it('should not delete automatically classes', async () => {
+ await reconfigureServer({
+ schema: { definitions: [{ className: '_User' }, { className: 'Test' }] },
+ });
+
+ await reconfigureServer({ schema: { definitions: [{ className: '_User' }] } });
+
+ const schema = await new Parse.Schema('Test').get();
+ expect(schema.className).toEqual('Test');
+ });
+
+ it('should disable class PUT/POST endpoint when lockSchemas provided to avoid dual source of truth', async () => {
+ await reconfigureServer({
+ schema: {
+ lockSchemas: true,
+ definitions: [{ className: '_User' }, { className: 'Test' }],
+ },
+ });
+
+ const schema = await new Parse.Schema('Test').get();
+ expect(schema.className).toEqual('Test');
+
+ const schemas = await Parse.Schema.all();
+ // Role could be flaky since all system classes are not ensured
+ // at start up by the DefinedSchema system
+ expect(schemas.filter(({ className }) => className !== '_Role').length).toEqual(3);
+
+ await expectAsync(new Parse.Schema('TheNewTest').save()).toBeRejectedWithError(
+ 'Cannot perform this operation when schemas options is used.'
+ );
+
+ await expectAsync(new Parse.Schema('_User').update()).toBeRejectedWithError(
+ 'Cannot perform this operation when schemas options is used.'
+ );
+ });
+ it('should only enable delete class endpoint since', async () => {
+ await reconfigureServer({
+ schema: { definitions: [{ className: '_User' }, { className: 'Test' }] },
+ });
+ await reconfigureServer({ schema: { definitions: [{ className: '_User' }] } });
+
+ let schemas = await Parse.Schema.all();
+ expect(schemas.length).toEqual(4);
+
+ await new Parse.Schema('_User').delete();
+ schemas = await Parse.Schema.all();
+ expect(schemas.length).toEqual(3);
+ });
+ it('should run beforeMigration before execution of DefinedSchemas', async () => {
+ const config = {
+ schema: {
+ definitions: [{ className: '_User' }, { className: 'Test' }],
+ beforeMigration: async () => {},
+ },
+ };
+ const spy = spyOn(config.schema, 'beforeMigration');
+ await reconfigureServer(config);
+ expect(spy).toHaveBeenCalledTimes(1);
+ });
+ it('should run afterMigration after execution of DefinedSchemas', async () => {
+ const config = {
+ schema: {
+ definitions: [{ className: '_User' }, { className: 'Test' }],
+ afterMigration: async () => {},
+ },
+ };
+ const spy = spyOn(config.schema, 'afterMigration');
+ await reconfigureServer(config);
+ expect(spy).toHaveBeenCalledTimes(1);
+ });
+
+ it('should use logger in case of error', async () => {
+ const server = await reconfigureServer({ schema: { definitions: [{ className: '_User' }] } });
+ const error = new Error('A test error');
+ const logger = require('../lib/logger').logger;
+ spyOn(DefinedSchemas.prototype, 'wait').and.resolveTo();
+ spyOn(logger, 'error').and.callThrough();
+ spyOn(Parse.Schema, 'all').and.callFake(() => {
+ throw error;
+ });
+
+ await new DefinedSchemas(
+ { definitions: [{ className: 'Test', fields: { aField: { type: 'String' } } }] },
+ server.config
+ ).execute();
+
+ expect(logger.error).toHaveBeenCalledWith(`Failed to run migrations: ${error.toString()}`);
+ });
+ it('should perform migration in parallel without failing', async () => {
+ const server = await reconfigureServer();
+ const logger = require('../lib/logger').logger;
+ spyOn(logger, 'error').and.callThrough();
+ const migrationOptions = {
+ definitions: [
+ {
+ className: 'Test',
+ fields: { aField: { type: 'String' } },
+ indexes: { aField: { aField: 1 } },
+ classLevelPermissions: {
+ create: { requiresAuthentication: true },
+ },
+ },
+ ],
+ };
+
+ // Simulate parallel deployment
+ await Promise.all([
+ new DefinedSchemas(migrationOptions, server.config).execute(),
+ new DefinedSchemas(migrationOptions, server.config).execute(),
+ new DefinedSchemas(migrationOptions, server.config).execute(),
+ new DefinedSchemas(migrationOptions, server.config).execute(),
+ new DefinedSchemas(migrationOptions, server.config).execute(),
+ ]);
+
+ const testSchema = (await Parse.Schema.all()).find(
+ ({ className }) => className === migrationOptions.definitions[0].className
+ );
+
+ expect(testSchema.indexes.aField).toEqual({ aField: 1 });
+ expect(testSchema.fields.aField).toEqual({ type: 'String' });
+ expect(testSchema.classLevelPermissions.create).toEqual({ requiresAuthentication: true });
+ expect(logger.error).toHaveBeenCalledTimes(0);
+ });
+});
diff --git a/spec/schemas.spec.js b/spec/schemas.spec.js
index 15dc9e111e..5180b36ca5 100644
--- a/spec/schemas.spec.js
+++ b/spec/schemas.spec.js
@@ -759,7 +759,7 @@ describe('schemas', () => {
});
});
- it('refuses to put to existing fields, even if it would not be a change', done => {
+ it('refuses to put to existing fields with different type, even if it would not be a change', done => {
const obj = hasAllPODobject();
obj.save().then(() => {
request({
@@ -769,7 +769,7 @@ describe('schemas', () => {
json: true,
body: {
fields: {
- aString: { type: 'String' },
+ aString: { type: 'Number' },
},
},
}).then(fail, response => {
diff --git a/src/Adapters/Storage/Mongo/MongoSchemaCollection.js b/src/Adapters/Storage/Mongo/MongoSchemaCollection.js
index d2f89d75d4..78284503fc 100644
--- a/src/Adapters/Storage/Mongo/MongoSchemaCollection.js
+++ b/src/Adapters/Storage/Mongo/MongoSchemaCollection.js
@@ -212,7 +212,7 @@ class MongoSchemaCollection {
.then(
schema => {
// If a field with this name already exists, it will be handled elsewhere.
- if (schema.fields[fieldName] != undefined) {
+ if (schema.fields[fieldName] !== undefined) {
return;
}
// The schema exists. Check for existing GeoPoints.
@@ -274,6 +274,22 @@ class MongoSchemaCollection {
}
});
}
+
+ async updateFieldOptions(className: string, fieldName: string, fieldType: any) {
+ const { ...fieldOptions } = fieldType;
+ delete fieldOptions.type;
+ delete fieldOptions.targetClass;
+
+ await this.upsertSchema(
+ className,
+ { [fieldName]: { $exists: true } },
+ {
+ $set: {
+ [`_metadata.fields_options.${fieldName}`]: fieldOptions,
+ },
+ }
+ );
+ }
}
// Exported for testing reasons and because we haven't moved all mongo schema format
diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js
index e134f0c06f..c1fe63ba9b 100644
--- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js
+++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js
@@ -362,6 +362,11 @@ export class MongoStorageAdapter implements StorageAdapter {
.catch(err => this.handleError(err));
}
+ async updateFieldOptions(className: string, fieldName: string, type: any) {
+ const schemaCollection = await this._schemaCollection();
+ await schemaCollection.updateFieldOptions(className, fieldName, type);
+ }
+
addFieldIfNotExists(className: string, fieldName: string, type: any): Promise {
return this._schemaCollection()
.then(schemaCollection => schemaCollection.addFieldIfNotExists(className, fieldName, type))
diff --git a/src/Adapters/Storage/Postgres/PostgresClient.js b/src/Adapters/Storage/Postgres/PostgresClient.js
index b436945249..16a9564c29 100644
--- a/src/Adapters/Storage/Postgres/PostgresClient.js
+++ b/src/Adapters/Storage/Postgres/PostgresClient.js
@@ -20,7 +20,7 @@ export function createClient(uri, databaseOptions) {
if (process.env.PARSE_SERVER_LOG_LEVEL === 'debug') {
const monitor = require('pg-monitor');
- if(monitor.isAttached()) {
+ if (monitor.isAttached()) {
monitor.detach();
}
monitor.attach(initOptions);
diff --git a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
index 065d5c93a3..e6c2bdbb1b 100644
--- a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
+++ b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
@@ -1119,6 +1119,16 @@ export class PostgresStorageAdapter implements StorageAdapter {
this._notifySchemaChange();
}
+ async updateFieldOptions(className: string, fieldName: string, type: any) {
+ await this._client.tx('update-schema-field-options', async t => {
+ const path = `{fields,${fieldName}}`;
+ await t.none(
+ 'UPDATE "_SCHEMA" SET "schema"=jsonb_set("schema", $, $) WHERE "className"=$',
+ { path, type, className }
+ );
+ });
+ }
+
// Drops a collection. Resolves with true if it was a Parse Schema (eg. _User, Custom, etc.)
// and resolves with false if it wasn't (eg. a join table). Rejects if deletion was impossible.
async deleteClass(className: string) {
diff --git a/src/Adapters/Storage/StorageAdapter.js b/src/Adapters/Storage/StorageAdapter.js
index d46265f64f..6e4573b748 100644
--- a/src/Adapters/Storage/StorageAdapter.js
+++ b/src/Adapters/Storage/StorageAdapter.js
@@ -35,6 +35,7 @@ export interface StorageAdapter {
setClassLevelPermissions(className: string, clps: any): Promise;
createClass(className: string, schema: SchemaType): Promise;
addFieldIfNotExists(className: string, fieldName: string, type: any): Promise;
+ updateFieldOptions(className: string, fieldName: string, type: any): Promise;
deleteClass(className: string): Promise;
deleteAllClasses(fast: boolean): Promise;
deleteFields(className: string, schema: SchemaType, fieldNames: Array): Promise;
diff --git a/src/Config.js b/src/Config.js
index 250880efbc..069b7e2a43 100644
--- a/src/Config.js
+++ b/src/Config.js
@@ -11,6 +11,7 @@ import {
AccountLockoutOptions,
PagesOptions,
SecurityOptions,
+ SchemaOptions,
} from './Options/Definitions';
import { isBoolean, isString } from 'lodash';
@@ -76,6 +77,7 @@ export class Config {
pages,
security,
enforcePrivateUsers,
+ schema,
}) {
if (masterKey === readOnlyMasterKey) {
throw new Error('masterKey and readOnlyMasterKey should be different');
@@ -112,6 +114,7 @@ export class Config {
this.validateIdempotencyOptions(idempotencyOptions);
this.validatePagesOptions(pages);
this.validateSecurityOptions(security);
+ this.validateSchemaOptions(schema);
this.validateEnforcePrivateUsers(enforcePrivateUsers);
}
@@ -137,6 +140,48 @@ export class Config {
}
}
+ static validateSchemaOptions(schema: SchemaOptions) {
+ if (!schema) return;
+ if (Object.prototype.toString.call(schema) !== '[object Object]') {
+ throw 'Parse Server option schema must be an object.';
+ }
+ if (schema.definitions === undefined) {
+ schema.definitions = SchemaOptions.definitions.default;
+ } else if (!Array.isArray(schema.definitions)) {
+ throw 'Parse Server option schema.definitions must be an array.';
+ }
+ if (schema.strict === undefined) {
+ schema.strict = SchemaOptions.strict.default;
+ } else if (!isBoolean(schema.strict)) {
+ throw 'Parse Server option schema.strict must be a boolean.';
+ }
+ if (schema.deleteExtraFields === undefined) {
+ schema.deleteExtraFields = SchemaOptions.deleteExtraFields.default;
+ } else if (!isBoolean(schema.deleteExtraFields)) {
+ throw 'Parse Server option schema.deleteExtraFields must be a boolean.';
+ }
+ if (schema.recreateModifiedFields === undefined) {
+ schema.recreateModifiedFields = SchemaOptions.recreateModifiedFields.default;
+ } else if (!isBoolean(schema.recreateModifiedFields)) {
+ throw 'Parse Server option schema.recreateModifiedFields must be a boolean.';
+ }
+ if (schema.lockSchemas === undefined) {
+ schema.lockSchemas = SchemaOptions.lockSchemas.default;
+ } else if (!isBoolean(schema.lockSchemas)) {
+ throw 'Parse Server option schema.lockSchemas must be a boolean.';
+ }
+ if (schema.beforeMigration === undefined) {
+ schema.beforeMigration = null;
+ } else if (schema.beforeMigration !== null && typeof schema.beforeMigration !== 'function') {
+ throw 'Parse Server option schema.beforeMigration must be a function.';
+ }
+ if (schema.afterMigration === undefined) {
+ schema.afterMigration = null;
+ } else if (schema.afterMigration !== null && typeof schema.afterMigration !== 'function') {
+ throw 'Parse Server option schema.afterMigration must be a function.';
+ }
+ }
+
static validatePagesOptions(pages) {
if (Object.prototype.toString.call(pages) !== '[object Object]') {
throw 'Parse Server option pages must be an object.';
diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js
index c9c51e71ad..9ae6628088 100644
--- a/src/Controllers/SchemaController.js
+++ b/src/Controllers/SchemaController.js
@@ -831,7 +831,11 @@ export default class SchemaController {
const existingFields = schema.fields;
Object.keys(submittedFields).forEach(name => {
const field = submittedFields[name];
- if (existingFields[name] && field.__op !== 'Delete') {
+ if (
+ existingFields[name] &&
+ existingFields[name].type !== field.type &&
+ field.__op !== 'Delete'
+ ) {
throw new Parse.Error(255, `Field ${name} exists, cannot update.`);
}
if (!existingFields[name] && field.__op === 'Delete') {
@@ -1057,7 +1061,12 @@ export default class SchemaController {
// object if the provided className-fieldName-type tuple is valid.
// The className must already be validated.
// If 'freeze' is true, refuse to update the schema for this field.
- enforceFieldExists(className: string, fieldName: string, type: string | SchemaField) {
+ enforceFieldExists(
+ className: string,
+ fieldName: string,
+ type: string | SchemaField,
+ isValidation?: boolean
+ ) {
if (fieldName.indexOf('.') > 0) {
// subdocument key (x.y) => ok if x is of type 'object'
fieldName = fieldName.split('.')[0];
@@ -1101,7 +1110,14 @@ export default class SchemaController {
)} but got ${typeToString(type)}`
);
}
- return undefined;
+ // If type options do not change
+ // we can safely return
+ if (isValidation || JSON.stringify(expectedType) === JSON.stringify(type)) {
+ return undefined;
+ }
+ // Field options are may be changed
+ // ensure to have an update to date schema field
+ return this._dbAdapter.updateFieldOptions(className, fieldName, type);
}
return this._dbAdapter
@@ -1236,7 +1252,7 @@ export default class SchemaController {
// Every object has ACL implicitly.
continue;
}
- promises.push(schema.enforceFieldExists(className, fieldName, expected));
+ promises.push(schema.enforceFieldExists(className, fieldName, expected, true));
}
const results = await Promise.all(promises);
const enforceFields = results.filter(result => !!result);
diff --git a/src/Options/Definitions.js b/src/Options/Definitions.js
index 88779376c2..e2cbd17920 100644
--- a/src/Options/Definitions.js
+++ b/src/Options/Definitions.js
@@ -446,6 +446,45 @@ module.exports.SecurityOptions = {
default: false,
},
};
+module.exports.SchemaOptions = {
+ definitions: {
+ help: 'The schema definitions.',
+ default: [],
+ },
+ strict: {
+ env: 'PARSE_SERVER_SCHEMA_STRICT',
+ help: 'Is true if Parse Server should exit if schema update fail.',
+ action: parsers.booleanParser,
+ default: true,
+ },
+ deleteExtraFields: {
+ env: 'PARSE_SERVER_SCHEMA_DELETE_EXTRA_FIELDS',
+ help:
+ 'Is true if Parse Server should delete any fields not defined in a schema definition. This should only be used during development.',
+ action: parsers.booleanParser,
+ default: false,
+ },
+ recreateModifiedFields: {
+ env: 'PARSE_SERVER_SCHEMA_RECREATE_MODIFIED_FIELDS',
+ help:
+ 'Is true if Parse Server should recreate any fields that are different between the current database schema and theschema definition. This should only be used during development.',
+ action: parsers.booleanParser,
+ default: false,
+ },
+ lockSchemas: {
+ env: 'PARSE_SERVER_SCHEMA_LOCK',
+ help:
+ 'Is true if Parse Server will reject any attempts to modify the schema while the server is running.',
+ action: parsers.booleanParser,
+ default: false,
+ },
+ beforeMigration: {
+ help: 'Execute a callback before running schema migrations.',
+ },
+ afterMigration: {
+ help: 'Execute a callback after running schema migrations.',
+ },
+};
module.exports.PagesOptions = {
customRoutes: {
env: 'PARSE_SERVER_PAGES_CUSTOM_ROUTES',
diff --git a/src/Options/index.js b/src/Options/index.js
index 34fa5198c2..31b9e10d41 100644
--- a/src/Options/index.js
+++ b/src/Options/index.js
@@ -1,3 +1,4 @@
+// @flow
import { AnalyticsAdapter } from '../Adapters/Analytics/AnalyticsAdapter';
import { FilesAdapter } from '../Adapters/Files/FilesAdapter';
import { LoggerAdapter } from '../Adapters/Logger/LoggerAdapter';
@@ -7,8 +8,8 @@ import { MailAdapter } from '../Adapters/Email/MailAdapter';
import { PubSubAdapter } from '../Adapters/PubSub/PubSubAdapter';
import { WSSAdapter } from '../Adapters/WebSocketServer/WSSAdapter';
import { CheckGroup } from '../Security/CheckGroup';
+import type { SchemaOptions } from '../SchemaMigrations/Migrations';
-// @flow
type Adapter = string | any | T;
type NumberOrBoolean = number | boolean;
type NumberOrString = number | string;
@@ -241,6 +242,8 @@ export interface ParseServerOptions {
playgroundPath: ?string;
/* Callback when server has started */
serverStartComplete: ?(error: ?Error) => void;
+ /* Rest representation on Parse.Schema https://docs.parseplatform.org/rest/guide/#adding-a-schema */
+ schema: ?SchemaOptions;
/* Callback when server has closed */
serverCloseComplete: ?() => void;
/* The security options to identify and report weak security settings.
diff --git a/src/ParseServer.js b/src/ParseServer.js
index a8b0ad38cf..dc2af9e7be 100644
--- a/src/ParseServer.js
+++ b/src/ParseServer.js
@@ -44,6 +44,7 @@ import { ParseGraphQLServer } from './GraphQL/ParseGraphQLServer';
import { SecurityRouter } from './Routers/SecurityRouter';
import CheckRunner from './Security/CheckRunner';
import Deprecator from './Deprecator/Deprecator';
+import { DefinedSchemas } from './SchemaMigrations/DefinedSchemas';
// Mutate the Parse object to add the Cloud Code handlers
addParseCloud();
@@ -68,6 +69,7 @@ class ParseServer {
javascriptKey,
serverURL = requiredParameter('You must provide a serverURL!'),
serverStartComplete,
+ schema,
} = options;
// Initialize the node client SDK automatically
Parse.initialize(appId, javascriptKey || 'unused', masterKey);
@@ -84,7 +86,10 @@ class ParseServer {
databaseController
.performInitialization()
.then(() => hooksController.load())
- .then(() => {
+ .then(async () => {
+ if (schema) {
+ await new DefinedSchemas(schema, this.config).execute();
+ }
if (serverStartComplete) {
serverStartComplete();
}
diff --git a/src/Routers/SchemasRouter.js b/src/Routers/SchemasRouter.js
index ae0a736eb5..54f73ceacc 100644
--- a/src/Routers/SchemasRouter.js
+++ b/src/Routers/SchemasRouter.js
@@ -35,7 +35,42 @@ function getOneSchema(req) {
});
}
-function createSchema(req) {
+const checkIfDefinedSchemasIsUsed = req => {
+ if (req.config?.schema?.lockSchemas === true) {
+ throw new Parse.Error(
+ Parse.Error.OPERATION_FORBIDDEN,
+ 'Cannot perform this operation when schemas options is used.'
+ );
+ }
+};
+
+export const internalCreateSchema = async (className, body, config) => {
+ const controller = await config.database.loadSchema({ clearCache: true });
+ const response = await controller.addClassIfNotExists(
+ className,
+ body.fields,
+ body.classLevelPermissions,
+ body.indexes
+ );
+ return {
+ response,
+ };
+};
+
+export const internalUpdateSchema = async (className, body, config) => {
+ const controller = await config.database.loadSchema({ clearCache: true });
+ const response = await controller.updateClass(
+ className,
+ body.fields || {},
+ body.classLevelPermissions,
+ body.indexes,
+ config.database
+ );
+ return { response };
+};
+
+async function createSchema(req) {
+ checkIfDefinedSchemasIsUsed(req);
if (req.auth.isReadOnly) {
throw new Parse.Error(
Parse.Error.OPERATION_FORBIDDEN,
@@ -53,20 +88,11 @@ function createSchema(req) {
throw new Parse.Error(135, `POST ${req.path} needs a class name.`);
}
- return req.config.database
- .loadSchema({ clearCache: true })
- .then(schema =>
- schema.addClassIfNotExists(
- className,
- req.body.fields,
- req.body.classLevelPermissions,
- req.body.indexes
- )
- )
- .then(schema => ({ response: schema }));
+ return await internalCreateSchema(className, req.body, req.config);
}
function modifySchema(req) {
+ checkIfDefinedSchemasIsUsed(req);
if (req.auth.isReadOnly) {
throw new Parse.Error(
Parse.Error.OPERATION_FORBIDDEN,
@@ -76,22 +102,9 @@ function modifySchema(req) {
if (req.body.className && req.body.className != req.params.className) {
return classNameMismatchResponse(req.body.className, req.params.className);
}
-
- const submittedFields = req.body.fields || {};
const className = req.params.className;
- return req.config.database
- .loadSchema({ clearCache: true })
- .then(schema =>
- schema.updateClass(
- className,
- submittedFields,
- req.body.classLevelPermissions,
- req.body.indexes,
- req.config.database
- )
- )
- .then(result => ({ response: result }));
+ return internalUpdateSchema(className, req.body, req.config);
}
const deleteSchema = req => {
diff --git a/src/SchemaMigrations/DefinedSchemas.js b/src/SchemaMigrations/DefinedSchemas.js
new file mode 100644
index 0000000000..0db3be6358
--- /dev/null
+++ b/src/SchemaMigrations/DefinedSchemas.js
@@ -0,0 +1,434 @@
+// @flow
+// @flow-disable-next Cannot resolve module `parse/node`.
+const Parse = require('parse/node');
+import { logger } from '../logger';
+import Config from '../Config';
+import { internalCreateSchema, internalUpdateSchema } from '../Routers/SchemasRouter';
+import { defaultColumns, systemClasses } from '../Controllers/SchemaController';
+import { ParseServerOptions } from '../Options';
+import * as Migrations from './Migrations';
+
+export class DefinedSchemas {
+ config: ParseServerOptions;
+ schemaOptions: Migrations.SchemaOptions;
+ localSchemas: Migrations.JSONSchema[];
+ retries: number;
+ maxRetries: number;
+ allCloudSchemas: Parse.Schema[];
+
+ constructor(schemaOptions: Migrations.SchemaOptions, config: ParseServerOptions) {
+ this.localSchemas = [];
+ this.config = Config.get(config.appId);
+ this.schemaOptions = schemaOptions;
+ if (schemaOptions && schemaOptions.definitions) {
+ if (!Array.isArray(schemaOptions.definitions)) {
+ throw `"schema.definitions" must be an array of schemas`;
+ }
+
+ this.localSchemas = schemaOptions.definitions;
+ }
+
+ this.retries = 0;
+ this.maxRetries = 3;
+ }
+
+ async saveSchemaToDB(schema: Parse.Schema): Promise {
+ const payload = {
+ className: schema.className,
+ fields: schema._fields,
+ indexes: schema._indexes,
+ classLevelPermissions: schema._clp,
+ };
+ await internalCreateSchema(schema.className, payload, this.config);
+ this.resetSchemaOps(schema);
+ }
+
+ resetSchemaOps(schema: Parse.Schema) {
+ // Reset ops like SDK
+ schema._fields = {};
+ schema._indexes = {};
+ }
+
+ // Simulate update like the SDK
+ // We cannot use SDK since routes are disabled
+ async updateSchemaToDB(schema: Parse.Schema) {
+ const payload = {
+ className: schema.className,
+ fields: schema._fields,
+ indexes: schema._indexes,
+ classLevelPermissions: schema._clp,
+ };
+ await internalUpdateSchema(schema.className, payload, this.config);
+ this.resetSchemaOps(schema);
+ }
+
+ async execute() {
+ try {
+ logger.info('Running Migrations');
+ if (this.schemaOptions && this.schemaOptions.beforeMigration) {
+ await Promise.resolve(this.schemaOptions.beforeMigration());
+ }
+
+ await this.executeMigrations();
+
+ if (this.schemaOptions && this.schemaOptions.afterMigration) {
+ await Promise.resolve(this.schemaOptions.afterMigration());
+ }
+
+ logger.info('Running Migrations Completed');
+ } catch (e) {
+ logger.error(`Failed to run migrations: ${e}`);
+ if (process.env.NODE_ENV === 'production') process.exit(1);
+ }
+ }
+
+ async executeMigrations() {
+ let timeout = null;
+ try {
+ // Set up a time out in production
+ // if we fail to get schema
+ // pm2 or K8s and many other process managers will try to restart the process
+ // after the exit
+ if (process.env.NODE_ENV === 'production') {
+ timeout = setTimeout(() => {
+ logger.error('Timeout occurred during execution of migrations. Exiting...');
+ process.exit(1);
+ }, 20000);
+ }
+
+ // Hack to force session schema to be created
+ await this.createDeleteSession();
+ this.allCloudSchemas = await Parse.Schema.all();
+ clearTimeout(timeout);
+ await Promise.all(this.localSchemas.map(async localSchema => this.saveOrUpdate(localSchema)));
+
+ this.checkForMissingSchemas();
+ await this.enforceCLPForNonProvidedClass();
+ } catch (e) {
+ if (timeout) clearTimeout(timeout);
+ if (this.retries < this.maxRetries) {
+ this.retries++;
+ // first retry 1sec, 2sec, 3sec total 6sec retry sequence
+ // retry will only happen in case of deploying multi parse server instance
+ // at the same time. Modern systems like k8 avoid this by doing rolling updates
+ await this.wait(1000 * this.retries);
+ await this.executeMigrations();
+ } else {
+ logger.error(`Failed to run migrations: ${e}`);
+ if (process.env.NODE_ENV === 'production') process.exit(1);
+ }
+ }
+ }
+
+ checkForMissingSchemas() {
+ if (this.schemaOptions.strict !== true) {
+ return;
+ }
+
+ const cloudSchemas = this.allCloudSchemas.map(s => s.className);
+ const localSchemas = this.localSchemas.map(s => s.className);
+ const missingSchemas = cloudSchemas.filter(
+ c => !localSchemas.includes(c) && !systemClasses.includes(c)
+ );
+
+ if (new Set(localSchemas).size !== localSchemas.length) {
+ logger.error(
+ `The list of schemas provided contains duplicated "className" "${localSchemas.join(
+ '","'
+ )}"`
+ );
+ process.exit(1);
+ }
+
+ if (this.schemaOptions.strict && missingSchemas.length) {
+ logger.warn(
+ `The following schemas are currently present in the database, but not explicitly defined in a schema: "${missingSchemas.join(
+ '", "'
+ )}"`
+ );
+ }
+ }
+
+ // Required for testing purpose
+ wait(time: number) {
+ return new Promise(resolve => setTimeout(resolve, time));
+ }
+
+ async enforceCLPForNonProvidedClass(): Promise {
+ const nonProvidedClasses = this.allCloudSchemas.filter(
+ cloudSchema =>
+ !this.localSchemas.some(localSchema => localSchema.className === cloudSchema.className)
+ );
+ await Promise.all(
+ nonProvidedClasses.map(async schema => {
+ const parseSchema = new Parse.Schema(schema.className);
+ this.handleCLP(schema, parseSchema);
+ await this.updateSchemaToDB(parseSchema);
+ })
+ );
+ }
+
+ // Create a fake session since Parse do not create the _Session until
+ // a session is created
+ async createDeleteSession() {
+ const session = new Parse.Session();
+ await session.save(null, { useMasterKey: true });
+ await session.destroy({ useMasterKey: true });
+ }
+
+ async saveOrUpdate(localSchema: Migrations.JSONSchema) {
+ const cloudSchema = this.allCloudSchemas.find(sc => sc.className === localSchema.className);
+ if (cloudSchema) {
+ try {
+ await this.updateSchema(localSchema, cloudSchema);
+ } catch (e) {
+ throw `Error during update of schema for type ${cloudSchema.className}: ${e}`;
+ }
+ } else {
+ try {
+ await this.saveSchema(localSchema);
+ } catch (e) {
+ throw `Error while saving Schema for type ${localSchema.className}: ${e}`;
+ }
+ }
+ }
+
+ async saveSchema(localSchema: Migrations.JSONSchema) {
+ const newLocalSchema = new Parse.Schema(localSchema.className);
+ if (localSchema.fields) {
+ // Handle fields
+ Object.keys(localSchema.fields)
+ .filter(fieldName => !this.isProtectedFields(localSchema.className, fieldName))
+ .forEach(fieldName => {
+ if (localSchema.fields) {
+ const field = localSchema.fields[fieldName];
+ this.handleFields(newLocalSchema, fieldName, field);
+ }
+ });
+ }
+ // Handle indexes
+ if (localSchema.indexes) {
+ Object.keys(localSchema.indexes).forEach(indexName => {
+ if (localSchema.indexes && !this.isProtectedIndex(localSchema.className, indexName)) {
+ newLocalSchema.addIndex(indexName, localSchema.indexes[indexName]);
+ }
+ });
+ }
+
+ this.handleCLP(localSchema, newLocalSchema);
+
+ return await this.saveSchemaToDB(newLocalSchema);
+ }
+
+ async updateSchema(localSchema: Migrations.JSONSchema, cloudSchema: Parse.Schema) {
+ const newLocalSchema = new Parse.Schema(localSchema.className);
+
+ // Handle fields
+ // Check addition
+ if (localSchema.fields) {
+ Object.keys(localSchema.fields)
+ .filter(fieldName => !this.isProtectedFields(localSchema.className, fieldName))
+ .forEach(fieldName => {
+ // @flow-disable-next
+ const field = localSchema.fields[fieldName];
+ if (!cloudSchema.fields[fieldName]) {
+ this.handleFields(newLocalSchema, fieldName, field);
+ }
+ });
+ }
+
+ const fieldsToDelete: string[] = [];
+ const fieldsToRecreate: {
+ fieldName: string,
+ from: { type: string, targetClass?: string },
+ to: { type: string, targetClass?: string },
+ }[] = [];
+ const fieldsWithChangedParams: string[] = [];
+
+ // Check deletion
+ Object.keys(cloudSchema.fields)
+ .filter(fieldName => !this.isProtectedFields(localSchema.className, fieldName))
+ .forEach(fieldName => {
+ const field = cloudSchema.fields[fieldName];
+ if (!localSchema.fields || !localSchema.fields[fieldName]) {
+ fieldsToDelete.push(fieldName);
+ return;
+ }
+
+ const localField = localSchema.fields[fieldName];
+ // Check if field has a changed type
+ if (
+ !this.paramsAreEquals(
+ { type: field.type, targetClass: field.targetClass },
+ { type: localField.type, targetClass: localField.targetClass }
+ )
+ ) {
+ fieldsToRecreate.push({
+ fieldName,
+ from: { type: field.type, targetClass: field.targetClass },
+ to: { type: localField.type, targetClass: localField.targetClass },
+ });
+ return;
+ }
+
+ // Check if something changed other than the type (like required, defaultValue)
+ if (!this.paramsAreEquals(field, localField)) {
+ fieldsWithChangedParams.push(fieldName);
+ }
+ });
+
+ if (this.schemaOptions.deleteExtraFields === true) {
+ fieldsToDelete.forEach(fieldName => {
+ newLocalSchema.deleteField(fieldName);
+ });
+
+ // Delete fields from the schema then apply changes
+ await this.updateSchemaToDB(newLocalSchema);
+ } else if (this.schemaOptions.strict === true && fieldsToDelete.length) {
+ logger.warn(
+ `The following fields exist in the database for "${
+ localSchema.className
+ }", but are missing in the schema : "${fieldsToDelete.join('" ,"')}"`
+ );
+ }
+
+ if (this.schemaOptions.recreateModifiedFields === true) {
+ fieldsToRecreate.forEach(field => {
+ newLocalSchema.deleteField(field.fieldName);
+ });
+
+ // Delete fields from the schema then apply changes
+ await this.updateSchemaToDB(newLocalSchema);
+
+ fieldsToRecreate.forEach(fieldInfo => {
+ if (localSchema.fields) {
+ const field = localSchema.fields[fieldInfo.fieldName];
+ this.handleFields(newLocalSchema, fieldInfo.fieldName, field);
+ }
+ });
+ } else if (this.schemaOptions.strict === true && fieldsToRecreate.length) {
+ fieldsToRecreate.forEach(field => {
+ const from =
+ field.from.type + (field.from.targetClass ? ` (${field.from.targetClass})` : '');
+ const to = field.to.type + (field.to.targetClass ? ` (${field.to.targetClass})` : '');
+
+ logger.warn(
+ `The field "${field.fieldName}" type differ between the schema and the database for "${localSchema.className}"; Schema is defined as "${to}" and current database type is "${from}"`
+ );
+ });
+ }
+
+ fieldsWithChangedParams.forEach(fieldName => {
+ if (localSchema.fields) {
+ const field = localSchema.fields[fieldName];
+ this.handleFields(newLocalSchema, fieldName, field);
+ }
+ });
+
+ // Handle Indexes
+ // Check addition
+ if (localSchema.indexes) {
+ Object.keys(localSchema.indexes).forEach(indexName => {
+ if (
+ (!cloudSchema.indexes || !cloudSchema.indexes[indexName]) &&
+ !this.isProtectedIndex(localSchema.className, indexName)
+ ) {
+ if (localSchema.indexes) {
+ newLocalSchema.addIndex(indexName, localSchema.indexes[indexName]);
+ }
+ }
+ });
+ }
+
+ const indexesToAdd = [];
+
+ // Check deletion
+ if (cloudSchema.indexes) {
+ Object.keys(cloudSchema.indexes).forEach(indexName => {
+ if (!this.isProtectedIndex(localSchema.className, indexName)) {
+ if (!localSchema.indexes || !localSchema.indexes[indexName]) {
+ newLocalSchema.deleteIndex(indexName);
+ } else if (
+ !this.paramsAreEquals(localSchema.indexes[indexName], cloudSchema.indexes[indexName])
+ ) {
+ newLocalSchema.deleteIndex(indexName);
+ if (localSchema.indexes) {
+ indexesToAdd.push({
+ indexName,
+ index: localSchema.indexes[indexName],
+ });
+ }
+ }
+ }
+ });
+ }
+
+ this.handleCLP(localSchema, newLocalSchema, cloudSchema);
+ // Apply changes
+ await this.updateSchemaToDB(newLocalSchema);
+ // Apply new/changed indexes
+ if (indexesToAdd.length) {
+ logger.debug(
+ `Updating indexes for "${newLocalSchema.className}" : ${indexesToAdd.join(' ,')}`
+ );
+ indexesToAdd.forEach(o => newLocalSchema.addIndex(o.indexName, o.index));
+ await this.updateSchemaToDB(newLocalSchema);
+ }
+ }
+
+ handleCLP(
+ localSchema: Migrations.JSONSchema,
+ newLocalSchema: Parse.Schema,
+ cloudSchema: Parse.Schema
+ ) {
+ if (!localSchema.classLevelPermissions && !cloudSchema) {
+ logger.warn(`classLevelPermissions not provided for ${localSchema.className}.`);
+ }
+ // Use spread to avoid read only issue (encountered by Moumouls using directAccess)
+ const clp = ({ ...localSchema.classLevelPermissions } || {}: Parse.CLP.PermissionsMap);
+ // To avoid inconsistency we need to remove all rights on addField
+ clp.addField = {};
+ newLocalSchema.setCLP(clp);
+ }
+
+ isProtectedFields(className: string, fieldName: string) {
+ return (
+ !!defaultColumns._Default[fieldName] ||
+ !!(defaultColumns[className] && defaultColumns[className][fieldName])
+ );
+ }
+
+ isProtectedIndex(className: string, indexName: string) {
+ let indexes = ['_id_'];
+ if (className === '_User') {
+ indexes = [
+ ...indexes,
+ 'case_insensitive_username',
+ 'case_insensitive_email',
+ 'username_1',
+ 'email_1',
+ ];
+ }
+
+ return indexes.indexOf(indexName) !== -1;
+ }
+
+ paramsAreEquals(objA: T, objB: T) {
+ const keysA: string[] = Object.keys(objA);
+ const keysB: string[] = Object.keys(objB);
+
+ // Check key name
+ if (keysA.length !== keysB.length) return false;
+ return keysA.every(k => objA[k] === objB[k]);
+ }
+
+ handleFields(newLocalSchema: Parse.Schema, fieldName: string, field: Migrations.FieldType) {
+ if (field.type === 'Relation') {
+ newLocalSchema.addRelation(fieldName, field.targetClass);
+ } else if (field.type === 'Pointer') {
+ newLocalSchema.addPointer(fieldName, field.targetClass, field);
+ } else {
+ newLocalSchema.addField(fieldName, field.type, field);
+ }
+ }
+}
diff --git a/src/SchemaMigrations/Migrations.js b/src/SchemaMigrations/Migrations.js
new file mode 100644
index 0000000000..9142cdbcde
--- /dev/null
+++ b/src/SchemaMigrations/Migrations.js
@@ -0,0 +1,95 @@
+// @flow
+
+export type FieldValueType =
+ | 'String'
+ | 'Boolean'
+ | 'File'
+ | 'Number'
+ | 'Relation'
+ | 'Pointer'
+ | 'Date'
+ | 'GeoPoint'
+ | 'Polygon'
+ | 'Array'
+ | 'Object'
+ | 'ACL';
+
+export interface FieldType {
+ type: FieldValueType;
+ required?: boolean;
+ defaultValue?: mixed;
+ targetClass?: string;
+}
+
+type ClassNameType = '_User' | '_Role' | string;
+
+export interface ProtectedFieldsInterface {
+ [key: string]: string[];
+}
+
+export interface IndexInterface {
+ [key: string]: number;
+}
+
+export interface IndexesInterface {
+ [key: string]: IndexInterface;
+}
+
+export interface SchemaOptions {
+ definitions: JSONSchema[];
+ strict: ?boolean;
+ deleteExtraFields: ?boolean;
+ recreateModifiedFields: ?boolean;
+ lockSchemas: ?boolean;
+ /* Callback when server has started and before running schemas migration operations if schemas key provided */
+ beforeMigration: ?() => void | Promise;
+ afterMigration: ?() => void | Promise;
+}
+
+export type CLPOperation = 'find' | 'count' | 'get' | 'update' | 'create' | 'delete';
+// @Typescript 4.1+ // type CLPPermission = 'requiresAuthentication' | '*' | `user:${string}` | `role:${string}`
+
+type CLPValue = { [key: string]: boolean };
+type CLPData = { [key: string]: CLPOperation[] };
+type CLPInterface = { [key: string]: CLPValue };
+
+export interface JSONSchema {
+ className: ClassNameType;
+ fields?: { [key: string]: FieldType };
+ indexes?: IndexesInterface;
+ classLevelPermissions?: {
+ find?: CLPValue,
+ count?: CLPValue,
+ get?: CLPValue,
+ update?: CLPValue,
+ create?: CLPValue,
+ delete?: CLPValue,
+ addField?: CLPValue,
+ protectedFields?: ProtectedFieldsInterface,
+ };
+}
+
+export class CLP {
+ static allow(perms: { [key: string]: CLPData }): CLPInterface {
+ const out = {};
+
+ for (const [perm, ops] of Object.entries(perms)) {
+ // @flow-disable-next Property `@@iterator` is missing in mixed [1] but exists in `$Iterable` [2].
+ for (const op of ops) {
+ out[op] = out[op] || {};
+ out[op][perm] = true;
+ }
+ }
+
+ return out;
+ }
+}
+
+export function makeSchema(className: ClassNameType, schema: JSONSchema): JSONSchema {
+ // This function solve two things:
+ // 1. It provides auto-completion to the users who are implementing schemas
+ // 2. It allows forward-compatible point in order to allow future changes to the internal structure of JSONSchema without affecting all the users
+ schema.className = className;
+
+ return schema;
+}
diff --git a/src/index.js b/src/index.js
index 03cd15176f..bbbdaf545f 100644
--- a/src/index.js
+++ b/src/index.js
@@ -5,6 +5,8 @@ import NullCacheAdapter from './Adapters/Cache/NullCacheAdapter';
import RedisCacheAdapter from './Adapters/Cache/RedisCacheAdapter';
import LRUCacheAdapter from './Adapters/Cache/LRUCache.js';
import * as TestUtils from './TestUtils';
+import * as SchemaMigrations from './SchemaMigrations/Migrations';
+
import { useExternal } from './deprecated';
import { getLogger } from './logger';
import { PushWorker } from './Push/PushWorker';
@@ -40,4 +42,5 @@ export {
PushWorker,
ParseGraphQLServer,
_ParseServer as ParseServer,
+ SchemaMigrations,
};
From ef47131fa4f2dfa63486f935e97d406ce9cd173c Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Mon, 1 Nov 2021 13:30:00 +0000
Subject: [PATCH 75/96] chore(release): 5.0.0-alpha.5 [skip ci]
# [5.0.0-alpha.5](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.4...5.0.0-alpha.5) (2021-11-01)
### Features
* add user-defined schema and migrations ([#7418](https://github.com/parse-community/parse-server/issues/7418)) ([25d5c30](https://github.com/parse-community/parse-server/commit/25d5c30be2111be332eb779eb0697774a17da7af))
---
changelogs/CHANGELOG_alpha.md | 7 +++++++
package-lock.json | 2 +-
package.json | 2 +-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
index 7fc9f29fd6..1d5c4e5ee9 100644
--- a/changelogs/CHANGELOG_alpha.md
+++ b/changelogs/CHANGELOG_alpha.md
@@ -1,3 +1,10 @@
+# [5.0.0-alpha.5](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.4...5.0.0-alpha.5) (2021-11-01)
+
+
+### Features
+
+* add user-defined schema and migrations ([#7418](https://github.com/parse-community/parse-server/issues/7418)) ([25d5c30](https://github.com/parse-community/parse-server/commit/25d5c30be2111be332eb779eb0697774a17da7af))
+
# [5.0.0-alpha.4](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.3...5.0.0-alpha.4) (2021-10-31)
diff --git a/package-lock.json b/package-lock.json
index 376d030e26..6b37705ad4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.4",
+ "version": "5.0.0-alpha.5",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index a5f8ec2b78..23c1981c32 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.4",
+ "version": "5.0.0-alpha.5",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From b6a66761f049ce5c9fe0a83d755c85e7da284439 Mon Sep 17 00:00:00 2001
From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com>
Date: Mon, 1 Nov 2021 17:28:37 +0100
Subject: [PATCH 76/96] docs: enable badge and changelog for beta release
---
CHANGELOG.md | 4 ++--
README.md | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a977705686..7c12e7cf72 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,7 +15,7 @@ Details:
- Purpose: official release
- Suitable environment: production
-
+- Suitable environment: development
## 🔥 [Alpha Releases][log_alpha]
diff --git a/README.md b/README.md
index a25752cc6e..5bd803355f 100644
--- a/README.md
+++ b/README.md
@@ -12,8 +12,8 @@
[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)
[![npm latest version](https://img.shields.io/npm/v/parse-server/latest.svg)](https://www.npmjs.com/package/parse-server)
+[![npm beta version](https://img.shields.io/npm/v/parse-server/beta.svg)](https://www.npmjs.com/package/parse-server)
[![npm alpha version](https://img.shields.io/npm/v/parse-server/alpha.svg)](https://www.npmjs.com/package/parse-server)
-
[![Backers on Open Collective](https://opencollective.com/parse-server/backers/badge.svg)][open-collective-link]
[![Sponsors on Open Collective](https://opencollective.com/parse-server/sponsors/badge.svg)][open-collective-link]
From 69fd494ab2198cb97eed0e432ca0f13b5f972290 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 3 Nov 2021 23:03:13 +0100
Subject: [PATCH 77/96] docs: add bronze sponsor and add sponsor widgets to
README
---
README.md | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 5bd803355f..f787ab632d 100644
--- a/README.md
+++ b/README.md
@@ -5,11 +5,11 @@
[![Build Status](https://github.com/parse-community/parse-server/workflows/ci/badge.svg?branch=alpha)](https://github.com/parse-community/parse-server/actions?query=workflow%3Aci+branch%3Aalpha)
[![Snyk Badge](https://snyk.io/test/github/parse-community/parse-server/badge.svg)](https://snyk.io/test/github/parse-community/parse-server)
[![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server/alpha.svg)](https://codecov.io/github/parse-community/parse-server?branch=alpha)
+[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)
[![Node Version](https://img.shields.io/badge/nodejs-12,_14,_15-green.svg?logo=node.js&style=flat)](https://nodejs.org)
[![MongoDB Version](https://img.shields.io/badge/mongodb-4.0,_4.2,_4.4,_5.0-green.svg?logo=mongodb&style=flat)](https://www.mongodb.com)
[![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13,_14-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
-[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)
[![npm latest version](https://img.shields.io/npm/v/parse-server/latest.svg)](https://www.npmjs.com/package/parse-server)
[![npm beta version](https://img.shields.io/npm/v/parse-server/beta.svg)](https://www.npmjs.com/package/parse-server)
@@ -29,11 +29,15 @@ The full documentation for Parse Server is available in the [wiki](https://githu
---
-A big *thank you* to all our backers and sponsors who support the development of Parse Platform!
+A big *thank you* 🙏 to all our backers and sponsors who support the development of Parse Platform!
-### 💎 Diamond Sponsors
-
-[![Sponsor](https://opencollective.com/parse-server/sponsor/0/avatar.svg)](https://opencollective.com/parse-server/sponsor/0/website)
+### Diamond Sponsors
+
+![Diamond Sponsors](https://opencollective.com/parse-server/tiers/diamond-sponsor.svg?avatarHeight=70&button=false)
+
+#### Bronze Sponsors
+
+![Bronze Sponsors](https://opencollective.com/parse-server/tiers/bronze-sponsor.svg?avatarHeight=36&button=false)
---
From 31960b59b04dac5ea967118d6fc3f49850225289 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 3 Nov 2021 23:44:24 +0100
Subject: [PATCH 78/96] docs: fix sponsor links in readme
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index f787ab632d..77bc0c4750 100644
--- a/README.md
+++ b/README.md
@@ -29,15 +29,15 @@ The full documentation for Parse Server is available in the [wiki](https://githu
---
-A big *thank you* 🙏 to all our backers and sponsors who support the development of Parse Platform!
+A big *thank you* 🙏 to our [sponsors](#sponsors) and [backers](#backers) who support the development of Parse Platform!
### Diamond Sponsors
-![Diamond Sponsors](https://opencollective.com/parse-server/tiers/diamond-sponsor.svg?avatarHeight=70&button=false)
+[![Diamond Sponsors](https://opencollective.com/parse-server/tiers/diamond-sponsor.svg?avatarHeight=70&button=false)](https://opencollective.com/parse-server/contribute/diamond-sponsor-10560)
#### Bronze Sponsors
-![Bronze Sponsors](https://opencollective.com/parse-server/tiers/bronze-sponsor.svg?avatarHeight=36&button=false)
+[![Bronze Sponsors](https://opencollective.com/parse-server/tiers/bronze-sponsor.svg?avatarHeight=36&button=false)](https://opencollective.com/parse-server/contribute/bronze-sponsor-10559)
---
From 611bd9baaa29bfa25b5a8592c8465f2572ff3f65 Mon Sep 17 00:00:00 2001
From: Corey
Date: Sun, 7 Nov 2021 19:30:15 -0500
Subject: [PATCH 79/96] docs: add FS storage to docs (#7681)
---
README.md | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 77bc0c4750..5a8a5d7dcf 100644
--- a/README.md
+++ b/README.md
@@ -489,11 +489,12 @@ You can also find more adapters maintained by the community by searching on [npm
Parse Server allows developers to choose from several options when hosting files:
-* `GridFSBucketAdapter`, which is backed by MongoDB;
-* `S3Adapter`, which is backed by [Amazon S3](https://aws.amazon.com/s3/); or
-* `GCSAdapter`, which is backed by [Google Cloud Storage](https://cloud.google.com/storage/)
+* `GridFSBucketAdapter` - which is backed by MongoDB
+* `S3Adapter` - which is backed by [Amazon S3](https://aws.amazon.com/s3/)
+* `GCSAdapter` - which is backed by [Google Cloud Storage](https://cloud.google.com/storage/)
+* `FSAdapter` - local file storage
-`GridFSBucketAdapter` is used by default and requires no setup, but if you're interested in using S3 or Google Cloud Storage, additional configuration information is available in the [Parse Server guide](http://docs.parseplatform.org/parse-server/guide/#configuring-file-adapters).
+`GridFSBucketAdapter` is used by default and requires no setup, but if you're interested in using Amazon S3, Google Cloud Storage, or local file storage, additional configuration information is available in the [Parse Server guide](http://docs.parseplatform.org/parse-server/guide/#configuring-file-adapters).
## Idempotency Enforcement
From b64640c5705f733798783e68d216e957044ef23c Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Wed, 10 Nov 2021 16:26:20 +0100
Subject: [PATCH 80/96] revert: refactor: allow ES import for cloud string if
package type is module
This reverts commit 0225340ccbba2781e49689640ded606a8379dd45.
---
.babelrc | 3 +--
spec/CloudCode.spec.js | 8 --------
spec/cloud/cloudCodeModuleFile.js | 3 ---
src/ParseServer.js | 6 +-----
4 files changed, 2 insertions(+), 18 deletions(-)
delete mode 100644 spec/cloud/cloudCodeModuleFile.js
diff --git a/.babelrc b/.babelrc
index a199154b82..9151969bde 100644
--- a/.babelrc
+++ b/.babelrc
@@ -7,8 +7,7 @@
["@babel/preset-env", {
"targets": {
"node": "12"
- },
- "exclude": ["proposal-dynamic-import"]
+ }
}]
],
"sourceMaps": "inline"
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index 17968c33d7..d5e6113763 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -39,14 +39,6 @@ describe('Cloud Code', () => {
});
});
- it('can load cloud code as a module', async () => {
- process.env.npm_package_type = 'module';
- await reconfigureServer({ cloud: './spec/cloud/cloudCodeModuleFile.js' });
- const result = await Parse.Cloud.run('cloudCodeInFile');
- expect(result).toEqual('It is possible to define cloud code in a file.');
- delete process.env.npm_package_type;
- });
-
it('can create functions', done => {
Parse.Cloud.define('hello', () => {
return 'Hello world!';
diff --git a/spec/cloud/cloudCodeModuleFile.js b/spec/cloud/cloudCodeModuleFile.js
deleted file mode 100644
index a62b4fcc24..0000000000
--- a/spec/cloud/cloudCodeModuleFile.js
+++ /dev/null
@@ -1,3 +0,0 @@
-Parse.Cloud.define('cloudCodeInFile', () => {
- return 'It is possible to define cloud code in a file.';
-});
diff --git a/src/ParseServer.js b/src/ParseServer.js
index dc2af9e7be..e6b30d1918 100644
--- a/src/ParseServer.js
+++ b/src/ParseServer.js
@@ -108,11 +108,7 @@ class ParseServer {
if (typeof cloud === 'function') {
cloud(Parse);
} else if (typeof cloud === 'string') {
- if (process.env.npm_package_type === 'module') {
- import(path.resolve(process.cwd(), cloud));
- } else {
- require(path.resolve(process.cwd(), cloud));
- }
+ require(path.resolve(process.cwd(), cloud));
} else {
throw "argument 'cloud' must either be a string or a function";
}
From d35eeb825e4aaabeeeb89690dbaafc7047a7e3c7 Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Wed, 10 Nov 2021 15:27:17 +0000
Subject: [PATCH 81/96] chore(release): 5.0.0-alpha.6 [skip ci]
# [5.0.0-alpha.6](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.5...5.0.0-alpha.6) (2021-11-10)
### Reverts
* refactor: allow ES import for cloud string if package type is module ([b64640c](https://github.com/parse-community/parse-server/commit/b64640c5705f733798783e68d216e957044ef23c))
---
changelogs/CHANGELOG_alpha.md | 7 +++++++
package-lock.json | 2 +-
package.json | 2 +-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
index 1d5c4e5ee9..e86a847932 100644
--- a/changelogs/CHANGELOG_alpha.md
+++ b/changelogs/CHANGELOG_alpha.md
@@ -1,3 +1,10 @@
+# [5.0.0-alpha.6](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.5...5.0.0-alpha.6) (2021-11-10)
+
+
+### Reverts
+
+* refactor: allow ES import for cloud string if package type is module ([b64640c](https://github.com/parse-community/parse-server/commit/b64640c5705f733798783e68d216e957044ef23c))
+
# [5.0.0-alpha.5](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.4...5.0.0-alpha.5) (2021-11-01)
diff --git a/package-lock.json b/package-lock.json
index 6b37705ad4..ef6abb505f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.5",
+ "version": "5.0.0-alpha.6",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 23c1981c32..e6fe99098b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.5",
+ "version": "5.0.0-alpha.6",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From 573558d3adcbcc6222c92003829867e1a73eef94 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Fri, 12 Nov 2021 18:37:03 +0100
Subject: [PATCH 82/96] fix: node engine range has no upper limit to exclude
incompatible node versions (#7692)
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index e6fe99098b..d9d57d7f26 100644
--- a/package.json
+++ b/package.json
@@ -135,7 +135,7 @@
"madge:circular": "node_modules/.bin/madge ./src --circular"
},
"engines": {
- "node": ">=12.20.0"
+ "node": ">=12.20.0 <16"
},
"bin": {
"parse-server": "bin/parse-server"
From d72717d23a8d34d89fbb2a1593c518466d38ab6d Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Fri, 12 Nov 2021 17:38:15 +0000
Subject: [PATCH 83/96] chore(release): 5.0.0-alpha.7 [skip ci]
# [5.0.0-alpha.7](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.6...5.0.0-alpha.7) (2021-11-12)
### Bug Fixes
* node engine range has no upper limit to exclude incompatible node versions ([#7692](https://github.com/parse-community/parse-server/issues/7692)) ([573558d](https://github.com/parse-community/parse-server/commit/573558d3adcbcc6222c92003829867e1a73eef94))
---
changelogs/CHANGELOG_alpha.md | 7 +++++++
package-lock.json | 2 +-
package.json | 2 +-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
index e86a847932..cd67f72253 100644
--- a/changelogs/CHANGELOG_alpha.md
+++ b/changelogs/CHANGELOG_alpha.md
@@ -1,3 +1,10 @@
+# [5.0.0-alpha.7](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.6...5.0.0-alpha.7) (2021-11-12)
+
+
+### Bug Fixes
+
+* node engine range has no upper limit to exclude incompatible node versions ([#7692](https://github.com/parse-community/parse-server/issues/7692)) ([573558d](https://github.com/parse-community/parse-server/commit/573558d3adcbcc6222c92003829867e1a73eef94))
+
# [5.0.0-alpha.6](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.5...5.0.0-alpha.6) (2021-11-10)
diff --git a/package-lock.json b/package-lock.json
index ef6abb505f..bb8a577fd7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.6",
+ "version": "5.0.0-alpha.7",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index d9d57d7f26..38147a69bb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.6",
+ "version": "5.0.0-alpha.7",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From e4aa1cb0a0c4c28956d75fc813a752ed6d22a9f2 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sat, 13 Nov 2021 00:47:02 +0100
Subject: [PATCH 84/96] refactor: upgrade follow-redirects from 1.14.2 to
1.14.4 (#7694)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index bb8a577fd7..b9aa107df8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7070,9 +7070,9 @@
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
"follow-redirects": {
- "version": "1.14.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz",
- "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA=="
+ "version": "1.14.4",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz",
+ "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g=="
},
"for-each": {
"version": "0.3.3",
diff --git a/package.json b/package.json
index 38147a69bb..91424ed84f 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"cors": "2.8.5",
"deepcopy": "2.1.0",
"express": "4.17.1",
- "follow-redirects": "1.14.2",
+ "follow-redirects": "1.14.4",
"graphql": "15.6.0",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.9.0",
From 3d7ed8dfacef0134e25c6090793611f3febcfc19 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sat, 13 Nov 2021 20:11:52 +0100
Subject: [PATCH 85/96] refactor: upgrade @parse/fs-files-adapter from 1.2.0 to
1.2.1 (#7695)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index b9aa107df8..b228ddd679 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1739,9 +1739,9 @@
}
},
"@parse/fs-files-adapter": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-1.2.0.tgz",
- "integrity": "sha512-kr7Ti2eYOm14p05S86yriJdMtawL6qln3Dn5eekrwY14ih4jrjH/E+QlEpBUSBzN64fluFxciFOyjdbwDGWsGw=="
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-1.2.1.tgz",
+ "integrity": "sha512-jUbmlvql9+5Mz8Q6KSk1jH823MVerhOYK1svayYpF03v75OtDn3p+mAoFvPS5UpRln1kT6BlBnLfw4Hv08SD5Q=="
},
"@parse/minami": {
"version": "1.0.0",
diff --git a/package.json b/package.json
index 91424ed84f..8729a01ef6 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
"@graphql-tools/links": "6.2.5",
"@graphql-tools/stitch": "6.2.4",
"@graphql-tools/utils": "6.2.4",
- "@parse/fs-files-adapter": "1.2.0",
+ "@parse/fs-files-adapter": "1.2.1",
"@parse/push-adapter": "3.4.1",
"apollo-server-express": "2.25.2",
"bcryptjs": "2.4.3",
From a2fefde4bae6969ed443ba22615a0a232495f2cc Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sun, 14 Nov 2021 03:14:01 +0100
Subject: [PATCH 86/96] refactor: upgrade pg-promise from 10.11.0 to 10.11.1
(#7697)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index b228ddd679..f96628eaba 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13680,9 +13680,9 @@
"integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ=="
},
"pg-promise": {
- "version": "10.11.0",
- "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.11.0.tgz",
- "integrity": "sha512-UntgHZNv+gpGJKhh+tzGSGHLkniKWV+ZQ8/SNdtvElsg9Aa7ZJ4Fgyl6pl2x0ZtJ7uFNy+OIq3Z+Ei6iplqTDQ==",
+ "version": "10.11.1",
+ "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.11.1.tgz",
+ "integrity": "sha512-HAv32WSKf2m2RqHerW5RmANn/mcXIwWXbg/gOfGQcoS0SE+8iBi3Jj4JmoR4PNzSEozo/y/npy4e6F16psOItw==",
"requires": {
"assert-options": "0.7.0",
"pg": "8.7.1",
diff --git a/package.json b/package.json
index 8729a01ef6..178a74764b 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
"mustache": "4.2.0",
"parse": "3.3.1",
"pg-monitor": "1.4.1",
- "pg-promise": "10.11.0",
+ "pg-promise": "10.11.1",
"pluralize": "8.0.0",
"redis": "3.1.2",
"semver": "7.3.5",
From 426ccdc8f325601da58648f1e9432500dacf809b Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sun, 14 Nov 2021 03:31:05 +0100
Subject: [PATCH 87/96] refactor: upgrade ws from 8.2.2 to 8.2.3 (#7698)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index f96628eaba..a95ba96b47 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16820,9 +16820,9 @@
}
},
"ws": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz",
- "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw=="
+ "version": "8.2.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+ "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
},
"xmlcreate": {
"version": "2.0.3",
diff --git a/package.json b/package.json
index 178a74764b..7a26b0d87c 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
"uuid": "8.3.2",
"winston": "3.3.3",
"winston-daily-rotate-file": "4.5.5",
- "ws": "8.2.2"
+ "ws": "8.2.3"
},
"devDependencies": {
"@actions/core": "1.2.6",
From 251ff0ef715e12df7c8e3fd6fd742077dab58946 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sun, 14 Nov 2021 04:14:21 +0100
Subject: [PATCH 88/96] refactor: upgrade graphql from 15.6.0 to 15.6.1 (#7696)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index a95ba96b47..0e733e786c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7476,9 +7476,9 @@
"dev": true
},
"graphql": {
- "version": "15.6.0",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.6.0.tgz",
- "integrity": "sha512-WJR872Zlc9hckiEPhXgyUftXH48jp2EjO5tgBBOyNMRJZ9fviL2mJBD6CAysk6N5S0r9BTs09Qk39nnJBkvOXQ=="
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.6.1.tgz",
+ "integrity": "sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw=="
},
"graphql-extensions": {
"version": "0.15.0",
diff --git a/package.json b/package.json
index 7a26b0d87c..0cd3eb4160 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"deepcopy": "2.1.0",
"express": "4.17.1",
"follow-redirects": "1.14.4",
- "graphql": "15.6.0",
+ "graphql": "15.6.1",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.9.0",
"graphql-tag": "2.12.5",
From ae99b928092107169f754d9082b598f14e5266cd Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Wed, 17 Nov 2021 13:28:34 +0100
Subject: [PATCH 89/96] refactor: upgrade graphql from 15.6.1 to 15.7.0 (#7704)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 0e733e786c..9e541d2732 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7476,9 +7476,9 @@
"dev": true
},
"graphql": {
- "version": "15.6.1",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.6.1.tgz",
- "integrity": "sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw=="
+ "version": "15.7.0",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.7.0.tgz",
+ "integrity": "sha512-1jvUsS5mSzcgXLTQNQyrP7eKkBZW+HUnmx2LYSnfvkyseVpij8wwO/sFBGgxbkZ+zzFwYQxrHsOana5oMXmMxg=="
},
"graphql-extensions": {
"version": "0.15.0",
diff --git a/package.json b/package.json
index 0cd3eb4160..b78ebfb986 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"deepcopy": "2.1.0",
"express": "4.17.1",
"follow-redirects": "1.14.4",
- "graphql": "15.6.1",
+ "graphql": "15.7.0",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.9.0",
"graphql-tag": "2.12.5",
From 45cc58c7e5e640a46c5d508019a3aa81242964b1 Mon Sep 17 00:00:00 2001
From: Marvin ROGER
Date: Thu, 18 Nov 2021 23:37:47 +0100
Subject: [PATCH 90/96] feat: add support for Node 16 (#7707)
BREAKING CHANGE: Removes official Node 15 support which has reached it end-of-life date.
---
.github/workflows/ci.yml | 28 +--
README.md | 3 +-
ci/ciCheck.js | 9 +-
package-lock.json | 370 +++++++++++++-------------------
package.json | 10 +-
spec/ParseGraphQLServer.spec.js | 13 +-
6 files changed, 179 insertions(+), 254 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 628903944d..96ed13b0c8 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -6,7 +6,7 @@ on:
branches:
- '**'
env:
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
PARSE_SERVER_TEST_TIMEOUT: 20000
jobs:
check-ci:
@@ -105,43 +105,43 @@ jobs:
MONGODB_VERSION: 5.0.3
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: MongoDB 4.4, ReplicaSet, WiredTiger
MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: MongoDB 4.2, ReplicaSet, WiredTiger
MONGODB_VERSION: 4.2.17
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: MongoDB 4.0, ReplicaSet, WiredTiger
MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: replicaset
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: MongoDB 4.0, Standalone, MMAPv1
MONGODB_VERSION: 4.0.27
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: mmapv1
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: Redis Cache
PARSE_SERVER_TEST_CACHE: redis
MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: Node 12
MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
NODE_VERSION: 12.22.7
- - name: Node 15
+ - name: Node 14
MONGODB_VERSION: 4.4.10
MONGODB_TOPOLOGY: standalone
MONGODB_STORAGE_ENGINE: wiredTiger
- NODE_VERSION: 15.14.0
+ NODE_VERSION: 14.18.1
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 15
@@ -183,19 +183,19 @@ jobs:
include:
- name: PostgreSQL 11, PostGIS 3.0
POSTGRES_IMAGE: postgis/postgis:11-3.0
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: PostgreSQL 11, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:11-3.1
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: PostgreSQL 12, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:12-3.1
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: PostgreSQL 13, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:13-3.1
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
- name: PostgreSQL 14, PostGIS 3.1
POSTGRES_IMAGE: postgis/postgis:14-3.1
- NODE_VERSION: 14.18.1
+ NODE_VERSION: 16.13.0
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 15
diff --git a/README.md b/README.md
index 5a8a5d7dcf..73870981c9 100644
--- a/README.md
+++ b/README.md
@@ -116,8 +116,7 @@ Parse Server is continuously tested with the most recent releases of Node.js to
|------------|----------------|-------------|---------------|
| Node.js 12 | 12.22.7 | April 2022 | ✅ Yes |
| Node.js 14 | 14.18.1 | April 2023 | ✅ Yes |
-| Node.js 15 | 15.14.0 | June 2021 | ✅ Yes |
-| Node.js 16 | 16.x.x | April 2024 | ❌ Not tested |
+| Node.js 16 | 16.13.0 | April 2024 | ✅ Yes |
#### MongoDB
Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and only test against versions that are officially supported and have not reached their end-of-life date.
diff --git a/ci/ciCheck.js b/ci/ciCheck.js
index e1d968be19..2ad5c3e8f3 100644
--- a/ci/ciCheck.js
+++ b/ci/ciCheck.js
@@ -1,4 +1,4 @@
-'use strict'
+'use strict';
const CiVersionCheck = require('./CiVersionCheck');
const mongoVersionList = require('mongodb-version-list');
@@ -14,9 +14,8 @@ async function check() {
* Check the MongoDB versions used in test environments.
*/
async function checkMongoDbVersions() {
-
const releasedVersions = await new Promise((resolve, reject) => {
- mongoVersionList(function(error, versions) {
+ mongoVersionList(function (error, versions) {
if (error) {
reject(error);
}
@@ -47,7 +46,6 @@ async function checkMongoDbVersions() {
* Check the Nodejs versions used in test environments.
*/
async function checkNodeVersions() {
-
const allVersions = await allNodeVersions();
const releasedVersions = allVersions.versions;
@@ -62,7 +60,8 @@ async function checkNodeVersions() {
ignoreReleasedVersions: [
'<12.0.0', // These versions have reached their end-of-life support date
'>=13.0.0 <14.0.0', // These versions have reached their end-of-life support date
- '>=16.0.0', // This version has not been officially released yet
+ '>=15.0.0 <16.0.0', // These versions have reached their end-of-life support date
+ '>=17.0.0', // These versions are not officially supported yet
],
}).check();
}
diff --git a/package-lock.json b/package-lock.json
index 9e541d2732..b9c7f8ac69 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,9 +11,10 @@
"dev": true
},
"@apollo/client": {
- "version": "3.4.8",
- "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.4.8.tgz",
- "integrity": "sha512-/cNqTSwc2Dw8q6FDDjdd30+yvhP7rI0Fvl3Hbro0lTtFuhzkevfNyQaI2jAiOrjU6Jc0RbanxULaNrX7UmvjSQ==",
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.4.17.tgz",
+ "integrity": "sha512-MDt2rwMX1GqodiVEKJqmDmAz8xr0qJmq5PdWeIt0yDaT4GOkKYWZiWkyfhfv3raTk8PyJvbsNG9q2CqmUrlGfg==",
+ "dev": true,
"requires": {
"@graphql-typed-document-node/core": "^3.0.0",
"@wry/context": "^0.6.0",
@@ -26,21 +27,23 @@
"symbol-observable": "^4.0.0",
"ts-invariant": "^0.9.0",
"tslib": "^2.3.0",
- "zen-observable-ts": "^1.1.0"
+ "zen-observable-ts": "~1.1.0"
},
"dependencies": {
"@wry/equality": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.2.tgz",
"integrity": "sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA==",
+ "dev": true,
"requires": {
"tslib": "^2.3.0"
}
},
"ts-invariant": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.9.1.tgz",
- "integrity": "sha512-hSeYibh29ULlHkuEfukcoiyTct+s2RzczMLTv4x3NWC/YrBy7x7ps5eYq/b4Y3Sb9/uAlf54+/5CAEMVxPhuQw==",
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.9.3.tgz",
+ "integrity": "sha512-HinBlTbFslQI0OHP07JLsSXPibSegec6r9ai5xxq/qHYCsIQbzpymLpDhAUsnXcSrDEcd0L62L8vsOEdzM0qlA==",
+ "dev": true,
"requires": {
"tslib": "^2.1.0"
}
@@ -48,12 +51,14 @@
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
+ "dev": true
},
"zen-observable-ts": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz",
"integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==",
+ "dev": true,
"requires": {
"@types/zen-observable": "0.8.3",
"zen-observable": "0.8.15"
@@ -1104,6 +1109,7 @@
"version": "7.15.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
+ "dev": true,
"requires": {
"regenerator-runtime": "^0.13.4"
}
@@ -1192,6 +1198,37 @@
"tslib": "~2.0.1"
}
},
+ "@graphql-tools/batch-execute": {
+ "version": "8.3.1",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.3.1.tgz",
+ "integrity": "sha512-63kHY8ZdoO5FoeDXYHnAak1R3ysMViMPwWC2XUblFckuVLMUPmB2ONje8rjr2CvzWBHAW8c1Zsex+U3xhKtGIA==",
+ "requires": {
+ "@graphql-tools/utils": "^8.5.1",
+ "dataloader": "2.0.0",
+ "tslib": "~2.3.0",
+ "value-or-promise": "1.0.11"
+ },
+ "dependencies": {
+ "@graphql-tools/utils": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz",
+ "integrity": "sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==",
+ "requires": {
+ "tslib": "~2.3.0"
+ }
+ },
+ "tslib": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ },
+ "value-or-promise": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz",
+ "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg=="
+ }
+ }
+ },
"@graphql-tools/delegate": {
"version": "6.2.4",
"resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.2.4.tgz",
@@ -1206,45 +1243,86 @@
}
},
"@graphql-tools/links": {
- "version": "6.2.5",
- "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.2.5.tgz",
- "integrity": "sha512-XeGDioW7F+HK6HHD/zCeF0HRC9s12NfOXAKv1HC0J7D50F4qqMvhdS/OkjzLoBqsgh/Gm8icRc36B5s0rOA9ig==",
- "requires": {
- "@graphql-tools/utils": "^7.0.0",
- "apollo-link": "1.2.14",
- "apollo-upload-client": "14.1.2",
- "cross-fetch": "3.0.6",
- "form-data": "3.0.0",
- "is-promise": "4.0.0",
- "tslib": "~2.0.1"
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-8.2.1.tgz",
+ "integrity": "sha512-J0igz42eKh/RQxDZPdEE4YiztY3zWTBcsn/bUtJp52XKNj0EIO0fR6WLEocT6uxgWCNnWYPOQUaf7bEgeW44Vg==",
+ "requires": {
+ "@graphql-tools/delegate": "^8.4.1",
+ "@graphql-tools/utils": "^8.5.1",
+ "apollo-upload-client": "16.0.0",
+ "cross-fetch": "3.1.4",
+ "form-data": "4.0.0",
+ "tslib": "~2.3.0"
},
"dependencies": {
+ "@graphql-tools/delegate": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-8.4.2.tgz",
+ "integrity": "sha512-CjggOhiL4WtyG2I3kux+1/p8lQxSFHBj0gwa0NxnQ6Vsnpw7Ig5VP1ovPnitFuBv2k4QdC37Nj2xv2n7DRn8fw==",
+ "requires": {
+ "@graphql-tools/batch-execute": "^8.3.1",
+ "@graphql-tools/schema": "^8.3.1",
+ "@graphql-tools/utils": "^8.5.3",
+ "dataloader": "2.0.0",
+ "tslib": "~2.3.0",
+ "value-or-promise": "1.0.11"
+ }
+ },
+ "@graphql-tools/merge": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.1.tgz",
+ "integrity": "sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==",
+ "requires": {
+ "@graphql-tools/utils": "^8.5.1",
+ "tslib": "~2.3.0"
+ }
+ },
+ "@graphql-tools/schema": {
+ "version": "8.3.1",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.1.tgz",
+ "integrity": "sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==",
+ "requires": {
+ "@graphql-tools/merge": "^8.2.1",
+ "@graphql-tools/utils": "^8.5.1",
+ "tslib": "~2.3.0",
+ "value-or-promise": "1.0.11"
+ }
+ },
"@graphql-tools/utils": {
- "version": "7.10.0",
- "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz",
- "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==",
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz",
+ "integrity": "sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==",
"requires": {
- "@ardatan/aggregate-error": "0.0.6",
- "camel-case": "4.1.2",
- "tslib": "~2.2.0"
- },
- "dependencies": {
- "tslib": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
- "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w=="
- }
+ "tslib": "~2.3.0"
}
},
"apollo-upload-client": {
- "version": "14.1.2",
- "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-14.1.2.tgz",
- "integrity": "sha512-ozaW+4tnVz1rpfwiQwG3RCdCcZ93RV/37ZQbRnObcQ9mjb+zur58sGDPVg9Ef3fiujLmiE/Fe9kdgvIMA3VOjA==",
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-16.0.0.tgz",
+ "integrity": "sha512-aLhYucyA0T8aBEQ5g+p13qnR9RUyL8xqb8FSZ7e/Kw2KUOsotLUlFluLobqaE7JSUFwc6sKfXIcwB7y4yEjbZg==",
"requires": {
- "@apollo/client": "^3.1.5",
- "@babel/runtime": "^7.11.2",
- "extract-files": "^9.0.0"
+ "extract-files": "^11.0.0"
}
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "tslib": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ },
+ "value-or-promise": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz",
+ "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg=="
}
}
},
@@ -1387,9 +1465,10 @@
}
},
"@graphql-typed-document-node/core": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz",
- "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg=="
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz",
+ "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==",
+ "dev": true
},
"@istanbuljs/load-nyc-config": {
"version": "1.1.0",
@@ -2582,7 +2661,8 @@
"@types/zen-observable": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz",
- "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw=="
+ "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==",
+ "dev": true
},
"@typescript-eslint/types": {
"version": "4.31.0",
@@ -2662,6 +2742,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz",
"integrity": "sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw==",
+ "dev": true,
"requires": {
"tslib": "^2.3.0"
},
@@ -2669,7 +2750,8 @@
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
+ "dev": true
}
}
},
@@ -2692,6 +2774,7 @@
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.1.tgz",
"integrity": "sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw==",
+ "dev": true,
"requires": {
"tslib": "^2.3.0"
},
@@ -2699,7 +2782,8 @@
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
+ "dev": true
}
}
},
@@ -2910,24 +2994,6 @@
}
}
},
- "apollo-cache": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.5.tgz",
- "integrity": "sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA==",
- "dev": true,
- "requires": {
- "apollo-utilities": "^1.3.4",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
"apollo-cache-control": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz",
@@ -2937,76 +3003,6 @@
"apollo-server-plugin-base": "^0.13.0"
}
},
- "apollo-cache-inmemory": {
- "version": "1.6.6",
- "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz",
- "integrity": "sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A==",
- "dev": true,
- "requires": {
- "apollo-cache": "^1.3.5",
- "apollo-utilities": "^1.3.4",
- "optimism": "^0.10.0",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "@wry/context": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz",
- "integrity": "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==",
- "dev": true,
- "requires": {
- "@types/node": ">=6",
- "tslib": "^1.9.3"
- }
- },
- "optimism": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.10.3.tgz",
- "integrity": "sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw==",
- "dev": true,
- "requires": {
- "@wry/context": "^0.4.0"
- }
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "apollo-client": {
- "version": "2.6.10",
- "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.10.tgz",
- "integrity": "sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA==",
- "dev": true,
- "requires": {
- "@types/zen-observable": "^0.8.0",
- "apollo-cache": "1.3.5",
- "apollo-link": "^1.0.0",
- "apollo-utilities": "1.3.4",
- "symbol-observable": "^1.0.2",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.10.0",
- "zen-observable": "^0.8.0"
- },
- "dependencies": {
- "symbol-observable": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
- "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
- "dev": true
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
"apollo-datasource": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.9.0.tgz",
@@ -3044,62 +3040,6 @@
}
}
},
- "apollo-link-http": {
- "version": "1.5.17",
- "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz",
- "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==",
- "dev": true,
- "requires": {
- "apollo-link": "^1.2.14",
- "apollo-link-http-common": "^0.2.16",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "apollo-link-http-common": {
- "version": "0.2.16",
- "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz",
- "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==",
- "dev": true,
- "requires": {
- "apollo-link": "^1.2.14",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "apollo-link-ws": {
- "version": "1.0.20",
- "resolved": "https://registry.npmjs.org/apollo-link-ws/-/apollo-link-ws-1.0.20.tgz",
- "integrity": "sha512-mjSFPlQxmoLArpHBeUb2Xj+2HDYeTaJqFGOqQ+I8NVJxgL9lJe84PDWcPah/yMLv3rB7QgBDSuZ0xoRFBPlySw==",
- "dev": true,
- "requires": {
- "apollo-link": "^1.2.14",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
"apollo-reporting-protobuf": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz",
@@ -3300,23 +3240,12 @@
}
},
"apollo-upload-client": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-13.0.0.tgz",
- "integrity": "sha512-lJ9/bk1BH1lD15WhWRha2J3+LrXrPIX5LP5EwiOUHv8PCORp4EUrcujrA3rI5hZeZygrTX8bshcuMdpqpSrvtA==",
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-16.0.0.tgz",
+ "integrity": "sha512-aLhYucyA0T8aBEQ5g+p13qnR9RUyL8xqb8FSZ7e/Kw2KUOsotLUlFluLobqaE7JSUFwc6sKfXIcwB7y4yEjbZg==",
"dev": true,
"requires": {
- "@babel/runtime": "^7.9.2",
- "apollo-link": "^1.2.12",
- "apollo-link-http-common": "^0.2.14",
- "extract-files": "^8.0.0"
- },
- "dependencies": {
- "extract-files": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-8.1.0.tgz",
- "integrity": "sha512-PTGtfthZK79WUMk+avLmwx3NGdU8+iVFXC2NMGxKsn0MnihOG2lvumj+AZo8CTwTrwjXDgZ5tztbRlEdRjBonQ==",
- "dev": true
- }
+ "extract-files": "^11.0.0"
}
},
"apollo-utilities": {
@@ -4004,15 +3933,6 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
- "camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "requires": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -4892,9 +4812,9 @@
}
},
"cross-fetch": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz",
- "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz",
+ "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==",
"requires": {
"node-fetch": "2.6.1"
}
@@ -6642,9 +6562,9 @@
}
},
"extract-files": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz",
- "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ=="
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-11.0.0.tgz",
+ "integrity": "sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ=="
},
"extsprintf": {
"version": "1.4.0",
@@ -7108,6 +7028,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
"integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
+ "dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
@@ -7729,6 +7650,7 @@
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
"integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dev": true,
"requires": {
"react-is": "^16.7.0"
}
@@ -8892,7 +8814,8 @@
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
},
"js-yaml": {
"version": "3.14.1",
@@ -9826,6 +9749,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
@@ -13229,6 +13153,7 @@
"version": "0.16.1",
"resolved": "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz",
"integrity": "sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==",
+ "dev": true,
"requires": {
"@wry/context": "^0.6.0",
"@wry/trie": "^0.3.0"
@@ -14034,6 +13959,7 @@
"version": "15.7.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
"integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "dev": true,
"requires": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@@ -14186,7 +14112,8 @@
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
},
"react-native-crypto-js": {
"version": "1.0.0",
@@ -15861,7 +15788,8 @@
"symbol-observable": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
- "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ=="
+ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==",
+ "dev": true
},
"table": {
"version": "5.4.6",
diff --git a/package.json b/package.json
index b78ebfb986..e6d1da255f 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
"license": "BSD-3-Clause",
"dependencies": {
"@apollographql/graphql-playground-html": "1.6.29",
- "@graphql-tools/links": "6.2.5",
+ "@graphql-tools/links": "8.2.1",
"@graphql-tools/stitch": "6.2.4",
"@graphql-tools/utils": "6.2.4",
"@parse/fs-files-adapter": "1.2.1",
@@ -62,6 +62,7 @@
},
"devDependencies": {
"@actions/core": "1.2.6",
+ "@apollo/client": "3.4.17",
"@babel/cli": "7.10.0",
"@babel/core": "7.10.0",
"@babel/plugin-proposal-object-rest-spread": "7.10.0",
@@ -75,12 +76,7 @@
"@semantic-release/npm": "7.1.3",
"@semantic-release/release-notes-generator": "9.0.3",
"all-node-versions": "8.0.0",
- "apollo-cache-inmemory": "1.6.6",
- "apollo-client": "2.6.10",
- "apollo-link": "1.2.14",
- "apollo-link-http": "1.5.17",
- "apollo-link-ws": "1.0.20",
- "apollo-upload-client": "13.0.0",
+ "apollo-upload-client": "16.0.0",
"apollo-utilities": "1.3.4",
"babel-eslint": "10.1.0",
"bcrypt-nodejs": "0.0.3",
diff --git a/spec/ParseGraphQLServer.spec.js b/spec/ParseGraphQLServer.spec.js
index 52427efcc2..50f54c55b4 100644
--- a/spec/ParseGraphQLServer.spec.js
+++ b/spec/ParseGraphQLServer.spec.js
@@ -9,13 +9,16 @@ const { updateCLP } = require('./support/dev');
const pluralize = require('pluralize');
const { getMainDefinition } = require('apollo-utilities');
-const { ApolloLink, split } = require('apollo-link');
-const { createHttpLink } = require('apollo-link-http');
-const { InMemoryCache } = require('apollo-cache-inmemory');
const { createUploadLink } = require('apollo-upload-client');
const { SubscriptionClient } = require('subscriptions-transport-ws');
-const { WebSocketLink } = require('apollo-link-ws');
-const ApolloClient = require('apollo-client').default;
+const { WebSocketLink } = require('@apollo/client/link/ws');
+const {
+ ApolloClient,
+ InMemoryCache,
+ ApolloLink,
+ split,
+ createHttpLink,
+} = require('@apollo/client/core');
const gql = require('graphql-tag');
const { toGlobalId } = require('graphql-relay');
const {
From fea308a01ad9739b2b430ebe2164b967308b6725 Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Thu, 18 Nov 2021 22:38:42 +0000
Subject: [PATCH 91/96] chore(release): 5.0.0-alpha.8 [skip ci]
# [5.0.0-alpha.8](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.7...5.0.0-alpha.8) (2021-11-18)
### Features
* add support for Node 16 ([#7707](https://github.com/parse-community/parse-server/issues/7707)) ([45cc58c](https://github.com/parse-community/parse-server/commit/45cc58c7e5e640a46c5d508019a3aa81242964b1))
### BREAKING CHANGES
* Removes official Node 15 support which has reached it end-of-life date. ([45cc58c](45cc58c))
---
changelogs/CHANGELOG_alpha.md | 12 ++++++++++++
package-lock.json | 2 +-
package.json | 2 +-
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md
index cd67f72253..e600538a78 100644
--- a/changelogs/CHANGELOG_alpha.md
+++ b/changelogs/CHANGELOG_alpha.md
@@ -1,3 +1,15 @@
+# [5.0.0-alpha.8](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.7...5.0.0-alpha.8) (2021-11-18)
+
+
+### Features
+
+* add support for Node 16 ([#7707](https://github.com/parse-community/parse-server/issues/7707)) ([45cc58c](https://github.com/parse-community/parse-server/commit/45cc58c7e5e640a46c5d508019a3aa81242964b1))
+
+
+### BREAKING CHANGES
+
+* Removes official Node 15 support which has reached it end-of-life date. ([45cc58c](45cc58c))
+
# [5.0.0-alpha.7](https://github.com/parse-community/parse-server/compare/5.0.0-alpha.6...5.0.0-alpha.7) (2021-11-12)
diff --git a/package-lock.json b/package-lock.json
index b9c7f8ac69..12f9e74bf5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.7",
+ "version": "5.0.0-alpha.8",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index e6d1da255f..73bb74b099 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "parse-server",
- "version": "5.0.0-alpha.7",
+ "version": "5.0.0-alpha.8",
"description": "An express module providing a Parse-compatible API server",
"main": "lib/index.js",
"repository": {
From 899da8d765d9a8e2ced42364014d3b3017fd3063 Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Thu, 18 Nov 2021 23:44:10 +0100
Subject: [PATCH 92/96] docs: remove node 15 from badge; add node 17 to
compatibility table (#7709)
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 73870981c9..f2ecce98ab 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
[![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server/alpha.svg)](https://codecov.io/github/parse-community/parse-server?branch=alpha)
[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)
-[![Node Version](https://img.shields.io/badge/nodejs-12,_14,_15-green.svg?logo=node.js&style=flat)](https://nodejs.org)
+[![Node Version](https://img.shields.io/badge/nodejs-12,_14,_16-green.svg?logo=node.js&style=flat)](https://nodejs.org)
[![MongoDB Version](https://img.shields.io/badge/mongodb-4.0,_4.2,_4.4,_5.0-green.svg?logo=mongodb&style=flat)](https://www.mongodb.com)
[![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13,_14-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
@@ -117,6 +117,7 @@ Parse Server is continuously tested with the most recent releases of Node.js to
| Node.js 12 | 12.22.7 | April 2022 | ✅ Yes |
| Node.js 14 | 14.18.1 | April 2023 | ✅ Yes |
| Node.js 16 | 16.13.0 | April 2024 | ✅ Yes |
+| Node.js 17 | 17.x | June 2022 | ❌ Not tested |
#### MongoDB
Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and only test against versions that are officially supported and have not reached their end-of-life date.
From 260290409e747414c703ddec755d5cba73be5e83 Mon Sep 17 00:00:00 2001
From: Snyk bot
Date: Sun, 21 Nov 2021 14:49:37 +0100
Subject: [PATCH 93/96] refactor: upgrade follow-redirects from 1.14.4 to
1.14.5 (#7712)
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 12f9e74bf5..3271c17932 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6990,9 +6990,9 @@
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
"follow-redirects": {
- "version": "1.14.4",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz",
- "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g=="
+ "version": "1.14.5",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
+ "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA=="
},
"for-each": {
"version": "0.3.3",
diff --git a/package.json b/package.json
index 73bb74b099..613a1dc2c5 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"cors": "2.8.5",
"deepcopy": "2.1.0",
"express": "4.17.1",
- "follow-redirects": "1.14.4",
+ "follow-redirects": "1.14.5",
"graphql": "15.7.0",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.9.0",
From eed589d9f11f31924a7e32955cb773dd1fe26cb9 Mon Sep 17 00:00:00 2001
From: Corey
Date: Mon, 22 Nov 2021 20:31:02 -0500
Subject: [PATCH 94/96] Fix createObject for postgres
---
src/Adapters/Storage/Postgres/PostgresStorageAdapter.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
index e6c2bdbb1b..1c0c58fa14 100644
--- a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
+++ b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
@@ -1280,7 +1280,7 @@ export class PostgresStorageAdapter implements StorageAdapter {
validateKeys(object);
Object.keys(object).forEach(fieldName => {
- if (object[fieldName] === null) {
+ if (object[fieldName] === null || schema.fields[fieldName] === null) {
return;
}
var authDataMatch = fieldName.match(/^_auth_data_([a-zA-Z0-9_]+)$/);
From f083c546728f93d45f07246780ade92cd3b29ae5 Mon Sep 17 00:00:00 2001
From: Corey
Date: Mon, 22 Nov 2021 20:35:13 -0500
Subject: [PATCH 95/96] Try xit CloudCode test
---
spec/CloudCode.spec.js | 65 +++++++++++++++++++-----------------------
1 file changed, 29 insertions(+), 36 deletions(-)
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index d5e6113763..36843c8c44 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -1391,44 +1391,37 @@ describe('Cloud Code', () => {
});
});
- /*
- TODO: fix for Postgres
- trying to delete a field that doesn't exists doesn't play nice
- */
- it_exclude_dbs(['postgres'])(
- 'should fully delete objects when using `unset` and `set` with beforeSave (regression test for #1840)',
- done => {
- const TestObject = Parse.Object.extend('TestObject');
- const BeforeSaveObject = Parse.Object.extend('BeforeSaveChanged');
-
- Parse.Cloud.beforeSave('BeforeSaveChanged', req => {
- const object = req.object;
- object.set('before', 'save');
- object.unset('remove');
- });
+ it('should fully delete objects when using `unset` and `set` with beforeSave (regression test for #1840)', done => {
+ const TestObject = Parse.Object.extend('TestObject');
+ const BeforeSaveObject = Parse.Object.extend('BeforeSaveChanged');
- let object;
- const testObject = new TestObject({ key: 'value' });
- testObject
- .save()
- .then(() => {
- object = new BeforeSaveObject();
- return object.save().then(() => {
- object.set({ remove: testObject });
- return object.save();
- });
- })
- .then(objectAgain => {
- expect(objectAgain.get('remove')).toBeUndefined();
- expect(object.get('remove')).toBeUndefined();
- done();
- })
- .catch(err => {
- jfail(err);
- done();
+ Parse.Cloud.beforeSave('BeforeSaveChanged', req => {
+ const object = req.object;
+ object.set('before', 'save');
+ object.unset('remove');
+ });
+
+ let object;
+ const testObject = new TestObject({ key: 'value' });
+ testObject
+ .save()
+ .then(() => {
+ object = new BeforeSaveObject();
+ return object.save().then(() => {
+ object.set({ remove: testObject });
+ return object.save();
});
- }
- );
+ })
+ .then(objectAgain => {
+ expect(objectAgain.get('remove')).toBeUndefined();
+ expect(object.get('remove')).toBeUndefined();
+ done();
+ })
+ .catch(err => {
+ jfail(err);
+ done();
+ });
+ });
it('should not include relation op (regression test for #1606)', done => {
const TestObject = Parse.Object.extend('TestObject');
From bbbd0d438f732d0619a9dd256a1bbaacb2474182 Mon Sep 17 00:00:00 2001
From: Corey
Date: Mon, 22 Nov 2021 20:46:12 -0500
Subject: [PATCH 96/96] revert test
---
spec/CloudCode.spec.js | 65 +++++++++++++++++++++++-------------------
1 file changed, 36 insertions(+), 29 deletions(-)
diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index 36843c8c44..d5e6113763 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -1391,37 +1391,44 @@ describe('Cloud Code', () => {
});
});
- it('should fully delete objects when using `unset` and `set` with beforeSave (regression test for #1840)', done => {
- const TestObject = Parse.Object.extend('TestObject');
- const BeforeSaveObject = Parse.Object.extend('BeforeSaveChanged');
-
- Parse.Cloud.beforeSave('BeforeSaveChanged', req => {
- const object = req.object;
- object.set('before', 'save');
- object.unset('remove');
- });
+ /*
+ TODO: fix for Postgres
+ trying to delete a field that doesn't exists doesn't play nice
+ */
+ it_exclude_dbs(['postgres'])(
+ 'should fully delete objects when using `unset` and `set` with beforeSave (regression test for #1840)',
+ done => {
+ const TestObject = Parse.Object.extend('TestObject');
+ const BeforeSaveObject = Parse.Object.extend('BeforeSaveChanged');
+
+ Parse.Cloud.beforeSave('BeforeSaveChanged', req => {
+ const object = req.object;
+ object.set('before', 'save');
+ object.unset('remove');
+ });
- let object;
- const testObject = new TestObject({ key: 'value' });
- testObject
- .save()
- .then(() => {
- object = new BeforeSaveObject();
- return object.save().then(() => {
- object.set({ remove: testObject });
- return object.save();
+ let object;
+ const testObject = new TestObject({ key: 'value' });
+ testObject
+ .save()
+ .then(() => {
+ object = new BeforeSaveObject();
+ return object.save().then(() => {
+ object.set({ remove: testObject });
+ return object.save();
+ });
+ })
+ .then(objectAgain => {
+ expect(objectAgain.get('remove')).toBeUndefined();
+ expect(object.get('remove')).toBeUndefined();
+ done();
+ })
+ .catch(err => {
+ jfail(err);
+ done();
});
- })
- .then(objectAgain => {
- expect(objectAgain.get('remove')).toBeUndefined();
- expect(object.get('remove')).toBeUndefined();
- done();
- })
- .catch(err => {
- jfail(err);
- done();
- });
- });
+ }
+ );
it('should not include relation op (regression test for #1606)', done => {
const TestObject = Parse.Object.extend('TestObject');